mirror of
https://github.com/postgres/postgres.git
synced 2025-05-21 15:54:08 +03:00
pg_dump: Always dump subscriptions NOCONNECT
This removes the pg_dump option --no-subscription-connect and makes it the default. Dumping a subscription so that it activates right away when restored is not very useful, because the state of the publication server is unclear. Discussion: https://www.postgresql.org/message-id/e4fbfad5-c6ac-fd50-6777-18c84b34eb2f@2ndquadrant.com
This commit is contained in:
parent
c31671f9b5
commit
a9254e675b
@ -798,19 +798,6 @@ PostgreSQL documentation
|
|||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
|
||||||
<term><option>--no-subscription-connect</option></term>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
When dumping logical replication subscriptions,
|
|
||||||
generate <command>CREATE SUBSCRIPTION</command> commands that do not
|
|
||||||
make remote connections for creating replication slot or initial table
|
|
||||||
copy. That way, the dump can be restored without requiring network
|
|
||||||
access to the remote servers.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</varlistentry>
|
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><option>--no-synchronized-snapshots</></term>
|
<term><option>--no-synchronized-snapshots</></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
@ -1235,6 +1222,19 @@ CREATE DATABASE foo WITH TEMPLATE template0;
|
|||||||
in cross-version cases, as it can prevent problems arising from varying
|
in cross-version cases, as it can prevent problems arising from varying
|
||||||
reserved-word lists in different <productname>PostgreSQL</> versions.
|
reserved-word lists in different <productname>PostgreSQL</> versions.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
When dumping logical replication subscriptions,
|
||||||
|
<application>pg_dump</application> will generate <command>CREATE
|
||||||
|
SUBSCRIPTION</command> commands that use the <literal>NOCONNECT</literal>
|
||||||
|
option, so that restoring the subscription does not make remote connections
|
||||||
|
for creating a replication slot or for initial table copy. That way, the
|
||||||
|
dump can be restored without requiring network access to the remote
|
||||||
|
servers. It is then up to the user to reactivate the subscriptions in a
|
||||||
|
suitable way. If the involved hosts have changed, the connection
|
||||||
|
information might have to be changed. It might also be appropriate to
|
||||||
|
truncate the target tables before initiating a new full table copy.
|
||||||
|
</para>
|
||||||
</refsect1>
|
</refsect1>
|
||||||
|
|
||||||
<refsect1 id="pg-dump-examples">
|
<refsect1 id="pg-dump-examples">
|
||||||
|
@ -153,7 +153,6 @@ typedef struct _dumpOptions
|
|||||||
int outputNoTablespaces;
|
int outputNoTablespaces;
|
||||||
int use_setsessauth;
|
int use_setsessauth;
|
||||||
int enable_row_security;
|
int enable_row_security;
|
||||||
int no_subscription_connect;
|
|
||||||
|
|
||||||
/* default, if no "inclusion" switches appear, is to dump everything */
|
/* default, if no "inclusion" switches appear, is to dump everything */
|
||||||
bool include_everything;
|
bool include_everything;
|
||||||
|
@ -353,7 +353,6 @@ main(int argc, char **argv)
|
|||||||
{"strict-names", no_argument, &strict_names, 1},
|
{"strict-names", no_argument, &strict_names, 1},
|
||||||
{"use-set-session-authorization", no_argument, &dopt.use_setsessauth, 1},
|
{"use-set-session-authorization", no_argument, &dopt.use_setsessauth, 1},
|
||||||
{"no-security-labels", no_argument, &dopt.no_security_labels, 1},
|
{"no-security-labels", no_argument, &dopt.no_security_labels, 1},
|
||||||
{"no-subscription-connect", no_argument, &dopt.no_subscription_connect, 1},
|
|
||||||
{"no-synchronized-snapshots", no_argument, &dopt.no_synchronized_snapshots, 1},
|
{"no-synchronized-snapshots", no_argument, &dopt.no_synchronized_snapshots, 1},
|
||||||
{"no-unlogged-table-data", no_argument, &dopt.no_unlogged_table_data, 1},
|
{"no-unlogged-table-data", no_argument, &dopt.no_unlogged_table_data, 1},
|
||||||
{"no-sync", no_argument, NULL, 7},
|
{"no-sync", no_argument, NULL, 7},
|
||||||
@ -951,7 +950,6 @@ help(const char *progname)
|
|||||||
printf(_(" --if-exists use IF EXISTS when dropping objects\n"));
|
printf(_(" --if-exists use IF EXISTS when dropping objects\n"));
|
||||||
printf(_(" --inserts dump data as INSERT commands, rather than COPY\n"));
|
printf(_(" --inserts dump data as INSERT commands, rather than COPY\n"));
|
||||||
printf(_(" --no-security-labels do not dump security label assignments\n"));
|
printf(_(" --no-security-labels do not dump security label assignments\n"));
|
||||||
printf(_(" --no-subscription-connect dump subscriptions so they don't connect on restore\n"));
|
|
||||||
printf(_(" --no-synchronized-snapshots do not use synchronized snapshots in parallel jobs\n"));
|
printf(_(" --no-synchronized-snapshots do not use synchronized snapshots in parallel jobs\n"));
|
||||||
printf(_(" --no-tablespaces do not dump tablespace assignments\n"));
|
printf(_(" --no-tablespaces do not dump tablespace assignments\n"));
|
||||||
printf(_(" --no-unlogged-table-data do not dump unlogged table data\n"));
|
printf(_(" --no-unlogged-table-data do not dump unlogged table data\n"));
|
||||||
@ -3669,7 +3667,6 @@ getSubscriptions(Archive *fout)
|
|||||||
int i_oid;
|
int i_oid;
|
||||||
int i_subname;
|
int i_subname;
|
||||||
int i_rolname;
|
int i_rolname;
|
||||||
int i_subenabled;
|
|
||||||
int i_subconninfo;
|
int i_subconninfo;
|
||||||
int i_subslotname;
|
int i_subslotname;
|
||||||
int i_subpublications;
|
int i_subpublications;
|
||||||
@ -3702,7 +3699,7 @@ getSubscriptions(Archive *fout)
|
|||||||
/* Get the subscriptions in current database. */
|
/* Get the subscriptions in current database. */
|
||||||
appendPQExpBuffer(query,
|
appendPQExpBuffer(query,
|
||||||
"SELECT s.tableoid, s.oid, s.subname,"
|
"SELECT s.tableoid, s.oid, s.subname,"
|
||||||
"(%s s.subowner) AS rolname, s.subenabled, "
|
"(%s s.subowner) AS rolname, "
|
||||||
" s.subconninfo, s.subslotname, s.subpublications "
|
" s.subconninfo, s.subslotname, s.subpublications "
|
||||||
"FROM pg_catalog.pg_subscription s "
|
"FROM pg_catalog.pg_subscription s "
|
||||||
"WHERE s.subdbid = (SELECT oid FROM pg_catalog.pg_database"
|
"WHERE s.subdbid = (SELECT oid FROM pg_catalog.pg_database"
|
||||||
@ -3716,7 +3713,6 @@ getSubscriptions(Archive *fout)
|
|||||||
i_oid = PQfnumber(res, "oid");
|
i_oid = PQfnumber(res, "oid");
|
||||||
i_subname = PQfnumber(res, "subname");
|
i_subname = PQfnumber(res, "subname");
|
||||||
i_rolname = PQfnumber(res, "rolname");
|
i_rolname = PQfnumber(res, "rolname");
|
||||||
i_subenabled = PQfnumber(res, "subenabled");
|
|
||||||
i_subconninfo = PQfnumber(res, "subconninfo");
|
i_subconninfo = PQfnumber(res, "subconninfo");
|
||||||
i_subslotname = PQfnumber(res, "subslotname");
|
i_subslotname = PQfnumber(res, "subslotname");
|
||||||
i_subpublications = PQfnumber(res, "subpublications");
|
i_subpublications = PQfnumber(res, "subpublications");
|
||||||
@ -3732,8 +3728,6 @@ getSubscriptions(Archive *fout)
|
|||||||
AssignDumpId(&subinfo[i].dobj);
|
AssignDumpId(&subinfo[i].dobj);
|
||||||
subinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_subname));
|
subinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_subname));
|
||||||
subinfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname));
|
subinfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname));
|
||||||
subinfo[i].subenabled =
|
|
||||||
(strcmp(PQgetvalue(res, i, i_subenabled), "t") == 0);
|
|
||||||
subinfo[i].subconninfo = pg_strdup(PQgetvalue(res, i, i_subconninfo));
|
subinfo[i].subconninfo = pg_strdup(PQgetvalue(res, i, i_subconninfo));
|
||||||
subinfo[i].subslotname = pg_strdup(PQgetvalue(res, i, i_subslotname));
|
subinfo[i].subslotname = pg_strdup(PQgetvalue(res, i, i_subslotname));
|
||||||
subinfo[i].subpublications =
|
subinfo[i].subpublications =
|
||||||
@ -3758,7 +3752,6 @@ getSubscriptions(Archive *fout)
|
|||||||
static void
|
static void
|
||||||
dumpSubscription(Archive *fout, SubscriptionInfo *subinfo)
|
dumpSubscription(Archive *fout, SubscriptionInfo *subinfo)
|
||||||
{
|
{
|
||||||
DumpOptions *dopt = fout->dopt;
|
|
||||||
PQExpBuffer delq;
|
PQExpBuffer delq;
|
||||||
PQExpBuffer query;
|
PQExpBuffer query;
|
||||||
PQExpBuffer publications;
|
PQExpBuffer publications;
|
||||||
@ -3799,19 +3792,8 @@ dumpSubscription(Archive *fout, SubscriptionInfo *subinfo)
|
|||||||
appendPQExpBufferStr(publications, fmtId(pubnames[i]));
|
appendPQExpBufferStr(publications, fmtId(pubnames[i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
appendPQExpBuffer(query, " PUBLICATION %s WITH (", publications->data);
|
appendPQExpBuffer(query, " PUBLICATION %s WITH (NOCONNECT, SLOT NAME = ", publications->data);
|
||||||
|
|
||||||
if (subinfo->subenabled)
|
|
||||||
appendPQExpBufferStr(query, "ENABLED");
|
|
||||||
else
|
|
||||||
appendPQExpBufferStr(query, "DISABLED");
|
|
||||||
|
|
||||||
appendPQExpBufferStr(query, ", SLOT NAME = ");
|
|
||||||
appendStringLiteralAH(query, subinfo->subslotname, fout);
|
appendStringLiteralAH(query, subinfo->subslotname, fout);
|
||||||
|
|
||||||
if (dopt->no_subscription_connect)
|
|
||||||
appendPQExpBufferStr(query, ", NOCONNECT");
|
|
||||||
|
|
||||||
appendPQExpBufferStr(query, ");\n");
|
appendPQExpBufferStr(query, ");\n");
|
||||||
|
|
||||||
ArchiveEntry(fout, subinfo->dobj.catId, subinfo->dobj.dumpId,
|
ArchiveEntry(fout, subinfo->dobj.catId, subinfo->dobj.dumpId,
|
||||||
|
@ -614,7 +614,6 @@ typedef struct _SubscriptionInfo
|
|||||||
{
|
{
|
||||||
DumpableObject dobj;
|
DumpableObject dobj;
|
||||||
char *rolname;
|
char *rolname;
|
||||||
bool subenabled;
|
|
||||||
char *subconninfo;
|
char *subconninfo;
|
||||||
char *subslotname;
|
char *subslotname;
|
||||||
char *subpublications;
|
char *subpublications;
|
||||||
|
@ -4303,9 +4303,9 @@ qr/CREATE TRANSFORM FOR integer LANGUAGE sql \(FROM SQL WITH FUNCTION pg_catalog
|
|||||||
create_order => 50,
|
create_order => 50,
|
||||||
create_sql => 'CREATE SUBSCRIPTION sub1
|
create_sql => 'CREATE SUBSCRIPTION sub1
|
||||||
CONNECTION \'dbname=doesnotexist\' PUBLICATION pub1
|
CONNECTION \'dbname=doesnotexist\' PUBLICATION pub1
|
||||||
WITH (DISABLED, NOCONNECT);',
|
WITH (NOCONNECT);',
|
||||||
regexp => qr/^
|
regexp => qr/^
|
||||||
\QCREATE SUBSCRIPTION sub1 CONNECTION 'dbname=doesnotexist' PUBLICATION pub1 WITH (DISABLED, SLOT NAME = 'sub1');\E
|
\QCREATE SUBSCRIPTION sub1 CONNECTION 'dbname=doesnotexist' PUBLICATION pub1 WITH (NOCONNECT, SLOT NAME = 'sub1');\E
|
||||||
/xm,
|
/xm,
|
||||||
like => {
|
like => {
|
||||||
binary_upgrade => 1,
|
binary_upgrade => 1,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user