溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL災難恢復與備份(下篇)

發(fā)布時間:2020-08-04 10:03:21 來源:網絡 閱讀:10154 作者:tty之星 欄目:數據庫

  xiaorenwutest.blog.51cto.com

 

   MySQL災難恢復與備份(下篇)

前言:在上次的講解中我們了解了數據庫通過mysqldump工具和binlog日志結合回復數據庫當中的數據。但是有一個弊端。那就是mysqldump工具在回復數據量小的情況下好使,一旦數據量規(guī)模龐大的時候回復該怎么辦?相信在公司當中幾乎不會有DBA使用mysqldump工具恢復數據。

另一個問題是,當我們的備份工具有了的時候那么我們該怎么備份呢?難道要手動一次又一次的去備份嗎?要是晚上備份該怎麼辦呢?難道要晚上跑到公司去先備個份在回家休息。這就不太現實了。

今天我們就以這兩個問題為主題進行探討,并且給出解決方案。接下來進入今天的案例。

1)周期性備份方案:

比如說公司規(guī)定讓DBA周日的凌晨1點全庫備份;

周一到周六凌晨每隔4小時增量備份一次

我們可以通過crond設置任務計劃進行備份方案

 

#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

 

#判斷上條語句是否存在,如果不存在則創(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工具備份數據庫

$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

 

#定義數據庫目錄

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工具備份數據庫

$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

 

總結:通過以上的兩個編寫腳本的案例來做出對數據庫的備份,而且是周期性的不用人工操作,自動執(zhí)行。

優(yōu)點:1)減少運維人員或DBA的工作量

      2)較少備份的失誤次數

      3)效率高,速度快

 

2):剛才對數據庫介紹了周期性的備份和任務計劃的結合使用;那么我們接下來對今天的第二個問題進行探討:{備份工具}

 

Xtrabackup實現是物理備份,而且是物理熱備

目前主流的有兩個工具可以實現物理熱備:ibbackup和xtrabackup;ibbackup是商業(yè)軟件,需要授權,非常昂貴。而xtrabackup功能比ibbackup還要強大,但卻是開源的。因此我們這里就來介紹xtrabackup的使用。

Xtrabackup提供了兩種命令行工具:

xtrabackup:專用于備份InnoDBXtraDB引擎的數據;

innobackupex:這是一個perl腳本,在執(zhí)行過程中會調用xtrabackup命令,這樣用該命令即可以實現備份InnoDB,也可以備份MyISAM引擎的對象。

注:大家不要弄混了: xtrabackup:用于備份innodb和xtradb

                innobackupex:用于備份innodb和myisam

 

優(yōu)點:

Xtrabackup是由percona提供的mysql數據庫備份工具,特點:

(1)備份過程快速、可靠;

(2)備份過程不會打斷正在執(zhí)行的事務;

(3)能夠基于壓縮等功能節(jié)約磁盤空間和流量;

(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/

 MySQL災難恢復與備份(下篇) 

Xtrabackup中主要包含兩個工具:

xtrabackup:是用于熱備份innodb, xtradb表中數據的工具,支持在線熱備份,可以在不加鎖的情況下備份Innodb數據表,不過此工具不能操作Myisam引擎表;

innobackupex:是將xtrabackup進行封裝的perl腳本,能同時處理InnodbMyisam,但在處理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

 MySQL災難恢復與備份(下篇) 

 

上面屬于準備工作,把需要的工具包裝好,下面開始進入主題:

let's go

方案一:xtrabackup完全備份+binlog增量備份

1、備份

創(chuàng)建備份目錄

# mkdir -p /opt/mysqlbackup/{full,inc}

full:全備存放的目錄;inc:增量備份存放的目錄

 MySQL災難恢復與備份(下篇) 

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,如果指定則必須是第一個參數。

/path/to/BACKUP-DIR/指定備份所存放的目標目錄,備份過程會創(chuàng)建一個以當時備份時間命名的目錄存放備份文件。

出現如下提示。表示成功

 MySQL災難恢復與備份(下篇) 

備份后的文件:

在備份的同時,備份數據會在備份目錄下創(chuàng)建一個以當前日期時間為名字的目錄存放備份文件:

 MySQL災難恢復與備份(下篇) 

數據庫大家都了解;接下來對每隔文件進行下解釋;

(1)xtrabackup_checkpoints ——備份類型(如完全或增量)、備份狀態(tài)(如是否已經為prepared狀態(tài))和LSN(日志序列號)范圍信息;

每個InnoDB頁(通常為16k大小)都會包含一個日志序列號,即LSN。LSN是整個數據庫系統(tǒng)的系統(tǒng)版本號,每個頁面相關的LSN能夠表明此頁面最近是如何發(fā)生改變的。

(2)xtrabackup_binlog_info —— mysql服務器當前正在使用的二進制日志文件及至備份這一刻為止二進制日志事件的位置。

(3)xtrabackup_binlog_pos_innodb ——二進制日志文件及用于InnoDB或XtraDB表的二進制日志文件的當前position。

(4)xtrabackup_binary ——備份中用到的xtrabackup的可執(zhí)行文件;

(5)backup-my.cnf ——備份命令用到的配置選項信息;

在使用innobackupex進行備份時,還可以使用--no-timestamp選項來阻止命令自動創(chuàng)建一個以時間命名的目錄;如此一來,innobackupex命令將會創(chuàng)建一個BACKUP-DIR目錄來存儲備份數據

注意:相關選項說明:

其中,--user指定連接數據庫的用戶名,--password指定連接數據庫的密碼,--defaults-file指定數據庫的配置文件,innobackupex要從其中獲取datadir等信息;--database指定要備份的數據庫,這里指定的數據庫只對MyISAM表有效,對于InnoDB 數據來說都是全備(所有數據庫中的InnoDB數據都進行了備份,不是只備份指定的數據庫,恢復時也一樣);/opt/mysqlbackup/full是備份文件的存放位置

現在的數據庫有點空,數據量不夠,接下來我們插入點數據,進行我們的增量備份

 MySQL災難恢復與備份(下篇) 

插入完成之后,讓我們來驗證一下;插入的數據是否成功:

 

 MySQL災難恢復與備份(下篇) 

2)增量備份二進制文件:

先進行查看二進制文件的上次備份位置

 MySQL災難恢復與備份(下篇) 

#mysqlbinlog --start-position=154 /usr/local/mysql/data/mysql_bin.000001 > /opt/mysqlbackup/inc/`date +%F`.sql

 MySQL災難恢復與備份(下篇)

 

我們來看一下,增量備份是否成功了呢?

 MySQL災難恢復與備份(下篇) 

可以看得出來增量備份和完整備份都是以日期的形式進行備份的。

2)接下來我們將它們還原,看看這個備份工具究竟好不好使,有沒有說的那么神奇;let's go 往下看

模擬數據庫損壞:{這里我們直接將數據目錄文件干掉}”

rm -rf /usr/local/mysql/data/*

 MySQL災難恢復與備份(下篇) 

這里說明了,mysql的數據目錄已經被我們成功的刪掉了,接下來讓我們驗證一下,之前備份的內容是否可以真的回復之前被刪掉的內容了呢?

 MySQL災難恢復與備份(下篇) 

在這里要插一嘴,一般在備份之后數據尚且不能用于回復數據,因為備份數據中可能會包含尚未提交的事物或已經提交但尚未同步至數據文件中的事務。因此,數據在處理的時候可能導致數據不一致。

innobakupex命令的--apply-log選項可用于實現上述功能

 MySQL災難恢復與備份(下篇) 

那么讓我們來看一下,數據是否真的成功回復了呢?

 MySQL災難恢復與備份(下篇) 

為什么還沒有恢復回來了呢?

那只是一個完整備份,而不是數據的恢復,接下來還得進行還原數據庫的sql語法: 加選項--copy-back

 MySQL災難恢復與備份(下篇) 

讓我們再一次查看下數據是否回來:

 MySQL災難恢復與備份(下篇) 

從現實結果可以看到數據庫等文件已經恢復回來了;但是還有點缺陷,那就是現在的用戶是root而不是以前的MySQL用戶,所以說,我們還要將屬主:屬組調整為mysql

 MySQL災難恢復與備份(下篇) 

重新啟動mysql服務

進入數據庫當中可以看到之前的全備份已經成功的恢復了回來,但是后續(xù)創(chuàng)建的表和內容還沒有恢復回來,所以換需要進行增量備份的恢復。

主:為了防止在還原的時候產生大量的二進制文件,所以暫時的可以關閉二進制文件,等恢復成功之后可以再次的開啟。

mysql> set sql_log_bin=0;===========關閉二進制文件

 MySQL災難恢復與備份(下篇) 

還原增量文件的方式:或者通過mysqlbinlog工具

mysql> source /opt/mysqlbackup/inc/2017-06-28.sql

 MySQL災難恢復與備份(下篇) 

完成之后再次開啟二進制文件

 MySQL災難恢復與備份(下篇) 

讓我們再次查看一下之前的表和數據是否已經回來了呢?

 MySQL災難恢復與備份(下篇) 

增量備份已經成功的恢復了之前的數據;此次備份與恢復成功!

 


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI