xiaorenwutest.blog.51cto.com
呼蘭ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!
MySQL災(zāi)難恢復(fù)與備份(下篇)
前言:在上次的講解中我們了解了數(shù)據(jù)庫通過mysqldump工具和binlog日志結(jié)合回復(fù)數(shù)據(jù)庫當(dāng)中的數(shù)據(jù)。但是有一個弊端。那就是mysqldump工具在回復(fù)數(shù)據(jù)量小的情況下好使,一旦數(shù)據(jù)量規(guī)模龐大的時候回復(fù)該怎么辦?相信在公司當(dāng)中幾乎不會有DBA使用mysqldump工具恢復(fù)數(shù)據(jù)。
另一個問題是,當(dāng)我們的備份工具有了的時候那么我們該怎么備份呢?難道要手動一次又一次的去備份嗎?要是晚上備份該怎麼辦呢?難道要晚上跑到公司去先備個份在回家休息。這就不太現(xiàn)實了。
今天我們就以這兩個問題為主題進行探討,并且給出解決方案。接下來進入今天的案例。
1)周期性備份方案:
比如說公司規(guī)定讓DBA周日的凌晨1點全庫備份;
周一到周六凌晨每隔4小時增量備份一次
我們可以通過crond設(shè)置任務(wù)計劃進行備份方案
#crontab -e
周日備份計劃:
0 1 * * 0 /root/mysqlfullbackup.sh >/dev/null 2>&1
#周一到周六每隔4個小時增量備份一次
0 */4 * * 1-6 /root/mysqldailybackup.sh >/dev/null 2>&1
腳本的內(nèi)容以及編寫:
(一)首先是全庫備份{也就是周日備份}
上面提到了腳本名稱為:mysqlfullbackup.sh
#!/bin/bash
#定義數(shù)據(jù)庫目錄
mysqlDir=/usr/local/mysql
#定義用戶和密碼
user=root
userpwd=123456
dbname=test_db
#定義備份目錄
databackupdir=/opt/mysqlbackup
#判斷上條語句是否存在,如果不存在則創(chuàng)建
[ ! -d $databackupdir ] && mkdir $databackupdir
#定義郵件文件
emailfile=$databackupdir/email.txt
#收件地址為本機
email=root@localhost.localdomain
#定義備份日志文件
logfile=$databackupdir/mysqlbackup.log
#定義時間
DATE=$(date -I)
echo "" > $emailfile
echo $(date +"%y-%m-%d %H:%M:%S") >> $emailfile
cd $databackupdir
#定義備份文件名
dumpfile=mysql_$DATE.sql
gzdumpfile=mysql_$DATE.sql.tar.gz
#使用mysqldump工具備份數(shù)據(jù)庫
$mysqlDir/bin/mysqldump -u$user -p$userpwd --flush-logs -x $dbname > $dumpfile
#壓縮備份文件
if [ $? -eq 0 ];then
tar zcf $gzdumpfile $dumpfile >> $emailfile 2>&1
echo "BackupFileName:$gzdumpfile" >> $emailfile
echo "DataBase Backup Success!" >> $emailfile
rm -f $dumpfile
else
echo "DataBackup Fail!" >> $emailfile
fi
#開始寫入日志文件
echo "---------------" >> $logfile
cat $emailfile >> $logfile
#發(fā)送郵件通知
cat $emailfile | mail -s "Mysql Backup" $email
(二): 另一個腳本文件
mysqldailybackup.sh{屬于周一到周六每隔4小時備份}
#!/bin/bash
#定義數(shù)據(jù)庫目錄
mysqlDir=/usr/local/mysql
#定義用戶和密碼
user=root
userpwd=123456
dbname=test_db
#定義備份目錄
databackupdir=/opt/mysqlbackup
#判斷上條語句是否存在,如果不存在則創(chuàng)建
[ ! -d $databackupdir ] && mkdir $databackupdir
#定義郵件文件
emailfile=$databackupdir/email.txt
#收件地址為本機
email=root@localhost.localdomain
#定義備份日志文件
logfile=$databackupdir/mysqlbackup.log
#定義時間
DATE=$(date -I)
echo "" > $emailfile
echo $(date +"%y-%m-%d %H:%M:%S") >> $emailfile
cd $databackupdir
#定義備份文件名
dumpfile=mysql_$DATE.sql
gzdumpfile=mysql_$DATE.sql.tar.gz
#使用mysqldump工具備份數(shù)據(jù)庫
$mysqlDir/bin/mysqldump -u$user -p$userpwd --flush-logs -x $dbname > $dumpfile
#壓縮備份文件
if [ $? -eq 0 ];then
tar zcf $gzdumpfile $dumpfile >> $emailfile 2>&1
echo "BackupFileName:$gzdumpfile" >> $emailfile
echo "DataBase Backup Success!" >> $emailfile
rm -f $dumpfile
else
echo "DataBackup Fail!" >> $emailfile
fi
#開始寫入日志文件
echo "---------------" >> $logfile
cat $emailfile >> $logfile
#發(fā)送郵件通知
cat $emailfile | mail -s "Mysql Backup" $email
總結(jié):通過以上的兩個編寫腳本的案例來做出對數(shù)據(jù)庫的備份,而且是周期性的不用人工操作,自動執(zhí)行。
優(yōu)點:1)減少運維人員或DBA的工作量
2)較少備份的失誤次數(shù)
3)效率高,速度快
2):剛才對數(shù)據(jù)庫介紹了周期性的備份和任務(wù)計劃的結(jié)合使用;那么我們接下來對今天的第二個問題進行探討:{備份工具}
Xtrabackup實現(xiàn)是物理備份,而且是物理熱備
目前主流的有兩個工具可以實現(xiàn)物理熱備:ibbackup和xtrabackup;ibbackup是商業(yè)軟件,需要授權(quán),非常昂貴。而xtrabackup功能比ibbackup還要強大,但卻是開源的。因此我們這里就來介紹xtrabackup的使用。
Xtrabackup提供了兩種命令行工具:
xtrabackup:專用于備份InnoDB和XtraDB引擎的數(shù)據(jù);
innobackupex:這是一個perl腳本,在執(zhí)行過程中會調(diào)用xtrabackup命令,這樣用該命令即可以實現(xiàn)備份InnoDB,也可以備份MyISAM引擎的對象。
注:大家不要弄混了: xtrabackup:用于備份innodb和xtradb
innobackupex:用于備份innodb和myisam
優(yōu)點:
Xtrabackup是由percona提供的mysql數(shù)據(jù)庫備份工具,特點:
(1)備份過程快速、可靠;
(2)備份過程不會打斷正在執(zhí)行的事務(wù);
(3)能夠基于壓縮等功能節(jié)約磁盤空間和流量;
(4)自動實現(xiàn)備份檢驗;
(5)還原速度快。
大家如果有興趣可以去官方上下載:
http://www.percona.com/software/percona-xtrabackup;可以下載源碼編譯安裝,也可以下載適合的RPM包或使用yum進行安裝或者下載二進制源碼包。
1)首先解壓下載的軟件包:
# tar zxfpercona-xtrabackup-2.4.4-Linux-x86_64.tar.gz
2)進入解壓目錄
# cd percona-xtrabackup-2.4.4-Linux-x86_64/
3)復(fù)制bin下的所有程序到/usr/bin
[root@localhost percona-xtrabackup-2.4.4-Linux-x86_64]# cp bin/* /usr/bin/
Xtrabackup中主要包含兩個工具:
xtrabackup:是用于熱備份innodb, xtradb表中數(shù)據(jù)的工具,支持在線熱備份,可以在不加鎖的情況下備份Innodb數(shù)據(jù)表,不過此工具不能操作Myisam引擎表;
innobackupex:是將xtrabackup進行封裝的perl腳本,能同時處理Innodb和Myisam,但在處理Myisam時需要加一個讀鎖。
由于操作Myisam時需要加讀鎖,這會堵塞線上服務(wù)的寫操作,而Innodb沒有這樣的限制,所以數(shù)據(jù)庫中Innodb表類型所占的比例越大,則越有利。
4)安裝相關(guān)插件
#yum install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perl-TermReadKey.x86_64 perl-Digest-MD5–y
5)下載percona-toolkit并安裝
#wgethttps://www.percona.com/downloads/percona-toolkit/2.2.19/RPM/percona-toolkit-2.2.19-1.noarch.rpm
#yum -y localinstall percona-toolkit-2.2.19-1.noarch.rpm
上面屬于準(zhǔn)備工作,把需要的工具包裝好,下面開始進入主題:
let's go
方案一:xtrabackup完全備份+binlog增量備份
1、備份
創(chuàng)建備份目錄
# mkdir -p /opt/mysqlbackup/{full,inc}
full:全備存放的目錄;inc:增量備份存放的目錄
1)完全備份
基本語法:# innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR/
執(zhí)行下面的命令進行完全備份:
#innobackupex --user=root --password=123456 /opt/mysqlbackup/full
注: --defaults-file=/etc/my.cnf 指定mysql的配置文件my.cfg,如果指定則必須是第一個參數(shù)。
/path/to/BACKUP-DIR/指定備份所存放的目標(biāo)目錄,備份過程會創(chuàng)建一個以當(dāng)時備份時間命名的目錄存放備份文件。
出現(xiàn)如下提示。表示成功
備份后的文件:
在備份的同時,備份數(shù)據(jù)會在備份目錄下創(chuàng)建一個以當(dāng)前日期時間為名字的目錄存放備份文件:
數(shù)據(jù)庫大家都了解;接下來對每隔文件進行下解釋;
(1)xtrabackup_checkpoints ——備份類型(如完全或增量)、備份狀態(tài)(如是否已經(jīng)為prepared狀態(tài))和LSN(日志序列號)范圍信息;
每個InnoDB頁(通常為16k大小)都會包含一個日志序列號,即LSN。LSN是整個數(shù)據(jù)庫系統(tǒng)的系統(tǒng)版本號,每個頁面相關(guān)的LSN能夠表明此頁面最近是如何發(fā)生改變的。
(2)xtrabackup_binlog_info —— mysql服務(wù)器當(dāng)前正在使用的二進制日志文件及至備份這一刻為止二進制日志事件的位置。
(3)xtrabackup_binlog_pos_innodb ——二進制日志文件及用于InnoDB或XtraDB表的二進制日志文件的當(dāng)前position。
(4)xtrabackup_binary ——備份中用到的xtrabackup的可執(zhí)行文件;
(5)backup-my.cnf ——備份命令用到的配置選項信息;
在使用innobackupex進行備份時,還可以使用--no-timestamp選項來阻止命令自動創(chuàng)建一個以時間命名的目錄;如此一來,innobackupex命令將會創(chuàng)建一個BACKUP-DIR目錄來存儲備份數(shù)據(jù)
注意:相關(guān)選項說明:
其中,--user指定連接數(shù)據(jù)庫的用戶名,--password指定連接數(shù)據(jù)庫的密碼,--defaults-file指定數(shù)據(jù)庫的配置文件,innobackupex要從其中獲取datadir等信息;--database指定要備份的數(shù)據(jù)庫,這里指定的數(shù)據(jù)庫只對MyISAM表有效,對于InnoDB 數(shù)據(jù)來說都是全備(所有數(shù)據(jù)庫中的InnoDB數(shù)據(jù)都進行了備份,不是只備份指定的數(shù)據(jù)庫,恢復(fù)時也一樣);/opt/mysqlbackup/full是備份文件的存放位置
現(xiàn)在的數(shù)據(jù)庫有點空,數(shù)據(jù)量不夠,接下來我們插入點數(shù)據(jù),進行我們的增量備份
插入完成之后,讓我們來驗證一下;插入的數(shù)據(jù)是否成功:
2)增量備份二進制文件:
先進行查看二進制文件的上次備份位置
#mysqlbinlog --start-position=154 /usr/local/mysql/data/mysql_bin.000001 > /opt/mysqlbackup/inc/`date +%F`.sql
我們來看一下,增量備份是否成功了呢?
可以看得出來增量備份和完整備份都是以日期的形式進行備份的。
2)接下來我們將它們還原,看看這個備份工具究竟好不好使,有沒有說的那么神奇;let's go 往下看
模擬數(shù)據(jù)庫損壞:{這里我們直接將數(shù)據(jù)目錄文件干掉}”
rm -rf /usr/local/mysql/data/*
這里說明了,mysql的數(shù)據(jù)目錄已經(jīng)被我們成功的刪掉了,接下來讓我們驗證一下,之前備份的內(nèi)容是否可以真的回復(fù)之前被刪掉的內(nèi)容了呢?
在這里要插一嘴,一般在備份之后數(shù)據(jù)尚且不能用于回復(fù)數(shù)據(jù),因為備份數(shù)據(jù)中可能會包含尚未提交的事物或已經(jīng)提交但尚未同步至數(shù)據(jù)文件中的事務(wù)。因此,數(shù)據(jù)在處理的時候可能導(dǎo)致數(shù)據(jù)不一致。
innobakupex命令的--apply-log選項可用于實現(xiàn)上述功能
那么讓我們來看一下,數(shù)據(jù)是否真的成功回復(fù)了呢?
為什么還沒有恢復(fù)回來了呢?
那只是一個完整備份,而不是數(shù)據(jù)的恢復(fù),接下來還得進行還原數(shù)據(jù)庫的sql語法: 加選項--copy-back
讓我們再一次查看下數(shù)據(jù)是否回來:
從現(xiàn)實結(jié)果可以看到數(shù)據(jù)庫等文件已經(jīng)恢復(fù)回來了;但是還有點缺陷,那就是現(xiàn)在的用戶是root而不是以前的MySQL用戶,所以說,我們還要將屬主:屬組調(diào)整為mysql
重新啟動mysql服務(wù)
進入數(shù)據(jù)庫當(dāng)中可以看到之前的全備份已經(jīng)成功的恢復(fù)了回來,但是后續(xù)創(chuàng)建的表和內(nèi)容還沒有恢復(fù)回來,所以換需要進行增量備份的恢復(fù)。
主:為了防止在還原的時候產(chǎn)生大量的二進制文件,所以暫時的可以關(guān)閉二進制文件,等恢復(fù)成功之后可以再次的開啟。
mysql> set sql_log_bin=0;===========關(guān)閉二進制文件
還原增量文件的方式:或者通過mysqlbinlog工具
mysql>source /opt/mysqlbackup/inc/2017-06-28.sql
完成之后再次開啟二進制文件
讓我們再次查看一下之前的表和數(shù)據(jù)是否已經(jīng)回來了呢?
增量備份已經(jīng)成功的恢復(fù)了之前的數(shù)據(jù);此次備份與恢復(fù)成功!