Xtrabackup是一個開源的免費的熱備工具,在Xtrabackup包中主要有Xtrabackup和innobackupex兩個工具。其中Xtrabackup只能備份InnoDB和XtraDB兩種引擎; innobackupex則是封裝了Xtrabackup,同時增長了備份MyISAM引擎的功能。mysql
Xtrabackup備份時不能備份表結構、觸發器等等,也不能智能區分.idb數據文件。另外innobackupex還不能徹底支持增量備份,須要和xtrabackup結合起來實現全備的功能。linux
(1).安裝xtrbackupsql
1)下載安裝包數據庫
網址是https://www.percona.com/downloads/,而後網頁查找Xtrabackup,下載本身須要的版本,就是下載速度有點慢。我這裏使用的是2.4.14版本。服務器
而後下載依賴包,網址是http://rpmfind.net/linux/atrpms/el6-x86_64/atrpms/stable/libev-4.04-2.el6.x86_64.rpm。
app
這兩個能夠下載好上傳到CentOS服務器,也可使用wget直接在服務器上下載。工具
2)解壓安裝測試
[root@youxi1 ~]# ls anaconda-ks.cfg mysql-5.7.16-1.el7.x86_64.rpm-bundle.tar libev-4.04-2.el6.x86_64.rpm Percona-XtraBackup-2.4.14-ref675d4-el7-x86_64-bundle.tar Mysql [root@youxi1 ~]# rpm -ivh libev-4.04-2.el6.x86_64.rpm 警告:libev-4.04-2.el6.x86_64.rpm: 頭V4 DSA/SHA1 Signature, 密鑰 ID 66534c2b: NOKEY 準備中... ################################# [100%] 正在升級/安裝... 1:libev-4.04-2.el6 ################################# [100%] [root@youxi1 ~]# tar -xf Percona-XtraBackup-2.4.14-ref675d4-el7-x86_64-bundle.tar [root@youxi1 ~]# ls anaconda-ks.cfg Percona-XtraBackup-2.4.14-ref675d4-el7-x86_64-bundle.tar libev-4.04-2.el6.x86_64.rpm percona-xtrabackup-24-2.4.14-1.el7.x86_64.rpm Mysql percona-xtrabackup-24-debuginfo-2.4.14-1.el7.x86_64.rpm mysql-5.7.16-1.el7.x86_64.rpm-bundle.tar percona-xtrabackup-test-24-2.4.14-1.el7.x86_64.rpm [root@youxi1 ~]# yum -y install percona-xtrabackup-24-2.4.14-1.el7.x86_64.rpm //這裏用yum安裝,由於還有其餘的依賴包
3)配置文件ui
修改配置文件/etc/my.cnf,保證[mysqld]模塊存在參數datadir=/var/lib/mysql(指向數據目錄),由於xtrbackup是根據/etc/my.cnf配置文件來獲取須要備份的文件。而後重啓mysqld。this
(2).xtrbackup的使用
通常使用的是innobackupex腳本,由於innobackupex是perl腳本對xtrbackup的封裝和功能擴展。
1)用戶權限說明
在備份數據庫時會涉及到兩個用戶:系統用戶與數據庫內部的用戶。
系統用戶須要在datadir(配置文件內設置的目錄)上具備讀寫執行權限(rwx)。而數據庫內部用戶須要:RELOAD和LOCK TABLES權限,爲了執行FLUSH TABLES WITH READ LOCK;REPLICATION CLIENT權限,爲了獲取binary log(二進制日誌文件)位置;CREATE TABLESPACE權限,爲了導入表,用戶表級別的恢復;SUPER權限,爲了在slave環境下備份用來啓動和關閉slave線程。
2)經常使用命令格式和經常使用參數
命令格式:
innobackupex [參數] [目的地址|源地址]
經常使用參數:
--user=[數據庫用戶] 以什麼用戶身份進行操做 --password=[密碼] 數據庫用戶的密碼 --port=[端口號] 數據庫的端口號,默認3306 --stream=[tar|xbstream] 打包壓縮 --defaults-file=[配置文件] 指定默認配置文件,默認讀取/etc/my.cnf
--no-timestamp 不建立時間戳文件,而改用目的地址(能夠自動建立)
--copy-back 備份還原的主要選項
--incremental 使用增量備份,默認使用的完整備份
--incremental-basedir=[地址] 與--incremental選項聯合使用,該參數指定上一級備份的地址來作增量備份
3)完整備份和還原
完整備份
[root@youxi1 ~]# innobackupex --user=root --password=123456 ./db_backup/ //這個會有大量輸出信息 [root@youxi1 ~]# innobackupex --user=root --password=123456 ./db_backup/ 2>>./db_backup/backup.log //若是不想要輸出信息,能夠將輸出信息重定向到指定文件或黑洞文件中 [root@youxi1 ~]# ls ./db_backup/ 2019-06-16_15-49-44 2019-06-16_15-51-23 backup.log [root@youxi1 ~]# ls ./db_backup/2019-06-16_15-49-44/ backup-my.cnf ibdata1 performance_schema xtrabackup_checkpoints xtrabackup_logfile ib_buffer_pool mysql sys xtrabackup_info [root@youxi1 ~]# innobackupex --user=root --password=123456 --no-timestamp ./db_backup/test/ 2>>./db_backup/backup.log //不使用時間戳建立目錄,可自動建立目的地址 [root@youxi1 ~]# ls ./db_backup/ 2019-06-16_15-49-44 2019-06-16_15-51-23 backup.log test [root@youxi1 ~]# ls ./db_backup/test/ backup-my.cnf ibdata1 performance_schema xtrabackup_checkpoints xtrabackup_logfile ib_buffer_pool mysql sys xtrabackup_info
還原,注意:innobackupex -copy-back不會覆蓋已存在的文件。並且還原時須要先關閉服務,若是服務是啓動的,那麼就不能還原到datadir
[root@youxi1 ~]# systemctl stop mysqld [root@youxi1 ~]# rm -rf /var/lib/mysql/* //危險操做,請在測試環境測試 [root@youxi1 ~]# innobackupex --copy-back ./db_backup/2019-06-16_15-49-44/ 2>>./db_backup/copyback.log [root@youxi1 ~]# ll /var/lib/mysql 總用量 12324 -rw-r----- 1 root root 292 6月 16 17:08 ib_buffer_pool -rw-r----- 1 root root 12582912 6月 16 17:08 ibdata1 drwxr-x--- 2 root root 4096 6月 16 17:08 mysql drwxr-x--- 2 root root 8192 6月 16 17:08 performance_schema drwxr-x--- 2 root root 8192 6月 16 17:08 sys -rw-r----- 1 root root 423 6月 16 17:08 xtrabackup_info [root@youxi1 ~]# chown -R mysql:mysql /var/lib/mysql //從新受權,不然mysqld沒法啓動 [root@youxi1 ~]# systemctl start mysqld [root@youxi1 ~]# mysql -uroot -p123456 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.7.26 MySQL Community Server (GPL) Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec)
4)增量備份和還原
增量備份的實現,依賴於innodb頁上面的LSN(log sequence number),每次對數據庫的修改都會致使LSN自增。增量備份會複製指定LSN<日誌序列號>以後的全部數據頁。
查看完整備份的LSN
[root@youxi1 ~]# cat ./db_backup/2019-06-16_15-49-44/xtrabackup_checkpoints backup_type = full-backuped //表明完整備份 from_lsn = 0 to_lsn = 2525919 last_lsn = 2525928 compact = 0 recover_binlog_info = 0 flushed_lsn = 2525928
建立一些數據,而後以2019-06-16_15-49-44時間戳建立第一個增量備份,並查看LSN
[root@youxi1 ~]# mysql -uroot -p123456 mysql> create database test_db; Query OK, 1 row affected (0.00 sec) mysql> use test_db; Database changed mysql> create table user_tb(id int,name varchar(20)); Query OK, 0 rows affected (0.01 sec) mysql> insert into user_tb values(1,'zhangsan'); Query OK, 1 row affected (0.00 sec) mysql> exit Bye [root@youxi1 ~]# innobackupex -uroot -p123456 --incremental --incremental-basedir=./db_backup/2019-06-16_15-49-44/ ./db_backup/ 2>>./db_backup/backup.log [root@youxi1 ~]# ls db_backup/ 2019-06-16_15-49-44 2019-06-16_15-51-23 2019-06-16_17-26-54 backup.log copyback.log test [root@youxi1 ~]# cat db_backup/2019-06-16_17-26-54/xtrabackup_checkpoints backup_type = incremental //表示增量備份 from_lsn = 2525919 to_lsn = 2530689 last_lsn = 2530698 compact = 0 recover_binlog_info = 0 flushed_lsn = 2530698
再建立一些數據,以上一個增量備份建立新的增量備份,並查看LSN
[root@youxi1 ~]# mysql -u root -p123456 mysql> use test_db; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> insert into user_tb values(2,'lisi'); Query OK, 1 row affected (0.00 sec) mysql> exit Bye [root@youxi1 ~]# innobackupex --user=root --password=123456 --incremental --incremental-basedir=db_backup/2019-06-16_17-26-54/ ./db_backup/ 2>>./db_backup/backup.log [root@youxi1 ~]# ls db_backup/ 2019-06-16_15-49-44 2019-06-16_17-26-54 backup.log test 2019-06-16_15-51-23 2019-06-16_17-40-13 copyback.log [root@youxi1 ~]# cat db_backup/2019-06-16_17-40-13/xtrabackup_checkpoints backup_type = incremental from_lsn = 2530689 to_lsn = 2530892 last_lsn = 2530901 compact = 0 recover_binlog_info = 0 flushed_lsn = 2530901
增量備份的還原就比較麻煩了:
第一步,從完整備份一步步升上來。首先是完整備份,innobackupex --apply-log --redo-only [完整備份的地址]。接着是除了想要還原到的增量備份,都須要innobackupex --apply-log --redo-only [完整備份的地址] --incremental-dir=[第1次到第n-1次增量備份地址],一個個執行過去。而後想要還原的增量備份innobackupex --apply-log [完整備份的地址] --incremental-dir=[第n次增量備份地址]。這時全部須要的日誌就到了完整備份目錄下,最後執行innobackupex --apply-log [完整備份的地址],將未完成的日誌執行。
第二步、中止mysqld,恢復數據,恢復目錄及文件權限,啓動mysqld,檢查是否正常。
還原實例:
[root@youxi1 ~]# innobackupex --apply-log --redo-only db_backup/2019-06-16_15-49-44/ 2>>db_backup/copyback.log [root@youxi1 ~]# innobackupex --apply-log --redo-only db_backup/2019-06-16_15-49-44/ --incremental-dir=db_backup/2019-06-16_17-26-54/ 2>>db_backup/copyback.log [root@youxi1 ~]# innobackupex --apply-log db_backup/2019-06-16_15-49-44/ --incremental-dir=db_backup/2019-06-16_17-40-13/ 2>>db_backup/copyback.log [root@youxi1 ~]# innobackupex --apply-log db_backup/2019-06-16_15-49-44/ 2>>db_backup/copyback.log [root@youxi1 ~]# systemctl stop mysqld [root@youxi1 ~]# rm -rf /var/lib/mysql/* //危險操做 [root@youxi1 ~]# innobackupex --copy-back db_backup/2019-06-16_15-49-44/ 2>db_backup/copyback.log [root@youxi1 ~]# chown -R mysql:mysql /var/lib/mysql/ [root@youxi1 ~]# systemctl start mysqld [root@youxi1 ~]# mysql -uroot -p123456 mysql> use test_db; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select * from user_tb; +------+----------+ | id | name | +------+----------+ | 1 | zhangsan | | 2 | lisi | +------+----------+ 2 rows in set (0.00 sec)