数据库PostgreSQL备份与恢复工具使用详解

目录

概述

pg_dump

pg_dumpall

pg_basebackup

pg_restore

总结

概述

PostgreSQL 提供了一系列强大的工具来备份和恢复数据库。这些工具包括 pg_dump, pg_restore, pg_dumpall, 和 pg_basebackup。下面是这些工具的简要概述和一些注意事项:

1. pg_dump

pg_dump 是一个用于备份单个 PostgreSQL 数据库的工具。它可以生成 SQL 文件或自包含的归档文件,其中包含了创建和填充数据库所需的所有 SQL 命令。

用途:备份单个数据库。

2. pg_dumpall

pg_dumpall 用于备份整个 PostgreSQL 集群,包括所有数据库、角色、表空间等。

用途:备份整个 PostgreSQL 集群。

3. pg_basebackup

pg_basebackup 用于创建整个 PostgreSQL 数据目录的物理备份,这对于灾难恢复尤为重要。

用途:备份整个 PostgreSQL 数据目录。

4. pg_restore

pg_restore 是一个用于从 pg_dump 创建的备份文件恢复数据的工具。

用途:恢复单个数据库。

一、pg_dump

pg_dump参数详解
复制
# 通用选项 -f, --file=FILENAME # 输出文件或目录的名称。 -F, --format=c|d|t|p # 输出文件格式(自定义[c]、目录[d]、tar[t]、纯文本[p],默认为纯文本)。 -j, --jobs=NUM # 使用指定数量的并行任务来执行数据库转储。 -v, --verbose # 详细模式。 -V, --version # 输出版本信息,然后退出。 -Z, --compress=METHOD[:DETAIL] # 按指定的方式压缩输出。 --lock-wait-timeout=TIMEOUT # 在等待表锁超时后失败,超时时间为TIMEOUT--no-sync # 不等待更改安全地写入磁盘。 -?, --help # 显示帮助,然后退出。 # 控制输出内容的选项 -a, --data-only # 只转储数据,不转储模式。 -b, --large-objects # 在转储中包含大对象。 --blobs # (与--large-objects相同,已弃用) -B, --no-large-objects # 在转储中排除大对象。 --no-blobs # (与--no-large-objects相同,已弃用) -c, --clean # 清理(删除)数据库对象后再重新创建。 -C, --create # 在转储中包含创建数据库的命令。 -e, --extension=PATTERN # 只转储指定的扩展。 -E, --encoding=ENCODING # 以指定的编码ENCODING转储数据。 -n, --schema=PATTERN # 只转储指定的模式。 -N, --exclude-schema=PATTERN # 不转储指定的模式。 -O, --no-owner # 在纯文本格式中跳过对象所有权的恢复。 -s, --schema-only # 只转储模式,不转储数据。 -S, --superuser=NAME # 在纯文本格式中使用的超级用户名。 -t, --table=PATTERN # 只转储指定的表。 -T, --exclude-table=PATTERN # 不转储指定的表。 -x, --no-privileges # 不转储权限(grant/revoke)。 --binary-upgrade # 仅用于升级工具。 --column-inserts # 作为带有列名的INSERT命令转储数据。 --disable-dollar-quoting # 禁用美元符号引用,使用SQL标准引用。 --disable-triggers # 在仅数据恢复时禁用触发器。 --enable-row-security # 启用行级安全性(仅转储用户有访问权限的内容)。 --exclude-table-and-children=PATTERN # 不转储指定的表及其子表和分区表。 --exclude-table-data=PATTERN # 不转储指定表的数据。 --exclude-table-data-and-children=PATTERN # 不转储指定表及其子表和分区表的数据。 --extra-float-digits=NUM # 覆盖extra_float_digits的默认设置。 --if-exists # 在删除对象时使用IF EXISTS--include-foreign-data=PATTERN # 包含与指定模式匹配的外部服务器上的外部表数据。 --inserts # 作为INSERT命令而不是COPY命令转储数据。 --load-via-partition-root # 通过根表加载分区。 --no-comments # 不转储注释。 --no-publications # 不转储发布。 --no-security-labels # 不转储安全标签分配。 --no-subscriptions # 不转储订阅。 --no-table-access-method # 不转储表访问方法。 --no-tablespaces # 不转储表空间分配。 --no-toast-compression # 不转储TOAST压缩方法。 --no-unlogged-table-data # 不转储未登录表的数据。 --on-conflict-do-nothing # 在INSERT命令中添加ON CONFLICT DO NOTHING--quote-all-identifiers # 引用所有标识符,即使它们不是关键字。 --rows-per-insert=NROWS # 每个INSERT命令中的行数;隐含--inserts。 --section=SECTION # 转储命名的段(预数据、数据或后数据)。 --serializable-deferrable # 等待直到可以无异常地运行转储。 --snapshot=SNAPSHOT # 使用给定的快照进行转储。 --strict-names # 要求表和/或模式包含模式至少匹配一个实体。 --table-and-children=PATTERN # 只转储指定的表及其子表和分区表。 --use-set-session-authorization # 使用SET SESSION AUTHORIZATION命令代替ALTER OWNER命令来设置所有权。 # 连接选项 -d, --dbname=DBNAME # 要转储的数据库名称。 -h, --host=HOSTNAME # 数据库服务器的主机名或套接字目录。 -p, --port=PORT # 数据库服务器的端口号。 -U, --username=NAME # 以指定的数据库用户连接。 -w, --no-password # 永远不要提示输入密码。 -W, --password # 强制提示输入密码(应自动发生)。 --role=ROLENAME # 在转储前执行SET ROLE。 # 如果没有提供数据库名称,则使用PGDATABASE环境变量的值。1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.
pg_dump使用示例

要将数据库转储到自定义格式的存档文件中,请执行以下操作:

复制
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -Fc -d mydb > db.dump1.

要将数据库转储到目录格式存档中,请执行以下操作:

复制
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -Fd -d mydb -f dumpdir1.

要将数据库转储到目录格式存档中,同时执行 5 个工作线程作业:

复制
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -Fd -d mydb -j 5 -f dumpdir1.

转储名为:mytab

复制
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -d mydb > mytab.sql1.

转储以emp开头的所有表,排除名为 :empdetroitemployee_log集合

复制
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -t detroit.emp* -T detroit.employee_log mydb > db.sql1.

转储名称以 east 开头且以 gsm结尾的所有集合,排除名称包含单词test : 的集合

复制
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -n east*gsm -N *test* mydb > db.sql1.

同样,使用正则表达式表示法来合并开关:

复制
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -n (east|west)*gsm -N *test* mydb > db.sql1.

转储除名称以ts_*开头的集合之外的所有集合

复制
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -T ts_* mydb > db.sql1.

转储具有混合大小写名称的单个表,您需要类似-t

复制
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -t "\"MixedCaseName\"" mydb > mytab.sql1.

备份数据库结构(不包含数据)

复制
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W --schema-only mydatabase > mydatabase_schema_only.sql1.

备份数据库数据(不包含结构)

复制
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W --data-only mydatabase > mydatabase_schema_only.sql1.

备份多个特定表

复制
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -t table1 -t table2 mydatabase > tables_backup.sql1.

备份数据库并压缩

复制
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -d mydb | gzip > mydatabase_backup.sql.gz1.

备份并导出为 INSERT 语句

复制
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W --format=c --large-objects --inserts mydatabase > insert_statements.sql pg_dump -U postgres -h 127.0.0.1 -p 5432 -W --schema-only mydatabase > all_schemas_structure.sql1.2.

二、pg_dumpall

pg_dumpall参数详解
复制
# 使用语法 pg_dumpall [OPTION]... # 通用选项 -f, --file=FILENAME # 输出文件名 -v, --verbose # 详细模式 -V, --version # 输出版本信息,然后退出 --lock-wait-timeout=TIMEOUT # 锁等待超时后失败,单位为毫秒 -?, --help # 显示此帮助,然后退出 # 控制输出内容的选项 -a, --data-only # 仅转储数据,不转储模式 -c, --clean # 清除(删除)数据库后再重新创建 -E, --encoding=ENCODING # 以编码ENCODING转储数据 -g, --globals-only # 仅转储全局对象,不包括数据库 -O, --no-owner # 跳过对象所有权的恢复 -r, --roles-only # 仅转储角色,不包括数据库或表空间 -s, --schema-only # 仅转储模式,不包括数据 -S, --superuser=NAME # 超级用户用户名,用于转储中 -t, --tablespaces-only # 仅转储表空间,不包括数据库或角色 -x, --no-privileges # 不转储权限(授予/撤销) --binary-upgrade # 仅供升级工具使用 --column-inserts # 将数据转储为带有列名的INSERT命令 --disable-dollar-quoting # 禁用美元符引用,使用SQL标准引用 --disable-triggers # 在仅数据恢复时禁用触发器 --exclude-database=PATTERN # 排除名称匹配PATTERN的数据库 --extra-float-digits=NUM # 覆盖默认的extra_float_digits设置 --if-exists # 删除对象时使用IF EXISTS --inserts # 将数据转储为INSERT命令,而非COPY命令 --load-via-partition-root # 通过根表加载分区 --no-comments # 不转储注释 --no-publications # 不转储发布 --no-role-passwords # 不转储角色密码 --no-security-labels # 不转储安全标签分配 --no-subscriptions # 不转储订阅 --no-sync # 不等待变更被安全地写入磁盘 --no-table-access-method # 不转储表访问方法 --no-tablespaces # 不转储表空间分配 --no-toast-compression # 不转储TOAST压缩方法 --no-unlogged-table-data # 不转储未登录表的数据 --on-conflict-do-nothing # 在INSERT命令中添加ON CONFLICT DO NOTHING --quote-all-identifiers # 引用所有标识符,即使它们不是关键字 --rows-per-insert=NROWS # 每个INSERT语句中的行数;隐含--inserts --use-set-session-authorization1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.
pg_dumpall使用示例
复制
#备份整个数据库以及角色 pg_dumpall -U postgres -h 127.0.0.1 -p 5432 -W -f alldb_backup.sql #备份所有数据库角色和全局对象 pg_dumpall -U postgres -h 127.0.0.1 -p 5432 -W --globals-only -f globals_backup.sql #仅备份角色 pg_dumpall -U postgres -h 127.0.0.1 -p 5432 -W --roles-only -f alldb_backup.sql #仅备份数据 pg_dumpall -U postgres -h 127.0.0.1 -p 5432 -W --data-only -f alldb_backup.sql #忽略某个库 pg_dumpall -U postgres -h 127.0.0.1 -p 5432 -W -f alldb_backup.sql --exclude-database=mydb > alldb_backup.sql #将数据转储为带有列名的INSERT命令 pg_dumpall -U postgres -h 127.0.0.1 -p 5432 -W --column-inserts -f alldb_backup.sql #将数据转储为INSERT命令 pg_dumpall -U postgres -h 127.0.0.1 -p 5432 -W --inserts -f alldb_backup.sql #备份压缩 pg_dumpall -U postgres -h 127.0.0.1 -p 5432 -w --inserts | gzip > alldb_backup.sql.gz1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.

三、pg_basebackup

pg_basebackup参数详解
复制
# 使用语法 pg_basebackup [OPTION]... # 控制输出的选项 -D, --pgdata=DIRECTORY # 将基线备份接收至指定目录 -F, --format=p|t # 输出格式(plain(默认),tar) -r, --max-rate=RATE # 设置数据目录传输的最大速率(单位为kB/s,或使用"k""M"后缀) -R, --write-recovery-conf # 写入用于复制的配置文件 -t, --target=TARGET[:DETAIL] # 备份目标(如果不同于客户端) -T, --tablespace-mapping=OLDDIR=NEWDIR # 将位于OLDDIR的表空间重定位至NEWDIR --waldir=WALDIR # 写前日志(WAL)目录的位置 -X, --wal-method=none|fetch|stream # 使用指定的方法包含所需的WAL文件 -z, --gzip # 压缩tar输出 -Z, --compress=[{client|server}-]METHOD[:DETAIL] # 按指定方式在客户端或服务器上进行压缩 -Z, --compress=none # 不压缩tar输出 # 通用选项 -c, --checkpoint=fast|spread # 设置快速或分散的检查点 -C, --create-slot # 创建复制槽 -l, --label=LABEL # 设置备份标签 -n, --no-clean # 出现错误后不清理 -N, --no-sync # 不等待更改被安全地写入磁盘 -P, --progress # 显示进度信息 -S, --slot=SLOTNAME # 使用的复制槽 -v, --verbose # 输出详细信息 -V, --version # 输出版本信息,然后退出 --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE # 使用算法进行清单校验和 --manifest-force-encode # 对清单中的所有文件名进行十六进制编码 --no-estimate-size # 不在服务器端估计备份大小 --no-manifest # 抑制生成备份清单 --no-slot # 阻止创建临时复制槽 --no-verify-checksums # 不验证校验和 -?, --help # 显示此帮助,然后退出 # 连接选项 -d, --dbname=CONNSTR # 连接字符串 -h, --host=HOSTNAME # 数据库服务器主机名或套接字目录 -p, --port=PORT # 数据库服务器端口号 -s, --status-interval=INTERVAL # 发送至服务器的状态包的时间间隔(单位为秒) -U, --username=NAME # 作为指定的数据库用户连接 -w, --no-password # 从不提示输入密码 -W, --password # 强制密码提示(应自动发生)1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.
pg_basebackup使用示例

普通文件:

复制
pg_basebackup -h 10.10.9.7 -U replication_user -p 5432 -Xs -v -Fp -P -r 100M -R -D /root/zz/1.

压缩:

复制
pg_basebackup -h 10.10.9.7 -U replication_user -p 5432 -Xs -v -Ft -P -r 100M -R -D /root/zz/1.

四、pg_restore

pg_restore参数详解
复制
# 使用语法 pg_restore [OPTION]... [FILE] # 通用选项 -d, --dbname=NAME # 连接到指定的数据库名 -f, --file=FILENAME # 输出文件名 (- 表示标准输出) -F, --format=c|d|t # 备份文件格式(通常应自动识别) -l, --list # 打印归档的TOC(目录)摘要 -v, --verbose # 详细模式 -V, --version # 输出版本信息,然后退出 -?, --help # 显示帮助信息,然后退出 # 控制恢复的选项 -a, --data-only # 只恢复数据,不恢复模式(schema) -c, --clean # 清理(删除)数据库对象之前重新创建 -C, --create # 创建目标数据库 -e, --exit-on-error # 出错时退出,默认是继续执行 -I, --index=NAME # 恢复指定名称的索引 -j, --jobs=NUM # 使用多个并行任务来恢复 -L, --use-list=FILENAME # 使用此文件中的TOC选择/排序输出 -n, --schema=NAME # 只恢复此模式(schema)中的对象 -N, --exclude-schema=NAME # 不恢复此模式(schema)中的对象 -O, --no-owner # 跳过对象所有权的恢复 -P, --function=NAME(args) # 恢复指定名称的函数 -s, --schema-only # 只恢复模式(schema),不恢复数据 -S, --superuser=NAME # 用于禁用触发器的超级用户名 -t, --table=NAME # 恢复指定名称的关系(表,视图等) -T, --trigger=NAME # 恢复指定名称的触发器 -x, --no-privileges # 跳过访问权限的恢复(grant/revoke) -1, --single-transaction # 作为一个单一的事务恢复 --disable-triggers # 在仅数据恢复期间禁用触发器 --enable-row-security # 启用行级安全性 --if-exists # 在删除对象时使用IF EXISTS --no-comments # 不恢复注释 --no-data-for-failed-tables # 不恢复未能创建的表的数据 --no-publications # 不恢复发布(publications) --no-security-labels # 不恢复安全标签 --no-subscriptions # 不恢复订阅 --no-table-access-method # 不恢复表访问方法 --no-tablespaces # 不恢复表空间分配 --section=SECTION # 恢复指定部分(pre-data, data, 或 post-data) --strict-names # 要求表和/或模式包含模式至少匹配每个实体 --use-set-session-authorization # 使用SET SESSION AUTHORIZATION命令而不是ALTER OWNER命令来设置所有权 # 连接选项 -h, --host=HOSTNAME # 数据库服务器主机名或套接字目录 -p, --port=PORT # 数据库服务器端口号 -U, --username=NAME # 以指定的数据库用户身份连接 -w, --no-password # 从不提示输入密码 -W, --password # 强制密码提示(应自动发生) --role=ROLENAME # 在恢复前执行SET ROLE # 注意事项 # -I, -n, -N, -P, -t, -T--section 选项可以组合并多次指定以选择多个对象。 # 如果没有提供输入文件名,则使用标准输入。1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.
pg_restore使用示例

1.恢复整个数据库

复制
pg_restore -U postgres -h 127.0.0.1 -p 5432 -W -d mydb db.dump1.

2.恢复到指定的数据库并使用不同的用户名

复制
pg_restore -U username -d new_database db.dump1.

3.恢复部分数据库对象

恢复指定表

复制
pg_restore -d new_database -t table_name db.dump1.

恢复的模式名

复制
pg_restore -d new_database -n schema_name db.dump1.

4.恢复时使用 --create 选项创建数据库

复制
pg_restore --create -d postgres db.dump1.

5.恢复到现有数据库,并使用并行恢复

复制
pg_restore -d new_database -j 4 db.dump1.

6.将恢复输出重定向到文件

复制
pg_restore -U postgres -h 127.0.0.1 -p 5432 -W --file=output.sql db.dump1.

7.只恢复数据,不恢复表结构

复制
pg_restore -U postgres -h 127.0.0.1 -p 5432 -W -d mydb --data-only -j 4 db.dump1.

8.报错时退出,默认继续执行

复制
pg_restore -d new_database -j 4 --exit-on-error db.dump 1.

9.不恢复此模式(schema)中的表

复制
pg_restore -d new_database -j 4 --exit-on-error --exclude-schema=NAME db.dump 1.

10.跳过权限的恢复

复制
pg_restore -d new_database -j 4 --exit-on-error --no-owner --no-privileges db.dump 1.

11.以事务方式导入

复制
pg_restore -U postgres -h 127.0.0.1 -p 5432 -W -d mydb --single-transaction db.dump1.

总结

根据备份的需求选择合适的工具。pg_dump 用于单个数据库的备份和恢复,pg_dumpall 用于整个集群的备份,pg_basebackup 用于物理备份。

备份策略:制定定期备份计划,并测试恢复过程,确保备份文件可用。安全:备份文件可能包含敏感数据,应妥善保管备份文件,并考虑使用加密。测试:定期测试备份文件的恢复,以确保在需要时能够正确恢复数据。性能:对于大型数据库,考虑使用流式备份或并行备份来提高备份和恢复的速度。权限:确保执行备份和恢复的用户具有适当的权限。

作者介绍

吴守阳,51CTO社区编辑,拥有8年DBA工作经验,熟练管理MySQL、Redis、MongoDB等开源数据库。精通性能优化、备份恢复和高可用性架构设计。善于故障排除和自动化运维,保障系统稳定可靠。具备良好的团队合作和沟通能力,致力于为企业提供高效可靠的数据库解决方案。

THE END
本站服务器由亿华云赞助提供-企业级高防云服务器