mysqldump可备份单个或多个指定表,需指定数据库名和用反引号包裹含特殊字符的表名;支持--no-data、--no-create-info、--single-transaction等参数优化;排除表需结合shell查询实现;select into outfile适用于条件导出csv但受secure_file_priv限制;还原时需注意外键、自增冲突及触发器干扰。

mysqldump 备份单个或多个指定表
直接用 mysqldump 加库名和表名就能完成选择性备份,不需要导出整个数据库。它默认只 dump 表结构 + 数据,适合快速备份关键表。
常见错误是漏写数据库名,导致报错 No database selected;或者表名里有特殊字符(如中划线、空格)没加反引号,引发语法错误。
mysqldump -u root -p mydb table1 table2 > backup.sql- 含特殊字符的表名必须用反引号:
mysqldump -u root -p mydb `my-table` `user info` > backup.sql - 加
--no-create-info只导数据不导建表语句;加--no-data只导结构 - 大表建议加
--single-transaction(InnoDB)避免锁表,但对 MyISAM 无效
跳过某些表备份(exclude 模式)
没有原生 --exclude-table 参数,但可以用 shell 配合 mysql 查询 + mysqldump 实现“除某几张表外全备”。
典型场景:备份整个库,但排除日志表、临时表等体积大又无需恢复的表。
- 先查出要备份的表名列表:
mysql -Nse "SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema='mydb' AND table_name NOT IN ('log_2023', 'tmp_report')" - 再拼进 mysqldump:
mysqldump -u root -p mydb $(...上面命令...) > backup.sql - 注意:表名数量太多时可能超 shell 命令长度限制,此时应改用临时文件或脚本分批处理
使用 SELECT INTO OUTFILE 导出纯数据(CSV 或文本)
当只需要某张表的部分字段、带条件的数据,或想生成 CSV 供其他系统读取时,SELECT INTO OUTFILE 更轻量,但权限和路径限制多。
它不导结构,也不支持事务,且只能写入 MySQL 服务所在机器的磁盘(不是客户端),容易因 secure_file_priv 设置失败。
- 必须有
FILE权限:GRANT FILE ON *.* TO 'user'@'%'; - 导出前确认路径:
SHOW VARIABLES LIKE 'secure_file_priv';,比如返回/var/lib/mysql-files/,那只能写到该目录下 - 示例:
SELECT id,name FROM users WHERE status=1 INTO OUTFILE '/var/lib/mysql-files/users_active.csv' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'; - 导出文件属主是 MySQL 进程用户(如
mysql),普通用户无法直接读取,需后续chown或cp出来
备份时忽略外键约束与自增 ID 冲突
还原指定表备份时,常遇到 Cannot add or update a child row: a foreign key constraint fails 或 Duplicate entry for key 'PRIMARY' —— 主要是外键检查开着,或目标表已有数据。
这不是备份阶段的问题,但备份命令里提前加参数能省去还原时的手动干预。
- 加
--skip-triggers避免触发器干扰(尤其审计类 trigger) - 加
--disable-keys让 MyISAM 在导入时暂不建索引,提升速度;InnoDB 不生效 - 最关键的是还原前加
SET FOREIGN_KEY_CHECKS=0;,但这个得写在 SQL 文件头,所以备份时用--set-gtid-purged=OFF --skip-triggers并配合--add-drop-table更稳妥 - 如果目标库表已存在且要覆盖,建议备份时加
--replace或还原前手动DROP TABLE,否则会报错中断
实际操作中最容易卡住的,是 secure_file_priv 路径限制和表名特殊字符未转义——这两处报错信息不直观,但只要先查变量、再包反引号,基本就过了。










