MySQL-Xtrabackup备份
Xtrabackup教程
一、Xtrabackup介绍
Percona XtraBackup(简称PXB) 是 Percona公司开发的一个用于MySQL数据库物理热备份的备份工具,支持MySQL、Percona server和MariaDB,开源免费,是目前较为受欢迎的主流备份工具。xtrabackup只能备份innoDB和xtraDB两种数据引擎的表,而不能备份MyISAM数据表。
MySQL冷备、mysqldump、MySQL热拷贝都无法实现对数据库进行增量备份, 在实际生产环境中增量备份是非常实用的,如果数据大于50G或100G,存储空间足够的情况下,可以每天进行完整备份,如果每天产生的数据量较大,需要定制数据备份策略。例如每周实用完整备份,周一到周六实用增量备份。而Percona-Xtrabackup就是为了实现增量备份而出现的一款主流备份工具,xtrabakackup有2个工具,分别是xtrabakup、innobackupex。
二、Xtrabackup优点
- 备份速度快,物理备份可靠
- 备份过程不会打断正在执行的事务(无需锁表)
- 能够基于压缩等功能节约磁盘空间和流量
- 自动备份校验
- 还原速度快
- 可以流传将备份传输到另外一台机器上
- 在不增加服务器负载的情况备份数据
三、Xtrabackup备份原理
(1)innobackupex启动后,会先fork一个进程,用于启动xtrabackup,然后等待xtrabackup备份ibd数据文件;
(2)xtrabackup在备份innoDB数据时,有2种线程:redo拷贝线程和ibd数据拷贝线程。xtrabackup进程开始执行后,会启动一个redo拷贝的线程,用于从最新的checkpoint点开始顺序拷贝redo.log;再启动ibd数据拷贝线程,进行拷贝ibd数据。这里是先启动redo拷贝线程的。在此阶段,innobackupex进行处于等待状态(等待文件被创建)
(4)xtrabackup拷贝完成ibd数据文件后,会通知innobackupex(通过创建文件),同时xtrabackup进入等待状态(redo线程依旧在拷贝redo.log)
(5)innobackupex收到xtrabackup通知后哦,执行FLUSH TABLES WITH READ LOCK(FTWRL),取得一致性位点,然后开始备份非InnoDB文件(如frm、MYD、MYI、CSV、opt、par等格式的文件),在拷贝非InnoDB文件的过程当中,数据库处于全局只读状态。
(6)当innobackup拷贝完所有的非InnoDB文件后,会通知xtrabackup,通知完成后,进入等待状态;
(7)xtrabackup收到innobackupex备份完成的通知后,会停止redo拷贝线程,然后通知innobackupex,redo.log文件拷贝完成;
(8)innobackupex收到redo.log的备份完成后,就进行解锁操作,执行:UNLOCK TABLES;
(9)最后innbackupex和xtrabackup进程各自释放资源,写备份元数据信息等,innobackupex等xtrabackup子进程结束后退出。
四、xtrabackup的安装部署
安装方式又多种,不同类型操作系统安装方式不一样,这里选择linux通用版安装。
下载地址:https://www.percona.com/downloads
往下滑找到"Percona XtraBackup"下载它:
# 解压
tar -zxvf percona-xtrabackup-2.4.29-Linux-x86_64.glibc2.17.tar.gz -C /opt/
# 创建软链接,也可以直接改名
ln -s /opt/percona-xtrabackup-2.4.29-Linux-x86_64.glibc2.17 /opt/xtrabackup
# 配置环境变量
cat >/etc/profile.d/xtrabackup.sh<<'EOF'
#!/bin/bash
export PXB_HOME=/opt/xtrabackup
export PATH=$PATH:$PXB_HOME/bin
EOF
source /etc/profile.d/xtrabackup.sh
xtrabackup --version
五、备份实战
5.1 创建备份用户
create user 'bkuser'@'localhost' identified by "bk123456"; #创建用户
flush privileges; #刷新授权表
revoke all privileges,grant option from 'bkuser'@'localhost'; #回收此用户所有权限
flush privileges; #刷新授权表
grant reload,lock tables,replication client,process ON *.* TO 'bkuser'@'localhost'; #授权刷新、锁表、查看服务器状态、进程的权限
flush privileges; #刷新授权表
5.2 全备
# 创建备份数据存放目录
mkdir -p /data/backup
# 备份命令
innobackupex --defaults-file=/etc/my.cnf --user=bkuser --password=bk123456 --socket=/tmp/mysql57.sock /data/backup/
看见有错误:
Failed to connect to MySQL server as DBD::mysql module is not installed at - line 1327.
通过验证可以确定version_check并不是必须 的,它并不影响正常的备份和恢复。所以可以在使用xtrabackup备份的时候,可以指定--no-version-check选项跳过version_check,这样就没必要安装perl-DBD-MySQL了。
innobackupex --defaults-file=/etc/my.cnf --user=bkuser --password=bk123456 --socket=/tmp/mysql57.sock --no-version-check /data/backup/
innobackupex会在指定存放数据的目录下用当前时间创建一个目录,所有生成的备份文件都会这个时间目录。如果想自己命名可以使用参数–no-timestamp 来阻止命令自动创建一个以时间命名的目录。
#注意:每一个参数前面都是双横杠
innobackupex --defaults-file=/etc/my.cnf --user=bkuser --password=bk123456 --socket=/tmp/mysql57.sock --no-timestamp /data/backup/linshi
#此命令执行后,将会创建linshi文件夹用于存放备份文件而不是时间命令的目录
5.3 备份并打包压缩
参数:--stream=tar
innobackupex --defaults-file=/etc/my.cnf --user=bkuser --password=bk123456 --socket=/tmp/mysql57.sock --stream=tar --no-timestamp /data/backup | gzip > /data/backup/backup.tar.gz
这个耗时较长,大约4.5G的数据不打包压缩不到一分钟就备份完成,打包压缩大概要3分钟。但是压缩之后占用的存储空间很小:
5.4 自定义备份
5.4.1 备份指定数据库
参数:--databases=
#--databases:指定数据库,如这里备份sh_digital库
innobackupex --defaults-file=/etc/my.cnf --user=bkuser --password=bk123456 --socket=/tmp/mysql57.sock --stream=tar --databases="sh_digital" /data/backup | gzip > /data/backup/sh_digital.tar.gz
如果要备份多个库后面的参数库名用空格隔开即可,如备份aa库和bb库:--databases="aa bb"
5.4.2 不同库下的不同表
参数:--databases="库a.b表 库b.c表"
#我这里就一个库,就用同一个库下的不同表演示,这里备份sh_digital库下的aluminium_price_data和screen_ae两个表:
innobackupex --defaults-file=/etc/my.cnf --user=bkuser --password=bk123456 --socket=/tmp/mysql57.sock --stream=tar --databases="sh_digital.aluminium_price_data sh_digital.screen_ae" --no-timestamp /data/backup/ | gzip > /data/backup/sh_digital_aluminium_price_data_screen_ae.tar.gz
5.4.3 备份某一个库下有相似名称的表
--include: 使用匹配正则表达式匹配表名,上述命令表示备份sh_digital库下的screen开头的表
参数:--include=="sh_digital.screen"
innobackupex --defaults-file=/etc/my.cnf --user=bkuser --password=bk123456 --socket=/tmp/mysql57.sock --stream=tar --databases="sh_digital.aluminium_price_data sh_digital.screen_ae" --include=="sh_digital.screen" --no-timestamp /data/backup/ | gzip > /data/backup/sh_digital_screen.tar.gz
5.5 增量备份
增量备份是在原来有的全量备份基础上做增量备份,这里比如之前做过备份,如果压缩过要解压缩:
innobackupex --defaults-file=/etc/my.cnf --user=bkuser --password=bk123456 --socket=/tmp/mysql57.sock --no-timestamp --incremental-basedir=/data/backup/2024-03-12_07-28-59 --incremental /data/backup/increment_data
· --incremental-basedir:全量备份目录
· --incremental:增量备份目录
六、还原
备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处于不一致状态。利用 –apply-log参数,此参数通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态。
6.1 全量还原
1、首先查看一个完整的备份文件2024-03-12_07-28-59中的xtrabackup_checkpoints文件,如下:
如果你时打包压缩过的要建个空目录之后解压到里面。
2、执行命令如下:
innobackupex --apply-log /data/backup/2024-03-12_07-28-59/
执行完成后,backup-type将变成full-prepared,之前是full-backuped的状态:
全量还原:
注:还原时,mysql服务器需要关闭,而且数据目录必须是空的,innobackupex –copy-back不会覆盖已存在的文件
(1)停止MySQL
/etc/init.d/mysqld stop
(2)清空数据目录,这里保险起见也可以修改配置文件/etc/my.cnf把数据路径指向其它空路径,也可以使用mv把所有文件迁移到其它路径:
mkdir -p /data/mysql57/data02
修改datadir指向新的路径,这样就不用删除,免得有其它故障无法回退:
粗暴一点就是直接清空:
# rm -rf /data/mysql57/data/*
(3)还原数据:
innobackupex --defaults-file=/etc/my.cnf --copy-back /data/backup/2024-03-12_07-28-59/
--defaults-file: 指定了从哪个文件读取MySQL配置
--copy-back: 数据恢复时将备份数据文件拷贝到MySQL服务器的datadir
4、修改权限,启动数据库,验证数据是否恢复:
chown -R mysql.mysql /data/mysql57/data02 #赋权限如果你刚刚删除了就写/data/mysql57/data
/etc/init.d/mysqld start #启动Mysql
总结几个注意点:
- datadir目录必须为空,除非指定 –force-non-empty-directorires 参数,否则–copy-backup选项不会覆盖。
- 在恢复之前,必须关闭mysql实例,运行中的Mysql无法恢复
- 恢复后的文件属性会保留,因此在启动mysql之前需要将数据目录及其子目录属主用户和属组设置为mysql,否则无法启动成功
6.2 增量还原
1、停止myql:
/etc/init.d/mysqld stop
2、清空数据目录,这里还是一样的,你可以新建空目录之后修改my.cnf配置文件中datadir参数指向空目录就行,不一定要删除,我这里全量备份的时候改成了/data/mysql57/data02/,我这里直接清空它:
rm -rf /data/mysql57/data02/*
3、首先apply-log全量备份:
innobackupex --apply-log --redo-only /data/backup/2024-03-12_07-28-59/
4、把增量备份数据合并到全量备份数据上 :
innobackupex --apply-log --redo-only /data/backup/2024-03-12_07-28-59 --incremental-dir=/data/backup/increment_data
5、回滚完全备份数据:
innobackupex --apply-log /data/backup/2024-03-12_07-28-59
6、还原:
innobackupex --defaults-file=/etc/my.cnf --copy-back /data/backup/2024-03-12_07-28-59
7、设置权限,启动Mysql:
chown -R mysql:mysql /data/mysql57/data02
/etc/init.d/mysqld start
至此,通过PXB备份与恢复MySQL完成!
七、备份docker容器中MySQL的数据
这里我试了,把xtrabackup拷贝到容器内部也是可以执行的。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤