问题 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 中解释的, 而PG_WAL的数据并不是归档后就清理了. 另外在Checkpoint 前,系统也会腾出足够的空间来寄存新的PG_WAL的日志文件将现有的文件清理出去(应该是归档后的wal 文件),
2 数据库设置的逻辑复制,并且启动了逻辑复制槽 replication slot 的问题
PG 数据库中如果启动了逻辑复制槽的情况下, 或者启动复制槽的情况下,只有在从库获得PG_WAL的文件后,才有可能将数据从PG_WAL中进行清理,否则会一致增加PG_WAL文件,直到磁盘涨满,或者从库开始接收数据.
wal_level决定多少信息写入到 WAL 中。默认值是replica,它会写入足够的数据以支持WAL归档和复制,包括在后备服务器上运行只读查询。minimal会去掉除从崩溃或者立即关机中进行恢复所需的信息之外的所有记录。最后,logical会增加支持逻辑解码所需的信息。每个层次包括所有更低层次记录的信息。这个参数只能在服务器启动时设置。
复制槽分为物理复制槽physical replication slot和逻辑复制槽logic replication slot。
物理复制槽
物理复制槽一般结合流复制一起使用,能够很好的保证备库需要的日志不会在主库删除。
逻辑复制槽
Logic replication slots一般被用于逻辑异步复制,一个很好的应用是用于异构数据库之间的逻辑复制。
大致原理是将源端xlog进行解码,解析成具体sql,然后到目标端进行回放。
支持逻辑解码需要将wal_level设置成logic,logic会在replica的基础上增加一些信息以支持逻辑编码,该模式会增大wal日志的数量,尤其是大量的updata、delete操作的库。
原理
Replication Slot实质上是内存中的一些数据结构,加上持久化保存到pg_replslot/目录中的二进制状态文件。
在PG启动的时候,预先在共享内存中分配好这些数据结构所用内存(即一个大小为max_replication_slots的数组)。这些数据结构在用户创建replication slot时开始被使用。一个Replication Slot被创建并使用后,其数据结构和状态文件会被wal(write-ahed-log)的发送者(wal sender)进程更新。
replication slot有重新创建新的与从库的连接吗?
没有。Replication Slot还是使用了wal_sender原有连接(由于一个从库一个wal_sender连接,所以一个从库和主库之间也只有一个active的Replication Slot)。
注意事项:
1)如果收不到从库的reply,Replication Slot的状态restart lsn会保持不变,造成主库会一直保留本地日志,可能导致日志磁盘满。所以应该实时监控日志磁盘使用情况,并设置较小的wal_sender_timeout,及早发现从库断掉的情况。
2)将hot_standby_feedback设为on时,注意如果从库长时间有慢查询发生,可能导致发回到主库的xmin变化较慢,主库的vaccum操作停滞,造成主库被频繁更新的表大小暴增。
Postgresql 归档中的一些问题集中总结-腾讯云开发者社区-腾讯云
PostgreSQL 逻辑复制模块介绍 - 墨天轮
postgresql之replication slot_PostgreSQL运维技术的博客-CSDN博客