2020-01-08
表不能手工清理回收死元组应用如何分析处理?

生产环境发现应用系统使用一段时间之后访问数据库比较慢,响应超过分钟级。初步发现调用的几个表占用空间很大,但却不能手工清理掉空间,只能重启解决。但问题依然会复现!
发现问答区都是oracle,提个PG问题- -
收藏
分享
5条回答
默认
最新
回答交流
Markdown
请输入正文
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~

生产环境发现应用系统使用一段时间之后访问数据库比较慢,响应超过分钟级。初步发现调用的几个表占用空间很大,但却不能手工清理掉空间,只能重启解决。但问题依然会复现!
发现问答区都是oracle,提个PG问题- -
查询pg_stat_activity发现有个查询语句的状态值为idle in in transaction,后得知原来应用程序每隔固定时间查询一次表,查询手动开启了事务但没有提交。
当前只要存在未提交的事务,表的清理自然不能成功,虽然没能通过不成功的详细信息得到答案。
9.6之后增加了一个空闲事务超时参数的设置,可以避免这个问题。
另外一个办法,是定时扫描超过一定时长的事务后发出报警,这个应该需要作为一个报警项目单独设置
old_snapshot_threshold可以防止数据库过度膨胀,但是业务操作完后建议及时提交事务;idle_in_transaction_session_timeout设置空闲事务超时时间也可以。
9.6开始参数idle_in_transaction_session_timeout是可以