隨着互聯網不斷的發展,企業對運維人員的能力要求也愈來愈高,尤爲是要求運維人員能處理各類故障、專研自動化運維技術、雲計算機、虛擬化等,知足公司業務的快速發展。mysql
本章向讀者介紹數據庫備份方法、數量級2T及以上級別數據庫備份方案、xtrabackup企業工具案例演示、數據庫備份及恢復實戰等。sql
在平常運維工做中,數據是公司很是重要的資源,尤爲是數據庫的相關信息,若是數據丟了,少則損失幾千元,高則損失上千萬。因此在運維工做中藥及時注意網站數據的備份,尤爲要及時對數據庫進行備份。數據庫
企業中若是數據量上T級別,維護和管理是很是複雜的,尤爲是對數據庫進行備份操做。服務器
企業中MySQL數據庫備份最經常使用的方法以下:網絡
直接cp備份app
Sqlhotcoyp運維
主從同步複製工具
Mysqldump備份大數據
Xtrabackup備份網站
Mysqldump和Xtrabackup都可以備份MYSQL數據,以下爲Msqldump工具使用方法:
一般小於100G的MYSQL數據庫可使用默認Msqldump備份工具進行備份,若是超過100G的大數據,因爲Mysqldump備份方式採用的邏輯備份,最大的缺陷是備份和恢復速度較慢。
基於Mysqldump備份耗時會很是長,並且備份期間會鎖表。鎖表直接致使數據庫只能訪問Select,不能執行Insert、Update等操做,進而致使部分WEB應用沒法寫入新數據。
若是是Myisam引擎表,固然也能夠執行參數-lock-tables=false禁用鎖表,可是有可能形成數據信息不一致。
若是是支持事務的表,例如InnoDB和BDB,--single-transaction參數是一個更好的選擇,由於它不鎖定表。
mysqldump -uroot -p123456 --all-databases --opt --single-transaction > 2017all.sql
其中--opt快捷選項,等同於添加--add-drop-tables --add-locking --create-option --disable-keys --extended-insert --lock-tables --quick --set-charset 選項。
本選項能讓Mysqldump很快的導出數據,而且導出的數據能很快導回。該選項默認開啓,但能夠用--skip-opt禁用。
若是運行Mysqldump沒有指定--quick或--opt選項,則會將整個結果集放在內存中。若是導出大數據庫的話可能會致使內存溢出而異常退出。
Mysql冷備、Mysqldump、Mysql熱拷貝均不能實現對數據庫進行增量備份,但實際環境中增量備份很是的實用,若是數據量小於100G,存儲空間足夠,能夠天天進行完整備份,若是天天產生的數據量大,須要定製數據備份策略例如:每週日使用完整備份,週一到週六使用增量備份,或者每週六完整備份,週日到週五使用增量備份。
Percona-xtrabackup是爲實現增量備份而生的一款主流備份工具,Xtrabackup有兩個主要的工具,分別爲:xtrabackup、innobackupex。
Percona-xtrabackup是Percona公司開發的一個用於MYSQL數據庫物理熱備的備份工具,支持MYSQL、Percona Server及mariadb,開源免費,是目前互聯網數據庫備份最主流的工具之一。
Xtrabackup只能備份InnoDB和XtraDB兩種數據引擎的表,而不能備份MyISAM數據表,Innobackupex-1.5.1則封裝了Xtrabackup,是一個封裝好的腳本,使用該腳本能同時備份處理innodb和myisam,但在處理myisam時須要加一個讀鎖。
Xtrabackup備份原理,Innobackupex在後臺線程不斷追蹤InnoDB的日誌文件,而後複製InnoDB的數據文件。數據文件複製完成以後,日誌的複製線程也會結束。這樣就獲得了不在同一時間點的數據副本和開始備份之後的事務日誌。完成上面的步驟以後,就可使用InnoDB奔潰恢復代碼執行事務日誌(Redo log),已達到數據的一致性。其備份優勢以下:
備份速度快,物理備份更加可靠;
備份過程不會打斷正在執行的事務,無需鎖表;
可以基於壓縮等功能節約磁盤空間和流量;
自動備份效驗;
還原速度快;
能夠流傳將備份傳輸到另外一臺機器上;
節約磁盤空間和網絡帶寬。
Innobackupex工具的備份過程原理,如圖所示:
Innobackupex備份過程當中首先啓動Xtrabackup_log後臺檢測的進程,實時檢測Mysql redo的變化,一旦發現Redo有新的日誌寫入,馬上將日誌寫入到日誌文件Xtrabackup_log中,並複製Innodb的數據文件和系統表空間文件idbdata1到備份目錄。
Innodb引擎表備份完成以後,執行Flush table with read lock操做進行Mylsam表備份。拷貝.frm .myd .myi文件,而且在這一時刻得到binary log的位置,將表進行解鎖unlock tables。中止Xtrabackup_log進程,完成整個數據庫的備份。
(1)官方下載Percona-xtrabackup
cd /usr/src wget http://www.percona.com/downloads/XtraBackup/XtraBackup-2.1.9/binary/Linux/x86_64/percona-xtrabackup-2.1.9-744-Linux-x86_64.tar.gz tar -zxf percona-xtrabackup-2.1.9-744-Linux-x86_64.tar.gz
(2)Percona-xtrabackup軟件安裝方法,複製innobackupex xtrabackup xtrabackup_55 xtrabackup_56工具到/usr/bin目錄下,代碼以下:
cd /usr/src/percona-xtrabackup-2.1.9-Linux-x86_64/bin/ cp innobackupex xtrabackup xtrabackup_55 xtrabackup_56 /usr/bin/
(1)數據庫備份
mkdir -p /data/backup/mysql/
innobackupex --user=root --password=123456 /data/backup/mysql/
(2)數據庫恢復
Innobackupex數據庫恢復,恢復前要保證數據一致性,執行以下命令:
innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --apply-log /data/backup/mysql/2019-01-30_10-26-17/
一般數據庫備份完成後,數據尚不能直接用於恢復操做,由於備份的數據時是一個過程,在備份過程當中,有任務會寫入數據,可能會包含還沒有提交的事務或已經提交但還沒有同步至數據文件中的事務。
由於此時數據文件扔處理不一致狀態,基於--apply-log能夠經過回滾未提交的事務及同步已經提交的事務至數據文件使數據文件處於一致性狀態,方可進行恢復操做。
Apply-log過程能夠在任何機器上運行,沒有強制在線上或者備份庫上運行,能夠把備份複製在閒置的服務器上去運行,以此來下降備份庫的壓力,必須保證backup和apply-log所使用的mysqlbackup的版本要一致。
(3)刪除原數據目錄/var/lib/mysql數據,使用參數--copy-back恢復完整數據,受權mysql用戶給全部的數據庫文件,如圖所示:
rm -rf /var/lib/mysql/* innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --copy-back /data/backup/mysql/2019-01-30_10-26-17/
chown -R mysql:mysql /var/lib/mysql/
查看數據庫恢復信息,數據徹底恢復,如圖所示:
增量備份僅能應用於InnoDB或XtraDB表,對於MyISAM表而言,執行增量備份時其實進行的是徹底備份。
(1)增量備份以前必須執行徹底備份,如圖所示:
innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --databases=discuz /data/backup/mysql/
(2)執行第一次增量備份:
innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --databases=discuz --incremental /data/backup/mysql/ --incremental-basedir=/data/backup/mysql/2019-01-30_13-57-09
增量備份完後,會在/data/backup/mysql/目錄下生成新的備份目錄。如圖所示:
(3)數據表插入新數控
(4)執行第二次增量備份,備份命令以下:
innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --databases=discuz --incremental /data/backup/mysql/ --incremental-basedir=/data/backup/mysql/2019-01-30_13-58-58
五、mysql增量數據庫恢復
刪除原數據庫中表及數據記錄信息,如圖所示:
增量備份數據恢復方法以下步驟:
(1)基於Apply-log確保數據一致性:
innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --apply-log --redo-only /data/backup/mysql/2019-01-30_13-57-09/
(2)執行第一次增量數據恢復:
innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --apply-log --redo-only /data/backup/mysql/2019-01-30_13-57-09/ --incremental-dir=/data/backup/mysql/2019-01-30_13-58-58
(2)執行第二次增量恢復:
innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --apply-log --redo-only /data/backup/mysql/2019-01-30_13-57-09/ --incremental-dir=/data/backup/mysql/2019-01-30_14-07-58
(4)執行完整數據恢復:
innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --copy-back /data/backup/mysql/2019-01-30_13-57-09/