介紹
備份策略的設(shè)計
備份周期
根據(jù)數(shù)據(jù)量做評估,一般60G數(shù)據(jù)(三四十分鐘),每天全備
備份工具
mysqldump
percona xtrabackup
mysqlbinlog
備份方式
邏輯備份
- 全備: mysqldump
- 增量: binlog
物理備份
- 全備: XBK (percona xtrabackup)
- 增量: XBK (percona xtrabackup)
檢查備份的可用性
看備份日志,和備份文件(大小宗侦,內(nèi)容)
剛?cè)ス?/p>
crontab -l 查看備份腳本和備份路徑
定期恢復(fù)演練
數(shù)據(jù)恢復(fù)
只要備份和日志是完整的颊糜,恢復(fù)到故障之前的時間點(快速)
數(shù)據(jù)遷移
MySQL -> MySQL
其他數(shù)據(jù)庫 -> MySQL
MySQL -> 其他數(shù)據(jù)庫
備份介紹
備份類型
- 熱備: 數(shù)據(jù)庫正在運行時的備份,對業(yè)務(wù)影響最性彻妗(innodb)
- 溫備: 鎖表備份,長時間鎖表(MyISAM)
- 冷備: 業(yè)務(wù)關(guān)閉情況下宙橱,進行備份
mysqldump 備份命令介紹
連接數(shù)據(jù)庫的參數(shù)
-u
-p
-S
-h
-P
基礎(chǔ)備份參數(shù)
-A 全備
-B 備份單庫或多庫(有建庫和use 庫的語句) 針對庫級別
庫名 表名 (單張表或多張表備份)針對表級別
特殊的備份參數(shù)
-R 備份存儲過程和函數(shù) (存儲過程和函數(shù)姨俩,相當(dāng)于shell中的腳步,集合了多個命令)
-E event 事件 (相當(dāng)于linux的crontab 計劃任務(wù))
--triggers 觸發(fā)器
--master-data=2
記錄了備份時刻的binlog和pos節(jié)點號
--master-data=1 使用change 語句的方式記錄binlog和pos節(jié)點
--master-data=2 使用注釋的方式記錄 binlog和pos節(jié)點
如果不加 --single-transaction ,會進行全局鎖表师郑,進行溫備
如果加--single-transaction环葵,對與Innodb進行不鎖表備份,(快照備份)宝冕,非Innodb的表進行鎖表
--single-transaction 在備份的時候张遭,會創(chuàng)建一個單獨的事務(wù)。生成一致性快照地梨。備份的時候就備份快照的數(shù)據(jù)菊卷,這個參數(shù)是基于MVCC的缔恳。快照即undo提供的洁闰,因為在事務(wù)中進行的歉甚。所以用到了undo。需要innodb的支持
擴展參數(shù)
--set-gtid-purged=auto(默認(rèn))/on 在構(gòu)建主從時添加
--set-gtid-purged=off 僅僅做普通的本機備份恢復(fù)時可以添加扑眉,在備份文件里沒有g(shù)tid信息纸泄。如果在主從時,從庫恢復(fù)文件時腰素,binlog發(fā)現(xiàn)沒有g(shù)tid信息聘裁。會重新從主庫的binlog獲得相同數(shù)據(jù)的gtid信息。
恢復(fù)案例(簡歷最多寫一個)
物理備份XBK
下載安裝
# CentOS7
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
# CentOS6
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 -y install ./percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm
innobackupex使用
備份的核心理念
- 針對非innodb表進行鎖表備份
- 針對innodb表弓千,立即觸發(fā)ckpt咧虎,copy所有innodb表相關(guān)的文件(ibdata1,ibd,.frm)底層是拷貝數(shù)據(jù)頁的。并且將備份過程中產(chǎn)生新的數(shù)據(jù)變化過程中的部分redo计呈,一起備份
- 在恢復(fù)時砰诵,XBK會調(diào)用Innodb引擎的CSR,將數(shù)據(jù)文件的LSN和redo文件中的LSN追平
恢復(fù)的過程
模擬了CSR的全過程捌显,將數(shù)據(jù)的LSN號和redo的LSN號追平茁彭,恢復(fù)的方法直接cp回去即可
XBK的全備和恢復(fù)
XBK的全備
innobackupex --user=root --password=123 --no-timestamp /backup/full
XBK的恢復(fù)
innobackupex --apply-log /backup/full
--apply-log:
實現(xiàn)了CSR的全過程,即redo的前滾扶歪,和undo的回滾
備份產(chǎn)生的文件介紹
xtrabackup_binlog_info
cat xtrabackup_binlog_info
mysql-bin.000001 154
# 存儲備份時刻的二進制信息理肺,做為binlog截取的起點
xtrabackup_checkpoints
cat xtrabackup_checkpoints
backup_type = full-backuped 備份的類型,full表全備善镰,prepared表已經(jīng)做完redo前滾和undo回滾
from_lsn = 0 代表LSN號從哪開始進行備份妹萨,0表示LSN從0號開始代表全備
to_lsn = 3528971 表示 ckpt時,的數(shù)據(jù)部分的LSN號
last_lsn = 3528980 表示炫欺,備份完成后乎完,在redo日志中記錄的LSN號
compact = 0
recover_binlog_info = 0
# to_lsn 和 last_lsn ,在這相差9個品洛,這是MySQL5.7的新特性树姨,表示無差。因為此為測試環(huán)境桥状,在備份過程中帽揪,并沒有事務(wù)產(chǎn)生。所以redo日志的LSN號辅斟,并沒有增加转晰。
增量備份時,要檢查增量備份的from_lsn于上一次備份文件的last_lsn是否相差9,如果是9查邢,表示增量備份沒有問題蔗崎,
-
xtrabackup_logfile
表示增量備份的redo日志
XBK的增量備份和恢復(fù)
清空備份路徑
rm -rf /backup/*
環(huán)境準(zhǔn)備
- 模擬周日數(shù)據(jù)
create database full charset utf8mb4;
use full;
create table t1(id int);
insert into t1 values(1),(2),(3);
- 進行全備
innobackupex --user=root --password= -S /tmp/mysql.socket --no-timestamp /backup/full
- 模擬周一數(shù)據(jù)
create database inc1 charset utf8mb4;
use inc1;
create table t1(id int);
insert into t1 values(1),(2),(3);
- 進行周一增備
innobackupex --user=root --password= -S /tmp/mysql.socket --no-timestamp --incremental --incremental-basedir=/backup/full /backup/inc1
- 模擬周二數(shù)據(jù)
create database inc2 charset utf8mb4;
use inc2;
create table t1(id int);
insert into t1 values(1),(2),(3);
- 進行周二增備
innobackupex --user=root --password= -S /tmp/mysql.socket --no-timestamp --incremental --incremental-basedir=/backup/inc1 /backup/inc2
-
檢查full,inc1,inc2的lsn號
由圖可以看出,每次增備的from_lsn號侠坎,減去9,即是上一個的las_lsn號蚁趁,即增備成功
- 模擬周三數(shù)據(jù)變化
create database inc3 charset utf8mb4;
use inc3;
create table t1(id int);
insert into t1 values(1),(2),(3);
- 模擬上午10點的數(shù)據(jù)庫崩潰
\rm -rf /data/mysql/data/*
恢復(fù)思路
- 掛維護頁
- 查找可用備份
full+inc1+inc2
- 恢復(fù)binlog 裙盾,inc2到故障時間點
- 恢復(fù)全備+增量+binlog
- 驗證數(shù)據(jù)
- 撤維護頁
恢復(fù)過程
- 備份數(shù)據(jù)
cp -a /backup /bak
- 整理全備
innobackupex --apply-log --redo-only /backup/full/
- 合并inc1到全備
innobackupex --apply-log --redo-only --incremental-dir=/backup/inc1 /backup/full
- 合并inc2到全備
innobackupex --apply-log --incremental-dir=/backup/inc2 /backup/full
最后inc2的last_lsn號和to_lsn號和full的last_lsn和to_lsn號一樣
- 最后整理full
innobackupex --apply-log /backup/full/
redo-only 說明
增量備份恢復(fù)時实胸,在第一次整理全備,在合并增量時番官,除了最后一次增量合并增量后不加庐完。其余的時候都加。最后一次全備整理徘熔,也不用加门躯。只做redo前滾,不做undo回滾
apply-log說明
進行redo前滾和undo回滾
全部恢復(fù)
pkill mysqld
cp -a /backup/full /data/mysql/data
chown -R mysql.mysql /data/mysql/data
binlog恢復(fù)
應(yīng)先查看 /backup/inc2/xtrabackup_binlog_info 的二進制起點
# 查看日志的終點
mysqlbinlog --base64-output=decode-rows /data/mysql/data/mysql-bin.000007
# 截取日志
mysqlbinlog --start-position=219 --stop-position=819 /data/mysql/data/mysql-bin.000007 > /tmp/inc3.sql
# 恢復(fù)
mysql> set sql_log_bin=0;
mysql> source /tmp/inc3.sql;
mysql> set sql_log_bin=1;