1. 程式人生 > >MySQL資料庫之xtrabackup物理備份(一)

MySQL資料庫之xtrabackup物理備份(一)

前言:說到資料庫備份,我們知道可以用來對資料庫進行備份的工具有mysqldump、mydumer、mysqlpump等等,實際工作中,機器上的資料庫不大的話,都是用mysqldump工具來備份,這些備份工具各有優缺點,這裡不詳細介紹,今天分享另一個數據庫備份工具,叫XtraBackup。

一、Xtrabackup介紹

1.官網說明

Percona XtraBackup可以在不阻止使用者查詢的情況下實現MySQL備份,因此非常適合擁有大資料集和無法承受長時間停機的關鍵任務應用程式的公司。作為開源解決方案免費提供,Percona XtraBackup降低了備份成本,同時為MySQL備份提供了獨特的功能。   2.Xtrabackup優點 快速可靠地完成備份 備份期間不間斷的事務處理 節省磁碟空間和網路頻寬 自動備份驗證 更快的恢復時間可延長正常執行時間
支援InnoDB,XtraDB和HailDB 儲存引擎的完全非阻塞備份   3.Xtrabackup備份的過程
  (1)備份開始時會開啟一個後臺檢測程序,實時檢測mysql redo(已提交的事務)的變化,一旦發現redo中有新日誌寫入,立刻將日誌記入後臺日誌檔案xtrabackup_log中, (2)複製InnoDB的資料檔案和系統表空間檔案ibdata1, (3)待複製結束後,執行flush tables with read lock操作,複製.frm、.MYI、.MY等檔案 (4)執行flush tables with read lock的目的是為了防止資料表發生DML操作,並且在這一時刻獲得binlog的位置, (5)最後會發出unlock tables,把表設定為可讀寫狀態, (6)最終停止xtrabackup_log。

4.為什麼要用XtraBackup

因為當資料庫超過100G的話,用mysqldump就沒有XtraBackup有優勢,工作中mysqldump備份大的資料還會出現卡住,斷開的可能性,XtraBackup支援完整備份,增量備份,完整恢復,增量恢復,對於innodb引擎備份時不鎖表進行熱備份。

二、XtraBackup安裝

1.xtrabackup官網有很多個版本,有1.6、2.0-2.4和8.0,每個版本都有不同,根據自己需要下載安裝,如:
xtrabackup1.6版本支援MySQL 5.0、5.1和5.5。
xtrabackup2.2和2.3版本支援備份MySQL 5.1 、5.5和5.6。
xtrabackup2.4版本支援MySQL 5.1、5.5、5.6和5.7。
xtrabackup8.0版本只支援MySQL8.0,不支援8.0之前的。
本文章使用xtrabackup2.3。


2.下載安裝

官網有原始碼包下載,二進位制包、還有儲存庫,官網推薦儲存庫下載,我這裡環境用Centos7,所以用yum安裝,這裡選擇安裝yum install -y percona-xtrabackup.x86_64

 1 yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
 2 yum list | grep percona
 3 percona-xtrabackup.x86_64                 2.3.10-1.el7                 percona-release-x86_64
 4 percona-xtrabackup-22.x86_64              2.2.13-1.el7                 percona-release-x86_64
 5 percona-xtrabackup-22-debuginfo.x86_64    2.2.13-1.el7                 percona-release-x86_64
 6 percona-xtrabackup-24.x86_64              2.4.18-1.el7                 percona-release-x86_64
 7 percona-xtrabackup-24-debuginfo.x86_64    2.4.18-1.el7                 percona-release-x86_64
 8 percona-xtrabackup-80.x86_64              8.0.9-1.el7                  percona-release-x86_64
 9 percona-xtrabackup-80-debuginfo.x86_64    8.0.9-1.el7                  percona-release-x86_64
10 percona-xtrabackup-debuginfo.x86_64       2.3.10-1.el7                 percona-release-x86_64
11 percona-xtrabackup-test.x86_64            2.3.10-1.el7                 percona-release-x86_64
12 percona-xtrabackup-test-22.x86_64         2.2.13-1.el7                 percona-release-x86_64
13 percona-xtrabackup-test-24.x86_64         2.4.18-1.el7                 percona-release-x86_64
14 percona-xtrabackup-test-80.x86_64         8.0.9-1.el7                  percona-release-x86_64

安裝之後,可以檢查xtrabackup版本,我本地的資料庫版本是5.6

1 xtrabackup --version
2 xtrabackup version 2.3.6 based on MySQL server 5.6.24 Linux (x86_64) (revision id: )

3.工具介紹

Xtrabackup安裝完成後有4個可執行檔案,其中2個比較重要的備份工具是innobackupex、xtrabackup

innobackupex
innobackupex是一個封裝xtrabackup的Perl指令碼。。
xtrabackup
編譯後的C二進位制檔案,提供了使用MyISAM,InnoDB和XtraDB表備份整個MySQL資料庫例項的功能。
xbcrypt加密
用於加密和解密備份檔案的實用程式。
xbstream
允許以流的形式從xbstream格式提取檔案,類似tar。
xbcloud
用於從雲中下載xbstream歸檔的全部或部分或將其上傳到雲。

官網說明:innobackupex仍然像2.2版本一樣支援所有功能和語法,但是現在已棄用,並且將在下一個主要版本中刪除,Percona XtraBackup 2.3版本的推薦方式採取的備份是使用xtrabackup指令碼,這篇文章介紹innobackupex指令碼,差別不大。

4.innobackupex命令引數

--user=             #指定資料庫備份使用者

--password=          #指定資料庫備份使用者密碼

--port=             #指定資料庫埠

--host=             #指定備份主機

--socket=            #指定socket檔案路徑

--databases=         #備份指定資料庫,多個空格隔開,如--databases="dbname1 dbname2",不加備份所有庫

--defaults-file=         #指定my.cnf配置檔案

--apply-log             #日誌回滾

--incremental=            #增量備份,後跟增量備份路徑

--incremental-basedir=    #增量備份,指上次增量備份路徑

--redo-only             #合併全備和增量備份資料檔案

--copy-back             #將備份資料複製到資料庫,資料庫目錄要為空

--no-timestamp            #生成備份檔案不以時間戳為目錄名

--stream=               #指定流的格式做備份,--stream=tar,將備份檔案歸檔,--stream=xbstream

--remote-host=user@ip DST_DIR #備份到遠端主機
                      
--use-memory=          #該引數在prepare的時候使用,控制prepare時innodb例項使用的記憶體量
             
--parallel            #用於複製資料檔案的執行緒數。配合-stream=xbstream
                      
--compress            #壓縮功能,配合-stream=xbstream
 
--compress-threads=4    #用於並行資料壓縮的執行緒數。此選項的預設值為1。配合-stream=xbstream
                      
--throttle=          #限制innobackupex讀寫InnoDB資料的速率

 

三、用innobackupex進行完整備份
1.執行完整備份命令

innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password="123456" --socket=/tmp/mysql.sock --no-timestamp /data/backup/$(date +%F)/full
最後輸出下面資訊表示成功備份
xtrabackup: Transaction log of lsn (42677124128) to (42677124128) was copied.
200127 13:21:18 completed OK!

在/data/backup目錄下面生成一個當前日期命名的目錄,時間目錄下面的full目錄裡面存放著備份出來的檔案

1 [root@devops 13:17:24/data/backup/]# ll 
2 total 2535576
3 drwx------ 3 root root       4096 Jan 27 13:17 2020-01-27

介紹一下目錄的檔案資訊

 1 [root@devops 13:21:18/data/backup/]# ll 2020-01-27/full/
 2 total 141364
 3 -rw-r----- 1 root root       388 Jan 27 13:21 backup-my.cnf   #備份命令用到的配置資訊
 4 -rw-r----- 1 root root 144703488 Jan 27 13:17 ibdata1      #備份的表空間的檔案 
 5 drwx------ 2 root root      4096 Jan 27 13:21 mysql            #備份出來的mysql、performance_schema、test資料庫
 6 drwx------ 2 root root      4096 Jan 27 13:21 performance_schema
 7 drwx------ 2 root root      4096 Jan 27 13:21 test
 8 -rw-r----- 1 root root        21 Jan 27 13:21 xtrabackup_binlog_info      #binlog日誌資訊
 9 -rw-r----- 1 root root       121 Jan 27 13:21 xtrabackup_checkpoints      #這個比較重要,裡面存放著lsn(日誌序列號)
10 -rw-r----- 1 root root       602 Jan 27 13:21 xtrabackup_info             #存放一些工具版本、資料庫版本、執行開始結束時間等資訊
11 -rw-r----- 1 root root      2560 Jan 27 13:21 xtrabackup_logfile          #重做日誌檔案

2.模擬刪除整個資料目錄

cd /data/ && rm -rf mysqldata

3.kill掉mysql程序

pgrep mysql | xargs kill

4.準備

準備(prepare)一個完全備份
一般情況下,在備份完成後,資料尚且不能用於恢復操作,因為備份的資料中可能會包含尚未提交的事務或已經提交但尚未同步至資料檔案中的事務。因此,此時資料檔案仍處理不一致狀態。“準備”的主要作用正是通過回滾未提交的事務及同步已經提交的事務至資料檔案也使得資料檔案處於一致性狀態。
innobackupex命令的-apply-log選項可用於實現上述功能
不建議在準備時中斷xtrabackup過程,因為這可能會導致資料檔案損壞並且備份將變得不可用。如果準備過程中斷,則不能保證備份的有效性。

innobackupex --apply /data/backup/2020-01-27/full/

  最後輸出:200127 13:44:47 completed OK!

5.檢視xtrabackup_checkpoints檔案    

檢視合併後的 checkpoints 其中的型別變為 full-prepared 即為可恢復。

backup_type = full-prepared

6.執行恢復之前要在my.cnf指定資料目錄

恢復備份之前,datadir必須為空。要注意在執行還原之前需要關閉MySQL伺服器。不能還原到正在執行的mysqld例項的資料目錄(匯入部分備份時除外)

1 cat /usr/local/mysql/my.cnf  | grep datadir
2 datadir         = /data/mysqldata

7.執行恢復命令

innobackupex --defaults-file=/usr/local/mysql/my.cnf --copy-back /data/backup/2020-01-27/full
200127 13:56:37 completed OK!      

如果恢復最後輸出OK就沒問題

8.修改許可權

由於將保留檔案的屬性,因此在大多數情況下,mysql在啟動資料庫伺服器之前,需要將檔案的所有權更改為mysql

chown -R mysql.mysql /data/mysqldata

9.啟動

service mysqld start

10.檢查資料


總結:這篇文章介紹xtrabackup完整備份和還原,後面還會繼續寫,如果那裡寫得不好,請多多指教,謝謝