PostgreSQL从pg_basebackup恢复
1、使用pg_basebackup备份
pg_basebackup -h localhost -p 5432 -U postgres -D /home/dbbackup -Ft -z -P -Xs
# 会输出 backup_manifest base.tar.gz pg_wal.tar.gz 这些文件
-D 指定备份文件存放目录
-Ft 指定备份文件格式为tar
-z 启用备份文gzip压缩
-P 显示备份进度
-Xs 指定WAL日志文件同步的方式为stream,即同时以流式保存后续的WAL
2、恢复
A. 停止实例
sudo systemctl stop postgresql
B. 准备恢复用的文件
# 解压base.tar.gz,做为新的数据库data目录
# 解压pg_wal.tar.gz,稍后会在配置文件中指定
# 在base.tar.gz解压的目录里创建一个recovery.signal文件,PG会识别这个文件进入恢复模式
sudo touch /var/lib/postgresql/recovery.signal
# !!!确保2个目录的权限归属PostgreSQL
sudo chown -R postgres:postgres /var/lib/postgresql/data
sudo chmod -R 0700 /var/lib/postgresql/data
sudo chown -R postgres:postgres /var/lib/postgresql/wal
sudo chmod -R 0700 /var/lib/postgresql/wal
C. 调整配置文件
vim /etc/postgresql/15/main/postgresql.conf
# 配置 data_directory = '/var/lib/postgresql/data'
# 配置 restore_command = 'cp /var/lib/postgresql/wal/%f %p'
# 配置 recovery_target = 'immediate'
D. 开始恢复
# 启动PG
sudo systemctl start postgresql
tail -f /var/log/postgresql/postgresql-15-main.log
# 查看日志会有类似这样的输出:
# starting backup recovery ...
# 恢复完成后:
# database system is ready to accept connections
3、检查数据并修改数据库为可写状态
恢复后数据库处于只读状态,使用原数据库用户密码登录检查数据是否完整,然后设置为可写。
pg_ctl promote -D /var/lib/postgresql/data
# 如果pg_ctl命令找不到,到/usr/lib/postgresql/15/bin/目录找找看,有的话使用完整路径
tail -f /var/log/postgresql/postgresql-15-main.log
# 查看日志会有类似这样的输出:
# received promote request
# 完成后:
# database system is ready to accept connections