"三高"Mysql - Mysql備份概覽

lazytimes發表於2022-04-13

引言

​ 內容為慕課網的《高併發 高效能 高可用 MySQL 實戰》視訊的學習筆記內容和個人整理擴充套件之後的筆記,本篇內容側重Mysql備份的基本原理和常用介紹為主,大部分為理論相關的內容。

​ 資料備份在平時的工作和學習中可能使用的比較少,但是對於一個線上專案來說卻是不可或缺的一環,對於開發人員來說熟悉和了解備份的相關知識是很有必要的,學習備份的相關內容可以幫助我們瞭解運維工作中一些基本的備份操作。

​ 本節內容偏向理論為主,重點在於瞭解Mysqldump如何實現增量備份和全量備份,為後面的文章介紹Mysql主備同步打下基礎。

知識點:

  • Outfile 原生mysql工具介紹
  • MysqlDump對於Outfile工具改進,MysqlDump特點介紹
  • MysqlDump實現增量備份和全量備份的細節
  • Xtrabackup備份工具的介紹以及實現增量備份和全量備份的細節

備份介紹

為什麼需要備份?

  1. 現代的多數服務多數系統高可用,資料無價,丟失會帶來難以承擔的損失。
  2. 一套完整的備份機制可以使得系統遇到不可抗力的情況時將資料的修復代價降到最低甚至零損失。
  3. 對於任何專案都應該具備定期備份資料的好習慣,無論是否為生產專案。

備份形式

  1. 物理備份:比如我們使用硬碟拷貝自己的重要資料,靈活性一般,安全性較高。
  2. 雲伺服器備份:將資料傳到第三方的雲資料庫進行保管,維護成本一般,安全性取決於第三方維護商的質量。
  3. 自建伺服器備份:開銷比較大,但是資料安全性和穩定性都是最高的,也可以離線進行物理備份,可操作性強。

備份時候資料狀態三種:

  • 熱備:正常執行備份。此時資料庫可讀可寫。
  • 冷備:停機備份。資料庫無法進行任何操作。
  • 溫備資料庫只讀。資料庫可用性弱於熱備,備份期間,資料庫只能進行讀操作,不能進行寫操作

備份檔案格式

備份檔案的格式意味著匯出的時候是什麼樣的:

  • 邏輯備份:輸出或者SQL語句,可以供技術人員閱讀。
  • 物理備份(裸檔案):備份資料庫底層檔案但是不可閱讀

備份內容

  • 完全備份:備份完整資料
  • 增量備份:備份全量備份之後的資料差異
  • 日誌備份:也就是Binlog 備份

常用工具

常用的備份工具有下面兩種

  • Mysqldump:邏輯備份,熱備份,全量
  • xtrabackup:物理,熱,全量 + 增量備份

小結

  • 備份的基本形式:從備份的形式來看,可以使用物理磁碟備份,也可以依賴於三方服務商的伺服器或者自建的伺服器進行備份,而從備份資料狀態來看,可以存在熱備,冷備和溫備,這裡需要小心溫備這個概念。
  • 備份工具比較常用的有兩種:Mysqldumpxtrabackup,這兩種工具都需要重點掌握基礎的操作使用,實踐多餘理論,多使用就會了。
  • 開發的時候使用邏輯備份比較多,但是對於運維人員來說可能使用物理備份的方式更快,邏輯備份常常用於線上出問題的場景。

Outfile命令備份(瞭解)

怎麼來?

​ 關於這個命令我們只需要瞭解,在日常使用中並不涉及使用場景,此命令為mysql自帶的命令同時也是mysql 的預留關鍵字,可以說是最原始的邏輯備份方式,可以作為了解MysqlDump的前置基礎。

使用前提

  1. 要知道網站的絕對路徑,可以通過報錯資訊、phpinfo介面、404介面等一些方式知道
  2. 要有file的讀寫許可權,建議給相關資料夾執行chmod -R /xxx/xxx
  3. 寫的檔名一定是在檔案管理中中不存在的,不然也會不成功!

特點

  1. 簡單的匯出SQL結果主要用於臨時需要資料驗證的場景。
  2. Mysql原生命令支援的匯出方式,執行效率高。
  3. 命令簡單操作方便,可以匯出一致性檢視。

缺陷

  • 匯出的格式較為簡陋,通常需要對於資料進行二次處理才能正常使用。
  • 只能匯出SQL執行結果,沒有辦法將匯出後的資料用於還原。
通過上面的介紹可以看出Outfile這個命令只能用於日常開發的場景下需要測試資料臨時匯出,不能作為熱備的主要工具,但是這個命令對於Mysqldump來說是啟發性的。

如何使用?

前提條件:在具體的匯出之前我們需要了解Mysql匯出的具體路徑,使用下面的語句檢查一下當前的安全檔案匯出字首,注意結果如果為NULL在Mysql5.6版本沒有影響但是Mysql5.7版本是存在影響的。

另外個人使用的Mac系統的檔案系統管理雖然和Linux大體一致,但是其實有很多許可權等等細節問題也是踩了一波小坑。

show variables like '%secure%'
-- secure_file_priv  NULL

為什麼說使用secure_file_priv為NULL是存在影響的?

解答:

Mysql5.7的版本中,在Mysql啟動的時候,如果使用了這個引數的配置則會 限制你可以使用LOAD DATA INFILE載入檔案的範圍,意味著如果想要匯出必須是在這個配置指定的目錄下面才能成功,下面是此配置對應的變化:

1. secure\_file\_priv 為 NULL 時,表示限制mysqld不允許匯入或匯出

2. secure\_file\_priv 為 /tmp 時,表示限制mysqld只能在/tmp目錄中執行匯入匯出,其他目錄不能執行。

3. secure\_file\_priv 沒有值時,表示不限制mysqld在任意目錄的匯入匯出。

完成上面這些準備工作之後,我們需要搭建基本的操作環境,比如新建資料庫或者表,這裡依然使用了sakila資料庫,我們可以使用下面的命令進行嘗試匯出,比如下面的語句中我們將payment表的所有資料匯出。

select * from payment into Outfile '/Users/xxx/xxx/a.csv' 
注:Sakila資料庫在Mysql官方的example中可以直接下載。

但是實際執行過程中會出現如下的報錯,從報錯資訊可以看到這裡是因為secure_file_privNULL的問題:

1290 - The MySQL server is running with the --secure-file-priv option so it cannot execute this statement, Time: 0.004000s

再次強調個人學習的時候使用的是macos系統,設定起來比較麻煩這裡也不囉嗦具體細節了,主要講一下處理思路:

  • 設定自定義的配置my.ini檔案並且放到/etc 的目錄下面(Mysql讀取配置檔案規則最高優先順序),在檔案結尾設定此引數:secure_file_priv=/Users/xxxx/xxx/然後:x儲存(注意用sudo vim my.ini),匯出路徑建議選的當前/User/xxx家目錄,方便匯出之後立馬開啟。(根路徑路徑不太安全,macos系統也不允許你這麼弄)
  • 重啟Mysql或者重啟電腦,連線Mysql之後繼續執行上述命令後發現報錯:PermissionError: [Errno 13] Permission denied,明顯是macOs的許可權問題,通過命令chmod 777 匯出資料夾/* 可以給整個資料夾開放許可權(根目錄不要這樣做)。
  • 如果出現重名檔案使用命令一樣報錯,提示匯出檔案已經存在,切記每次執行前檢查是否重名檔案。

Macos使用brew安裝Mysql會發現沒有my.ini檔案,個人從網上翻了份能用的直接在下面連結提供的檔案尾部新增secure_file_priv=/Users/xxxx/xxx/即可 ,省去大夥的時間,當然是針對我這種蛋疼的MacOs系統來說的,其他作業系統應該可以直接找到相關配置檔案。

連結: https://pan.baidu.com/s/1bM3cQtaXMl3ZGNgQRzhEMA 提取碼: phkg

插曲:Maxos使用homebrew安裝版本的啟動和關閉:

關閉:sudo pkill -9 mysql

啟動:cd /usr/local/mysql/support-file/mysql.server start(stop關閉)

上面囉嗦一大堆之後,下面是最終匯出的結果,可以看到預設只使用了空格分隔,並且格式比較亂:

Outfile使用也是比較好記的,同時下面是Outfile的一些使用引數,通過這些引數可以自由配置:

SELECT ... INTO Outfile 'file_name'
        [CHARACTER SET charset_name]
        [export_options]
 
export_options:
    [{FIELDS | COLUMNS}
        [TERMINATED BY 'string']
        [[OPTIONALLY] ENCLOSED BY 'char']
        [ESCAPED BY 'char']
    ]
    [LINES
        [STARTING BY 'string']
        [TERMINATED BY 'string']
    ]

我們發現上面的格式比較混亂,我們 希望按照規範表格的形式匯出,於是我們可以在每一行的資料之間新增都好,讓匯出之後的資料保持規範。

select * from payment into Outfile '/Users/xxx/xxx/a.csv' FIELDS terminated by ','

從結果可以看出Outfile只能用作一些簡單的場景的匯出操作:

到此為止我們只需要簡單瞭解這個命令即可,為下面瞭解Mysqldump打下原理基礎。

Mysqldump命令使用

Mysqldump的命令可以看作是Outfile命令的擴充套件,作為十分重要的備份工具經常用於開發和測試的場景,當然線上不推薦使用這種命令操作,一般需要由運維人員操作來匯出需要的資料,如果直接對著整個庫熱備份很容易出問題。

「知識點」

  1. Outfile的痛點,或者說Mysqldump改進點
  2. Mysqldump特點
  3. Mysqldump的操作(實戰案例)
  4. Mysqldump的增量備份如何實現(原理)

    • Binlog 忠實記錄mysql變化
    • Mysqldump通常只能全量備份,所以藉助Binlog作為增量備份。
    • 關鍵:Mysqldump備份,切換新的Binlog檔案,之後拷貝binlog檔案作為增量備份,注意全量備份和增量備份檔案的不同。
    • 採用從零開始還原,採用全量還原 + Binlog還原。
  5. Mysqldump通常只能全量備份,使用Binlog增量備份

    • 關鍵:Mysqldump備份,切換新的Binlog檔案。
  6. 採用從零開始還原:全量還原 + Binlog還原

Outfile的痛點

​ 只要簡單操作一下Outfile命令就會發現Outfile有下面這幾個明顯的缺點,Mysqldump其實就是解決了Outfile的很多現實問題,並且在此基礎上改進讓它更加簡單好用。

  • 只能匯出資料,很難把資料再次匯入
  • 無法做邏輯備份,也就是備份SQL邏輯
  • 匯出形式單一,通常只能匯出excel。

Mysqldump特點

  • Mysql官方內建命令,內建實現可以避開很多沒有必要的問題。
  • 支援遠端備份,可以生成多種格式的檔案。
  • 與儲存引擎無關,可以在多種儲存引擎下進行備份恢復,對innodb引擎支援熱備,對MyISAM引擎支援溫備(施加表鎖)
  • 免費。

如何學習Mysqldump?

官方開發的當然是官方文件學習最好啦,連結提供的是Mysql8.0的版本,其他版本需要根據自己當前使用的版本切換閱讀,另外命令引數不需要去記憶也沒有意義,在需要的時候翻出來看看然後看看官方文件即可:

任何工具類的東西適合使用的時候查閱,死記硬背是沒有意義的,最後會發現只需要記住常用的方式即可。

https://dev.mysql.com/doc/ref...

備份所需許可權

  • 如果需要備份資料至少需要SELECT許可權。
  • 備份檢視需要SHOW VIEW許可權。
  • 備份觸發器需要TRIGGER許可權。
  • 如果不使用引數--single-transaction,則需要相關許可權進行鎖表。
  • (從MySQL 8.0.21開始)如果不使用--no-tablespaces選項則需要PROCESS許可權。
  • 如果需要匯入備份資料,則需要包含執行語句的所有許可權,比如CREATE、ALTER、DELETE許可權

實踐:MysqlDump備份案例

​ 我們可以嘗試備份一下官方提供的example比如sakila,下面是一些簡單的操作命令:

​ 備份一個資料庫

-- 第一種備份方法
./Mysqldump -uroot -pxxxxxx sakila > /Users/xxx/xxx/xxx/xxxx/backup-file.sql
-- Mysqldump: [Warning] Using a password on the command line interface can be insecure.

​ 備份多個資料庫到一個sql檔案

./Mysqldump  --databases sakila sakila-db -uroot -xxx > /Users/xxx/xx/xxxx/xxx/backup-file_bk2.sql     

將資料從一個伺服器備份到另一個伺服器

-- 個人是本地單機沒有進行虛擬機器模擬,實驗結果未知
Mysqldump --opt db_name | mysql --host=remote_host -C db_name

​ 如果使用InnoDB 的儲存引擎Mysql有一種線上備份的方法:

-- 引數解釋
-- --all-databases 所有資料庫
-- --single-transaction RR級別的備份,也就是確保一致性的檢視(Innodb儲存引擎)
-- --master-data 將二進位制日誌檔案的名稱和位置寫到輸出端(留意一下,為下文的增量備份鋪墊)
-- 如果不是InnoDB,需要使用下面的引數:
-- 1. --lock-all-tables 使用FTWRL鎖鎖住所有表(MyISAM)
-- 2. --lock-tables 使用READ LOCAL鎖住當前庫的表(MyISAM)

Mysqldump -uroot -pxx --all-databases --master-data --single-transaction > /Users/xxx/xxx/all_databases.sql

​ 還原資料庫

-- 
./Mysqldump -uroot -pxxxxxx sakila < /Users/xxx/xxx/xxx/xxxx/backup-file.sql

-- 第二種還原備份方法
-- 1. 使用具備相關許可權的使用者名稱和密碼登陸連線到mysql伺服器 mysql -uroot -proot 
-- 2. source /xxx路徑/xx.sql檔案 source xxx.sql

-- 第三種方式
mysql -e "source /path-to-backup/backup-file.sql" db_name

​ 關於其他的命令這裡就不再擴充套件了,這裡介紹一些常用的基本夠日常開發使用了,如果需要更多的寫法可以參考上面的官方文件。

Mysqldump的增量備份實現原理

​ 上面提到的都是全量備份的方式,雖然我們在拷貝的時候可以通過--single-transaction拷貝一致性的檢視,雖然拷貝那一刻的資料記錄是全量並且完整的,但是此時資料庫依然是存在還在執行的增量資料的,那麼這部分資料應該如何備份呢?

​ 使用Mysqldump的進行增量備份首先需要了解增量備份的細節,所以這裡就輪到Binlog日誌上場了,Binlog的備份包含下面幾個小點:

  1. Binlog 忠實記錄mysql變化,全量增量備份和還原過程。
  2. Mysqldump通常只能全量備份,所以藉助Binlog作為增量備份。
  3. 關鍵:Mysqldump備份,切換新的Binlog檔案,之後拷貝binlog檔案作為增量備份,注意全量備份和增量備份檔案的不同。
  4. 採用從零開始還原,採用全量還原 + Binlog還原。

為什麼不能同時增量和全量備份:

我們可以把 Mysql記錄日誌的過程看作是在紙上寫字,此時Mysql在最新的Binlog日誌中記錄內容,如果我們把正在寫的內容和之前的日誌內容一併備份,就很可能導致備份出寫了一半的資料,就好像我們寫字的時候突然被抽中本子一樣,這樣就很有可能導致資料損壞。

​ Binlog 忠實記錄mysql變化,全量增量備份和還原過程。

​ 實現增量備份的關鍵點在於如何給Binlog日誌做切入點,做Mysqldump增量備份存在的最大問題是我們無法知道當前的全量備份和增量資料的分界點。Binlog日誌記錄的是Mysql的變化內容比如CRUD的資料記錄變動記錄以及資料的結構的調整等等,並且和InnoDB的儲存引擎的redo log雙寫保持事務一致性。

​ 根據上面的內容介紹我們知道了Mysqldump只能全量備份,需要藉助Binlog日誌完成增量備份

​ 增量備份實現思路是在備份的時候將當前正在讀寫的Binlog日誌停掉,並且將此檔案進行拷貝,但是需要注意的是此時拷貝的是Binlog檔案,和日常編寫的邏輯SQL是不一樣的,切記。

關鍵點:Mysqldump備份,Mysql伺服器停止當前Binlog寫入並且切換新的Binlog檔案

​ Mysqldump提供了類似上面提到的操作,下面是Mysqldump全量備份+增量備份的操作流程:

-- --all-databases 所有資料庫
-- --single-transaction RR級別的備份,也就是確保一致性的檢視(Innodb儲存引擎)
-- --master-data=[=Value](8.0.26改為--source-data命令) 將二進位制日誌檔案的名稱和位置寫到輸出端(留意一下,為下文的增量備份鋪墊)
-- --flush-logs 在備份之前重新整理伺服器的日誌 
Mysqldump -uroot -pxx --all-databases --master-data=2 --flush-logs --single-transaction > /Users/xxx/xxx/all_databases.sql

​ 通過執行上面的命令之後首先會進行全量備份同時會把Binlog切換到下一份日誌檔案重新開始進行讀寫,此時就可以把這一份停止寫入對binlog日誌檔案備份出來進行後續的增量備份還原,簡而言之:Mysql備份的同時切換Binlog,並且把當前寫了一部分的Binlog日誌進行拷貝。

​ Mysql其實還有一種備份方式那就是Binlog手動增量備份,實現方式是直接使用命令把快取的日誌刷到磁碟中並且切換到下一個Binlog,它的命令格式如下:

mysqladmin -uroot -p123456 flush-logs

​ 需要注意的是這裡使用的是mysqladmin工具,在執行命令之後我們可以手動將所有的Binlog進行備份。

​ 還原方式:全量還原 + Binlog還原,還原操作和增量全量備份方式對應,因為是Mysqldump全量+Binlog增量備份,所以同樣需要先進行全量還原再增量還原。

​ 恢復全量備份:還原的操作最簡單的方式是連線伺服器之後執行source xxx.sql ,而Binlog增量還原操作案例如下:

mysqlBinlog Mysql-bin.00002 ... | mysql -uroot -p123456

小結

  1. Mysqldump + Binlog 可以有效進行全量 + 增量備份。
  2. Mysqldump實際上是對於Outfile工具的擴充套件和升級。
  3. Binlog備份,Binlog還原,Mysqldump備份可以看出不同元件的搭配。
  4. 從理論上來說Binlog可以還原到任意的時刻。
  5. Mysqldump 的引數較多,熟悉和掌握需要多加練習。
  6. 需要注意區分mysqladmin、mysqlBinlog、mysqldump

XtraBackup物理備份

​ XtrqBackup雖然不是官方開發的工具,但是使用的頻率卻遠高於mysqldump,物理備份相對比mysql的邏輯備份來說更加可靠,同時對於系統的影響也要更小。

​ 為什麼需要物理備份通常具備下面的理由:

  1. 邏輯備份針對大資料量備份速度十分緩慢。
  2. 匯出速度快不需要二次轉化。
  3. 對於資料庫的壓力較小。
  4. 增量備份更加容易。

直接拷貝裸檔案可行麼?

我們直接CV資料庫的檔案可以麼?理論上是可行的但是實際操作會發現有很多問題,以Innodb的儲存引擎的資料為例,它不僅涉及Binlog檔案,idb檔案(資料庫原始資料)以及frm檔案,還包括獨有的redo log和 undo log這些檔案等,此時會發現如果要拷貝這些檔案只能冷備,但是僅僅冷備還是不行的,因為這裡還牽扯作業系統和資料庫版本相容等等問題,有十分明顯的跨平臺的問題。

從結論來看,直接拷貝裸檔案理論上是可行的,但是實際上備份出來的資料可能完全不可用,甚至可能無法相容。

如何實現物理+全量+熱備?

實現思路如下:核心的思想是監聽redo log檔案變化的同時,備份Idb檔案和備份過程中進行了改動的redo log檔案。

  1. 啟動監聽執行緒,收集redo log
  2. 備份idb檔案,記錄監聽過程中新產生的redo log日誌
  3. 備份idb完成,停止收集redo log日誌
  4. 增加FTWRL鎖拷貝後設資料frm

FTWRL鎖是啥?

FLUSH TABLES WITH READ LOCK簡稱(FTWRL),該命令主要用於備份工具獲取一致性備份(資料與Binlog位點匹配)。需要注意的是這個鎖的粒度非常大,基本是鎖住整個庫的等級,如果是備份主庫會導致整個主庫“卡”住,從庫則會導致執行緒等待。

所需許可權:FLUSH_TABLESRELOAD許可權。

由於這裡講的主要是備份的內容,想進一步瞭解FTWRL鎖實現細節和使用教程可以參考下面的部落格:

注意在第四步給整個庫加全域性鎖會有一段時間資料庫是處於溫備的情況的(不能進行讀寫)。

這裡還存在一個問題,如何知道哪些資料是增量資料?Xtrabackup的思路是在Mysql中每一個資料頁存在一個LSN號碼,在備份的時候可以通過這個LSN號確定哪個頁存在變化,當進行過一次全量備份之後記錄變化過資料的LSN號,在下一次備份可以直接找比上一次LSN號更大的值進行備份。

LSN(log sequence number):日誌序列號,是一個一直遞增的整形數字,在MySQL5.6.3版本後佔8個位元組。它表示事務寫入到日誌的位元組總量。LSN主要用於發生crash時對資料進行recovery!每個資料頁重做日誌checkpoint都有LSN。

Xtrabackup介紹

在介紹Xtrabackup之前需要了解Mysql的ibbackup,它是由Innodb官方開發,後續被改名為Mysql Enterprise Backup,由於這個軟體為收費軟體使用者並不多,所以後續出現了完全替代品Xtrabackup並且被廣泛使用。

Xtrabackup是由percona開源的免費資料庫備份軟體,不同於Mysqldump這是一個第三方公司開發的軟體,在前面提到的Mysqldump命令是邏輯備份,邏輯備份最大的問題是在資料量特大的情況下匯出會十分緩慢並且十分影響資料庫的讀寫效能,並且匯出的時候需要對於資料庫進行“RR級別”的鎖定或者使用表鎖(MyISAM),所以對於大資料量還是建議使用物理備份的方式備份。

Xtrabackup安裝完成後有4個可執行檔案,其中2個比較重要的備份工具是innobackupexxtrabackup。下面是xtrabackup其他工具的大致介紹:

1)xtrabackup 是專門用來備份InnoDB表的,和mysql server沒有互動;

2)innobackupex 是一個封裝xtrabackup的Perl指令碼,支援同時備份innodb和myisam,但在對myisam備份時需要加一個全域性的讀鎖。

3)xbcrypt 加密解密備份工具

4)xbstream 流傳打包傳輸工具,類似tar

XtraBackup特點

  • 備份速度快,幾乎不影響伺服器的正常業務處理
  • 壓縮儲存,節省磁碟容量,同時可以儲存到另一個伺服器
  • 還原速度很快,對於伺服器的負載較小。

XtraBackup安裝過程

Xtrabackup是沒有windows和mac版本的,只有linux版本,所以需要做實驗也只能使用linux系統,所以這裡簡單記錄一下如何安裝:

下載地址:Percona Software downloads for databases

注意裡面包含很多軟體,這裡找到如上截圖所示的介面,根據自己的Mysql 版本下載:

  • 8.0:對應Mysql8.0以上版本。
  • 2.4:對應Mysql5.0 - Mysql5.7版本。

下面是xtrabackup的大致安裝操作流程:

wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.9/binary/redhat/6/x86_64/Percona-XtraBackup-2.4.9-ra467167cdd4-el6-x86_64-bundle.tar

[root@centos ~]# ll

total 703528

-rw-r--r-- 1 root root 654007697 Sep 27 09:18 mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz

-rw-r--r-- 1 root root  65689600 Nov 30 00:11 Percona-XtraBackup-2.4.9-ra467167cdd4-el6-x86_64-bundle.tar

[root@centos ~]# tar xf Percona-XtraBackup-2.4.9-ra467167cdd4-el6-x86_64-bundle.tar

[root@centos ~]# yum install percona-xtrabackup-24-2.4.9-1.el6.x86\_64.rpm -y

[root@centos ~]# which xtrabackup 

/usr/bin/xtrabackup

[root@centos ~]# innobackupex -v

innobackupex version 2.4.9 Linux (x86\_64) (revision id: a467167cdd4)

#已經安裝完成

XtraBackup全量備份與恢復

Xtrabackup安裝完成之後,我們可以使用下面的命令進行備份操作:

[root@centos ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password="123456" --backup /root

執行完成之後,會在對應的目錄裡面新增一個日期檔案目錄,接著我們需要同步log日誌:

#使用此引數使用相關資料性檔案保持一致性狀態
[root@centos ~]#innobackupex --apply-log /root/(日期)/

最後我們通過下面的命令對於備份檔案進行恢復:

[root@centos ~]# innobackupex --defaults-file=/etc/my.cnf --copy-back /root/(日期)/

Xtrabackup增量備份與恢復

需要注意的是增量備份僅能應用於InooDB或XtraDB表,下面的命令用於建立增量備份的資料。

[root@Vcentos ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --incremental /backup/ --incremental-basedir=/root/(日期)

#--incremental /backup/   指定增量備份檔案備份的目錄

#--incremental-basedir    指定上一次全備或增量備份的目錄

增量備份的恢復命令:

[root@centos ~]# innobackupex --apply-log --redo-only /root/(日期)/

[root@centos ~]# innobackupex --apply-log --redo-only /root/(日期)/ --incremental-dir=/backup/(日期)/

如果需要恢復全部的資料,可以使用下面的命令處理:

[root@centos ~]#innobackupex --defaults-file=/etc/my.cnf --copy-back /root/(日期)/

增量備份合併至全量備份,可以使用下面的命令:

innobackupex --apply-log bakdir/xxx-xx-xx/ --incremental-dir=basedir/YYYY-YY-YY/

小結

  • 物理備份是一種高效備份方式。
  • XtraBackup 採用備份idb + 備份期間監聽改動redo log的方式實現全量熱備+增量備份。
  • XtraBackup 是常用的Mysql物理備份工具。
  • 物理備份最大缺點是備份之後的檔案無法直接閱讀。

Mysql備份產生的創新

從Mysqldump對於備份的改進過程中我們可以從下面的方式進行思考:

  1. 直接複製磁碟:比複製資料檔案更為直接,直接複製物理磁碟裝置映象備份。
  2. 多執行緒備份:通過多執行緒的方式加快備份的速度。
  3. 備份工具管理:我們可以發現傳統備份都是小黑框,對於備份工具本身進行管理的軟體是許需要的。

由此擴充套件出下面幾個比較特殊的備份方式擴充套件:

  • Mylvmbackup:LVM備份磁碟。備份磁碟是一種物理溫備的備份方式,備份磁碟本身是一種很好的思路擴充套件,但是備份磁碟同樣有一個嚴重的問題,那就是相容性的問題,所以這個備份工具使用了LVM邏輯捲進行磁碟管理。
  • Mydumper:多執行緒備份。這個工具的使用頻率甚至比Mysqldump還要高一些。Mydumper主要有下面的特點

​ 1. 和Mysqldump類似的工具,2. 實現了多執行緒兵法備份還原,3. 速度更快。

  • Zmanda Recovery Manager(ZRM):備份工具管理。提供了視覺化的方式管理備份檔案,類似於資料庫管理工具中的navicat,這個工具的特點是整合Binlog和多種備份工具。

如何養成良好資料管理習慣

​ 最後無論多少的備份軟體其實最好的情況是備份的資料我們永遠也用不上,除開備份以外我們還有其他的方式來防止資料丟失,比如遵循下面的規範:

  • 許可權隔離

    • 業務只有DML許可權,刪除儘量使用假刪除
    • 開發人員只擁有隻讀賬號,當然很多情況下稍微大一些的公司都有明確的許可權管理。
    • DBA日常只使用只讀賬戶,特殊操作再切換賬號
    • 永遠不要使用root直接連客戶端,禁用root連線mysql
  • SQL 審計

    • DBA環境上線之前審計SQL語句
    • 開發修改資料需要DBA執行
    • Inception 自動稽核工具
  • 偽刪表

    • 刪表之前先改個名字,觀察業務影響
  • 刪除過程使用指令碼給特殊標記表名稱刪除,而不是手動操作

    • 對於本地開發需要備份的表可以使用加入_bak進行標記。
  • 完備過程

    • 上線之前必須備份

總結

​ 本節從Outfile這個古老的命令入手,介紹了mysqldump的命令前身以及對於outfile命令的改進優化,講述如何通過mysqldump實現增量和全量備份,同時介紹了內部的細節。但是邏輯備份通常只適用於資料量不是很大並且系統執行接受一定延遲響應對情況下可以這麼做,一旦資料量過大並且要求快速響應,如果想要熱備不影響系統,更加推薦Xtrabackup備份,這個工具可以說是運維備份Mysql DB的一大殺器,十分強大並且十分好用,這裡簡單介紹了實現的細節,對於XtraBack的細節探索這裡就不做過多演示了,更建議參考官方資料熟悉工具的使用。

寫在最後

​ 本篇同樣側重理論為主,下一篇內容圍繞整個課程的核心如何搭建“三高”架構進行講解。

相關文章