单库备份的两种模式
按库导出有两种模式,区别只在是否带上库名参数:带库名参数时文件里会包含建库语句与切换库语句,适合跨实例迁移;不带时文件里没有这些语句,恢复时必须手工指定目标库。还有一个容易踩的坑:带上库名参数后,后面所有参数都被当成库名;去掉它之后,只有第一个参数是库名,其余会被当作表名。
基本信息
| 带建库语句 | 使用库名参数导出,文件含建库与切换库语句 |
|---|---|
| 不带建库语句 | 直接指定库名导出,文件不含切换库语句 |
| 多库一次导出 | 库名参数之后可跟多个库名 |
| 恢复差异 | 不含切换库语句的文件必须在导入时指定目标库 |
| 适用场景 | 前者用于跨实例迁移,后者用于同实例内导入 |
典型使用场景
- 跨实例迁移整个库:用带建库语句的模式,导入时无需手工建库
- 同实例内复制数据到另一个库:用不带建库语句的模式并指定目标库
- 多库一起备份:一条命令导出多个库
- 单表导出:把库名与表名一起给出
- 结构留档:只导出结构用于比对变更
两种模式对比
两种模式对比
# 迁移用:文件内含建库与切换库语句
mysqldump -uroot -p --databases appdb > appdb_full.sql
# 仅数据导入用:导入前目标库必须已存在
mysqldump -uroot -p appdb > appdb_nodb.sql
mysql -uroot -p appdb2 < appdb_nodb.sql # 恢复时手工指定目标库多库与单表
多库与单表
mysqldump -uroot -p --databases db1 db2 > two.sql # 多库一次导出
mysqldump -uroot -p appdb orders order_items > two_tables.sql # 只导出指定表
mysqldump -uroot -p --no-data appdb > appdb_schema.sql # 只导结构,用于比对变更两种模式对照
| 项目 | 带建库语句 | 不带建库语句 |
|---|---|---|
| 命令形式 | 库名参数加库名 | 直接写库名 |
| 文件内容 | 含建库与切换库语句 | 没有切换库语句 |
| 参数解析 | 后面所有参数都按库名解析 | 只有第一个是库名,其余当表名 |
| 恢复方式 | 可直接导入 | 必须指定目标库 |
| 典型用途 | 跨实例迁移 | 同实例内的数据导入 |
| 典型报错 | 多库导出误写表名会报对象不存在 | 忘记指定库会报未选择数据库 |
带库名参数的导出里,参数之后的所有内容都按库名解析;去掉它以后只有第一个参数被当作库名,其余会被当作表名,这是报表不存在错误最常见的原因。
不带建库语句的备份文件直接导入而不指定库会报未选择数据库:恢复脚本务必显式写出目标库名。
单库备份检查清单
- 确认目标场景:跨实例迁移还是同实例导入
- 多库导出时逐个核对库名拼写
- 导出后核对文件里的表数量是否符合预期
- 导入前确认目标库已存在且字符集一致
- 定期抽样恢复验证,确认备份可用
导出与导入的字符集参数要成对出现:导出时用了非默认字符集而导入时没带,中文与特殊字符最容易出问题,且往往到业务核对阶段才被发现。