From 59bffa370737fcd8cb04762417c2eb4eeeee774f Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 20 Dec 2004 01:42:11 +0000 Subject: [PATCH] Adjust pg_resetxlog to handle 8.0 WAL file names properly. --- doc/src/sgml/ref/pg_resetxlog.sgml | 22 +++++++++++++++------- src/bin/pg_resetxlog/pg_resetxlog.c | 28 ++++++++++++++++++++-------- 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/doc/src/sgml/ref/pg_resetxlog.sgml b/doc/src/sgml/ref/pg_resetxlog.sgml index 6a8292c937..6651a0b588 100644 --- a/doc/src/sgml/ref/pg_resetxlog.sgml +++ b/doc/src/sgml/ref/pg_resetxlog.sgml @@ -1,5 +1,5 @@ @@ -22,7 +22,7 @@ PostgreSQL documentation -n -o oid -x xid - -l fileid,seg + -l timelineid,fileid,seg datadir @@ -79,17 +79,25 @@ PostgreSQL documentation pg_resetxlog is unable to determine appropriate values by reading pg_control. A safe value for the next transaction ID may be determined by looking for the numerically largest - file name in the directory pg_clog under the data directory, adding one, + file name in the directory pg_clog under the data directory, + adding one, and then multiplying by 1048576. Note that the file names are in hexadecimal. It is usually easiest to specify the switch value in hexadecimal too. For example, if 0011 is the largest entry in pg_clog, -x 0x1200000 will work (five trailing zeroes provide the proper multiplier). The WAL starting address should be - larger than any file number currently existing in - the directory pg_xlog under the data directory. The addresses are also in hexadecimal and - have two parts. For example, if 000000FF0000003A is the - largest entry in pg_xlog, -l 0xFF,0x3B will work. + larger than any file name currently existing in + the directory pg_xlog under the data directory. + These names are also in hexadecimal and have three parts. The first + part is the timeline ID and should usually be kept the same. + Do not choose a value larger than 255 (0xFF) for the third + part; instead increment the second part and reset the third part to 0. + For example, if 00000001000000320000004A is the + largest entry in pg_xlog, -l 0x1,0x32,0x4B will + work; but if the largest entry is + 000000010000003A000000FF, choose -l 0x1,0x3B,0x0 + or more. There is no comparably easy way to determine a next OID that's beyond the largest one in the database, but fortunately it is not critical to get the next-OID setting right. diff --git a/src/bin/pg_resetxlog/pg_resetxlog.c b/src/bin/pg_resetxlog/pg_resetxlog.c index e3ff074c66..005277ca17 100644 --- a/src/bin/pg_resetxlog/pg_resetxlog.c +++ b/src/bin/pg_resetxlog/pg_resetxlog.c @@ -23,7 +23,7 @@ * Portions Copyright (c) 1996-2004, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/bin/pg_resetxlog/pg_resetxlog.c,v 1.26 2004/12/14 01:59:41 neilc Exp $ + * $PostgreSQL: pgsql/src/bin/pg_resetxlog/pg_resetxlog.c,v 1.27 2004/12/20 01:42:11 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -77,10 +77,12 @@ main(int argc, char *argv[]) bool noupdate = false; TransactionId set_xid = 0; Oid set_oid = 0; - uint32 minXlogId = 0, + uint32 minXlogTli = 0, + minXlogId = 0, minXlogSeg = 0; char *endptr; char *endptr2; + char *endptr3; char *DataDir; int fd; char path[MAXPGPATH]; @@ -147,15 +149,22 @@ main(int argc, char *argv[]) break; case 'l': - minXlogId = strtoul(optarg, &endptr, 0); + minXlogTli = strtoul(optarg, &endptr, 0); if (endptr == optarg || *endptr != ',') { fprintf(stderr, _("%s: invalid argument for option -l\n"), progname); fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); exit(1); } - minXlogSeg = strtoul(endptr + 1, &endptr2, 0); - if (endptr2 == endptr + 1 || *endptr2 != '\0') + minXlogId = strtoul(endptr + 1, &endptr2, 0); + if (endptr2 == endptr + 1 || *endptr2 != ',') + { + fprintf(stderr, _("%s: invalid argument for option -l\n"), progname); + fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + exit(1); + } + minXlogSeg = strtoul(endptr2 + 1, &endptr3, 0); + if (endptr3 == endptr2 + 1 || *endptr3 != '\0') { fprintf(stderr, _("%s: invalid argument for option -l\n"), progname); fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); @@ -238,6 +247,9 @@ main(int argc, char *argv[]) if (set_oid != 0) ControlFile.checkPointCopy.nextOid = set_oid; + if (minXlogTli > ControlFile.checkPointCopy.ThisTimeLineID) + ControlFile.checkPointCopy.ThisTimeLineID = minXlogTli; + if (minXlogId > ControlFile.logId || (minXlogId == ControlFile.logId && minXlogSeg > ControlFile.logSeg)) @@ -597,8 +609,8 @@ KillExistingXLOG(void) errno = 0; while ((xlde = readdir(xldir)) != NULL) { - if (strlen(xlde->d_name) == 16 && - strspn(xlde->d_name, "0123456789ABCDEF") == 16) + if (strlen(xlde->d_name) == 24 && + strspn(xlde->d_name, "0123456789ABCDEF") == 24) { snprintf(path, MAXPGPATH, "%s/%s", XLogDir, xlde->d_name); if (unlink(path) < 0) @@ -739,7 +751,7 @@ usage(void) printf(_("Usage:\n %s [OPTION]... DATADIR\n\n"), progname); printf(_("Options:\n")); printf(_(" -f force update to be done\n")); - printf(_(" -l FILEID,SEG force minimum WAL starting location for new transaction log\n")); + printf(_(" -l TLI,FILE,SEG force minimum WAL starting location for new transaction log\n")); printf(_(" -n no update, just show extracted control values (for testing)\n")); printf(_(" -o OID set next OID\n")); printf(_(" -x XID set next transaction ID\n")); -- 2.11.0