1

参考までに。これは答えを必要としません。

負荷の高い Postgres サーバーで作業していて、ハングする GRANT コマンドを発行しました。他のコマンドによってブロックされませんでした。開いている接続がいくつかあり、通常の pg_cancel_backend (SIGTERM) コマンドでいくつかのプロセスを強制終了できましたが、GRANT コマンドはそれにも pg_terminate_backend (SIGINT) にも応答しませんでした。最後に「kill -9 (pid)」(SIGKILL) を試みたところ、サーバーがクラッシュしました。

データベース サーバー プロセスまたはポストマスターに SIGKILL を発行すると、クラッシュが発生する可能性があります。これは十分に文書化されています。子プロセスに対して SIGKILL を実行すると、データベースがクラッシュする可能性もあります。

4

1 に答える 1

3

子プロセスに対して SIGKILL を実行すると、データベースがクラッシュする可能性もあります

SIGSEGVSIGABRT、などのクリーンアップの機会なしにバックエンドを終了させる致命的なシグナルはSIGKILL、共有メモリが破損している可能性があるとポストマスターに想定させます。すべてのトランザクションをロールバックし、実行中のすべてのバックエンドを終了して、再起動します。

PostgreSQL は、データを保護するためにこれを行います。バックエンドがクラッシュする前に何らかの問題が発生して共有メモリに落書きが発生した場合、shared_buffersディスクにフラッシュされて正常なページが置き換えられる無効なデータが含まれている可能性があります。

私はそれがドキュメントにあると確信していましたが、私が見つけることができるのは、あなたがサーバーをシャットダウンする際に言及していたと思うものだけです。

とにかく、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 ではメモリ オーバーコミットをオフにする必要があります。

私は自分のブログで、PostgreSQL ですべきこととすべきでないことについてのガイダンスを書きました。一見の価値あり。

于 2014-06-07T05:45:19.073 に答える