建库语句从哪来
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 导出后导入时如果忘了预建库,会直接报数据库不存在而中断,自动化脚本要把建库步骤放在导入之前。