1. 程式人生 > >XtraBackup全量備份與恢復MySQL數據

XtraBackup全量備份與恢復MySQL數據

備份 mysql xtrabackup

防偽碼:沒有相當程度的孤獨是不可能有內心的平和。

1、概述

Percona XtraBackup(簡稱PXB)是 Percona 公司開發的一個用於 MySQL 數據庫物理熱備的備份工具,支持 MySQl(Oracle)、Percona Server 和 MariaDB,並且開源,淘寶的RDS for MySQL的物理備份就是基於XtraBackup做的。

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

  (1)xtrabackup是C/C++編譯的二進制文件,只能備份InnoDB和XtraDB兩種數據表,而不能備份MyISAM數據表;

  (2)innobackupex則封裝了xtrabackup,是一個perl腳本封裝,所以能同時備份處理innodb和myisam

,但在處理myisam時需要加一個讀鎖;

1.1 備份原理

整個備份過程如下圖:

技術分享

  1. innobackupex 在啟動後,會先 fork 一個進程,啟動 xtrabackup進程,然後就等待 xtrabackup 備份完 ibd 數據文件;

  2. xtrabackup 在備份 InnoDB 相關數據時,是有2種線程的,1種是 redo 拷貝線程,負責拷貝 redo 文件,1種是 ibd 拷貝線程,負責拷貝 ibd 文件;redo 拷貝線程只有一個,在 ibd 拷貝線程之前啟動,在 ibd 線程結束後結束。xtrabackup 進程開始執行後,先啟動 redo 拷貝線程,從最新的 checkpoint 點開始順序拷貝 redo 日誌;然後再啟動 ibd 數據拷貝線程,在 xtrabackup 拷貝 ibd 過程中,innobackupex 進程一直處於等待狀態(等待文件被創建)。

  3. xtrabackup 拷貝完成idb後,通知 innobackupex(通過創建文件),同時自己進入等待(redo 線程仍然繼續拷貝);

  4. innobackupex 收到 xtrabackup 通知後,執行FLUSH TABLES WITH READ LOCK (FTWRL),取得一致性位點,然後開始備份非 InnoDB 文件(包括 frm、MYD、MYI、CSV、opt、par等)。拷貝非 InnoDB 文件過程中,因為數據庫處於全局只讀狀態,如果在業務的主庫備份的話,要特別小心,非 InnoDB 表(主要是MyISAM)比較多的話整庫只讀時間就會比較長,這個影響一定要評估到。

  5. 當 innobackupex 拷貝完所有非 InnoDB 表文件後,通知 xtrabackup(通過刪文件) ,同時自己進入等待(等待另一個文件被創建);

  6. xtrabackup 收到 innobackupex 備份完非 InnoDB 通知後,就停止 redo 拷貝線程,然後通知 innobackupex redo log 拷貝完成(通過創建文件);

  7. innobackupex 收到 redo 備份完成通知後,就開始解鎖,執行 UNLOCK TABLES;

  8. 最後 innobackupex 和 xtrabackup 進程各自完成收尾工作,如資源的釋放、寫備份元數據信息等,innobackupex 等待 xtrabackup 子進程結束後退出。


1.2 常用參數

--defaults-file:指明服務器的配置文件,此參數必須作為innobackupex的第一個參數,否則報錯

--host:指明連接數據庫的主機

--user:指明執行數據庫備份的用戶名

--password:指明執行備份的密碼

--backup:指明為備份,此參數可以忽略

--apply-log:重做日誌

--copy-back:執行數據恢復

--slave-info:備份從庫的show slave status信息,僅用於在備份從庫時使用

--no-lock:不鎖表,僅適用於存儲引擎為innodb,並且不在乎備份位置點時使用


2、安裝XtraBackup

2.1 環境準備

主機名IP系統MySQL版本
MySQL-01192.168.10.20CentOS release 6.9 (Final)5.6.36

MySQL的安裝步驟略。

2.2 創建備份用戶

mysql> create user [email protected] identified by ‘123456‘;
Query OK, 0 rows affected (0.04 sec)
mysql> grant reload,lock tables,replication client,process on *.* to [email protected] identified by ‘123456‘;
Query OK, 0 rows affected (0.30 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.04 sec)


2.3 創建備份目錄

[[email protected] ~]#mkdir /backup


2.4 下載xtraBackup

[[email protected] ~]#cd /opt
# 下載可能較慢。
[[email protected] opt]#wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.7/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.7-2.el6.x86_64.rpm


2.4 安裝XtraBackup

# 安裝的時候出現報錯,原因為依賴包未安裝。
[[email protected] opt]#rpm -ivh percona-xtrabackup-24-2.4.7-2.el6.x86_64.rpm
warning: percona-xtrabackup-24-2.4.7-2.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
error: Failed dependencies:
	libev.so.4()(64bit) is needed by percona-xtrabackup-24-2.4.7-2.el6.x86_64
	perl(DBD::mysql) is needed by percona-xtrabackup-24-2.4.7-2.el6.x86_64
# 安裝相關依賴包
[[email protected] opt]#yum -y install libev-devel perl-DBD-MySQL
[[email protected] opt]#rpm -ivh percona-xtrabackup-24-2.4.7-2.el6.x86_64.rpm
warning: percona-xtrabackup-24-2.4.7-2.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
Preparing...                ########################################### [100%]
1:percona-xtrabackup-24  ########################################### [100%]
[[email protected] opt]#rpm -ql percona-xtrabackup-24-2.4.7-2.el6.x86_64
/usr/bin/innobackupex                #innobackupex腳本工具
/usr/bin/xbcloud
/usr/bin/xbcloud_osenv
/usr/bin/xbcrypt
/usr/bin/xbstream
/usr/bin/xtrabackup                    #最主要的備份工具
/usr/share/doc/percona-xtrabackup-24-2.4.7
/usr/share/doc/percona-xtrabackup-24-2.4.7/COPYING
/usr/share/man/man1/innobackupex.1.gz
/usr/share/man/man1/xbcrypt.1.gz
/usr/share/man/man1/xbstream.1.gz
/usr/share/man/man1/xtrabackup.1.gz

3、備份與恢復測試

3.1 全量備份

# defaults-file:my.cnf配置路徑
[[email protected] opt]#innobackupex --defaults-file=/app/mysql/my.cnf --user=backup --password=123456 /backup
# 查看backup目錄下已經有備份文件
[[email protected] opt]#ll /backup/
total 4
drwxr-x--- 5 root root 4096 Jul 14 17:25 2017-07-14_17-25-24
[[email protected] opt]#ls /backup/2017-07-14_17-25-24/
backup-my.cnf  performance_schema      xtrabackup_checkpoints
ibdata1        rep                     xtrabackup_info
mysql          xtrabackup_binlog_info  xtrabackup_logfile
[[email protected] opt]#cat /backup/2017-07-14_17-25-24/xtrabackup_checkpoints
backup_type = full-backuped        #備份方式為全量備份
from_lsn = 0                                  #由於是全備,其實LSN號為0
to_lsn = 13835894                        #截止LSN號
last_lsn = 13835894
compact = 0
recover_binlog_info = 0



3.2 模擬恢復

既然全量備份已經完成,那麽就來測試一下。

# 將數據庫停掉
[[email protected] ~]#service mysqld stop
Shutting down MySQL............ SUCCESS!
# 將data文件移到backup目錄下
[[email protected] ~]#mv /app/mysql/data /backup/data_bak
# 無法啟動mysqld了
[[email protected] ~]#service mysqld start
Starting MySQL.Logging to ‘/app/mysql/data/MySQL-01.err‘.
. ERROR! The server quit without updating PID file (/app/mysql/data/MySQL-01.pid).
# apply-log參數:在真正恢復數據庫數據之前,先將數據庫redo日誌狀態恢復。
[[email protected] ~]#innobackupex --defaults-file=/app/mysql/my.cnf --user=backup --password=123456  --apply-log /backup/2017-07-14_17-25-24
# 執行數據恢復
[[email protected] ~]#innobackupex --defaults-file=/app/mysql/my.cnf --user=backup --password=123456  --copy-back /backup/2017-07-14_17-25-24
[[email protected] ~]#chown -R mysql.mysql /app/mysql/data
# 再次啟動數據庫,顯示成功
[[email protected] ~]#service mysqld start
Starting MySQL.Logging to ‘/app/mysql/data/MySQL-01.err‘.
. SUCCESS!


4、參考

http://mysql.taobao.org/monthly/2016/03/07/

http://www.cnblogs.com/olinux/p/5207887.html


本文出自 “簡明Linux” 博客,請務必保留此出處http://easylinux.blog.51cto.com/9732761/1947667

XtraBackup全量備份與恢復MySQL數據