适用場景:
資料量比較大,通常以G計算,正常sql導入導出資料龐大容易出錯。要将其他地方的mysql遷移到我司彈性雲伺服器,這時候就可以考慮使用innobackupex來備份遷移。
先決條件:
linux系統伺服器,原資料庫伺服器支援ssh登陸,擁有控制管理權限。原資料庫伺服器和現在伺服器都需要安裝innobackupex。
注意:
以下示例來源于網上,路徑均為示例,具體以實際路徑為準,請充分了解并有相關備份再操作。
安裝:
wget https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.21/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.21-1.el7.x86_64.rpm
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL #安裝依賴包
rpm -ivh percona-xtrabackup-24-2.4.21-1.el7.x86_64.rpm --nodeps --force
innobackupex常用選項:
--host 指定主機
--user 指定使用者名
--password 指定密碼
--port 指定端口
--databases 指定資料庫
--incremental 建立增量備份
--incremental-basedir 指定包含完全備份的目錄
--incremental-dir 指定包含增量備份的目錄,增量備份目錄
--apply-log 對備份進行預處理操作,一般情況下,在備份完成後,資料尚且不能用于恢複操作,因為備份的資料中可能會包含尚未送出的事務或已經送出但尚未同步至資料檔案中的事務。是以,此時資料檔案仍處理不一緻狀态。“準備”的主要作用正是通過復原未送出的事務及同步已經送出的事務至資料檔案也使得資料檔案處于一緻性狀态。
--redo-only 不復原未送出事務
--copy-back 恢複備份目錄
一些常用的其他可選參數:
--lock-wait-query-type 該參數允許使用者指定,哪類的SQL語句是需要Flush table with read lock等待的
--lock-wait-threshold 運作超過這個時間的查詢才算長查詢
--lock-wait-timeout 等待長查詢多少時間後再嘗試FTWRL,一旦Flush table with read lock被阻塞超過預定時間,則XtraBackup出錯傳回退出,參數允許使用者指定了超過該門檻值時間的查詢會被Kill,同時也允許使用者指定Kill
全量備份:
innobackupex --user=root --password=xxxx --datadir=/var/lib/mysql /mysql_bkup/
#datadir是mysql資料data存儲路徑,可以到my.cnf裡面檢視。mysql_bkup備份存放路徑。預設會以時間命名備份目錄。
#合并資料,使資料檔案處于一緻性的狀态:
innobackupex --apply-log /mysql_bkup/2022-08-03_21-14-37/
異機恢複準備:
1、使用scp指令将/mysql_bkup/2022-08-03_21-14-37/轉移到目标新伺服器資料庫。
2、新伺服器mysql服務關停。将datadir資料存儲目錄下的資料删除。這裡建議改名,然後再建立一個(datadir路徑可從my.cnf配置檔案裡面檢視)。
恢複資料:
按上面做好了恢複準備,使用指令恢複。
innobackupex --copy-back /mysql_bkup/2022-08-03_21-14-37/
或者:
innobackupex --copy-back --datadir=/var/lib/mysql /mysql_bkup/2022-08-03_21-14-37/
恢複以後注意使用chown重置目錄權限,然後将mysql服務重新啟動。
如果資料庫遷移過程是在運作的,資料有更新,就需要增量備份。
增量備份:
--incremental 建立增量備份
--incremental-basedir 指定包含完全備份的目錄
--incremental-dir 指定包含增量備份的目錄
#合并全備資料目錄,確定資料的一緻性
innobackupex --apply-log --redo-only /mysql_bkup/2022-08-03_21-14-37/
#建立增量備份
innobackupex --user=root --password=xxx --incremental /mysql_bkup_add/ --incremental-basedir=/mysql_bkup/2022-08-03_21-14-37/
#将增量備份資料合并到全備資料目錄當中
innobackupex --apply-log /mysql_bkup/2022-08-03_21-14-37/ --incremental-dir=/mysql_bkup_add/增量備份/
#資料一緻性
innobackupex --apply-log /mysql_bkup/2022-08-03_21-14-37
#恢複資料:
innobackupex --copy-back /mysql_bkup/2022-08-03_21-14-37
#恢複到異地也是需要scp遷移到新伺服器,按上面說明先停止服務,删除data資料再操作。
增量備份可以是多次,以下是多次增量備份示例:
#進行第一次全備
[root@ebs~]#innobackupex --datadir=/var/lib/mysql --user=root --password=xxx ./bkup
#進行第一次增備,基于上次的全備
[root@ebs ~]#innobackupex --datadir=/var/lib/mysql --user=root --password=xxx --incremental ./bkup/incer1 --incremental-basedir=./bkup/2022-04-23_11-39-31
#進行第二次全備,基于第一次增備
[root@ebs ~]#innobackupex --datadir=/var/lib/mysql --user=root --password=xxx --incremental ./bkup/incer2 --incremental-basedir=./bkup/incer1/2022-04-23_11-47-10
--incremental 建立增量備份
--incremental-basedir 指定包含完全備份的目錄
--incremental-dir 指定包含增量備份的目錄
##########################恢複時進行資料整合####################################################
#對整合的開始備份集——全備集應用日志,并指定"--redo-only"表示開始進入日志追加
innobackupex --apply-log --redo-only ./bkup/2022-04-23_11-39-31/
#對第一個增備集進行"準備",将其追加到全備集中
innobackupex --apply-log --redo-only ./bkup/2022-04-23_11-39-31/ --incremental-dir=./bkup/incer1/2022-04-23_11-47-10/
#對第二個增備集進行"準備",将其追加到全備集中,但是不再應用"--redo-only",表示整合的結束點
innobackupex --apply-log ./bkup/2022-04-23_11-39-31/ --incremental-dir=./bkup/incer2/2022-04-23_11-53-19/
#對整合完成的全備集進行一次整體的"準備"
innobackupex --apply-log ./bkup/2022-04-23_11-39-31/
###################進行資料的恢複#############################
innobackupex --copy-back --datadir=/var/lib/mysql ./bkup/2022-04-23_11-39-31/
#如果是異地恢複,需要scp遷移過去再執行。
###############修改目錄權限并啟動mysql###########
chown mysql:mysql -R /usr/local/mysql/data && systemctl start mysqld
官方文檔給出的恢複步驟:
innobackupex --apply-log --redo-only BASE-DIR
innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1
innobackupex --apply-log BASE-DIR --incremental-dir=INCREMENTAL-DIR-2
innobackupex --apply-log BASE-DIR
innobackupex --copy-back BASE-DIR