一、xtrabackup工具介绍
Percona XtraBackup
Percona XtraBackup是一个适用于MySQL的开源热备份工具,它在备份期间不锁表。它可以备份InnoDB、XtraDB以及MyISAM存储引擎的表。
2.4版本支持MySQL5.1、5.5、5.6以及5.7。
它有两个实用命令,分别是xtrabackup和innobackupex,xtrabackup只能备份InnoDB和XtraDB两种存储引擎的表,innobackupex是一个Perl脚本,封装了xtrabackup,它还可以备份MyISAM存储引擎的表,但在处理MyISAM存储引擎的表时需要加一个读锁。
Xtrabackup有如下优点:
备份速度快,物理备份可靠
备份过程不会打断正在执行的事务(无需锁表)
能够基于压缩等功能节约磁盘空间和流量
自动备份校验
还原速度快
可以流传,就是将备份传输到另外一台机器上
在不增加服务器负载的情况下备份数据
Xtrabackup的备份原理如下:
XtraBackup是基于InnoDB的crash-recovery功能的。它会复制InnoDB的数据文件,由于不锁表,复制出来的数据是不一致的,在恢复的时候使用crash-recovery,使得恢复的数据一致。
InnoDB维护了一个事务日志,它包含了InnoDB数据的所有改动情况。当InnoDB启动的时候,它会先去检查数据文件和事务日志,并且会做两步操作:
1、应用已提交的事务日志项到数据文件;
2、对任何修改了数据但是没有提交的事务日志项执行回滚。
XtraBackup在备份的时候,一页一页地复制InnoDB的数据,而且不锁表,与此同时,XtraBackup还有另外一个线程监视着事务日志,一旦事务日志发生变化,就把变化过的日志页复制走。为什么要急着复制走呢?因为事务日志的文件大小有限,写满之后,就会从头再开始写,所以新数据可能会覆盖到旧数据。
在prepare的过程中,XtraBackup使用复制到的事务日志对备份出来的InnoDB数据文件进行crash-recovery。
具体如下:
innobackupex启动后,会先派生一个进程,用于启动xtrabackup,然后等待xtrabackup备份数据文件;
xtrabackup在备份InnoDB数据时,有2种线程:事务日志复制线程和数据文件复制线程。xtrabackup进程开始执行后,会启动一个事务日志复制线程,用于从最新的检查点开始顺序复制事务日志;再启动数据文件复制线程,复制数据文件。这里是先启动事务日志复制线程的。在这个阶段,innobackupex进行处于等待状态;
xtrabackup复制完成数据文件之后,会通知innobackupex,同时xtrabackup进入等待状态(事务日志复制线程依旧在复制事务日志);
innobackupex收到xtrabackup通知后,执行FLUSH TABLES WITH READ LOCK(FTWRL),取得一致性位点,然后开始备份非InnoDB数据文件,在复制非InnoDB数据文件的过程中,数据库处于全局只读状态;
当innobackupex拷贝完所有的非InnoDB数据文件之后,会通知xtrabackup,通知完成后,进入等待状态;
xtrabackup收到innobackupex备份完成的通知之后,会停止事务日志复制线程,然后通知innobackupex,事务日志复制完成;
innobackupex收到事务日志复制完成的通知后,就进行解锁操作,执行:UNLOCK TABLES;
最后innbackupex和xtrabackup进程各自释放资源,写备份元数据信息等,innobackupex等xtrabackup子进程结束后退出。
注意,XtraBackup是以读写模式打开InnoDB数据文件,然后对其进行复制的。其实它不会修改此文件。也就是说,运行xtrabackup的用户,必须对InnoDB的数据文件具有读写权限。
二、数据库mysql5.7编译安装
(一)、安装包下载
MySQL :: Download MySQL Community Server (Archived Versions)
进入上述mysql官方地址找到对应的mysql版本下载到服务器上即可。
(二)、步骤
1、压缩包上传至服务器并解压
tar -zxvf mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz
// 修改文件夹命令(可选)
mv mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz mysql57
2、进入mysql57,创建data和log文件
// 进入mysql57
cd mysql57/
// 创建data 和 log文件,并修改权限
mkdir data
mkdir log
chmod 777 -R ./data
chmod 777 -R ./log
3、新建用户和组
sudo groupadd mysql
sudo useradd -r -g mysql mysql
sudo passwd mysql
# 输入用户mysql密码
// 修改mysql57文件夹所属为mysql用户
chown -R mysql:mysql [mysql文件位置]
4、初始化MySQL
// 进入mysql-->bin目录下
cd [mysql文件位置]/bin
// 数据库初始化
./mysqld --initialize --user=mysql --basedir=[mysql文件位置] --datadir=[mysql文件位置]/data
// 复制mysql.server到/etc/init.d/mysqld;更快启动
sudo cp [mysql文件位置]/support-files/mysql.server /etc/init.d/mysqld
初始化密码如图位置(初始化密码建议复制到文本文件里方便安装完mysql之后使用):
5、编辑MySQL配置文件,相当于win的my.ini
vim /etc/my.cnf
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[mysqld]
#设置3306端口
port=3306
# 设置mysql的安装目录
basedir=/usr/local/mysql
# 设置mysql数据库的数据的存放目录
datadir=/usr/local/mysql/data
# 允许最大连接数
max_connections=200
character-set-server=utf8
# 默认存储引擎
default-storage-engine=INNODB
lower_case_table_names=1
修改my.cnf权限
chmod -R 775 /etc/my.cnf
6、启动MySQL、停止、重启指令
启动:service mysqld start
停止:service mysqld stop
重启:service mysqld restart
7、启动成功后进入MySQL修改密码
mysql -uroot -p
# 输入密码:密码上边截图!或可修改配置文件跳过输入密码;
// 提示以下信息
-bash :mysql :command not fount
// 1、可以进入MySQL文件夹下的bin目录再次执行;
// 2、可以配置环境变量
vim /etc/profile
// 添加环境变量
export PATH=$PATH:[mysql解压位置]/bin
// 更新配置文件
source /etc/profile
8、进入数据库,修改密码
#修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '修改的密码';
#刷新数据库
flush privileges;
#配置远程访问
grant all privileges on *.* to 'root'@'%' identified by '你的密码' with grant option;
#刷新数据库
flush privileges;
9、设置开机自启(可选)
systemctl enable mysqld
三、xtrabackup工具安装
1、官网下载和mysql版本相对应的版本到服务器上
https://www.percona.com/downloads
上述为下载地址,找到对应的版本和适配你的centos版本的安装包下载到服务器上,此处是xtrabackup2.4适配mysql5.7,操作系统版本centos7
2、把默认的CentOS yum源修改成国内的aliyun yum源
(1)安装Centos后默认的yum源如下
ll /etc/yum.repos.d
(2)把默认yum源备份(可选)
mkdir /opt/centos-yum.bak
mv /etc/yum.repos.d/* /opt/centos-yum.bak/
(3)下载aliyun yum源repo文件(对应自己的系统版本下载即可)
#各系统版本repo文件对应的下载操作
CentOS 5
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo
CentOS 6
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
CentOS 7
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
(4)清除缓存
yum clean all
Loaded plugins: fastestmirror
Cleaning repos: base extras updates
Cleaning up everything
Cleaning up list of fastest mirrors
yum makecache //把yum源缓存到本地,加快软件的搜索好安装速度
yum list
3、安装xtrabackup
(1)安装依赖包
yum -y install libev perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL
yum -y install rsync perl-Digest-MD5
(2)安装xtrabackup
rpm -ivh percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm
4、创建备份用户及设置权限
CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 'password';
GRANT RELOAD,LOCK TABLES,PROCESS,REPLICATION CLIENT ON . TO 'bkpuser'@'localhost';
FLUSH PRIVILEGES;
5、配置xtrabackup、创建备份目录
vim /etc/my.cnf
[xtrabackup]
user=bkpuser
password=password
mkdir -p /data/backups/mysql/full_backup
chown -R mysql:mysql /data/backups/mmysql/full_backup
四、xtrabackup备份及恢复
1、执行一次全备份
xtrabackup --backup --target-dir=/data/backups/MySQL/full_backup
备份过程如下:
---
2024-05-18T15:06:24.060430+08:00 0 [Note] [MY-011825] [Xtrabackup] Connecting to MySQL server host: localhost, user: root, password: set, port: 3306, socket: /data/data/mysql.sock
2024-05-18T15:06:24.081369+08:00 0 [Note] [MY-011825] [Xtrabackup] Using server version 8.0.33
2024-05-18T15:06:24.086956+08:00 0 [Note] [MY-011825] [Xtrabackup] Executing LOCK INSTANCE FOR BACKUP ...
...
2024-05-18T15:06:24.533828+08:00 1 [Note] [MY-011825] [Xtrabackup] >> log scanned up to (19730331)
2024-05-18T15:06:24.592403+08:00 0 [Note] [MY-012953] [InnoDB] Disabling background ibuf IO read threads.
2024-05-18T15:06:24.798005+08:00 0 [Note] [MY-011825] [Xtrabackup] Generating a list of tablespaces
2024-05-18T15:06:24.798132+08:00 0 [Note] [MY-012204] [InnoDB] Scanning './'
2024-05-18T15:06:24.803212+08:00 0 [Note] [MY-012208] [InnoDB] Completed space ID check of 2 files.
2024-05-18T15:06:24.809533+08:00 0 [Warning] [MY-012091] [InnoDB] Allocated tablespace ID 2 for testdb/testtab, old maximum was 0
2、在全备份的基准上执行第一次增量备份
xtrabackup --backup --target-dir=/data/backups/mysql_increase1 --incremental-basedir=/data/backups/mysql/full_backup
往后的每一次增量备份都以上一次增量备份为基准
xtarbackup --backup --target-dir=/data/backups/mysql_increase2 --incremental-basedir=/data/backups/mysql_increase2
3、xtrabackup恢复数据库
(1)模拟数据库故障
cd /[数据库安装路径]
mv data data.bak
(2)恢复数据库(需要时间)
xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/data/backups/mysql/full_backup
xtrabackup --defaults-file=/etc/my.cnf --copy-back --target-dir=/data/backups/mysql/full_backup
(3)恢复验证
登录数据库,看表情况是否和故障前的一样:
[root@node1 data]# mysql -uroot -p'root' testdb
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.33 MySQL Community Server - GPL
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
root@node1 16:23: [testdb]> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| testtab |
+------------------+
1 row in set (0.00 sec)