使用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庫。備份單表的過程與上述過程類似。