MySQL的冷熱備份

MySQL備份功能在實際應(yīng)用中的重要程度不需要多說,在誤刪重要數(shù)據(jù)后或者數(shù)據(jù)庫被攻擊后,備份數(shù)據(jù)的作用就突顯出來了。

MySQL備份方式從不同的角度分析有不同的分類。 從運行狀態(tài)分析,有冷備份和熱備份之分。冷備份一般是在數(shù)據(jù)庫關(guān)閉或者暫時不對外提供服務(wù)時,選擇某一時間節(jié)點對完整數(shù)據(jù)庫進行快照備份。熱備份一般是在數(shù)據(jù)庫運行的狀態(tài)下,直接對數(shù)據(jù)進行備份,不影響MySQL對外提供服務(wù)。這里主要講下這兩種方式的實現(xiàn)。

冷備份

  1. 直接通過MySQL自帶的mysqldump工具進行備份

    備份實現(xiàn)

    # mysqldump -u賬號 -p密碼 要備份的數(shù)據(jù)庫名 > 要備份到的目錄及文件名
    mysqldump -uroot -proot test > /data/backup/test.sql
    

    恢復(fù)實現(xiàn)

    mysql -f -uroot -proot test < /data/backup/test.sql
    
  2. 使用 mydumper 工具進行備份

    mydumper是一個針對MySQL和drizzle的高性能多線程的備份和恢復(fù)工具。此工具的開發(fā)人員分別來自MySQL、facebook、skysql公司,目前已經(jīng)有一些大型產(chǎn)品業(yè)務(wù)測試并使用了該工具。

    它的特性/優(yōu)點:

    • 由C語言編寫
    • 相比于MySQL自帶的 mysqldump,其速度快了近10倍
    • 具有事務(wù)性和非事務(wù)性表一致的快照(適用于0.2.2+)
    • 可快速進行文件壓縮(File compression on-the-fly)
    • 支持導(dǎo)出binlog
    • 可多線程恢復(fù)(適用于0.2.1+)
    • 可以用守護進程的工作方式,定時掃描和輸出連續(xù)的二進制日志

    它的安裝

    # 安裝需要的依賴
    yum install glib2-devel zlib-devel pcre-devel cmake
    # 下載。也可以直接在GitHub上下載安裝包或者rpm
    git clone https://github.com/maxbube/mydumper.git
    cd mydumper
    cmake .
    make && make install
    

    安裝完可以輸出下版本號測試是否安裝成功

    [root@localhost mydumper]# mydumper -V
    mydumper 0.10.6, built against MySQL 5.7.34
    [root@localhost mydumper]#
    

    備份實現(xiàn)

    mydumper -u root -p root -B test -o /data/backup/test.sql
    

    恢復(fù)實現(xiàn)

    myloader -u root -p root -B test -d /data/backup/test.sql
    

    參數(shù)介紹

    -host / -h:連接的MySQL服務(wù)器

    -user / -u:用戶備份的連接用戶

    -password / -p:用戶的密碼

    -port / -P:連接端口

    -socket / -S:連接socket文 件

    -database / -B:需要備份的數(shù)據(jù)庫

    -table-list / -T:需要備份的表,用逗號(,)分隔

    -outputdir / -o:輸出的目錄

    -build-empty-files / -e:默認無數(shù)據(jù)則只有表結(jié)構(gòu)文件

    -regex / -x:支持正則表達式,如mydumper-regex'(2l(mysqltest)'

    -ignore-engines / -i:忽略的存儲引擎

    -no-schemas / -m:不導(dǎo)出表結(jié)構(gòu)

    -long-query-guard:長查詢,默認60s

    -kill-long-queries / -k:可以設(shè)置kill長查詢

    -verbose / -v:0=silent,1=errors, 2=warmings,3=info,默認是2

    -binlogs / -b:導(dǎo)出binlog

    -daemon / -D:啟用守護進程模式

    -snapshot-interval / -I:dump快照間隔時間,默認60s

    -logfile / -L:目志輸出,一般在Daemon模式下使用。

    mydumper與mysqldump備份數(shù)據(jù)效率的對比

    [root@localhost backup]# time mysqldump -uroot -proot test > /data/backup/test1.sql
    mysqldump: [Warning] Using a password on the command line interface can be insecure.
    
    real 0m0.033s
    user 0m0.006s
    sys  0m0.005s
    [root@localhost backup]# time mydumper -u root -p root -B test -o /data/backup/test.sql
    
    real 0m0.019s
    user 0m0.005s
    sys  0m0.007s
    [root@localhost backup]#
    

    這里由于數(shù)據(jù)量很少,差距看的不是很明顯,但還是可以看出mydumper要比mysqldump效率高不少

  3. 暴力備份,直接拷貝存放數(shù)據(jù)文件的 data 目錄(不推薦)

熱備份

  1. InnoDB Hot Backup

    InnoDB Hot Backup 是MySQL社區(qū)版的熱備份工具,但是它是收費的,只能試用30天,只有購買企業(yè)版才可以得到永久使用權(quán)。

  2. xtrabackup

    xtrabackup 是Percona公司發(fā)布的一個開源熱備份工具,支持在線熱備份(備份時不影響數(shù)據(jù)讀寫),是商業(yè)備份工具 InnoDB Hot Backup 的一個很好的替代品。

    xtrabackup中包含兩個工具:

    • xtrabackup:用于熱備份InnoDB及XtraDB表中數(shù)據(jù)的工具,不能備份其他類型的表,也不能備份數(shù)據(jù)表結(jié)構(gòu)
    • innobackupex:是將xtrabackup進行封裝的perl 腳本,可以說是xtrabackup的升級版,它提供了備份MyISAM表的能力。由于它的功能更為全面完善,所以一般選擇它來進行熱備份

    安裝方式:

    下載地址:https://www.percona.com/downloads/Percona-XtraBackup-LATEST/

    操作手冊:https://www.percona.com/doc/percona-xtrabackup/2.4/installation/yum_repo.html

    注意事項:

    1、xtrabackup安裝的版本需要和MySQL對應(yīng)。xtrabackup8.0只能備份MySQL8.0的數(shù)據(jù)。如果MySQL版本沒有達到8.0, 則不能使用這個版本。

    2、xtrabackup8.0及以上高版本沒有innobackupex命令

    這里MySQL版本是5.7,所以下載的 xtrabackup2.4 版本

    [root@localhost ~]# wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/7/x86_64/perconaxtrabackup-24-2.4.4-1.el7.x86_64.rpm
    [root@localhost ~]# yum localinstall percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm
    [root@localhost ~]# rpm -qa | grep xtrabackup
    percona-xtrabackup-24-2.4.4-1.el7.x86_64
    [root@localhost ~]#
    

    查看當(dāng)前 xtrabackup 版本及對應(yīng)支持的MySQL版本

    [root@localhost ~]# xtrabackup -v
    xtrabackup version 2.4.4 based on MySQL server 5.7.13 Linux (x86_64) (revision id: df58cf2)
    [root@localhost ~]#
    

    常用參數(shù):

    --host 指定主機
    --user 指定用戶名
    --password 指定密碼
    --port 指定端口
    --databases 指定數(shù)據(jù)庫
    --incremental 創(chuàng)建增量備份
    --incremental-basedir 指定包含完全備份的目錄
    --incremental-dir 指定包含增量備份的目錄
    --apply-log 對備份進行預(yù)處理操作
    一般情況下,在備份完成后,數(shù)據(jù)尚且不能用于恢復(fù)操作,因為備份的數(shù)據(jù)中可能會包含尚未提交的事務(wù)或已經(jīng)提交但尚未同步至數(shù)據(jù)文件中的事務(wù)。
    因此,此時數(shù)據(jù)文件仍處于不一致狀態(tài)?!皽?zhǔn)備”的主要作用正是通過回滾未提交的事務(wù)及同步已經(jīng)提交的事務(wù)至數(shù)據(jù)文件也使得數(shù)據(jù)文件處于一致性狀態(tài)。
    --redo-only 不回滾未提交事務(wù)
    --copy-back 恢復(fù)備份目錄
    

    備份操作:

    # 完成后會自動在指定的備份目錄下創(chuàng)建一個當(dāng)前時間的文件夾
    innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --databases test --backup /data/backup/test
    

    恢復(fù)操作:

    # 停止MySQL
    service mysql stop
    # 將存放mysql數(shù)據(jù)文件的data目錄備份
    mv /www/server/data /www/server/data_backup
    # 恢復(fù)操作,會自動創(chuàng)建data目錄,創(chuàng)建的位置是my.cnf配置文件中配置的data目錄地址
    innobackupex --defaults-file=/etc/my.cnf --copy-back /data/backup/test/2021-07-08_00-22-18
    # 修改data目錄權(quán)限
    chown -R mysql:mysql /www/server/data
    # 啟動MySQL
    service mysql start
    

    原理解釋:

    1. innobackupex啟動后,會先fork一個進程,用于啟動xtrabackup,然后等待xtrabackup備份ibd數(shù)據(jù)文件;
    2. xtrabackup在備份innoDB數(shù)據(jù)是,有2種線程:redo拷貝線程和ibd數(shù)據(jù)拷貝線程。xtrabackup進程開始執(zhí)行后,會啟動一個redo拷貝的線程,用于從最新的 checkpoint點開始順序拷貝redo.log;再啟動ibd數(shù)據(jù)拷貝線程,進行拷貝ibd數(shù)據(jù)。這里是先啟動redo拷貝線程的。在此階段,innobackupex進行處于等待 狀態(tài)(等待文件被創(chuàng)建)
    3. xtrabackup拷貝完成ibd數(shù)據(jù)文件后,會通知innobackupex(通過創(chuàng)建文件),同時xtrabackup進入等待狀態(tài)(redo線程依舊在拷貝redo.log)
    4. innobackupex收到xtrabackup通知后哦,執(zhí)行FLUSH TABLES WITH READ LOCK(FTWRL),取得一致性位點,然后開始備份非InnoDB文件(如frm、 MYD、MYI、CSV、opt、par等格式的文件),在拷貝非InnoDB文件的過程當(dāng)中,數(shù)據(jù)庫處于全局只讀狀態(tài)。
    5. 當(dāng)innobackup拷貝完所有的非InnoDB文件后,會通知xtrabackup,通知完成后,進入等待狀態(tài);
    6. xtrabackup收到innobackupex備份完成的通知后,會停止redo拷貝線程,然后通知innobackupex,redo.log文件拷貝完成;
    7. innobackupex收到redo.log備份完成后,就進行解鎖操作,執(zhí)行:UNLOCK TABLES;
    8. 最后innbackupex和xtrabackup進程各自釋放資源,寫備份元數(shù)據(jù)信息等,innobackupex等xtrabackup子進程結(jié)束后退出。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容