MySQL-数据备份
备份类型
按备份方法分类
热备
- 定义:在数据库运行中直接备份,对正在进行的数据库操作无影响
- 优点:不中断服务,高可用性
- 缺点:对性能有一定影响,备份时间较长时可能造成备份文件不一致
- 适用场景:InnoDB存储引擎支持热备,适用于24/7运行的关键业务系统
冷备
- 定义:数据库完全停止服务后进行备份
- 优点:备份文件的一致性和完整性最高,不影响数据库性能
- 缺点:完全停机,服务不可用,不适用于高可用性系统
- 适用场景:小型系统或可接受停机维护的环境
温备
- 定义:数据库运行中进行,但仅支持读操作,不支持写操作
- 特点:MyISAM存储引擎支持温备,备份时锁定表格(可读不可写)
- 影响:对应用影响较大,会阻塞写入操作
按备份内容分类
物理备份
- 定义:直接复制数据库的物理文件(数据文件、日志文件等)
- 优点:备份和恢复速度快
- 缺点:占用存储空间大,通常不兼容不同MySQL版本
- 工具示例:XtraBackup、LVM快照、MySQL Enterprise Backup
逻辑备份
- 定义:通过SQL语句导出数据结构和内容
- 优点:兼容性好,可跨版本恢复,可读性强
- 缺点:备份和恢复速度较慢,需要重建索引和存储过程
- 工具示例:mysqldump、mysqlpump、mydumper
按备份策略分类
完全备份(完整备份)
- 定义:每次对整个数据库进行完整备份
- 优点:恢复操作简单,一次恢复到位,速度快
- 缺点:占用空间大,备份速度慢
- 推荐频率:通常每周执行一次
增量备份
- 定义:仅备份自上次备份(完全或增量)以来变化的数据
- 优点:备份数据量小,占用空间小,备份速度快
- 缺点:恢复过程复杂,需依赖完整备份并按顺序恢复所有增量备份
- 适用场景:数据更新频繁但希望节省存储成本的环境
差异备份
- 定义:备份自上次完全备份以来所有变化的数据
- 优点:恢复只需最近一次完全备份和最后一次差异备份
- 缺点:随着时间推移,备份文件会越来越大
- 推荐策略:每周一次全备份+每天一次差异备份
企业级备份策略
黄金组合方案:
- 每日全量备份(XtraBackup)
- 每小时增量备份(XtraBackup)
- 实时binlog备份(mysqlbinlog)
- 备份验证(定期演练恢复)
mermaid
timeline
title 备份周期示例
周日 : 全量备份
周一 : 增量备份
周二 : 增量备份
周三 : 增量备份 + 验证恢复
...MySQL 物理备份
二进制日志备份
bash
# 先确认日志位置
SHOW MASTER STATUS;
# 实时备份binlog
mysqlbinlog --read-from-remote-server --host=127.0.0.1 --user=repl \
--password=xxx --raw --stop-never binlog.000123Xtrabackup
介绍
Xtrabackup是由percona开源的免费数据库热备份软件,它能对InnoDB数据库和XtraDB存储引擎的数据库非阻塞地备份(对于MyISAM的备份同样需要加表锁);mysqldump备份方式是采用的逻辑备份,其最大的缺陷是备份和恢复速度较慢,如果数据库大于50G,mysqldump备份就不太适合。
Xtrabackup安装完成后有4个可执行文件,其中2个比较重要的备份工具是innobackupex、xtrabackup
bash
xtrabackup # 是专门用来备份InnoDB表的,和mysql server没有交互;
innobackupex # 是一个封装xtrabackup的Perl脚本,支持同时备份innodb和myisam,但在对myisam备份时需要加一个全局的读锁。
xbcrypt # 加密解密备份工具
xbstream # 流传打包传输工具,类似tar优点
- 备份速度快,物理备份可靠
- 备份过程不会打断正在执行的事务(无需锁表)
- 能够基于压缩等功能节约磁盘空间和流量
- 自动备份校验
- 还原速度快
- 可以流传将备份传输到另外一台机器上
- 在不增加服务器负载的情况备份数据
备份原理
备份开始时首先会开启一个后台检测进程,实时检测mysq redo的变化,一旦发现有新的日志写入,立刻将日志记入后台日志文件xtrabackup_log中,之后复制innodb的数据文件一系统表空间文件ibdatax,复制结束后,将执行flush tables with readlock,然后复制.frm MYI MYD等文件,最后执行unlock tables,最终停止xtrabackup_log
Xtrabackup 增量备份介绍
xtrabackup 增量备份的原理
- 首先完成一个完全备份,并记录下此时检查点LSN;
- 然后增量备份时,比较表空间中每个页的LSN是否大于上次备份的LSN,若是则备份该页并记录当前检查点的LSN。
增量备份优点
- 数据库太大没有足够的空间全量备份,增量备份能有效节省空间,并且效率高;
- 支持热备份,备份过程不锁表(针对InnoDB而言),不阻塞数据库的读写;
- 每日备份只产生少量数据,也可采用远程备份,节省本地空间;
- 备份恢复基于文件操作,降低直接对数据库操作风险;
- 备份效率更高,恢复效率更高。
Xtrabackup 安装
下载安装xtrabackup
bash
# 下载安装包
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.9/binary/redhat/6/x86_64/Percona-XtraBackup-2.4.9-ra467167cdd4-el6-x86_64-bundle.tar
# 解压安装
tar xf Percona-XtraBackup-2.4.9-ra467167cdd4-el6-x86_64-bundle.tar
yum install percona-xtrabackup-24-2.4.9-1.el6.x86_64.rpm -y
# 检测安装
which xtrabackup
# 查看版本
innobackupex -vinnobackupex 命令
innobackupex是 Percona XtraBackup 工具的一部分,用于执行 MySQL/MariaDB 数据库的热备份(在线备份)
语法格式
bash
innobackupex [选项] [备份目录]选项
基础备份选项
| 选项 | 说明 |
|---|---|
--user | 指定 MySQL 用户名(默认:root) |
--password | 指定 MySQL 密码 |
--host | 指定 MySQL 主机(默认:localhost) |
--port | 指定 MySQL 端口(默认:3306) |
--no-timestamp | 不自动创建时间戳子目录 |
--defaults-file | 指定 MySQL 配置文件(如 /etc/my.cnf) |
--compress | 启用压缩备份(使用 qpress) |
--compress-threads | 压缩线程数(默认:1) |
--parallel | 并行备份线程数(默认:1) |
增量备份选项
| 选项 | 说明 |
|---|---|
--incremental | 执行增量备份 |
--incremental-basedir | 指定基准备份目录(用于增量备份) |
--incremental-lsn | 手动指定 LSN(日志序列号) |
--incremental-dir | 增量备份存储目录 |
恢复选项
| 选项 | 说明 |
|---|---|
--apply-log | 准备备份(应用 redo log) |
--copy-back | 恢复备份到 MySQL 数据目录 |
--move-back | 移动备份到 MySQL 数据目录(删除原备份) |
--use-memory | 指定内存大小(如 1G)用于恢复 |
其他选项
| 选项 | 说明 |
|---|---|
--slave-info | 记录主从复制信息 |
--safe-slave-backup | 备份时暂停从库复制 |
--stream | 流式备份(如 tar或 xbstream) |
--throttle | 限制 I/O 速率(单位:MB/s) |
全量备份
bash
innobackupex --defaults-file=/etc/my.cnf --user=root --password="123456" --backup /backup/mysql/
# 使用此参数使用相关数据性文件保持一致性状态
innobackupex --apply-log /root/2017-12-04_13-57-29/- 备份到
/backup/mysql/,自动创建时间戳子目录(如2024-01-01_12-00-00)。
增量备份
需要注意的是,增量备份仅能应用于InooDB或XtraDB表,对于MyISAM表,增量与全备相同。
bash
innobackupex --defaults-file=/etc/my.cnf \
--user=root --password=123456 \
--incremental /backup/mysql/ \
--incremental-basedir=/backup/mysql/2024-01-01_12-00-00/
--incremental /backup/mysql/ #指定增量备份文件备份的目录
--incremental-basedir #指定上一次全备或增量备份的目录- 基于
2024-01-01_12-00-00备份进行增量备份。
准备备份(应用日志)
bash
# 准备完整备份
innobackupex --apply-log /backup/mysql/2024-01-01_12-00-00/
# 准备增量备份
innobackupex --apply-log /backup/mysql/2024-01-01_12-00-00/ \
--incremental-dir=/backup/mysql/2024-01-01_13-00-00/恢复数据
bash
# 停止 MySQL
systemctl stop mysql
# 清空数据目录(谨慎操作!)
rm -rf /var/lib/mysql/*
# 全量恢复
innobackupex --defaults-file=/etc/my.cnf --copy-back /root/2017-12-04_13-57-29/
# 增量恢复
innobackupex --apply-log --redo-only /root/2017-12-04_13-57-29/
innobackupex --apply-log --redo-only /root/2017-12-04_13-57-29/ --incremental-dir=/backup/2017-12-05_09-27-06/
# 修改权限
chown -R mysql:mysql /var/lib/mysql
# 启动 MySQL
systemctl start mysql注意事项
- 备份前检查:
- 确保
xtrabackup版本与 MySQL/MariaDB 版本兼容。 - 确保有足够的磁盘空间存放备份。
- 确保
- 增量备份依赖 LSN:
- 必须基于有效的完整备份或上一次增量备份。
- 恢复前必须
--apply-log:- 否则备份数据可能不一致。
- 压缩备份:
- 使用
--compress可减少备份大小,但恢复时需要解压。
- 使用
