Mysql
複製設置中 MySQL 5.7 的每個數據庫備份的增量加密和部分還原策略
我將使用 MySQL 5.7 執行複制集群,並且我想為每個數據庫設置一個備份策略,該策略每天一次完整 + 每 N 小時增量一次,數據加密(基於全天)。顯然,備份將在從站上完成。
我查看了 Percona xtrabackup 文件,這些文件分別涵蓋了每個 主題,但沒有放在一起。
對於備份步驟,我這樣做
每天一次完整備份命令
xtrabackup --backup --encrypt=AES256 --encrypt-key="GCHFLrDFVx6UAsRb88uLVbAVWbK+Yzfs" \ --compress --safe-slave-backup # in order to be able to restore on master \ --slave-info \ --databases foo --extra-lsndir=/data/backups/db_foo/20200201/full # to get clear text binlog info --target-dir=/data/backups/db_foo/20200201/full
每 2 小時增量備份
xtrabackup --backup --encrypt=AES256 --encrypt-key="GCHFLrDFVx6UAsRb88uLVbAVWbK+Yzfs" \ --compress --safe-slave-backup # in order to be able to restore on master \ --slave-info --databases foo --incremental-basedir=/data/backups/db_foo/20200201/full # use full directory of the day --extra-lsndir=/data/backups/db_foo/20200201/incr_020000 --target-dir=/data/backups/db_foo/20200201/incr_020000
您可以看到我通過的備份選項
--extra-lsndir
以明文形式獲取 LSN / 檢查點資訊以及加密的資訊,以便可以完成增量備份。從我的測試來看,它似乎工作正常。完整轉儲的佈局
|/data/backups/db_foo/20200201/full ├── backup-my.cnf.qp.xbcrypt ├── foo │ ├── db.opt.qp.xbcrypt │ ├── people.frm.qp.xbcrypt │ └── people.ibd.qp.xbcrypt ├── ib_buffer_pool.qp.xbcrypt ├── ibdata1.qp.xbcrypt ├── xtrabackup_checkpoints ├── xtrabackup_checkpoints.xbcrypt ├── xtrabackup_info ├── xtrabackup_info.qp.xbcrypt ├── xtrabackup_logfile.qp.xbcrypt └── xtrabackup_slave_info.qp.xbcrypt
但是,我不清楚將增量數據和加密數據一起還原數據所需的步驟順序。
所以我的問題是:
- 備份命令是否正確?
- 你有一些資訊我應該如何進行恢復?我對執行解密/解壓縮/準備的順序、閱讀此資源
--apply-log-only
後何時使用以及如何僅恢復一個數據庫而不是所有數據感到困惑。最好的。
經過一番探勘並基於此頁面,我有一個似乎可以正常工作的解決方案。
步驟 1:解壓縮和解密備份文件
xtrabackup --decompress --decrypt=AES256 --encrypt-key="GCHFLrDFVx6UAsRb88uLVbAVWbK+Yzfs" \ --target-dir=/data/backups/db_xxx/full --remove-original xtrabackup --decompress --decrypt=AES256 --encrypt-key="GCHFLrDFVx6UAsRb88uLVbAVWbK+Yzfs" \ --target-dir=/data/backups/db_xxx/incr_1 --remove-original xtrabackup --decompress --decrypt=AES256 --encrypt-key="GCHFLrDFVx6UAsRb88uLVbAVWbK+Yzfs" \ --target-dir=/data/backups/db_xxx/incr_2 --remove-original
第 2 步:準備數據
- 因為我們只想恢復一個數據庫,而不是我們傳遞
--export
來生成準備複製文件的完整 mysql 伺服器數據。- 除了最後一個之外,我們還傳遞
--apply-log
給所有備份(來自我在問題中連結的文件)xtrabackup --prepare --apply-log-only --target-dir=/data/backups/db_xxx/full/ --export xtrabackup --prepare --apply-log-only --target-dir=/data/backups/db_xxx/full/ --incremental-dir=/data/backups/db_xxx/incr_1 --export xtrabackup --prepare --target-dir=/data/backups/db_xxx/full/ --incremental-dir=/data/backups/db_xxx/incr_2 --export
第三步:恢復數據
現在我們需要在不刪除數據庫的情況下替換錶文件。
mysql> SELECT CONCAT( 'ALTER TABLE ', a.TABLE_SCHEMA, '.' a.TABLE_NAME, ' DISCARD TABLESPACE;' ) AS 'DISCARD TABLESPACE' -> FROM information_schema.tables a WHERE a.TABLE_SCHEMA='foo'; +-----------------------------------------------+ | DISCARD TABLESPACE | +-----------------------------------------------+ | ALTER TABLE foo.t1 DISCARD TABLESPACE; | | ALTER TABLE foo.t2 DISCARD TABLESPACE; | +-----------------------------------------------+ 1 row in set (0.00 sec)
cp -a /data/backups/db_xxx/full/foo/* /var/lib/mysql/foo/ chown -R mysql:mysql /var/lib/mysql/foo/
mysql> SELECT CONCAT( 'ALTER TABLE ', a.TABLE_SCHEMA, '.' a.TABLE_NAME, ' IMPORT TABLESPACE;' ) -> FROM information_schema.tables a WHERE a.TABLE_SCHEMA='foo'; +-----------------------------------------------+ | IMPORT TABLESPACE | +-----------------------------------------------+ | ALTER TABLE foo.t1 IMPORT TABLESPACE; | | ALTER TABLE foo.t2 IMPORT TABLESPACE; | +-----------------------------------------------+ 1 row in set (0.00 sec)