aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>2002-01-10 20:09:06 +0000
committerBruce Momjian <bruce@momjian.us>2002-01-10 20:09:06 +0000
commit4c0e9b5efcc8ffd5b974ebb638c45344e766ea12 (patch)
treea5a105888f7dd4a000a77611226f4ad3cdc1d7cc
parent0385ba112150f07a918df4b7c1b13bb4c3be3168 (diff)
downloadpostgresql-4c0e9b5efcc8ffd5b974ebb638c45344e766ea12.tar.gz
postgresql-4c0e9b5efcc8ffd5b974ebb638c45344e766ea12.zip
Add new -l flag to set checkpoint location for /contrib/pg_resetxlog.
-rw-r--r--contrib/pg_resetxlog/README.pg_resetxlog2
-rw-r--r--contrib/pg_resetxlog/pg_resetxlog.c45
2 files changed, 37 insertions, 10 deletions
diff --git a/contrib/pg_resetxlog/README.pg_resetxlog b/contrib/pg_resetxlog/README.pg_resetxlog
index 943b2a1b0c1..8a7b1190450 100644
--- a/contrib/pg_resetxlog/README.pg_resetxlog
+++ b/contrib/pg_resetxlog/README.pg_resetxlog
@@ -22,7 +22,7 @@ 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.
+id and checkpoint location in pg_control.
To run the program, make sure your postmaster is not running, then
(as the Postgres admin user) do
diff --git a/contrib/pg_resetxlog/pg_resetxlog.c b/contrib/pg_resetxlog/pg_resetxlog.c
index 7957c957e38..89b3ed6fdb7 100644
--- a/contrib/pg_resetxlog/pg_resetxlog.c
+++ b/contrib/pg_resetxlog/pg_resetxlog.c
@@ -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.12 2002/01/10 18:08:29 momjian Exp $
+ * $Header: /cvsroot/pgsql/contrib/pg_resetxlog/Attic/pg_resetxlog.c,v 1.13 2002/01/10 20:09:06 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -683,6 +683,7 @@ PrintControlValues(void)
"Catalog version number: %u\n"
"Current log file id: %u\n"
"Next log file segment: %u\n"
+ "Latest checkpoint location: %X/%X\n"
"Latest checkpoint's StartUpID: %u\n"
"Latest checkpoint's NextXID: %u\n"
"Latest checkpoint's NextOID: %u\n"
@@ -695,6 +696,8 @@ PrintControlValues(void)
ControlFile.catalog_version_no,
ControlFile.logId,
ControlFile.logSeg,
+ ControlFile.checkPoint.xlogid,
+ ControlFile.checkPoint.xrecoff,
ControlFile.checkPointCopy.ThisStartUpID,
ControlFile.checkPointCopy.nextXid,
ControlFile.checkPointCopy.nextOid,
@@ -709,7 +712,7 @@ PrintControlValues(void)
* Write out the new pg_control file.
*/
static void
-RewriteControlFile(TransactionId set_xid)
+RewriteControlFile(TransactionId set_xid, XLogRecPtr set_checkpoint)
{
int fd;
char buffer[BLCKSZ]; /* need not be aligned */
@@ -733,13 +736,18 @@ RewriteControlFile(TransactionId set_xid)
ControlFile.time = time(NULL);
ControlFile.logId = newXlogId;
ControlFile.logSeg = newXlogSeg + 1;
- ControlFile.checkPoint = ControlFile.checkPointCopy.redo;
ControlFile.prevCheckPoint.xlogid = 0;
ControlFile.prevCheckPoint.xrecoff = 0;
if (set_xid != 0)
ControlFile.checkPointCopy.nextXid = set_xid;
-
+
+ if (set_checkpoint.xlogid == 0 &&
+ set_checkpoint.xrecoff == 0)
+ ControlFile.checkPoint = ControlFile.checkPointCopy.redo;
+ else
+ ControlFile.checkPoint = set_checkpoint;
+
/* Contents are protected with a CRC */
INIT_CRC64(ControlFile.crc);
COMP_CRC64(ControlFile.crc,
@@ -929,10 +937,11 @@ WriteEmptyXLOG(void)
static void
usage(void)
{
- 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"
- " -x XID\tset XID in pg_control\n");
+ fprintf(stderr, "Usage: pg_resetxlog [-f] [-n] [-x xid] [ -l log_id offset ] PGDataDirectory\n"
+ " -f\t force update to be done\n"
+ " -n\t no update, just show extracted pg_control values (for testing)\n"
+ " -x XID set XID in pg_control\n"
+ " -l log_id offset set checkpoint location in pg_control\n");
exit(1);
}
@@ -944,6 +953,7 @@ main(int argc, char **argv)
bool force = false;
bool noupdate = false;
TransactionId set_xid = 0;
+ XLogRecPtr set_checkpoint = {0,0};
int fd;
char path[MAXPGPATH];
@@ -967,6 +977,23 @@ main(int argc, char **argv)
exit(1);
}
}
+ else if (strcmp(argv[argn], "-l") == 0)
+ {
+ argn++;
+ if (argn == argc)
+ usage();
+ set_checkpoint.xlogid = strtoul(argv[argn], NULL, 0);
+ argn++;
+ if (argn == argc)
+ usage();
+ set_checkpoint.xrecoff = strtoul(argv[argn], NULL, 0);
+ if (set_checkpoint.xlogid == 0 &&
+ set_checkpoint.xrecoff == 0)
+ {
+ fprintf(stderr, "Checkpoint can not be '0 0'.");
+ exit(1);
+ }
+ }
else
usage();
}
@@ -1035,7 +1062,7 @@ main(int argc, char **argv)
/*
* Else, do the dirty deed.
*/
- RewriteControlFile(set_xid);
+ RewriteControlFile(set_xid, set_checkpoint);
KillExistingXLOG();
WriteEmptyXLOG();