一、问题描述
业务尝试更新数据时,发现sql执行失败,数据库变成只读状态。

二、问题分析及解决
1)检查磁盘使用情况,发现某个节点的/data1目录使用率打到98%

2)发现该节点的cn上的pgsql_tmp占了2T,相比其他节点差距较大

3)于是找到相应进程,杀掉进程后,空间立马释放

当查询要使用的内存超出work_mem的大小时(包括排序,DISTINCT,MERGE JOIN,HASH JOIN,笛卡尔积,哈希聚合,分组聚合,递归查询等操作),会使用临时文件来存储中间过程的数据。如果频繁的进行上述操作,临时文件将会快速增长,杀死对应pid执行的sql,或者重启后将清空所有临时文件,释放磁盘空间。
三、其他优化建议
1.对sql进行优化,避免产生大量临时文件
2.设置会话超时
eg:statement_timemout=1H ,自动杀死异常慢sql
3. 配置合理GUC参数
a).每个线程临时文件空间的限制,如果超过改值,查询将取消,默认无限制
#temp_file_limit = -1 # limits per-process temp file space # in kB, or -1 for no limit
b).当临时文件使用量大于设置阈值时,记录日志,默认不记录
#log_temp_files = -1 # log temporary files equal or larger than the specified size in kilobytes; -1 disables, 0 logs all temp files
c).当内存使用超过work_mem使用临时文件,设置合理work_mem大小
#work_mem (integer)
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




