mysql物理備份工具Xtrabackup安裝配置html
Xtrabackup是一個對InnoDB作物理數據備份的工具,支持在線熱備份(備份時不影響數據讀寫),是商業備份工具InnoDB Hotbackup的一個很好的替代品。mysql
Xtrabackup有兩個主要的工具:xtrabackup、innobackupexsql
(1)xtrabackup只能備份InnoDB和XtraDB兩種數據表,而不能備份MyISAM數據表。數據庫
(2)innobackupex是用來備份非InnoDB表的,同時會調用xtrabackup命令來備份InnoDB表,還會和mysql server發送命令進行交會,如加讀鎖、獲取位點等。簡單來講,innobackupex在xtrabackup之上作了一層封裝。服務器
通常狀況下,咱們是但願能備份MyISAM表的,雖然咱們可能本身不用MyISAM表,可是mysql庫下的系統表示MyISAM的,所以備份基本都經過innobackupex命令進行;另一個緣由是咱們可能須要保存位點信息。app
XtraBackup基於InnoDB的crash-recovery功能,它會複製InnoDB的data file,因爲不鎖表,複製出來的數據是不一致的,在恢復的時候使用crash-recovery,使得數據恢復一致。socket
InnoDB維護了一個redo log,又稱爲transaction log(事務日誌),它包含了InnoDB數據的全部改動狀況。當InnoDB啓動的時候,它會先去檢查data file和transaction log,而且會作兩步操做:ide
XtraBackup在備份的時候,一頁一頁的複製InnoDB的數據,並且不鎖定表,與此同時,XtraBackup還有另一個線程監視着transaction log,一旦log發生變化,就把變化過的log pages複製走。爲何要着急複製走呢?由於transaction log文件大小有限,寫滿以後,就會從頭再開始寫,因此新數據可能會覆蓋到舊的數據。wordpress
在prepare過程當中,XtraBackup使用複製到的transaction log對備份出來的InnoDB data file進行crash recovery。工具
(1)備份過程快速、可靠
(2)備份過程不會打斷正在執行的事務
(3)可以基於壓縮等功能節約磁盤空間和流量
(4)自動實現備份檢驗
(5)還原速度快
原本想用源碼安裝的,但老是不斷報錯,因此只好採用yum方法安裝了
打開官網yum源安裝方法說明
https://www.percona.com/doc/percona-xtrabackup/LATEST/installation/yum_repo.html
按照步驟安裝官網的yum源
# yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
# ls /etc/yum.repos.d/
CentOS-Base.repo CentOS-fasttrack.repo CentOS-Vault.repo percona-release.repo
CentOS-Debuginfo.repo CentOS-Media.repo epel.repo
安裝xtrabackup
# yum list|grep percona #測試是否安裝成功官網的yum源
# yum install percona-xtrabackup-24
# xtrabackup -version #查看版本信息
也能夠選用其餘版本用rpm包方式安裝
https://www.percona.com/downloads/XtraBackup/LATEST/binary/redhat/6/x86_64/
--user=USER 指定備份用戶,不指定的話爲當前系統用戶
--password=PASSWD 指定備份用戶密碼
--port=PORT 指定數據庫端口
--defaults-group=GROUP-NAME 在多實例的時候使用
--host=HOST 指定備份的主機,能夠爲遠程數據庫服務器
--apply-log 應用 BACKUP-DIR 中的 xtrabackup_logfile 事務日誌文件。通常狀況下,在備份完成後,數據尚且不能用於恢復操做,由於備份的數據中可能會包含還沒有提交的事務或已經提交但還沒有同步至數據文件中的事務。所以,此時數據文件仍處於不一致狀態。「準備」的主要做用正是經過回滾未提交的事務及同步已經提交的事務至數據文件使得數據文件處於一致性狀態。
--apply-log-only 這個選項使在準備備份(prepare)時,只執行重作(redo)階段,這對於增量備份很是重要。
--database 指定須要備份的數據庫,多個數據庫之間以空格分開
--defaults-file 指定mysql的配置文件
--copy-back 將備份數據複製回原始位置
--incremental 增量備份,後面跟要增量備份的路徑
--incremental-basedir=DIRECTORY 增量備份時使用指向上一次的增量備份所在的目錄
--incremental-dir=DIRECTORY 增量備份還原的時候用來合併增量備份到全量,用來指定全備路徑
--redo-only 對增量備份進行合併
--rsync 加快本地文件傳輸,適用於non-InnoDB數據庫引擎。不與--stream共用
--safe-slave-backup
--no-timestamp 生成的備份文件不以時間戳爲目錄.
查看備份以前都有哪些庫
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| binlog |
| database1 |
| mysql |
| performance_schema |
| wangning |
| wordpress |
+--------------------+
7 rows in set (0.16 sec)
全備份數據存放在/data/backup/full下面,innobackupex會自動建立一個文件夾+以當前系統時間命名的文件夾
# innobackupex --defaults-file=/etc/my.cnf --user=root --password=abc123 --socket=/tmp/mysql.sock /data/backup/full
# ls /data/backup/full/
2017-12-11_09-10-45
備份好的目錄裏各文件說明,×××部分爲備份以前建的庫
# ls /data/backup/full/2017-12-11_09-10-45/
backup-my.cnf ibdata1 wangning xtrabackup_checkpoints
binlog mysql wordpress xtrabackup_info
database1 performance_schema xtrabackup_binlog_info xtrabackup_logfile
(1) backup-my.cnf —— 備份命令用到的配置選項信息;
(2) ibdata1 —— 備份的表空間文件;
(3) xtrabackup_binary —— 備份中用到的xtrabackup的可執行文件;
(4) xtrabackup_binlog_info —— mysql服務器當前正在使用的二進制日誌文件及至備份這一刻爲止二進制日誌事件的位置;
(5) xtrabackup_logfile —— 備份的重作日誌文件。
(6) xtrabackup_checkpoints —— 備份類型(如徹底或增量)、備份狀態(如是否已經爲prepared狀態)和LSN(日誌序列號)範圍信息;
# cat /data/backup/full/2017-12-11_09-10-45/xtrabackup_checkpoints
backup_type = full-backuped #能夠看出是全備份
from_lsn = 0 #記錄了LSN,日誌偏移量
to_lsn = 8096126
last_lsn = 8096126
compact = 0
recover_binlog_info = 0
關閉數據庫並移除數據文件
# service mysqld stop
# mv /application/mysql/data /opt/
# mkdir /application/mysql/data #建立數據目錄
# chown -R mysql.mysql /application/mysql/data
通常狀況下,這個/data/backup/full/2017-12-11_09-10-45備份不能用於恢復,由於備份的數據中可能會包含還沒有提交的事務或已經提交但還沒有同步至數據文件中的事務,此時數據文件處於不一致的狀態。所以,咱們如今就是要經過回滾未提交的事務及同步已經提交的事務至數據文件也使得數據文件處於一致性狀態。
# innobackupex --defaults-file=/etc/my.cnf --user=root --password=abc123 --socket=/tmp/mysql.sock --apply-log /data/backup/full/2017-12-11_09-10-45/
# innobackupex --defaults-file=/etc/my.cnf --user=root --password=abc123 --socket=/tmp/mysql.sock --copy-back /data/backup/full/2017-12-11_09-10-45
171211 10:03:07 innobackupex: Starting the copy-back operation
IMPORTANT: Please check that the copy-back run completes successfully.
At the end of a successful copy-back run innobackupex
prints "completed OK!".
innobackupex version 2.4.9 based on MySQL server 5.7.13 Linux (x86_64) (revision id: a467167cdd4)
Error: datadir must be specified.
當執行上述命令出現報錯時,是由於my.cnf文件裏沒有指定datadir目錄
解決方法:
[mysqld]
datadir = /application/mysql/data
啓動mysql出現報錯
# service mysqld start Starting MySQL. ERROR! The server quit without updating PID file (/application/mysql/data/db01.pid).
將data目錄屬主改成mysql便可
# chown -R mysql.mysql /application/mysql/data/
此時mysql的數據已成功恢復了
增量備份是在全量備份的基礎之上進行的
增量備份目錄1:/data/backup/increment1
增量備份目錄2:/data/backup/increment2
先全備再增備,全備見6.1
# innobackupex --defaults-file=/etc/my.cnf --user=root --password=abc123 --socket=/tmp/mysql.sock --incremental /data/backup/increment1 --incremental-basedir=/data/backup/full/2017-12-11_09-10-45
生成一個以系統時間命名的文件夾
# ls /data/backup/increment1/
2017-12-11_10-51-27
--incremental-basedir指的是徹底備份所在的目錄,此命令執行結束後,innobackupex命令會在/data/backup/increment1目錄中建立一個新的以時間命名的目錄以存放全部的增量備份數據。另外,在執行過增量備份以後再一次進行增量備份時,其--incremental-basedir應該指向上一次的增量備份所在的目錄。須要注意的是,增量備份僅能應用於InnoDB或XtraDB表,對於MyISAM表而言,執行增量備份時其實進行的是徹底備份。
準備完整的數據恢復文件
全備 --apply-log
# innobackupex --defaults-file=/etc/my.cnf --user=root --password=abc123 --socket=/tmp/mysql.sock --apply-log --redo-only /data/backup/full/2017-12-11_09-10-45/
增備1 --apply-log
# innobackupex --defaults-file=/etc/my.cnf --user=root --password=abc123 --socket=/tmp/mysql.sock --apply-log --redo-only /data/backup/full/2017-12-11_09-10-45/ --incremental-dir=/data/backup/increment1/2017-12-11_10-51-27
模擬數據庫損壞,詳見6.2.1
開始恢復數據,詳見6.2.3
第二次增量備份是在第一次增量備份的基礎上進行的
# innobackupex --defaults-file=/etc/my.cnf --user=root --password=abc123 --socket=/tmp/mysql.sock --incremental /data/backup/increment2 --incremental-basedir=/data/backup/increment1/2017-12-11_10-51-27
生成一個以系統時間命名的文件夾
# ls /data/backup/increment2/
2017-12-11_10-58-55
準備完整的數據恢復文件
增備2 --apply-log
# innobackupex --defaults-file=/etc/my.cnf --user=root --password=abc123 --socket=/tmp/mysql.sock --apply-log --redo-only /data/backup/full/2017-12-11_09-10-45/ --incremental-dir=/data/backup/increment2/2017-12-11_10-58-55
模擬數據庫損壞,詳見6.2.1
開始恢復數據,詳見6.2.3
按照6.3.2.2以此類推便可