mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +03:00
Support unlogged tables.
The contents of an unlogged table are WAL-logged; thus, they are not available on standby servers and are truncated whenever the database system enters recovery. Indexes on unlogged tables are also unlogged. Unlogged GiST indexes are not currently supported.
This commit is contained in:
@@ -134,6 +134,7 @@ static int disable_dollar_quoting = 0;
|
||||
static int dump_inserts = 0;
|
||||
static int column_inserts = 0;
|
||||
static int no_security_label = 0;
|
||||
static int no_unlogged_table_data = 0;
|
||||
|
||||
|
||||
static void help(const char *progname);
|
||||
@@ -316,6 +317,7 @@ main(int argc, char **argv)
|
||||
{"role", required_argument, NULL, 3},
|
||||
{"use-set-session-authorization", no_argument, &use_setsessauth, 1},
|
||||
{"no-security-label", no_argument, &no_security_label, 1},
|
||||
{"no-unlogged-table-data", no_argument, &no_unlogged_table_data, 1},
|
||||
|
||||
{NULL, 0, NULL, 0}
|
||||
};
|
||||
@@ -466,6 +468,8 @@ main(int argc, char **argv)
|
||||
use_setsessauth = 1;
|
||||
else if (strcmp(optarg, "no-security-label") == 0)
|
||||
no_security_label = 1;
|
||||
else if (strcmp(optarg, "no-unlogged-table-data") == 0)
|
||||
no_unlogged_table_data = 1;
|
||||
else
|
||||
{
|
||||
fprintf(stderr,
|
||||
@@ -864,6 +868,7 @@ help(const char *progname)
|
||||
printf(_(" --quote-all-identifiers quote all identifiers, even if not keywords\n"));
|
||||
printf(_(" --role=ROLENAME do SET ROLE before dump\n"));
|
||||
printf(_(" --no-security-label do not dump security label assignments\n"));
|
||||
printf(_(" --no-unlogged-table-data do not dump unlogged table data\n"));
|
||||
printf(_(" --use-set-session-authorization\n"
|
||||
" use SET SESSION AUTHORIZATION commands instead of\n"
|
||||
" ALTER OWNER commands to set ownership\n"));
|
||||
@@ -1471,6 +1476,10 @@ getTableData(TableInfo *tblinfo, int numTables, bool oids)
|
||||
/* Skip SEQUENCEs (handled elsewhere) */
|
||||
if (tblinfo[i].relkind == RELKIND_SEQUENCE)
|
||||
continue;
|
||||
/* Skip unlogged tables if so requested */
|
||||
if (tblinfo[i].relpersistence == RELPERSISTENCE_UNLOGGED
|
||||
&& no_unlogged_table_data)
|
||||
continue;
|
||||
|
||||
if (tblinfo[i].dobj.dump)
|
||||
{
|
||||
@@ -3447,6 +3456,7 @@ getTables(int *numTables)
|
||||
int i_relhasrules;
|
||||
int i_relhasoids;
|
||||
int i_relfrozenxid;
|
||||
int i_relpersistence;
|
||||
int i_owning_tab;
|
||||
int i_owning_col;
|
||||
int i_reltablespace;
|
||||
@@ -3477,7 +3487,7 @@ getTables(int *numTables)
|
||||
* we cannot correctly identify inherited columns, owned sequences, etc.
|
||||
*/
|
||||
|
||||
if (g_fout->remoteVersion >= 90000)
|
||||
if (g_fout->remoteVersion >= 90100)
|
||||
{
|
||||
/*
|
||||
* Left join to pick up dependency info linking sequences to their
|
||||
@@ -3489,7 +3499,40 @@ getTables(int *numTables)
|
||||
"(%s c.relowner) AS rolname, "
|
||||
"c.relchecks, c.relhastriggers, "
|
||||
"c.relhasindex, c.relhasrules, c.relhasoids, "
|
||||
"c.relfrozenxid, "
|
||||
"c.relfrozenxid, c.relpersistence, "
|
||||
"CASE WHEN c.reloftype <> 0 THEN c.reloftype::pg_catalog.regtype ELSE NULL END AS reloftype, "
|
||||
"d.refobjid AS owning_tab, "
|
||||
"d.refobjsubid AS owning_col, "
|
||||
"(SELECT spcname FROM pg_tablespace t WHERE t.oid = c.reltablespace) AS reltablespace, "
|
||||
"array_to_string(c.reloptions, ', ') AS reloptions, "
|
||||
"array_to_string(array(SELECT 'toast.' || x FROM unnest(tc.reloptions) x), ', ') AS toast_reloptions "
|
||||
"FROM pg_class c "
|
||||
"LEFT JOIN pg_depend d ON "
|
||||
"(c.relkind = '%c' AND "
|
||||
"d.classid = c.tableoid AND d.objid = c.oid AND "
|
||||
"d.objsubid = 0 AND "
|
||||
"d.refclassid = c.tableoid AND d.deptype = 'a') "
|
||||
"LEFT JOIN pg_class tc ON (c.reltoastrelid = tc.oid) "
|
||||
"WHERE c.relkind in ('%c', '%c', '%c', '%c') "
|
||||
"ORDER BY c.oid",
|
||||
username_subquery,
|
||||
RELKIND_SEQUENCE,
|
||||
RELKIND_RELATION, RELKIND_SEQUENCE,
|
||||
RELKIND_VIEW, RELKIND_COMPOSITE_TYPE);
|
||||
}
|
||||
else if (g_fout->remoteVersion >= 90000)
|
||||
{
|
||||
/*
|
||||
* Left join to pick up dependency info linking sequences to their
|
||||
* owning column, if any (note this dependency is AUTO as of 8.2)
|
||||
*/
|
||||
appendPQExpBuffer(query,
|
||||
"SELECT c.tableoid, c.oid, c.relname, "
|
||||
"c.relacl, c.relkind, c.relnamespace, "
|
||||
"(%s c.relowner) AS rolname, "
|
||||
"c.relchecks, c.relhastriggers, "
|
||||
"c.relhasindex, c.relhasrules, c.relhasoids, "
|
||||
"c.relfrozenxid, 'p' AS relpersistence, "
|
||||
"CASE WHEN c.reloftype <> 0 THEN c.reloftype::pg_catalog.regtype ELSE NULL END AS reloftype, "
|
||||
"d.refobjid AS owning_tab, "
|
||||
"d.refobjsubid AS owning_col, "
|
||||
@@ -3522,7 +3565,7 @@ getTables(int *numTables)
|
||||
"(%s c.relowner) AS rolname, "
|
||||
"c.relchecks, c.relhastriggers, "
|
||||
"c.relhasindex, c.relhasrules, c.relhasoids, "
|
||||
"c.relfrozenxid, "
|
||||
"c.relfrozenxid, 'p' AS relpersistence, "
|
||||
"NULL AS reloftype, "
|
||||
"d.refobjid AS owning_tab, "
|
||||
"d.refobjsubid AS owning_col, "
|
||||
@@ -3555,7 +3598,7 @@ getTables(int *numTables)
|
||||
"(%s relowner) AS rolname, "
|
||||
"relchecks, (reltriggers <> 0) AS relhastriggers, "
|
||||
"relhasindex, relhasrules, relhasoids, "
|
||||
"relfrozenxid, "
|
||||
"relfrozenxid, 'p' AS relpersistence, "
|
||||
"NULL AS reloftype, "
|
||||
"d.refobjid AS owning_tab, "
|
||||
"d.refobjsubid AS owning_col, "
|
||||
@@ -3587,7 +3630,7 @@ getTables(int *numTables)
|
||||
"(%s relowner) AS rolname, "
|
||||
"relchecks, (reltriggers <> 0) AS relhastriggers, "
|
||||
"relhasindex, relhasrules, relhasoids, "
|
||||
"0 AS relfrozenxid, "
|
||||
"0 AS relfrozenxid, 'p' AS relpersistence, "
|
||||
"NULL AS reloftype, "
|
||||
"d.refobjid AS owning_tab, "
|
||||
"d.refobjsubid AS owning_col, "
|
||||
@@ -3619,7 +3662,7 @@ getTables(int *numTables)
|
||||
"(%s relowner) AS rolname, "
|
||||
"relchecks, (reltriggers <> 0) AS relhastriggers, "
|
||||
"relhasindex, relhasrules, relhasoids, "
|
||||
"0 AS relfrozenxid, "
|
||||
"0 AS relfrozenxid, 'p' AS relpersistence, "
|
||||
"NULL AS reloftype, "
|
||||
"d.refobjid AS owning_tab, "
|
||||
"d.refobjsubid AS owning_col, "
|
||||
@@ -3647,7 +3690,7 @@ getTables(int *numTables)
|
||||
"(%s relowner) AS rolname, "
|
||||
"relchecks, (reltriggers <> 0) AS relhastriggers, "
|
||||
"relhasindex, relhasrules, relhasoids, "
|
||||
"0 AS relfrozenxid, "
|
||||
"0 AS relfrozenxid, 'p' AS relpersistence, "
|
||||
"NULL AS reloftype, "
|
||||
"NULL::oid AS owning_tab, "
|
||||
"NULL::int4 AS owning_col, "
|
||||
@@ -3670,7 +3713,7 @@ getTables(int *numTables)
|
||||
"relchecks, (reltriggers <> 0) AS relhastriggers, "
|
||||
"relhasindex, relhasrules, "
|
||||
"'t'::bool AS relhasoids, "
|
||||
"0 AS relfrozenxid, "
|
||||
"0 AS relfrozenxid, 'p' AS relpersistence, "
|
||||
"NULL AS reloftype, "
|
||||
"NULL::oid AS owning_tab, "
|
||||
"NULL::int4 AS owning_col, "
|
||||
@@ -3703,7 +3746,7 @@ getTables(int *numTables)
|
||||
"relchecks, (reltriggers <> 0) AS relhastriggers, "
|
||||
"relhasindex, relhasrules, "
|
||||
"'t'::bool AS relhasoids, "
|
||||
"0 as relfrozenxid, "
|
||||
"0 as relfrozenxid, 'p' AS relpersistence, "
|
||||
"NULL AS reloftype, "
|
||||
"NULL::oid AS owning_tab, "
|
||||
"NULL::int4 AS owning_col, "
|
||||
@@ -3749,6 +3792,7 @@ getTables(int *numTables)
|
||||
i_relhasrules = PQfnumber(res, "relhasrules");
|
||||
i_relhasoids = PQfnumber(res, "relhasoids");
|
||||
i_relfrozenxid = PQfnumber(res, "relfrozenxid");
|
||||
i_relpersistence = PQfnumber(res, "relpersistence");
|
||||
i_owning_tab = PQfnumber(res, "owning_tab");
|
||||
i_owning_col = PQfnumber(res, "owning_col");
|
||||
i_reltablespace = PQfnumber(res, "reltablespace");
|
||||
@@ -3783,6 +3827,7 @@ getTables(int *numTables)
|
||||
tblinfo[i].rolname = strdup(PQgetvalue(res, i, i_rolname));
|
||||
tblinfo[i].relacl = strdup(PQgetvalue(res, i, i_relacl));
|
||||
tblinfo[i].relkind = *(PQgetvalue(res, i, i_relkind));
|
||||
tblinfo[i].relpersistence = *(PQgetvalue(res, i, i_relpersistence));
|
||||
tblinfo[i].hasindex = (strcmp(PQgetvalue(res, i, i_relhasindex), "t") == 0);
|
||||
tblinfo[i].hasrules = (strcmp(PQgetvalue(res, i, i_relhasrules), "t") == 0);
|
||||
tblinfo[i].hastriggers = (strcmp(PQgetvalue(res, i, i_relhastriggers), "t") == 0);
|
||||
@@ -11051,8 +11096,12 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
|
||||
if (binary_upgrade)
|
||||
binary_upgrade_set_relfilenodes(q, tbinfo->dobj.catId.oid, false);
|
||||
|
||||
appendPQExpBuffer(q, "CREATE TABLE %s",
|
||||
fmtId(tbinfo->dobj.name));
|
||||
if (tbinfo->relpersistence == RELPERSISTENCE_UNLOGGED)
|
||||
appendPQExpBuffer(q, "CREATE UNLOGGED TABLE %s",
|
||||
fmtId(tbinfo->dobj.name));
|
||||
else
|
||||
appendPQExpBuffer(q, "CREATE TABLE %s",
|
||||
fmtId(tbinfo->dobj.name));
|
||||
if (tbinfo->reloftype)
|
||||
appendPQExpBuffer(q, " OF %s", tbinfo->reloftype);
|
||||
actual_atts = 0;
|
||||
|
Reference in New Issue
Block a user