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)。
冷備份
-
直接通過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 -
使用 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效率高不少
暴力備份,直接拷貝存放數(shù)據(jù)文件的 data 目錄(不推薦)
熱備份
-
InnoDB Hot Backup
InnoDB Hot Backup 是MySQL社區(qū)版的熱備份工具,但是它是收費的,只能試用30天,只有購買企業(yè)版才可以得到永久使用權(quán)。
-
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原理解釋:
- innobackupex啟動后,會先fork一個進程,用于啟動xtrabackup,然后等待xtrabackup備份ibd數(shù)據(jù)文件;
- 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)建)
- xtrabackup拷貝完成ibd數(shù)據(jù)文件后,會通知innobackupex(通過創(chuàng)建文件),同時xtrabackup進入等待狀態(tài)(redo線程依舊在拷貝redo.log)
- innobackupex收到xtrabackup通知后哦,執(zhí)行FLUSH TABLES WITH READ LOCK(FTWRL),取得一致性位點,然后開始備份非InnoDB文件(如frm、 MYD、MYI、CSV、opt、par等格式的文件),在拷貝非InnoDB文件的過程當(dāng)中,數(shù)據(jù)庫處于全局只讀狀態(tài)。
- 當(dāng)innobackup拷貝完所有的非InnoDB文件后,會通知xtrabackup,通知完成后,進入等待狀態(tài);
- xtrabackup收到innobackupex備份完成的通知后,會停止redo拷貝線程,然后通知innobackupex,redo.log文件拷貝完成;
- innobackupex收到redo.log備份完成后,就進行解鎖操作,執(zhí)行:UNLOCK TABLES;
- 最后innbackupex和xtrabackup進程各自釋放資源,寫備份元數(shù)據(jù)信息等,innobackupex等xtrabackup子進程結(jié)束后退出。