xiaorenwutest.blog.51cto.commysql
MySQL災難恢復與備份(下篇)sql
前言:在上次的講解中咱們瞭解了數據庫經過mysqldump工具和binlog日誌結合回覆數據庫當中的數據。可是有一個弊端。那就是mysqldump工具在回覆數據量小的狀況下好使,一旦數據量規模龐大的時候回覆該怎麼辦?相信在公司當中幾乎不會有DBA使用mysqldump工具恢復數據。數據庫
另外一個問題是,當咱們的備份工具備了的時候那麼咱們該怎麼備份呢?難道要手動一次又一次的去備份嗎?要是晚上備份該怎麼辦呢?難道要晚上跑到公司去先備個份在回家休息。這就不太現實了。bash
今天咱們就以這兩個問題爲主題進行探討,而且給出解決方案。接下來進入今天的案例。服務器
1)週期性備份方案:app
好比說公司規定讓DBA週日的凌晨1點全庫備份;運維
週一到週六凌晨每隔4小時增量備份一次dom
咱們能夠經過crond設置任務計劃進行備份方案ide
#crontab -e工具
週日備份計劃:
0 1 * * 0 /root/mysqlfullbackup.sh >/dev/null 2>&1
#週一到週六每隔4個小時增量備份一次
0 */4 * * 1-6 /root/mysqldailybackup.sh >/dev/null 2>&1
腳本的內容以及編寫:
(一)首先是全庫備份{也就是週日備份}
上面提到了腳本名稱爲:mysqlfullbackup.sh
#!/bin/bash
#定義數據庫目錄
mysqlDir=/usr/local/mysql
#定義用戶和密碼
user=root
userpwd=123456
dbname=test_db
#定義備份目錄
databackupdir=/opt/mysqlbackup
#判斷上條語句是否存在,若是不存在則建立
[ ! -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工具有份數據庫
$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
#發送郵件通知
cat $emailfile | mail -s "Mysql Backup" $email
(二): 另外一個腳本文件
mysqldailybackup.sh{屬於週一到週六每隔4小時備份}
#!/bin/bash
#定義數據庫目錄
mysqlDir=/usr/local/mysql
#定義用戶和密碼
user=root
userpwd=123456
dbname=test_db
#定義備份目錄
databackupdir=/opt/mysqlbackup
#判斷上條語句是否存在,若是不存在則建立
[ ! -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工具有份數據庫
$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
#發送郵件通知
cat $emailfile | mail -s "Mysql Backup" $email
總結:經過以上的兩個編寫腳本的案例來作出對數據庫的備份,並且是週期性的不用人工操做,自動執行。
優勢:1)減小運維人員或DBA的工做量
2)較少備份的失誤次數
3)效率高,速度快
2):剛纔對數據庫介紹了週期性的備份和任務計劃的結合使用;那麼咱們接下來對今天的第二個問題進行探討:{備份工具}
Xtrabackup實現是物理備份,並且是物理熱備
目前主流的有兩個工具能夠實現物理熱備:ibbackup和xtrabackup;ibbackup是商業軟件,須要受權,很是昂貴。而xtrabackup功能比ibbackup還要強大,但倒是開源的。所以咱們這裏就來介紹xtrabackup的使用。
Xtrabackup提供了兩種命令行工具:
xtrabackup:專用於備份InnoDB和XtraDB引擎的數據;
innobackupex:這是一個perl腳本,在執行過程當中會調用xtrabackup命令,這樣用該命令便可以實現備份InnoDB,也能夠備份MyISAM引擎的對象。
注:你們不要弄混了: xtrabackup:用於備份innodb和xtradb
innobackupex:用於備份innodb和myisam
優勢:
Xtrabackup是由percona提供的mysql數據庫備份工具,特色:
(1)備份過程快速、可靠;
(2)備份過程不會打斷正在執行的事務;
(3)可以基於壓縮等功能節約磁盤空間和流量;
(4)自動實現備份檢驗;
(5)還原速度快。
你們若是有興趣能夠去官方上下載:
http://www.percona.com/software/percona-xtrabackup;能夠下載源碼編譯安裝,也能夠下載適合的RPM包或使用yum進行安裝或者下載二進制源碼包。
1)首先解壓下載的軟件包:
# tar zxf percona-xtrabackup-2.4.4-Linux-x86_64.tar.gz
2)進入解壓目錄
# cd percona-xtrabackup-2.4.4-Linux-x86_64/
3)複製bin下的全部程序到/usr/bin
[root@localhost percona-xtrabackup-2.4.4-Linux-x86_64]# cp bin/* /usr/bin/
Xtrabackup中主要包含兩個工具:
xtrabackup:是用於熱備份innodb, xtradb表中數據的工具,支持在線熱備份,能夠在不加鎖的狀況下備份Innodb數據表,不過此工具不能操做Myisam引擎表;
innobackupex:是將xtrabackup進行封裝的perl腳本,能同時處理Innodb和Myisam,但在處理Myisam時須要加一個讀鎖。
因爲操做Myisam時須要加讀鎖,這會堵塞線上服務的寫操做,而Innodb沒有這樣的限制,因此數據庫中Innodb表類型所佔的比例越大,則越有利。
4)安裝相關插件
#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並安裝
#wget https://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
上面屬於準備工做,把須要的工具包裝好,下面開始進入主題:
let's go
方案一:xtrabackup徹底備份+binlog增量備份
一、備份
建立備份目錄
# mkdir -p /opt/mysqlbackup/{full,inc}
full:全備存放的目錄;inc:增量備份存放的目錄
1)徹底備份
基本語法:# innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR/
執行下面的命令進行徹底備份:
# innobackupex --user=root --password=123456 /opt/mysqlbackup/full
注: --defaults-file=/etc/my.cnf 指定mysql的配置文件my.cfg,若是指定則必須是第一個參數。
/path/to/BACKUP-DIR/指定備份所存放的目標目錄,備份過程會建立一個以當時備份時間命名的目錄存放備份文件。
出現以下提示。表示成功
備份後的文件:
在備份的同時,備份數據會在備份目錄下建立一個以當前日期時間爲名字的目錄存放備份文件:
數據庫你們都瞭解;接下來對每隔文件進行下解釋;
(1)xtrabackup_checkpoints ——備份類型(如徹底或增量)、備份狀態(如是否已經爲prepared狀態)和LSN(日誌序列號)範圍信息;
每一個InnoDB頁(一般爲16k大小)都會包含一個日誌序列號,即LSN。LSN是整個數據庫系統的系統版本號,每一個頁面相關的LSN可以代表此頁面最近是如何發生改變的。
(2)xtrabackup_binlog_info —— mysql服務器當前正在使用的二進制日誌文件及至備份這一刻爲止二進制日誌事件的位置。
(3)xtrabackup_binlog_pos_innodb ——二進制日誌文件及用於InnoDB或XtraDB表的二進制日誌文件的當前position。
(4)xtrabackup_binary ——備份中用到的xtrabackup的可執行文件;
(5)backup-my.cnf ——備份命令用到的配置選項信息;
在使用innobackupex進行備份時,還可使用--no-timestamp選項來阻止命令自動建立一個以時間命名的目錄;如此一來,innobackupex命令將會建立一個BACKUP-DIR目錄來存儲備份數據
注意:相關選項說明:
其中,--user指定鏈接數據庫的用戶名,--password指定鏈接數據庫的密碼,--defaults-file指定數據庫的配置文件,innobackupex要從其中獲取datadir等信息;--database指定要備份的數據庫,這裏指定的數據庫只對MyISAM表有效,對於InnoDB 數據來講都是全備(全部數據庫中的InnoDB數據都進行了備份,不是隻備份指定的數據庫,恢復時也同樣);/opt/mysqlbackup/full是備份文件的存放位置
如今的數據庫有點空,數據量不夠,接下來咱們插入點數據,進行咱們的增量備份
插入完成以後,讓咱們來驗證一下;插入的數據是否成功:
2)增量備份二進制文件:
先進行查看二進制文件的上次備份位置
#mysqlbinlog --start-position=154 /usr/local/mysql/data/mysql_bin.000001 > /opt/mysqlbackup/inc/`date +%F`.sql
咱們來看一下,增量備份是否成功了呢?
能夠看得出來增量備份和完整備份都是以日期的形式進行備份的。
2)接下來咱們將它們還原,看看這個備份工具究竟好很差使,有沒有說的那麼神奇;let's go 往下看
模擬數據庫損壞:{這裏咱們直接將數據目錄文件幹掉}」
rm -rf /usr/local/mysql/data/*
這裏說明了,mysql的數據目錄已經被咱們成功的刪掉了,接下來讓咱們驗證一下,以前備份的內容是否能夠真的回覆以前被刪掉的內容了呢?
在這裏要插一嘴,通常在備份以後數據尚且不能用於回覆數據,由於備份數據中可能會包含還沒有提交的事物或已經提交但還沒有同步至數據文件中的事務。所以,數據在處理的時候可能致使數據不一致。
innobakupex命令的--apply-log選項可用於實現上述功能
那麼讓咱們來看一下,數據是否真的成功回覆了呢?
爲何尚未恢復回來了呢?
那只是一個完整備份,而不是數據的恢復,接下來還得進行還原數據庫的sql語法: 加選項--copy-back
讓咱們再一次查看下數據是否回來:
從現實結果能夠看到數據庫等文件已經恢復回來了;可是還有點缺陷,那就是如今的用戶是root而不是之前的MySQL用戶,因此說,咱們還要將屬主:屬組調整爲mysql
從新啓動mysql服務
進入數據庫當中能夠看到以前的全備份已經成功的恢復了回來,可是後續建立的表和內容尚未恢復回來,因此換須要進行增量備份的恢復。
主:爲了防止在還原的時候產生大量的二進制文件,因此暫時的能夠關閉二進制文件,等恢復成功以後能夠再次的開啓。
mysql> set sql_log_bin=0;===========關閉二進制文件
還原增量文件的方式:或者經過mysqlbinlog工具
mysql> source /opt/mysqlbackup/inc/2017-06-28.sql
完成以後再次開啓二進制文件
讓咱們再次查看一下以前的表和數據是否已經回來了呢?
增量備份已經成功的恢復了以前的數據;這次備份與恢復成功!