用 mysqldump --no-data --skip-triggers --skip-routines --databases 导出空数据库结构,需注意库名转义、SQL模式兼容性及字符集一致性;PostgreSQL 对应使用 pg_dump --schema-only --no-owner --no-privileges。
导出空数据库结构(不含表数据)
用 mysqldump 加 --no-data 是最直接的办法,它只导出 create database、create table、索引、约束等定义,跳过所有 insert 语句。
常见错误是漏掉 --skip-triggers 或 --skip-routines —— 默认它们仍会被导出,而触发器和存储过程可能依赖运行时状态或已有数据,初始化环境时反而容易报错。
- 基础命令:
mysqldump --no-data --skip-triggers --skip-routines -u root -p mydb > schema.sql - 如果数据库名含特殊字符(如短横线),必须用反引号包裹:
mysqldump --no-data ... `my-db` > schema.sql - MySQL 8.0+ 默认启用
sql_mode=STRICT_TRANS_TABLES,导出脚本里若含旧版语法(如TYPE=MyISAM),导入会失败;建议加--compatible=mysql40或手动替换为ENGINE=MyISAM
避免默认数据库被隐式创建
mysqldump 默认不导出 CREATE DATABASE 语句,除非显式加 --databases 或 --database。但初始化脚本常需“先建库再建表”,否则导入时目标库不存在会报错:ERROR 1049 (42000): Unknown database 'mydb'。
- 加
--databases:生成带CREATE DATABASE IF NOT EXISTS和USE的完整头段 - 不加则只有表结构,需人工补
CREATE DATABASE或提前建库 - 注意:
--databases后面的库名是独立参数,不能跟在其他选项后连写,否则会被忽略
PostgreSQL 怎么做等效操作
PostgreSQL 没有内置“只导结构不导数据”的一键开关,得靠 pg_dump 的 --schema-only。
但它默认仍会导出权限、注释、序列初始值等——这些在干净初始化时往往多余,甚至引发权限错误(比如 GRANT 给不存在的用户)。
- 最小化结构导出:
pg_dump --schema-only --no-owner --no-privileges --no-tablespaces mydb > schema.sql -
--no-owner防止导出ALTER TABLE ... OWNER TO;--no-privileges过滤所有GRANT/REVOKE - 如果用了自定义 schema(非
public),记得加-n myschema,否则可能漏对象
导入前要检查的三个硬性条件
导出脚本只是半成品,能否顺利跑通,取决于目标环境是否满足底层约束。
- 字符集一致性:源库用
utf8mb4_unicode_ci,目标 MySQL 若版本太低(CREATE TABLE 报错Unknown character set: 'utf8mb4' - 引擎可用性:脚本里若含
ENGINE=InnoDB,而目标 MySQL 编译时禁用了 InnoDB(极少见但存在),导入直接失败 - SQL 模式兼容:导出时若含
STRICT_TRANS_TABLES,但目标库是宽松模式,某些列定义(如NOT NULL字段没默认值)可能被静默修正,导致后续插入异常
真正麻烦的不是导出动作本身,而是导出结果和目标环境之间那几行隐式假设——它们藏在字符集声明、引擎名、SQL mode 里,不报错也不提醒,直到第一次 INSERT 才露馅。










