不是必须,但对innodb表强烈推荐;它通过一致性快照避免锁表,保障备份时业务写入不受影响,仅对事务型表生效,myisam仍会触发全局读锁。

mysqldump 备份时必须加 --single-transaction 吗?
不是必须,但对 InnoDB 表强烈推荐。它通过开启一致性快照避免锁表,备份过程中业务写入不受影响。不过它只对事务型表生效,MyISAM 仍会触发 FLUSH TABLES WITH READ LOCK,导致全局只读。
- 仅在数据库全为 InnoDB 且未显式使用
LOCK TABLES时才真正无锁 - 若备份中包含非事务表(如 MyISAM 或临时表),
--single-transaction会被自动忽略,转而尝试加全局读锁 - 搭配
--skip-lock-tables可禁用锁,但可能产生不一致备份——除非你确认所有表都支持 MVCC 且无 DDL 操作
恢复时遇到 ERROR 1046 (3D000): No database selected 怎么办?
这是最常见的导入失败原因:SQL 文件里没有 USE db_name;,或 mysql 命令行未指定目标库。
- 检查备份文件头是否含
CREATE DATABASE和USE语句;若无,需手动创建库再导入:mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
- 导入时务必指定库名:
mysql -u root -p mydb ,不能省略 <code>mydb</code>
- 若备份含多个库(
mysqldump --all-databases),必须用mysql -u root -p ,不能指定单个库名
为什么 mysqlpump 比 mysqldump 更适合大库?
mysqlpump 是 MySQL 5.7+ 提供的并行逻辑备份工具,核心优势在于可按表、按库并发导出,且默认启用压缩和进度反馈。
- 用
--default-parallelism=N控制线程数(默认为 2),N 过高反而因 I/O 竞争拖慢整体速度 - 不支持
--single-transaction的等价参数,但默认对每个表单独开启事务,一致性模型略有差异 - 无法备份系统库(如
mysql)中的部分表(如user),需额外用mysqldump单独处理 - 生成的 SQL 默认带
/*!40101 SET NAMES utf8mb4 */等兼容性提示,比mysqldump更健壮
物理备份(xtrabackup)和逻辑备份(mysqldump/mysqlpump)怎么选?
关键看 RTO(恢复时间目标)和 RPO(恢复点目标)要求。物理备份快但灵活性低,逻辑备份慢但可精确恢复单表或单行。
- 超大实例(>100GB)、RTO
- xtrabackup 备份时仍需停写(或至少确保无 DDL),且恢复后首次启动会重放 redo log,耗时不可控
- 逻辑备份文件可直接
grep查数据、用sed脱敏、甚至人工编辑修复损坏语句;物理备份是二进制,出错即整份报废 - 混合策略更稳妥:每周一次 xtrabackup 全备 + 每日
mysqldump --no-create-info增量导出变更表











