mysqldump -u root -p mydb users > users.sql 是导出单表的最简命令,支持加 --no-create-info(仅数据)、--no-data(仅结构)、反引号处理特殊表名、--skip-foreign-key-checks(自动加外键开关)、--single-transaction(InnoDB无锁)、--skip-extended-insert(降低内存)、--default-character-set=utf8mb4(防乱码)等关键选项。
mysqldump 导出单表 SQL 的基础命令怎么写
直接用 mysqldump 加数据库名和表名就能导出单表,不需要额外开关或复杂配置。默认输出包含 create table 和 insert 语句,适合重建表结构+数据。
-
mysqldump -u root -p mydb users > users.sql—— 最简形式,会提示输密码 - 加
--no-create-info只导数据(无建表语句);加--no-data只导结构(无 INSERT) - 如果表名含特殊字符(如横线、空格),必须用反引号包裹:
mysqldump mydb `my-table` > out.sql - 不指定
-h默认连本地,远程要写-h 192.168.1.100,端口用-P 3307(大写 P)
导出时跳过外键检查或自动添加 SET FOREIGN_KEY_CHECKS=0
导出的 SQL 文件默认不含 SET FOREIGN_KEY_CHECKS=0,但如果你后续要直接 source 进另一个库(尤其有外键依赖时),没这句可能报错 Cannot add or update a child row: a foreign key constraint fails。
- 加
--skip-foreign-key-checks参数会让 mysqldump 在输出开头自动插入SET FOREIGN_KEY_CHECKS=0和结尾恢复为 1 - 注意:这个参数只影响输出内容,不影响 dump 过程本身是否校验外键(dump 过程本身不触发外键检查)
- 如果目标库版本较老(如 MySQL 5.5),
FOREIGN_KEY_CHECKS是安全的;但某些严格模式或只读实例可能禁止执行 SET 语句,这时得手动删掉这两行再导入
导出大表时卡住或内存溢出怎么办
默认 mysqldump 把整张表查出来再拼 SQL,遇到千万级表容易 OOM 或超时。不是 bug,是设计如此。
- 加
--single-transaction(仅 InnoDB)可避免锁表,但不解决内存问题 - 真正缓解内存压力的是
--skip-extended-insert:它让每条记录独立成一行 INSERT,而不是合并成一条超长语句——看起来文件变大,但解析/导入时更省内存 - 更彻底的方案是用
--where="id BETWEEN 1 AND 100000"分批导出,配合脚本循环,适合离线归档 - 别用
--quick(默认已启用),它只是控制查询结果集获取方式,对导出文件大小和内存占用影响有限
导出的 SQL 文件里中文乱码或注释异常
本质是字符集不一致导致的编码污染,常见于服务器、客户端、连接三者字符集不统一。
- 导出时显式指定字符集:
mysqldump --default-character-set=utf8mb4 -u root -p mydb users > users.sql - 确保 MySQL 服务端
character_set_server和数据库COLLATE都是utf8mb4_unicode_ci级别 - 如果导出文件头部出现
/*!40101 SET @OLD_SQL_MODE=... */类注释,别删——这是兼容性保护,删除可能导致某些字段类型(如JSON)在低版本报错 - 用
file users.sql或 VS Code 编码识别确认文件真实编码,别只看编辑器右下角显示
表级别导出看着简单,但字符集、外键、大表分片、权限隔离这几个点,任何一个漏掉都可能让下游导入失败或数据不对。尤其是跨环境迁移时,别只测“能跑”,得测“跑得准”。










