最稳导出单表结构+数据用mysqldump加--single-transaction和--skip-extended-insert;只导结构用--no-data,只导数据用--no-create-info;字符集须显式指定--default-character-set=utf8mb4。

导出单表结构+数据,用这个命令最稳
直接导出某张表的建表语句和所有 INSERT 语句,mysqldump 默认行为就是干这事,但得注意默认不加事务、不锁表,线上导出可能看到不一致快照。
实操建议:
- 加
--single-transaction:InnoDB 表能保证一致性快照(不阻塞写入) - 加
--skip-extended-insert:每行一个INSERT,方便 diff 或局部修复(但文件变大) - 不加
--no-create-info和--no-data,否则会丢结构或数据 - 示例:
mysqldump -u root -p mydb users > users.sql
只导结构不导数据,或只导数据不导结构
常见于迁移前建空库、或补数据时复用已有表结构。参数组合容易记混,关键就两个开关:
- 只导结构:
--no-data(别错打成--no-data拼错,实际是--no-data) - 只导数据:
--no-create-info(注意不是--no-create-table,后者不存在) - 如果还带触发器/存储过程,要额外加
--no-triggers或--routines,否则默认不导 - 示例(只导 users 表结构):
mysqldump -u root -p --no-data mydb users > users_schema.sql
导出时跳过某些表,或只导指定几张表
整库导出太重,又不想手动删 SQL 文件里的其他表,用参数控制更可靠。
- 跳过某几张表:
--ignore-table=mydb.table1 --ignore-table=mydb.table2(必须带库名前缀) - 只导指定表:
mysqldump -u root -p mydb table_a table_b > subset.sql(表名直接跟在库名后,空格分隔) - 注意:不能混用
--databases和单表列表,前者用于多库,后者用于单库多表 - 错误现象:
mysqldump: Couldn't execute 'SELECT ...': Table 'mydb.table_x' doesn't exist——说明--ignore-table写错了库名或表名大小写不匹配(Linux 下敏感)
中文乱码、特殊字符报错、导出中断
本质是字符集没对齐,mysqldump 默认用 utf8,但 MySQL 8.0+ 默认是 utf8mb4,不显式指定就会崩。
- 必须加
--default-character-set=utf8mb4(不能只写utf8) - 如果服务端
character_set_server是latin1,光客户端设 utf8mb4 也不行,得先确认库/表实际编码:SHOW CREATE TABLE users; -
max_allowed_packet太小会导致大 BLOB 字段截断,导出中断,可临时加大:mysqldump --max-allowed-packet=512M ... - 导出路径含空格或中文?别这么干。用绝对路径且避开中文目录,比如
/tmp/export.sql最省心











