MySQL의 물리적 백업 도구 -xtrabackup

설치

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 libev
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm
yum install -y percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm

백업 - 물리적 백업

(1) 비 - 디비 테이블 (예를 들면의 MyISAM 등)의 경우, 로크 테이블 CP 데이터 파일, 따뜻한 대기에 속한다.

(트랜잭션) (2) 테이블 디비가 로크 테이블 아니다가 함께 리두 부분 및 취소 준비된 걷고, 데이터 페이지, 결국 파일 방식의 아래에 저장되어있는 데이터를 복사, 핫 스탠바이 모드에 속한다.

백업 및 복구 과정에서 xtrabackup InnoDB의 테이블

LSN의이 시간에 (1) xtrabackup 백업 즉시 CKPT 트리거링, 즉시 실행, 메모리에서 더티 페이지 제출 된 데이터는 디스크로, 기록 번호

(2) 백업 사본 디스크 데이터 페이지 및 기록은 백업 다시 실행 중에 생성 및 실행 취소, 즉 함께 이동 체크 포인트 LSN 후 로그인 복사

(3) 다시 시작 시뮬레이션 전에 "자동 복구"프로세스 이노 디비, 리두는 (롤 포워드)을 적용하고 실행 취소 (롤백)

(4) 재생 처리는 원래 데이터 디렉토리 CP까지 돌아

innobackupex 사용

모든 장비

소켓의 위치를 ​​지정해야 /etc/my.cnf에

[client]
socket=/var/lib/mysql/mysql.sock
innobackupex --user=root --password=Klvchen_123  /data/backup

완전히 사용자 정의 백업 경로 이름

innobackupex --user=root --password=Klvchen_123 --no-timestamp /data/backup/full

다중 파일 백업은 착수

cd /data/backup/full

-rw-r----- 1 root root      104 Jan 11 23:23 xtrabackup_binlog_info
-rw-r----- 1 root root      113 Jan 11 23:23 xtrabackup_checkpoints
-rw-r----- 1 root root      598 Jan 11 23:23 xtrabackup_info
-rw-r----- 1 root root     2560 Jan 11 23:23 xtrabackup_logfile

cat xtrabackup_binlog_info 
mysql-bin.000005        234     e4b4a809-3445-11ea-abe9-00155d1f4002:1-7,f10baaa9-3446-11ea-ba25-00155d1f4002:1-2
# 记录的是备份时刻,binlog的文件名字和当时的结束的position,可以用来作为截取binlog时的起点。

cat xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0                           # 上次所到达的LSN号(对于全备就是从0开始,对于增量有别的显示方法)
to_lsn = 4072216                       # 备份开始时间(ckpt)点数据页的LSN 
last_lsn = 4072225                     # 备份开始时间(ckpt)点数据页的LSN 
compact = 0
recover_binlog_info = 0
(1) 备份时刻,立即将已经commit过的,内存中的数据页刷新到磁盘(CKPT).开始备份数据,数据文件的LSN会停留在to_lsn位置。
(2) 备份时刻有可能会有其他的数据写入,已备走的数据文件就不会再发生变化了。
(3) 在备份过程中,备份软件会一直监控着redo的undo,如果一旦有变化会将日志也一并备走,并记录LSN到last_lsn。
从to_lsn  ----》last_lsn 就是,备份过程中产生的数据变化。


cat xtrabackup_info
uuid = 55504fc5-3486-11ea-a184-00155d1f4002
name = 
tool_name = innobackupex
tool_command = --user=root --password=... --no-timestamp /data/backup/full
tool_version = 2.4.4
ibbackup_version = 2.4.4
server_version = 5.7.28-log
start_time = 2020-01-11 23:23:20
end_time = 2020-01-11 23:23:34
lock_time = 0
binlog_pos = filename 'mysql-bin.000005', position '234', GTID of the last change 'e4b4a809-3445-11ea-abe9-00155d1f4002:1-7,
f10baaa9-3446-11ea-ba25-00155d1f4002:1-2'
innodb_from_lsn = 0
innodb_to_lsn = 4072216
partial = N
incremental = N
format = file
compact = N
compressed = N
encrypted = N

# 备份的重做日志文件
file xtrabackup_logfile 
xtrabackup_logfile: data

풍부한 복원

# 将redo进行重做,已提交的写到数据文件,未提交的使用undo回滚掉。模拟了CSR的过程
innobackupex --apply-log  /data/backup/full

# 停止 mysql ,删除 data目录
pkill mysql
rm -rf /var/lib/mysql

# 拷贝目录
cp -rf /data/backup/full /var/lib/mysql
chown -R mysql.mysql /var/lib/mysql

# 启动
systemctl start mysqld

innobackupex 증분 백업 (증분)

마지막 증분 백업을 기반 (1) 증분 백업 모드.

(2) 증분 백업은 개별적으로 복원 될 수 없다. 그것은 전체 복구 장비를 기반으로해야합니다.

순서에 따라, (3) 모든 단위는 모든 장치에 통합되어야한다.

아날로그 데이터 변경 (전에 모든 장비)

create database klvchen;
use klvchen;
create table t1 (id int);
insert into t1 values(1),(2),(3);

모든 장비

innobackupex --user=root --password=Klvchen_123 --no-timestamp /data/backup/full

제 아날로그 데이터 일

use klvchen;
create table t2 (id int);
insert into t2 values(1),(2),(3);

증분 백업의 첫 번째 날

innobackupex --user=root --password=Klvchen_123 --no-timestamp --incremental --incremental-basedir=/data/backup/full  /data/backup/inc1

다음날 시뮬레이션 데이터

use klvchen;
create table t3 (id int);
insert into t3 values(1),(2),(3);

다음 증분 백업

innobackupex --user=root --password=Klvchen_123 --no-timestamp --incremental --incremental-basedir=/data/backup/inc1  /data/backup/inc2

셋째 날 시뮬레이션 데이터에

use klvchen;
create table t4 (id int);
insert into t4 values(1),(2),(3);

# 误删数据库 klvchen
drop database klvchen;

수요일 오류 드롭 전의 상태로 데이터를 복원합니다

恢复思路:
1. 增量不能单独恢复
2. 增量必须按照顺序合并到全备(LSN号码)
3. 所有备份都必须要 --apply-log 进行整理备份
4. 部分备份需要只 redo 不 undo (--redo-only)

합병 이전 없음 전체 마무리 장비 (--redo 전용)

innobackupex --apply-log --redo-only /data/backup/full/

전체 통합 INC1에 증분 백업과 결합

innobackupex --apply-log --redo-only --incremental-dir=/data/backup/inc1 /data/backup/full/

전체 통합 inc2에 증분 백업과 결합

innobackupex --apply-log --incremental-dir=/data/backup/inc2 /data/backup/full/

마지막 전체 백업을 마무리

innobackupex --apply-log  /data/backup/full

바이너리 로그 차단

# 判断起点
cat /data/backup/inc2/xtrabackup_binlog_info 
mysql-bin.000002        2455    512c7182-354a-11ea-9aa0-00155d1f4002:1-9

# 判断终点
show binlog events in 'mysql-bin.000002';

# 截取 drop 之前的 binlog
mysqlbinlog --skip-gtids --include-gtids='512c7182-354a-11ea-9aa0-00155d1f4002:10-11' /data/mysql-bin/mysql-bin.000002 >/data/backup/bin.sql

회복

mkdir /data/3307/data -p
cp -a /data/backup/full/* /data/3307/data/
chown -R mysql.mysql /data/3307/

# 把 /etc/my.cnf 下的 datadir 路径改为新的目录
datadir=/data/3307/data

# 重启 mysql
systemctl restart mysqld

# 恢复二进制日志
set sql_log_bin=0;
source /data/backup/bin.sql;
set sql_log_bin=1;

# 检查
mysql -uroot -pKlvchen_123 -e "show databases"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| klvchen            |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
# klvchen 数据库已经成功恢复

추천

출처www.cnblogs.com/klvchen/p/12181036.html