mysqldump 无法直接按存储引擎过滤,需先通过 information_schema 查询 MyISAM 或 InnoDB 表名,再传给 mysqldump 导出;导出时用 --no-create-info 可避免 ENGINE 冗余,SELECT INTO OUTFILE 不适用于跨表一致性备份。
mysqldump 怎么只导出 MyISAM 表
直接用 mysqldump 无法按存储引擎过滤,它不支持 --engine=myisam 这类参数。得先查出哪些表是 myisam,再把表名喂给 mysqldump。
实操分两步:先用 SQL 查表,再拼命令导出:
mysql -Nse "SELECT CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) FROM information_schema.TABLES WHERE ENGINE = 'MyISAM' AND TABLE_SCHEMA NOT IN ('information_schema', 'performance_schema', 'mysql', 'sys')" | xargs mysqldump --single-transaction --skip-triggers --no-create-info > myisam_only.sql
-
-N去掉列名头,-s去掉多余空格,确保输出是干净的db1.tbl1格式 -
--single-transaction对 MyISAM 无效(它不支持事务),但加了也没害处;真正起作用的是--no-create-info,避免导出 CREATE TABLE 语句里带 ENGINE=MyISAM 的干扰 - 注意排除系统库,否则可能报错或导出无意义数据
mysqldump 怎么只导出 InnoDB 表
InnoDB 表通常需要一致性快照,所以 --single-transaction 是关键;但同样,mysqldump 本身不识别引擎筛选,还是得靠 information_schema 查表名。
推荐写成一行脚本执行:
mysql -Nse "SELECT CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) FROM information_schema.TABLES WHERE ENGINE = 'InnoDB' AND TABLE_SCHEMA NOT IN ('information_schema', 'performance_schema', 'mysql', 'sys')" | xargs mysqldump --single-transaction --skip-triggers --routines --events > innodb_only.sql
-
--single-transaction必须加,否则多表并发写入时备份可能不一致 -
--skip-triggers避免触发器定义混在数据里(尤其跨库时容易出错) -
--routines和--events是可选的——如果业务逻辑依赖存储过程或事件调度,就得带上;否则省略更干净
导出时 ENGINE= 被硬编码进 CREATE TABLE 怎么办
默认 mysqldump 会把原表的 ENGINE=InnoDB 或 ENGINE=MyISAM 写进 CREATE TABLE 语句里。如果你只是想“导出数据”,后续要导入到不同引擎的库中,这个字段反而碍事。
- 用
--no-create-info完全跳过建表语句,只导数据(INSERT) - 用
--skip-opt --no-tablespaces组合可减少冗余选项,但不会删 ENGINE;真要改,得 post-process,比如:sed -i 's/ENGINE=[^)]*//g' backup.sql - 注意:删掉 ENGINE 后,导入时依赖目标库的默认引擎,
my.cnf里的default-storage-engine或default_storage_engine会生效
为什么不能用 SELECT ... INTO OUTFILE 替代
SELECT ... INTO OUTFILE 看似简单,但它有硬性限制:只能导出单表、必须有 FILE 权限、路径受限于 MySQL 服务端磁盘(不是你本地),且不带表结构、不处理 NULL、不兼容字符集自动转换。
- 它导出的是纯文本(如 CSV),没有 INSERT 语句,没法直接
source回去 - 遇到 BLOB、JSON、时间戳等类型,格式容易错乱,
LOAD DATA INFILE又要求严格匹配字段顺序和转义规则 - 对 InnoDB 表做一致性导出?不行——它不提供快照机制,边查边写就可能漏数据
真正需要选择性备份引擎时,绕不开 information_schema + mysqldump 组合。最易被忽略的是权限和路径——mysqldump 在客户端运行,但查 information_schema 依赖账号是否有 SELECT 权限,而导出文件写在本地,别误以为是服务器上生成的。











