mysqlをシャットダウンする最も簡単な方法は、単に実行することです
mysqladmin -uroot -p -h127.0.0.1 --protocol=tcp shutdown
その理由は次のとおりです。
mysqlサービスファイル(/etc/init.d/mysql
)は、ソケットファイルの存在に依存しています。歴史的に言えば、MySQL 4.0に戻ると、ソケットファイルが不可解に消えることがあります。これは標準を妨げますservice mysql stop
が機能しなくなります。
言うだけでは十分ではありません
mysqladmin -uroot -p -h127.0.0.1 shutdown
mysqldは、TCP / IPが明示的に有効にされroot@127.0.0.1
ていroot@localhost
ない場合に着信するユーザーをルーティングするためです。デフォルトでは、mysqldは抵抗の最小パスを選択して接続root@127.0.0.1
しますroot@localhost
し、ソケットファイル介してます。それでも、ソケットファイルがない場合は、root@localhost
接続することはありません。
mysqladminのMySQLドキュメントでもように書かれています。
Unixソケットファイルを使用してローカルサーバーに接続するときにmysqladmin shutdownを実行すると、mysqladminはサーバーのプロセスIDファイルが削除されるまで待機し、サーバーが適切に停止したことを確認します。
そのため、TCP / IPを有効にすることが不可欠です。
mysqladmin -uroot -p -h127.0.0.1 --protocol=tcp shutdown
2011年9月30日に戻って、私は自分のバージョンのmysqld_multi
calledのスクリプトを作成しましたmysqlservice
(私のホスト:同じホストで複数のインスタンスを実行するを参照)。これは、異なるポートからmysqldに接続するための仮想エンジンとして機能します。my.cnf
カスタマイズされたパラメーターを使用して、独自のものを用意するだけです。そのスクリプトでは、次のようなシャットダウンを発行します。
stop() {
${ECHO} -n $"Stopping ${PROGNAME}"
${MYSQLD_STOP}
ATTEMPTS=0
STOPPING_MYSQLD=1
MINUTES_TO_TRY=10
(( TICKS_TO_TRY = MINUTES_TO_TRY*240 ))
while [ ${STOPPING_MYSQLD} -eq 1 ]
do
${ECHO} -n "."
${SLEEP} 0.25
MYSQLD_HAS_BEEN_SHUTDOWN=`${TAIL} ${MYSQL_ERROR_LOG} | ${GREP} -c "Shutdown complete$"`
(( ATTEMPTS++ ))
if [ ${ATTEMPTS} -eq ${TICKS_TO_TRY} ] ; then STOPPING_MYSQLD=0 ; fi
if [ ${MYSQLD_HAS_BEEN_SHUTDOWN} -eq 1 ] ; then STOPPING_MYSQLD=2 ; fi
done
${ECHO}
if [ ${STOPPING_MYSQLD} -eq 2 ]
then
${ECHO} "Stopped ${PROGNAME}"
else
${TAIL} -30 ${MYSQL_ERROR_LOG}
fi
}
しかし、何${MYSQLD_STOP}
ですか?
MYSQL_CONN="-uroot -p<rootpassword> -P${MYSQLD_PORT} -h127.0.0.1 --protocol=tcp"
MYSQLD_STOP="${MYSQLADMIN} ${MYSQL_CONN} shutdown"
私が使用していることに注意してください 127.0.0.1
している明示的なポートに。そうすれば、ソケットファイルに依存しません。
ハングしたmysqladmin --protocol=tcp shtudown
場合のmysqlのシャットダウンの適切な代替手段として常に使用していservice mysql stop
ます。やっkill -9
てmysqld
てmysqld_safe
最後のリゾートの最後の最後にする必要があります。(はい、最後の3回言った)。
多くの場合、mysqldは警告なしにmysql.sockを削除しました。他の人々も長年にわたってこの問題を抱えています:
エピローグ
その秘密は、私が述べたとおりです:mysqladminを使用してTCP / IP(--protocol=tcp
)およびissueを介してmysqlに接続しますshutdown
。これは、シャットダウン特権がmysql.user
認証されたシャットダウン専用の目的であるため、機能する必要があります。これにより、Linuxサーバーでmysqldをシャットダウンするときに、Windowsマシンからリモートシャットダウンを発行できたため、作業時間が数回節約されました。
更新2013-03-06 22:48 EST
シャットダウン中に何が起こっているのか心配な場合は、特にバッファープールに多くのInnoDBデータがある場合、シャットダウン時間とデータをディスクにフラッシュする方法を操作する方法があります。
提案#1
ダーティページが多い場合は、innodb_max_dirty_pages_pctを0に下げることができます。
SET GLOBAL innodb_max_dirty_pages_pct = 0;
これをシャットダウンの約15〜30分前に設定します。これにより、mysqldがディスクに書き込むダーティページの量が最小限になります。
提案#2
デフォルトでは、innodb_fast_shutdownは1です。このオプションには3つの値があります
- 0:InnoDBは、シャットダウン前に低速シャットダウン、完全パージ、および挿入バッファーマージを実行します。
- 1:InnoDBはシャットダウン時にこれらの操作をスキップします。これは高速シャットダウンと呼ばれるプロセスです。
- 2:InnoDBは、MySQLがクラッシュしたかのようにログをフラッシュし、コールドシャットダウンします。コミットされたトランザクションは失われませんが、クラッシュリカバリ操作により、次の起動に時間がかかります。
ドキュメントはさらにこれを言っています:
低速シャットダウンには数分かかる場合があり、大量のデータがまだバッファリングされている極端な場合には数時間かかることもあります。MySQLメジャーリリース間でアップグレードまたはダウングレードする前にスローシャットダウン手法を使用して、アップグレードプロセスでファイル形式が更新された場合にすべてのデータファイルが完全に準備されるようにします。
データが破損の危険にさらされている場合は、緊急またはトラブルシューティングの状況でinnodb_fast_shutdown = 2を使用して、絶対最速のシャットダウンを取得します。
innodb_max_dirty_pages_pctとinnodb_fast_shutdownのデフォルトは、ほとんどの場合で問題ありません。
tmpwatch
他のすべてのファイルと一緒に削除されるため、ソケットファイルは消え/tmp
ます。