mysql備份恢復與xtrabackup備份

mysqldump優缺點

優點
使用場景:
10G以下的數據庫操作簡單

缺點
數據量範圍:30G --> TB級別 的時候備份、恢復操作很慢,效率低

xtrabackup備份軟件

使用場景:
1、數據量大,變換量小
2、數據量小,變化量大

介紹

percona公司官網 https://www.percona.com/

Xtrabackup是由percona開源的免費數據庫熱備份軟件,它能對InnoDB數據庫和XtraDB存儲引擎的數據庫非阻塞地備份(對於MyISAM的備份同樣需要加表鎖);mysqldump備份方式是採用的邏輯備份,其最大的缺陷是備份和恢復速度較慢,如果數據庫大於50G,mysqldump備份就不太適合。

Xtrabackup安裝完成後有4個可執行文件,其中2個比較重要的備份工具是innobackupex、xtrabackup

1)xtrabackup 是專門用來備份InnoDB表的,和mysql server沒有交互;
2)innobackupex 是一個封裝xtrabackup的Perl腳本,支持同時備份innodb和myisam,但在對myisam備份時需要加一個全局的讀鎖。
3)xbcrypt 加密解密備份工具
4)xbstream 流傳打包傳輸工具,類似tar
5)物理備份工具,在同級數據量基礎上,都要比邏輯備份性能好的多,特別是在數據量較大的時候,體現的更加明顯。

Xtrabackup優點
1)備份速度快,物理備份可靠

2)備份過程不會打斷正在執行的事務(無需鎖表)

3)能夠基於壓縮等功能節約磁盤空間和流量

4)自動備份校驗

5)還原速度快

6)可以流傳將備份傳輸到另外一臺機器上

7)在不增加服務器負載的情況備份數據

8)物理備份工具,在同級數據量基礎上,都要比邏輯備份性能要好的多。幾十G到不超過TB級別的條件下。但在同數據量級別,物理備份恢復數據上有一定優勢。

備份原理

拷貝數據文件、拷貝數據頁

對於innodb表可以實現熱備。

(1)在數據庫還有修改操作的時刻,直接將數據文件備走,此時,備份走的數據對於當前mysql來講是不一致的。
(2)將備份過程中的redo和undo一併備走。
(3)爲了恢復的時候,只要保證備份出來的數據頁lsn能和redo lsn匹配,將來恢復的就是一致的數據。redo應用和undo應用。

對於myisam表實現自動鎖表拷貝文件。

  備份開始時首先會開啓一個後臺檢測進程,實時檢測mysql redo的變化,一旦發現有新的日誌寫入,立刻將日誌記入後臺日誌文件xtrabackup_log中,之後複製innodb的數據文件一系統表空間文件ibdatax,複製結束後,將執行flush tables with readlock,然後複製.frm MYI MYD等文件,最後執行unlock tables,最終停止xtrabackup_log

## xtrabackup的安裝

1、安裝依賴關係
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL

2、下載軟件包,並安裝軟件
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.4-1.el6.x86_64.rpm

xtrabackup實踐操作

全量備份
innobackupex --defaults-file=/etc/my.cnf --user=root --password=123 /backup/xfull

恢復
1、/etc/init.d/mysqld stop
2、innobackupex --apply-log /backup/xfull/
3、rm -rf /data/mysql/*
4、innobackupex --defaults-file=/etc/my.cnf --copy-back /backup/xfull/
5、chown -R mysql.mysql /data/mysql/
6、/etc/init.d/mysqld start

增量備份與恢復

innobackupex增量備份過程中的"增量"處理,其實主要是相對innodb而言,對myisam和其他存儲引擎而言,它仍然是全拷貝(全備份)
增量備份從哪增量?
基於上一次的備份進行增量。
redo默認情況下是一組兩個文件,並且有固定大小。其使用的文件是一種輪詢使用方式,他不是永久的,文件隨時可能被覆蓋。

注意:千萬不要在業務繁忙時做備份。

備份什麼內容?

1、可以使用binlog作爲增量

2、自帶的增量備份,基於上次備份後的變化的數據頁,還要備份在備份過程中的undo、redo變化

操作
1、先進行第一次全備
innobackupex --user=root --password=123 /bakcup/xfull

2、再進行增量備份。這個是在全備的基礎上做的,需要指定全量備份的目錄:/backup/xfull/ ;增量備份到 /backup/xinc1
innobackupex --user=root --password=123 --incremental --incremental-basedir=/backup/xfull/ /backup/xinc1

恢復
1、先應用全備日誌
innobackupex --apply-log --redo-only /backup/xfull/

2、合併增量到全備中(一致性的合併)
innobackupex --apply-log --incremental-dir=/backup/xinc1 /backup/xfull/
innobackupex --apply-log /backup/xfull

3、合併完成進行恢復
使用innobackupex命令進行恢復(推薦)
innobackupex --defaults-file=/etc/my.cnf --copy-back /backup/xfull
chown -R mysql.mysql /date/mysql

數據庫備份策略
每週的週日進行一次全備;週一到週六每天做上一天增量,每週輪詢一次。
備份方案: xtrabackup全備+增量

備份策略(crontab):

crontab -e
00 03 1 /root/allbak.sh &>/dev/null //每週一的凌晨3點執行完全備份

vim /root/allbak.sh
#!/bin/bash
[ ! -e /backup ]&& mkdir /backup //新建個文件夾專門放備份文件的
day=date +%F //定義日期是時間
user=root
pass=123456
innobackupex --user $user --password $pass /backup/allbak${day} --no-timestamp //用innobackupex做完全備份
mysql -u$user -p$pass -e "flush logs"
#啓用binlog日誌,每次完全備份之後,每週刷新一遍binlog日誌

00 04 2-7 /root/newbak.sh & >/dev/null //每週二到周7的凌晨4點執行增量備份

#週一全備,如果是週二執行,判斷dir1 存在,則增量備份,如果不存在,則判斷昨天的增量,存在則執行週三的增量,如果都沒有,則全備執行一次吧
vim /root/newbak.sh
#!/bin/bash
d1=date +%F //定義時間,用日期來區分
d2=date +%F -d "-1 days" //找到昨天的日期,好指明上一次備份的備份文件
dir1=/backup/allbak${d2} //昨天做的完全備份文件
dir2=/backup/newbak${d2} //昨天做的增量備份文件
user=root
pass=123456
[ ! -e /backup ]&& mkdir /backup //如果文件不存在,則創建文件夾
if [ -e ${dir1} ];then //判斷昨天做的是完全備份
innobackupex --user $user --password $pass --incremental /backup/newbak${d1} --incremental-basedir=${dir1} --no-timestamp //指定昨天備份的完全備份文件
elif [ -e ${dir2} ];then //判斷昨天做的是增量備份
innobackupex --user $user --password $pass --incremental /backup/newbak${d1} --incremental-basedir=${dir2} --no-timestamp //指定昨天備份的增量備份文件
else
innobackupex --user $user --password $pass /backup/allbak${d1} --no-timestamp
//昨天既沒有做增量備份,又沒有做完全備份,則做一次完全備份。
fi

實際應用

binlog日誌 默認大小:1G左右,設置 ,配置文件里加一個 max_binlog_size = ?

數據創建階段

1、創建備份需要的目錄

mkdir full inc1 inc2

2、週日全備

innobackupex --user=root --password=123 --no-timestamp /backup/xbackup/full/

3、模擬數據變化
use oldboy
create table test(id int,name char(20),age int);
insert into test values(8,'outman',99);
insert into test values(9,'outgirl',100);
commit;

4、週一增量備份
innobackupex --user=root --password=123 --incremental --no-timestamp --incremental-basedir=/backup/xbackup/full/ /backup/xbackup/inc1

5、模擬數據變化
use oldboy
insert into test values(8,'outman1',119);
insert into test values(9,'outgirl1',120);
commit;

6、週二的增量備份
innobackupex --user=root --password=123 --incremental --no-timestamp --incremental-basedir=/backup/xbackup/inc1 /backup/xbackup/inc2

  1. 再插入新的行操作
    use oldboy
    insert into test values(10,'outman2',19);
    insert into test values(11,'outgirl2',10);
    commit;

模擬誤操作事故

模擬場景,週二下午2點誤刪除test表

use oldboy;
drop table test;

準備恢復數據

1.準備xtrabackup備份,合併備份

innobackupex --apply-log --redo-only /backup/xbackup/full
innobackupex --apply-log --redo-only --incremental-dir=/backup/xbackup/inc1 /backup/xbackup/full
innobackupex --apply-log --incremental-dir=/backup/xbackup/inc2 /backup/xbackup/full
innobackupex --apply-log /backup/xbackup/full
2.確認binlog起點,準備截取binlog。

cd /backup/xbackup/inc2/
cat xtrabackup_binlog_info
mysql-bin.000001 1121
3.截取到drop操作之前的binlog

mysqlbinlog --start-position=1121 /tmp/mysql-bin.000003
找到drop之前的event和postion號做日誌截取,假如 1437 這個可以用mysqlbinlog master-bin.000032|less 打開查看
詳細信息:https://blog.csdn.net/u010433704/article/details/54962680?utm_source=blogxgwz8
mysqlbinlog --start-position=1121 --stop-position=1437 /tmp/mysql-bin.000003 >/tmp/incbinlog.sql

4.關閉數據庫、備份二進制日誌

/etc/init.d/mysqld stop
cd /application/mysql/data/
cp mysql-bin.000001 /tmp

5.刪除MySQL所有數據

cd /application/mysql/data/
rm -rf *

恢復數據

1.將全量備份的數據恢復到數據目錄下

innobackupex --copy-back /backup/xbackup/full/
chown -R mysql.mysql /application/mysql/data/
/etc/init.d/mysqld start

2.恢復binlog記錄

set sql_log_bin=0
source /tmp/incbinlog.sql

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章