使用Xtrabackup對數據庫進行部分備份恢復


Xtrabackup也可以實現部分備份,即只備份某個或某些指定的數據庫或某數據庫中的某個或某些表。但要使用此功能,必須啟用innodb_file_per_table選項,即每張表保存為一個獨立的文件。同時,其也不支持--stream選項,即不支持將數據通過管道傳輸給其它程序進行處理。此外,還原部分備份跟還原全部數據的備份也有所不同,即你不能通過簡單地將prepared的部分備份使用--copy-back選項直接復制回數據目錄,而是要通過導入表的方向來實現還原。當然有些情況下,部分備份也可以直接通過--copy-back進行還原,但這種方式還原而來的數據多數會產生數據不一致的問題,因此,無論如何不推薦使用這種方式。

創建部分備份

創建部分備份的方式有三種:正則表達式(--include), 枚舉表文件(--tables-file)和列出要備份的數據庫(--databases)。
(1) 使用--include
使用--include時,要求為其指定要備份的表的完整名稱,即形如databasename.tablename,如:

innobackupex --include='^test[.]tb1' /path/to/backup

(2) 使用--tables-file
此選項的參數需要是一個文件名,此文件中每行包含一個要備份的表的完整名稱;如:

echo -e 'test.tb1\ntest.tb2' > /tmp/tables.txt
innobackupex --tables-file=/tmp/tables.txt  /path/to/backup

(3) 使用--databases
此選項接受的參數為數據名,如果要指定多個數據庫,彼此間需要以空格隔開;同時,在指定某數據庫時,也可以只指定其中的某張表。此外,此選項也可以接受一個文件為參數,文件中每一行為一個要備份的對象。如:

innobackupex --databases="testdb1 testdb2"  /path/to/backup

備份指定數據庫

根據需要對test庫做完整備份,這里使用--databases選項

/usr/bin/innobackupex --defaults-file=/etc/my.cnf  --use-memory=4G --host=localhost --user=backup --password=123456 --port=3306 --databases=test /data/backup

查看備份目錄下只有test庫

[root@db ~]# ls /data/backup/2021-08-28_14-46-02/
backup-my.cnf     undo003  undo009  undo015  undo021  undo027  undo033  undo039  undo045  undo051  undo057  undo063  undo069  undo075  undo081  undo087  undo093                 xtrabackup_logfile
ib_buffer_pool    undo004  undo010  undo016  undo022  undo028  undo034  undo040  undo046  undo052  undo058  undo064  undo070  undo076  undo082  undo088  undo094
ibdata1           undo005  undo011  undo017  undo023  undo029  undo035  undo041  undo047  undo053  undo059  undo065  undo071  undo077  undo083  undo089  undo095
test              undo006  undo012  undo018  undo024  undo030  undo036  undo042  undo048  undo054  undo060  undo066  undo072  undo078  undo084  undo090  xtrabackup_binlog_info
undo001           undo007  undo013  undo019  undo025  undo031  undo037  undo043  undo049  undo055  undo061  undo067  undo073  undo079  undo085  undo091  xtrabackup_checkpoints
undo002           undo008  undo014  undo020  undo026  undo032  undo038  undo044  undo050  undo056  undo062  undo068  undo074  undo080  undo086  undo092  xtrabackup_info

備份數據庫表結構

mysqldump -uroot -p --single-transaction --master-data=2 --set-gtid-purged=OFF -d test > test.sql

將備份傳送至災備演練服務器上

scp -r /data/backup/2021-08-28_14-46-02 test.sql 192.168.0.110:/root 

接下來在災備演練服務器上操作

還原指定數據庫

還原test表結構

mysql -uroot -p test < test.sql

刪除test庫中所有表空間

for i in $(grep "CREATE TABLE" test.sql | awk '{print $3}' | sed "s#\`##g");do;mysql -u root -p123456 -e "set foreign_key_checks=0;alter table test.$i discard tablespace;" &> /dev/null;done

prepare部分備份,要使用--export選項進行:

innobackupex --apply-log --export /root/2021-08-28_14-46-02

將准備好的test庫中后綴名為cfg、ibd,frm文件復制到test庫下

cp -f 2021-08-28_14-46-02/test/*.cfg 2021-08-28_14-46-02/test/*.ibd 2021-08-28_14-46-02/test/*.frm /data/mysql3306/data/test/

修改屬主

chown -R mysql:mysql /data/mysql3306/data/test/

導入表空間

for i in $(grep "CREATE TABLE" test.sql | awk '{print $3}' | sed "s#\`##g");do;mysql -u root -p123456 -e "set foreign_key_checks=0;alter table test.$i import tablespace;analyze table test.$i;" &> /dev/null;done

至此已經成功還原test庫。備份單表的過程與上述過程類似。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM