MySQL8Xtrabackup物理备份恢复教程

一、Xtrabackup介绍

xtrabackup是由Percona公司开发的一个用于MySQL数据库物理热备的工具,开源免费,目前官方mysql8.0最新支持到8.0.35,另外8.1,8.2和8.3也支持。它具有如下优点:

(1)备份速度快,物理备份可靠
(2)在备份期间不间断地处理事务
(3)支持备份压缩,节约磁盘空间和网络带宽
(4)自动校验备份

xtrabackup支持流式输出、压缩、增量备份、加密,是目前各个备份厂商普遍使用的MySQL备份工具。

二、Xtrabackup备份原理

1、xtrabackup开始,记录lsn ,同时启动后台进程监控redo日志的变化,且将变化实时记录到xtrabackup_logfile中
2、复制ibdata1,.ibd数据文件
3、全局读锁,执行LOCK INSTANCE FOR BACKUP(8.0取代了 FLUSH TABLES WITH READ LOCK)
4、复制非InnoDB的表和文件
5、获取binlog位置信息
6、停止复制redo log,即停止记录xtrabackup_logfile
7、执行UNLOCK INSTANCE释放锁
8、复制buffer pool
9、备份完成

三、下载软件

官网地址:https://www.percona.com/downloads
Percona XtraBackup 8.0 只支持MySQL 8.0的版本
Percona XtraBackup 2.4 支持MySQL 5.11 , 5.5, 5.6 和5.7的版本

大家按需下载对应的版本

当然,也可以从网盘下载

链接: https://pan.baidu.com/s/1cWZ_Vbf8d-eUaAsawA2lUg
提取码: sfka

四、Xtrabackup安装

上传安装包至/usr/local目录下,并重命名为xtrabackup目录

[root@mysql local]# tar -xvf percona-xtrabackup-8.0.35-31-Linux-x86_64.glibc2.17.tar.gz
[root@mysql local]# mv percona-xtrabackup-8.0.35-31-Linux-x86_64.glibc2.17 xtrabackup
[root@mysql local]# echo "export PATH=\$PATH:/usr/local/xtrabackup/bin" >>/etc/profile
[root@mysql local]# source /etc/profile
[root@mysql local]#which xtrabackup
[root@myoracle local]#xtrabackup --version
[root@myoracle local]#yum install perl-Digest-MD5 #安装依赖,要不然备份会报错

五、xtrabackup常用参数

--user:指定连接数据库的用户名。
--password:指定连接数据库的密码。
--backup:执行备份操作。
--prepare:执行备份准备操作。
--copy-back:将备份恢复到原来的数据目录。
--datadir:指定数据目录的路径。
--target-dir:指定备份文件存储目录。
--incremental:执行增量备份操作。
--incremental-lsn:指定增量备份的LSN号。
--tables:仅备份特定的表。
--databases:仅备份特定的数据库。
--compress:压缩备份文件。#开启备份压缩,根据数据内容不同,压缩比可以在50%~60%
--stream=xbstream #开启流式备份,备份出来的数据输出到stdout
--remote-host=user@ip DST_DIR #备份到远程主机

六、备份

新建备份目录
[root@mysql ~]# mkdir -p /data/backup
[root@mysql ~]# chown -R mysql:mysql /data/backup/
新增测试数据
root@localhost:(none)>CREATE DATABASE test;
root@localhost:test>use test;
root@localhost:test>drop table if exists test;
root@localhost:test>CREATE TABLE test ( id int NOT NULL AUTO_INCREMENT PRIMARY KEY comment '自增主键',
dept tinyint not null comment '部门id', 
age tinyint not null comment '年龄', 
name varchar(30) comment '用户名称', 
create_time datetime not null comment '注册时间',
last_login_time datetime comment '最后登录时间' 
) comment '测试表';
root@localhost:test>insert into test values(1,1, 25, 'zhangsan', '2024-09-01 00:00:00', '2024-09-01 12:00:00');
root@localhost:test>set @i=1;
root@localhost:test>insert into test(dept, age, name, create_time, last_login_time) select left(rand()*10,1) as dept, 
FLOOR(20+RAND() *(50 - 20 + 1)) as age, concat('user_',@i:=@i+1),   
date_add(create_time,interval +@i*cast(rand()*100 as signed) SECOND),     
date_add(date_add(create_time,interval +@i*cast(rand()*100 as signed) SECOND), interval + cast(rand()*1000000 as signed) SECOND) from test;
root@localhost:test>select count(1) from test;
root@localhost:test>create index idx_dept on test(dept);create index idx_create_time on test(create_time);
root@localhost:test>create index idx_last_login_time on test(last_login_time);


以上步骤准备继续后,开始全量备份。

(一)全量备份
赋予备份的权限
root@localhost:(none)>grant BACKUP_ADMIN on *.* to 'root'@'%';
root@localhost:(none)>FLUSH PRIVILEGES;
开始全备
[root@mysql backup]# xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/data/backup/db_`date +%F`   --user=root --password=123456 --socket=/tmp/mysql.sock  >/data/backup/db_full_`date +%F`.log 2>&1

(二)增量备份
新增数据
root@localhost:test>set @i=1;
root@localhost:test>insert into test(dept, age, name, create_time, last_login_time) select left(rand()*10,1) as dept, 
FLOOR(20+RAND() *(50 - 20 + 1)) as age, concat('user_',@i:=@i+1),   
date_add(create_time,interval +@i*cast(rand()*100 as signed) SECOND),     
date_add(date_add(create_time,interval +@i*cast(rand()*100 as signed) SECOND), interval + cast(rand()*1000000 as signed) SECOND) from test;
root@localhost:test>select count(1) from test;

开始增量备份

新建增量备份目录
[root@mysql ~]# mkdir -p /data/backup/incremental

[root@mysql ~]# xtrabackup --defaults-file=/etc/my.cnf --user=root --password=123456 --no-lock --backup --socket=/tmp/mysql.sock --target-dir=/data/backup/incremental --incremental-basedir=/data/backup/db_`date +%F`



注:–incremental-basedir 首次增量备份,就指定全量备份路径。如果是第二次增量备份,就指定第一次增量备份路径。
再次插入数据

root@localhost:test>set @i=1;
root@localhost:test>insert into test(dept, age, name, create_time, last_login_time) select left(rand()*10,1) as dept, 
FLOOR(20+RAND() *(50 - 20 + 1)) as age, concat('user_',@i:=@i+1),   
date_add(create_time,interval +@i*cast(rand()*100 as signed) SECOND),     
date_add(date_add(create_time,interval +@i*cast(rand()*100 as signed) SECOND), interval + cast(rand()*1000000 as signed) SECOND) from test;
root@localhost:test>select count(1) from test;

新建增量备份的目录并进行备份

[root@mysql incremental]# mkdir -p /data/backup/incremental2
[root@mysql incremental]# xtrabackup --defaults-file=/etc/my.cnf --user=root --password=123456 --no-lock --backup --socket=/tmp/mysql.sock --target-dir=/data/backup/incremental2 --incremental-basedir=/data/backup/incremental


六、恢复

(一)全量恢复

生成恢复的前提是建立空目录,并赋予一定的权限。这里我们演示删掉数据盘进行恢复。

root@localhost:test>show variables like 'datadir';
[root@mysql ~]# mv /data/mysql/ /data/mysql.bak
[root@mysql incremental2]# xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/data/backup/db_2024-09-22 #备份文件一致性检查

[root@mysql incremental2]#xtrabackup --defaults-file=/etc/my.cnf --copy-back --target-dir=/data/backup/db_2024-09-22 #将备份文件从restore_dir拷贝到work_dir目录


给恢复的数据目录赋予mysql权限

[root@mysql data]# chown -R mysql.mysql mysql


启动数据库

[root@mysql data]# ps -ef|grep mysql
[root@mysql data]# service mysql start #如果起不来,需要杀掉之前的进程。


验证数据

root@localhost:(none)>use test;
root@localhost:test>select count(1) from test;

(二)使用binlog恢复数据
[root@mysql db_2024-09-22]# cat xtrabackup_binlog_info
mysql-bin.000005	197	5c4a9483-781b-11ef-84a6-000c29f8db3f:1-17

[root@mysql db_2024-09-22]# mysqlbinlog -vv --start-position=197 /data/mysql.bak/mysql-bin.000005 > recoverdata.sql
root@localhost:(none)>source /data/backup/db_2024-09-22/recoverdata.sql
root@localhost:test>select count(1) from test;

(三)利用增量备份数据恢复
[root@mysql db_2024-09-22]# xtrabackup --prepare --apply-log-only --target-dir=/data/backup/db_2024-09-22 #准备数据

[root@mysql db_2024-09-22]# xtrabackup --prepare --apply-log-only --target-dir=/data/backup/db_2024-09-22 --incremental-dir=/data/backup/incremental ## 把增量备份的数据合并到完整备份里面

[root@mysql db_2024-09-22]#xtrabackup --defaults-file=/etc/my.cnf --user=root --password=123456 --prepare --target-dir=/data/backup/db_2024-09-22 #备份文件一致性检查
[root@mysql db_2024-09-22]#xtrabackup --defaults-file=/etc/my.cnf --user=root --password=123456 --copy-back --target-dir=/data/backup/db_2024-09-22 # 恢复数据


修改权限,启动

[root@mysql data]# chown -R mysql.mysql mysql
[root@mysql data]# service mysql start


验证数据

root@localhost:(none)>use test;
root@localhost:test>select count(1) from test;

七、总结

这篇文章就先这样,主要讲述如何安装和备份恢复。后面继续做基于时间点的恢复。

欢迎关注公众号《小周的数据库进阶之路》,更多精彩知识和干货尽在其中。
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值