postgresql15中的wal日志归档参数的改进
传统的wal日志归档archive_command
PostgreSQL15之前,使用传统的archive_command,传统的归档命令
archive_command = 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
传统的归档命令存在一系列问题,请参考Why PostgreSQL WAL Archival is Slow
PostgreSQL 15之后新的归档命令archive_library
相对于PostgreSQL 15之前的archive_command归档命令,在PostgreSQL15中提供了archive_library = 'basic_archive'这一参数;
相关配置参数如下
相关配置参数如下
# postgresql.conf
archive_mode = 'on'
archive_library = 'basic_archive'
basic_archive.archive_directory = '/path/to/archive/directory'
归档目录需要授权postgres用户相关的权限
chown -R postgres:postgres /path/to/archive/directory
chmod -R 775 /path/to/archive/directory
archive_library用于归档完整的WAL文件段的库,如果设置为空字符串(默认值),则启用通过shell进行归档,也即archive_command。
archive_command和archive_library不能共存,如果同时设置了archive_command和archive_library,则会引发错误。当此参数发生变化时,postmaster将重新启动WAL归档器进程。
basic_archive解决了什么问题
basic_archive模块所做的事情与archive_command中的shell命令几乎相同,其目的都是讲wal日志转移到预设值的归档路径,但是archive_library想对archive_command有一系列优势。
basic_archive在归档的过程中,会创建一个临时文件,并将其同步并持久地移动到目标中的最终归档文件副本。这种持久性是cp命令无法提供的。这大大减少了归档目标中损坏的文件导致归档失败的概率,有时甚至导致数据库可恢复性的可能性。
basic_archive的另一个重要功能优势是,当存在相同的文件时,它有一个内置特性来比较源文件(pg_wal)和存档目标文件。它比较文件的内容并验证它们是否完全相同,然后向归档器报告“成功”,以便归档器进程可以继续到下一个WAL段。
这也减少了归档失败的机会。因为如果文件被模块存档,但是服务器在记录它之前崩溃了,PostgreSQL将尝试再次存档相同的WAL段。如果文件被复制并且具有相同的内容,那么新的样例basic_archive模块将在第二次尝试中静默地成功。
此外,basic_archive模块有一个自定义异常处理程序。这允许归档器将ERROR视为正常故障,并避免再次重新启动归档器。
所以请使用archive_library替代archive_command来完成PostgreSQL的wal日志归档。