XtraBackup开源热备工具

XtraBackup开源热备工具

一、XtraBackup介绍

Percona XtraBackup是世界上唯一的开源,免费的MySQL热备份软件,可以为InnoDB和XtraDB 数据库执行非阻塞备份。

二、Xtrabackup备份原理:

物理备份,不锁表,那么怎么保证现有的数据(备份过程中有尚未提交或已经提交但未同步事务)与复制出来的数据一致呢?

我们知道MySQL修改操作都会先记录在ib_logfile日志文件,再同步到磁盘,这个文件并重复使用。在复制期间会开启一个线程用来监控ib_logfile日志文件,如果有修改就从上次记录的日志序列号(checkpoins)开始复制新增内容到Logfile文件。复制结束后,把logfile事务日志进行回滚,把未完成的事务同步到ibdata1和ibd里面,来保证数据一致性。这与Mysql崩溃后恢复基本操作一样

Xtrabackup中主要包含两个工具:

xtrabackup:是用于热备份innodb, xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构,xtrabackup命令只备份数据文件,并不备份数据表结构(.frm),所以使用xtrabackup恢复的时候必须有对应表结构文件(.frm)。

innobackupex命令,此命令相当于冷备份,复制数据目录的索引,数据,结构文件,但会有短暂的锁表。innobackupex:是将xtrabackup进行封装的perl脚本,提供了备份myisam表的能力,所有使用

三、安装XtraBackup

官网地址:
shell 复制代码
#找到XtraBackup的rpm包下载,选择需要的版本
https://www.percona.com/downloads/XtraBackup/LATEST/
安装依赖
yum install -y perl-DBD-MySQL 
yum install -y per-DBI 
yum install -y perl-Time-HiRes 
yum install -y libaio*
shell 复制代码
yum -y install libev
yum -y install rsync
yum -y install zstd
使用本地yum安装XtraBackup
shell 复制代码
yum localinstall percona-xtrabackup-24-2.4.29-1.el7.x86_64.rpm
检查安装结果
shell 复制代码
#查看所有以安装的rpm包,找到关于xtraback的包
[root@localhost ~]# rpm -qa |grep xtraback
percona-xtrabackup-24-2.4.29-1.el7.x86_64
#查看和找到关于xtraback的包相关的目录和文件
[root@localhost ~]# rpm -ql percona-xtrabackup-24-2.4.29-1.el7.x86_64
/usr/bin/innobackupex
/usr/bin/xbcloud
/usr/bin/xbcloud_osenv
/usr/bin/xbcrypt
/usr/bin/xbstream
/usr/bin/xtrabackup
/usr/lib64/xtrabackup/plugin/keyring_file.so
/usr/lib64/xtrabackup/plugin/keyring_vault.so
/usr/share/doc/percona-xtrabackup-24-2.4.29
/usr/share/doc/percona-xtrabackup-24-2.4.29/LICENSE
/usr/share/man/man1/innobackupex.1.gz
/usr/share/man/man1/xbcrypt.1.gz
/usr/share/man/man1/xbstream.1.gz
/usr/share/man/man1/xtrabackup.1.gz

四、使用XtraBackup工具

首先提醒一个经常会遇到的报错

shell 复制代码
#如果在备份时遇到以下报错,原因是因为由于程序在/var/lib/mysql/mysql.sock中找套接字文件和我们在my.cnf文件中设定的不一样、
[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf  --user=root --password=re123456!  --host=localhost backup
xtrabackup: recognized server arguments: --datadir=/opt/data --server-id=1 --log_bin=mysql_bin 
xtrabackup: recognized client arguments: 
201231 20:54:04 innobackupex: Starting the backup operation

IMPORTANT: Please check that the backup run completes successfully.
           At the end of a successful backup run innobackupex
           prints "completed OK!".

201231 20:54:04  version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup;host=localhost' as 'root'  (using password: YES).
Failed to connect to MySQL server: DBI connect(';mysql_read_default_group=xtrabackup;host=localhost','root',...) failed: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) at - line 1315.
201231 20:54:04 Connecting to MySQL server host: localhost, user: root, password: set, port: not set, socket: not set
Failed to connect to MySQL server: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2).

#解决办法在/var/lib/mysql/下创建软连接,连接到真正的mysql.sock文件位置
[root@localhost ~]# find / -name 'mysql.sock' 
/tmp/mysql.sock
[root@localhost ~]# ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock //如mysql文件没有则需要创建
#再次执行
[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf  --user=root --password=re123456!  --host=localhost backup
xtrabackup: recognized server arguments: --datadir=/opt/data --server-id=1 --log_bin=mysql_bin 
xtrabackup: recognized client arguments: 
...
xtrabackup: Transaction log of lsn (7463544) to (7463553) was copied.
201231 20:56:11 completed OK!
#查看备份文件
[root@localhost ~]# ll backup/
total 0
drwxr-x---. 7 root root 252 Dec 31 21:17 2020-12-31_21-17-44
#查看一致性
[root@localhost ~]# innobackupex --apply-log backup/2020-12-31_21-42-03/
下面是一个完整的备份流程
shell 复制代码
#首先对数据库进行一次完整备份
[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password='HUANGtianen_666' /opt/data/full

#innobackupex :这是执行 XtraBackup 工具的命令。
#--defaults-file=/etc/my.cnf :指定 MySQL 的配置文件路径,如果是默认路径可以不指定.
#--user=root:指定用于连接 MySQL 服务器进行备份操作的用户名是 mysql 。
#--password='HUANGtianen_666' :指定上述用户的密码。
#/opt/data/full :指定备份数据的存储目录,即将数据库备份到这个目录下。

#这是备份产生的文件
[root@localhost ~]# ls /opt/data/full/
2024-10-25_09-32-40



#对指定目录中的备份数据应用事务日志,为后续的数据恢复操作做好准备,主要为了保持数据完整性和一致性.
[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --apply-log /opt/data/full/2024-10-25_09-32-40/
#innobackupex :这是执行 XtraBackup 工具的命令。
#--defaults-file=/etc/my.cnf :指定MySQL的配置文件路径,以便XtraBackup能够获取相关的配置信息,例如数据库的数据目录位置等。
#--apply-log :表示应用日志,即将备份过程中生成的事务日志应用到备份的数据上,以确保数据的一致性和完整性。
#/opt/data/full/2024-10-25_09-32-40/ :指定要恢复的备份数据所在的目录。


#第一次增量备份
[root@localhost ~]# innobackupex --user=root --password='Mysql_123456' --incremental /opt/data/increment/ --incremental-basedir=/opt/data/full/2024-10-25_09-32-40/

#innobackupex:这是执行备份操作的主要命令。
#--user=root:指定用于连接到 MySQL 服务器进行备份操作的用户名。
#--password='Mysql_123456':指定上述用户的密码。
#--incremental:表示存储增量备份的目录
#--incremental-basedir=/opt/data/full/2024-10-25_09-32-40:指定此次增量备份所基于的完全备份的目录路径。innobackupex 需要依据这个完全备份来确定哪些数据发生了变化,从而只备份变化的部分。


#查看备份产生的文件
[root@localhost ~]# ls /opt/data/increment/
2024-10-28_02-11-53


#第一次增量备份后的增量备份命令
[root@localhost ~]# innobackupex --user=root --password='Mysql_123456' --incremental /opt/data/increment/ --incremental-basedir=/opt/data/increment/2024-10-28_02-11-53

#--user=root 和 --password='Mysql_123456' 用于指定连接数据库的用户名和密码。
#--incremental 表示这是这一次备份存储的位置。
#--incremental-basedir= 指定上一次增量备份的目录路径,此次备份基于上一次增量备份。

#查看第二次备份产生的文件
[root@localhost ~]# ls /opt/data/increment/
2024-10-28_02-11-53  2024-10-28_02-25-27

#第三次备份与上第二次备份操作一模一样,只有在选择incremental-basedir选择的文件时为上一次增量备份的文件.
[root@localhost ~]# innobackupex --user=root --password='Mysql_123456' --incremental /opt/data/increment/ --incremental-basedir=/opt/data/increment/2024-10-28_02-25-27/

#查看第三次备份产生的文件
[root@localhost ~]# ls /opt/data/increment
2024-10-28_02-11-53  2024-10-28_02-25-27  2024-10-28_09-24-10
恢复备份操作

只恢复完全备份

shell 复制代码
#全量备份的文件位置
[root@localhost ~]# ls /opt/data/full/
2024-10-25_09-32-40


#首先停止MySQL服务
[root@localhost ~]# service mysqld stop
#然后一定要清除MySQL的数据目录,否则恢复数据会失败
[root@localhost ~]# rm -rf /var/lib/mysql/*
#回滚日志
[root@localhost ~]# innobackupex --apply-log /opt/data/full/2024-10-25_09-32-40/

#innobackupex 是 XtraBackup 工具的一个常用命令。
#--apply-log 选项表示应用日志以准备好备份用于恢复。
#/opt/data/full/2024-10-25_09-32-40/ 是之前进行完全备份所存储的目录路径。通过在这个目录上执行应用日志的操作,可以使备份处于一个可以被正确恢复的状态。

#恢复数据目录
[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --copy-back /opt/data/full/2024-10-25_09-32-40/
#恢复成功
[root@localhost ~]# ls /var/lib/mysql
ib_buffer_pool  ib_logfile0  ibtmp1  performance_schema  test             xtrabackup_master_key_id
ibdata1         ib_logfile1  mysql   sys                 xtrabackup_info

#由于使用root身份恢复所以属主和属组都是root 启动数据库时候会报错
[root@localhost ~]# chown -R mysql.mysql /var/lib/mysql

恢复全备加增备的步骤

shell 复制代码
#全量备份的文件的位置
[root@localhost ~]# ls /opt/data/full/
2024-10-25_09-32-40
#增量备份文件的位置
[root@localhost ~]# ls /opt/data/increment/
2024-10-28_02-11-53  2024-10-28_02-25-27  2024-10-28_09-24-10


#首先停止MySQL服务
[root@localhost ~]# service mysqld stop
#模拟数据损坏
[root@localhost ~]# rm -rf /var/lib/mysql/*

#首先回滚日志到全备文件中
#回滚全备的日志
[root@localhost ~]# innobackupex  --apply-log --redo-only /opt/data/full/2024-10-25_09-32-40/

#然后回滚第一次增备的日志
[root@localhost ~]# innobackupex  --apply-log --redo-only /opt/data/full/2024-10-25_09-32-40/  --incremental-dir=/opt/data/increment/2024-10-28_02-11-53/

#回滚第二次增备的日志
[root@localhost ~]# innobackupex  --apply-log --redo-only /opt/data/full/2024-10-25_09-32-40/  --incremental-dir=/opt/data/increment/2024-10-28_02-25-27/

#回滚第三次增备的日志
[root@localhost ~]# innobackupex  --apply-log --redo-only /opt/data/full/2024-10-25_09-32-40/  --incremental-dir=/opt/data/increment/2024-10-28_09-24-10/


....
#以此类推,一直恢复到你数据损坏前的最后一个备份

#最后恢复数据存储目录
[root@localhost mysql]# innobackupex --defaults-file=/etc/my.cnf --copy-back /opt/data/full/2024-10-25_09-32-40/


#由于使用root身份恢复所以属主和属组都是root 启动数据库时候会报错
[root@localhost ~]# chown -R mysql.mysql /var/lib/mysql

#查看恢复情况
[root@localhost ~]# ls /var/lib/mysql
ib_buffer_pool  ib_logfile0  ibtmp1  performance_schema  tbs123  test             xtrabackup_master_key_id
ibdata1         ib_logfile1  mysql   sys                 tbs666  xtrabackup_info

#恢复完成

关于在备份时设置免于输入密码

为保持数据库密码私密性,可以将登陆密码设置为root用户的环境变量

shell 复制代码
#首先在当前用户的环境配置文件中设置MYSQL_PWD变量
[root@localhost ~]# cat ~/.bashrc 

......

#直接在最后一行加入这个变量,密码设置为你数据库登录的密码
#这个变量的作用是相关依赖MySQL连接的工具(包括 XtraBackup)在执行操作时,如果没有指定密码,会自动从这个环境变量中获取密码
export MYSQL_PWD=Mysql_123456           


#设置完成后使用source命令生效该设置
[root@localhost ~]# source ~/.bashrc

#有了环境变量后的备份命令,不需要输入密码
[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --user=root /opt/data/full/
相关推荐
lsjweiyi3 小时前
极简AI工具箱网站开源啦!
opencv·开源·微信支付·支付宝支付·百度ai·极简ai工具箱·ai图像处理
开源社4 小时前
一场开源视角的AI会议即将在南京举办
人工智能·开源
FreeIPCC4 小时前
谈一下开源生态对 AI人工智能大模型的促进作用
大数据·人工智能·机器人·开源
海害嗨4 小时前
阿里巴巴官方「SpringCloudAlibaba全彩学习手册」限时开源!
学习·开源
生命是有光的4 小时前
【开源风云】从若依系列脚手架汲取编程之道(八)
开源
HuggingFace6 小时前
Halo 正式开源: 使用可穿戴设备进行开源健康追踪
开源·健康追踪
时光追逐者10 小时前
.NET 9 中 LINQ 新增功能实操
开发语言·开源·c#·.net·.netcore·linq·微软技术
檀越剑指大厂13 小时前
Linux本地部署开源项目OpenHands基于AI的软件开发代理平台及公网访问
linux·人工智能·开源
胜天半子_王二_王半仙1 天前
c++源码阅读__ThreadPool__正文阅读
开发语言·c++·开源
FIT2CLOUD飞致云1 天前
案例研究|阿特斯的JumpServer分布式部署和多组织管理实践
运维·开源·堡垒机·jumpserver