MySQLを適切に殺す方法は?


28

CPanelがインストールされたCentOS 64ビットを使用しています。

service mysql stop

周期を刻み続けるだけで、停止するようには見えません。ログには多くの情報が投稿されます。

130303 17:42:38 [Warning] /usr/sbin/mysqld: Forcing close of thread

err.log、ファイル、私はこれらの多くを参照してください。

[Warning] /usr/sbin/mysqld: Forcing close of thread

以前は瞬時でした。なぜそれを行うのか、どのように修正するのか?

今私はしなければなりませんkillall -9 mysqlが、より良い方法はありますか?

サーバーも非常にアクティブです。

これは設定の問題ですか?memroyの設定が高すぎますか?

[mysqld]
default-storage-engine=MyISAM
local-infile=0
symbolic-links=0
skip-networking
max_connections = 500
max_user_connections = 20
key_buffer = 512M
myisam_sort_buffer_size = 64M
join_buffer_size = 64M
read_buffer_size = 12M
sort_buffer_size = 12M
read_rnd_buffer_size = 12M
table_cache = 2048
thread_cache_size = 16K
wait_timeout = 30
connect_timeout = 15
tmp_table_size = 64M
max_heap_table_size = 64M
max_allowed_packet = 64M
max_connect_errors = 10
query_cache_limit = 1M
query_cache_size = 64M
query_cache_type = 1
low_priority_updates=1
concurrent_insert=ALWAYS
log-error=/var/log/mysql/error.log
tmpdir=/home/mysqltmp
myisam_repair_threads=4
[mysqld_safe]
open_files_limit = 8192
log-error=/var/log/mysql/error.log

[mysqldump]
quick
max_allowed_packet = 512M

[myisamchk]
key_buffer = 64M
sort_buffer = 64M
read_buffer = 16M
write_buffer = 16M

回答:


37

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接続することはありません。

mysqladminMySQLドキュメントでように書かれています。

Unixソケットファイルを使用してローカルサーバーに接続するときにmysqladmin shutdownを実行すると、mysqladminはサーバーのプロセスIDファイルが削除されるまで待機し、サーバーが適切に停止したことを確認します。

そのため、TCP / IPを有効にすることが不可欠です。

mysqladmin -uroot -p -h127.0.0.1 --protocol=tcp shutdown

2011年9月30日に戻って、私は自分のバージョンのmysqld_multicalledのスクリプトを作成しました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 -9mysqldmysqld_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のデフォルトは、ほとんどの場合で問題ありません。


2
Red Hatデリバティブでは、設定されたしきい値よりも古いatimeを持つtmpwatch他のすべてのファイルと一緒に削除されるため、ソケットファイルは消え/tmpます。
マイケル-sqlbot

@ Michael-sqlbotありがとう だから、MySQL ABの誰か(Oracleより前、Sunより前)が、mysql.userこのような頭痛を回避するためにSHUTDOWN特権を追加することを決めたのだと思います。
RolandoMySQLDBA

DebianまたはUbuntuではmysqladmin --defaults-file=/etc/mysql/debian.cnf shutdown...を使用します。このファイルには、ルートに似たMySQLアカウントの資格情報が含まれています。
0xC0000022L

いつものように、@ RolandoMySQLDBAはStack Exchangeサイトで最高のDBAリソースの1つです。ここでの素晴らしい仕事は、6年以上後に私を助けてくれました。
JakeGould

5

MySQLをシャットダウンする「方法」についての質問ではなく、なぜシャットダウンが遅いのかについての質問のようです。

同様の質問に対する私の答えは、私はスムーズな再起動、あなたはMySQLが開始することを要求した後に発生している活動の量減らすことで助けのためのいくつかの提案を提供してシャットダウンプロセスを

SHOW FULL PROCESSLIST;アイテム#1を頻繁に使用しない場合は、シャットダウンが非常に遅くなっているサーバーで何が起きているのかを把握する必要があるためです。中断しても安全な長時間実行されるクエリがある場合は、でそれらを強制終了できますKILL <thread-id>

他の提案の要約:

グローバル変数innodb_fast_shutdown = 1(デフォルト)を設定すると、InnoDBのシャットダウン部分が高速化されます。ただし、これは、アップグレードの実行とは無関係の理由でサーバーをシャットダウンする場合にのみ安全です。アップグレードのためにシャットダウンする場合は、これを0に設定する必要あります。

使用するとFLUSH TABLES;、開いているすべてのテーブルが正常に閉じられます。後続のクエリで参照された場合、それらは再び開かれますが、このアクションは、シャットダウンを要求してからシャットダウンが完了するまでの経過時間を最終的に短縮する必要があります。最後のステップのために...

FLUSH TABLES WITH READ LOCK;開いているすべてのテーブルを閉じ、現在のクライアント接続が所有する排他ロックを取得します。これにより、他の接続がサーバー全体のテーブルに書き込むことができなくなります。あなたは得ることはありませんmysql>あなたはこのロックを所有するまで、あなたがシャットダウン要求を発行することができ、その時点で、プロンプト背中を-しかし、このセッションから切断されません。

ビジー状態のサーバーでは、これらの手順によってサーバー上のアクティビティのレベルが低下し、物事がより静かになり、シャットダウンまたは再起動がよりスムーズになります。


2

MySQLは完全にロックアップされているわけではなく、シャットダウン時にクリーンアップアクティビティ(ロールバックなど)を実行している可能性があります。シャットダウン時にすべての処理を行わない場合、多くの場合、起動時に待機する必要があります。

注目すべき点は次のとおりです。別のターミナルウィンドウでエラーログ(tail -f [yourerror.log])を見ながら、1つのターミナルウィンドウでmysqlをシャットダウンします。エラーログには、MySQLの動作が表示されます。


1

あなたの経験について聞いてすみませんが、これに似た愚かなMySQLシナリオでの私の経験があなたの助けになることを願っています。

サーバーからMySQLサービスを強制終了する方法を理解しようとする代わりに、場合によっては、次の方法でシステムの状態をチェックして、サービスの乱用があるかどうかを判断する必要があります(仮定は、 CentOS / RHEL環境):

 /usr/bin/iostat
 /usr/bin/uptime
 top -c

以下を使用して、平均システム負荷とシステム内の最も消費量の多いリソースを特定します。

またmytop、システムによって処理されているSQLステートメントの全体像を取得するためにインストールする必要があります。

をインストールするmytopには、次を実行するだけです。

 cd /root
 wget http://jeremy.zawodny.com/mysql/mytop/mytop-1.6.tar.gz
 tar -zxvf /root/mytop-1.6.tar.gz
 cd /root/mytop-1.6
 perl Makefile.pl
 make
 make install
 chmod 644 /usr/local/bin/mytop
 vi /usr/local/bin/mytop 

(お好みのテキストエディターを使用してください)

検索"long|!" => \$config{long_nums}

それをコメントアウトし#"long|!" => \$config{long_nums}

chmod 555 /usr/local/bin/mytop

そして、あなたはmytop一緒に行くのは良いことです。これを使用して、MySQLサービスを占有しているMySQLステートメントを確認し、停止します。

上記の指示を実行すると、次の機能が提供されます。

  • サーバーの状態/健康状態の診断
  • ボトルネックの原因の診断

ボトルネックの原因を取り除いたら、MySQLサービスを再起動しようとする日がより簡単になります。上記の情報がお役に立てば幸いです。

注: mytop古く、メンテナンスされていません。おそらくinnotop最新のシステムで使用する必要があります。


0

MySQLのinit-scriptの標準実装は、SIGTERMでMySQLに信号を送り、MySQLがシャットダウンするまで一定の時間待機します。

MySQLは、SIGTERMを受信した後、最初に新しい接続の受信を停止し、まだ保留中のクエリの実行を完了し(ワークロードと同時クライアントの数に応じて時間がかかる場合があります)、ディスクへのデータのフラッシュを開始します(これには時間がかかることがあります)作業負荷、構成、利用可能なメモリ、ストレージエンジンの選択にもよりますが)すべてのデータフラッシュが完了すると、MySQLは初期化段階で割り当てたメモリの割り当てを解除し(MySQLによって割り当てられたメモリの量に応じて時間がかかる場合があります)、開いているすべてのファイルハンドルを閉じてから呼び出します「exit(0)」。

シャットダウンのリクエスト後、MySQLのシャットダウンに長い時間がかかっている場合、このステージの1つ以上が完了するのに長い時間がかかっている可能性があります。時間があれば、プロセスが完了するのを待つことを強くお勧めします(これにより、データベースインスタンスを再度起動するときに、データ損失や長い復旧プロセスを回避できます)。

残念ながら、あなたの質問には、あなたの問題に対する適切な解決策を提案するのに十分な情報がありません。これが問題の理解に役立つことを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.