今天我醒来发现我们的生产服务器瘫痪了。真不开心。
我们将问题归咎于一个每日的 cronjob,它从生产数据库执行完整的 mysqldump 到远程服务器。
SQL 命令很简单
mysqldump -u myuser -pmypassword mydatabase >outfile.sql
但是,登录到 mysql 管理控制台并发出 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 条记录。
我目前最好的假设是,执行 mysqldump 时同时发出的 Web 请求使两个请求都陷入死锁。会发生这种情况吗?
使用 --lock-tables=false 运行 mysqldump 是否可以永久解决此问题?
感谢您的时间。
答案1
--lock-tables=false 可能会阻止这种情况发生,但可能会导致形成不一致的备份。也就是说,由于 MyISAM 不受事务控制,因此它不会造成太大影响。
另一种选择可能是使用使用不同锁定模型的不同存储引擎(例如 InnoDB)。