伯樂線上轉載補充:
Xtrabackup是一個對InnoDB做資料備份的工具,支援線上熱備份(備份時不影響資料讀寫),是商業備份工具InnoDB Hotbackup的一個很好的替代品。
Xtrabackup有兩個主要的工具:xtrabackup、innobackupex
- (1)xtrabackup只能備份InnoDB和XtraDB兩種資料表,而不能備份MyISAM資料表
- (2)innobackupex-1.5.1則封裝了xtrabackup,是一個指令碼封裝,所以能同時備份處理innodb和myisam,但在處理myisam時需要加一個讀鎖
剛開始用mysqldump,備份100G+的資料庫,再加上伺服器繁忙,備份速度像蝸牛似的,於是尋找更高效的備份方法。
網上都說用xtrabackup比較適合備份大的資料庫,而且備份效率也高,就嘗試使用一次,結果明顯感覺比mysqldump備份與恢復速度就是快不少,那以後就用它了。結合生產環境,寫了這篇文件,剛接觸的朋友,可以參考下,不多說,入正題!
1、初次備份前準備工作
1.1 瞭解備份方式
- 熱備份:讀寫不受影響(mysqldump–>innodb)
- 溫備份:僅可以執行讀操作(mysqldump–>myisam)
- 冷備份:離線備份,讀寫都不可用
- 邏輯備份:將資料匯出文字檔案中(mysqldump)
- 物理備份:將資料檔案拷貝(xtrabackup、mysqlhotcopy)
- 完整備份:備份所有資料
- 增量備份:僅備份上次完整備份或增量備份以來變化的資料
- 差異備份:僅備份上次完整備份以來變化的資料
1.2 建立備份使用者
1 2 3 |
mysql> grant reload,lock tables,replication client on *.* to 'bak'@'localhost' identified by 'bak2015'; mysql> flush privileges; |
1.3 安裝方式
CentOS:
1 2 3 |
# rpm -ivh http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm # yum install percona-xtrabackup |
xtrabackup2.2 不支援 MySQL5.1的 InnoDB 引擎,如需要可安裝2.0版本(https://www.percona.com/downloads/XtraBackup/XtraBackup-2.0.8/RPM/rhel6/x86_64/percona-xtrabackup-20-2.0.8-587.rhel6.x86_64.rpm)
Ubuntu:
1 2 3 |
# sudo apt-get install xtrabackup #14.04預設有這個包,14.04之前版本如果沒有再這個地址下載對應的版本:https://www.percona.com/downloads/XtraBackup/ |
1.4 瞭解常用引數
- –user= #指定資料庫備份使用者
- –password= #指定資料庫備份使用者密碼
- –port= #指定資料庫埠
- –host= #指定備份主機
- –socket= #指定socket檔案路徑
- –databases= #備份指定資料庫,多個空格隔開,如–databases=”dbname1 dbname2″,不加備份所有庫
- –defaults-file= #指定my.cnf配置檔案
- –apply-log #日誌回滾
- –incremental= #增量備份,後跟增量備份路徑
- –incremental-basedir= #增量備份,指上次增量備份路徑
- –redo-only #合併全備和增量備份資料檔案
- –copy-back #將備份資料複製到資料庫,資料庫目錄要為空
- –no-timestamp #生成備份檔案不以時間戳為目錄名
- –stream= #指定流的格式做備份,–stream=tar,將備份檔案歸檔
- –remote-host=user@ip DST_DIR #備份到遠端主機
2、完整備份與恢復
2.1 完整備份
1 |
# innobackupex --user=bak --password='bak2015' /mysql_backup |
2.2 備份恢復
1 |
# innobackupex --defaults-file=/etc/mysql/my.cnf --copy-back /home/loongtao/mysql_backup/2015-02-08_11-56-48/ |
2.3 備份檔案說明
- # ls 2015-02-08_11-56-48
- backup-my.cnf:記錄innobackup使用到mysql引數
- xtrabackup_binary:備份中用到的可執行檔案
- xtrabackup_checkpoints:記錄備份的型別、開始和結束的日誌序列號
- xtrabackup_logfile:備份中會開啟一個log copy執行緒,用來監控innodb日誌檔案(ib_logfile),如果修改就會複製到這個檔案
3、完整備份+增量備份與恢復
3.1 完整備份
1 2 3 |
# innobackupex --user=bak --password='bak2015' /mysql_backup #備份後位置是:/mysql_backup/2015-02-08_11-56-48 |
3.2 增量備份1
1 |
# innobackupex --user=bak --password='bak2015' --incremental /data1/mysql_backup --incremental-basedir=/mysql_backup/2015-02-08_11-56-48 #指定上次完整備份目錄 |
3.3 增量備份2
1 |
# innobackupex --user=bak --password='bak2015' --incremental /data1/mysql_backup --incremental-basedir=/mysql_backup/2015-02-08_12-16-06 #指定上次增量備份目錄 |
3.4 檢視xtrabackup_checkpoints檔案,一目瞭然,可以看到根據日誌序號來增量備份
3.5 備份恢復
3.5.1 備份恢復思路
將增量備份1、增量備份2…合併到完整備份,加到一起出來一個新的完整備份,將新的完整備份以拷貝的形式到資料庫空目錄(rm /var/lib/mysql/* -rf)
3.5.2 預備完整備份
#xtrabackup把備份過程中可能有尚未提交的事務或已經提交但未同步資料檔案的事務,寫到xtrabackup_logfile檔案,所以要先通過這個日誌檔案回滾,把未完成的事務同步到備份檔案,保證資料檔案處於一致性。
1 |
# innobackup --apply-log --redo-only 2015-02-08_11-56-48 |
3.5.3 合併第一個增量備份
1 |
# innobackupex --apply-log --redo-only /mysql_backup/2015-02-08_11-56-48/ --incremental-dir=mysql_backup/2015-02-08_12-16-06 |
3.5.4 合併第二個增量備份
1 |
# innobackupex --apply-log --redo-only /mysql_backup/2015-02-08_11-56-48/ --incremental-dir=mysql_backup/2015-02-08_16-06-53 |
3.5.5 恢復完整備份(這時2015-02-08_11-56-48完整備份已經包含所有增量備份,可以通過檢視checkpoints來核實)
1 |
# innobackupex --defaults-file=/etc/mysql/my.cnf --copy-back /mysql_backup/2015-02-08_11-56-48/ |
3.5.6 修改恢復資料檔案許可權
1 |
# chown -R mysql.mysql /var/lib/mysql |
3.5.7 啟動MySQL,檢視資料庫恢復情況
1 |
# /etc/init.d/mysqld start |
4、備份檔案歸檔壓縮
4.1 歸檔併傳送到備份伺服器
1 |
# innobackupex --databases=test --user=bak --password='bak2015' --stream=tar /mysql_backup 2>/mysql_backup/bak.log |ssh root@192.168.18.251 "cat - > /mysql_backup/`date +%F`.tar" |
解壓:tar -ixvf date +%F
.tar
4.2 歸檔備份
1 |
# innobackupex --databases=test --user=bak --password='bak2015' --stream=tar /mysql_backup > /mysql_backup/`date +%F`.tar |
解壓:tar -ixvf date +%F
.tar
4.3 壓縮歸檔備份
1 |
# innobackupex --databases=test --user=bak --password='bak2015' --stream=tar /mysql_backup |gzip >/mysql_backup/`date +%F`.tar.gz |
解壓:tar -izxvf date +%F
.tar.gz