Commit f6e603cf authored by Bruce Momjian's avatar Bruce Momjian

Add new -x XID option to /contrib/pg_resetxlog for future pg_upgrade use.

parent 7955f987
...@@ -21,6 +21,9 @@ module pg_controldata and run it to be sure the DB state is SHUTDOWN). ...@@ -21,6 +21,9 @@ module pg_controldata and run it to be sure the DB state is SHUTDOWN).
Then run pg_resetxlog, and finally install and start the new version of Then run pg_resetxlog, and finally install and start the new version of
the database software. the database software.
A tertiary purpose it its use by pg_upgrade to set the next transaction
id in pg_control.
To run the program, make sure your postmaster is not running, then To run the program, make sure your postmaster is not running, then
(as the Postgres admin user) do (as the Postgres admin user) do
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $Header: /cvsroot/pgsql/contrib/pg_resetxlog/Attic/pg_resetxlog.c,v 1.10 2001/11/05 17:46:23 momjian Exp $ * $Header: /cvsroot/pgsql/contrib/pg_resetxlog/Attic/pg_resetxlog.c,v 1.11 2002/01/10 17:51:52 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -709,34 +709,39 @@ PrintControlValues(void) ...@@ -709,34 +709,39 @@ PrintControlValues(void)
* Write out the new pg_control file. * Write out the new pg_control file.
*/ */
static void static void
RewriteControlFile(void) RewriteControlFile(TransactionId set_xid)
{ {
int fd; int fd;
char buffer[BLCKSZ]; /* need not be aligned */ char buffer[BLCKSZ]; /* need not be aligned */
/* if (set_xid == 0)
* Adjust fields as needed to force an empty XLOG starting at the next {
* available segment. /*
*/ * Adjust fields as needed to force an empty XLOG starting at the next
newXlogId = ControlFile.logId; * available segment.
newXlogSeg = ControlFile.logSeg; */
/* be sure we wrap around correctly at end of a logfile */ newXlogId = ControlFile.logId;
NextLogSeg(newXlogId, newXlogSeg); newXlogSeg = ControlFile.logSeg;
/* be sure we wrap around correctly at end of a logfile */
ControlFile.checkPointCopy.redo.xlogid = newXlogId; NextLogSeg(newXlogId, newXlogSeg);
ControlFile.checkPointCopy.redo.xrecoff =
newXlogSeg * XLogSegSize + SizeOfXLogPHD; ControlFile.checkPointCopy.redo.xlogid = newXlogId;
ControlFile.checkPointCopy.undo = ControlFile.checkPointCopy.redo; ControlFile.checkPointCopy.redo.xrecoff =
ControlFile.checkPointCopy.time = time(NULL); newXlogSeg * XLogSegSize + SizeOfXLogPHD;
ControlFile.checkPointCopy.undo = ControlFile.checkPointCopy.redo;
ControlFile.state = DB_SHUTDOWNED; ControlFile.checkPointCopy.time = time(NULL);
ControlFile.time = time(NULL);
ControlFile.logId = newXlogId; ControlFile.state = DB_SHUTDOWNED;
ControlFile.logSeg = newXlogSeg + 1; ControlFile.time = time(NULL);
ControlFile.checkPoint = ControlFile.checkPointCopy.redo; ControlFile.logId = newXlogId;
ControlFile.prevCheckPoint.xlogid = 0; ControlFile.logSeg = newXlogSeg + 1;
ControlFile.prevCheckPoint.xrecoff = 0; ControlFile.checkPoint = ControlFile.checkPointCopy.redo;
ControlFile.prevCheckPoint.xlogid = 0;
ControlFile.prevCheckPoint.xrecoff = 0;
}
else
ControlFile.checkPointCopy.nextXid = set_xid;
/* Contents are protected with a CRC */ /* Contents are protected with a CRC */
INIT_CRC64(ControlFile.crc); INIT_CRC64(ControlFile.crc);
COMP_CRC64(ControlFile.crc, COMP_CRC64(ControlFile.crc,
...@@ -926,9 +931,10 @@ WriteEmptyXLOG(void) ...@@ -926,9 +931,10 @@ WriteEmptyXLOG(void)
static void static void
usage(void) usage(void)
{ {
fprintf(stderr, "Usage: pg_resetxlog [-f] [-n] PGDataDirectory\n\n" fprintf(stderr, "Usage: pg_resetxlog [-f] [-n] [-x xid] PGDataDirectory\n"
" -f\tforce update to be done\n" " -f\tforce update to be done\n"
" -n\tno update, just show extracted pg_control values (for testing)\n"); " -n\tno update, just show extracted pg_control values (for testing)\n"
" -x XID\tset XID in pg_control\n");
exit(1); exit(1);
} }
...@@ -939,6 +945,7 @@ main(int argc, char **argv) ...@@ -939,6 +945,7 @@ main(int argc, char **argv)
int argn; int argn;
bool force = false; bool force = false;
bool noupdate = false; bool noupdate = false;
TransactionId set_xid = 0;
int fd; int fd;
char path[MAXPGPATH]; char path[MAXPGPATH];
...@@ -950,6 +957,18 @@ main(int argc, char **argv) ...@@ -950,6 +957,18 @@ main(int argc, char **argv)
force = true; force = true;
else if (strcmp(argv[argn], "-n") == 0) else if (strcmp(argv[argn], "-n") == 0)
noupdate = true; noupdate = true;
else if (strcmp(argv[argn], "-x") == 0)
{
argn++;
if (argn == argc)
usage();
set_xid = strtoul(argv[argn], NULL, 0);
if (set_xid == 0)
{
fprintf(stderr, "XID can not be 0.");
exit(1);
}
}
else else
usage(); usage();
} }
...@@ -992,6 +1011,20 @@ main(int argc, char **argv) ...@@ -992,6 +1011,20 @@ main(int argc, char **argv)
if (!ReadControlFile()) if (!ReadControlFile())
GuessControlValues(); GuessControlValues();
/*
* Set XID in pg_control and exit
*/
if (set_xid)
{
if (guessed)
{
printf("\npg_control appears corrupt. Can not update XID.\n");
exit(1);
}
RewriteControlFile(set_xid);
exit(0);
}
/* /*
* If we had to guess anything, and -f was not given, just print the * If we had to guess anything, and -f was not given, just print the
* guessed values and exit. Also print if -n is given. * guessed values and exit. Also print if -n is given.
...@@ -1018,7 +1051,7 @@ main(int argc, char **argv) ...@@ -1018,7 +1051,7 @@ main(int argc, char **argv)
/* /*
* Else, do the dirty deed. * Else, do the dirty deed.
*/ */
RewriteControlFile(); RewriteControlFile(0);
KillExistingXLOG(); KillExistingXLOG();
WriteEmptyXLOG(); WriteEmptyXLOG();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment