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可以忽略)
<to_lsn,last_lsn相差9个说明备份过程中没有发生数据>
[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
停机时间:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容