溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

使用xtrabackup工具備份與恢復(fù)MySQL數(shù)據(jù)庫(kù)的方法

發(fā)布時(shí)間:2020-05-11 10:48:18 來(lái)源:億速云 閱讀:298 作者:三月 欄目:MySQL數(shù)據(jù)庫(kù)

下面一起來(lái)了解下使用xtrabackup工具備份與恢復(fù)MySQL數(shù)據(jù)庫(kù)的方法,相信大家看完肯定會(huì)受益匪淺,文字在精不在多,希望使用xtrabackup工具備份與恢復(fù)MySQL數(shù)據(jù)庫(kù)的方法這篇短內(nèi)容是你想要的。

一. 為什么需要備份

在實(shí)際生產(chǎn)環(huán)境中誤刪操作,硬件損壞都會(huì)導(dǎo)致數(shù)據(jù)不可用,這個(gè)時(shí)候我們就需要備份來(lái)實(shí)現(xiàn)災(zāi)難恢復(fù)。還需注意的是硬件級(jí)的冗余,例如raid,也不能取代備份操作,因?yàn)閿?shù)據(jù)誤刪之后數(shù)據(jù)也是沒(méi)有的,所以備份必不可少。

二. 備份的分類(lèi)

1.物理備份和邏輯備份

物理備份 : 它是直接拷貝mysql的存儲(chǔ)在磁盤(pán)上的數(shù)據(jù)文件。這種備份使用的空間大,特別是innodb存儲(chǔ)數(shù)據(jù)使用的表空間,因?yàn)楸砜臻g分配大小是按一定的比例增長(zhǎng),所以存在沒(méi)有使用的空間。但是恢復(fù)時(shí)使用的時(shí)間少。
邏輯備份 : 將數(shù)據(jù)以sql語(yǔ)句的形式導(dǎo)出。導(dǎo)出數(shù)據(jù)和恢復(fù)數(shù)據(jù)所用的時(shí)間多,但占用空間小。

2.熱備、溫備、冷備

熱備 : 對(duì)線(xiàn)上環(huán)境不見(jiàn)任何鎖,不影響線(xiàn)上任何數(shù)據(jù)庫(kù)操作。
溫備 : 在備份之間要獲取鎖,并施加鎖。在加鎖期間會(huì)影響某些操作。
冷備 : 備份之前停掉云服務(wù)器,然后在備份。

使用xtrabackup工具備份與恢復(fù)MySQL數(shù)據(jù)庫(kù)的方法

三. XtraBackup

XtraBackup是Percona旗下的一款開(kāi)源熱備工具,能夠在不鎖數(shù)據(jù)庫(kù)的情況下備份MySQL數(shù)據(jù)。它能夠備份InnoDB,XtraDB,MyISAM表,MySQL版本支持5.1,5.5,5.5,5.7。
XtraBackup具有如下功能:

能夠?qū)nnoDB實(shí)現(xiàn)熱備,無(wú)需暫停數(shù)據(jù)庫(kù)
能夠?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引擎中,一旦用戶(hù)的操作涉及到修改MySQL數(shù)據(jù),他并不會(huì)直接寫(xiě)入磁盤(pán),就會(huì)產(chǎn)生一個(gè)事務(wù),并將事務(wù)是記錄在事務(wù)日志中的,而記錄日志是使用的round-robin方式,事務(wù)日志空間大小一定,也就說(shuō)后面的事務(wù)日志會(huì)覆蓋前面。只有當(dāng)用戶(hù)提交事務(wù)后,數(shù)據(jù)才會(huì)持久化到磁盤(pán)。

2)表空間

InnoDB存儲(chǔ)數(shù)據(jù)使用的是表空間,在這個(gè)空間中,InnoDB自行組織數(shù)據(jù),所有的數(shù)據(jù)放在page上,每個(gè)page的大小固定默認(rèn)是16KB,你可以通過(guò)innodb_page_size將其調(diào)大調(diào)小。一個(gè)page中除了存儲(chǔ)數(shù)據(jù)庫(kù)數(shù)據(jù),還存儲(chǔ)了這個(gè)表的元數(shù)據(jù),用于描述此page。其中一個(gè)元數(shù)據(jù)就是log sequence number日志序列號(hào),它是進(jìn)行增量備份的基礎(chǔ)。

3)備份原理

XtraBackup在開(kāi)始的時(shí)候會(huì)記錄日志序列號(hào)(LSN),然后開(kāi)始拷貝磁盤(pán)上的數(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ù)日志,并拷貝在此期間寫(xiě)入的事務(wù)日志。這個(gè)過(guò)程是一個(gè)持續(xù)過(guò)程,因?yàn)槭聞?wù)日志會(huì)覆蓋前面的。

4)增量備份實(shí)現(xiàn)原理

在前面提到過(guò)增量備份的實(shí)現(xiàn)依賴(lài)于LSN,它是一個(gè)page所具有的屬性。那么在備份時(shí)如何利用他實(shí)現(xiàn)增量備份呢?首先我們對(duì)數(shù)據(jù)進(jìn)行完全備份,完全備份時(shí)數(shù)據(jù)有四個(gè)頁(yè),頁(yè)的編號(hào)為1,2,3,4。完全備份后如果LSN編為1的page數(shù)據(jù)改變了,此時(shí)他的LSN的編號(hào)在最大的LSN編號(hào)加1,也就是說(shuō)他的編號(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ù)沒(méi)有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操作,這也就是為什么說(shuō)XtraBackup備份InnoDB是熱備,備份MyISAM是溫備。
拷貝MyISAM時(shí),并不影響InnoDB數(shù)據(jù)的操作,也就是說(shuō)InnoDB數(shù)據(jù)在改變。這樣會(huì)導(dǎo)致MyISAM和InnoDB數(shù)據(jù)在某一時(shí)刻并不是一致的。為了能讓其數(shù)據(jù)一致,拷貝完之后還需要事務(wù)日志和二進(jìn)制日志。而這個(gè)過(guò)程他要施加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:描述備份的類(lèi)型(全備或增量備份)、它的狀態(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)制所處的位置,通過(guò)SHOW MASTER STATUS獲取
  • xtrabackup_binlog_pos_innodb:InnoDB表當(dāng)前所處的二進(jìn)制位置。與InnoDB事務(wù)相關(guān)
  • xtrabackup_logfile:在備份過(guò)程中拷貝的事務(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
展開(kāi)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測(cè)試組件
~]# 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à),最后的輸出信息會(huì)出現(xiàn)completed OK!

  • 參數(shù)解釋
    --defaults-file:讀取mysql默認(rèn)的參數(shù),這個(gè)要是命令行的第一個(gè)參數(shù),不能是符號(hào)鏈接文件。
    --user --host --password 登錄主機(jī),用戶(hù)名和密碼
    /backups/full:備份目錄,如果沒(méi)有會(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

    可以通過(guò)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)在就是要通過(guò)回滾未提交的事務(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à),最后的輸出信息會(huì)出現(xiàn)completed OK!
    參數(shù)說(shuō)明

    --apply-log:應(yīng)用在備份期間產(chǎn)生的事務(wù)日志。
    --redo-only:表明應(yīng)用日志的方式,將提交的日志重新提交,沒(méi)有提交的事務(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ù)說(shuō)明

    --incremental 表明此備份為增量備份。
    --incremental-basedir 指明增量備份一誰(shuí)為基礎(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ù)庫(kù)的方法這篇文章后,很多讀者朋友肯定會(huì)想要了解更多的相關(guān)內(nèi)容,如需獲取更多的行業(yè)信息,可以關(guān)注我們的行業(yè)資訊欄目。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI