Memo

メモ > サーバ > 各論: コマンド > 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/

Advertisement