2015-04-02 81 views
0

最近,我在调试PostgreSQL 9.2数据库损坏问题(在Solaris上,但我怀疑它是否重要),并且我发现如果客户端在事务中间死亡,然后通过执行关闭PostgreSQL,我们可以可靠地重现它pkill postgres(它基本上发送SIGTERM到每个运行的postgres进程)。如果我们做了pkill -QUIT postgres来发送SIGQUIT,那么数据库会干净地关闭并且不会发生损坏。安全使用SIGTERM杀死postgres进程?

根据PostgreSQL 9.2 docs,我认为SIGTERM应该是数据库服务器预期的100%,那为什么不这样关闭呢?它是PostgreSQL中的一个错误,还是我可以做一些事情(配置等),这会让腐败发生?

+1

(1)这是一个更适合dba.stackexchange.com的问题; (2)什么是确切版本,9.2。什么? (3)你在谈论什么是“腐败”?什么错误,日志,症状等? (4)任何非安全选项,如禁用fync或full_page_writes? – MatheusOl 2015-04-04 14:16:44

回答

0

我不认为sigterm是什么导致您的问题。再次强烈建议您使用dba.stackexchange进行询问。

如果客户端在交易中途死亡,那么问题是网络连接挂起?然后当你杀死它时,你会在WAL重播期间遭受腐败?

这是一个复杂的领域来解决,但这里有一些地方开始:

  1. 这是怎么回事conncurrently当这种情况发生?什么样的事务提交加载?
  2. WAL日志通常会多久轮换一次?

这是可能的,你可以运行与PostgreSQL的一种罕见的,不起眼的错误(可能是某个地方的分贝,内核和文件系统之间),但如果是这样,请升级到最新的9.2开始,尝试再次重现。在PostgreSQL中,术语甚至杀死信号应该是100%安全的,所以如果你看到数据库损坏,那是不可预料的。