--no-lock --safe-slave-backup \
--ftwrl-wait-timeout=600 --lock-wait-timeout=600 \
--kill-long-queries-type=all \
--kill-long-queries-timeout=600
上述参数组合中存在 无效配置 和 潜在冲突,具体分析如下:
1. --no-lock
与 --ftwrl-wait-timeout
/ --lock-wait-timeout
冲突
- 问题:
--no-lock
会完全禁用全局锁(FLUSH TABLES WITH READ LOCK
),但--ftwrl-wait-timeout
和--lock-wait-timeout
是控制锁等待行为的参数。如果已经禁用锁,这些超时参数将无效。 - 结论:
同时使用--no-lock
和--ftwrl-wait-timeout
/--lock-wait-timeout
是矛盾的,后者会被忽略。
2. --no-lock
与 --kill-long-queries-type
/ --kill-long-queries-timeout
冲突
- 问题:
--kill-long-queries-type
和--kill-long-queries-timeout
的作用是终止长时间运行的查询,以便顺利获取全局锁(FTWRL
)。但如果启用了--no-lock
,备份过程不会尝试获取锁,因此这些参数无意义。 - 结论:
在--no-lock
模式下,杀查询的参数无效。
3. --safe-slave-backup
的依赖关系
- 问题:
--safe-slave-backup
的作用是在备份从库时确保复制一致性,它会:- 停止 SQL 线程(避免备份期间复制冲突)。
- 仍然依赖
FTWRL
锁(除非同时指定--no-lock
)。
- 结论:
- 如果同时使用
--no-lock
,则--safe-slave-backup
仅停止 SQL 线程,但不会锁表(可能导致非 InnoDB 表不一致)。 - 如果目标是完全避免锁,建议改用
--slave-info
+--no-lock
,而非--safe-slave-backup
。
- 如果同时使用
有效参数组合建议
场景 1:允许短暂锁表(默认安全模式)
xtrabackup --backup \
--ftwrl-wait-timeout=600 \
--lock-wait-timeout=600 \
--kill-long-queries-type=all \
--kill-long-queries-timeout=600 \
--safe-slave-backup
- 适用于混合引擎(InnoDB + MyISAM)或需要强一致性。
- 会尝试获取全局锁,超时或杀查询。
场景 2:完全禁用锁(仅限纯 InnoDB 环境)
xtrabackup --backup \
--no-lock \
--slave-info
- 仅备份 InnoDB 表,不锁任何表。
--slave-info
记录复制位置(替代--safe-slave-backup
)。
场景 3:折中方案(Percona 特有)
xtrabackup --backup \
--lock-ddl \
--kill-long-queries-type=all \
--safe-slave-backup
--lock-ddl
仅阻塞 DDL 操作(比FTWRL
更轻量级)。- 需 Percona XtraBackup 2.4.6+ 支持。
总结
- 无效组合:
--no-lock
与锁/杀查询相关参数同时使用。 - 推荐做法:
- 如果数据库是纯 InnoDB,用
--no-lock
+--slave-info
。 - 如果含 MyISAM 表,需保留
FTWRL
相关参数,移除--no-lock
。 - 从库备份时,优先考虑
--slave-info
而非--safe-slave-backup
(除非明确需要停止 SQL 线程)。
- 如果数据库是纯 InnoDB,用