mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-09-27 23:01:55 +02:00
pg_upgrade: Upgrade sequence data via pg_dump
Previously, pg_upgrade migrated sequence data like tables by copying the on-disk file. This does not allow any changes in the on-disk format for sequences. It's simpler to just have pg_dump set the new sequence values as it normally does. To do that, create a hidden submode in pg_dump that dumps sequence data even when a schema-only dump is requested, and trigger that submode in binary upgrade mode. (This new submode could easily be exposed as a command-line option, but it has limited use outside of pg_dump and would probably cause some confusion, so we don't do that at this time.) Reviewed-by: Anastasia Lubennikova <a.lubennikova@postgrespro.ru> Reviewed-by: Michael Paquier <michael.paquier@gmail.com>
This commit is contained in:
parent
27d2c12328
commit
a7e5457db8
@ -118,6 +118,7 @@ typedef struct _restoreOptions
|
||||
|
||||
bool *idWanted; /* array showing which dump IDs to emit */
|
||||
int enable_row_security;
|
||||
int sequence_data; /* dump sequence data even in schema-only mode */
|
||||
} RestoreOptions;
|
||||
|
||||
typedef struct _dumpOptions
|
||||
@ -160,6 +161,8 @@ typedef struct _dumpOptions
|
||||
bool outputBlobs;
|
||||
int outputNoOwner;
|
||||
char *outputSuperuser;
|
||||
|
||||
int sequence_data; /* dump sequence data even in schema-only mode */
|
||||
} DumpOptions;
|
||||
|
||||
/*
|
||||
|
@ -171,6 +171,7 @@ dumpOptionsFromRestoreOptions(RestoreOptions *ropt)
|
||||
dopt->lockWaitTimeout = ropt->lockWaitTimeout;
|
||||
dopt->include_everything = ropt->include_everything;
|
||||
dopt->enable_row_security = ropt->enable_row_security;
|
||||
dopt->sequence_data = ropt->sequence_data;
|
||||
|
||||
return dopt;
|
||||
}
|
||||
@ -2855,7 +2856,10 @@ _tocEntryRequired(TocEntry *te, teSection curSection, RestoreOptions *ropt)
|
||||
|
||||
/* Mask it if we only want schema */
|
||||
if (ropt->schemaOnly)
|
||||
res = res & REQ_SCHEMA;
|
||||
{
|
||||
if (!(ropt->sequence_data && strcmp(te->desc, "SEQUENCE SET") == 0))
|
||||
res = res & REQ_SCHEMA;
|
||||
}
|
||||
|
||||
/* Mask it if we only want data */
|
||||
if (ropt->dataOnly)
|
||||
|
@ -216,7 +216,7 @@ static void addBoundaryDependencies(DumpableObject **dobjs, int numObjs,
|
||||
DumpableObject *boundaryObjs);
|
||||
|
||||
static void getDomainConstraints(Archive *fout, TypeInfo *tyinfo);
|
||||
static void getTableData(DumpOptions *dopt, TableInfo *tblinfo, int numTables, bool oids);
|
||||
static void getTableData(DumpOptions *dopt, TableInfo *tblinfo, int numTables, bool oids, char relkind);
|
||||
static void makeTableDataInfo(DumpOptions *dopt, TableInfo *tbinfo, bool oids);
|
||||
static void buildMatViewRefreshDependencies(Archive *fout);
|
||||
static void getTableDataFKConstraints(void);
|
||||
@ -546,6 +546,12 @@ main(int argc, char **argv)
|
||||
if (dopt.column_inserts)
|
||||
dopt.dump_inserts = 1;
|
||||
|
||||
/* Binary upgrade mode implies dumping sequence data even in schema-only
|
||||
* mode. This is not exposed as a separate option, but kept separate
|
||||
* internally for clarity. */
|
||||
if (dopt.binary_upgrade)
|
||||
dopt.sequence_data = 1;
|
||||
|
||||
if (dopt.dataOnly && dopt.schemaOnly)
|
||||
{
|
||||
write_msg(NULL, "options -s/--schema-only and -a/--data-only cannot be used together\n");
|
||||
@ -722,12 +728,15 @@ main(int argc, char **argv)
|
||||
|
||||
if (!dopt.schemaOnly)
|
||||
{
|
||||
getTableData(&dopt, tblinfo, numTables, dopt.oids);
|
||||
getTableData(&dopt, tblinfo, numTables, dopt.oids, 0);
|
||||
buildMatViewRefreshDependencies(fout);
|
||||
if (dopt.dataOnly)
|
||||
getTableDataFKConstraints();
|
||||
}
|
||||
|
||||
if (dopt.schemaOnly && dopt.sequence_data)
|
||||
getTableData(&dopt, tblinfo, numTables, dopt.oids, RELKIND_SEQUENCE);
|
||||
|
||||
if (dopt.outputBlobs)
|
||||
getBlobs(fout);
|
||||
|
||||
@ -806,6 +815,7 @@ main(int argc, char **argv)
|
||||
ropt->lockWaitTimeout = dopt.lockWaitTimeout;
|
||||
ropt->include_everything = dopt.include_everything;
|
||||
ropt->enable_row_security = dopt.enable_row_security;
|
||||
ropt->sequence_data = dopt.sequence_data;
|
||||
|
||||
if (compressLevel == -1)
|
||||
ropt->compression = 0;
|
||||
@ -2039,13 +2049,14 @@ refreshMatViewData(Archive *fout, TableDataInfo *tdinfo)
|
||||
* set up dumpable objects representing the contents of tables
|
||||
*/
|
||||
static void
|
||||
getTableData(DumpOptions *dopt, TableInfo *tblinfo, int numTables, bool oids)
|
||||
getTableData(DumpOptions *dopt, TableInfo *tblinfo, int numTables, bool oids, char relkind)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < numTables; i++)
|
||||
{
|
||||
if (tblinfo[i].dobj.dump & DUMP_COMPONENT_DATA)
|
||||
if (tblinfo[i].dobj.dump & DUMP_COMPONENT_DATA &&
|
||||
(!relkind || tblinfo[i].relkind == relkind))
|
||||
makeTableDataInfo(dopt, &(tblinfo[i]), oids);
|
||||
}
|
||||
}
|
||||
|
@ -444,7 +444,7 @@ get_rel_infos(ClusterInfo *cluster, DbInfo *dbinfo)
|
||||
" SELECT c.oid, 0::oid, 0::oid "
|
||||
" FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n "
|
||||
" ON c.relnamespace = n.oid "
|
||||
" WHERE relkind IN ('r', 'm', 'S') AND "
|
||||
" WHERE relkind IN ('r', 'm') AND "
|
||||
/* exclude possible orphaned temp tables */
|
||||
" ((n.nspname !~ '^pg_temp_' AND "
|
||||
" n.nspname !~ '^pg_toast_temp_' AND "
|
||||
|
Loading…
Reference in New Issue
Block a user