Mysql备份恢复(xtrabackup)

备份的方案
完整/完全备份 full mysqldump

每次都将所有数据(不管自第一次备份以来有没有修改过),进行一次完整的复制

增量备份 incremental backup 每次备份都是基于上一次的时间 一天备份一次
差异备份 differential backup 从上一次完整备份开始,接下来的每一天都是从上一次完整备份开始
在公司用的最多的就是完整备份,增量备份

这三种方案,xtrabackup全部都支持。像binlog日志最适合做增量备份,因为可以在要一天结束之后开始下一天之前,先让它产生一个全新的日志文件,刷新一个全新的日志文件,开始第二天新的备份。

mysqldump里的-A就是完整备份,能不能用mysqldump做增量备份?

能做,不好做,假装有数据库,正在运行,昨天周一晚上24点已经把昨天的备份完了,不管你用什么方法,从今天凌晨0点到今天晚上24点,到24点的时候做备份这一天内的数据,很难做,不好定位时间,因为mysqldump备份的是表和库,还得去查一下,早上0点开始做了哪些操作,修改了哪个表,再去备份表里开始的位置,太难了,能做是可以,但是没有人做这种选择。

能不能用mysqldump做差异备份?

差异备份是从你上一次完整备份后的新数据,接下来的每一天都是从上一次完整备份开始,周一备份的是周一整天的,周二备份的是周一和周二的,周三备份的是周一周二周三的。但是它就是没备份周一之前的,要做完整备份它连周一之前的都备份上了,只备份周二的,拿mysqldump不好做,太难了。就周一周二的。

所以mysqldump不适合做差异备份和增量备份。它适合做完整备份。(表的备份,库的备份)

到了公司会做出选择,像mysqldump最爽,方便简单,缺点就是慢。

完整备份流程

首先创建备份目录: 在哪创建都行,

创建备份目录:

[root@k full]# mkdir -pv /xtrabackup/full

备份:

[root@k full]# innobackupex --user=root --password='Helloworld123!@' /xtrabackup/full

(innobackupex这个命令可以补全不需要提前做环境变量)/xtrabackup/full(备份的目录)

 它在指定的目录下创建了一个目录。 ls查看多了一个目录,备份的文件就在那里。

 一般情况下做备份的时候不关闭数据库,让数据库同时给客户端可以提供服务,只不过会影响客户端的访问,因为它在操作文件的同时,可能会把操作的表稍微锁一下,等拷完之后再把锁打开,但是恢复数据的时候肯定要把数据库先关掉。

什么情况下才会恢复一个完整的备份?

数据库已经不能用增量备份,差异备份恢复数据了,它坏的已经不能用了。现在有一台全新的数据库,全新的环境,只需要把数据恢复回去就行。

可以换台全新的服务器,把备份目录打个包拷过去再解压,再恢复。这样就不需要,停止数据库 ,清理环境这两步了。

完整备份恢复流程

1. 先停止数据库 systemctl stop mysqld

2. 清理环境 (清配置文件,数据目录,日志文件。)要想清理配置文件,最好做个备份,等恢复回来再拷贝过来 

3. 重演回滚--> 恢复数据

4. 修改权限

5. 启动数据库

关闭数据库

# systemctl stop mysqld  停止数据库,如果报错关了防火墙再看 

# rm -rf /var/lib/mysql/*   删除存储数据的目录,清库

# rm -rf /var/log/mysqld.log   删除日志文件

# rm -rf /var/log/mysql-slow/slow.log  删除慢查询日志

恢复之前的验证恢复 

# innobackupex --apply-log /xtrabackup/full/2022-09-06_11-19-07// 就是把备份的东西全都记录一下,(模拟的不会真正的恢复数据)--apply-log +备份的目录

确认数据库目录

已经把测试做好了,感觉没什么问题,但我要把数据恢复到哪个目录下,配置文件下可以改这个目录,恢复之前需要确认配置文件内有数据库目录指定,不然xtrabackup不知道恢复到哪里

vim  /etc/my.cnf

[mysqld]

datadir=/var/lib/mysql   

 恢复数据

# innobackupex --copy-back /xtrabackup/full/2022-09-06_11-19-07/

 copy-back后面跟目录

修改权限

# chown mysql.mysql /var/lib/mysql -R

这个文件是从别处拷过来的,文件的权限全部都是root所有,需要把所有者所有组都改成mysql。

启动数据库:  

# systemctl start mysqld

 登进去mysql看看自己创建的库和mysql库还在不在,其他的没了换一个就行。

增量备份流程

原理:每次备份上一次备份到现在产生的新数据(不管和上一次备份隔了多长时间,都是增量)

准备测试库和表:假如今天是周一,

 创建了一个新库,新库里面创建了一张新表,新表里添加了一些新的记录,产生了一些全新的数据。增量备份就是备份这些全新的数据。

假如周一结束了,我开始做备份,

先做一个完整备份:周一

innobackupex --user=root --password='(Helloworld123)' /xtrabackup

做完完整备份,cd到/xtrabackup,观察一下

增量备份:周二 —— 周六 让它产生一些新的数据,

到周二了,先让它产生一些新的数据,mysql连接进去

 innobackupex --user=root --password='(Helloworld123)' --incremental /xtrabackup --incremental-basedir=/xtrabackup/2022-09-06_11-43-33

 incremental /xtrabackup(增量备份数据存储的位置)

incremental-basedir (基准目录)因为每一次增量备份是基于上一次完整备份,或者是增量备份,上一次还没有增量,上一次是完整备份,所以这里是上一次完整备份的目录。

现在是模拟的一整天,真的想模拟一整天应该改时间 9.7号下一次备份改到9.8  现在改不改没什么太大关系,有分钟有秒。现在再要做备份把上面那条命令改一改。基于上一次增量备份

备完之后,观察一下

第一次增量备份备完了,再插入新的数据,又开始产生新的数据,又过了一天,又要开始做增量备份,接下来的过程都是这,一直持续一周,持续到周六,周六做完那一天的增量备份之后,我又开始做完整备份,就是一个轮回。

 如果现在再做增量备份,要把上一条命令改一下

 基于上一次增量备份

 接下来就一直重复。备份就一直持续下去,过了几天数据库坏了,得恢复数据

看想恢复哪一天的数据,比如前两天的数据坏了,先恢复倒数第二天再恢复倒数第一天的

如果前面的数据这几天的数据都挂了,要恢复最前面的再恢复倒数第二的,不能从最近的恢复

增量备份恢复流程

1. 停止数据库

2. 清理环境

3. 依次重演回滚redo log--> 恢复数据

4. 修改权限

5. 启动数据库

6. binlog恢复 (今天这一天还没过完,今天的增量备份还没有做,如果没启用binlog,那我从上一次增量备份结束到现在这几个小时的数据就丢了)所以平时就算用xtrabackup,还得把binlog启动起来。

增量备份每天的固定的时间点,24小时过完了,开始做增量备份,备份上面24个小时的,但是在24小时中间数据库坏了,中间12小时还没有做数据备份。这里就丢了,这里就是第六步binlog恢复,和上一期讲的是一样的,找到开始的位置从早上0点,到最后结束,恢复就完了。

清理环境

 指定自己完整备份的目录

 第一次增量和完整备份合到一起了。

 改时间

 假如还有第三次,第四次,每一次都要在这儿给它合一次,前面的步骤不变,前面永远都是我的第一次完整备份的目录。

恢复数据

# innobackupex --copy-back /xtrabackup/2022-09-06_11-43-33/

 检查一下恢复没有

 但是权限都是root

 chown -R mysql.mysql /var/lib/mysql     -R 递归  这里面所有的文件所有的目录都修改

# systemctl start mysqld   启动服务

mysql去访问一下,最好去查一下表

 差异备份流程

增量备份和差异备份的区别:

增量备份每次备份都是基于上一次的结尾开始的,上一次结束的时间。差异备份每次都是从最后一次完整备份开始。

1、完整备份:周一

create database testdb;

use testdb;

create table test2(id int);

insert into test values(1);

select * from test;

创建了一个新库,新库里面创建了一张新表,新表里添加了一些新的记录,产生了一些全新的数据。做完整备份innobackupex --user=root --password=888 /xtrabackup

2.差异备份:周二 —— 周六

insert into testdb.test2 values(2);

# innobackupex --user=root --password=888 --incremental /xtrabackup --incremental-basedir=/xtrabackup/完全备份目录(周一) 第一次差异备份,指定一下备份到哪个地方去,基准目录每次都是完整备份的目录

insert into testdb.test2 values(3); 在每一次差异备份之前,需要先插入点新数据

# innobackupex --user=root --password=888 --incremental /xtrabackup --incremental-basedir=/xtrabackup/完全备份目录(周二)

insert into testdb.test values(4);

# innobackupex --user=root --password=888 --incremental /xtrabackup --incremental-basedir=/xtrabackup/完全备份目录(周三)

差异备份恢复流程

1. 停止数据库

2. 清理环境

3. 重演回滚redo log(周一,某次差异)--> 恢复数据

4. 修改权限

5. 启动数据库

6. binlog恢复

1.恢复全量的redo log

指定一下完备目录,先恢复完备目录

# innobackupex --apply-log --redo-only /xtrabackup/完全备份目录(周一)

2.恢复差异的redo log

恢复差异,第一个目录还是完备目录,第二个目录直接指定一个,恢复到哪一天,就指定哪一天的目录就完了。

# innobackupex --apply-log --redo-only /xtrabackup/完全备份目录(周一)--incremental-dir=/xtrabacku/   

想恢复到哪里就指定哪个就行,不用有那么多次的恢复了,就两次恢复,第一次恢复完备,完备之后,想恢复到哪就指定一个目录就行。

其实像差异备份也是把指定的那一天前面到完整备份之前所有的东西和完整备份合在了一起。一样的原理。

3.复制数据文件(cp,rsync),修改权限

备份数据肯定是备份到远程机器或移动硬盘,哪天想恢复了,得把它拷回来(cp,rsync)但是得用这条指令innobackupex --copy-back /xtrabackup/给它恢复数据(copy-back)。

4.启动mysqld

改权限,start

5.通过binlog增量恢复

(今天这一天还没过完,今天的增量备份还没有做,如果没启用binlog,那我从上一次增量备份结束到现在这几个小时的数据就丢了)所以平时就算用xtrabackup,还得把binlog启动起来。

总之,这三种方式,都需要用binlog去恢复最后的小数据。

猜你喜欢

转载自blog.csdn.net/weixin_53150440/article/details/127184823