回答:
(トランザクションテーブルで)進行中のトランザクションはロールバックされるため、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を再起動します。初期化スクリプト(ローカルバリアントなどservice mysql.server restart
)を使用するかmysqladmin shutdown
、手動で再起動します。
つまり、MySQLをシャットダウンする前に考慮すべきベストプラクティスは次のとおりです。
mysql> STOP SLAVE;
ます。mysql> SET GLOBAL innodb_max_dirty_pages_pct = 0;
ます。mysql> SHOW PROCESSLIST;
するmysql> kill thread_id;
か、終了するまで待ちます。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をシャットダウンする前にこれらを確認してください。
innodb_fast_shutdown = 1
することで、MySQLがより速く起動することが本当に保証されますか?ドキュメントを見ると、これによりシャットダウン速度が向上するようです(起動速度を犠牲にしますか?)。