Mysql

複製設置中 MySQL 5.7 的每個數據庫備份的增量加密和部分還原策略

  • February 5, 2021

我將使用 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)

引用自:https://dba.stackexchange.com/questions/284496