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:
parent
1f4d1074c5
commit
a74a4aa23b
@ -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)
|
||||||
|
@ -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
|
|||||||
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
|
|||||||
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 —
|
systems such as <application>Slony-I</> and
|
||||||
|
<application>Skytools</> work correctly —
|
||||||
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>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user