【数据库知识】MySQL 数据库备份与还原详细解读

MySQL 数据库备份与还原详细解读

      • [MySQL 数据库备份与还原详细解读](#MySQL 数据库备份与还原详细解读)
      • **一、备份类型与核心工具**
      • **二、推荐备份方案**
        • [**方案 1:小型数据库(<100GB)------ 逻辑备份(`mysqldump`)**](#方案 1:小型数据库(<100GB)—— 逻辑备份(mysqldump)
        • [**方案 2:中型数据库(100GB~1TB)------ 多线程逻辑备份(`mydumper`)**](#方案 2:中型数据库(100GB~1TB)—— 多线程逻辑备份(mydumper)
        • [**方案 3:大型数据库(>1TB)------ 物理热备(`Percona XtraBackup`)**](#方案 3:大型数据库(>1TB)—— 物理热备(Percona XtraBackup)
        • [**方案 4:关键业务(高可用需求)------ 全量+增量+Binlog 组合**](#方案 4:关键业务(高可用需求)—— 全量+增量+Binlog 组合)
      • **三、具体命令行操作**
        • [**场景 1:逻辑备份(`mysqldump`)**](#场景 1:逻辑备份(mysqldump)
          • [**1. 备份单个数据库(含结构和数据)**](#1. 备份单个数据库(含结构和数据))
          • [**2. 备份多个数据库**](#2. 备份多个数据库)
          • [**3. 备份所有数据库(含系统库)**](#3. 备份所有数据库(含系统库))
          • [**4. 备份单表**](#4. 备份单表)
          • [**5. 带条件的备份(如按时间过滤数据)**](#5. 带条件的备份(如按时间过滤数据))
          • [**6. 压缩备份(节省空间)**](#6. 压缩备份(节省空间))
          • [**7. 关键选项说明**](#7. 关键选项说明)
        • [**场景 2:逻辑备份(`mydumper`,多线程)**](#场景 2:逻辑备份(mydumper,多线程))
          • [**1. 安装 `mydumper`**](#1. 安装 mydumper)
          • [**2. 备份单个数据库**](#2. 备份单个数据库)
          • [**3. 备份所有数据库**](#3. 备份所有数据库)
        • [**场景 3:物理备份(`Percona XtraBackup`)**](#场景 3:物理备份(Percona XtraBackup)
          • [**1. 安装 `Percona XtraBackup`**](#1. 安装 Percona XtraBackup)
          • [**2. 全量备份**](#2. 全量备份)
          • [**3. 增量备份(基于全量备份)**](#3. 增量备份(基于全量备份))
          • [**4. 准备备份(恢复前必须步骤)**](#4. 准备备份(恢复前必须步骤))
        • [**场景 4:还原数据库**](#场景 4:还原数据库)
          • [**1. 逻辑备份还原(`mysqldump` 生成的 SQL 文件)**](#1. 逻辑备份还原(mysqldump 生成的 SQL 文件))
          • [**2. `mydumper` 备份还原**](#2. mydumper 备份还原)
          • [**3. `Percona XtraBackup` 物理还原**](#3. Percona XtraBackup 物理还原)
      • **四、备份策略与最佳实践**
        • [**1. 备份频率**](#1. 备份频率)
        • [**2. 备份文件管理**](#2. 备份文件管理)
        • [**3. 验证备份有效性**](#3. 验证备份有效性)
        • [**4. 加密与压缩**](#4. 加密与压缩)
      • **五、注意事项**
      • **六、总结**
      • 关联文档

MySQL 数据库备份与还原详细解读

MySQL 数据库备份与还原是保障数据安全的核心操作,需根据数据库规模、性能要求、恢复时效 选择合适方案。本文从备份类型、推荐方案、具体命令行、备份策略注意事项全面解析,覆盖逻辑备份、物理备份及点-in-time恢复(PITR)。

一、备份类型与核心工具

MySQL 备份分为 逻辑备份物理备份,核心区别如下:

类型 原理 优点 缺点 适用场景
逻辑备份 将数据导出为 SQL 语句或文本格式 跨版本兼容、可读性强、支持部分备份 备份/恢复速度慢(尤其大数据量)、锁表风险 小型数据库(<100GB)、跨环境迁移
物理备份 直接复制数据文件(如 InnoDB 表空间) 备份/恢复速度快、支持增量备份、低锁表 依赖存储引擎、跨版本兼容性差、不可读 大型数据库(>100GB)、高性能恢复需求
核心备份工具
  • 逻辑备份mysqldump(官方)、mysqlpump(官方多线程)、mydumper(第三方多线程)。
  • 物理备份Percona XtraBackup(开源,支持热备)、MySQL Enterprise Backup(官方收费)。
  • 二进制日志(Binlog):记录所有数据变更,用于点-in-time恢复(PITR)。

二、推荐备份方案

根据数据库规模和需求选择方案:

方案 1:小型数据库(<100GB)------ 逻辑备份(mysqldump

优势 :简单易用、跨版本兼容、支持单库/单表备份,适合开发环境或小型生产库。
工具mysqldump(MySQL 自带,无需额外安装)。

方案 2:中型数据库(100GB~1TB)------ 多线程逻辑备份(mydumper

优势 :多线程并行备份,速度远超 mysqldump,支持分块导出、压缩,适合中等规模数据库。
工具mydumper(需手动安装,基于 glib 开发)。

方案 3:大型数据库(>1TB)------ 物理热备(Percona XtraBackup

优势 :支持 InnoDB 热备(不锁表)、增量备份、压缩,恢复速度快,适合生产环境核心库。
工具Percona XtraBackup(开源,Percona 公司开发)。

方案 4:关键业务(高可用需求)------ 全量+增量+Binlog 组合

优势:通过"全量备份+增量备份+Binlog"实现任意时间点恢复(PITR),满足 RTO(恢复时间目标)和 RPO(恢复点目标)要求。

三、具体命令行操作

场景 1:逻辑备份(mysqldump

mysqldump 是 MySQL 官方逻辑备份工具,语法:

bash 复制代码
mysqldump [选项] 数据库名 [表名...] > 备份文件.sql
1. 备份单个数据库(含结构和数据)
bash 复制代码
# 备份 db_name 数据库到 backup_db.sql
mysqldump -u 用户名 -p 密码 db_name > backup_db.sql

# 示例(输入密码时隐藏明文)
mysqldump -u root -p db_test > /backup/db_test_$(date +%Y%m%d).sql
# 执行后输入密码:Enter password: ******
2. 备份多个数据库
bash 复制代码
# 备份 db1、db2 到 multi_db.sql
mysqldump -u root -p --databases db1 db2 > multi_db.sql
3. 备份所有数据库(含系统库)
bash 复制代码
# 备份所有库(包括 mysql、information_schema 等)
mysqldump -u root -p --all-databases > all_databases.sql
4. 备份单表
bash 复制代码
# 备份 db_name 库的 table_name 表
mysqldump -u root -p db_name table_name > table_name.sql
5. 带条件的备份(如按时间过滤数据)
bash 复制代码
# 备份 orders 表中 2023 年的数据(需表有 create_time 字段)
mysqldump -u root -p db_name orders --where="create_time >= '2023-01-01'" > orders_2023.sql
6. 压缩备份(节省空间)

结合 gzip 压缩备份文件(推荐):

bash 复制代码
mysqldump -u root -p db_name | gzip > db_name.sql.gz
7. 关键选项说明
选项 作用
--single-transaction 对 InnoDB 表使用事务快照备份(不锁表,适合生产环境)
--routines 备份存储过程和函数
--triggers 备份触发器
--events 备份事件调度器
--hex-blob 二进制数据(如 BLOB)以十六进制格式导出(避免乱码)
--skip-lock-tables 不锁表(MyISAM 表可能不一致,慎用)
场景 2:逻辑备份(mydumper,多线程)

mydumper 是第三方多线程逻辑备份工具,速度比 mysqldump 快 5~10 倍,支持分块导出和压缩。

1. 安装 mydumper
  • Ubuntu/Debian

    bash 复制代码
    sudo apt install mydumper
  • CentOS/RHEL

    bash 复制代码
    sudo yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
    sudo percona-release enable-only tools release
    sudo yum install mydumper
2. 备份单个数据库
bash 复制代码
# 多线程备份 db_name(-t 线程数,-c 压缩,-o 输出目录)
mydumper -u root -p 密码 -h localhost -P 3306 \
  -t 4 -c -o /backup/mydumper/db_name \
  -B db_name  # -B 指定数据库名
3. 备份所有数据库
bash 复制代码
mydumper -u root -p 密码 -t 4 -c -o /backup/mydumper/all_databases -a  # -a 备份所有库
场景 3:物理备份(Percona XtraBackup

Percona XtraBackup 支持 InnoDB 热备(不锁表)、增量备份,适合大型数据库。

1. 安装 Percona XtraBackup
  • Ubuntu/Debian

    bash 复制代码
    wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb
    sudo dpkg -i percona-release_latest.*.deb
    sudo apt update
    sudo apt install percona-xtrabackup-24  # MySQL 5.7/8.0 对应版本
2. 全量备份
bash 复制代码
# 备份所有 InnoDB 表到 /backup/xtrabackup/full
xtrabackup --backup \
  --user=root --password=密码 \
  --target-dir=/backup/xtrabackup/full/$(date +%Y%m%d)
3. 增量备份(基于全量备份)
bash 复制代码
# 基于全量备份做增量备份(需指定上次备份目录)
xtrabackup --backup \
  --user=root --password=密码 \
  --target-dir=/backup/xtrabackup/incr/$(date +%Y%m%d) \
  --incremental-basedir=/backup/xtrabackup/full/20231001
4. 准备备份(恢复前必须步骤)

备份文件需通过 --prepare 命令整理后才能恢复:

bash 复制代码
# 全量备份准备(--apply-log)
xtrabackup --prepare --target-dir=/backup/xtrabackup/full/20231001

# 增量备份准备(合并到全量备份)
xtrabackup --prepare \
  --target-dir=/backup/xtrabackup/full/20231001 \
  --incremental-dir=/backup/xtrabackup/incr/20231002
场景 4:还原数据库
1. 逻辑备份还原(mysqldump 生成的 SQL 文件)

使用 mysql 命令导入 SQL 文件:

bash 复制代码
# 还原单个数据库(需先创建空库)
mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS db_name;"
mysql -u root -p db_name < backup_db.sql

# 还原所有数据库(直接导入 all_databases.sql)
mysql -u root -p < all_databases.sql
2. mydumper 备份还原

使用 myloadermydumper 配套工具)还原:

bash 复制代码
myloader -u root -p 密码 -h localhost -P 3306 \
  -t 4 -d /backup/mydumper/db_name  # -d 指定备份目录
3. Percona XtraBackup 物理还原
  1. 停止 MySQL 服务:

    bash 复制代码
    sudo systemctl stop mysql
  2. 清空数据目录(默认 /var/lib/mysql):

    bash 复制代码
    sudo rm -rf /var/lib/mysql/*
  3. 复制备份文件到数据目录:

    bash 复制代码
    sudo cp -r /backup/xtrabackup/full/20231001/* /var/lib/mysql/
  4. 修改权限(MySQL 运行用户,如 mysql:mysql):

    bash 复制代码
    sudo chown -R mysql:mysql /var/lib/mysql
  5. 启动 MySQL:

    bash 复制代码
    sudo systemctl start mysql

四、备份策略与最佳实践

1. 备份频率
  • 全量备份:每日/每周(根据数据变更频率,核心库每日)。
  • 增量备份:每小时(基于全量备份,减少备份窗口)。
  • Binlog 备份:实时同步 Binlog 文件到远程存储(如 S3、NAS)。
2. 备份文件管理
  • 命名规范 :包含日期和类型(如 db_test_20231001_full.sql.gz)。
  • 存储位置:本地+异地(如本地 SSD + 远程对象存储),避免单点故障。
  • 保留周期:全量备份保留 7~30 天,增量备份保留 3~7 天,Binlog 保留 7 天。
3. 验证备份有效性
  • 定期恢复测试:每月随机抽取备份文件恢复到测试环境,验证数据完整性。
  • 检查备份文件大小:异常小的文件可能备份失败(如权限问题)。
4. 加密与压缩
  • 压缩 :用 gzipmydumper 内置压缩(节省存储空间)。
  • 加密 :用 openssl 加密备份文件(如 mysqldump ... | openssl enc -aes-256-cbc -salt -pass pass:密钥 > backup.sql.enc)。

五、注意事项

  1. 锁表风险

    • mysqldump 默认对 MyISAM 表锁表,InnoDB 表建议加 --single-transaction 选项(事务快照备份,不锁表)。
    • 大表备份时,避免在业务高峰期执行。
  2. 字符集问题

    备份/还原时指定字符集(如 --default-character-set=utf8mb4),避免乱码:

    bash 复制代码
    mysqldump -u root -p --default-character-set=utf8mb4 db_name > backup.sql
    mysql -u root -p --default-character-set=utf8mb4 db_name < backup.sql
  3. 权限问题

    备份用户需有 SELECTSHOW VIEWTRIGGERLOCK TABLES(非事务表)权限。

  4. Binlog 开启

    点-in-time恢复需开启 Binlog,在 my.cnf 中配置:

    ini 复制代码
    [mysqld]
    log_bin = /var/log/mysql/mysql-bin.log
    binlog_format = ROW  # 推荐 ROW 格式(记录行变更)
    expire_logs_days = 7  # Binlog 保留 7 天

六、总结

  • 小型库 :用 mysqldump 逻辑备份(简单、兼容),命令示例:

    bash 复制代码
    mysqldump -u root -p --single-transaction --routines --triggers db_name | gzip > db_name_$(date +%Y%m%d).sql.gz
  • 大型库 :用 Percona XtraBackup 物理热备(高速、低影响),结合 Binlog 实现 PITR。

  • 关键业务:全量备份(每日)+ 增量备份(每小时)+ Binlog(实时),确保任意时间点可恢复。

通过合理选择工具和策略,可最大化保障 MySQL 数据安全与业务连续性。

关联文档

【数据库知识】Mysql进阶-高可用MHA(Master High Availability)方案

【数据库知识】Mysql免交互执行脚本

【数据库相关】mysql数据库巡检

【数据库知识】mysql进阶-Mysql数据库的主从复制

相关推荐
Dreamboat¿5 分钟前
SQL 注入漏洞
数据库·sql
曹牧1 小时前
Oracle数据库中,将JSON字符串转换为多行数据
数据库·oracle·json
被摘下的星星1 小时前
MySQL count()函数的用法
数据库·mysql
末央&1 小时前
【天机论坛】项目环境搭建和数据库设计
java·数据库
徒 花1 小时前
数据库知识复习07
数据库·作业
素玥2 小时前
实训5 python连接mysql数据库
数据库·python·mysql
jnrjian2 小时前
text index 查看index column index定义 index 刷新频率 index视图
数据库·oracle
瀚高PG实验室2 小时前
审计策略修改
网络·数据库·瀚高数据库
言慢行善3 小时前
sqlserver模糊查询问题
java·数据库·sqlserver
韶博雅3 小时前
emcc24ai
开发语言·数据库·python