我总是有一些处于locking状态的表格。 一个例子:
| 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。
我知道你可能会build议:切换到InnoDB或优化代码。 不幸的是,这超出了我的范围。 我必须配合我的configuration。
所以,你的问题。 我如何定期刷新这样的查询? 我相信至less可以帮助防止服务器过载。
我已经尝试flush_time=300没有运气。 你需要my.cnf这里还是其他的configuration?
谢谢大家。
更新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 |
您可以使用Percona Toolkit( http://www.percona.com/software/percona-toolkit/ )中的pt-kill来终止符合指定条件的查询。 你可以设置一个cron作业,每300秒执行一次,执行pt-kill --busy-time 300来pt-kill --busy-time 300运行超过300秒的查询。