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路径限制和表名特殊字符未转义——这两处报错信息不直观,但只要先查变量、再包反引号,基本就过了。
