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
停机时间: