優勢
使用場景:
10G如下的數據庫操做簡單mysql
缺點
數據量範圍:30G --> TB級別 的時候備份、恢復操做很慢,效率低sql
使用場景:
一、數據量大,變換量小
二、數據量小,變化量大數據庫
percona公司官網 https://www.percona.com/vim
Xtrabackup是由percona開源的免費數據庫熱備份軟件,它能對InnoDB數據庫和XtraDB存儲引擎的數據庫非阻塞地備份(對於MyISAM的備份一樣須要加表鎖);mysqldump備份方式是採用的邏輯備份,其最大的缺陷是備份和恢復速度較慢,若是數據庫大於50G,mysqldump備份就不太適合。bash
Xtrabackup安裝完成後有4個可執行文件,其中2個比較重要的備份工具是innobackupex、xtrabackup服務器
1)xtrabackup 是專門用來備份InnoDB表的,和mysql server沒有交互;
2)innobackupex 是一個封裝xtrabackup的Perl腳本,支持同時備份innodb和myisam,但在對myisam備份時須要加一個全局的讀鎖。
3)xbcrypt 加密解密備份工具
4)xbstream 流傳打包傳輸工具,相似tar
5)物理備份工具,在同級數據量基礎上,都要比邏輯備份性能好的多,特別是在數據量較大的時候,體現的更加明顯。app
Xtrabackup優勢
1)備份速度快,物理備份可靠less
2)備份過程不會打斷正在執行的事務(無需鎖表)ide
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的安裝
一、安裝依賴關係
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
二、下載軟件包,並安裝軟件
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
全量備份
innobackupex --defaults-file=/etc/my.cnf --user=root --password=123 /backup/xfull
恢復
一、/etc/init.d/mysqld stop
二、innobackupex --apply-log /backup/xfull/
三、rm -rf /data/mysql/*
四、innobackupex --defaults-file=/etc/my.cnf --copy-back /backup/xfull/
五、chown -R mysql.mysql /data/mysql/
六、/etc/init.d/mysqld start
innobackupex增量備份過程當中的"增量"處理,其實主要是相對innodb而言,對myisam和其餘存儲引擎而言,它仍然是全拷貝(全備份)
增量備份從哪增量?
基於上一次的備份進行增量。
redo默認狀況下是一組兩個文件,而且有固定大小。其使用的文件是一種輪詢使用方式,他不是永久的,文件隨時可能被覆蓋。
注意:千萬不要在業務繁忙時作備份。
備份什麼內容?
一、可使用binlog做爲增量
二、自帶的增量備份,基於上次備份後的變化的數據頁,還要備份在備份過程當中的undo、redo變化
操做
一、先進行第一次全備
innobackupex --user=root --password=123 /bakcup/xfull
二、再進行增量備份。這個是在全備的基礎上作的,須要指定全量備份的目錄:/backup/xfull/ ;增量備份到 /backup/xinc1
innobackupex --user=root --password=123 --incremental --incremental-basedir=/backup/xfull/ /backup/xinc1
恢復
一、先應用全備日誌
innobackupex --apply-log --redo-only /backup/xfull/
二、合併增量到全備中(一致性的合併)
innobackupex --apply-log --incremental-dir=/backup/xinc1 /backup/xfull/
innobackupex --apply-log /backup/xfull
三、合併完成進行恢復
使用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 = ?
數據建立階段
一、建立備份須要的目錄
mkdir full inc1 inc2
二、週日全備
innobackupex --user=root --password=123 --no-timestamp /backup/xbackup/full/
三、模擬數據變化
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;
四、週一增量備份
innobackupex --user=root --password=123 --incremental --no-timestamp --incremental-basedir=/backup/xbackup/full/ /backup/xbackup/inc1
五、模擬數據變化
use oldboy
insert into test values(8,'outman1',119);
insert into test values(9,'outgirl1',120);
commit;
六、週二的增量備份
innobackupex --user=root --password=123 --incremental --no-timestamp --incremental-basedir=/backup/xbackup/inc1 /backup/xbackup/inc2
模擬誤操做事故
模擬場景,週二下午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=0source /tmp/incbinlog.sql