|
|
|
@ -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")); |
|
|
|
|