常にロック状態にあるテーブルがいくつかあります。例:
| 14442 | dbtable1 | localhost | dbname | Query | 1291 | Locked | SELECT * FROM table1 WHERE topic_s='hooks-and-variables' |
| 14443 | dbtable1 | localhost | | Sleep | 1291 | | |
| 14461 | dbtable1 | localhost | dbname | Query | 1283 | Locked | SELECT table3.forum_id, forum_name, forum_slug, table4.topic_id, topic_name, topic_slug |
このようなプロセスが多すぎると、すべてのサイトでデータベース接続エラーが発生し始め、再び動作させるには MySQL サーバーを再起動する必要があります。
私のデータベースには MyISAM エンジン、CentOS 5.7、WordPress、MySQL 5.1 を使用しています。
おそらく InnoDB に切り替えるか、コードを最適化することを提案されていると思いますが、残念ながらそれは私の範囲を超えています。現在の構成で作業する必要があります。
そこで質問です。このようなクエリを定期的にフラッシュするにはどうすればよいでしょうか? 少なくともサーバーの過負荷を防ぐのに役立つと思います。
試してみましたが、flush_time=300
うまくいきませんでした。ここには my.cnf が必要ですか、それとも他の設定が必要ですか?
皆さんありがとう。
更新 1. my.cnf
[mysqld]
default-character-set=utf8
max_connections=100
set-variable = long_query_time=10
query_cache_limit = 32M
query_cache_size = 128M
query_cache_type = 1
table_cache=8K
key_buffer_size=100M
thread_cache_size=128
join_buffer_size = 1M
innodb_buffer_pool_size = 100M
join_buffer_size=4M
tmp_table_size=32M
max_heap_table_size=32M
flush_time=200
更新 2. ロック前のプロセスリストの最初のクエリ
| Id | User | Host | db | Command | Time | State | Info
| 1515 | dbtable1 | localhost | dbname | Query | 2511 | Sending data | SELECT table1.forum_id, forum_slug, forum_name, forum_status, group_id, topic_count, forum_ic |
| 1571 | dbtable1 | localhost | dbname | Query | 2478 | Sending data | SELECT table1.forum_id, forum_slug, forum_name, forum_status, group_id, topic_count, forum_ic |
答え1
pt-kill
Percona Toolkit (から使用できます)http://www.percona.com/software/percona-toolkit/) を使用して、指定した条件に一致するクエリを強制終了します。300 秒ごとに実行される cron ジョブを設定して、pt-kill --busy-time 300
300 秒を超えて実行されるクエリを強制終了することもできます。