用SIGTERM安全杀死postgres进程?

时间:2015-04-02 18:22:04

标签: postgresql signals postgresql-9.2

我最近在调试PostgreSQL 9.2数据库损坏问题(在Solaris上,但我怀疑它很重要),我发现如果客户端在事务中间死亡然后我关闭了PostgreSQL,我们可以可靠地重现它正在执行pkill postgres(基本上将SIGTERM发送到每个正在运行的postgres进程)。相反,如果我们pkill -QUIT postgres发送SIGQUIT,数据库将会干净地关闭,不会发生损坏。

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

1 个答案:

答案 0 :(得分:0)

我认为sigterm不会导致你的问题。再次,建议您在dba.stackexchange上询问。

如果客户端在交易过程中死亡,那么问题是网络连接是否挂起?然后当你杀了它时你会在WAL重放期间腐败吗?

这是一个很难解决的问题,但这里有一些开始的地方:

  1. 这种情况发生时会发生什么事?什么样的事务提交加载?
  2. WAL日志通常会多久轮换一次?
  3. 你有可能遇到一个罕见的,晦涩难懂的PostgreSQL错误(可能介于db,kernel和filesystem之间),但如果是这样,请先升级到最新的9.2并尝试再次重现。术语甚至终止信号在PostgreSQL上应该是100%安全的,所以如果你看到数据库损坏,那是不可能的。