mysqldump导出单表只出结构不出数据,主因是权限不足(缺select权)或误加--no-data等参数;必须指定数据库名如mysqldump myapp users,不可省略;特殊表名需用反引号;--where条件需注意引号嵌套与转义。

mysqldump 导出单表时为什么只导出结构没数据?
默认情况下 mysqldump 会导出表结构 + 数据,但如果加了 --no-data 或误用了 --skip-extended-insert 等参数干扰判断,就容易只看到 CREATE TABLE。更常见的是权限问题:执行用户缺少对目标表的 SELECT 权限,mysqldump 会静默跳过数据导出,只保留结构。
- 检查命令是否混入了
--no-data、--no-create-info等开关 - 用
SHOW GRANTS FOR CURRENT_USER;确认有SELECT权限,特别是跨库或使用视图时 - 加
--verbose参数运行一次,看控制台是否打印Executing SQL statement: SELECT ...
导出单表必须指定数据库名,不能只写表名
mysqldump 不支持像 mysqldump users 这样省略库名——它会报错 mysqldump: Couldn't find table: 'users'。表名永远是二级路径,必须显式带上数据库上下文。
- 正确写法:
mysqldump myapp users > users.sql - 如果表名含特殊字符(如短横线),用反引号包裹:
mysqldump myapp `user-log` > user_log.sql - 不要尝试用
-B(--databases)导单表,它会额外包一层CREATE DATABASE和USE,恢复时可能出错
带条件导出部分数据:慎用 --where,注意引号和转义
想导出最近一周的订单?用 --where="created_at >= '2024-06-01'" 最直接。但 shell 对单引号、双引号处理不同,MySQL 内部又要求字符串用单引号,一不留神就语法错误或注入风险。
- Linux/macOS 推荐单引号包裹整个 where 字符串:
--where='status="paid" AND created_at > "2024-06-01"' - Windows cmd 下改用双引号,内部字段值再用单引号:
--where="status='paid' AND created_at > '2024-06-01'" - 避免在
--where里拼接变量,尤其来自用户输入;宁可先导出全量,再用sed或 Python 过滤
恢复单表备份时,mysql 命令不识别 DROP TABLE IF EXISTS 外的元数据
直接 mysql myapp 能跑通,但若原表存在且结构不兼容(比如新加了非空字段),就会因插入失败中断。备份文件里虽有 <code>DROP TABLE,但它依赖 IF EXISTS —— 老版本 MySQL(Unknown table 'myapp.users'。
- 导出时显式加
--add-drop-table(默认已开启,但低版本建议确认) - 恢复前手动执行
DROP TABLE IF EXISTS users;更可控 - 如果表有外键,先关约束:
SET FOREIGN_KEY_CHECKS=0;,恢复完再开
--where 里的日期变量一换环境就崩,不如先把条件逻辑收口到 SQL 文件里。











