PG archive_command
简述
本地 shell 命令被执行来归档一个完成的 WAL 文件段。
该参数属于SIGHUP类型参数,修改完reload(重新加载配置文件)即可生效
Tips:archive_mode控制是否开启归档,修改该参数值需要重启数据库。可以通过设置archive_mode=on,使用archive_command单独控制归档,只需reload就可实现归档的开启或关闭
archive_command 只在成功时返回一个零作为退出状态
archive_command的常见值(前提:archive_mode=on):
| 值 | 描述 | 备注 |
|---|---|---|
| 空字符串 | WAL归档备临时禁用 | 默认 |
| true | /bin/true | Windows 上的REM | 禁用归档 | |
| SHELL 命令 | 按命令执行 | 当且仅当归档命令成功时,它才返回零退出。在得到一个零值结果之 后,PostgreSQL将假设该文件已经成功归档, 因此它稍后将被删除或者被新的数据覆盖。 但是一个非零值告诉PostgreSQL该文件没有被归档; 因此它会周期性的重试直到成功 |
如果归档命令不停失败:
因为有些情况要求操作者的干涉,或者是归档空间不够了。 例如,如果你往磁带机上写,但是 没有自动换带机,那么就有可能发生这种情况; 如果磁带满了,除非换磁带,否则任何 事也做不了。 你应该确保任何错误情况或者任何要求操作员干涉的情况都会被正确报告, 这样才能迅速解决这些问题。否则pg_wal/目录会不停地被WAL段文件填充,直到问题解决(如果包含pg_wal/的文件系统被填满,PostgreSQL将会做一次致命关闭。不会有未提 交事务被丢失,但是数据库将会保持离线直到你释放一部分空间)。
归档命令的速度并不要紧,只要它能跟上你的服务器生成 WAL 数据的平均速度即可。即使归档进程稍微落后,正常的操作也会继续进行。 如果归档进程慢很多,就会增加灾难发生的 时候丢失的数据量。这同时也意味着pg_wal/目录包含大量未归档的段文件, 并且可能最后超出了可用磁盘空间。
归档触发的条件
-
手动触发
- 10之前:
select pg_switch_xlog(); - 10及之后:
select pg_switch_wal();
- 10之前:
-
自动触发
-
WAL 日志写满后触发归档
相关参数:max_wal_size、min_wal_size、wal_keep_size(13版本之前是 wal_keep_segments)等
-
archive_timeout时间控制
当前 WAL 日志中仍有未归档的WAL,每
archive_timeout设置的值,会触发一次归档参考官方文档的建议:archive_timeout可以设置为1min。具体的最佳参数值还需根据业务来评估
-
碎碎念
1)WAL 文件的“状态”
-
正常状态下
24位的文件名
在了解另两种状态之前先了解下
archive_status:archive_status是wal段文件的备份目录,包括.ready和.done文件。可以被归档的wal日志会在archive_status目录内被打标,归档操作完成后被进一步移除
-
.ready- 可被归档.ready是同名wal段文件在archive_status目录内的标记文件,代表该wal段文件可被归档。wal段文件在数据目录中的存储文件数量是有上限的,一般通过wal_keep_segments参数(12及之前版本,12之后的参数为wal_keep_size)来约束,因此数据库引擎在wal段文件个数达到上限后会在archive_status目录内增加可移除的wal段文件的标记文件,文件名是原wal段文件名后增加.ready后缀,等待归档工具进行归档
-
.done- 已被归档.done是同名wal段文件在archive_status目录内的标记文件,代表该wal段文件已被归档,可以被清理。数据库引擎默认通过archive_command命令对.ready文件进行归档,归档成功与否取决于archive_command命令返回true还是false,当archive_command返回true时,代表与.ready文件同名的wal段文件已被归档,引擎再将该文件的扩展名重命名为.done,等待数据库引擎在下一次的checkpoint时进一步清理原wal段文件。
2)与 archive_dest 的“赛跑” (适用于openGauss/MogDB)
- archive_dest:用于归档WAL日志的目录
- 当archive_dest和archive_command同时配置时,WAL日志优先保存到archive_dest所设置的目录中,archive_command配置的命令不生效
3)小例子
archive_command = 'cp %p /mnt/server/archivedir/%f'
≈ 将 WAL段文件拷贝到 /mnt/server/archivedir/ 目录下
- %p - 要被归档的文件的路径名(路径名是相对于服务器的工作目录, 即集簇的数据目录)
- %f - 文件名
Tips:如果希望在归档处理中使用多个命令,明智的方法是使用一个独立的脚本文件。




