我有许多表一直处于锁定状态。例如:
| 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/) 来终止符合指定条件的查询。您可以设置一个 cron 作业,每 300 秒运行一次,以pt-kill --busy-time 300
终止运行时间超过 300 秒的查询。