首頁 >資料庫 >mysql教程 >怎麼利用Xtrabackup進行mysql增量備份

怎麼利用Xtrabackup進行mysql增量備份

WBOY
WBOY轉載
2023-05-30 14:50:061372瀏覽

利用Xtrabackup進行mysql增量備份

現在xtrabackup版本升級到了8.0,但是只對mysql8.0才有支援, 我們這還是使用2.4 , 但是2.4相比之前的2.1有了比較大的變化:innobackupex 功能全部整合到xtrabackup 裡面,只有一個binary,另外為了使用上的相容考慮,innobackupex 作為xtrabackup 的一個軟鏈,即xtrabackup 現在支援非Innodb表備份,並且Innobackupex 在下一版本中移除(8.0已經移除了),建議透過xtrabackup取代innobackupex。還有其他的一些新特性,更多的說明可以看xtrabackup新版詳細說明。

安裝

如果安裝需要依賴就把依賴安裝一下

wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb
sudo dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb
sudo apt-get update
sudo apt-get install percona-xtrabackup-24

設定資料庫用於備份帳戶

mysql> CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY '123456';
mysql> GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost';
mysql> FLUSH PRIVILEGES;

全量備份

xtrabackup --user=bkpuser --password=123456 --backup --target-dir=/data/backups/mysql
# 会看到输出
200603 09:55:37 Executing UNLOCK TABLES
200603 09:55:37 All tables unlocked
200603 09:55:37 [00] Copying ib_buffer_pool to /data/backups/mysql/ib_buffer_pool
200603 09:55:37 [00]        ...done
200603 09:55:37 Backup created in directory '/data/backups/mysql/'
200603 09:55:37 [00] Writing /data/backups/mysql/backup-my.cnf
200603 09:55:37 [00]        ...done
200603 09:55:37 [00] Writing /data/backups/mysql/xtrabackup_info
200603 09:55:37 [00]        ...done
xtrabackup: Transaction log of lsn (837940114) to (837940123) was copied.
200603 09:55:37 completed OK!
  • 準備備份

xtrabackup --prepare --target-dir=/data/backups/mysql
  • 複製備份

我這裡為了示範全量備份就直接將我部落格mysql 儲存的資料目錄給移動一下

mv /var/lib/mysql /var/lib/mysql_bak
mkdir /var/lib/mysql
xtrabackup --copy-back --target-dir=/data/backups/mysql  # 这样会保留原始备份 他会将当时读到my.cnf的datadir设置为恢复路径
200603 10:47:42 [01]        ...done
200603 10:47:42 [01] Copying ./performance_schema/mutex_instances.frm to /var/lib/mysql/performance_schema/mutex_instances.frm
200603 10:47:42 [01]        ...done
200603 10:47:42 [01] Copying ./performance_schema/events_transactions_history_long.frm to /var/lib/mysql/performance_schema/events_transactions_history_long.frm
200603 10:47:42 [01]        ...done
200603 10:47:42 [01] Copying ./xtrabackup_info to /var/lib/mysql/xtrabackup_info
200603 10:47:42 [01]        ...done
200603 10:47:42 [01] Copying ./ibtmp1 to /var/lib/mysql/ibtmp1
200603 10:47:42 [01]        ...done
200603 10:47:42 completed OK!
  • #備份成功重新啟動部落格還能正常存取哈哈哈哈

# <pre class="brush:bash;"># 将恢复目录的属主更改一下 chown -R mysql:mysql mysql /etc/init.d/mysql start</pre>如果恢復玩不想要備份資料可以使用xtrabackup --move-back 指令增量備份

增量是基於已有資料進行備份的,也就行需要先建立一次全量備份,然後記錄當時的記錄點#建立備份

xtrabackup --user=bkpuser --password=123456 --backup --target-dir=/data/backups/base
# 基于全量备份进行增量
xtrabackup --user=bkpuser --password=123456 --backup --target-dir=/data/backups/inc1 --incremental-basedir=/data/backups/base
  • 查看備份類型確認是增量備份了

root@longing:/data/backups/inc1# cat xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 837943393
to_lsn = 837943393
last_lsn = 837943402
compact = 0
recover_binlog_info = 0
flushed_lsn = 837943402
  • from_lsn

    是備份的起始

    LSN
  • ,對於增量備份,它必須
to_lsn

與先前

base

備份的相同。 在這種情況下,您可以看到

to_lsn
    (最後一個檢查點LSN)和
  • last_lsn

    (最後一個複製的

    LSN
  • )之間存在差異,這意味著在備份過程中伺服器上有一些流量。

我們可以測試一下在第一個增加繼續建立增量建立增量之前先建立幾個資料

  • xtrabackup --user=bkpuser --password=123456 --backup --target-dir=/data/backups/inc2 --incremental-basedir=/data/backups/inc1

  • #準備恢復
  • 已經有3個備份了,我們要先對基礎資料進行準備,然後對兩個增量進行準備

    xtrabackup --user=bkpuser --password=123456 --prepare --apply-log-only --target-dir=/data/backups/base
    xtrabackup --user=bkpuser --password=123456 --prepare --apply-log-only --target-dir=/data/backups/base --incremental-dir=/data/backups/inc1
    xtrabackup --user=bkpuser --password=123456 --prepare --target-dir=/data/backups/base --incremental-dir=/data/backups/inc2
  • #xtrabackup --apply-log-only

    合併除最後一個以外的所有增量時應使用, 一旦準備好,增量備份就與完整備份相同,可以用相同的方式還原它們。

  • 恢復

  • xtrabackup --copy-back --target-dir=/data/backups/base

    中間插入的資料就能看見了,真棒!

  • 提問總結

增量備份步驟

建立基礎備份一定條件進行增量備份建立對所有備份進行準備所有增量基於基礎備份相當於合併作業

最後和全量備份一樣直接還原即可

原理

InnoDB###內部會維護一個redo日誌文件,我們也可以叫做交易日誌文件.交易日誌會儲存每一個InnoDB表數據的記錄修改。當InnoDB啟動時,InnoDB會檢查資料檔案和交易日誌,並執行兩個步驟:它應用(前滾)已經提交的 交易日誌到資料文件,並將修改過但沒有提交的資料進行回滾操作。 #########Xtrabackup### 在啟動時會記住###log sequence number(LSN)###, 並且複製所有的資料檔案。複製過程需要一些時間,所以這段期間如果資料檔案有改動,那麼將會使資料庫處於不同的時間點。這時,###xtrabackup### 會執行一個後台程序,用於監視交易日誌,並從交易日誌複製最新的修改。 ###Xtrabackup### 必須持續的做這個操作,是因為交易日誌是會輪替重複的寫入,而交易日誌可以被重複使用。所以 ###xtrabackup### 自啟動開始,就不停的將交易日誌中每個資料檔案的修改都記錄下來。上面就是 ###xtrabackup### 的備份過程。 ######為什麼最後一次增量備份不用"--apply-log-only"######最後一次"準備"操作可以不用跳過回滾操作,這樣用來恢復的資料檔案本地就處理好了,當服務啟動後就不會再進入到回滾階段,如果最後一次使用了這個參數,伺服器啟動後就會進入回滾階段。所以這個###--apply-log-only### 只是用來合併增量用的避免下一個增量不可用。可參考 ###參見 man xtrabackup######

为什么备份完后要准备备份 "prepare"

一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。他的作用是使数据文件处于一致性状态,方法是回滚未提交的事务并同步已提交的事务至数据文件。

为什么选择这个做备份?

  • mysqldump 备份缺点

效率较低,备份和还原速度慢,份过程中,数据插入和更新操作会被挂起

  • MySQL 备份工具

跨平台性差,备份时间长,冗余备份,浪费存储空间

  • XtraBackup

备份过程中不锁库表,适合生产环境,由专业组织Percona提供( 改进MySQL分支 )

  • XtraBackup能对表 库进行备份吗?

当然了,只不过博主太懒了,写起来太麻烦了,不过原理都是差不多,操作也差不多,大家自己搞搞!

xtrabackup --user=bkpuser --password=123456 --backup --databases="u_test" --no-timestamp --target-dir=/data/backups/u
xtrabackup --prepare --target-dir=/data/backups/u

还原

  • prepare,利用--apply-log的作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态

  • copy,因为是部分备份,不能直接用--copy-back,只能手动来复制需要的库,也要复制ibdata(数据字典)

  • cp /data/backups/u/ibdata1 /var/lib/mysql/

  • cp -r u/u_test /var/lib/mysql/

以上是怎麼利用Xtrabackup進行mysql增量備份的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除