新聞中心
下面一起來了解下使用xtrabackup工具備份與恢復(fù)MySQL數(shù)據(jù)庫的方法,相信大家看完肯定會(huì)受益匪淺,文字在精不在多,希望使用xtrabackup工具備份與恢復(fù)MySQL數(shù)據(jù)庫的方法這篇短內(nèi)容是你想要的。
一. 為什么需要備份
在實(shí)際生產(chǎn)環(huán)境中誤刪操作,硬件損壞都會(huì)導(dǎo)致數(shù)據(jù)不可用,這個(gè)時(shí)候我們就需要備份來實(shí)現(xiàn)災(zāi)難恢復(fù)。還需注意的是硬件級(jí)的冗余,例如raid,也不能取代備份操作,因?yàn)閿?shù)據(jù)誤刪之后數(shù)據(jù)也是沒有的,所以備份必不可少。
二. 備份的分類
1.物理備份和邏輯備份
物理備份 : 它是直接拷貝mysql的存儲(chǔ)在磁盤上的數(shù)據(jù)文件。這種備份使用的空間大,特別是innodb存儲(chǔ)數(shù)據(jù)使用的表空間,因?yàn)楸砜臻g分配大小是按一定的比例增長,所以存在沒有使用的空間。但是恢復(fù)時(shí)使用的時(shí)間少。
邏輯備份 : 將數(shù)據(jù)以sql語句的形式導(dǎo)出。導(dǎo)出數(shù)據(jù)和恢復(fù)數(shù)據(jù)所用的時(shí)間多,但占用空間小。
2.熱備、溫備、冷備
熱備 : 對(duì)線上環(huán)境不見任何鎖,不影響線上任何數(shù)據(jù)庫操作。
溫備 : 在備份之間要獲取鎖,并施加鎖。在加鎖期間會(huì)影響某些操作。
冷備 : 備份之前停掉云服務(wù)器,然后在備份。
三. XtraBackup
XtraBackup是Percona旗下的一款開源熱備工具,能夠在不鎖數(shù)據(jù)庫的情況下備份MySQL數(shù)據(jù)。它能夠備份InnoDB,XtraDB,MyISAM表,MySQL版本支持5.1,5.5,5.5,5.7。
XtraBackup具有如下功能:
能夠?qū)nnoDB實(shí)現(xiàn)熱備,無需暫停數(shù)據(jù)庫 能夠?qū)ySQL進(jìn)行增量備份 對(duì)MySQL備份能夠?qū)崿F(xiàn)流式壓縮并傳輸給其他云服務(wù)器 MySQL服務(wù)運(yùn)行時(shí)能夠在MySQL云服務(wù)器之間進(jìn)行表的遷移 能夠很容易創(chuàng)建一個(gè)MySQL從云服務(wù)器 備份MySQL時(shí)不會(huì)增加云服務(wù)器負(fù)擔(dān)
XtraBackup能夠帶InnoDB引擎創(chuàng)建的表實(shí)現(xiàn)熱備,對(duì)MyISAM引擎實(shí)現(xiàn)溫備。
四. XtraBackup如何實(shí)現(xiàn)備份
XtraBackup在備份數(shù)據(jù)是先備份InnoDB數(shù)據(jù),再備份MyISAM數(shù)據(jù),最后再記錄此次備份的信息。
1.XtraBackup如何對(duì)InnoDB實(shí)現(xiàn)備份
在解釋原理之前我們需要介紹InnoDB引擎的兩個(gè)重要特性,一個(gè)事務(wù)特性,一個(gè)是存儲(chǔ)數(shù)據(jù)所使用的表空間
1)事務(wù)
在InnoDB引擎中,一旦用戶的操作涉及到修改MySQL數(shù)據(jù),他并不會(huì)直接寫入磁盤,就會(huì)產(chǎn)生一個(gè)事務(wù),并將事務(wù)是記錄在事務(wù)日志中的,而記錄日志是使用的round-robin方式,事務(wù)日志空間大小一定,也就說后面的事務(wù)日志會(huì)覆蓋前面。只有當(dāng)用戶提交事務(wù)后,數(shù)據(jù)才會(huì)持久化到磁盤。
2)表空間
InnoDB存儲(chǔ)數(shù)據(jù)使用的是表空間,在這個(gè)空間中,InnoDB自行組織數(shù)據(jù),所有的數(shù)據(jù)放在page上,每個(gè)page的大小固定默認(rèn)是16KB,你可以通過innodb_page_size將其調(diào)大調(diào)小。一個(gè)page中除了存儲(chǔ)數(shù)據(jù)庫數(shù)據(jù),還存儲(chǔ)了這個(gè)表的元數(shù)據(jù),用于描述此page。其中一個(gè)元數(shù)據(jù)就是log sequence number日志序列號(hào),它是進(jìn)行增量備份的基礎(chǔ)。
3)備份原理
XtraBackup在開始的時(shí)候會(huì)記錄日志序列號(hào)(LSN),然后開始拷貝磁盤上的數(shù)據(jù)文件。在此期間如果數(shù)據(jù)改變了,那么數(shù)據(jù)就處于不同的位置。數(shù)據(jù)改變了,我們不一定要拷貝變化的數(shù)據(jù),我們可以記錄在此期間的改變的事務(wù)日志即可,因?yàn)槭聞?wù)日志也記錄了數(shù)據(jù)的改變。所以在拷貝數(shù)據(jù)期間,XtraBackup會(huì)啟動(dòng)一個(gè)后臺(tái)進(jìn)程監(jiān)控事務(wù)日志,并拷貝在此期間寫入的事務(wù)日志。這個(gè)過程是一個(gè)持續(xù)過程,因?yàn)槭聞?wù)日志會(huì)覆蓋前面的。
4)增量備份實(shí)現(xiàn)原理
在前面提到過增量備份的實(shí)現(xiàn)依賴于LSN,它是一個(gè)page所具有的屬性。那么在備份時(shí)如何利用他實(shí)現(xiàn)增量備份呢?首先我們對(duì)數(shù)據(jù)進(jìn)行完全備份,完全備份時(shí)數(shù)據(jù)有四個(gè)頁,頁的編號(hào)為1,2,3,4。完全備份后如果LSN編為1的page數(shù)據(jù)改變了,此時(shí)他的LSN的編號(hào)在大的LSN編號(hào)加1,也就是說他的編號(hào)會(huì)變?yōu)?,而不是2。同理如果LSN為3的變化了,他的LSN編號(hào)會(huì)變?yōu)?。增量備份的時(shí)候我們只需要備份lsn編號(hào)為5,6的page即可。
由于MyISAM引擎存儲(chǔ)數(shù)據(jù)沒有LSN所以在物理備份下實(shí)現(xiàn)增量備份。
2.XtraBackup備份MyISAM表
XtraBackup是在備份完InnoDB表之后,會(huì)運(yùn)行LOCK TABLES FOR BACKUP拷貝MyISAM表和.frm文件。這個(gè)鎖是在InnoDB數(shù)據(jù)拷貝后添加這個(gè)鎖是一個(gè)backup lock他比FLUSH TABLES WITH READ LOCK這個(gè)鎖更加輕量級(jí)。而且在加鎖期間并不會(huì)影響InnoDB DML操作,這也就是為什么說XtraBackup備份InnoDB是熱備,備份MyISAM是溫備。
拷貝MyISAM時(shí),并不影響InnoDB數(shù)據(jù)的操作,也就是說InnoDB數(shù)據(jù)在改變。這樣會(huì)導(dǎo)致MyISAM和InnoDB數(shù)據(jù)在某一時(shí)刻并不是一致的。為了能讓其數(shù)據(jù)一致,拷貝完之后還需要事務(wù)日志和二進(jìn)制日志。而這個(gè)過程他要施加LOCK BINLOG FOR BACKUP鎖,拷貝完成之后才會(huì)對(duì)二進(jìn)制日志和table解鎖。
3.備份創(chuàng)建的文件解釋
- backup-my.cnf:它并不是原始的my.cnf,而是Xtrabackup在備份時(shí)獲取的InnoDB引擎的相關(guān)數(shù)據(jù)。預(yù)還原的時(shí)候它會(huì)讀取此文件的內(nèi)容,或者從 XtraBackup --defaults-file指明的文件中讀取。
- xtrabackup_checkpoints:描述備份的類型(全備或增量備份)、它的狀態(tài)(例如prepared)和他的LSN范圍??煽慈缦率纠?br/>完全備份
backup_type = full-backuped from_lsn = 0 to_lsn = 15188961605 last_lsn = 15188961605
增量備份
backup_type = incremental from_lsn = 15188961605 to_lsn = 15189350111 last_lsn = 15189350111
- xtrabackup_binlog_info:在備份的那一刻云服務(wù)器二進(jìn)制所處的位置,通過SHOW MASTER STATUS獲取
- xtrabackup_binlog_pos_innodb:InnoDB表當(dāng)前所處的二進(jìn)制位置。與InnoDB事務(wù)相關(guān)
- xtrabackup_logfile:在備份過程中拷貝的事務(wù)日志,用于預(yù)還原
五.實(shí)驗(yàn)
本實(shí)驗(yàn)將會(huì)演示備份和還原操作,使用innobackup命令。
操作系統(tǒng)為centos 7.2
MySQL版本為5.5
1.安裝Percona-Xtrabackup
~]# wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/7/x86_64/Percona-XtraBackup-2.4.4-rdf58cf2-el7-x86_64-bundle.tar
展開tarball 其中包含三個(gè)rpm,
percona-xtrabackup-24:包含最新的Percona XtraBackup GA 二進(jìn)制以及相關(guān)文件
percona-xtrabackup-24-debuginfo:用于調(diào)試percona-xtrabackup-24中的二進(jìn)制程序
percona-xtrabackup-test-24:Percona Xtrabackup測試組件
~]# tar xf Percona-XtraBackup-2.4.4-rdf58cf2-el7-x86_64-bundle.tar
~]# yum install -y percona-xtrabackup-24-debuginfo-2.4.4-1.el7.x86_64.rpm percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm percona-xtrabackup-test-24-2.4.4-1.el7.x86_64.rpm
2.對(duì)數(shù)據(jù)進(jìn)行完全備份及其還原
1)創(chuàng)建完全備份
~]# innobackupex --defaults-file=/etc/my.cnf --user=root --host=127.0.0.1 --password=123456 /backups/full
完全備份成功的話,最后的輸出信息會(huì)出現(xiàn)completed OK!
- 參數(shù)解釋
--defaults-file:讀取mysql默認(rèn)的參數(shù),這個(gè)要是命令行的第一個(gè)參數(shù),不能是符號(hào)鏈接文件。 --user --host --password 登錄主機(jī),用戶名和密碼 /backups/full:備份目錄,如果沒有會(huì)自動(dòng)創(chuàng)建
生成文件
[root@slave ~]# ls -l /backups/full/ total 0 drwxr-x---. 7 root root 227 Mar 16 14:20 2018-03-16_14-20-35 [root@slave ~]# ls -l /backups/full/2018-03-16_14-20-35/ total 18460 -rw-r-----. 1 root root 417 Mar 16 14:20 backup-my.cnf drwxr-x---. 2 root root 272 Mar 16 14:20 hellodb -rw-r-----. 1 root root 18874368 Mar 16 14:20 ibdata1 drwxr-x---. 2 root root 4096 Mar 16 14:20 mysql drwxr-x---. 2 root root 4096 Mar 16 14:20 performance_schema drwxr-x---. 2 root root 62 Mar 16 14:20 pt drwxr-x---. 2 root root 20 Mar 16 14:20 test -rw-r-----. 1 root root 25 Mar 16 14:20 xtrabackup_binlog_info -rw-r-----. 1 root root 113 Mar 16 14:20 xtrabackup_checkpoints -rw-r-----. 1 root root 522 Mar 16 14:20 xtrabackup_info -rw-r-----. 1 root root 2560 Mar 16 14:20 xtrabackup_logfile
innobackupex會(huì)在指定存放數(shù)據(jù)的目錄下用當(dāng)前時(shí)間創(chuàng)建一個(gè)目錄,所有生成的備份文件都會(huì)這個(gè)時(shí)間目錄下。
- __查看xtrabackup_checkpoints文件__
backup_type = full-backuped from_lsn = 0 to_lsn = 1843549 last_lsn = 1843549 compact = 0 recover_binlog_info = 0
可以通過backup_type看到這是一個(gè)完全備份,lsn從0到1843549。
2)完全備份還原
這個(gè)備份不能用于恢復(fù),因?yàn)閭浞莸臄?shù)據(jù)中可能會(huì)包含尚未提交的事務(wù)或已經(jīng)提交但尚未同步至數(shù)據(jù)文件中的事務(wù),此時(shí)數(shù)據(jù)文件處于不一致的狀態(tài)。因此,我們現(xiàn)在就是要通過回滾未提交的事務(wù)及同步已經(jīng)提交的事務(wù)至數(shù)據(jù)文件也使得數(shù)據(jù)文件處于一致性狀態(tài)。
預(yù)還原
~]# innobackupex --apply-log --redo-only /backups/full/2018-03-16_14-20-35/
預(yù)還原成功的話,最后的輸出信息會(huì)出現(xiàn)completed OK!
參數(shù)說明--apply-log:應(yīng)用在備份期間產(chǎn)生的事務(wù)日志。 --redo-only:表明應(yīng)用日志的方式,將提交的日志重新提交,沒有提交的事務(wù)不要回滾,因?yàn)樗苡锌赡茉谙聜€(gè)備份中提交了。
- 還原
還原時(shí),mysql云服務(wù)器需要關(guān)閉,而且數(shù)據(jù)目錄需要為空。
~]# systemctl stop mariadb
~]# mv /var/lib/mysql /tmp
~]# mkdir /var/lib/mysql
~]# innobackupex --defaults-file=/etc/my.cnf --copy-back /backups/full/2018-03-16_14-20-35/
~]# chown -R mysql.mysql /var/lib/mysql
~]# systemctl start mariadb
2.完全備份+增量備份及其還原
備份
完全備份
~]# innobackupex --defaults-file=/etc/my.cnf --user=root --host=127.0.0.1 --password=123456 /backups/full
第一次增量備份
~]# innobackupex --defaults-file=/etc/my.cnf --user=root --host=127.0.0.1 --password=123456 --incremental /backups/incr-1 --incremental-basedir=/backups/full/2018-03-16_14-20-35/
第二次增量備份
~]# innobackupex --defaults-file=/etc/my.cnf --user=root --host=127.0.0.1 --password=123456 /backups/incr-2 /backups/incr-2 --incremental-basedir=/backups/incr-1/2018-03-16_15-20-32/
參數(shù)說明--incremental 表明此備份為增量備份。 --incremental-basedir 指明增量備份一誰為基礎(chǔ)。 /backups/incr-1 指明備份所放置的目錄
預(yù)還原
完全備份預(yù)還原
~]# innobackupex --apply-log --redo-only /backups/full/2018-03-16_14-20-35/
第一次增量備份預(yù)還原
~]# innobackupex --apply-log --redo-only /backups/incr-1/2018-03-16_15-20-32/ --incremental-dir=/backups/full/2018-03-16_14-20-35/
第二次增量備份與還原
~]# innobackupex --apply-log --redo-only /backups/incr-1/2018-03-16_16-01-44/ --incremental-dir=/backups/full/2018-03-16_14-20-35/--incremental-dir:指明以哪個(gè)備份作為還原處理。
- 還原
參考備份還原
六. 備份腳本
#!/bin/bash # Description: innobackupex backup MySQL # Date: 2018-01-23 # Version: 0.1.0 # Author: lirou #這個(gè)備份計(jì)劃以一周為一個(gè)周期,周一為完全備份,周二到周日都是以周一為基礎(chǔ)的增量備份。 #以一周還原的時(shí)候只需要周一的完全備份和周日的增量備份即可。 backup_dir_parent=/var/lib/mysql/backups backup_dir= full_backup_dir= increment_backup_dir= backup_times= backup_max_times=5 #登錄云服務(wù)器參數(shù) mysql_host=127.0.0.1 mysql_user=root mysql_password=123456 #MySQL服務(wù)配置文件 defaults_file=/etc/my.cnf #記錄備份是輸出的信息 backup_log=/var/log/innobackup/innobackup.log #記錄每次備份是否成功 backup_status=/var/log/innobackup/innobackup.status ! [ -d $backup_dir_parent ] && mkdir -pv $backup_dir_parent ! [ -d $backup_log ] && mkdir -pv $backup_log week=$(date "+%u") if [ $week -eq 1 ]; then backup_times=$(ls -l $backup_dir_parent | grep -i '^d.*backup.*' | wc -l) if [ $backup_times -ge $backup_max_times ];then rm -rf ${backup_dir_parent}/$(ls -lt $backup_dir_parent |tail -l) fi backup_dir=${backup_dir_parent}/backup-$(date "+%Y-%m-%d") full_backup_dir=${backup_dir}/full innobackupex --defaults-file=${defaults_file} --host=${mysql_host} --user=${mysql_user} --password=${mysql_password} ${full_backup_dir} &> $backup_log else backup_dir=${backup_dir_parent}/$(ls -lt $backup_dir_parent | grep -i '^d.*backup.*' | head -1 | grep -o 'backup.*') increment_backup_dir=${backup_dir}/incr-${week} innobackupex --defaults-file=${defaults_file} --host=${mysql_host} --user=${mysql_user} --password=${mysql_password} --incremental=${backup_dir}/full ${increment_backup_dir} &> $backup_log fi echo "$(date '+%Y-%m-%d'):$?" >> $backup_status
此備份腳本在制作定時(shí)任務(wù)時(shí),一定要確保周一的完全備份執(zhí)行了,因?yàn)橹芏街苋盏脑隽慷家运麨榛A(chǔ)。
看完使用xtrabackup工具備份與恢復(fù)MySQL數(shù)據(jù)庫的方法這篇文章后,很多讀者朋友肯定會(huì)想要了解更多的相關(guān)內(nèi)容,如需獲取更多的行業(yè)信息,可以關(guān)注我們的行業(yè)資訊欄目。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
文章題目:使用xtrabackup工具備份與恢復(fù)MySQL數(shù)據(jù)庫的方法-創(chuàng)新互聯(lián)
瀏覽地址:http://www.dlmjj.cn/article/jdeoj.html