每天進步一點點——mysql——Percona XtraBackup(innobackupex),perconaxtrabackup
一、 簡介
Percona XtraBackup是開源免費的MySQL資料庫熱備份軟體,它能對InnoDB和XtraDB儲存引擎的資料庫非阻塞地備份(對於MyISAM的備份同樣需要加表鎖)。XtraBackup支援所有的Percona Server、MySQL、MariaDB和Drizzle。
XtraBackup優勢 :
1、無需停止資料庫進行InnoDB熱備
2、增量備份MySQL
3、流壓縮到傳輸到其它伺服器
4、能比較容易地建立主從同步
5、備份MySQL時不會增大伺服器負載
安裝XtraBackup後,其實會有幾個工具:
innobackupex:
這個是其實是下面三個工具的一個perl指令碼封裝,可以備份MyISAM, InnoDB, XtraDB表。
xtrabackup:
一個由C編譯而來的二進位檔案,只能備份InnoDB和XtraDB資料。
xbcrypt:
用來加密或解密備份的資料。
xbstream:
用來解壓或壓縮xbstream格式的壓縮檔。
建議使用perl封裝的innobackupex來作Database Backup,因為比較容易使用。所以下面只介紹innobackupex的使用。其它的使用參考:http://www.percona.com/doc/percona-xtrabackup/2.1/manual.html
本文主要介紹innobackupex工具
注意:在每次恢複完成之後都要再做一次完全備份
https://www.percona.com/downloads/XtraBackup/
首先要保證安裝依賴包
[root@localhost Packages]# yum -y install perl perl-devel libaiolibaio-devel perl-Time-HiRes perl-DBD-MySQL
然後安裝percona-xtrabackup
[root@localhost ~]# rpm -ivhpercona-xtrabackup-2.2.11-1.el6.x86_64.rpm
warning:percona-xtrabackup-2.2.11-1.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, keyID cd2efd2a: NOKEY
Preparing... ###########################################[100%]
1:percona-xtrabackup ########################################### [100%]
二、 命令格式
innobackupex參數 目錄.
三、 常用參數
--defaults-file 指定要備份的mysql執行個體的my.cnf檔案,the only limitation is that it has to be the first option passed;並且在這個my.cnf中必須要有datadir等參數指明資料檔案的路徑!
--host 指定主機名稱/IP
--port 指定所需串連的連接埠,預設3306則可忽略不寫
--socket 串連套位元組的位置,預設為/var/lib/mysql/mysql.sock
--use-memory=4G 此參數用來控製備份所使用到的記憶體大小,預設為100M! 一般與--apply-log一起使用,備份時指定了但好像沒用到!!
--apply-log 在Database Backup好後,這些備份的資料並不能立即用於恢複,因為這些剛備份的資料裡包含了未提交的資料,需要復原,oracle裡稱undo資料!也包括的已完成的事務在重做記錄檔中並沒有寫入資料檔案中,這些資料需要重做!oracle裡稱redo! 這個參數正是用於做這些事情,以保證資料檔案的一致性!在資料庫恢複之前,須先對備份的資料檔案應用此參數!(innobackup會重現重做記錄檔(redo log file)中的事務條目,重做已經提交的事務和復原未提交的事務!)
--copy-back 把備份資料拷貝回server的datadir,它決定於my.cnf中的datadir參數,另外在恢複時datadir目錄必須是空的,並且mysql資料庫必須是shudown的!
--no-timestamp innobackupex--defaults-file=/etc/my.cnf --user=root --no-timestamp /tmp/backup/full(使用--no-timestamp時,後面的這個full目錄必須跟上且不能提前自己建立,它由innobackupex自動建立,否則會報innobackupex: Error: Failed to create backup directory/tmp/backup/full/: File exists at /usr/bin/innobackupex line 3899.)
--redo-only 在做增量恢複時,全備和增量備份的資料檔案在恢複前必須先將在重做記錄檔中的已提交的事務重做!此參數將會合并全備和增量備份的資料檔案,但不包括最後一次增量備份的資料檔案!(--redo-only should be used when merging all incrementals except thelast one )
--compress 壓縮選項,此選項不相容--stream=tar,只相容--stream=xbstream,此外加密項encrypted也不能相容--stream=tar!
--decompress 在備份時如果使用了加密或者壓縮選項,在用xbstream -x 解壓包出來後,還須使用innodbackupex --decompress/data/backup 壓縮後的檔案為ibdata1.qp,qp結尾的檔案!另外使用decompress還需yum install qpress.x86_64 裝上qpress這個包!
--slave-info This option is useful whenbacking up a replication slave server. It also writes this information tothe "xtrabackup_slave_info" file as a "CHANGE MASTER"command. A new slave for this master can be set up by starting a slaveserver on this backup and issuing a"CHANGE"xtrabackup_slave_info" file. 在備份從伺服器時,使用此參數能記錄master的日誌和位移量!用於做一個新的從伺服器!一般情況下的全備份,master二進位記錄檔以及位移點會記錄在xtrabackup_binlog_info這個檔案中!
四、 常用例子1. 完全備份
[root@localhostback]# innobackupex --defaults-file=/etc/my.cnf --host 10.22.19.44 --port=3306--user=root --password=123456 --socket=/tmp/mysql.sock /back
2. 增量備份基於2015-08-27_09-54-02進行增量備份
[root@localhostaaa]# innobackupex --user=root --password=123456 --defaults-file=/etc/my.cnf--socket=/tmp/mysql.sock --no-timestamp --incremental --incremental-basedir=/back/2015-08-27_09-54-02//back/001/
基於/back/001/進行增量備份
[root@localhostaaa]# innobackupex --user=root --password=123456 --defaults-file=/etc/my.cnf--socket=/tmp/mysql.sock --no-timestamp --incremental--incremental-basedir=/back/001/ /back/002/
可以通過以下檔案查看備份資訊:
[root@localhostback]# cat 2015-08-27_09-54-02/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 919852583
last_lsn = 919852583
compact = 0
[root@localhostback]# cat 001/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 919852583
to_lsn = 919854256
last_lsn = 919854256
compact = 0
[root@localhostback]# cat 002/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 919854256
to_lsn = 919858085
last_lsn = 919858085
可以通過lsn看到這3個備份組關係
也可以通過此命令來進行指定lsn的方式進行備份
[root@localhostaaa]# innobackupex --user=root --password=123456 --defaults-file=/etc/my.cnf--socket=/tmp/mysql.sock --no-timestamp --incremental --incremental-lsn=919854256/back/002/
3. 備份並打包tar方式:
[root@localhost back]# innobackupex --defaults-file=/etc/my.cnf--host 10.22.19.44 --port=3306 --user=root --password=123456--socket=/tmp/mysql.sock --stream=tar /back>/back/fullbackup.tar
xbstream方式
[root@localhost back]# innobackupex--defaults-file=/etc/my.cnf --host 10.22.19.44 --port=3306 --user=root--password=123456 --socket=/tmp/mysql.sock --stream=xbstream/back>/back/fullbackup.xbstream
4. 備份並打包並且壓縮tar方式的打包
gzip方式壓縮:
[root@localhostback]# innobackupex --defaults-file=/etc/my.cnf --host 10.22.19.44 --port=3306--user=root --password=123456 --socket=/tmp/mysql.sock --stream=tar /back/|gzip -> /back/fullbackup2.tar.gz
bzip2方式壓縮:
[root@localhostback]# innobackupex --defaults-file=/etc/my.cnf --host 10.22.19.44 --port=3306--user=root --password=123456 --socket=/tmp/mysql.sock --stream=tar /back/|bzip -> /back/fullbackup2.tar.bz2
xbstream方式打包並壓縮
[root@localhostback]# innobackupex --defaults-file=/etc/my.cnf --host 10.22.19.44 --port=3306--user=root --password=123456 --socket=/tmp/mysql.sock --stream=xbstream--compress /back>/back/fullbackup2.xbstream
備份打包並傳遞到其他伺服器壓縮存放
[root@localhost back]# innobackupex--defaults-file=/etc/my.cnf --host 10.22.19.44 --port=3306 --user=root--password=123456 --socket=/tmp/mysql.sock --stream=tar /back/2>/back/log2.log|ssh 10.22.19.90 "bzip2 ->/root/mysql.tar.bz2"
root@10.22.19.90's password:
5. 全備還原資料庫:應用日誌
[root@localhostback]# innobackupex --apply-log /back/2015-08-27_09-51-14/
還原全備庫
[root@localhostback]# innobackupex --user=root --password=123456 --copy-back --use-memory=512M /back/2015-08-27_09-51-14/
查看data目錄許可權
[root@localhostback]# ll /usr/local/mysql|grep data
drwxr-xr-x 14 root root 4096 8月 27 12:50 data
drwx------ 11 mysql mysql 4096 7月 15 13:13 data2
修改目錄許可權
[root@localhostback]# chown -R mysql:mysql /usr/local/mysql/data
[root@localhostback]# ll /usr/local/mysql|grep data
drwxr-xr-x 14 mysql mysql 4096 8月 27 12:50 data
drwx------ 11 mysql mysql 4096 7月 15 13:13 data2
啟動資料庫
[root@localhost~]# service mysqld start
Starting MySQL..[確定]
還原二進位日誌
[root@localhostmysql]# mysqlbinlog /root/mysql.000018 >/tmp/abc.sql
[root@localhostmysql]#mysql -uroot -p123456
mysql>set sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)
mysql>source /tmp/abc.sql;
還原成功
6. 增量備份還原資料庫
將最近一次全備資料庫檔案執行redo重做
[root@localhostdata]# innobackupex --apply-log --redo-only /back/2015-08-27_09-54-02/
將除了最後一次增量備份庫之外其他庫都執行redo重做並且合并到全備庫中
[root@localhostdata]# innobackupex --apply-log --redo-only /back/2015-08-27_09-54-02/--incremental-dir=/back/001/
將最後一次增量備份應用日誌(不用--redo-only)並且合并到全備庫中
[root@localhostdata]# innobackupex --apply-log /back/2015-08-27_09-54-02/--incremental-dir=/back/002/
這是因為除了最後的一個增量備份外,前面的事物都不應該進行復原因為有可能前一個沒有提交的事物在下一個備份中提交了,如果進行了復原則有可能導致資料不一致從而無法進行還原
進行全庫恢複
[root@localhostdata]# innobackupex --copy-back /back/2015-08-27_09-54-02/
還原二進位日誌
[root@localhostmysql]# mysqlbinlog /root/mysql.000018 >/tmp/abc.sql
[root@localhostmysql]#mysql -uroot -p123456
mysql>set sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)
mysql>source /tmp/abc.sql;
還原成功
由於時間原因沒有添加部分還原內容,周末之前添加
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。