Skip to content

MySQL-数据备份

备份类型

按备份方法分类

热备

  • 定义:在数据库运行中直接备份,对正在进行的数据库操作无影响
  • 优点:不中断服务,高可用性
  • 缺点:对性能有一定影响,备份时间较长时可能造成备份文件不一致
  • 适用场景:InnoDB存储引擎支持热备,适用于24/7运行的关键业务系统

冷备

  • 定义:数据库完全停止服务后进行备份
  • 优点:备份文件的一致性和完整性最高,不影响数据库性能
  • 缺点:完全停机,服务不可用,不适用于高可用性系统
  • 适用场景:小型系统或可接受停机维护的环境

温备

  • 定义:数据库运行中进行,但仅支持读操作,不支持写操作
  • 特点:MyISAM存储引擎支持温备,备份时锁定表格(可读不可写)
  • 影响:对应用影响较大,会阻塞写入操作

按备份内容分类

物理备份

  • 定义:直接复制数据库的物理文件(数据文件、日志文件等)
  • 优点:备份和恢复速度快
  • 缺点:占用存储空间大,通常不兼容不同MySQL版本
  • 工具示例:XtraBackup、LVM快照、MySQL Enterprise Backup

逻辑备份

  • 定义:通过SQL语句导出数据结构和内容
  • 优点:兼容性好,可跨版本恢复,可读性强
  • 缺点:备份和恢复速度较慢,需要重建索引和存储过程
  • 工具示例:mysqldump、mysqlpump、mydumper

按备份策略分类

完全备份(完整备份)

  • 定义:每次对整个数据库进行完整备份
  • 优点:恢复操作简单,一次恢复到位,速度快
  • 缺点:占用空间大,备份速度慢
  • 推荐频率:通常每周执行一次

增量备份

  • 定义:仅备份自上次备份(完全或增量)以来变化的数据
  • 优点:备份数据量小,占用空间小,备份速度快
  • 缺点:恢复过程复杂,需依赖完整备份并按顺序恢复所有增量备份
  • 适用场景:数据更新频繁但希望节省存储成本的环境

差异备份

  • 定义:备份自上次完全备份以来所有变化的数据
  • 优点:恢复只需最近一次完全备份和最后一次差异备份
  • 缺点:随着时间推移,备份文件会越来越大
  • 推荐策略:每周一次全备份+每天一次差异备份

企业级备份策略

黄金组合方案:

  1. 每日全量备份(XtraBackup)
  2. 每小时增量备份(XtraBackup)
  3. 实时binlog备份(mysqlbinlog)
  4. 备份验证(定期演练恢复)
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.000123

Xtrabackup

介绍

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 -v

innobackupex 命令

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流式备份(如 tarxbstream
--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

注意事项

  1. 备份前检查
    • 确保 xtrabackup版本与 MySQL/MariaDB 版本兼容。
    • 确保有足够的磁盘空间存放备份。
  2. 增量备份依赖 LSN
    • 必须基于有效的完整备份或上一次增量备份。
  3. 恢复前必须 --apply-log
    • 否则备份数据可能不一致。
  4. 压缩备份
    • 使用 --compress可减少备份大小,但恢复时需要解压。