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

1次阅读

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

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

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),普通用户无法直接读取,需后续 chowncp 出来

备份时忽略外键约束与自增 ID 冲突

还原指定表备份时,常遇到 Cannot add or update a child row: a foreign key constraint failsDuplicate 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 路径限制和表名特殊字符未转义——这两处报错信息不直观,但只要先查变量、再包反引号,基本就过了。

text=ZqhQzanResources