使用Xtrabackup實現MySQL資料庫的增量備份
- 2019 年 10 月 4 日
- 筆記

接上一篇文章使用Xtrabackup備份MySQL資料庫,下面介紹使用Xtrabackup實現MySQL資料庫的增量備份
先在users表中插入10條記錄,全庫做一次全量備份

[root@localhost ~]# mkdir /backup
[root@localhost ~]# innobackupex –defaults-file=/etc/my.cnf –user=root –password=MySQL@2019 –socket=/tmp/mysql.sock /backup

接下面我們再在表中插入幾條新數據

要實現第一次增量備份,可以使用下面的命令進行:
# innobackupex –incremental /backup –incremental-basedir=BASEDIR
其中,BASEDIR指的是完全備份所在的目錄,此命令執行結束後,innobackupex命令會在/backup目錄中創建一個新的以時間命名的目錄以存放所有的增量備份數據。
–incremental-basedir應該指向上一次的增量備份所在的目錄。
–incremental /backup/ 指定增量備份文件備份的目錄
innobackupex –defaults-file=/etc/my.cnf –user=root –password=MySQL@2019 –socket=/tmp/mysql.sock –incremental /backup –incremental-basedir=/backup/2019-09-15_14-12-17/

下面我們刪除幾條數據,然後通過之前的增量備份進行還原

「準備」(prepare)增量備份與整理完全備份有著一些不同,尤其要注意的是:
(1)需要在每個備份(包括完全和各個增量備份)上,將已經提交的事務進行「重放」。「重放」之後,所有的備份數據將合併到完全備份上。
(2)基於所有的備份將未提交的事務進行「回滾」。
於是,操作就變成了:
# innobackupex –apply-log –redo-only BASE-DIR
接著執行:
# innobackupex –apply-log –redo-only BASE-DIR –incremental-dir=INCREMENTAL-DIR-1
而後是第二個增量:
# innobackupex –apply-log –redo-only BASE-DIR –incremental-dir=INCREMENTAL-DIR-2
其中BASE-DIR指的是完全備份所在的目錄,而INCREMENTAL-DIR-1指的是第一次增量備份的目錄,INCREMENTAL-DIR-2指的是第二次增量備份的目錄,其它依次類推,即如果有多次增量備份,每一次都要執行如上操作
下面模擬只有一次增量備份的增量備份還原過程
先確認兩個備份目錄哪一個是全量備份,哪一個是增量備份

然後進行prepare操作
innobackupex –defaults-file=/etc/my.cnf –user=root –password=MySQL@2019 –socket=/tmp/mysql.sock –apply-log –redo-only /backup/2019-09-15_14-12-17/
innobackupex –defaults-file=/etc/my.cnf –user=root –password=MySQL@2019 –socket=/tmp/mysql.sock –apply-log –redo-only /backup/2019-09-15_14-12-17/ –incremental-dir=/backup/2019-09-15_14-22-35/
接下來停掉資料庫服務,移除當前的資料庫數據目錄
service mysqld stop
mv /usr/local/mysql/data/ /backup/mysql_data_backup
進行備份還原
innobackupex –copy-back /backup/2019-09-15_14-12-17/

然後chown -R mysql:mysql /usr/local/mysql/data/
service mysqld start
登錄資料庫驗證是否恢復成功

可以看出增量備份恢復成功
當然有時也可以通過mysqlbinlog來查看某個時間段的二進位日誌進行恢復

mysqlbinlog –start-datetime="2019-09-15 09:12:51" –stop-datetime="2019-09-15 09:14:00" mysqlbin.000001 > /root/bak.sql
–start-datetime : 指定起始的時間點。
–stop-datetime: 指定結束的時間點。
–start-position: 指定二進位日誌開始日誌點。
–stop-position : 指定二進位日誌結束的日誌點。
上面四個參數可以配合使用
然後把上面導出sql文件導入到MySQL服務中。
mysql> set sql_log_bin=0; #導入時,若文件較大會產生很多二進位日誌文件,可以先把二進位日誌文件關閉,
mysql> source bak.sql; #導入文件,可以使用mysql直接導入
mysql> set sql_log_bin=1; #導入完成之後,開啟二進位日誌文件
具體的操作就不演示了。