21 #include "catalog/pg_authid_d.h"
32 #define PGDUMP_VERSIONSTR "pg_dump (PostgreSQL) " PG_VERSION "\n"
35 static void help(
void);
49 const char *catalog_name,
Oid objectId,
50 const char *objtype,
const char *objname,
53 const char *pguser,
trivalue prompt_password,
bool fail_on_error);
90 #define PG_AUTHID "pg_authid"
91 #define PG_ROLES "pg_roles "
99 #define exit_nicely(code) exit(code)
104 static struct option long_options[] = {
163 char *use_role = NULL;
164 const char *dumpencoding = NULL;
166 bool data_only =
false;
167 bool globals_only =
false;
168 bool roles_only =
false;
169 bool tablespaces_only =
false;
172 const char *std_strings;
184 if (strcmp(argv[1],
"--help") == 0 || strcmp(argv[1],
"-?") == 0)
189 if (strcmp(argv[1],
"--version") == 0 || strcmp(argv[1],
"-V") == 0)
191 puts(
"pg_dumpall (PostgreSQL) " PG_VERSION);
205 pg_fatal(
"program \"%s\" is needed by %s but was not found in the same directory as \"%s\"",
208 pg_fatal(
"program \"%s\" was found by \"%s\" but was not the same version as %s",
214 while ((
c =
getopt_long(argc, argv,
"acd:E:f:gh:l:Op:rsS:tU:vwWx", long_options, &optindex)) != -1)
277 tablespaces_only =
true;
348 pg_log_error(
"too many command-line arguments (first is \"%s\")",
355 (globals_only || roles_only || tablespaces_only))
357 pg_log_error(
"option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only");
363 if (globals_only && roles_only)
365 pg_log_error(
"options -g/--globals-only and -r/--roles-only cannot be used together");
370 if (globals_only && tablespaces_only)
372 pg_log_error(
"options -g/--globals-only and -t/--tablespaces-only cannot be used together");
378 pg_fatal(
"option --if-exists requires option -c/--clean");
380 if (roles_only && tablespaces_only)
382 pg_log_error(
"options -r/--roles-only and -t/--tablespaces-only cannot be used together");
441 prompt_password,
false);
444 pg_fatal(
"could not connect to database \"%s\"", pgdb);
449 prompt_password,
false);
452 prompt_password,
true);
456 pg_log_error(
"could not connect to databases \"postgres\" or \"template1\"\n"
457 "Please specify an alternative database.");
476 pg_fatal(
"could not open output file \"%s\": %m",
488 pg_fatal(
"invalid client encoding \"%s\" specified",
515 fprintf(
OPF,
"--\n-- PostgreSQL database cluster dump\n--\n\n");
527 fprintf(
OPF,
"SET default_transaction_read_only = off;\n\n");
532 fprintf(
OPF,
"SET standard_conforming_strings = %s;\n", std_strings);
533 if (strcmp(std_strings,
"off") == 0)
534 fprintf(
OPF,
"SET escape_string_warning = off;\n");
547 if (!globals_only && !roles_only && !tablespaces_only)
553 if (!tablespaces_only)
561 if (!tablespaces_only)
579 if (!globals_only && !roles_only && !tablespaces_only)
586 fprintf(
OPF,
"--\n-- PostgreSQL database cluster dump complete\n--\n\n");
604 printf(
_(
"%s extracts a PostgreSQL database cluster into an SQL script file.\n\n"),
progname);
608 printf(
_(
"\nGeneral options:\n"));
609 printf(
_(
" -f, --file=FILENAME output file name\n"));
610 printf(
_(
" -v, --verbose verbose mode\n"));
611 printf(
_(
" -V, --version output version information, then exit\n"));
612 printf(
_(
" --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"));
613 printf(
_(
" -?, --help show this help, then exit\n"));
614 printf(
_(
"\nOptions controlling the output content:\n"));
615 printf(
_(
" -a, --data-only dump only the data, not the schema\n"));
616 printf(
_(
" -c, --clean clean (drop) databases before recreating\n"));
617 printf(
_(
" -E, --encoding=ENCODING dump the data in encoding ENCODING\n"));
618 printf(
_(
" -g, --globals-only dump only global objects, no databases\n"));
619 printf(
_(
" -O, --no-owner skip restoration of object ownership\n"));
620 printf(
_(
" -r, --roles-only dump only roles, no databases or tablespaces\n"));
621 printf(
_(
" -s, --schema-only dump only the schema, no data\n"));
622 printf(
_(
" -S, --superuser=NAME superuser user name to use in the dump\n"));
623 printf(
_(
" -t, --tablespaces-only dump only tablespaces, no databases or roles\n"));
624 printf(
_(
" -x, --no-privileges do not dump privileges (grant/revoke)\n"));
625 printf(
_(
" --binary-upgrade for use by upgrade utilities only\n"));
626 printf(
_(
" --column-inserts dump data as INSERT commands with column names\n"));
627 printf(
_(
" --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"));
628 printf(
_(
" --disable-triggers disable triggers during data-only restore\n"));
629 printf(
_(
" --exclude-database=PATTERN exclude databases whose name matches PATTERN\n"));
630 printf(
_(
" --extra-float-digits=NUM override default setting for extra_float_digits\n"));
631 printf(
_(
" --if-exists use IF EXISTS when dropping objects\n"));
632 printf(
_(
" --inserts dump data as INSERT commands, rather than COPY\n"));
633 printf(
_(
" --load-via-partition-root load partitions via the root table\n"));
634 printf(
_(
" --no-comments do not dump comments\n"));
635 printf(
_(
" --no-publications do not dump publications\n"));
636 printf(
_(
" --no-role-passwords do not dump passwords for roles\n"));
637 printf(
_(
" --no-security-labels do not dump security label assignments\n"));
638 printf(
_(
" --no-subscriptions do not dump subscriptions\n"));
639 printf(
_(
" --no-sync do not wait for changes to be written safely to disk\n"));
640 printf(
_(
" --no-table-access-method do not dump table access methods\n"));
641 printf(
_(
" --no-tablespaces do not dump tablespace assignments\n"));
642 printf(
_(
" --no-toast-compression do not dump TOAST compression methods\n"));
643 printf(
_(
" --no-unlogged-table-data do not dump unlogged table data\n"));
644 printf(
_(
" --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n"));
645 printf(
_(
" --quote-all-identifiers quote all identifiers, even if not key words\n"));
646 printf(
_(
" --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"));
647 printf(
_(
" --use-set-session-authorization\n"
648 " use SET SESSION AUTHORIZATION commands instead of\n"
649 " ALTER OWNER commands to set ownership\n"));
651 printf(
_(
"\nConnection options:\n"));
652 printf(
_(
" -d, --dbname=CONNSTR connect using connection string\n"));
653 printf(
_(
" -h, --host=HOSTNAME database server host or socket directory\n"));
654 printf(
_(
" -l, --database=DBNAME alternative default database\n"));
655 printf(
_(
" -p, --port=PORT database server port number\n"));
656 printf(
_(
" -U, --username=NAME connect as specified database user\n"));
657 printf(
_(
" -w, --no-password never prompt for password\n"));
658 printf(
_(
" -W, --password force password prompt (should happen automatically)\n"));
659 printf(
_(
" --role=ROLENAME do SET ROLE before dump\n"));
661 printf(
_(
"\nIf -f/--file is not used, then the SQL script will be written to the standard\n"
663 printf(
_(
"Report bugs to <%s>.\n"), PACKAGE_BUGREPORT);
664 printf(
_(
"%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
683 "WHERE rolname !~ '^pg_' "
700 const char *rolename;
742 "SELECT oid, rolname, rolsuper, rolinherit, "
743 "rolcreaterole, rolcreatedb, "
744 "rolcanlogin, rolconnlimit, rolpassword, "
745 "rolvaliduntil, rolreplication, rolbypassrls, "
746 "pg_catalog.shobj_description(oid, '%s') as rolcomment, "
747 "rolname = current_user AS is_current_user "
749 "WHERE rolname !~ '^pg_' "
753 "SELECT oid, rolname, rolsuper, rolinherit, "
754 "rolcreaterole, rolcreatedb, "
755 "rolcanlogin, rolconnlimit, rolpassword, "
756 "rolvaliduntil, rolreplication, rolbypassrls, "
757 "pg_catalog.shobj_description(oid, '%s') as rolcomment, "
758 "rolname = current_user AS is_current_user "
763 "SELECT oid, rolname, rolsuper, rolinherit, "
764 "rolcreaterole, rolcreatedb, "
765 "rolcanlogin, rolconnlimit, rolpassword, "
766 "rolvaliduntil, rolreplication, "
767 "false as rolbypassrls, "
768 "pg_catalog.shobj_description(oid, '%s') as rolcomment, "
769 "rolname = current_user AS is_current_user "
795 const char *rolename;
801 if (strncmp(rolename,
"pg_", 3) == 0)
814 "SELECT pg_catalog.binary_upgrade_set_next_pg_authid_oid('%u'::pg_catalog.oid);\n\n",
904 fprintf(
OPF,
"\n--\n-- User Configurations\n--\n");
931 "um.rolname AS member, "
933 "ug.rolname AS grantor "
934 "FROM pg_auth_members a "
935 "LEFT JOIN %s ur on ur.oid = a.roleid "
936 "LEFT JOIN %s um on um.oid = a.member "
937 "LEFT JOIN %s ug on ug.oid = a.grantor "
938 "WHERE NOT (ur.rolname ~ '^pg_' AND um.rolname ~ '^pg_')"
943 fprintf(
OPF,
"--\n-- Role memberships\n--\n\n");
993 "pg_catalog.pg_get_userbyid(" CppAsString2(BOOTSTRAP_SUPERUSERID)
") AS parowner, "
995 "pg_catalog.acldefault('p', " CppAsString2(BOOTSTRAP_SUPERUSERID)
") AS acldefault "
996 "FROM pg_catalog.pg_parameter_acl "
1000 fprintf(
OPF,
"--\n-- Role privileges on configuration parameters\n--\n\n");
1018 pg_log_error(
"could not parse ACL list (%s) for parameter \"%s\"",
1049 "FROM pg_catalog.pg_tablespace "
1050 "WHERE spcname !~ '^pg_' "
1054 fprintf(
OPF,
"--\n-- Drop tablespaces\n--\n\n");
1084 "pg_catalog.pg_get_userbyid(spcowner) AS spcowner, "
1085 "pg_catalog.pg_tablespace_location(oid), "
1086 "spcacl, acldefault('t', spcowner) AS acldefault, "
1087 "array_to_string(spcoptions, ', '),"
1088 "pg_catalog.shobj_description(oid, 'pg_tablespace') "
1089 "FROM pg_catalog.pg_tablespace "
1090 "WHERE spcname !~ '^pg_' "
1115 appendPQExpBuffer(
buf,
"SELECT pg_catalog.binary_upgrade_set_next_pg_tablespace_oid('%u'::pg_catalog.oid);\n", spcoid);
1125 if (spcoptions && spcoptions[0] !=
'\0')
1127 fspcname, spcoptions);
1136 pg_log_error(
"could not parse ACL list (%s) for tablespace \"%s\"",
1142 if (!
no_comments && spccomment && spccomment[0] !=
'\0')
1151 "TABLESPACE", spcname,
1180 "FROM pg_database d "
1181 "WHERE datallowconn "
1182 "ORDER BY datname");
1185 fprintf(
OPF,
"--\n-- Drop databases (except postgres and template1)\n--\n\n");
1196 if (strcmp(
dbname,
"template1") != 0 &&
1197 strcmp(
dbname,
"template0") != 0 &&
1198 strcmp(
dbname,
"postgres") != 0)
1222 "WHERE setdatabase = 0 AND setrole = "
1223 "(SELECT oid FROM %s WHERE rolname = ",
1259 if (patterns->
head == NULL)
1275 "SELECT datname FROM pg_catalog.pg_database n\n");
1277 false, NULL,
"datname", NULL, NULL, NULL,
1282 pg_log_error(
"improper qualified name (too many dotted names): %s",
1323 "FROM pg_database d "
1324 "WHERE datallowconn "
1325 "ORDER BY (datname <> 'template1'), datname");
1333 const char *create_opts;
1337 if (strcmp(
dbname,
"template0") == 0)
1359 if (strcmp(
dbname,
"template1") == 0 || strcmp(
dbname,
"postgres") == 0)
1362 create_opts =
"--clean --create";
1371 create_opts =
"--create";
1384 pg_fatal(
"could not re-open the output file \"%s\": %m",
1430 ret = system(cmd->
data);
1451 const char *objtype,
const char *objname,
1477 const char *
pghost,
const char *
pgport,
const char *pguser,
1478 trivalue prompt_password,
bool fail_on_error)
1482 const char *remoteversion_str;
1484 const char **keywords = NULL;
1485 const char **
values = NULL;
1500 char *err_msg = NULL;
1519 if (conn_opts == NULL)
1522 for (conn_opt = conn_opts; conn_opt->
keyword != NULL; conn_opt++)
1524 if (conn_opt->
val != NULL && conn_opt->
val[0] !=
'\0' &&
1525 strcmp(conn_opt->
keyword,
"dbname") != 0)
1529 keywords =
pg_malloc0((argcount + 1) *
sizeof(*keywords));
1532 for (conn_opt = conn_opts; conn_opt->
keyword != NULL; conn_opt++)
1534 if (conn_opt->
val != NULL && conn_opt->
val[0] !=
'\0' &&
1535 strcmp(conn_opt->
keyword,
"dbname") != 0)
1545 keywords =
pg_malloc0((argcount + 1) *
sizeof(*keywords));
1551 keywords[
i] =
"host";
1557 keywords[
i] =
"port";
1563 keywords[
i] =
"user";
1569 keywords[
i] =
"password";
1575 keywords[
i] =
"dbname";
1579 keywords[
i] =
"fallback_application_name";
1592 prompt_password !=
TRI_NO)
1629 if (!remoteversion_str)
1630 pg_fatal(
"could not get server version");
1633 pg_fatal(
"could not parse server version \"%s\"",
1636 my_version = PG_VERSION_NUM;
1646 pg_log_error(
"aborting because of server version mismatch");
1648 remoteversion_str,
progname, PG_VERSION);
1673 bool firstkeyword =
true;
1676 for (
i = 0; keywords[
i] != NULL;
i++)
1678 if (strcmp(keywords[
i],
"dbname") == 0 ||
1679 strcmp(keywords[
i],
"password") == 0 ||
1680 strcmp(keywords[
i],
"fallback_application_name") == 0)
1685 firstkeyword =
false;
1749 time_t
now = time(NULL);
Acl * acldefault(ObjectType objtype, Oid ownerId)
Datum now(PG_FUNCTION_ARGS)
static Datum values[MAXATTR]
#define PG_TEXTDOMAIN(domain)
int find_my_exec(const char *argv0, char *retpath)
void set_pglocale_pgservice(const char *argv0, const char *app)
int find_other_exec(const char *argv0, const char *target, const char *versionstr, char *retpath)
#define ALWAYS_SECURE_SEARCH_PATH_SQL
static void PGresult * res
bool buildACLCommands(const char *name, const char *subname, const char *nspname, const char *type, const char *acls, const char *baseacls, const char *owner, const char *prefix, int remoteVersion, PQExpBuffer sql)
void buildShSecLabelQuery(const char *catalog_name, Oid objectId, PQExpBuffer sql)
void makeAlterConfigCommand(PGconn *conn, const char *configitem, const char *type, const char *name, const char *type2, const char *name2, PQExpBuffer buf)
void emitShSecLabels(PGconn *conn, PGresult *res, PQExpBuffer buffer, const char *objtype, const char *objname)
#define PGDUMP_STRFTIME_FMT
const char * pg_encoding_to_char(int encoding)
void fsync_fname(const char *fname, bool isdir)
const char * PQparameterStatus(const PGconn *conn, const char *paramName)
int PQserverVersion(const PGconn *conn)
PQconninfoOption * PQconninfoParse(const char *conninfo, char **errmsg)
PGconn * PQconnectdbParams(const char *const *keywords, const char *const *values, int expand_dbname)
void PQconninfoFree(PQconninfoOption *connOptions)
int PQconnectionNeedsPassword(const PGconn *conn)
char * PQerrorMessage(const PGconn *conn)
ConnStatusType PQstatus(const PGconn *conn)
int PQclientEncoding(const PGconn *conn)
void PQfinish(PGconn *conn)
int PQsetClientEncoding(PGconn *conn, const char *encoding)
ExecStatusType PQresultStatus(const PGresult *res)
void PQclear(PGresult *res)
int PQntuples(const PGresult *res)
PGresult * PQexec(PGconn *conn, const char *query)
char * PQgetvalue(const PGresult *res, int tup_num, int field_num)
int PQfnumber(const PGresult *res, const char *field_name)
int PQgetisnull(const PGresult *res, int tup_num, int field_num)
void * pg_malloc0(size_t size)
char * pg_strdup(const char *in)
int getopt_long(int argc, char *const argv[], const char *optstring, const struct option *longopts, int *longindex)
#define required_argument
static void const char fflush(stdout)
void pg_logging_increase_verbosity(void)
void pg_logging_init(const char *argv0)
void pg_logging_set_level(enum pg_log_level new_level)
#define pg_log_error(...)
#define pg_log_error_hint(...)
#define pg_log_error_detail(...)
static void dumpTimestamp(const char *msg)
static int on_conflict_do_nothing
int main(int argc, char *argv[])
static void dropTablespaces(PGconn *conn)
static void expand_dbname_patterns(PGconn *conn, SimpleStringList *patterns, SimpleStringList *names)
static int no_role_passwords
static PQExpBuffer pgdumpopts
static int no_table_access_method
static int no_unlogged_table_data
static int binary_upgrade
static int disable_triggers
static void dumpUserConfig(PGconn *conn, const char *username)
static SimpleStringList database_exclude_patterns
static void dumpTablespaces(PGconn *conn)
static void dumpRoleMembership(PGconn *conn)
#define exit_nicely(code)
static char pg_dump_bin[MAXPGPATH]
static SimpleStringList database_exclude_names
static char * constructConnStr(const char **keywords, const char **values)
static int no_publications
static int no_security_labels
static void dumpDatabases(PGconn *conn)
static int disable_dollar_quoting
static void buildShSecLabels(PGconn *conn, const char *catalog_name, Oid objectId, const char *objtype, const char *objname, PQExpBuffer buffer)
static int no_tablespaces
static int no_toast_compression
static PGconn * connectDatabase(const char *dbname, const char *connstr, const char *pghost, const char *pgport, const char *pguser, trivalue prompt_password, bool fail_on_error)
static void executeCommand(PGconn *conn, const char *query)
static int runPgDump(const char *dbname, const char *create_opts)
static void dumpRoleGUCPrivs(PGconn *conn)
static void dumpRoles(PGconn *conn)
static PGresult * executeQuery(PGconn *conn, const char *query)
static int use_setsessauth
static int load_via_partition_root
static int column_inserts
static void dropRoles(PGconn *conn)
static void dropDBs(PGconn *conn)
static int server_version
static char role_catalog[10]
static const char * progname
static int no_subscriptions
#define PGDUMP_VERSIONSTR
PGDLLIMPORT char * optarg
#define pg_log_warning(...)
const char * get_progname(const char *argv0)
size_t strlcpy(char *dst, const char *src, size_t siz)
void printfPQExpBuffer(PQExpBuffer str, const char *fmt,...)
PQExpBuffer createPQExpBuffer(void)
void resetPQExpBuffer(PQExpBuffer str)
void appendPQExpBuffer(PQExpBuffer str, const char *fmt,...)
void destroyPQExpBuffer(PQExpBuffer str)
void appendPQExpBufferChar(PQExpBuffer str, char ch)
void appendPQExpBufferStr(PQExpBuffer str, const char *data)
bool quote_all_identifiers
bool simple_string_list_member(SimpleStringList *list, const char *val)
void simple_string_list_append(SimpleStringList *list, const char *val)
char * simple_prompt(const char *prompt, bool echo)
void appendShellString(PQExpBuffer buf, const char *str)
void appendStringLiteralConn(PQExpBuffer buf, const char *str, PGconn *conn)
bool processSQLNamePattern(PGconn *conn, PQExpBuffer buf, const char *pattern, bool have_where, bool force_escape, const char *schemavar, const char *namevar, const char *altnamevar, const char *visibilityrule, PQExpBuffer dbnamebuf, int *dotcnt)
const char * fmtId(const char *rawid)
void appendConnStrVal(PQExpBuffer buf, const char *str)
struct SimpleStringListCell * next
SimpleStringListCell * head