mysql如何备份指定表_mysql选择性备份方法

来源:这里教程网 时间:2026-02-28 20:50:30 作者:

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

相关推荐