PostgreSQL 归档是POSTGRESQL 运维中必须进行的一项工作,但对于归档的事情其实在我们运维的一段时间有很多的疑问,这里总结一些我们遇到的问题以及我们对归档的事情的一些理解。
Postgresql 的日志的大小是数据库初始化时进行设置的(PG12),如果不进行设置则日志的大小为16MB,部分企业会在使用的时候,将日志调整的稍大一些。但修改完毕后就不能在随便修改了。
Postgresql 数据归档一般我们还是使用POSTGRESQL 的中给出的命令,然后在挂接一块单独的归档盘目录,对日志数据进行归档.
archive_command = 'test ! -f /pgdata/archive/%f && cp %p /pgdata/archive/%f'
在配置完毕后,POSTGRESQL 的数据库就定期的对PG_WAL 文件定期的进行数据的归档了.那么这里会产生几个问题,我们来先提出,然后在寻找答案
问题 1 数据日志什么时候归档 ?
其实这个问题是比较需要明白的,到底日志在正常的情况下,什么时候才能归档, 到底条件是什么,要开启 postgresql 的日志的归档的前提条件,主要需要配置
1 wal_level = replica (或 logical)
2 archive_mode = on
3 archive_command = 'test ! -f /pgdata/archive/%f && cp %p /pgdata/archive/%f'
后日志就可以从原来的pg_wal 目录被定期的复制到对应的archive目录中了.
那么什么情况会将日志放入到归档的日志目录中
1 通过 select pg_switch_wal(); 命令来对日志进行分割后,触发archive 机制
2 日志文件写满预定的设计的大小后,触发归档
3 Archive_timeout 设置相关的归档的超时时间,在达到时间后,日志会被切割和进行归档
那这里就可以探讨一下,pg_wal的日志为什么有些公司会将其变大
1 繁忙的系统日志的增长的速度时很快的,而日志时顺序型的记录的,写满一个会在通过LINUX 系统在建立一个新的文件,并在向新的文件中写入数据,而频繁的建立文件,打开文件也是需要耗费资源的,所以将日志变大不失为一个方法.
2 Archive_timeout 设置超时时间的长短,在一个不繁忙的系统可能很长时间才能写满一个日志,而如果将归档超时设置的过于频繁会导致产生大量的空白的归档文件,所以如果要启用归档超时则需要考虑这个问题.
问题 2 PG_WAL 目录中的文件为什么不清理 ?
1 WAL segment files 中留多少文件依赖与 min_wal_size 和 max_wal_size 的配置以及checkpoint 点生成的日志的数量是有关的, 当老的segment 文件不再被需要的时候,日志文件会被删除和重新被利用.那么什么时候删除,这些文件, 当 PG_WAL 文件夹里面驻留的wal文件即将超过max_wal_size的情况下,会将不需要的segment 文件删除, 所以这里有一个问题容易让人误解.
系统清理PG_WAL的文件和归档并没有关系,归档是上面问题 1 中解释的, 而PG_WAL的数据并不是归档后就清理了. 另外在Checkpoint 前,系统也会腾出足够的空间来寄存新的PG_WAL的日志文件将现有的文件清理出去(应该是归档后的wal 文件),
2 数据库设置的逻辑复制,并且启动了逻辑复制槽 replication slot 的问题
PG 数据库中如果启动了逻辑复制槽的情况下, 或者启动复制槽的情况下,只有在从库获得PG_WAL的文件后,才有可能将数据从PG_WAL中进行清理,否则会一致增加PG_WAL文件,直到磁盘涨满,或者从库开始接收数据.
3 设置过大的wal_keep_segments 参数
PG是允许设置在PG_WAL中保留文件的数据量, 保证在复制的过程中,如果中断后,数据在续传的问题,但如果设置的wal_keep_segments, 保留的文件没有达到保留的数量,则不会删除文件.
问题 3 PG_WAL 日志中的.backup .history 是什么意思
在pg_wal 中会出现一些以.backup 文件为结尾的 或则以.history 为结尾的文件,这些文件主要的意义
- backup 文件
backup 文件是保存
2 .history 文件
history 文件是记录数据恢复时的记录恢复的时间轴,如果启用了归档的特性则此文件也会被归档.