diff --git a/doc/src/sgml/ref/pg_resetxlog.sgml b/doc/src/sgml/ref/pg_resetxlog.sgml index c680680..f7876d0 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 f1b5d6d..73faceb 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; @@ -302,6 +303,13 @@ main(int argc, char *argv[]) FindEndOfXLOG(); /* + * Print current control file parameters, if we had to guess anything and + * -f was not given or -n is given. + */ + if ((guessed && !force) || noupdate) + PrintControlValues(guessed); + + /* * Adjust fields if required by switches. (Do this now so that printout, * if any, includes these values.) */ @@ -352,11 +360,12 @@ main(int argc, char *argv[]) /* * If we had to guess anything, and -f was not given, just print the - * guessed values and exit. Also print if -n is given. + * values to be reset and exit. Also print value to be reset if -n is + * given. */ if ((guessed && !force) || noupdate) { - PrintControlValues(guessed); + PrintNewControlValues(); if (!noupdate) { printf(_("\nIf these values seem acceptable, use -f to force reset.\n")); @@ -556,12 +565,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 +578,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"), @@ -632,6 +636,63 @@ PrintControlValues(bool guessed) /* + * Print the values to be changed after pg_resetxlog. + * + * NB: this display should be just for those fields that are + * going to change after reset. + */ +static void +PrintNewControlValues() +{ + char fname[MAXFNAMELEN]; + + /* This will be always printed in order to keep format same. */ + printf(_("\n\nValues to be used after reset:\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. */ static void @@ -1039,7 +1100,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 extracted and reset control values (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"));