MySQL备份恢复(Percona-Xtrabackup)-物理备份

1. Percona-Xtrabackup-物理备份

1.1 安装依赖包

percona-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
下载软件并安装
yum -y install percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm

>>报错缺少依赖需要安装以下包
yum install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perl-Digest-MD5

1.2. 介绍

物理备份工具,类似于cp数据

1.3 备份细节

非InnoDB:例如:MyISAM,自动锁表备份,会有短暂的全局锁
InnoDB:

  • 立即进行CKPT,将当前所有的已提交事务的脏页,立即刷写到磁盘上
  • 拷贝所有InnoDB的数据文件,系统数据文件野进行拷贝。
  • 将备份过程中产生的redo截取并备份走
  • 记录各个时间点的LSN号

1.4 innobackupex程序使用

>> (1)修改配置文件
vim /etc/my.cnf
[client]
socket=/tmp/mysql.sock          指定socket文件

>> (2)备份命令
[root@db01 xbk]$ innobackupex --user=root --password=wangxin /backup/xbk

>> (3)备份好的目录(默认以时间命名备份目录)
[root@db01 xbk]$ ll
total 4
drwxr-x---  2 root root    6 Aug 16 10:30 2019-08-16_10-30-47
drwxr-x---  2 root root    6 Aug 16 10:33 2019-08-16_10-33-57
drwxr-x---  2 root root    6 Aug 16 10:34 2019-08-16_10-34-04
drwxr-x--- 15 root root 4096 Aug 16 10:34 2019-08-16_10-34-44

>> (4)指定目录参数(--no-timestamp)
[root@db01 xbk]$ innobackupex --user=root --password=wangxin --no-timestamp /backup/xbk/full
[root@db01 xbk]$ ll
drwxr-x--- 15 root root 4096 Aug 16 10:37 full

>> (5)搞破坏试验
[root@db01 xbk]$ \rm -rf /data/3306/data/*

>> (6)数据恢复准备(备份处理参数--apply-log)
[root@db01 xbk]$ innobackupex --apply-log /backup/xbk/full

>> (7)数据恢复(--copy--back(依赖于/etc/my.cnf的[mysqld]配置))
[root@db01 xbk]$ innobackupex --copy-back /backup/xbk/full/
190816 10:51:40 [01] Copying ./xtrabackup_master_key_id to /data/3306/data/xtrabackup_master_key_id
190816 10:51:40 [01]        ...done
190816 10:51:40 [01] Copying ./ibtmp1 to /data/3306/data/ibtmp1
190816 10:51:40 [01]        ...done
190816 10:51:40 completed OK!
>> (8)修改恢复的目录权限
[root@db01 xbk]$ chown -R mysql:mysql /data/3306/data
[root@db01 xbk]$ systemctl restart mysqld

1.4 innobackupex程序使用

1.4.1 --apply-log参数说明

模仿了InnoDB引擎的ACSR过程
将备份集中的数据和日志的LSN追评
利用redo进行前滚
利用undo进行回滚

--redo-only仅仅前滚,不回滚,所有增量合并处理的时候需要这个参数,只有最后一次增量和并的时候不需要使用这个参数

1.4.2 备份集的文件认识
[root@db01 full]$ cat xtrabackup_binlog_info    存储的是binlog截取的起始点信息(posotion和gtid)
mysql-bin.000012    194 c4e0cd26-b75c-11e9-b4d8-000c2992bac2:1-242

[root@db01 full]$ cat xtrabackup_checkpoints    备份的LSN
>>重点关注:
backup_type = full-prepared              备份类型(全备是full)
from_lsn = 0                             整个备份中起始的LSN
to_lsn = 286553694                       CKPT后数据页(IBD)LSN
last_lsn = 286553703                     备份结束时,redo的LSN(在当前57.版本会有9个LSN可以忽略)

[root@db01 full]$ cat xtrabackup_binlog_info 
mysql-bin.000012    194 c4e0cd26-b75c-11e9-b4d8-000c2992bac2:1-242    记录了备份的产品版本时间
xtrabackup_logfile                             备份自己的信息

2. XBK增量(incremental)备份

>> (1)清除以往的备份
[root@db01 backup]$ cd xbk/

>> (2)模拟数据
mysql[(none)]>create database xbk charset utf8mb4;
Query OK, 1 row affected (0.00 sec)
mysql[(none)]>use xbk;
Database changed
mysql[xbk]>create table t1(id int) engine=innodb charset=utf8mb4;
Query OK, 0 rows affected (0.02 sec)
mysql[xbk]>insert into t1 values(1),(2),(3);
Query OK, 3 rows affected (0.03 sec)
mysql[xbk]>commit;
Query OK, 0 rows affected (0.00 sec)

>> (3)进行全备
[root@db01 data]$ innobackupex --user=root --password=wangxin --no-timestamp /backup/xbk/full

>> (4)模拟周一的数据变化
mysql[xbk]>insert into t1 values(11),(22),(33);
Query OK, 3 rows affected (0.35 sec)
Records: 3  Duplicates: 0  Warnings: 0
mysql[xbk]>commit;
Query OK, 0 rows affected (0.02 sec)

>> (5)模拟周一晚上增量备份
[root@db01 data]$ innobackupex --user=root --password=wangxin --no-timestamp --incremental --incremental-basedir=/backup/xbk/full /backup/xbk/inc1
--incremental                            打开增量备份
--incremental-basedir=/backup/xbk/full   设定增量备份的基备份(一般是上一次)

>> (6)检查备份(第二天的from_lsn=第一天的last_lsn减去9)
[root@db01 xbk]$ cat full/xtrabackup_checkpoints 
backup_type = full-backuped
from_lsn = 0
to_lsn = 286560167
last_lsn = 286560176
compact = 0
recover_binlog_info = 0
[root@db01 xbk]$ cat inc1/xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 286560167
to_lsn = 286562161
last_lsn = 286562170
compact = 0
recover_binlog_info = 0

>> (7)模拟周二白天数据变化和增量备份以及检查
mysql[xbk]>insert into t1 values(111),(222),(333);
Query OK, 3 rows affected (0.10 sec)
Records: 3  Duplicates: 0  Warnings: 0
mysql[xbk]>commit;
Query OK, 0 rows affected (0.00 sec)
[root@db01 data]$ innobackupex --user=root --password=wangxin --no-timestamp --incremental --incremental-basedir=/backup/xbk/inc1 /backup/xbk/inc2
[root@db01 xbk]$ cat inc1/xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 286560167
to_lsn = 286562161
last_lsn = 286562170
compact = 0
recover_binlog_info = 0
[root@db01 xbk]$ cat inc2/xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 286562161
to_lsn = 286564155
last_lsn = 286564164
compact = 0
recover_binlog_info = 0

>> (8)模拟周三白天数据变化和增量备份以及检查
mysql[xbk]>use xbk;
mysql[xbk]>insert into t1 values(1111),(2222),(3333);
mysql[xbk]>commit;

>> (9)破坏数据库
[root@db01 data]$ pkill mysql
[root@db01 data]$ \rm -rf /data/3306/data/

>> (10)恢复思路
(1) 测试库,维护页
(2) 处理备份
      合并
      准备
(3) 截取二进制日志
(4) 数据恢复
(11) 开始恢复演练
(1) 处理备份
--- 处理原始全备
[root@db01 data]$ innobackupex --apply-log --redo-only /backup/xbk/full
--- 合并周一处理
[root@db01 data]$ innobackupex --apply-log --redo-only --incremental-dir=/backup/xbk/inc1 /backup/xbk/full
--- 合并周二处理(最后一次增量不需要加--redo-only)
[root@db01 data]$ innobackupex --apply-log  --incremental-dir=/backup/xbk/inc2 /backup/xbk/full
--- 处理和并后全被数据
[root@db01 data]$ innobackupex --apply-log /backup/xbk/full
(2) 恢复备份,修改权限,启动数据库
[root@db01 data]$ innobackupex --copy-back /backup/xbk/full/
[root@db01 data]$ chown -R mysql:mysql /data/3306/data
[root@db01 data]$ systemctl restart mysqld
(3) 查看二进制日志文件并且恢复
查看第二天数据点结束
[root@db01 xbk]$ cat /backup/xbk/inc2/xtrabackup_binlog_info
mysql-bin.000014    1078    06073cdc-bfd1-11e9-9a47-000c2992bac2:1-5,
c4e0cd26-b75c-11e9-b4d8-000c2992bac2:1-242

mysql[(none)]>show master status;
+------------------+----------+--------------+------------------+--------------------------------------------------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                                                                    |
+------------------+----------+--------------+------------------+--------------------------------------------------------------------------------------+
| mysql-bin.000016 |      234 |              |                  | 06073cdc-bfd1-11e9-9a47-000c2992bac2:1-6,
c4e0cd26-b75c-11e9-b4d8-000c2992bac2:1-242 |
+------------------+----------+--------------+------------------+--------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql[(none)]>show binlog events in 'mysql-bin.000014';
找到数据点是1600,并且恢复数据1078-1600

[root@db01 xbk]$ mysqlbinlog --skip-gtids --start-position=1078 --stop-position=1600 /data/binlog/mysql-bin.000014 > /tmp/a.sql
登录数据库
mysql[xbk]>set sql_log_bin=0;
source /tmp/a.sql
mysql[xbk]>set sql_log_bin=1;

3. XBK和MDP的恢复数据效率

整库数据量较大,但是损坏的数据很少

例如:500G数据总量,损坏数据时10M
XBK:表空间迁移
MDP:手工分析

1、获得表结构
sed -e'/./{H;$!d;}' -e 'x;/CREATE TABLE `city`/!d;q'  /tmp/full.sql>createtable.sql
2、获得INSERT INTO 语句,用于数据的恢复
grep -i 'INSERT INTO `city`'  /tmp/full.sqll >data.sql

3.获取单库的备份
sed -n '/^-- Current Database: `world`/,/^-- Current Database: `/p' all.sql >world.sql

小扩展:binlog闪回表数据
数据损坏
物理:磁盘。raid,FS,ibd
逻辑:drop,alter,delete,uptate。
说明:根据binlog row记录,自动转化日志为逆操作,实现闪回的功能。
mariadb 默认支持 :binlog2sql

2. 迁移数据库

Oracel,SQL Server ------> MySQL
Oracle ---- OGG ----> MySQL
MySQL 低版本 ---XBK,MDP-> MySQL高版本
上云迁移,DTS
停机时间:

你可能感兴趣的:(MySQL备份恢复(Percona-Xtrabackup)-物理备份)