xlog(WAL)堆积类问题 本页介绍天翼云TeleDB数据库xlog(WAL)堆积类问题。 xlog(WAL)堆积问题总体排查思路 问题描述 xlog(WAL)堆积,明显超过预期大小,导致磁盘空间使用率上涨,甚至打满磁盘,影响实例运行。 可能影响 占用更多的磁盘空间; 可能会打满磁盘,影响实例运行。 解决步骤 1. 首先检查WAL和归档相关参数,核实参数是否符合预期; > 连接到WAL日志堆积的节点,执行以下SQL: > > select currentsetting('walkeepsegments') as walkeepsegments,(select count(1) > from pglsdir('./pgwal/')) as walcount; > WAL相关参数中,walkeepsegments为保留WAL日志文件的数量,通常实际统计的WAL日志文件数量比walkeepsegments稍多,相差几百内都属于正常范围,明显超出则确定WAL日志有堆积; 2. 检查WAL日志增长量是否符合预期; > 登录WAL日志堆积的节点所在服务器,进入pgwal目录,执行以下shell命令,按纬度统计WAL数量; > 统计每小时日志数量 > > ls lrt egrep [09AZ]{16}awk '{print $6" "$7" "$8}'awk F: '{print $1}'sort uniq c > 统计每天日志数量 > > ls lrt egrep [09AZ]{16}awk '{print $6" "$7}'awk F: '{print $1}'sort uniq c 3. 检查复制槽状态,是否有activefalse的复制槽; > 连接到WAL日志堆积的节点,执行以下SQL: > > select from pgreplicationslots where activefalse; > 如果有activefalse的复制槽,那么就会导致WAL堆积,需要核实并解决复制槽问题; 4. 如果不是复制槽问题,可以继续检查归档配置是否正确; > 连接到WAL日志堆积的节点,执行以下SQL: > > show archivestatuscontrol; > 如果参数查询结果为break,那么WAL日志文件不会被正常删除,需要核实并更正参数为continue; 5. 检查归档执行状态是否正常; > 登录WAL日志堆积的节点所在服务器,检查archiver进程状态是否正常,进程显示的last 归档的文件是否在更新。 > > ps fegrep archiver > 查询结果显示为archiver process failed on xxx,则说明归档败了,需要进一步排查归档失败原因; > 也可以执行以下SQL查询归档执行状: > > select from pgstatgetarchiver(); > 其中failedcount>0表示有归档失败。 6. 检查归档速度是否正常; > 如果归档正常,那需要检查归档速度是否正常,归档速度是否能赶上WAL日志生成的速度,如果归档速度比生成的慢,那么WAL日志会逐渐堆积起来,可以从减少WAL日志生成量和加快WAL日志文件归档两个方面入手进行优化; 7. 检查是否有长事务/长时间执行未结束的SQL; > 连接到WAL日志堆积的节点,执行以下SQL: > > select pid,clientaddr,statechange,querystart,statechange,EXTRACT(EPOCH FROM > (now()querystart)),query,state,usename,applicationname from pgstatactivity where > EXTRACT(EPOCH FROM (now()querystart))>600 and state!'idle'; > 如果有长时间执行未结束的SQL或事务,需要核实后清理掉,避免影响WAL日志文件的清理。 8. 如果影响业务,需要快速恢复,可以先手动清理,再定位原因; > 登录WAL日志堆积的节点所在服务器,进入pgwal/archivestatus目录,执行以下shell命令,修改.ready 的扩展名称.done > > find .ready sed 's/.ready$//' xargs I {} mv {}.ready {}.done > 或 > > ls lrt grep .ready awk F' ' '{print $NF}' xargs i rename ready done ./{} > 如果提示有太多的bash: /usr/bin/find: Argument list too long,则需要分批修改,具体前缀可以 top看一下 Arichve 进程当前在处理哪个WAL,然后取其前缀就行,例如: find 00000001000005[19].ready sed 's/.ready$//' xargs I {} mv {}.ready {}.done find 00000001000005[AF].ready sed 's/.ready$//' xargs I {} mv {}.ready {}.done