我最近在调试PostgreSQL 9.2数据库损坏问题(在Solaris上,但我怀疑它很重要),我发现如果客户端在事务中间死亡然后我关闭了PostgreSQL,我们可以可靠地重现它正在执行pkill postgres
(基本上将SIGTERM
发送到每个正在运行的postgres
进程)。相反,如果我们pkill -QUIT postgres
发送SIGQUIT
,数据库将会干净地关闭,不会发生损坏。
基于PostgreSQL 9.2 docs,我认为数据库服务器应该100%预期SIGTERM
,那么为什么这样关闭不安全?它是PostgreSQL中的一个错误,还是我可以做一些允许腐败发生的事情(配置等)?
答案 0 :(得分:0)
我认为sigterm不会导致你的问题。再次,建议您在dba.stackexchange上询问。
如果客户端在交易过程中死亡,那么问题是网络连接是否挂起?然后当你杀了它时你会在WAL重放期间腐败吗?
这是一个很难解决的问题,但这里有一些开始的地方:
你有可能遇到一个罕见的,晦涩难懂的PostgreSQL错误(可能介于db,kernel和filesystem之间),但如果是这样,请先升级到最新的9.2并尝试再次重现。术语甚至终止信号在PostgreSQL上应该是100%安全的,所以如果你看到数据库损坏,那是不可能的。