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).
Then run pg_resetxlog, and finally install and start the new version of
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
(as the Postgres admin user) do
......
......@@ -23,7 +23,7 @@
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
* 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,11 +709,13 @@ PrintControlValues(void)
* Write out the new pg_control file.
*/
static void
RewriteControlFile(void)
RewriteControlFile(TransactionId set_xid)
{
int fd;
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.
......@@ -736,6 +738,9 @@ RewriteControlFile(void)
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 */
INIT_CRC64(ControlFile.crc);
......@@ -926,9 +931,10 @@ WriteEmptyXLOG(void)
static 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"
" -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);
}
......@@ -939,6 +945,7 @@ main(int argc, char **argv)
int argn;
bool force = false;
bool noupdate = false;
TransactionId set_xid = 0;
int fd;
char path[MAXPGPATH];
......@@ -950,6 +957,18 @@ main(int argc, char **argv)
force = true;
else if (strcmp(argv[argn], "-n") == 0)
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
usage();
}
......@@ -992,6 +1011,20 @@ main(int argc, char **argv)
if (!ReadControlFile())
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
* guessed values and exit. Also print if -n is given.
......@@ -1018,7 +1051,7 @@ main(int argc, char **argv)
/*
* Else, do the dirty deed.
*/
RewriteControlFile();
RewriteControlFile(0);
KillExistingXLOG();
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