メモ > サーバ > 各論: コマンド > MySQLでプロセスを確認&強制終了
MySQLでプロセスを確認&強制終了
MYSQL障害解析の被疑箇所別 勘所 まとめ
http://www.hachim.jp/study-by-incident/mysql-unyo-viewpoint-2.html
MySQL プロセスを強制終了する
http://mysql.javarou.com/dat/000580.html
MySQLで処理に長時間かかっている複数クエリをまとめて殺す方法
http://tech.basicinc.jp/MySQL/2014/04/06/mysql_processlist_kill/
MySQLはシングルプロセスでマルチスレッドなので、topやpsでは1プロセスしか確認できない
$ top
3008 mysql 20 0 16.7g 7.4g 4748 S 16.9 47.0 1710:57 mysqld
1081 apache 20 0 452m 32m 7780 S 2.3 0.2 0:12.92 httpd
6524 apache 20 0 450m 30m 7744 S 1.0 0.2 0:11.13 httpd
14172 apache 20 0 448m 28m 7784 S 1.0 0.2 0:12.11 httpd
1352 root 20 0 0 0 0 S 0.3 0.0 21:55.68 kondemand/4
1516 root 39 19 0 0 0 S 0.3 0.0 301:43.94 kipmi0
$ ps aux --sort=-pcpu
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
mysql 3008 1.5 46.9 17528172 7719056 ? Sl 2015 1711:00 /usr/libexec/mysqld --defaults-file=/etc/my.cnf -
root 1724 0.2 0.3 797704 54604 ? Ssl 2015 582:05 /usr/sbin/eecd
bwave 17628 0.2 0.0 15300 1572 pts/0 S+ 10:17 0:32 top
apache 373 0.1 0.1 442372 22744 ? S 11:14 0:09 /usr/sbin/httpd -DSTATUS -f /etc/httpd/conf/httpd.
apache 820 0.1 0.1 461384 32292 ? S 10:05 0:15 /usr/sbin/httpd -DSTATUS -f /etc/httpd/conf/httpd.
apache 1081 0.1 0.2 463188 33328 ? S 10:05 0:12 /usr/sbin/httpd -DSTATUS -f /etc/httpd/conf/httpd.
スレッドの確認は、以下のようにmysqlコマンド内で SHOW PROCESSLIST を使う
KILL でスレッドの強制終了ができる
mysql> SHOW PROCESSLIST;
+----+------+----------------+--------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+----------------+--------+---------+------+-------+------------------+
| 9 | root | localhost:4049 | testdb | Sleep | 39 | | NULL |
| 13 | root | localhost:4451 | test | Query | 0 | NULL | SHOW PROCESSLIST |
+----+------+----------------+--------+---------+------+-------+------------------+
2 rows in set (0.00 sec)
mysql> KILL 9;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW PROCESSLIST;
+----+------+----------------+------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+----------------+------+---------+------+-------+------------------+
| 13 | root | localhost:4451 | test | Query | 0 | NULL | SHOW PROCESSLIST |
+----+------+----------------+------+---------+------+-------+------------------+
1 row in set (0.00 sec)
なお
mysql> SHOW PROCESSLIST;
の代わりに
mysql> SELECT * FROM information_schema.PROCESSLIST;
として一覧することもできる。この場合、
mysql> SELECT * FROM information_schema.PROCESSLIST WHERE TIME > 60;
このようにすれば、60秒より長く実行され続けているクエリを探すこともできる
(デッドロックが発生したときなど、長く処理されているものを強制終了させるときに使える)
上記の方法だと長いSQLが省略表示されてしまうが、
以下のように「\G」をつけると全文を確認できる
mysql> SHOW FULL PROCESSLIST \G;
*************************** 1. row ***************************
Id: 164233
User: webmaster
Host: 10.0.0.225:54468
db: NULL
Command: Query
Time: 0
State: starting
Info: SHOW FULL PROCESSLIST
*************************** 2. row ***************************
Id: 164473
User: webmaster
Host: 10.0.0.225:54812
db: test
Command: Execute
Time: 0
State: Sending data
Info: select * from `test` where `status` is null
*************************** 3. row ***************************
Id: 164703
User: webmaster
Host: 10.0.0.119:51828
db: test
Command: Sleep
Time: 198
State:
Info: NULL
*************************** 4. row ***************************
〜略〜
*************************** 10. row ***************************
Id: 164778
User: webmaster
Host: 10.0.0.119:51892
db: test
Command: Execute
Time: 0
State: Sending data
Info: select * from `test` where `status` is null
10 rows in set (0.00 sec)
ERROR:
No query specified
実行中のプロセスの一覧を表示する - MySQL 逆引きリファレンス
http://mysql.javarou.com/dat/000582.html
■RDS
※未検証
RDSでは「KILL 9;」ではエラーになり、「CALL mysql.rds_kill(9);」のようにする必要があるみたい
…だが、普通に「KILL 9;」でもKILLできるような…
Amazon RDS な MySQL で 不要 process を kill する - Garbage in, gospel out
http://libitte.hatenablog.jp/entry/20141202/1417452564
RDS上のMySQLでKILLは使えない | // sakura note
https://saku.io/cant-use-kill-on-rds-mysql/