如何在mysqldump执行期间临时设置max_execution_time参数
问题场景
CI环境执行数据库schema变更前、本地开发场景执行数据库备份时,因部分表数据量过高,运行mysqldump抛出如下报错:
mysqldump: Error 3024: Query execution was interrupted, maximum statement execution time exceeded when dumping table
social_postat row: 24988140
排查确认:将max_execution_time参数值从600000(10分钟)调整为0(无限制)后备份可正常跑完,全量备份总耗时约1小时10分钟;此前测试15分钟、20分钟的超时阈值均无法覆盖备份耗时。出于安全考虑,不希望永久将该参数设为无限制,仅需在mysqldump执行周期内临时调整参数值,当前使用的mysqldump执行命令如下:
mysqldump --defaults-extra-file=login.cnf --set-gtid-purged=OFF --single-transaction --events --routines --no-create-info --no-create-db --skip-triggers --complete-insert --verbose --quick database_name > data.sql
实现方案
直接利用mysqldump自带的会话级参数设置能力即可,无需提前修改全局配置,也无需备份后手动回滚参数,配置仅在mysqldump的连接生命周期内生效,连接断开后自动恢复原有全局配置,完全满足临时调整、不永久修改参数的要求。
- 核心是给mysqldump加
--init-command参数,连接数据库后第一时间在当前会话设置超时参数,不会影响其他业务连接 - 若使用MySQL 8.0.28及以上版本,可额外搭配
--mysqld-long-query-time参数覆盖工具内部所有查询的超时限制,避免遗漏内置查询触发超时
调整后可直接使用的命令如下:
mysqldump --defaults-extra-file=login.cnf --set-gtid-purged=OFF --single-transaction --events --routines --no-create-info --no-create-db --skip-triggers --complete-insert --verbose --quick --init-command="SET SESSION max_execution_time=0" database_name > data.sql
注意事项
- 上述设置为会话级配置,仅对当前mysqldump发起的连接生效,不会修改数据库全局
max_execution_time值,其余业务连接、后续新建连接都会沿用原有超时阈值,不存在长期安全风险 - 原有命令携带的
--single-transaction参数配合该配置使用,备份全程不会锁表,不会对线上业务造成额外影响 - 若后续备份耗时稳定,也可将参数值从0替换为比实际备份耗时稍高的毫秒值(例如设为5400000即90分钟),进一步降低极端场景下异常查询长期占用资源的风险
内容的提问来源于stack exchange,提问作者Kay
相关产品推荐
相关产品推荐

