目录
前言
一、备份概述
(一)备份方式
(二)备份策略
二、物理备份及恢复
(一)备份操作
(二)恢复操作
三、逻辑备份及恢复
(一)逻辑备份
(二)逻辑恢复
(三)mysqldump局限性
四、环境准备
(一)软件介绍编辑
(二)安装软件
六、增量备份与恢复
(一)增量备份
首次完全备份
增量备份
(二)增量恢复
准备全量备份
合并增量备份
恢复数据
七、差异备份与恢复
(一)差异备份
首次完全备份
差异备份
(二)差异恢复
准备全量备份
合并差异备份
恢复数据
八、数据实时备份与恢复
(一)binlog日志管理
日志介绍
启用bin-log
创建新日志文件
日志文件常用管理命令
(二)备份数据
备份单个库
备份所有库
(三)恢复数据
恢复所有数据
恢复部分数据
(四)注意事项
前言
- 如果有需要了解MySQL的基础使用,如查询和表管理的可以参考MySQL技术笔记-从基础配置到高级查询的全栈实战指南、MySQL技术笔记-表结构设计与管理的完整指南
一、备份概述
(一)备份方式
- 按照数据库服务状态分类
类型 | 说明 | 优点 | 缺点 |
---|---|---|---|
冷备份 | 在数据库服务停止状态下进行备份,直接复制数据文件 | 数据一致性强,备份过程简单 | 服务中断,影响业务连续性 |
热备份 | 在数据库服务运行状态下进行备份,无需停机 | 不影响业务运行,适合高可用场景 | 数据可能存在短暂不一致,备份复杂度较高 |
温备份 | 在数据库运行状态下进行的备份操作,但备份过程中会短暂阻塞数据库的写操作,以保证数据一致性(mysqldump) | 无需停止数据库服务,通过短暂阻塞写操作,确保备份数据的一致性,适用于数据一致性要求较高、写入压力适中的业务系统 | 写入压力较大的业务可能因阻塞而产生延迟 |
- 按照备份的数据分类
类型 | 说明 | 优点 | 缺点 |
---|---|---|---|
物理备份 | 直接复制数据库的物理文件(如 .ibd 、.frm 文件) | 恢复速度快,适合大数据量 | 跨平台兼容性差,备份文件体积大 |
逻辑备份 | 导出数据库中的数据为 SQL 脚本(如 mysqldump ) | 跨平台兼容性好,适合数据迁移 | 备份和恢复速度较慢,依赖 SQL 解析 |
(二)备份策略
- 备份系统的三要素
要素 | 全称 | 含义 | 说明 |
---|---|---|---|
BW | Backup Window(备份窗口) | 在一个工作周期内,系统可用于执行备份操作的时间范围 | 备份窗口越短,对业务影响越小 |
RPO | Recovery Point Objective(恢复点目标) | 在发生故障时,企业可接受的最大数据丢失量 | RPO 越小,数据丢失越少 |
RTO | Recovery Time Objective(恢复时间目标) | 在发生故障时,企业可接受的最长系统恢复时间 | RTO 越短,业务中断时间越短 |
- 灾备系统建设国际标准(SHARE 78)
级别 | 描述 | 恢复能力 | 适用场景 |
---|---|---|---|
0 | 无备份,无恢复能力 | 无法恢复 | 不建议 |
1 | 本地磁带备份 | 恢复时间长 | 小型企业 |
2 | 远程磁带备份 | 恢复时间较短 | 中型企业 |
3 | 远程磁盘备份 | 恢复时间更短 | 大型企业 |
4 | 远程热备中心 | 快速恢复 | 高可用需求 |
5 | 实时数据复制 | 数据几乎无丢失 | 金融、电商等关键业务 |
6 | 实时复制 + 完整IT基础设施 | 快速切换 | 数据中心级容灾 |
7 | 实时复制 + 完整IT基础设施 + 应用 | 零中断 | 最高级别容灾 |
二、物理备份及恢复
(一)备份操作
- 使用
cp
命令备份cp -r /var/lib/mysql /备份目录/mysql.bak
- 使用
tar
命令备份tar -zcf /root/mysql.tar.gz /var/lib/mysql/*
(二)恢复操作
- 使用
cp
命令恢复cp -r 备份目录/mysql.bak /var/lib/mysql/
- 使用
tar
命令恢复tar -zxf /root/mysql.tar.gz -C /var/lib/mysql/
- 修改文件所有权
chown -R mysql:mysql /var/lib/mysql # 确保MySQL对目录和目录下的文件有读权限
三、逻辑备份及恢复
(一)逻辑备份
- 备份操作
mysqldump -uroot -p密码 库名 > /目录/xxx.sql
- 库名表示方式:
库名 表名列表
:备份1张表或多张表所有数据。-B 库名列表
:备份1个库或多个库所有数据。--all-databases
或-A
:备份1台服务器所有数据。
- 示例:
mysqldump -uroot -ptest -A > /bakdir/all_backup.sql
(二)逻辑恢复
- 恢复操作
mysql -uroot -p密码 [库名] < /目录/名.sql
- 示例:
mysqldump -uroot -pa test users > /test_users.sql mysqldump -uroot -pa -B test > /test.sql mysql -uroot -pa test < /test_users.sql mysql -uroot -pa < /test.sql
- 注意:
- 恢复库时库名可以省略。
- 备份和恢复时,数据库服务必须是运行状态。
- 覆盖恢复数据时需谨慎操作,确保数据安全。
(三)mysqldump局限性
- 物理备份缺点:
- 跨平台性差。
- 备份时间长、冗余备份、浪费存储空间。
- 物理备份通常只能恢复整个数据库实例,无法单独恢复某个库或表,灵活性不如逻辑备份。
- mysqldump备份缺点:
- 恢复效率低,导入大数据量时耗时较长 。
- 备份速度较慢,尤其在大数据量场景下性能不佳 。
- 锁表,备份过程中数据插入和更新操作被阻塞。
- 不支持增量备份,仅支持全量逻辑备份 。
- 对于大规模数据库,备份文件体积较大,占用存储资源 。
- 备份过程中可能对数据库性能产生影响 。
四、环境准备
(一)软件介绍
- Percona XtraBackup:一款强大的在线热备份工具,备份过程中不锁库表,适合生产环境。由专业组织Percona提供(改进MySQL分支)。
(二)安装软件
- 安装依赖
yum -y install perl-DBD-MySQL
- 解压软件
tar -xf percona-xtrabackup-8.0.26-18-Linux-x86_64.glibc2.12-minimal.tar.gz mv percona-xtrabackup-8.0.26-18-Linux-x86_64.glibc2.12 /usr/local/percona
- 配置环境变量
echo 'export PATH=/usr/local/percona/bin:$PATH' >> /etc/bashrc source /etc/bashrc
五、增量备份与恢复
(一)增量备份
首次完全备份
xtrabackup --host=127.0.0.1 --user=用户名 --password=密码 --backup --target-dir=备份目录 --datadir=数据库目录
#完全备份就是每次进行备份都只执行该操作
- 示例:
xtrabackup --host=127.0.0.1 --user=root --password=test --backup --target-dir=/basement --datadir=/var/lib/mysql
增量备份
xtrabackup --host=127.0.0.1 --user=用户名 --password=密码 --backup --target-dir=备份目录 --incremental-basedir=参考目录 --datadir=数据库目录
- 示例:
xtrabackup --host=127.0.0.1 --user=root --password=test --backup --target-dir=/inc1 --incremental-basedir=/basement --datadir=/var/lib/mysql
(二)增量恢复
准备全量备份
xtrabackup --prepare --apply-log-only --target-dir=/完全备份目录
#--apply-log-only 参数,确保未提交的事务不被回滚,以便后续合并增量备份。
- 示例:
xtrabackup --prepare --apply-log-only --target-dir=/basement
合并增量备份
xtrabackup --prepare --apply-log-only \
--target-dir=/完全备份目录 \
--incremental-dir=/增量备份目录
#将增量备份的数据合并到全量备份目录中,确保数据一致性。
#如果有多个增量备份需要将每个增量备份按照先后顺序和完全备份进行合并
- 示例:
xtrabackup --prepare --apply-log-only \
--target-dir=/basement \
--incremental-dir=/inc1
恢复数据
xtrabackup --copy-back --target-dir=/完全备份目录
#--copy-back 将准备好的备份数据复制回 MySQL 的数据目录。
- 示例:
xtrabackup --copy-back --target-dir=/basement
- 注意事项:
- 执行恢复前,务必清空 MySQL 数据目录(如
/var/lib/mysql
),避免数据冲突。 - 恢复完成后,需修改数据目录权限为
mysql:mysql
,并重启 MySQL 服务。chown -R mysql:mysql /var/lib/mysql systemctl restart mysqld
- 执行恢复前,务必清空 MySQL 数据目录(如
六、差异备份与恢复
(一)差异备份
首次完全备份
xtrabackup --host=127.0.0.1 --user=用户名 --password=密码 --backup --target-dir=/备份目录 --datadir=/数据库目录
- 示例:
xtrabackup --host=127.0.0.1 --user=root --password=test --backup --target-dir=/fullbackup --datadir=/var/lib/mysql
差异备份
xtrabackup --host=127.0.0.1 --user=用户名 --password=密码 --backup --target-dir=/备份目录 --incremental-basedir=/完全备份目录 --datadir=/数据库目录
#每次差异备份都是以上次全量或差异备份为基础
- 示例:
xtrabackup --host=127.0.0.1 --user=root --password=test --backup --target-dir=/diff_1 --incremental-basedir=/fullbackup --datadir=/var/lib/mysql
(二)差异恢复
准备全量备份
xtrabackup --prepare --apply-log-only --target-dir=/完全备份目录
- 示例:
xtrabackup --prepare --apply-log-only --target-dir=/fullbackup
合并差异备份
xtrabackup --prepare --apply-log-only --target-dir=/完全备份目录 --incremental-dir=/最后一次差异备份
#只要和最后一次差异备份合并即可,因为最后一次差异备份包括之前所有差异备份的数据
- 示例:
xtrabackup --prepare --apply-log-only \ --target-dir=/fullbackup \ --incremental-dir=/diff_1
恢复数据
xtrabackup --copy-back --target-dir=/完全备份目录
- 示例:
xtrabackup --copy-back --target-dir=/fullbackup
- 注意事项:
- 执行恢复前,务必清空 MySQL 数据目录(如
/var/lib/mysql
),避免数据冲突。 - 恢复完成后,需修改数据目录权限为
mysql:mysql
,并重启 MySQL 服务。chown -R mysql:mysql /var/lib/mysql systemctl restart mysqld
- 执行恢复前,务必清空 MySQL 数据目录(如
七、数据实时备份与恢复
(一)binlog日志管理
日志介绍
- 什么是binlog日志:
- 又称“二进制日志”,是MySQL服务生成的日志文件之一。
- 记录除查询语句(SELECT、SHOW等)以外的所有SQL命令,包括INSERT、UPDATE、DELETE、CREATE、ALTER、DROP等。
- 主要用于数据恢复、数据复制以及主从同步。
- 启用binlog是实现MySQL主从复制的必要条件。
启用bin-log
- 日志默认启用:日志默认存储在
/var/lib/mysql/
目录下。 - 自定义日志
- 示例:
mkdir /mylog # 创建目录 vim /etc/my.cnf.d/mysql-server.cnf #修改配置 #添加 [mysqld] log-bin=/mylog/mysql-binchown mysql:mysql /mylog # 修改目录的所有者为mysql setenforce 0 # 关闭selinux systemctl restart mysqld # 重启服务
创建新日志文件
- 默认容量:Binlog日志文件默认1G容量,超出后会自动创建新日志。
- 手动创建:
FLUSH LOGS; 或者 systemctl restart mysqld
日志文件常用管理命令
- 查看正在使用的日志
SHOW MASTER STATUS;
- 查看已有的日志文件
SHOW BINARY LOGS;
- 删除编号之前的日志
PURGE MASTER LOGS TO "日志名";
- 示例:
PURGE MASTER LOGS TO "mysql-bin.000004";
- 删除所有日志,重新创建日志
RESET MASTER;
- 查看日志文件内容
SHOW BINLOG EVENTS IN "日志文件名";
- 示例:
SHOW BINLOG EVENTS IN "mysql-000004";
(二)备份数据
备份单个库
mysqldump -uroot -p密码 --flush-logs -B test > /single.sql
备份所有库
mysqldump -uroot -p密码 --flush-logs -A > /all.sql
(三)恢复数据
恢复所有数据
mysqlbinlog /目录/文件名 | mysql -uroot -p密码 #查看文件全部内容并通过管道导入数据库中
- 示例:
mysqlbinlog /mylog/mysql-bin.000001 | mysql -uroot -ptest
恢复部分数据
mysqlbinlog --start-datetime="开始时间" --stop-datetime="结束时间" /目录/文件名 | mysql -uroot -p密码
- 示例:
mysqlbinlog --start-datetime="2025-06-01 00:00:00" --stop-datetime="2025-07-10 23:59:59" /mylog/mysql-bin.000001 | mysql -uroot -ptest
(四)注意事项
- 备份时:
- 确保备份目录有足够的空间。
- 定期检查备份文件的完整性和可用性。
- 恢复时:
- 确保恢复操作不会影响生产环境。
- 在恢复前备份当前数据库状态,以防恢复失败。
- 确保恢复后的数据一致性。