MySQL資料庫備份——Xtrabacup
Xtrabackup 是一款強大的線上
熱備份
工具,在備份的過程中不會產生鎖表(不會影響資料庫讀寫)。xtrabackup
和innobackupex
是主要的兩個使用工具。
xtrabackup
主要支援InnoDB以及 XtraDB 兩種引擎的資料庫,其他的引擎目前來看暫不支援;
innobackupex
則封裝了xtrabackup,所以能夠同時備份處理 InnoDB 以及 MyISAM 引擎,但是需要注意的是,在處理MyISAM的時候,需要加上一個讀鎖
,如果想在備份MyISAM的引擎資料庫時,可以在進行增量備份時新增--no-lock
選項。
另外,Xtrabackup具有備份速度快且可靠,在備份的過程的中不會打斷正在執行的事務,能夠基於壓縮等功能節約磁碟空間和流量。
在安裝之前,我們先了解下,什麼時候使用mysqldump以及何時使用Xtrabackup的問題
在編者看來,如果資料庫小於10GB
的,可以選擇使用Mysqldump直接進行備份,但是要注意的是,在使用mysqldump命令進行備份時,可能備份的時間會較長,且會產生鎖,然後會導致大量的訪問等待以及慢查詢
不產生鎖的選項
。如果是
大於10GB以上
的資料庫吧,編者就建議使用Xtrabackup進行備份,畢竟xtrabackup支援多引擎線上熱備份
,不會產生所謂的鎖,但是特別需要注意的就是,MyISAM引擎的備份,前面也提到了,備份MyISAM引擎資料庫時會產生鎖
,所以在備份時需要特別注意MyISAM引擎的資料庫。
安裝Xtrabackup
需要注意的是,在安裝版本之前先了解好自身使用的MySQL版本,然後再選擇相對應的Xtrabackup版本,否則會出現版本不一致,而導致innobackupex無法使用
編者這裡採用的是5.7.x版本的MySQL資料庫,所以最低都需要Xtrabackup 2.4.x版本才能支援。
CentOS
[[email protected]] yum -y install perl-Digest-MD5.x86_64 rsync perl-DBD-MySQL libev*
[[email protected]] wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.12/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm
[[email protected]] rpm -ivh percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm
[[email protected]] innobackupex -v
Ubuntu
[[email protected]] wget https://repo.percona.com/apt/percona-release_0.1-6.$(lsb_release -sc)_all.deb
[[email protected]] dpkg -i percona-release_0.1-6.$(lsb_release -sc)_all.deb
[[email protected]] apt-get update
[[email protected]] apt-get -y install libev4
[[email protected]] apt-get -y install percona-xtrabackup-24
[[email protected]] innobackupex -v
Innobackupex的使用
安裝好Percona-Xtrabackup後,接下來就是如何使用innobackupex進行線上熱備的事情了。
在進行備份之前我們需要將資料庫進行一次全量備份,隨後才是進行每一次的增量備份。
全量備份
[[email protected]] innobackupex --user=username --password=password --databases=需要備份的庫 備份的路徑 --no-timestamp
#對於全備來說,可以不使用--databases這個選項,直接填寫備份的路徑也是直接預設為全量備份
增量備份
[[email protected]] innobackupex --user=username --password=password --databases=需要備份的庫 --incremental 增量備份的路徑 --incremental-basedir=上一次備份的檔案 --no-timestamp # 第一次增量備份的上一個備份檔案的路徑應為全備的路徑
[[email protected]] innobackupex --user=username --password=password --databases=需要備份的庫 --incremental 增量備份的路徑 --incremental-basedir=上一次備份的檔案 --no-timestamp # 第二次增量備份的上一個備份檔案的路徑應為第一次增量備份的路徑,依此類推。
恢復資料庫
- 在進行資料恢復之前,需要
停止MySQL資料庫服務
&清空MySQL根目錄下所有(/var/lib/mysql/)
,MySQL的根目錄根據實際情況而定。 - 恢復資料
[[email protected]] systemctl stop mysqld # CentOS
[[email protected]] /etc/init.d/mysqld stop # Ubuntu
[[email protected]] rm -rf /var/lib/mysql/*
[[email protected]] innobackupex --user=username --password=password --apply-log --redo-only 全量備份的路徑
- 合併日誌
[[email protected]] innobackupex --user=username --password=password --apply-log --redo-only 全量備份的路徑 --incremental-dir=第一次增量備份的路徑
#切記需要按增量備份的順序進行日誌的合併,如不按順序,LSN無法契合,則會導致資料的不一致,甚至是報錯
- 合併完所有日誌之後,將備份檔案拷貝到資料庫的目錄下
[[email protected]] innobackupex --user=username --password=password --copy-back 全量備份的路徑
當把資料都拷貝到資料庫的目錄下後,我們需要將其屬主屬組的都修改為 mysql
,必要時需要給予執行許可權
[[email protected]] chown mysql.mysql -R /var/lib/mysql/
[[email protected]] chmod 755 -R /var/lib/mysql/
[[email protected]] systemctl start mysqld
現在我們已經瞭解怎麼將資料庫進行增量備份以及增量恢復資料。
如果在生產環境下要手動進行備份就顯得太過麻煩了,那麼我們可以寫個 指令碼+cron定時任務 進行自動化的進行備份以及恢復資料。
編者已經將Xtrabackup定時備份的指令碼放在了編者的Github上,需要的讀者可以 訪問 或者進行 下載 。
# 訪問瀏覽
https://github.com/Scirh/Shell-Script/blob/master/Xtraback.sh
# 指令碼下載
[[email protected]] wget https://raw.githubusercontent.com/Scirh/Shell-Script/master/Xtraback.sh
另提供使用mysqldump備份的指令碼
# 訪問瀏覽
https://github.com/Scirh/Shell-Script/blob/master/Mysql_Backup.sh
# 指令碼下載
[[email protected]] wget https://raw.githubusercontent.com/Scirh/Shell-Script/master/Mysql_Backup.sh
指令碼下載下來後,根據自己的實際情況進行修改,編者在指令碼內提供了兩種備份方式:
- 只進行一次全備,其他時間都是進行增量備份;
- 週期性備份。也就是每個週日進行一次全量,其餘時間都是增量備份,但是需要注的是,得根據個人實際情況,是否需要在進行全備前,合併週期內的日誌,並儲存留底
感謝閱讀,本文旨在提供參考,如有錯誤,歡迎大家指正。幫助編者不斷的改進!