mysqldump 默认导出 MyISAM 表结构和数据,无需指定引擎;导出单表需显式指定库名和表名,加 --no-data 仅导结构,加 --no-create-info 仅导数据;MyISAM 不支持事务,故无 BEGIN/COMMIT,但默认加 LOCK TABLES;权限不足时可用 --skip-lock-tables;导出多 MyISAM 表需先查 INFORMATION_SCHEMA 再拼表名;--single-transaction 对 MyISAM 无效;.MYI/.MYD 文件不可直接替代逻辑备份。

直接用 mysqldump 即可导出 MyISAM 表结构和数据,无需额外指定引擎参数——它默认按表实际类型导出,MyISAM 表会原样保留。
导出单个 MyISAM 表的结构和数据
最常用也最稳妥的方式是显式指定数据库和表名,避免因默认行为或权限问题漏掉内容:
-
mysqldump -u root -p database_name table_name > table_dump.sql—— 会同时导出CREATE TABLE和INSERT语句 - 如果只想导结构(不含数据),加
--no-data;只导数据(不含建表语句),加--no-create-info - MyISAM 表不支持事务,所以
mysqldump不会加BEGIN/COMMIT包裹,但会自动加LOCK TABLES和UNLOCK TABLES(除非用--skip-lock-tables) - 若导出时提示
Access denied for user ... LOCK TABLES,说明用户缺少LOCK TABLES权限,可加--single-transaction(对 MyISAM 无效,但不会报错)或改用--skip-lock-tables
导出多个 MyISAM 表(排除 InnoDB 表)
当库中混有 MyISAM 和 InnoDB 表,又只想导出 MyISAM 类型时,不能靠 mysqldump 自动识别,得先查表类型再拼命令:
- 查出所有 MyISAM 表:
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'database_name' AND ENGINE = 'MyISAM'; - 把结果拼成空格分隔的表名列表,传给
mysqldump:mysqldump -u root -p database_name table1 table2 table3 > myisam_only.sql - 注意:不要用
--where或--ignore-table按引擎过滤——mysqldump不支持按ENGINE条件筛选,那些参数只认表名 - 如果表名含特殊字符或关键字,
mysqldump会自动用反引号包裹,不用手动处理
导出时影响 MyISAM 表一致性的关键选项
MyISAM 是表级锁,导出过程中的写操作会被阻塞,选错参数容易导致锁等待超时或数据不一致:
-
--lock-tables(默认开启):对每个表执行FLUSH TABLES WITH READ LOCK,适合低流量时段;高并发下可能卡住写入 -
--skip-lock-tables:跳过锁表,导出快但存在“边导边写”风险——比如某条记录在SELECT之后被删,最终 dump 文件里就会多出一条已不存在的数据 -
--single-transaction对 MyISAM 完全无效(仅对 InnoDB 生效),但加上也不会报错,只是被忽略 - 如需最小化影响,可搭配
--quick(逐行获取,减少内存占用)和--extended-insert(默认开启,压缩 INSERT 语句体积)
真正容易被忽略的是:MyISAM 表的 .MYI(索引)和 .MYD(数据)文件本身不能直接复制用于恢复——mysqldump 导出的是逻辑备份,而文件拷贝是物理备份,两者不可混用。如果误以为导出 SQL 就等于“拿到了原始文件”,后续在不同 MySQL 版本或配置下导入时,可能因排序规则、字符集隐式转换等问题导致索引失效或查询变慢。











