第二十周-day88-數(shù)據(jù)庫(kù)day10-備份恢復(fù)02

1. 上節(jié)回顧:

1.  binlog 
show master status;
oldguo[(none)]>show master status;
+------------------+----------+--------------+------------------+----------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                      |
+------------------+----------+--------------+------------------+----------------------------------------+
| mysql-bin.000013 |      194 |              |                  | 545fd699-be48-11e9-8f0a-000c2980e248:1 |
+------------------+----------+--------------+------------------+----------------------------------------+

oldguo[(none)]>show binlog events in 'mysql-bin.000012';
mysqlbinlog  --start-position=   --stop-position   /data/binlog/mysql-bin.000004 >/backup/binlog.sql

set sql_log_bin=0;
source /backup/binlog.sql;
set sql_log_bin=1;
exit

mysqlbinlog  --skip-gtids  --include-gtids='545fd699-be48-11e9-8f0a-000c2980e248:1-10' --exclude-gtids=''

2.  slowlog

3.  mysqldump
-u  -p -h -P -S 
-A  -B  
-R -E --triggers 
--master-data=2
--single-transaction 
--set-gtid-purged=OFF
--max-allowed-packet=256M
 -------- __@      __@       __@       __@      __~@      __~@
 ----- _`\<,_    _`\<,_    _`\<,_     _`\<,_    _`\<,_    _`\<,_
 ---- (*)/ (*)  (*)/ (*)  (*)/ (*)  (*)/ (*)  (*)/ (*)  (*)/ (*) 下一知識(shí)點(diǎn)

2. 企業(yè)故障恢復(fù)案例(MDP)

源文資料 [oldguo] 鏈接, ctrl+F搜索“企業(yè)故障恢復(fù)案例”

2.1 背景環(huán)境:

正在運(yùn)行的小型網(wǎng)站系統(tǒng),mysql-5.7.20 數(shù)據(jù)庫(kù)囱修,數(shù)據(jù)量 50G.
每天23:00點(diǎn)第队,計(jì)劃任務(wù)調(diào)用mysqldump執(zhí)行全備腳本

2.2 故障時(shí)間點(diǎn):

o(* ̄︶ ̄*)o 面試保持專業(yè)性,此案例面試可以說(shuō)為 故障演練

年底故障演練:模擬周三上午10點(diǎn)誤刪除數(shù)據(jù)庫(kù),并進(jìn)行恢復(fù).

2.3 恢復(fù)思路

1. 停止故障業(yè)務(wù)陈瘦,掛維護(hù)頁(yè)
2. 準(zhǔn)備測(cè)試庫(kù)癣诱,進(jìn)行全庫(kù)恢復(fù)
3. 截取從昨晚23:00的全備開(kāi)始一直到故障時(shí)刻的 binlog日志
4. 測(cè)試數(shù)據(jù)的可用性和完整性
5. 將故障數(shù)據(jù)導(dǎo)出,導(dǎo)入到生產(chǎn)環(huán)境中
6. 撤掉維護(hù)頁(yè)扫责,開(kāi)啟業(yè)務(wù)

2.4 演練過(guò)程

2.4.1 模擬數(shù)據(jù)

mysql [none]>create database mdp charset utf8mb4;
mysql [none]>use mdp;
mysql [mdp]>create table t1(id int) engine=innodb charset=utf8mb4;
mysql [mdp]>insert into t1 values(1),(2),(3);

2.4.2 模擬昨天晚上23:00的全備(命令行執(zhí)行)

mysqldump -uroot -p123456 -A -E -R --triggers --master-data=2 --single-transaction --set-gtid-purged=OFF --max-allowed-packet=256M |gzip > /backup/full_$(date +%F).sql.gz

2.4.3 模擬備份后數(shù)據(jù)變化

mysql [none]>use mdp;
mysql [mdp]>insert into t1 values(11),(12),(13);
mysql [mdp]>commit;
mysql [mdp]>select * from t1;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|   11 |
|   12 |
|   13 |
+------+

2.4.5 模擬數(shù)據(jù)損壞(可以直接刪庫(kù))

mysql [mdp]>drop database mdp;

2.4.6 恢復(fù)故障

(1) 停止故障業(yè)務(wù),掛維護(hù)頁(yè)
(此步驟略)

(2) 準(zhǔn)備備份
全備準(zhǔn)備:
[root@db01 ~]# cd /backup/
[root@db01 /backup]# gunzip full_2019-08-16.sql.gz 

binlog準(zhǔn)備:
vim full_2019-08-16.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000009', MASTER_LOG_POS=1425;


(3) 確認(rèn)日志的終點(diǎn)
mysql [mdp]>show master status;
+------------------+----------+--------------+------------------+-------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                         |
+------------------+----------+--------------+------------------+-------------------------------------------+
| mysql-bin.000009 |     1840 |              |                  | ae5de4c2-bf1e-11e9-8109-000c29c6fa61:1-21 |
+------------------+----------+--------------+------------------+-------------------------------------------+
mysql [mdp]>show binlog events in 'mysql-bin.000009';
...
| mysql-bin.000009 | 1686 | Gtid           |         6 |        1751 | SET @@SESSION.GTID_NEXT= 'ae5de4c2-bf1e-11e9-8109-000c29c6fa61:21' |
| mysql-bin.000009 | 1751 | Query          |         6 |        1840 | drop database mdp                                                  |

mysqlbinlog  --skip-gtids  --start-position=1425 --stop-position=1751 /data/binlog/mysql-bin.000009 >/backup/binlog.sql

2.4.7 進(jìn)行恢復(fù)

set sql_log_bin=0;
source /backup/full_2019-08-16.sql
source /backup/binlog.sql
set sql_log_bin=1;
mysql [mdp]>select * from t1;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|   11 |
|   12 |
|   13 |
+------+


3. XBK(Percona-Xtrabackup)-物理備份工具

軟件下載鏈接: 提取碼: ahqk

3.1安裝

安裝依賴包:
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.12/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm

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

將下載好的 Percona-Xtrabackup 安裝:
yum -y install percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm

[root@db01 ~]# rpm -qa |grep percona
percona-xtrabackup-24-2.4.12-1.el7.x86_64

3.2 介紹

物理備份工具, 類似于cp數(shù)據(jù).

3.3 備份細(xì)節(jié)

非InnoDB:例如 MyISAM逃呼,自動(dòng)鎖表備份鳖孤,會(huì)有短暫的全局鎖.

InnoDB:
  1. 立即進(jìn)行CKPT,將當(dāng)前所有的已提交事務(wù)的臟頁(yè),立即刷寫到磁盤上(to_lsn = 425544571)
  2. 拷貝所有InnoDB的數(shù)據(jù)文件,系統(tǒng)數(shù)據(jù)文件(ibdata1)也進(jìn)行拷貝.
  3. 將備份過(guò)程中產(chǎn)生的redo截取并備份走(last_lsn = 425544580).

3.4 innobackupex

3.4.1 配置操作

[root@db01 ~]# cd /backup/
[root@db01 /backup]# mkdir xbk

配置文件中添加client客戶端:
[root@db01 /backup]# vim /etc/my.cnf 
...
[client]
socket=/tmp/mysql.sock

3.4.2 全備

innobackupex --user=root --password=123456  /backup/xbk
innobackupex --user=root --password=123456  --no-timestamp  /backup/xbk/full

3.4.5 搞破壞

[root@db01 ~]# pkill mysqld
[root@db01 ~]# \rm -rf  /data/3306/data/*

3.4.5 數(shù)據(jù)恢復(fù)準(zhǔn)備(備份處理)

--apply-log 
[root@db01 /backup/xbk]# innobackupex --apply-log /backup/xbk/full/

3.4.6 恢復(fù)數(shù)據(jù)

--copy-back
[root@db01 ~]# innobackupex --copy-back   /backup/xbk/full/ 

[root@db01 /data/3306/data]# chown -R mysql.mysql /data/*

3.4.7 數(shù)據(jù)恢復(fù)成功

[root@db01 /data/3306/data]# ls
auto.cnf       gtid            ibtmp1     performance_schema  xtrabackup_binlog_pos_innodb
binlog         ib_buffer_pool  mdp        school              xtrabackup_info
db01.pid       ibdata1         mysql      sys                 xtrabackup_master_key_id
db01-slow.log  ib_logfile0     mysql.log  test
db1            ib_logfile1     oldgirl    world

3.4.8 --apply-log 參數(shù)說(shuō)明 (面試重點(diǎn)) ☆☆☆☆☆

  • 模仿了InnoDB引擎的ACSR的過(guò)程
  • 將備份集中地?cái)?shù)據(jù)和日志的LSN追平
  • 利用redo進(jìn)行前滾
  • 利用undo進(jìn)行回滾

3.5 備份集的認(rèn)識(shí)

3.5.1 備份集文件

[root@db01 /backup/xbk/full]# ll xtrabackup_*
-rw-r----- 1 root root      64 Aug 16 10:43 xtrabackup_binlog_info
-rw-r--r-- 1 root root      22 Aug 16 10:50 xtrabackup_binlog_pos_innodb
-rw-r----- 1 root root     117 Aug 16 10:50 xtrabackup_checkpoints
-rw-r----- 1 root root     561 Aug 16 10:43 xtrabackup_info
-rw-r----- 1 root root 8388608 Aug 16 10:45 xtrabackup_logfile
-rw-r--r-- 1 root root       1 Aug 16 10:50 xtrabackup_master_key_id

3.5.2 備份集文件認(rèn)識(shí)

[root@db01 /backup/xbk/full]# cat xtrabackup_binlog_info   #存儲(chǔ)的是binlog截取的起始點(diǎn)信息(position,gtid)
mysql-bin.000009    1840    ae5de4c2-bf1e-11e9-8109-000c29c6fa61:1-21

[root@db01 /backup/xbk/full]# cat xtrabackup_binlog_pos_innodb 
mysql-bin.000009    1686

[root@db01 /backup/xbk/full]# cat xtrabackup_checkpoints 
backup_type = full-prepared  #備份類型,默認(rèn)全備
from_lsn = 0            #全備中是0抡笼,增量備份時(shí)是最起始的LSN號(hào)碼
to_lsn = 425544571      #ckpt后數(shù)據(jù)頁(yè)(ibd)的LSN號(hào)碼
last_lsn = 425544580    #備份結(jié)束時(shí),redo的LSN,(在當(dāng)前5.7版本,會(huì)有9個(gè)LSN可以忽略) 
                        # to_lsn和last_lsn 差9位數(shù)字

[root@db01 /backup/xbk/full]# cat xtrabackup_info   3備份的具體參數(shù) 時(shí)間 (不敘述)

[root@db01 /backup/xbk/full]# file xtrabackup_logfile   #備份過(guò)程中的信息苏揣,不能打開(kāi)
xtrabackup_logfile: data

4.XBK增量(incremental)備份

Xtrabackup企業(yè)級(jí)增量恢復(fù)實(shí)戰(zhàn)
背景:
某大型網(wǎng)站,mysql數(shù)據(jù)庫(kù)蔫缸,數(shù)據(jù)量500G腿准,每日更新量20M-30M
備份策略:
xtrabackup,每周日23:00進(jìn)行全備,周一到周六23:00進(jìn)行增量備份吐葱。
故障場(chǎng)景:
周三下午2點(diǎn)出現(xiàn)數(shù)據(jù)庫(kù)意外刪除表操作街望。
如何恢復(fù)?

4.1 清除以往備份

[root@db01 /backup/xbk]# \rm -rf /backup/xbk/*

4.2 建庫(kù)建表

mysql [(none)]>create database xbk charset utf8mb4;
mysql [(none)]>use xbk
mysql [xbk]>create table t1(id int) engine=innodb charset=utf8mb4;

4.3 插入數(shù)據(jù)

mysql [xbk]>insert into t1 values(1),(2),(3);
mysql [xbk]>commit;

4.4 模擬周日全備

[root@db01 /backup/xbk]# innobackupex --user=root --password=123456 --no-timestamp /backup/xbk/full
[root@db01 /backup/xbk]# ll
total 0
drwxr-x--- 14 root root 336 Aug 16 13:35 full

4.5 模擬周一晚上數(shù)據(jù)變化

insert into t1 values(11),(22),(33);

4.6 模擬周一晚上增量備份


[root@db01 ~]# innobackupex --user=root --password=123456 --no-timestamp --incremental --incremental-basedir=/backup/xbk/full /backup/xbk/inc1 

--incremental        # 打開(kāi)增量備份開(kāi)關(guān)弟跑,(每一次增量都是基于上一次備份)
--incremental-basedir=/backup/xbk/full   #設(shè)定增量備份的基備份(一般是上一天)

查看備份集的關(guān)系
工作中灾前,每天檢查備份,LSN號(hào)是一個(gè)標(biāo)志點(diǎn)


4.7 模擬周二白天的數(shù)據(jù)變化

mysql [xbk]>use xbk;
mysql [xbk]>insert into t1 values(111),(222),(333);
mysql [xbk]>commit;

4.8 模擬周二晚上增量

[root@db01 ~]# innobackupex --user=root --password=123456 --no-timestamp --incremental --incremental-basedir=/backup/xbk/inc1 /backup/xbk/inc2 

4.9 模擬周三白天數(shù)據(jù)庫(kù)變化

mysql [xbk]>use xbk;
mysql [xbk]>insert into t1 values(1111),(2222),(3333);
mysql [xbk]>commit;

4.10 搞破壞

[root@db01 /backup/xbk]# pkill mysqld 
[root@db01 /backup/xbk]# \rm -rf /data/3306/data/*

4.11 恢復(fù)思路

(1) 測(cè)試庫(kù),維護(hù)頁(yè)
(2) 處理備份
    合并
    準(zhǔn)備 
(3) 截取二進(jìn)制日志
(4) 數(shù)據(jù)恢復(fù) 

4.12 開(kāi)始恢復(fù)演練

1. 處理備份: 
(1) 處理原始全備
[root@db01 ~]# innobackupex --apply-log --redo-only /backup/xbk/full/

(2) 合并周1并處理
[root@db01 ~]# innobackupex --apply-log --redo-only --incremental-dir=/backup/xbk/inc1 /backup/xbk/full

(3) 合并周2并處理
[root@db01 ~]# innobackupex --apply-log  --incremental-dir=/backup/xbk/inc2 /backup/xbk/full

(4)處理合并后的全備數(shù)據(jù)
[root@db01 ~]# innobackupex --apply-log  /backup/xbk/full/


2. 恢復(fù)備份啟動(dòng)數(shù)據(jù)庫(kù)
[root@db01 /backup/xbk/full]# cp -a /backup/xbk/full/* /data/3306/data/ 
[root@db01 /backup/xbk/full]# chown -R mysql.  /data/3306/data/ 
[root@db01 /backup/xbk/full]# /etc/init.d/mysqld start


3 截取binlog并恢復(fù)
[root@db01 /backup/xbk/inc2]# cat /backup/xbk/inc2/xtrabackup_binlog_info 
mysql-bin.000010    2490    ae5de4c2-bf1e-11e9-8109-000c29c6fa61:1-21,
e21f04e4-bfd0-11e9-b8ae-000c29c6fa61:1-10

# 進(jìn)入數(shù)據(jù)庫(kù)查看
oldguo[(none)]>show binlog events in 'mysql-bin.000010';
...
| mysql-bin.000010 | 2720 | Xid            |         6 |        2751 | COMMIT /* xid=188 */ 

#截取binlog并恢復(fù)
[root@db01 ~]# mysqlbinlog --skip-gtids --start-position=2490 --stop-position=2720 /data/binlog/mysql-bin.000010 >/backup/bin.sql

set sql_log_bin=0;
source /backup/bin.sql
set sql_log_bin=1;

oldguo[xbk]>select * from t1;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|   11 |
|   22 |
|   33 |
|  111 |
|  222 |
|  333 |
| 1111 |
| 2222 |
| 3333 |
+------+

5. 恢復(fù)數(shù)據(jù)的效率(小擴(kuò)展)

整庫(kù)數(shù)據(jù)量較大 ,但是損壞的數(shù)據(jù)很少
例如 500G數(shù)據(jù)總量, 損壞的數(shù)據(jù)是10M

  1. XBK :表空間遷移
  1. MDP :手工分析
1孟辑、獲得表結(jié)構(gòu)
# sed -e'/./{H;$!d;}' -e 'x;/CREATE TABLE `city`/!d;q'  /tmp/full.sql>createtable.sql
2哎甲、獲得INSERT INTO 語(yǔ)句,用于數(shù)據(jù)的恢復(fù)
# grep -i 'INSERT INTO `city`'  /tmp/full.sqll >data.sql

3.獲取單庫(kù)的備份
# sed -n '/^-- Current Database: `world`/,/^-- Current Database: `/p' all.sql >world.sql

6. 小擴(kuò)展: 閃回表數(shù)據(jù)(binlog閃回)

數(shù)據(jù)損壞:

  • 物理:磁盤饲嗽,raid炭玫,F(xiàn)S,ibd
  • 邏輯:drop alter delete updatae
    說(shuō)明: 根據(jù) binlog row的記錄,自動(dòng)轉(zhuǎn)化日志為逆操作,實(shí)現(xiàn)閃回的功能.
    mariadb 默認(rèn)支持
    binlogsql
    Github上的 binlogsql 開(kāi)源工具

7. 小擴(kuò)展:遷移

Oracle ,SQL Server --->  MySQL
Oracle ----OGG ---> MySQL
上云遷移,DTS

停機(jī)時(shí)間:
15分鐘

基于Oracle GoldenGate (OGG)進(jìn)行MySQL->MySQL數(shù)據(jù)庫(kù)同步配置

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末貌虾,一起剝皮案震驚了整個(gè)濱河市吞加,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌尽狠,老刑警劉巖衔憨,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異袄膏,居然都是意外死亡践图,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門沉馆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)码党,“玉大人,你說(shuō)我怎么就攤上這事悍及∶銎埃” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵心赶,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我缺猛,道長(zhǎng)缨叫,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任荔燎,我火速辦了婚禮耻姥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘有咨。我一直安慰自己琐簇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著婉商,像睡著了一般似忧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上丈秩,一...
    開(kāi)封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天盯捌,我揣著相機(jī)與錄音,去河邊找鬼蘑秽。 笑死饺著,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的肠牲。 我是一名探鬼主播幼衰,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼缀雳!你這毒婦竟也來(lái)了塑顺?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤俏险,失蹤者是張志新(化名)和其女友劉穎严拒,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體竖独,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡裤唠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了莹痢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片种蘸。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖竞膳,靈堂內(nèi)的尸體忽然破棺而出航瞭,到底是詐尸還是另有隱情,我是刑警寧澤坦辟,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布刊侯,位于F島的核電站,受9級(jí)特大地震影響锉走,放射性物質(zhì)發(fā)生泄漏滨彻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一挪蹭、第九天 我趴在偏房一處隱蔽的房頂上張望亭饵。 院中可真熱鬧,春花似錦梁厉、人聲如沸辜羊。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)八秃。三九已至碱妆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間喜德,已是汗流浹背山橄。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舍悯,地道東北人航棱。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像萌衬,于是被迫代替她去往敵國(guó)和親饮醇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356