使用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; #導入完成之後,開啟二進位日誌文件

具體的操作就不演示了。