Commit a74a4aa2 authored by Bruce Momjian's avatar Bruce Momjian

pg_upgrade: preserve the timestamp epoch

This is useful for replication tools like Slony and Skytools.

Report by Sergey Konoplev
parent 1f4d1074
...@@ -209,16 +209,20 @@ get_control_data(ClusterInfo *cluster, bool live_check) ...@@ -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 (p == NULL || strlen(p) <= 1)
pg_fatal("%d: controldata retrieval problem\n", __LINE__);
if (op == NULL) p++; /* removing ':' char */
op = strchr(p, ':'); cluster->controldata.chkpnt_nxtepoch = str2uint(p);
if (op == NULL || strlen(op) <= 1) p = strchr(p, '/');
if (p == NULL || strlen(p) <= 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_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)
......
...@@ -420,12 +420,16 @@ copy_clog_xlog_xid(void) ...@@ -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();
/* /*
......
...@@ -190,6 +190,7 @@ typedef struct ...@@ -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;
......
...@@ -166,7 +166,8 @@ PostgreSQL documentation ...@@ -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>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment