xtarbackup 简单恢复
Posted john5yang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了xtarbackup 简单恢复相关的知识,希望对你有一定的参考价值。
-
xtrbackup
-
Xtrabackup安装
#下载epel源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
#安装依赖
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-mysql
#下载Xtrabackup
-
物理备份(Xtrabackup)
备份方式(是物理备份可以理解为拷贝数据文件,深层理解是备份数据页)
-
对于非innodb表(比如myisam)是直接锁表cp数据文件,属于一种温备。
-
对于innodb的表(支持事务),不锁表,cp数据页最终以数据文件方式保存下来,并且把redo和undo一并备走,属于热备方式。
-
备份时读取配置文件/etc/my.cnf
-
全量备份
#全备
[[email protected] data]# innobackupex --user=root --password=123 /backup
#避免时间戳,自定义路径名
[[email protected] ~]# innobackupex --user=root --password=123 --no-timestamp /backup/full
#查看备份路径中的内容
[[email protected]01 backup]# ll /backup/full
#记录binlog文件名和binlog的位置点
-rw-r----- 1 root root 21 Aug 16 06:23 xtrabackup_binlog_info
#备份时刻,立即将已经commit过的内存中的数据页刷新到磁盘
#备份时刻有可能会有其他数据写入,已备走的数据文件就不会再发生变化了
#在备份过程中,备份软件会一直监控着redo和undo,一旦有变化会将日志一并备走
-rw-r----- 1 root root 117 Aug 16 06:23 xtrabackup_checkpoints
#备份汇总信息
-rw-r----- 1 root root 485 Aug 16 06:23 xtrabackup_info
#备份的redo文件
-rw-r----- 1 root root 2560 Aug 16 06:23 xtrabackup_logfile
-
全备恢复过程模拟
-
备份
-
innobackupex --user=root --password=123 --no-timestamp /backup/full
-
恢复备份
前提1:被恢复的目录是空的
前提2:被恢复的数据库的实例是关闭的
-
准备备份
将redo进行重做,已提交的写到数据文件,未提交的使用undo回滚,模拟CSR的过程
[[email protected] full]# innobackupex --user=root --password=123 --apply-log /backup/full
-
恢复备份
[[email protected] mysql]# innobackupex --copy-back /backup/full
-
#授权
[[email protected] mysql]# chown -R mysql.mysql /application/mysql/data/
-
#启动MySQL
[[email protected] mysql]# /etc/init.d/mysqld start
-
增量备份及恢复
-
案例模拟
-
周日全备
-
[[email protected] backup]#innobackupex --user=root --password=123 --no-timestamp /bakcup/full
所有的全备增量备份之间,都要有联系的,都能组合到一起,必须是严丝合缝的一个号不能差
[[email protected] ~]#cat /backup/full/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0 #全备from_lsn都是从0开始
to_lsn = 649294557 #只要有数据变化这个号就会变 有了64.....个操作
last_lsn = 649294557
compact = 0
recover_binlog_info = 0
-
模拟数据变化
mysql> use world;
mysql> create table city1 select * from city;
-
开始周1的增量备份, 基于全备,(差异备份和增量备份第一次都是基于全量备份)
参数说明:
--incremental:打开增量备份开关
--incremental-basedir:基于哪次备份,进行增量备份 写上一次备份的路径就行
[[email protected] ~]#innobackupex --user=root --password=oldboy123 --no-timestamp --incremental --incremental-basedir=/backup/full /backup/inc1
[[email protected] ~]#cat /backup/full/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 788066534
last_lsn = 788066534
compact = 0
recover_binlog_info = 0
[[email protected] ~]#cat /backup/inc1/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 788066534
to_lsn = 788625806
last_lsn = 788625806
compact = 0
recover_binlog_info = 0
-
再次模式数据变化
mysql> use world;
mysql> create table city2 select * from city;
-
周2进行增量备份
[[email protected] ~]#innobackupex --user=root --password=oldboy123 --no-timestamp --incremental --incremental-basedir=/backup/inc1 /backup/inc2
[[email protected] ~]#cat /backup/full/xtrabackup_checkpoints /backup/inc1/xtrabackup_checkpoints /b
ackup/inc2//xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 788066534
last_lsn = 788066534
compact = 0
recover_binlog_info = 0
--------------------------------------------------------------
backup_type = incremental
from_lsn = 788066534
to_lsn = 788625806
last_lsn = 788625806
compact = 0
recover_binlog_info = 0
--------------------------------------------------------------
backup_type = incremental
from_lsn = 788625806
to_lsn = 789184862
last_lsn = 789184862
compact = 0
recover_binlog_info = 0
-
故障模拟
把data目录全删除
[[email protected] ~]# rm -fr /application/mysql/data/*
[[email protected] data]#pkill mysqld
-
恢复数据
注意事项:
1 增量备份是不能直接恢复使用,必须要把所有增量合并到同一个全备中,最后进行一次恢复,会读ch文件自动的接到一起, 才能恢复增量(不像别的产品,恢复增量要依次恢复增量),
2 在合并过程中,顺便进行备份的准备,(apply-log),在准备过程中,只有最后一次合并增量redo和undo都应用,中间合并过程只应用redo,只进行前滚,不做回滚,防止lsn号接不上
-
第一步: 全备准备(只对redo进行应用,前滚)
-
为了to_lsn(数据号)追上last_lsn(redo号)变成相同的
[[email protected] ~]# innobackupex --apply-log --redo-only /backup/full/
-
第二步:第一次增量合并到全备
合并inc1合并到full中,并且apply-log,只应用redo,不应用undo
--incremental-dir=/backup/inc1 --incremental-dir 指定要合并的增量备份路径
[[email protected] ~]#innobackupex --user=root --password=oldboy123 --apply-log --redo-only --incremental-dir=/backup/inc1 /backup/full
-
验证
查看lsn full的last_lsn的值= inc1 last_lsn的值,证明 全量备份中已经包含了inc1了
[[email protected] ~]#cat /backup/full/xtrabackup_checkpoints
backup_type = log-applied
from_lsn = 0
to_lsn = 788625806
last_lsn = 788625806
compact = 0
recover_binlog_info = 0
[[email protected] ~]#cat /backup/inc1/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 788066534
to_lsn = 788625806
last_lsn = 788625806
compact = 0
recover_binlog_info = 0
-
第三步: 第二次增量备份合并到全备
合并inc2合并到full中,redo和undo都应用
[[email protected] ~]#innobackupex --apply-log --incremental-dir=/backup/inc2 /backup/full
-
验证 inc2 和full
inc2 的laset_lsn号和full的号相同,证明合并成功,
[[email protected] ~]#cat /backup/inc2/xtrabackup_checkpoints /backup/full/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 788625806
to_lsn = 789184862
last_lsn = 789184862
compact = 0
recover_binlog_info = 0
backup_type = full-prepared
from_lsn = 0
to_lsn = 789184862
last_lsn = 789184862
compact = 0
recover_binlog_info = 0
-
第四步:最后一次进行备份准备
整体full执行apply-log,redo和undo都应用
[[email protected] mysql]# innobackupex --apply-log /backup/full/
-
copy-back
[[email protected] ~]# innobackupex --copy-back /backup/full/
[[email protected] ~]# chown -R mysql.mysql /application/mysql/data/
[[email protected] ~]# /etc/init.d/mysqld start
以上是关于xtarbackup 简单恢复的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server数据库的三种恢复模式:简单恢复模式完整恢复模式和大容量日志恢复模式