安全地杀死不响应KILL PROCESS的mySQL查询

时间:2014-04-14 02:46:58

标签: mysql

在MYISAM表上运行常规的OPTIMIZE TABLE查询通常需要几分钟,现在大约需要3天。这也发生在大约一周前,但它确实成功完成,我错误地认为表已经修好了,这次它不会出现问题。不是这样......

上次,该过程没有响应KILL PROCESS,我最终不得不重新启动mysqld。错误日志报告了警告,例如:

[Warning] /usr/sbin/mysqld: Forcing close of thread 24974085  user: 'XXXX'

当mysqld重新启动时,其他一些表已经损坏并且必须重建。其中一些表很大,我想再次避免这种情况发生。我知道重启mysqld应该可以安全地关闭表,但似乎没有。

使用mySQL服务器的Web服务将进入维护模式,以防止新查询到达数据库。但是,如果OPTIMIZE查询阻止了FLUSH TABLES,我怎么能安全地关闭所有打开的表呢?

SHOW OPEN TABLES;
[etc...]
114 rows in set (0.01 sec)

真的不希望114个表需要修复。有什么建议吗?

注意:我非常清楚正在优化的表会被破坏并且可以使用它。我只想尽量减少其他表的问题。

感谢。

更新:

所以FLUSH TABLES接受以逗号分隔的表格列表......也许它可以像刷新所有打开的表格一样简单,但我仍然愿意对此或任何其他想法保证。刷新特定的表会将其从打开的表列表中删除,因此看起来很有希望。

http://dev.mysql.com/doc/refman/5.1/en/flush.html

1 个答案:

答案 0 :(得分:0)

FWIW,这一切都非常顺利。接下来的步骤是这样的。我不确定是否分别冲洗和关闭每个工作台是否过度,但没有工作台崩溃,总停机时间约为45分钟,所以值得:

Make a full slave backup
Redirect FQDN for the master to a dead IP so all services are down and master receives no new queries
When master is receiving no new queries, flush and close all tables individually
Stop mysql on master
Ensure OPTIMIZE TABLE does not cause problems for slave if it is replicated out
Stop mysql on slave
Copy all blog tables from slave to master
Restart master
Restart slave
Check for any corrupt tables and allow them to be repaired
Map FQDN back to the master internal IP
Sanity check of posts on main blog
Restart replication on slave and masters 
Make sure replication progresses correctly (multi-master)
Make a full master backup