MySQLdump 在 myisam 表上发生死锁?

MySQLdump 在 myisam 表上发生死锁?

今天我醒来发现我们的生产服务器瘫痪了。真不开心。

我们将问题归咎于一个每日的 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)。

相关内容