XtraBackup全量備份與恢復MySQL數據
防偽碼:沒有相當程度的孤獨是不可能有內心的平和。
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
1.1 備份原理
整個備份過程如下圖:
innobackupex 在啟動後,會先 fork 一個進程,啟動 xtrabackup進程,然後就等待 xtrabackup 備份完 ibd 數據文件;
xtrabackup 在備份 InnoDB 相關數據時,是有2種線程的,1種是 redo 拷貝線程,負責拷貝 redo 文件,1種是 ibd 拷貝線程,負責拷貝 ibd 文件;redo 拷貝線程只有一個,在 ibd 拷貝線程之前啟動,在 ibd 線程結束後結束。xtrabackup 進程開始執行後,先啟動 redo 拷貝線程,從最新的 checkpoint 點開始順序拷貝 redo 日誌;然後再啟動 ibd 數據拷貝線程,在 xtrabackup 拷貝 ibd 過程中,innobackupex 進程一直處於等待狀態(等待文件被創建)。
xtrabackup 拷貝完成idb後,通知 innobackupex(通過創建文件),同時自己進入等待(redo 線程仍然繼續拷貝);
innobackupex 收到 xtrabackup 通知後,執行FLUSH TABLES WITH READ LOCK (FTWRL),取得一致性位點,然後開始備份非 InnoDB 文件(包括 frm、MYD、MYI、CSV、opt、par等)。拷貝非 InnoDB 文件過程中,因為數據庫處於全局只讀狀態,如果在業務的主庫備份的話,要特別小心,非 InnoDB 表(主要是MyISAM)比較多的話整庫只讀時間就會比較長,這個影響一定要評估到。
當 innobackupex 拷貝完所有非 InnoDB 表文件後,通知 xtrabackup(通過刪文件) ,同時自己進入等待(等待另一個文件被創建);
xtrabackup 收到 innobackupex 備份完非 InnoDB 通知後,就停止 redo 拷貝線程,然後通知 innobackupex redo log 拷貝完成(通過創建文件);
innobackupex 收到 redo 備份完成通知後,就開始解鎖,執行 UNLOCK TABLES;
最後 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-01 | 192.168.10.20 | CentOS 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數據