首页/数据/数据库速查/mysqldump 单库备份(-B 与不带 -B)
备份与恢复56 条

mysqldump 单库备份(-B 与不带 -B)

按库导出有两种模式:带 --databases 会写入建库与 USE 语句,适合跨实例迁移;不带则文件里没有 USE,恢复时必须手工指定目标库。

数据库速查数据更新于 2026-10-13

单库备份的两种模式

按库导出有两种模式,区别只在是否带上库名参数:带库名参数时文件里会包含建库语句与切换库语句,适合跨实例迁移;不带时文件里没有这些语句,恢复时必须手工指定目标库。还有一个容易踩的坑:带上库名参数后,后面所有参数都被当成库名;去掉它之后,只有第一个参数是库名,其余会被当作表名。

基本信息

带建库语句使用库名参数导出,文件含建库与切换库语句
不带建库语句直接指定库名导出,文件不含切换库语句
多库一次导出库名参数之后可跟多个库名
恢复差异不含切换库语句的文件必须在导入时指定目标库
适用场景前者用于跨实例迁移,后者用于同实例内导入

典型使用场景

  • 跨实例迁移整个库:用带建库语句的模式,导入时无需手工建库
  • 同实例内复制数据到另一个库:用不带建库语句的模式并指定目标库
  • 多库一起备份:一条命令导出多个库
  • 单表导出:把库名与表名一起给出
  • 结构留档:只导出结构用于比对变更

两种模式对比

两种模式对比
# 迁移用:文件内含建库与切换库语句
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   # 只导结构,用于比对变更

两种模式对照

项目带建库语句不带建库语句
命令形式库名参数加库名直接写库名
文件内容含建库与切换库语句没有切换库语句
参数解析后面所有参数都按库名解析只有第一个是库名,其余当表名
恢复方式可直接导入必须指定目标库
典型用途跨实例迁移同实例内的数据导入
典型报错多库导出误写表名会报对象不存在忘记指定库会报未选择数据库
带库名参数的导出里,参数之后的所有内容都按库名解析;去掉它以后只有第一个参数被当作库名,其余会被当作表名,这是报表不存在错误最常见的原因。
不带建库语句的备份文件直接导入而不指定库会报未选择数据库:恢复脚本务必显式写出目标库名。

单库备份检查清单

  • 确认目标场景:跨实例迁移还是同实例导入
  • 多库导出时逐个核对库名拼写
  • 导出后核对文件里的表数量是否符合预期
  • 导入前确认目标库已存在且字符集一致
  • 定期抽样恢复验证,确认备份可用
导出与导入的字符集参数要成对出现:导出时用了非默认字符集而导入时没带,中文与特殊字符最容易出问题,且往往到业务核对阶段才被发现。

易错点

  • 不带建库语句的备份直接导入:报未选择数据库,恢复脚本中断
  • 多库导出时把表名当成第二个库名写:报对象不存在,实际只导出了一个对象
  • 跨实例迁移用了不带建库语句的模式:目标实例没有对应库,导入直接失败
  • 导出后不核对内容:表数量或数据量异常偏少时无人发现,恢复时才发现备份不完整

数据来源与参考

  • MySQL 8.0 Reference Manual: mysqldump --databases

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌