1
0
mirror of https://github.com/postgres/postgres.git synced 2025-04-21 12:05:57 +03:00

pg_upgrade: preserve the timestamp epoch

This is useful for replication tools like Slony and Skytools.

Report by Sergey Konoplev
This commit is contained in:
Bruce Momjian 2014-09-05 19:19:41 -04:00
parent 1f4d1074c5
commit a74a4aa23b
4 changed files with 20 additions and 10 deletions

View File

@ -209,16 +209,20 @@ get_control_data(ClusterInfo *cluster, bool live_check)
} }
else if ((p = strstr(bufin, "Latest checkpoint's NextXID:")) != NULL) else if ((p = strstr(bufin, "Latest checkpoint's NextXID:")) != NULL)
{ {
char *op = strchr(p, '/'); p = strchr(p, ':');
if (op == NULL) if (p == NULL || strlen(p) <= 1)
op = strchr(p, ':');
if (op == NULL || strlen(op) <= 1)
pg_fatal("%d: controldata retrieval problem\n", __LINE__); pg_fatal("%d: controldata retrieval problem\n", __LINE__);
op++; /* removing ':' char */ p++; /* removing ':' char */
cluster->controldata.chkpnt_nxtxid = str2uint(op); cluster->controldata.chkpnt_nxtepoch = str2uint(p);
p = strchr(p, '/');
if (p == NULL || strlen(p) <= 1)
pg_fatal("%d: controldata retrieval problem\n", __LINE__);
p++; /* removing '/' char */
cluster->controldata.chkpnt_nxtxid = str2uint(p);
got_xid = true; got_xid = true;
} }
else if ((p = strstr(bufin, "Latest checkpoint's NextOID:")) != NULL) else if ((p = strstr(bufin, "Latest checkpoint's NextOID:")) != NULL)

View File

@ -420,12 +420,16 @@ copy_clog_xlog_xid(void)
/* copy old commit logs to new data dir */ /* copy old commit logs to new data dir */
copy_subdir_files("pg_clog"); copy_subdir_files("pg_clog");
/* set the next transaction id of the new cluster */ /* set the next transaction id and epoch of the new cluster */
prep_status("Setting next transaction ID for new cluster"); prep_status("Setting next transaction ID and epoch for new cluster");
exec_prog(UTILITY_LOG_FILE, NULL, true, exec_prog(UTILITY_LOG_FILE, NULL, true,
"\"%s/pg_resetxlog\" -f -x %u \"%s\"", "\"%s/pg_resetxlog\" -f -x %u \"%s\"",
new_cluster.bindir, old_cluster.controldata.chkpnt_nxtxid, new_cluster.bindir, old_cluster.controldata.chkpnt_nxtxid,
new_cluster.pgdata); new_cluster.pgdata);
exec_prog(UTILITY_LOG_FILE, NULL, true,
"\"%s/pg_resetxlog\" -f -e %u \"%s\"",
new_cluster.bindir, old_cluster.controldata.chkpnt_nxtepoch,
new_cluster.pgdata);
check_ok(); check_ok();
/* /*

View File

@ -190,6 +190,7 @@ typedef struct
char nextxlogfile[25]; char nextxlogfile[25];
uint32 chkpnt_tli; uint32 chkpnt_tli;
uint32 chkpnt_nxtxid; uint32 chkpnt_nxtxid;
uint32 chkpnt_nxtepoch;
uint32 chkpnt_nxtoid; uint32 chkpnt_nxtoid;
uint32 chkpnt_nxtmulti; uint32 chkpnt_nxtmulti;
uint32 chkpnt_nxtmxoff; uint32 chkpnt_nxtmxoff;

View File

@ -166,7 +166,8 @@ PostgreSQL documentation
except in the field that is set by <command>pg_resetxlog</command>, except in the field that is set by <command>pg_resetxlog</command>,
so any value will work so far as the database itself is concerned. so any value will work so far as the database itself is concerned.
You might need to adjust this value to ensure that replication You might need to adjust this value to ensure that replication
systems such as <application>Slony-I</> work correctly &mdash; systems such as <application>Slony-I</> and
<application>Skytools</> work correctly &mdash;
if so, an appropriate value should be obtainable from the state of if so, an appropriate value should be obtainable from the state of
the downstream replicated database. the downstream replicated database.
</para> </para>