pg_basebackup
是从postgresql 9.1版本开始提供的一个方便基础备份的工具。
pg_basebackup
用于对正在运行的PostgreSQL数据库集群进行基本备份。备份是在不影响数据库的其他客户端的情况下进行的,并且可以用于时间点恢复和作为日志传送或流复制备用服务器的起点 。
pg_basebackup
不仅可以从主服务器也可以从备用服务器进行基本备份。要从备用数据库进行备份,请设置备用数据库以便它可以接受复制连接(即 setmax_wal_senders
和hot_standby
,并对其进行pg_hba.conf
适当配置)。您还需要在主节点上启用full_page_writes
。
a. 可以远程备份, 通过日志可以恢复到最新
b. 可以通过备库备份
c. 备份操作相关简单
a. 它只把整个数据库实例的数据都拷贝出来,而不只是把实例中的部分(如某个数据库或表)单独备份
b. 归档日志需要单独备份
c. 使用复制协议 REPLICATION权限或者是超级用户的用户 ID 建立连接,并且pg_hba.conf
必须允许复制连接。
d.服务器还必须配置max_wal_senders
设置得足够高,以提供至少一个用于备份的 walsender 和一个用于 WAL 流式传输(如果使用)。
e.如果在备份期间将备用数据库提升为主数据库,则备份将失败。
1)创建检查点,打开FPW (full_page_writes
) ,创建备份标签(存储检查点位置,时间等信息)
2)通过流复制协议与数据库建立连接,主库的WAL Sender进程向pg_basebackup
发送数据库物理文件
3)pg_basebackup
接收到文件后写入目标位置(压缩或不压缩)
[fbase@localhost ~]$ pg_basebackup --help
用法:
pg_basebackup [选项] ...
控制输出的选项:
-D, --pgdata=DIRECTORY 接收基本备份到目录
-F, --format=p|t 输出格式(plain(默认),tar)
-r, --max-rate=RATE 传输数据目录的最大传输速率(以 kB/s 为单位,或使用后缀“k”或“M”)
-R, --write-recovery-conf 用于复制的写入配置
-T, --tablespace-mapping=OLDDIR=NEWDIR 将 OLDDIR 中的表空间重定位到 NEWDIR
--waldir=WALDIR 预写日志目录的位置
-X, --wal-method=none|fetch|stream 包含指定方法所需的 WAL 文件
-z, --gzip 压缩 tar 输出
-Z, --compress=0-9 使用给定的压缩级别压缩 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 输出版本信息,然后退出
--no-slot 防止创建临时复制槽
--no-verify-checksums 不验证校验和
-?, --help 显示此帮助,然后退出
连接选项:
-d, --dbname=CONNSTR 连接字符串
-h, --host=HOSTNAME 数据库服务器主机或套接字目录
-p, --port=PORT 数据库服务器端口号
-s, --status-interval=状态包发送到服务器的间隔时间(以秒为单位)
-U, --username=NAME 以指定的数据库用户连接
-w, --no-password 从不提示输入密码
-W, --password 强制密码提示(应该自动
(1)开启归档
创建归档目录
mkdir -p /home/fbase/wal_Archive
chown -R fbase:fbase /home/fbase/wal_Archive
配置归档命令
vi $PGDATA/postgresql.conf
archive_mode = on
archive_command = 'mkdir -p /home/fbase/wal_Archive && cp %p /home/fbase/wal_Archive/%f'
archive_command = 'DATE=`date +%Y%m%d`; DIR="/home/fbase/wal_Archive/$DATE"; (test -d $DIR || mkdir -p $DIR) && cp %p $DIR/%f'
wal_level = replica #备注说明
注释:
%p 表示xlog文件名$PGDATA的相对路径, 如pg_xlog/00000001000000190000007D
%f 表示xlog文件名, 如00000001000000190000007D
备注:
wal_level:指定生成wal日志的级别,值为minmal,archive,hot_standby。
minmal一般的配置,archive会生成wal归档需要的日志记录,hot_standby添加备库时需要设置。
(2)重启并验证归档
checkpoint; # 解释checkpoint做了什么
select pg_switch_wal(); # 10g 以前用 select pg_switch_xlog();
[root@hgdb01 20180117]# pwd
/ssd/pg957/arch/20180117
[root@hgdb01 20180117]# ls
000000020000000000000003 000000020000000000000004
(3)创建replication权限的角色
创建replication权限的角色, 或者超级用户的角色。
create role repuser nosuperuser replication login connection limit 32 encrypted password '123456';
(4)配置pg_hba.conf
配置pg_hba.conf,添加以下内容
host replication repuser 0.0.0.0/0 md5
(5)执行备份
pg_basebackup -Ft -Pv -Xf -z -Z5 -p 8432 -D /home/postgres/backup/
#因为使用流复制协议, 所以支持异地备份
pg_ctl reload #执行加载配置的命令
mkdir `date +%F` ;
pg_basebackup -Ft -x -D /home/fbase/bak/`date +%F` -h 192.168.198.157 -p 8432 -U repuser
V12:
pg_basebackup -Ft -X s -D /home/fbase/bak/`date +%F` -h 192.168.198.157 -p 8432 -U repuser
V16.3
# 压缩
pg_basebackup -Ft -Pv -Xf -z -Z5 -p 8432 -D /home/fbase/backup/
#或者(若不压缩)下面是不压缩的命令
pg_basebackup -Fp -Xs -v -P -p 8432 -D /home/fbase/backup/
[fbase@localhost wal_Archive]$ pg_basebackup -Ft -Pv -Xf -z -Z5 -p 8432 -D /home/fbase/backup/
pg_basebackup: initiating base backup, waiting for checkpoint to complete
pg_basebackup: checkpoint completed
pg_basebackup: write-ahead log start point: 0/1C000028 on timeline 1
71261/71261 kB (100%), 1/1 tablespace
pg_basebackup: write-ahead log end point: 0/1C000138
pg_basebackup: syncing data to disk ...
pg_basebackup: renaming backup_manifest.tmp to backup_manifest
pg_basebackup: base backup completed
查看备份结果
V12:
[fbase@localhost 2024-07-29]$ ll ~/bak/2024-07-29/
total 71584
-rw-------. 1 fbase fbase 319563 Jul 29 22:48 backup_manifest
-rw-------. 1 fbase fbase 56194048 Jul 29 22:48 base.tar
-rw-------. 1 fbase fbase 16779264 Jul 29 22:48 pg_wal.tar
V16.3:
[fbase@localhost ~]$ ll ~/backup/
total 7708
-rw-------. 1 fbase fbase 319741 Jul 29 22:46 backup_manifest
-rw-------. 1 fbase fbase 7568144 Jul 29 22:46 base.tar.gz
[fbase@localhost ~]$ tar -tvf base.tar |less #查看备份包内容
(1)切换日志
在需要备份的库中创建标记表,并检查点和归档指令
create table t_flag(id int) ;
insert into t_flag values(1);
checkpoint; #刷新内存脏页到磁盘
select pg_switch_wal(); #手动日志归档
(2)删除原数据
V12:
停止数据库并删除数据目录,将pg_basebackup生成的备份包分别解压到相应目录
pg_ctl stop -D /data/fbase/fbdata
清空 data_bak 里的文件
rm -rf /data/fbase/fbdata/*
#解决备份文件到指定目录
tar -xvf base.tar -C /data/fbase/fbdata/
# 如果归档文件存在可以直接用归档文件
tar -xvf pg_wal.tar -C /data/fbase/fbdata
V16.3:
#上传base.tar.gz文件到postgres根目录下后,解压到指定目录中
tar -zxvf base.tar.gz -C /data/fbase/fbdata/
#拷贝recovery.conf.sample文件到当前目录下
touch /data/fbase/fbdata/recovery.signal
#修改文件权限
cd pgdata/
chmod 0600 recovery.signal
#编辑postgresql.auto.conf,添加如下一行
vim postgresql.auto.conf
restore_command = 'cp /home/fbase/wal_Archive/%f %p'
recovery_target = 'immediate'
(3)恢复参数
pg12以前
在PG12以前需要修改 recovery.conf文件配置还原参数
cp $PGHOME/share/recovery.conf.sample $PGHOME/recovery.conf
vi $PGDATA/recovery.conf #备注
#备注
restore_command = 'mkdir -p /home/fbase/wal_Archive && cp %p /home/fbase/wal_Archive/%f'
recovery_target_timeline = 'latest'
备注1:配置recovery_target_timeline参数, 便于判断是否已经到达还原点. (可选, 仅做PITR时需要.一般都是恢复到最新)
备注2:对路径 /ssd/pg957/arch/20180118/的解释
备注3:备份完成后recovery.conf文件名会自动修改为 recovery.done
pg12以后
从v12开始,针对此问题进行了改进,把recovery.conf中的参数合到了postgresql.conf配置文件中,但在非恢复模式这些参数将被忽略。
从PG12开始,recovery.conf文件不存在,由下面两个新文件进行替换:
recovery.signal:告诉PostgreSQL进入正常的归档恢复
standby.signal:告诉PostgreSQL进入standby模式
如果两个文件都存在,则standby.signal优先。
export PGDATA=/data/fbase/fbdata
# 告诉PostgreSQL进入正常的归档恢复
touch $PGDATA/recovery.signal
echo "
restore_command = 'mkdir -p /home/fbase/wal_Archive && cp %p /home/fbase/wal_Archive/%f'
recovery_target = 'immediate'
" >> $PGDATA/postgresql.auto.conf
(4)启动验证
启动数据库并做数据查看验证是否恢复完成
pg_ctl start -D /data/fbase/fbdata
(1)恢复目标
默认情况下,恢复将恢复到 WAL 日志的末尾即,备份那一刻的日志。即recovery_target默认为immediate。
以下参数可用于指定较早的停止点。最多可以使用recovery_target
, recovery_target_lsn
, recovery_target_name
, recovery_target_time
, or之一;recovery_target_xid
如果在配置文件中指定了其中一个以上,则会引发错误。这些参数只能在服务器启动时设置。
recovery_target = ’immediate’指定恢复应该在达到一个一致状态后尽快结束,即尽早结束。 在从一个在线备份中恢复时,这意味着备份结束的那个点。
recovery_target_name (string)指定恢复将继续进行的已命名的恢复点 (pg_create_restore_point()创建)。
recovery_target_time (timestamp)这个参数指定恢复将继续执行的时间戳。精确的停止点也受到recovery_target_inclusive的影响。
recovery_target_xid (string)指定恢复将继续执行的事务ID。
recovery_target_inclusive (boolean)指定我们是否在指定的恢复目标之后停止(true), 或者在恢复目标之前停止(false)。
recovery_target_timeline (string)指定恢复到一个特定的时间线中。默认值是沿着基础备份建立时的当前时间线恢复。
将这个参数设置为latest会恢复到该归档中能找到的最新的时间线, 这在一个后备服务器中有用。
recovery_target_action (enum) (boolean)指定当到达恢复目标时服务器应该采取什么动作。默认值是pause, 这意味着将暂停恢复。
promote意味着将结束恢复进程并且服务器开始接受连接。 shutdown将在到达恢复目标后停止服务器。
(2)示例
基于时间点注意事项:
归档日志完整
指定从归档目录万利 restore_command = ‘cp /u01/postgresql/arch/%f %p’
设置recovery_target_time