mysqldump 必须加 --databases(双短横)才输出 CREATE DATABASE 语句;--database(单短横)易误用且不校验参数,导出单库应使用 mysqldump --databases mydb > dump.sql,并确保账号有 SHOW DATABASES 权限。
--databases 或 --database 才会输出 CREATE DATABASE
默认用 mysqldump db_name 导出,只会生成表结构和数据,不带 create database 语句——哪怕目标库存在,导出文件里也完全没这行。想让 sql 文件开头包含 create database `xxx` 和 use `xxx`,必须显式告诉 mysqldump:这是“数据库级”导出,不是“单库内表级”导出。
实操建议:
CREATE DATABASE:用 mysqldump --databases mydb > dump.sql(注意 --databases 后面跟库名,不是 -B mydb 的简写形式也能用,但语义更清晰)mysqldump --databases db1 db2 > dump.sql,会为每个库分别加 CREATE DATABASE 和 USE
--database(单短横)会失败:它只接受一个参数且行为不同,实际等价于 --databases 但不校验参数个数,容易静默漏掉后续库名--databases 会自动加反引号包裹,安全;手动拼 CREATE DATABASE 容易漏转义SHOW DATABASES 权限mysqldump --databases 要先查 INFORMATION_SCHEMA.SCHEMATA 获取库的字符集、排序规则等元信息,用于生成带 CHARACTER SET 和 COLLATE 的 CREATE DATABASE 语句。没权限就会报错:Access denied; you need (at least one of) the SUPER, SHOW DATABASES privilege(s) for this operation。
实操建议:
SHOW DATABASES 权限(GRANT SHOW DATABASES ON *.* TO 'user'@'host')SELECT 权限绕过:即使对目标库有全部权限,缺 SHOW DATABASES 仍会失败--create-options 和 --no-create-db 会影响最终输出CREATE DATABASE 语句是否出现,不仅取决于是否用 --databases,还受其他开关干扰。比如 --no-create-db 会强制删掉所有 CREATE DATABASE 行,哪怕你用了 --databases 也白搭。
实操建议:
--no-create-db 和 --databases——前者优先级更高,直接屏蔽数据库创建逻辑--create-options 控制的是 CREATE TABLE 里的额外属性(如 AUTO_INCREMENT、ENGINE),不影响 CREATE DATABASE,别误以为它管库级语句head -n 5 dump.sql 看前几行有没有 CREATE DATABASE;或者 grep "^CREATE DATABASE" dump.sql | wc -l 统计行数CREATE DATABASE 可能因权限或已存在而失败导出文件里有了 CREATE DATABASE,不代表还原一定能成功。MySQL 默认遇到已存在的库会报错:ERROR 1007 (HY000) at line X: Can't create database 'xxx'; database exists。另外,如果还原账号没有 CREATE 权限,也会卡在这一步。
实操建议:
DROP DATABASE IF EXISTS `xxx`; 到 SQL 文件开头(或用脚本预处理),比依赖 mysql 命令自动处理更可控mysql -u user -p 还原时,确保该用户对目标实例有 <code>CREATE 权限(GRANT CREATE ON *.* TO 'user'@'host')CREATE DATABASE:库名、字符集、排序规则可能和目标环境不一致,建议导出后人工检查再执行最常被忽略的一点:本地开发导出用 --databases 没问题,但上线部署脚本如果硬编码了库名或跳过了权限检查,一跑就挂——得把权限、字符集、是否存在这三个点都列进 checklist 里。