Postgres流式备份(6)备份和恢复

本文详细介绍使用Barman工具进行PostgreSQL数据库的备份与恢复流程,包括定时维护、全量备份、流复制状态检查、本地及远程恢复操作,以及如何处理特定错误。

备份

定时维护

定时维护,强制执行保留策略、WAL文件管理
Barman如通过rpm安装将自动添加定时配置文件/etc/cron.d/barman,内容如下,设置每分钟进行一次定时维护

# m h  dom mon dow   user     command
  * *    *   *   *   barman   [ -x /usr/bin/barman ] && /usr/bin/barman -q cron

全量备份

手动执行备份

# 备份133,133为配置的服务名称
barman backup 133

如果备份报错:WAL archive: FAILED (please make sure WAL shipping is setup)
在数据库上执行

select pg_switch_xlog() ; -- for 9.6 and earlier 
or
select pg_switch_wal() ; -- for 10

在barman上执行

# 执行维护,强制开始收取WAL
barman cron; 
# 检查是否可以开始备份
barman check 133;
# 开始备份
barman back_up 133;
# 备份所有服务
barman backup all

可以使用cron配置定时执行备份,修改/etc/cron.d/barman,添加全量定时备份

# m h  dom mon dow   user     command
  0 1    *   *   *   barman   [ -x /usr/bin/barman ] && /usr/bin/barman -q backup all
重新加载定时配置
systemctl reload crond

检查当前流复制状态

barman replication-status 133

恢复

查询已有备份

# 133为配置的服务名称
barman list-backup 133

返回结果例如

133 20190104T012032 - Fri Jan  4 01:20:39 2019 - Size: 48.6 MiB - WAL Size: 0 B
133 20190103T232839 - Thu Jan  3 23:28:42 2019 - Size: 48.5 MiB - WAL Size: 320.0 MiB

第二列为backup id,第四列为备份时间

本机还原

需要先安装与备份数据库相同版本的PostgreSQL

Barman需要对还原的目标文件夹具备权限

chown -R barman:barman /home/pg
chmod -R 700 /home/pg

恢复备份到指定时间点,可以大于当前时间,表示恢复到最新时间

su barman
barman recover --target-time "2019-01-04 01:07:30" 133 20190103T232839 /home/pg

Postgres对还原的目标文件夹具备权限

chown -R postgres:postgres /home/pg
chmod -R 700 /home/pg

修改服务器配置文件postgresql.conf,检查以下配置

  • listen_addresses:改为本机IP
  • port:改为本机端口
  • shared_buffers:改为本机合适的内存配置
  • shared_preload_libraries:选择本机已安装的插件

修改pg_hba.conf,设置合适的访问权限

检查Barman备份的streaming目录下是否有.partial后缀的文件,如果将该文件拷贝到恢复目录的pg_wal下,并删除.partial后缀

启动Postgres

查看Postgre日志,如出现以下内容,表示恢复到了指定的2019-01-04 01:07:30.563802+08时间点

2019-01-14 10:09:12 CST [30671]: [140-1] user=,db=,app=,client= LOG:  recovery stopping before commit of transaction 23584393, time 2019-01-04 01:07:30.563802+08
2019-01-14 10:09:12 CST [30671]: [141-1] user=,db=,app=,client= LOG:  recovery has paused
2019-01-14 10:09:12 CST [30671]: [142-1] user=,db=,app=,client= HINT:  Execute pg_wal_replay_resume() to continue.

此时数据库是只读的,可以打开数据库查看数据是否恢复正确

  1. 如果正确,使用超级管理员用户执行select pg_wal_replay_resume(),让数据库从只读变为可读写
  2. 如果不正确,停止数据库,修改恢复目标,再次重启恢复
    参考:https://www.postgresql.org/docs/current/recovery-target-settings.html

远程还原

还原目标服务器需要先安装与备份数据库相同版本的PostgreSQL

还原前需要先对被还原服务器做SSH免秘钥登录,否则还原将出错

恢复备份到指定时间点,可以大于当前时间,表示恢复到最新时间

barman recover --remote-ssh-command "ssh root@192.168.220.133" --target-time "2019-01-04 01:07:30" 133 20190103T232839 /home/pg

Postgres对还原的目标文件夹具备权限

chown -R postgres:postgres /home/pg
chmod -R 700 /home/pg

修改服务器配置文件postgresql.conf,检查以下配置

  • listen_addresses:改为本机IP
  • port:改为本机端口
  • shared_buffers:改为本机合适的内存配置
  • shared_preload_libraries:选择本机已安装的插件

修改pg_hba.conf,设置合适的访问权限

检查Barman备份的streaming目录下是否有.partial后缀的文件,如果将该文件拷贝到恢复目录的pg_wal下,并删除.partial后缀

启动Postgres

查看Postgre日志,如出现以下内容,表示恢复到了指定的2019-01-04 01:07:30.563802+08时间点

2019-01-14 10:09:12 CST [30671]: [140-1] user=,db=,app=,client= LOG:  recovery stopping before commit of transaction 23584393, time 2019-01-04 01:07:30.563802+08
2019-01-14 10:09:12 CST [30671]: [141-1] user=,db=,app=,client= LOG:  recovery has paused
2019-01-14 10:09:12 CST [30671]: [142-1] user=,db=,app=,client= HINT:  Execute pg_wal_replay_resume() to continue.

此时数据库是只读的,可以打开数据库查看数据是否恢复正确

  1. 如果正确,使用超级管理员用户执行select pg_wal_replay_resume(),让数据库从只读变为可读写
  2. 如果不正确,停止数据库,修改恢复目标,再次重启恢复
    参考:https://www.postgresql.org/docs/current/recovery-target-settings.html
<think>首先,用户查询是:“我想查找pgsql全量备份数据库的方法”,这翻译成“I want to find the method for full backup of PostgreSQL database”。 系统级指令要求: - 所有行内数学表达式使用$...$格式,但这里可能不涉及数学表达式。 - 独立公式使用$$...$$,但可能不需要。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在引用段落末尾添加引用标识,如[^1]。 用户可见层要求: - 回答结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 参考的站内引用: - [^1]: 提到MySQLPostgreSQL备份,但用户指定pgsql。 - [^2]: Postgresql 9.6.5文件级备份,全量备份,增量备份恢复。包括停止数据库、使用rsync备份数据、压缩等。 - [^3]: Postgresql16全量备份,增量备份与故障恢复。使用pg_basebackup进行全量备份。 - [^4]: 自动备份pgsql数据库,使用pg_dump进行模式备份。 - [^5]: Pgsql全量+增量迁移tidb7.5,但似乎不直接相关。 用户明确问pgsql全量备份数据库的方法,所以我需要聚焦于PostgreSQL。 关键方法从引用中: - 引用[2]:文件级全量备份,使用rsync或tar压缩数据目录。 - 引用[3]:使用pg_basebackup进行全量备份。 - 引用[4]:使用pg_dump进行逻辑备份。 我需要解释全量备份的方法: 1. **物理备份(文件级备份)**:直接复制数据库文件。需要确保数据库处于一致状态,可能需要停止数据库或使用归档模式。 - 例如,从引用[2]:停止数据库,然后使用rsync或tar备份数据目录。 2. **逻辑备份**:使用工具如pg_dump导出数据库为SQL文件。 - 例如,从引用[4],使用pg_dump命令。 引用[3]提到pg_basebackup,这是PostgreSQL的工具用于物理备份,支持流式复制。 所以,回答结构应该清晰: - 介绍全量备份。 - 解释两种主要方法:物理备份逻辑备份。 - 给出具体步骤命令,参考引用。 - 添加引用标识。 步骤: 1. 物理备份(文件级): - 停止数据库(可选,但确保一致性)。 - 备份数据目录(如/var/lib/postgresql/data)。 - 使用rsync或tar压缩。 - 从引用[2]。 2. 使用pg_basebackup: - 一个工具用于创建基础备份,支持热备份。 - 从引用[3]。 3. 逻辑备份使用pg_dump: - 导出数据库为SQL文件。 - 可以备份整个数据库或特定模式。 - 从引用[4]。 确保回答可靠:基于标准PostgreSQL文档实践。 生成相关问题: - 在末尾添加相关问题,如示例。 最终回答结构: - 简要介绍。 - 详细步骤。 - 代码块(如果需要)。 - 相关问题。 使用中文。 </think> ### PostgreSQL 全量备份数据库的方法 PostgreSQL(简称 pgsql)的全量备份是指备份整个数据库实例或特定数据库的所有数据,确保在故障时可以恢复。主要有两种方法:**物理备份(文件级备份)** **逻辑备份(SQL转储)**。物理备份直接复制数据文件,速度快、适合大规模数据,但需要处理数据库状态一致性;逻辑备份使用工具导出为SQL脚本,灵活、可移植,但可能较慢。以下是详细步骤,基于PostgreSQL官方文档最佳实践,确保真实可靠。 #### 1. **物理备份(文件级全量备份)** 物理备份直接复制数据库的数据目录(包含表、索引、事务日志等文件)。需确保备份时数据库处于一致状态,推荐在数据库停止或使用归档模式下操作。 - **步骤详解**: - **停止数据库(可选,确保一致性)**:如果允许停机,停止PostgreSQL服务以避免写入操作。 ```bash # 停止PostgreSQL服务(Linux示例) sudo systemctl stop postgresql ``` - **备份数据目录**:复制整个数据目录到备份位置。PostgreSQL默认数据目录通常为`/var/lib/postgresql/<version>/data`(Linux)或类似路径。 ```bash # 使用rsync备份数据目录(Linux示例) rsync -avz /var/lib/postgresql/16/data/* /backup/path/full_backup_$(date +%Y%m%d_%H%M%S) ``` - **压缩备份文件(可选)**:减少存储空间占用。 ```bash # 压缩备份目录 tar -zcvf /backup/path/full_backup_$(date +%Y%m%d_%H%M%S).tar.gz /backup/path/full_backup_* ``` - **重启数据库(如果停止)**: ```bash sudo systemctl start postgresql ``` - **热备份(不停机)方法**:使用PostgreSQL的连续归档(WAL归档)模式。启用`archive_mode = on`后,结合`pg_basebackup`工具创建基础备份。 ```bash # 使用pg_basebackup进行热备份(示例,适用于PostgreSQL 16) pg_basebackup -D /backup/path/full_backup -Ft -Xs -P -U postgres -h localhost ``` - `-D` 指定备份目录。 - `-Ft` 使用tar格式输出。 - `-Xs` 启用流式WAL传输(确保增量一致性)。 - 此方法无需停止数据库,适合生产环境[^2][^3]。 优点:备份速度快、支持增量恢复;缺点:需处理文件权限目录结构。 **适用场景**:大型数据库、高可用系统,需快速恢复。 #### 2. **逻辑备份(SQL转储全量备份)** 逻辑备份使用`pg_dump`或`pg_dumpall`工具导出数据库为SQL脚本,包含表结构、数据权限。 - **步骤详解**: - **备份单个数据库**:使用`pg_dump`导出指定数据库。 ```bash # 导出整个数据库(示例) pg_dump -h localhost -p 5432 -U postgres -d mydatabase -Fc -f /backup/path/full_backup_$(date +%Y%m%d).sql ``` - `-d` 指定数据库名。 - `-Fc` 使用自定义格式(压缩输出)。 - `-f` 指定输出文件。 - **备份所有数据库**:使用`pg_dumpall`备份整个实例(包括全局对象如角色)。 ```bash pg_dumpall -h localhost -p 5432 -U postgres -f /backup/path/all_databases_$(date +%Y%m%d).sql ``` - **仅备份结构(可选)**:使用`--schema-only`导出表结构。 ```bash pg_dump -h localhost -p 5432 -U postgres -d mydatabase --schema-only -f /backup/path/schema.sql ``` - **恢复备份**:使用`psql`执行SQL文件恢复。 ```bash psql -h localhost -p 5432 -U postgres -d newdb -f /backup/path/full_backup.sql ``` 优点:备份文件小、可跨版本迁移、支持选择性恢复;缺点:备份恢复较慢,尤其大数据量[^4]。 **适用场景**:中小型数据库、开发环境、数据迁移。 #### 最佳实践建议 - **备份频率**:全量备份建议每周一次,结合每日增量备份(如WAL归档)确保数据安全。 - **验证备份**:恢复测试确保备份有效性。 - **自动化**:使用cron或脚本定时备份(参考自动备份方法[^4])。 - **安全**:加密备份文件,避免存储敏感信息。 通过以上方法,您可以可靠地实现PostgreSQL全量备份。如需增量备份或高级配置(如PITR),请参考PostgreSQL官方文档。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值