首页/数据/数据库速查/mysqldump 建库语句控制(-n / -B)
备份与恢复56 条

mysqldump 建库语句控制(-n / -B)

-B(--databases)生成 CREATE DATABASE IF NOT EXISTS 与 USE;-n(--no-create-db)则抑制建库语句,用于恢复到指定库名或合并到已有库。

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

建库语句从哪来

mysqldump 是否输出建库语句取决于是否用了 -B:单库不带 -B 时,文件里既没有 CREATE DATABASE 也没有库上下文,恢复时必须由导入命令指定目标库。加了 -B(--databases)后会写出 CREATE DATABASE IF NOT EXISTS 与库切换语句,导出的文件自成一体,跨实例迁移最省事。--no-create-db(-n)用来抑制其中的建库语句。

基本信息

适用平台MySQL 5.7 / 8.0 的 mysqldump,MariaDB 的 mariadb-dump 同名选项
默认(单库)不带 -B 时不产生建库语句
-B / --databases输出建库语句与库上下文,导入可整包执行
-n / --no-create-db抑制 CREATE DATABASE 语句
-A / --all-databases同样产生建库语句,受 -n 影响
恢复指定库用 mysql -D 目标库,或先手动建库

典型使用场景

  • 跨实例迁移整库:用 -B 让脚本自动建库,导入命令最简
  • 恢复到改名后的库:用 -n 或导入时显式指定目标库,避免库名被文件写死
  • 把多个库导进同一实例时避免误建重复的库结构
  • 只导数据刷新已有回归库,不动库级设置
  • 自动化恢复脚本统一约定显式目标库,减少环境差异

常用组合

常用组合
# 带建库:跨实例迁移,目标端无需先建库
mysqldump -uroot -p --single-transaction --databases appdb > with_db.sql

# 不建库:恢复到已存在的同名库
mysqldump -uroot -p --databases -n appdb > no_create_db.sql

# 单库默认写法:文件里没有库上下文,恢复时显式指定
mysqldump -uroot -p --single-transaction appdb > plain.sql
mysql -uroot -p -D appdb < plain.sql

# 恢复前预建目标库,字符集显式指定
mysql -uroot -p -e "CREATE DATABASE IF NOT EXISTS appdb_new CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;"
mysql -uroot -p -D appdb_new < no_create_db.sql

组合行为对照

命令组合建库语句库上下文恢复方式
mysqldump db无无mysql -D db < f.sql
mysqldump --databases db有有mysql < f.sql
mysqldump --databases -n db无有先建库再导入
mysqldump --all-databases按库生成按库切换整实例恢复
mysqldump db 部分表无无导入前指定库
恢复前先确认目标端的库名、字符集与排序规则,这些在建库时就已经定了;用 -n 导出后导入时如果忘了预建库,会直接报数据库不存在而中断,自动化脚本要把建库步骤放在导入之前。

易错点

  • 带 -B 的文件里库名写死:想恢复到新库名却只改文件名,结果又导回原库覆盖线上数据
  • 用 -n 但目标库不存在:直接报 Unknown database 中断,脚本里必须预建库
  • 用 sed 批量替换 dump 里的库名:注释、字符串与二进制列都可能被误改,优先用 -n 加显式指定目标库
  • 跨版本恢复忽略字符集:目标库用错字符集会造成乱码且事后难修,建库时显式指定
  • 带 -B 恢复到已有同名库:建库语句用的是不报错的写法,旧库里残留的表会被保留,新旧数据混杂

数据来源与参考

  • MySQL 8.0 Reference Manual: mysqldump --no-create-db

相关工具

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