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/