仅供参考;这不需要答案。
我正在重负荷的Postgres服务器上工作,并发出挂起的GRANT命令。它没有被任何其他命令阻止。 我有一些打开的连接,并且能够使用正常的pg_cancel_backend(SIGTERM)命令杀死几个进程,但是我的GRANT命令没有响应那个或pg_terminate_backend(SIGINT)。我终于尝试了#34; kill -9(pid)" (SIGKILL)和服务器崩溃。
将SIGKILL发布到数据库服务器进程或postmaster可能会导致崩溃 - 这些都有详细记录。针对子进程运行SIGKILL可能也使数据库崩溃。
答案 0 :(得分:2)
针对子进程运行SIGKILL也会导致数据库崩溃
任何终止任何后端而无法清理的致命信号,例如SIGSEGV
,SIGABRT
,SIGKILL
等,都会导致邮件管理员认为共享内存可能是腐败。它将回滚所有事务,终止所有正在运行的后端,然后重新启动。
PostgreSQL可以保护您的数据。如果在后端崩溃导致它在共享内存上乱写之前出现问题,那么shared_buffers
可能包含无效数据,这些数据会被刷新到磁盘并替换好页面。
我很确定这是在文档中,但我能找到的就是我认为你在shutting down the server中提到的内容。
无论如何,如果你SIGKILL
后端,你会看到类似的内容:
WARNING: terminating connection because of crash of another server process
DETAIL: The postmaster has commanded this server process to roll back the
current transaction and exit, because another server process exited
abnormally and possibly corrupted shared memory.
HINT: In a moment you should be able to reconnect to the database and
repeat your command.
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
The connection to the server was lost. Attempting reset: Succeeded.
如果OOM杀手杀死了后端,也会发生这种情况,这就是为什么你应该关闭Linux上的内存过度使用。
我写了一些guidance on things to do and not to do with PostgreSQL on my blog。值得一看。