diff --git a/doc/src/sgml/ref/pg_resetxlog.sgml b/doc/src/sgml/ref/pg_resetxlog.sgml index c680680fe7..b5286650ce 100644 --- a/doc/src/sgml/ref/pg_resetxlog.sgml +++ b/doc/src/sgml/ref/pg_resetxlog.sgml @@ -177,9 +177,10 @@ PostgreSQL documentation The diff --git a/src/bin/pg_resetxlog/pg_resetxlog.c b/src/bin/pg_resetxlog/pg_resetxlog.c index f1b5d6d473..ed0f945679 100644 --- a/src/bin/pg_resetxlog/pg_resetxlog.c +++ b/src/bin/pg_resetxlog/pg_resetxlog.c @@ -64,10 +64,18 @@ static ControlFileData ControlFile; /* pg_control values */ static XLogSegNo newXlogSegNo; /* new XLOG segment # */ static bool guessed = false; /* T if we had to guess at any values */ static const char *progname; +static uint32 set_xid_epoch = (uint32) -1; +static TransactionId set_xid = 0; +static Oid set_oid = 0; +static MultiXactId set_mxid = 0; +static MultiXactOffset set_mxoff = (MultiXactOffset) -1; +static uint32 minXlogTli = 0; +static XLogSegNo minXlogSegNo = 0; static bool ReadControlFile(void); static void GuessControlValues(void); static void PrintControlValues(bool guessed); +static void PrintNewControlValues(void); static void RewriteControlFile(void); static void FindEndOfXLOG(void); static void KillExistingXLOG(void); @@ -82,14 +90,7 @@ main(int argc, char *argv[]) int c; bool force = false; bool noupdate = false; - uint32 set_xid_epoch = (uint32) -1; - TransactionId set_xid = 0; - Oid set_oid = 0; - MultiXactId set_mxid = 0; MultiXactId set_oldestmxid = 0; - MultiXactOffset set_mxoff = (MultiXactOffset) -1; - uint32 minXlogTli = 0; - XLogSegNo minXlogSegNo = 0; char *endptr; char *endptr2; char *DataDir; @@ -301,6 +302,13 @@ main(int argc, char *argv[]) */ FindEndOfXLOG(); + /* + * If we're not going to proceed with the reset, print the current control + * file parameters. + */ + if ((guessed && !force) || noupdate) + PrintControlValues(guessed); + /* * Adjust fields if required by switches. (Do this now so that printout, * if any, includes these values.) @@ -356,7 +364,7 @@ main(int argc, char *argv[]) */ if ((guessed && !force) || noupdate) { - PrintControlValues(guessed); + PrintNewControlValues(); if (!noupdate) { printf(_("\nIf these values seem acceptable, use -f to force reset.\n")); @@ -556,12 +564,11 @@ static void PrintControlValues(bool guessed) { char sysident_str[32]; - char fname[MAXFNAMELEN]; if (guessed) printf(_("Guessed pg_control values:\n\n")); else - printf(_("pg_control values:\n\n")); + printf(_("Current pg_control values:\n\n")); /* * Format system_identifier separately to keep platform-dependent format @@ -570,10 +577,6 @@ PrintControlValues(bool guessed) snprintf(sysident_str, sizeof(sysident_str), UINT64_FORMAT, ControlFile.system_identifier); - XLogFileName(fname, ControlFile.checkPointCopy.ThisTimeLineID, newXlogSegNo); - - printf(_("First log segment after reset: %s\n"), - fname); printf(_("pg_control version number: %u\n"), ControlFile.pg_control_version); printf(_("Catalog version number: %u\n"), @@ -631,6 +634,60 @@ PrintControlValues(bool guessed) } +/* + * Print the values to be changed. + */ +static void +PrintNewControlValues() +{ + char fname[MAXFNAMELEN]; + + /* This will be always printed in order to keep format same. */ + printf(_("\n\nValues to be changed:\n\n")); + + XLogFileName(fname, ControlFile.checkPointCopy.ThisTimeLineID, newXlogSegNo); + printf(_("First log segment after reset: %s\n"), fname); + + if (set_mxid != 0) + { + printf(_("NextMultiXactId: %u\n"), + ControlFile.checkPointCopy.nextMulti); + printf(_("OldestMultiXid: %u\n"), + ControlFile.checkPointCopy.oldestMulti); + printf(_("OldestMulti's DB: %u\n"), + ControlFile.checkPointCopy.oldestMultiDB); + } + + if (set_mxoff != -1) + { + printf(_("NextMultiOffset: %u\n"), + ControlFile.checkPointCopy.nextMultiOffset); + } + + if (set_oid != 0) + { + printf(_("NextOID: %u\n"), + ControlFile.checkPointCopy.nextOid); + } + + if (set_xid != 0) + { + printf(_("NextXID: %u\n"), + ControlFile.checkPointCopy.nextXid); + printf(_("OldestXID: %u\n"), + ControlFile.checkPointCopy.oldestXid); + printf(_("OldestXID's DB: %u\n"), + ControlFile.checkPointCopy.oldestXidDB); + } + + if (set_xid_epoch != -1) + { + printf(_("NextXID Epoch: %u\n"), + ControlFile.checkPointCopy.nextXidEpoch); + } +} + + /* * Write out the new pg_control file. */ @@ -1039,7 +1096,7 @@ usage(void) printf(_(" -f force update to be done\n")); printf(_(" -l XLOGFILE force minimum WAL starting location for new transaction log\n")); printf(_(" -m MXID,MXID set next and oldest multitransaction ID\n")); - printf(_(" -n no update, just show extracted control values (for testing)\n")); + printf(_(" -n no update, just show what would be done (for testing)\n")); printf(_(" -o OID set next OID\n")); printf(_(" -O OFFSET set next multitransaction offset\n")); printf(_(" -V, --version output version information, then exit\n"));