前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从零开始学PostgreSQL-工具篇: 备份与恢复

从零开始学PostgreSQL-工具篇: 备份与恢复

作者头像
DBA实战
修改2024-09-26 18:53:03
1020
修改2024-09-26 18:53:03
举报
文章被收录于专栏:DBA实战

概述

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

1. pg_dump

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

2. pg_restore

  • 概述:pg_restore 是一个用于从创建的备份文件恢复数据的工具。
  • 用途:恢复数据库。

3. pg_dumpall

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

4. pg_basebackup

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

pg_dump

pg_dump参数详解

代码语言:javascript
复制
# 通用选项
-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环境变量的值。

pg_dump使用示例

代码语言:javascript
复制
要将数据库转储到自定义格式的存档文件中,请执行以下操作:
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -Fc -d mydb  > db.dump

要将数据库转储到目录格式存档中,请执行以下操作:
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -Fd -d mydb -f dumpdir

要将数据库转储到目录格式存档中,同时执行 5 个工作线程作业:
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -Fd -d mydb -j 5 -f dumpdir

转储名为 :mytab
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -d mydb  > mytab.sql

转储以emp开头的所有表,排除名为 :empdetroitemployee_log集合
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -t 'detroit.emp*' -T detroit.employee_log mydb > db.sql

转储名称以 或 开头且以 结尾的所有集合,排除名称包含单词test :的集合
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W  -n 'west*gsm' -N '*test*' mydb > db.sql

同样,使用正则表达式表示法来合并开关:
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -n '(east|west)*gsm' -N '*test*' mydb > db.sql

转储除名称以ts_*开头的集合之外的所有集合
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -T 'ts_*' mydb > db.sql

转储具有混合大小写名称的单个表,您需要类似-t
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -t "\"MixedCaseName\"" mydb > mytab.sql

备份数据库结构(不包含数据)
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W --schema-only mydatabase > mydatabase_schema_only.sql

备份数据库数据(不包含结构)
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W --data-only mydatabase > mydatabase_schema_only.sql

备份多个特定表
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -t table1 -t table2 mydatabase > tables_backup.sql

备份数据库并压缩
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -d mydb | gzip > mydatabase_backup.sql.gz

备份并导出为 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.sql

pg_dumpall

pg_dumpall参数详解

代码语言:javascript
复制
# 使用语法
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-authorization

pg_dumpall使用示例

代码语言:javascript
复制
#备份整个数据库以及角色
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.gz

pg_basebackup

pg_basebackup参数详解

代码语言:javascript
复制
# 使用语法
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            # 强制密码提示(应自动发生)

pg_basebackup使用示例

代码语言:javascript
复制
普通文件:
pg_basebackup -h 10.10.9.7 -U replication_user -p 5432 -Xs -v -Fp -P -r 100M -R -D /root/zz/
压缩:
pg_basebackup -h 10.10.9.7 -U replication_user -p 5432 -Xs -v -Ft -P -r 100M -R -D /root/zz/

pg_restore

pg_restore参数详解

代码语言:javascript
复制
# 使用语法
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 选项可以组合并多次指定以选择多个对象。

# 如果没有提供输入文件名,则使用标准输入。

pg_restore使用示例

代码语言:javascript
复制
1: 恢复整个数据库
pg_restore -U postgres -h 127.0.0.1 -p 5432 -W -d mydb db.dump

2:恢复到指定的数据库并使用不同的用户名
pg_restore -U username -d new_database db.dump

3:恢复部分数据库对象
恢复指定表
pg_restore -d new_database -t table_name db.dump
恢复的模式名
pg_restore -d new_database -n schema_name db.dump

4:恢复时使用 --create 选项创建数据库
pg_restore --create -d postgres db.dump

5:恢复到现有数据库,并使用并行恢复
pg_restore -d new_database -j 4 db.dump

6:将恢复输出重定向到文件
pg_restore -U postgres -h 127.0.0.1 -p 5432 -W --file=output.sql db.dump

7:只恢复数据,不恢复表结构
pg_restore -U postgres -h 127.0.0.1 -p 5432 -W  -d mydb --data-only  -j 4  db.dump

8:报错时退出,默认继续执行
pg_restore -d new_database -j 4 --exit-on-error db.dump 

9:不恢复此模式(schema)中的表
pg_restore -d new_database -j 4 --exit-on-error --exclude-schema=NAME db.dump 

10:跳过权限的恢复
pg_restore -d new_database -j 4 --exit-on-error --no-owner --no-privileges db.dump 

11:以事务方式导入
pg_restore -U postgres -h 127.0.0.1 -p 5432 -W  -d mydb --single-transaction db.dump

总结

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

  • 备份策略:制定定期备份计划,并测试恢复过程,确保备份文件可用。
  • 安全:备份文件可能包含敏感数据,应妥善保管备份文件,并考虑使用加密。
  • 测试:定期测试备份文件的恢复,以确保在需要时能够正确恢复数据。
  • 性能:对于大型数据库,考虑使用流式备份或并行备份来提高备份和恢复的速度。
  • 权限:确保执行备份和恢复的用户具有适当的权限。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-09-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA实战 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档