--single-transaction 对 InnoDB 表备份至关重要,可避免锁表但需确保无长事务;MyISAM 仍会锁表,混用引擎建议统一为 InnoDB;导出需加 --routines --triggers --events 才完整;恢复时报错“No database selected”常因未指定数据库或 SQL 文件缺少 USE 语句。

mysqldump 备份时加不加 --single-transaction 很关键
如果你的表是 InnoDB,又不想锁表导致业务中断,--single-transaction 几乎是必须的。它通过启动一个一致性快照来避免全局读锁,但前提是备份期间不能有长事务——否则可能拉长 MVCC 快照,拖慢其他查询。
常见错误现象:mysqldump 执行时业务明显变慢,或者备份文件里部分表数据“看起来旧了一点”。
- 只对 InnoDB 有效,MyISAM 表仍会触发
FLUSH TABLES WITH READ LOCK - 若库中混用引擎,建议统一为 InnoDB,或改用
--lock-tables=false+--skip-lock-tables(但风险更高) - 搭配
--routines --triggers --events才能完整导出存储过程、触发器和事件
恢复时遇到 ERROR 1046 (3D000): No database selected
这是最常被忽略的路径问题:你用 mysqldump 导出的是“带 USE `db_name`” 的 SQL 文件,但直接 mysql 时,如果命令行没指定库名,MySQL 就不知道该往哪写。
正确做法分两种场景:
- 全库备份(含
CREATE DATABASE):先确保目标实例没有同名库,再执行mysql -u root -p - 单库备份(不含建库语句):必须显式指定库名,例如
mysql -u root -p myapp_db - 如果 SQL 文件里有多个库,且你只想恢复其中一个,用
sed -n '/^USE `target_db`/,/^USE `/p' backup.sql | mysql -u root -p过滤更安全
用 mysqlpump 替代 mysqldump 的真实收益
mysqlpump 是 MySQL 5.7+ 官方推出的并行逻辑备份工具,不是“更炫的新版”,而是解决特定瓶颈的:它支持按表/库并发导出,还能跳过某些对象(比如大日志表),但默认不兼容 MySQL 5.6 及更早版本。
性能差异明显体现在大库上:
-
mysqlpump --parallel-schemas=4 mydb可让 4 个 schema 并发导出,而mysqldump是单线程 - 它默认启用
--skip-definer,避免恢复时报Access denied for user ''@''权限错误 - 不支持
--single-transaction的等价参数,InnoDB 表仍靠事务快照,但并发粒度在表级,要注意大表阻塞小表进度
物理备份(xtrabackup)和逻辑备份别混着用
用 xtrabackup 做全量物理备份后,千万别拿 mysqldump 的 SQL 去“恢复到同一个数据目录”——物理备份恢复的是二进制数据文件,逻辑备份恢复的是 SQL 重放,二者路径、权限、校验方式完全不同。
典型翻车点:
- 用
xtrabackup --copy-back恢复后忘记chown -R mysql:mysql /var/lib/mysql,导致 mysqld 启不起来 - 误把
mysqldump输出的INSERT语句当成 xtrabackup 的--incremental-dir增量包来应用 - 物理备份恢复后未运行
mysql_upgrade(尤其跨大版本升级时),系统表结构不一致,后续权限操作失败
备份策略定下来之后,恢复路径就得严格对应;临时换工具救急,反而最容易漏掉权限、字符集、GTID 状态这些隐形依赖。

















