今天,我把我们的生产服务器唤醒了。 不开心。
我们将问题定位于每日cronjob,即从生产数据库到远程服务器的完整mysqldump。
SQL命令很简单
mysqldump -u myuser -pmypassword mydatabase >outfile.sql
但是,login到mysqlpipe理控制台,并发出一个Show processlist; 命令显示如下:
statistics select clickthrough_rate, i1.token, length(title) as len, p.id as pid, i1.category_id, title, c.name 155250 root localhost mydatauser Query 32164 Locked insert into srch_logs (log_id, api_session_id, query, category_filter, clickthrough_item_id) values 155251 root localhost mydatauser Query 32163 Locked insert into srch_logs (log_id, api_session_id, query, category_filter, clickthrough_item_id) values 155254 root localhost mydatauser Query 32145 Locked insert into srch_logs (log_id, api_session_id, query, category_filter, clickthrough_item_id) values ...[a lot of these, then]... 155941 root localhost mydatauser Query 26147 Locked LOCK TABLES `api_asin_cache` READ /*!32311 LOCAL */,`api_auto_pricesets` READ /*!32311 LOCAL */,`api
srch_logs是一个普通的MyIsam表,只有大约300K条logging。
我目前最好的假设是,一个web请求同时发出来,同时做了mysqldump两个请求都僵持不下。 这可以发生吗?
运行mysqldump –lock-tables = false会永久性地解决这个问题吗?
感谢您的时间。
–lock-tables = false可能会阻止这种情况的发生,但是可能会导致形成不一致的备份。 这就是说,由于MyISAM没有被事务控制,所以不应该做太多的改变。
另一种select可能是使用不同的locking模型的不同的存储引擎(如InnoDB)。