xtrabackup工具備份與恢復


1、xtrabackup簡介

Xtrabackup是一個對InnoDB做數據備份的工具,支持在線熱備份(備份時不影響數據讀寫),是商業備份工具InnoDB Hotbackup的一個很好的替代品。它能對InnoDB和XtraDB存儲引擎的數據庫非阻塞地備份(對於MyISAM的備份同樣需要加表鎖)。XtraBackup支持所有的Percona Server、MySQL、MariaDB和Drizzle。

xtrabackup有兩個主要的工具:xtrabackup、innobackupex

  • xtrabackup,只能備份InnoDB和XtraDB兩種數據表
  • innobackupex則封裝了xtrabackup,同時可以備份MyISAM數據表

Innobackupex完整備份后生成了幾個重要文件

  • xtrabackup_binlog_info:記錄當前最新的LOG Position,在備份的那一刻服務器二進制所處的位置,通過SHOW MASTER STATUS獲取
  • xtrabackup_binlog_pos_innodb:InnoDB表或XtraDB當前所處的二進制位置,與InnoDB事務相關
  • xtrabackup_checkpoints: 存放備份的起始位置beginlsn和結束位置endlsn,增量備份需要這個lsn[增量備份可以在這里面看from和to兩個值的變化]
  • xtrabackup_logfile:在備份過程中拷貝的事務日志,用於預還原

1.1 xtrackup特點

  • 能夠對InnoDB實現熱備,無需暫停數據庫
  • 能夠對MySQL進行增量備份
  • 對MySQL備份能夠實現流式壓縮並傳輸給其他服務器,--stream參數實現
  • MySQL服務運行時能夠在MySQL 服務器之間進行表的遷移
  • 能夠很容易創建一個MySQL從服務器
  • 備份MySQL時不會增加服務器負擔

XtraBackup能夠帶InnoDB引擎創建的表實現熱備,對MyISAM引擎實現溫備。

1.2 備份原理

在InnoDB內部會維護一個redo日志文件,我們也可以叫做事務日志文件。事務日志會存儲每一個InnoDB表數據的記錄修改。當InnoDB啟動時,InnoDB會檢查數據文件和事務日志,並執行兩個步驟:它應用(前滾)已經提交的事務日志到數據文件,並將修改過但沒有提交的數據進行回滾操作。

使用xtrabackup進行還原,需要xtrabackup進行”備份”和”准備”:先將文件全部復制過來,再根據事務日志對部分操作進行回滾,如下描述:

  • xtrabackup的備份過程。Xtrabackup在啟動時會記住log sequence number(LSN),並且復制所有的數據文件。復制過程需要一些時間,所以這期間如果數據文件有改動,那么將會使數據庫處於一個不同的時間點。所以,xtrabackup會運行一個后台進程,用於監視事務日志,並從事務日志復制最新的修改。Xtrabackup持續地做這個操作,這些數據改動會寫入xtrabackup_logfile文件。xtrabackup自啟動開始,就不停的將事務日志中每個數據文件的修改都記錄下來。
  • 接下來是准備(prepare)過程。在這個過程中,xtrabackup使用之前復制的事務日志,對各個數據文件執行災難恢復(就像mysql剛啟動時要做的一樣)。當這個過程結束后,數據庫就可以做恢復還原了。

更詳細的描述如下:

  • 1. 調用xtrabackup對innodb表空間文件(這一瞬間的映像Time1)備份,而在這個innodb表備份期間數據庫是不加鎖的,外部可以繼續往庫里增減數據(這才能叫熱備份)。而在Time1和Time2這兩個時間點之間的改動由一個線程不斷地掃innodb log獲得(ChangeSet1),一旦發現redo中有新的日志寫入,立刻將日志記入后台日志文件xtrabackup_log中
  • 2. 鎖所有庫。
  • 3. 以直接拷貝的方式備份frm,MYD,MYI,MRG,TRG,TRN,opt格式的文件。
  • 4. 步驟3中的數據備份完畢時(Time2),停止掃innodb log的線程,把ChangeSet1的數據拷貝到備份中。
  • 5. 解鎖所有庫。
  • 6. 終止掛起,備份完畢。

注意要點

  • 根據innobackupex的原理可知它不是真正的熱備份,MyISAM表越少越小就越有利。要利用Xtrabackup的好處就盡量用innodb表。
  • 還原備份前關閉mysql服務;還原備份后檢查數據文件權限是否正確。

2、xtrabackup安裝

redhat6的版本,使用2.3.4這個版本

此鏈接下載:https://www.percona.com/downloads/Percona-XtraBackup-2.3/Percona-XtraBackup-2.3.4/binary/redhat/6/x86_64/percona-xtrabackup-2.3.4-1.el6.x86_64.rpm

Xtrabackup包依賴於epel源一些工具包,所以使用yum安裝。

yum install percona-xtrabackup-2.3.4-1.el6.x86_64.rpm

依賴這兩個包:

clip_image001

安裝完后的目錄結構如下,有4個可執行文件

usr

├── bin

│ ├── innobackupex

│ ├── xbcrypt

│ ├── xbstream

│ └── xtrabackup

其中最主要的是 innobackupex 和 xtrabackup,前者是一個 perl 腳本,后者是 C/C++ 編譯的二進制。

  • xtrabackup 是用來備份 InnoDB 表的,不能備份非 InnoDB 表,和 mysqld server 沒有交互;innobackupex 腳本用來備份非 InnoDB 表,同時會調用 xtrabackup 命令來備份 InnoDB 表,還會和 mysqld server 發送命令進行交互,如加讀鎖(FTWRL)、獲取位點(SHOW SLAVE STATUS)等。簡單來說,innobackupex 在 xtrabackup 之上做了一層封裝。
  • 一般情況下,我們是希望能備份 MyISAM 表的,雖然我們可能自己不用 MyISAM表,但是 mysql 庫下的系統表是 MyISAM 的(mysql自帶的數據庫都是什么存儲引擎?經查,mysql是MyISAM,information_schema是MEMORY,performance_schema是PERFORMANCE_SCHEMA),因此備份基本都通過 innobackupex 命令進行;另外一個原因是我們可能需要保存位點信息。
  • 另外2個工具相對小眾些,xbcrypt 是加解密用的;xbstream 類似於tar,是 Percona 自己實現的一種支持並發寫的流文件格式。兩都在備份和解壓時都會用到(如果備份用了加密和並發)。

3、備份

3.1 全庫備份

備份場景1:備份所有數據庫:備份目錄里生成日期命名的文件夾

innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=xxx --socket=/var/lib/mysql/mysql.sock /data/backup/

出現completed OK!表示備份完成

clip_image001[5]

innobackupex會在指定存放數據的目錄下用當前時間創建一個目錄,所有生成的備份文件都會這個時間目錄下

clip_image001[7]


備份場景2:備份所有數據庫,指定目錄的名稱

--no-timestamp參數的使用

在使用innobackupex進行備份時,還可以使用--no-timestamp選項來阻止命令自動創建一個以時間命名的目錄;如此一來,innobackupex命令將會創建一個BACKUP-DIR目錄來存儲備份數據。

innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=xxx --socket=/var/lib/mysql/mysql.sock --no-timestamp /data/backup/backup_dir

場景三:備份所有數據庫,並打包

--stream=tar 參數的使用,該選項表示流式備份的格式,backup完成之后以指定格式到STDOUT,目前只支持tar和xbstream。

innobackupex --defalut-file=/usr/local/mysql/my.cnf --user=root --password=xxx --socket=/var/lib/mysql/mysql.sock --stream=tar --no-timestamp /home/data/backup 1>/home/data/backup/xtra_backup20190329.tar

1> 代表標准輸出(stdout),前面不加1,只是>,一樣的效果

2> 代表標准錯誤(stderr)

場景四:備份所有數據庫,壓縮打包

innobackupex --defalut-file=/usr/local/mysql/my.cnf --user=root --password=xxx --socket=/var/lib/mysql/mysql.sock --stream=tar --no-timestamp /home/data/backup  |gzip >/home/data/backup/150_backup.tar.gz

注意:

Warning:
To extract Percona XtraBackup's archive you must use tar with -i option:
用tar壓縮備份,在解壓時必須使用 -i 參數:

可以使用如下目錄解壓,先創建解壓的目錄150_backup,解壓到此目錄

tar -zixvf 150_backup.tar.gz -C ./150_backup

場景5:備份到遠程並壓縮

innobackupex --defalut-file=/usr/local/mysql/my.cnf --user=root --password=xxx --socket=/var/lib/mysql/mysql.sock --stream=tar /home/data/backup |ssh root@192.168.2.151 "gzip >/home/data/150_backup/150_backup.tar.gz"

注意:操作此備份要在兩台機器之間實現ssh免密碼登錄


3.2 備份指定數據庫

備份場景1:備份指定數據庫

備份A和B數據庫,使用--databases參數指定數據庫

innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=xxx --socket=/var/lib/mysql/mysql.sock --databases="A B" --no-timestamp /data/backup/backup_database

3.3 備份指定表

備份場景1:備份不同庫下的不同表,還是使用--databases參數,指定到表

innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=xxx --socket=/var/lib/mysql/mysql.sock --databases="A.hrms_ao B.checktype" --no-timestamp /data/backup/backup_tables


備份場景2:備份一個庫下的表,備份A庫下h開頭的表

使用--include參數,該選項表示使用正則表達式匹配表的名字

innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=xxx --socket=/var/lib/mysql/mysql.sock --include="A.h" --no-timestamp /data/backup/backup_tables

3.4 增量備份

使用--incremental-basedir和--incremental參數來進行增量備份

innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=xxx --socket=/var/lib/mysql/mysql.sock --no-timestamp --incremental-basedir=/data/backup/backup_dir  --incremental /data/backup/increment_data/

--incremental-basedir:全量備份目錄

--incremental:增量備份目錄

注:全量備份的目錄是:/data/backup/backup_dir


4、還原

4.1 全庫還原

注:還原時,mysql服務器需要關閉,而且數據目錄必須是空的,innobackupex –copy-back不會覆蓋已存在的文件

  • 先准備(prepare)一個完全備份
innobackupex --apply-log /data/backup/2018-11-08_09-41-06

備份完成后,數據尚且不能用於恢復操作,因為備份的數據中可能會包含尚未提交的事務或已經提交但尚未同步至數據文件中的事務。因此,此時數據文件仍處理不一致狀態。“准備”的主要作用正是通過回滾未提交的事務及同步已經提交的事務至數據文件也使得數據文件處於一致性狀態。

利用 --apply-log參數,此參數的作用是通過回滾未提交的事務及同步已經提交的事務至數據文件使數據文件處於一致性狀態。

執行完后,xtrabackup_checkpoints文件里面的backup_type會變成full-prepared狀態(之前是full-backuped的狀態)

clip_image001[9]

  • 還原
innobackupex --defaults-file=/usr/local/mysql/my.cnf --copy-back /data/backup/2018-11-08_09-41-06/

注:

上面的命令加了--defaults-file參數,該選項指定了從哪個文件讀取MySQL配置,必須放在命令行第一個選項的位置。--copy-back:做數據恢復時將備份數據文件拷貝到MySQL服務器的datadir。

另外,上面的還原都沒指定還原到哪個目錄,mysql怎么知道?這就需要在my.cnf加入這個參數

datadir =/data/mysql

clip_image001[11]

出現completed OK! 代表還原成功

還原完記得修改權限:

chown -R mysql:mysql /data/mysql/*

綜上,總結幾個注意點:

  • 1.datadir目錄必須為空。除非指定innobackupex --force-non-empty-directorires選項指定,否則--copy-backup選項不會覆蓋
  • 2.在restore之前,必須shutdown MySQL實例,你不能將一個運行中的實例restore到datadir目錄中
  • 3.由於文件屬性會被保留,大部分情況下你需要在啟動實例之前將文件的屬主改為mysql,這些文件將屬於創建備份的用戶

4.2 增量還原

“准備”(prepare)增量備份與整理完全備份有着一些不同,尤其要注意的是:

(1)需要在每個備份(包括完全和各個增量備份)上,將已經提交的事務進行“重放”。“重放”之后,所有的備份數據將合並到完全備份上。

(2)基於所有的備份將未提交的事務進行“回滾”。

第一步:先apply-log全量備份

innobackupex --apply-log --redo-only /data/backup/backup_dir

第二步:把增量備份數據合並到全量備份數據上

innobackupex --apply-log --redo-only /data/backup/backup_dir --incremental-dir=/data/backup/increment_data

此時增量備份上的數據已經合並到全量備份上了,查看xtrabackup_checkpoints

[root@report-server backup_dir]# more xtrabackup_checkpoints

backup_type = log-applied

from_lsn = 0

to_lsn = 48526869189 ----------跟增量備份上的lsn一致

last_lsn = 48526869189

compact = 0

recover_binlog_info = 0

增量備份上的xtrabackup_checkpoints

backup_type = incremental

from_lsn = 48526868973 ----------上次全量備份上的lsn

to_lsn = 48526869189 ----------增量備份的截止lsn

last_lsn = 48526869189

compact = 0

recover_binlog_info = 0

第三步:回滾完全備份

innobackupex --apply-log  /data/backup/backup_dir

第四步:還原

innobackupex --defaults-file=/usr/local/mysql/my.cnf --copy-back /data/backup/backup_dir

進入到數據目錄,修改權限:

chown -R mysql:mysql *

啟動mysql,檢查數據是否恢復成功。

4.3 xtrabackup全庫還原+binlog日志還原

另外一篇日志說明

5、問題

5.1 找不到mysql.sock問題

181107 22:03:42 innobackupex: Starting the backup operation

IMPORTANT: Please check that the backup run completes successfully.

At the end of a successful backup run innobackupex

prints "completed OK!".

181107 22:03:42 version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup' as 'root' (using password: YES).

181107 22:03:42 version_check Connected to MySQL server

181107 22:03:42 version_check Executing a version check against the server...

181107 22:03:42 version_check Done.

181107 22:03:42 Connecting to MySQL server host: localhost, user: root, password: set, port: 0, socket: (null)

Failed to connect to MySQL server: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2).

clip_image001[1]

mysql.sock有什么用?

mysql的連接方式有兩種:

1、通過TCP/IP的連接

2、通過本地socket的連接,對mysql.sock來說,其作用是程序與mysqlserver處於同一台機器,發起本地連接時可用。在連接時你無須定義連接host的具體IP,只要為空或localhost就可以

在此種情況下,即使你改變mysql的外部port也是一樣可能正常連接。

因為你在my.ini中或my.cnf中改變端口后,mysql.sock是隨每一次 mysql server啟動生成的。已經根據你在更改完my.cnf后重啟mysql時重新生成了一次,信息已跟着變更。

那找到原因了:因為在my.cnf中沒有指定mysql.sock的路徑,所以默認去/tmp/目錄尋找,找不到,沒法鏈接

解決方案:找出系統的mysql.sock文件的路徑,在my.cnf進行指定或者在innobackupex命令中指定sock的絕對路徑

第一種方案:在my.cnf增加sock參數的設置

socket =/var/lib/mysql/mysql.sock

clip_image001[3]

命令里面指定my.cnf文件即可

innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=XXX /data/backup/

第二種方案:使用find命令找出mysql.sock的路徑,然后修改命令如下,加上socket參數

innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=XXX --socket=/var/lib/mysql/mysql.sock /data/backup/

第三種方案:指定IP地址,通過tcp/ip方式連接

innobackupex --defaults-file=/usr/local/mysql/my.cnf --host=127.0.0.1 --user=root --password=XXX  /data/backup/

5.2 安裝過程出現依賴包版本過高問題

[root@report-server media]# yum install percona-xtrabackup-2.3.4-1.el6.x86_64.rpm

Loaded plugins: product-id, security, subscription-manager

Updating certificate-based repositories.

Unable to read consumer identity

Setting up Install Process

Examining percona-xtrabackup-2.3.4-1.el6.x86_64.rpm: percona-xtrabackup-2.3.4-1.el6.x86_64

Marking percona-xtrabackup-2.3.4-1.el6.x86_64.rpm to be installed

Resolving Dependencies

--> Running transaction check

---> Package percona-xtrabackup.x86_64 0:2.3.4-1.el6 will be installed

--> Processing Dependency: libz.so.1(ZLIB_1.2.0)(64bit) for package: percona-xtrabackup-2.3.4-1.el6.x86_64

--> Finished Dependency Resolution

Error: Package: percona-xtrabackup-2.3.4-1.el6.x86_64 (/percona-xtrabackup-2.3.4-1.el6.x86_64)

Requires: libz.so.1(ZLIB_1.2.0)(64bit)

You could try using --skip-broken to work around the problem

You could try running: rpm -Va --nofiles --nodigest

clip_image001[5]

查看zlib包包括的文件

rpm -ql zlib-1.2.3-27.el6.x86_64

clip_image001[7]

想嘗試把zlib卸載了重新安裝,因為依賴太多包,卸載不了,於是使用--nodeps,不檢查依賴直接卸載

rpm -e zlib --nodeps

卸載了這個以后,libz.so.1文件就沒了,但是yum用不了、wget也用不了,ssh也登錄不了,r很多模塊都出現了問題-----經驗教訓,不能隨便使用--nodeps參數卸載包

登錄到別的機器也不行,如下提示

[root@report-server ~]# ssh patrol@192.168.241

ssh: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory

本想去別的機器拷貝這個文件過來,scp也用不了,本想使用rz命令,掛載鏡像找到相應的rz的rpm包進行安裝,發現rpm也用不了

於是想辦法去別的機器下載libz.so.1.2.3文件(因為實際的libz.so.1是一個鏈接文件,鏈接到此文件),然后制作一個iso鏡像掛載上去,放到/lib64目錄

做一個軟連接:

ln -s libz.so.1.2.3 libz.so.1
這時候能用yum了,重新yum安裝zlib包,安裝成功,但是還不能ssh登錄,重啟機器,解決

回到開始的問題,提示“Requires: libz.so.1(ZLIB_1.2.0)(64bit)”,但是實際上已經安裝了ZLIB_1.2.3版本,於是使用--nodeps參數強制安裝

如下命令,安裝成功。

rpm -ivh percona-xtrabackup-2.3.4-1.el6.x86_64.rpm --nodeps

clip_image001[9]

--nodeps參數的意思是安裝之前不檢查依賴

--nodeps

Don’t do a dependency check before installing or upgrading a package.


6、其他

6.1 免密登錄

原理:

image

操作:

環境:

主機1:192.168.161.10 linux

主機2:192.168.161.3 solaris

需求:需要從192.168.161.10登陸192.168.161.3不需要密碼

  • 生成公鑰和私鑰
ssh-keygen -t rsa

image

這個目錄下會多兩個文件,也即是生成了公鑰和私鑰

公共密鑰是: ~/.ssh/id_rsa.pub

私有密鑰是: ~/.ssh/id_rsa

image

把這個文件拷到對端機器

scp .shh/id_rsa.pub root@192.168.161.3:/export

然后把這個文件拷貝為authorized_keys,

注:在solaris這個文件的位置和linux是不同的

cat id_rsa.pub >/.ssh/authorized_keys




參考:

http://www.cnblogs.com/zhoujinyi/p/5893333.html

https://blog.51cto.com/13589448/2087693

https://www.linuxidc.com/Linux/2017-04/142477.htm


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM