天天看點

線上熱備份資料庫之innobackupex 增量備份InnoDB

線上熱備份資料庫之innobackupex 增量備份InnoDB

什麼是增量備份?其原理是什麼?

增量備份是基于上一次備份後對新增加的内容進行備份,優點相較于完整備份而言備份内容少時間短,能夠節省磁盤空間。但相較于完整備份而言可靠性有所降低,不能缺失基于完整備份的增量備份區間備份包,建議完整備份區間時間不可大于一周,通常情況下如果資料庫非常龐大個人建議三天到七天完整備份一次,期間每天進行增量備份。如果資料庫小那麼每天進行完整備份才是最安全的選擇。

增量備份原理是什麼?他是如何記錄上次備份的位置?

首先在InnoDB中, 每個page中都記錄LSN資訊,每當相關資料發生改變,page的LSN就會自動增加,xtrabackup的增量備份就是依據這一原理進行的。 我們增量備份必須要基于完整備份的前提下,在完整備份後會在備份目錄中生成一個xtrabackup_checkpoints檔案中記錄了to_lsn= xxxx,下次備份就會從這裡開始到結束,每次增量備份都需要指定上一次的增量備份的目錄名,是以每次都從結束進行增量備份,恢複時将完整備份和增量備份1合并再與增量備份2合并再與增量備份N合并直到最後一次增量合并完成後,那麼得到的就是完整備份資料,再進行完整資料的恢複。

  • 先對我的資料庫做一次完整備份,不指定任何資料庫也不使用時間最為備份子目錄名。
    innobackupex -uroot -p12345 --user root --password 12345 /fullbackup --no-timestamp
               
  • 模拟建立新庫新表模拟使用者産生資料。
    mysql -uroot -p12345 -e "create database new1;"
    mysql -uroot -p12345 -e "create table new1.newtable1 (id int(10));"
    for i in {1..100};do mysql -uroot -p12345 -e "insert into new1.newtable1 values($i);" ;done
               
  • 然後進行增量備份,需要指定 --incremental 進行增量備份的目錄 和 --incremental-basedir 完整備份的目錄。
    innobackupex --user root --password 12345 --incremental /increback --incremental-basedir /fullbackup --no-timestamp
               
  • 然後再進行模拟使用者向新建立的表産生資料。
    for i in {101..201};do mysql -uroot -p12345 -e "insert into new1.newtable1 values($i);" ;done
               
  • 然後再使用增量備份進行備份,這裡需要注意的就是--incremental-basedir指定的目錄就是上一次增量備份的目錄了。
    innobackupex --user root --password 12345 --incremental /increback2 --incremental-basedir /increback --no-timestamp
               
  • 因為去比較上一次備份的結束位置進行新的備份,看一下第一次到最後一次增量備份的位置。
    ---------從0備份到4158368-----------------------------------------
    backup_type = full-backuped
    from_lsn = 0
    to_lsn = 4158368
    last_lsn = 4158377
    compact = 0
    recover_binlog_info = 0
    ---------從4158368備份到4197299-----------------------------------
    backup_type = incremental
    from_lsn = 4158368
    to_lsn = 4197299
    last_lsn = 4197308
    compact = 0
    recover_binlog_info = 0
    --------從4197299備份到4232734------------------------------------
    backup_type = incremental
    from_lsn = 4197299
    to_lsn = 4232734
    last_lsn = 4232743
    compact = 0
    recover_binlog_info = 0
    ----------------------------------------------------------------
    #就和之前說的一樣每次備份完成後的重點都是下一次備份的起點。
               
  • 開是準備恢複資料(一般情況下恢複到另外一台機器上去,然後備份區間丢失的部分資料通過binlog進行恢複,我這邊就備份相關檔案,直接删掉目錄進行恢複了。)
  • 第一件事就是将完整備份與第一次增量備份合并再與第二次增量備份合并再與第N次增量備份合并。
    innobackupex --apply-log --redo-only /fullbackup
               
    innobackupex --apply-log --redo-only /fullbackup --incremental-dir /increback
               
    innobackupex --apply-log --redo-only /fullbackup --incremental-dir /increback2
               
  • 整合備份後将資料庫服務停掉打包資料庫預設路徑下的所有檔案備份到其/home目錄去然後删掉下面所有的東西。
    systemctl stop mysqld && tar -zcvPf /home/mysqldatadir.tar.gz /var/lib/mysql && rm -rf /var/lib/mysql/*
               
  • 然後進行拷貝恢複。
    innobackupex --copy-back /fullbackup/
               
  • 因為是使用root使用者操作的所有屬主和屬組都是root,是以需要改為mysql。
    chown -R  mysql:mysql /var/lib/mysql
               
  • 啟動服務并檢查資料是否正常。
    systemctl start mysqld
               
    mysql -uroot -p12345 -e "select * from new1.newtable1;"
               
  • 期間出現的部分資料丢失可以通過結合binlog進行恢複。