这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战
一、流复制状态现象及检查
主备库执行 ps -ef | grep wal,查看不到流复制信息(主库查询不到sender进程,备库查询不到receiver进程),确定流复制断开。
二、查看备库日志
备库查看数据库日志有如下显示:
incorrect resource manager data checksum in record at xxx/xxxxxxxx
快速定位方法:cd ../log grep checksum * (日志目录全局搜索checksum)
通过上述内容基本可以判断是备库wal日志传输损坏导致了流复制中断。
三、暂时恢复流复制
1、找到checksum in record at 最早出现在日志的时间,将当天该节点及以后时间节点的归档wal日志和主库pg_wal目录的wal日志复制到备库的pg_wal目录中。
方法:
select pg_walfile_name_offset('xxx/xxxxxxxx')
这样就可以得到对应WAL日志的名称,到主库从pg_wal目录或者归档日志的目录中找这个日志及之后的WAL日志文件,通过scp等方式复制到备库的WAL目录中。
2、重启备库,pg_ctl restart。命令:ps -ef | grep wal查看流复制是否恢复。
注:1、pg10及以上版本是pg_wal目录,pg10以下是pg_xlog目录。
2、如果时间间隔过长,例如pg_wal目录或者归档日志的目录找不到查询出来的wal日志文件,这说明wal日志衔接不起来,也就是断档了,这样只能通过重做备库的方法来恢复流复制环境,断档只能重新做全量拷贝,别无他法。
四、问题的可能原因
通过分析,初步来看可能是由于操作系统的负载过高或者两台服务器之间的网络波动导致的一个小bug。
方法一、top命令查看cpu,内存负载情况
方法二、使用nmon脚本查看资源负载情况
如果负载过高,可以尝试对硬件进行升级,观察问题是否缓解。
也可以排查一下网络,是否有大量丢包现象。