Apache httpdのようなmysqlのグレースフルまたは安全な再起動はありますか?


29

再起動前にスレッドが提供されるhttpdと同様に、mysqlを正常に再起動したいと思います。クエリの破損は嫌いです。

回答:


37

(トランザクションテーブルで)進行中のトランザクションはロールバックされるため、MySQLの「リクエストされた」シャットダウンシーケンス(の略kill -9)はやや優雅ですが、ここではできる限りクリーンな再起動を行ういくつかの方法があります。

注:アップグレードのためにサーバーをシャットダウンする場合は、このプロセスを使用しないでください。代わりに、この回答に記載されているプロセスに従ってください。

それ以外の場合、正常なサーバーを再起動して、読み取り専用のグローバル変数などを変更できるようにする場合は、次のように適切なパスを作成します。

最初に、innodb_fast_shutdownまだ有効になっていない場合は有効にします。これはシャットダウンの優雅さに直接関係していませんが、サーバーを高速に戻す必要があります。

mysql> SHOW VARIABLES LIKE 'innodb_fast_shutdown';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| innodb_fast_shutdown | 0     |
+----------------------+-------+
1 row in set (0.00 sec)

mysql> SET GLOBAL innodb_fast_shutdown = 1;
Query OK, 0 rows affected (0.01 sec)

次に、現在実行中のクエリがそれらを参照していないとすぐに、開いているすべてのテーブルを閉じるようにサーバーに指示します。また、この手順は正常なシャットダウンとは関係ありませんが、後続の手順が高速になります。

mysql> FLUSH LOCAL TABLES;
Query OK, 0 rows affected (41.12 sec)

FLUSH TABLES(オプション付きの文LOCALいかなる奴隷の不必要なそれ以外は無害なフラッシュを回避するキーワードは、)をブロックし、すべてのテーブルを閉じることができるようになるまで、あなたの迅速な意志が戻りません。各テーブルが「フラッシュ」(クローズ)された後、クエリがその後そのテーブルを参照する場合、自動的に再度開かれますが、それは問題ありません。このステップで達成しているのは、最終ステップの作業量を減らすことです。

mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (13.74 sec)

mysql>

このステートメントは、すべてのテーブルをフラッシュし(そのため、前のステップで邪魔にならないようにするという利点がある)、テーブルのグローバル(サーバー全体)読み取り専用ロックを取得します。

現在実行中のすべての「書き込み」クエリ(つまり、ほとんどすべてを除くSELECT)が完了するまで、グローバル読み取りロックを設定することはできません。ロック要求を発行すると、既存のクエリは終了できますが、新しいクエリを開始することはできません。

このグローバルロック保持するまでプロンプトは返されないため、ロックをリクエストするときに進行中のすべてのクエリは終了でき、プロンプトが返されるため終了したことがわかります。任意のテーブルに何かを書き込もうとする後続のクエリは、データを変更せず、ロックを無期限に待機するだけで停止します...

  • 再起動について気が変わって、手動でロックを解除する(UNLOCK TABLES;
  • サーバーを再起動する、または
  • 誤ってまたは意図的にこのスレッドからコマンドラインクライアントを切断します(そうしないでください)。このウィンドウを接続したまま、mysqlプロンプトに座ってください。

これを閉じる誘惑に抵抗してください。

mysql>

このアイドルコンソールプロンプトは、グローバルロックを保持しているものです。これを失う、ロックを失います。

別のコンソールウィンドウから、通常の方法でMySQLを再起動します。初期化スクリプト(ローカルバリアントなどservice mysql.server restart)を使用するかmysqladmin shutdown、手動で再起動します。


使用innodb_fast_shutdown = 1することで、MySQLがより速く起動することが本当に保証されますか?ドキュメントを見ると、これによりシャットダウン速度が向上するようです(起動速度を犠牲にしますか?)。
クリス

@Chrisの考えは、シャットダウン+起動全体が実用的に迅速であることを保証するのに役立つということですが、実行される作業量は理論的に同じであるため、多少逸話的です-シーケンスの反対側に移動しただけです-何らかの理由で、通常は全体的に高速であるように見えます。たとえば、起動時とは異なり、シャットダウン時に発生する方法に何らかの非効率性があるようです。言いにくい。
マイケル-sqlbot

2

つまり、MySQLをシャットダウンする前に考慮すべきベストプラクティスは次のとおりです。

  1. 誤って別のインスタンスを停止しないように、シャットダウンするインスタンスを確認します。
  2. スレーブをシャットダウンする場合は、レプリケーションを停止しmysql> STOP SLAVE;ます。
  3. 事前にダーティページをフラッシュして、シャットダウン時間を短縮しmysql> SET GLOBAL innodb_max_dirty_pages_pct = 0;ます。
  4. 長時間実行されているクエリを確認し、それらを強制終了mysql> SHOW PROCESSLIST;するmysql> kill thread_id;か、終了するまで待ちます。
  5. シャットダウン時にバッファプールをダンプし、mysql> SET GLOBAL innodb_buffer_pool_dump_at_shutdown = ON;起動時# vi /etc/my.cnf innodb_buffer_pool_load_at_startup = ON にリロードし てバッファプールをウォームアップします。

その後、前のポイントを確認した後、MySQLを安全に再起動できます shell$ service mysql restart

詳細については、私の投稿を参照してください。MySQLをシャットダウンする前にこれらを確認してください。


なぜこれがダウン投票されたのですか?どのコマンドが悪いのかを認識するのに十分な知識はありませんが、それらを避けるために知りたいです。
ジョン

上記のどれもが悪いコマンドだとは知りません。私は上記の手順に従っているので、多くの人がそうしています。手順4のみに注意する必要があります。実行していることが確実になるまでクエリを強制終了しないでください。それを試してみて、それがあなたを助けたなら、それを賛成し、そうでなければ、それを反対しなさい!
モール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.