在实际生产中使用pg_basebackup工具进行全量备份的场景比较多,但是往往实际生产中数据库量级都比较大,此时再进行全量备份会消耗非常长的时间,几天、几周都有可能,此时我们就需要对现有的基础备份进行增量同步备份。
pg_receivewal — 以流的方式从一个PostgreSQL服务器得到预写式日志,相当于使用archive_command,产生一个归档日志,
1,但是不同的是pg_receivewal是使用流复制,并不需要等到日志段完成后再归档,
2,pg_receivewal可以跨服务器进行增量备份,大大增加了容灾性。
3,pg_receivewal可以使用复制槽,避免日志段归档后被移除的影响
-D directory
--directory=directory
要把输出写到哪个目录.
-E lsn
--endpos=lsn
当接收到达指定的LSN时,自动停止复制并且以正常退出状态0退出。如果有一个记录的LSN正好等于lsn,则该记录将会被处理。
--if-not-exists
当指定--create-slot并且具有指定名称的槽已经存在时不抛出错误。
-n
--no-loop
不要在连接错误上循环。碰到一个错误时立刻退出。
--no-sync
这个选项导致pg_receivewal不强制WAL数据被刷回磁盘。这样会更快,但是也意味着接下来的操作系统崩溃会让WAL段损坏。通常,这个选项对于测试有用,但不应该在对生产部署进行WAL归档时使用。这个选项与--synchronous冲突。
-s interval
--status-interval=interval
指定发送回服务器的状态包之间的秒数。这允许我们更容易地监控服务器的进度。 一个零值完全禁用这种周期性的状态更新,不过当服务器需要时还是会有一个更新 会被发送来避免超时导致的断开连接。默认值是 10 秒。
-S slotname
--slot=slotname
要求pg_receivewal使用一个已有的复制槽。在使用这个选项时, pg_receivewal将会报告给服务器一个刷写位置,指示每一个 段是何时被同步到磁盘的,这样服务器可以在不需要该段时移除它。
当pg_receivewal的复制客户端在服务器 上被配置为一个同步后备时,那么使用一个复制槽将会向服务器报告刷写 位置,但只在一个 WAL 文件被关闭时报告。因此,该配置将导致主服务器上的事务等待很长的时间并且无法令人满意地工作。要让这种配置工作 正确,还必须制定选项--synchronous(见下文)。
--synchronous
在 WAL 数据被收到后立即刷入到磁盘。还要在刷写后立即向服务器回送 一个状态包(不考虑--status-interval)。
如果pg_receivewal的复制客户端在服务器上被配置为一个同步后备,应该指定这个选项来确保向服务器发送及时的反馈。
-v
--verbose
启用冗长模式。
-Z level
--compress=level
启用预写式日志上的gzip压缩,并且指定压缩级别(0到9,0是不压缩而9是最大压缩)。所有的文件名后都将被追加后缀.gz。
为了控制物理复制槽,pg_receivewal 可以执行下列两种动作之一:
--create-slot
用--slot中指定的名称创建一个新的物理复制槽, 然后退出。
--drop-slot
删除--slot中指定的复制槽,然后退出。
下列命令行选项控制数据库连接参数。
-d connstr
--dbname=connstr
指定用于连接到服务器的参数,作为 连接字符串;这些将覆盖所有冲突的命令行选项。
为了和其他客户端应用一致,该选项被称为--dbname。但是因为pg_receivewal并不连接到集簇中的任何特定数据库,连接字符串中的数据库名将被忽略。
-h host
--host=host
指定运行服务器的机器的主机名。如果该值以一个斜线开始,它被用作 Unix 域套接字的目录。默认值取自PGHOST环境变量(如果设置),否则会尝试一个 Unix 域套接字连接。
-p port
--port=port
指定服务器正在监听连接的 TCP 端口或本地 Unix 域套接字文件扩展。默认用PGPORT环境变量中的值(如果设置),或者一个编译在程序中的默认值。
-U username
--username=username
要作为哪个用户连接。
-w
--no-password
从不发出一个口令提示。如果服务器要求口令认证并且没有其他方式提供口令(例如一个.pgpass文件),那儿连接尝试将失败。这个选项对于批处理任务和脚本有用,因为在其中没有一个用户来输入口令。
-W
--password
强制pg_receivewal在连接到一个数据库之前提示要求一个口令。
这个选项不是必不可少的,因为如果服务器要求口令认证,pg_receivewal将自动提示要求一个口令。但是,pg_receivewal将浪费一次连接尝试来发现服务器想要一个口令。在某些情况下值得用-W来避免额外的连接尝试。
运行端 | 10.0.0.200 |
备份端 | 10.0.0.199 |
pg_basebackup -Fp -P -v -D backup/ -h 10.0.0.200 -p 15432 -d dbname=postgres
--对运行库postgres进行备份,生成备份文档backup/
pg_verifybackup backup/ --效验备份文档的完整性
建议专槽专用,避免传输中断无法断点续传。默认创建的是物理复制槽
备注:pg_receivewal 可以远端创建复制槽(物理),也可以远端删掉复制槽(物理)。
pg_receivewal -n -v --synchronous --no-loop --if-not-exists --create-slot --slot=receivewal_slot -h 10.0.0.200 -p 15432 -U postgres -d dbname=postgres
/*创建receivewal_slot 复制槽*/
查看运行库的最新LSN使其成为增量备份的终结点LSN
在运行主库上查看归档日志中的最后一条LSN是多少
pg_waldump 00000001000000000000001F |tail -n 10
pg_receivewal -D backup/pg_wal/ -n -v --synchronous --no-loop --slot=receivewal_slot -E 0/1FFFFF88 -h 10.0.0.200 -p 15432 -U postgres -d dbname=postgres
注意 pg_receivewal 并不会从归档中读取日志 而是从$PGDATA/pg_wal 中去读取日志 如果你发现$PGDATA/pg_wal缺少了 备份的中间段日志 你此时需要重新复制日志段进入$PGDATA/pg_wal中去。主要由于max_wal_size 参数(默认是1GB)的控制 和checkpoint_timeout (默认是5min)参数控制,此时你需要将归档中日志cp到$PGDATA/pg_wal中去。
也可能是你复制槽创建在后归档之后。
此时开启复制槽进行流复制进行备份 当(crtl+c)进行终止时 备份结束
pg_receivewal -D backup/pg_wal/ -n -v --synchronous --no-loop --slot=receivewal_slot -h 10.0.0.200 -p 15432 -U postgres -d dbname=postgres