Linux 第71天 mariadb backup and recovery

Linux 第71天 mariadb backup and recovery

時間: 20181013

        歡迎訪問我的博客: www.winthcloud.top


目錄

備份和恢復

冷備實驗

lvm快照備份實驗(溫備)

邏輯備份工具:mysqldump, mydumper, phpMyAdmin

總結



備份和恢復

爲什麼要備份

災難恢復:硬件故障、軟件故障、自然災害、******、誤操作測試等數據丟失場景

備份注意要點

能容忍最多丟失多少數據

恢復數據需要在多長時間內完成

需要恢復哪些數據

還原要點

做還原測試,用於測試備份的可用性

還原演練

備份類型:

完全備份:整個數據集

部分備份:只備份數據子集,如部分庫或表

增量備份:僅備份最近一次完全備份或增量備份(如果存在增量)以來變化的數據,

備份較快,還原複雜

差異備份:僅備份最近一次完全備份以來變化的數據,備份較慢,還原簡單

注意:二進制日誌文件不應該與數據文件放在同一磁盤


冷、溫、熱備份

冷備:讀寫操作均不可進行

溫備:讀操作可執行;但寫操作不可執行

熱備:讀寫操作均可執行

MyISAM:溫備,不支持熱備

InnoDB:都支持

物理和邏輯備份(重點)

物理備份:直接複製數據文件進行備份,與存儲引擎有關,佔用較多的空間,速度快

邏輯備份:從數據庫中“導出”數據另存而進行的備份,與存儲引擎無關,佔用空間少,

速度慢,可能丟失精度


備份時需要考慮的因素

溫備的持鎖多久

備份產生的負載

備份過程的時長

恢復過程的時長

備份什麼

數據

二進制日誌、InnoDB的事務日誌

程序代碼(存儲過程、函數、觸發器、事件調度器)

服務器的配置文件



備份工具

cp, tar等複製歸檔工具:物理備份工具,適用所有存儲引擎;

只支持冷備;完全和部分備份

LVM的快照:先加鎖,做快照後解鎖,幾乎熱備;藉助文件系統工具進行備份


mysqldump:邏輯備份工具,適用所有存儲引擎,溫備;支持完全或部分備份;

對InnoDB存儲引擎支持熱備,結合binlog的增量備份

xtrabackup:由Percona提供支持對InnoDB做熱備(物理備份)

的工具,支持完全備份、增量備份


MariaDB Backup: 從MariaDB 10.1.26開始集成,

基於Percona XtraBackup 2.3.8實現


mysqlbackup:熱備份, MySQL Enterprise Edition組件(收費)


mysqlhotcopy:PERL 語言實現,幾乎冷備,僅適用於MyISAM存儲引擎,

使用LOCK TABLES、FLUSH TABLES和cp或scp來快速備份數據庫



冷備實驗

即將mariadb服務停掉然後直接將其數據文件全部備份

datadir下的內容,二進制日誌,事務日誌等,全部備份,然後再另外一臺機器還原



lvm快照備份實驗(溫備)

想要使用lvm快照實現備份還原,首先數據庫文件必須是在lvm邏輯捲上存放,其次就是

卷組中有空餘的空間用來創建快照卷,此種方法備份時有短暫的時間鎖表用來創建快照

創建完成後即可將其釋放(如果用腳本幾乎就是熱備) 以下爲具體步驟:


1. 鎖表,創建數據庫分區快照 (鎖表之前模擬有事務未提交完成)

mysql -uroot -pcentos -e 'FLUSH TABLES WITH READ LOCK;'

lvcreate -L 1G -s -p r  -n snap_data /dev/skyVG/data

2. 記錄當前binlog位置,解鎖

mysql -uroot -pcentos -e 'FLUSH LOGS;'

mysql -uroot -pcentos -e 'SHOW MASTER STATUS' > /PATH/TO/SOMEFILE

mysql -uroot -pcentos -e 'UNLOCK TABLES;'


3. 備份數據庫內容並模擬插入新數據(如果是還原至其它的服務器注意要備份配置文件)

mount -o nouuid,norecovery /dev/mapper/skyVG-snap_data /mnt

tar -Jcf /root/mysql.back.xz /mnt/mysql

模擬向插入新數據(此處不寫具體命令了,自行插入)


4. 還原所備份的數據(還原時關閉記錄二進制日誌記錄)

因爲是全部還原所以需要將數據庫的數據文件全部刪除

(切記不要刪除二進制日誌,還原後需要用此日誌還原至最新狀態)

systemctl stop mariadb

rm -rf /data/mysql/*

cd /data/mysql

tar -xf /root/msyq.back.xz

mv mnt/mysql/* ./

rm -rf mnt


service mysqld start


5. 使用binlog還原至最新(建議此時關閉二進制日誌記錄)

查看之前所備份的那個位置記錄,然後將此位置文件之後的所有binlog文件重定向至

一個文件裏,我這裏的位置記錄是binlog.000004 379

cat mysql.posi

mysql -uroot -pcentos -e 'SET GLOBAL sql_log_gin=0'

mysqlbinlog --start-position=379 /data/mariadblog/binlog.000004>rect.sql


如在此之後還有其它binlog將其追加至同一個文件中(有幾個加幾個)

mysqlbinlog --start-position=379 /data/mariadblog/binlog.000005>>rect.sql


將此文件同步至數據庫中

mysql -uroot -pcentos < rect.sql

mysql -uroot -pcentos -e 'SET GLOBAL sql_log_gin=1'

此時數據庫中已同步至最新的狀態(可以查看即使當時有事務未完成提交也不影響恢復

後丟失數據)



邏輯備份工具:mysqldump, mydumper, phpMyAdmin

此種備份與lvm不同之處在於這個備份是在邏輯上的備份,即不是基於底層硬盤塊的備份,而是

基於sql語句進行的備份,原理是mysqldump命令可以將數據庫裏要備份的數據庫做查詢並將數

據庫的所有配置和表格的數據轉換爲sql語句,還原時則是重新將一個空庫中插入所備份的sql

語句,可能會出現丟失精度,這裏使用mysqldump命令做講解

mysqldump工具: 客戶端命令,通過mysql協議連接至mysql服務器進行備份

mysqldump參考: https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html

mysqldump常見選項:

-A, --all-databases 備份所有數據庫,含create database

-B, --databases db_name… 指定備份的數據庫,包括create database語句

-E, --events: 備份相關的所有event scheduler

-R, --routines: 備份所有存儲過程和自定義函數

--triggers: 備份表相關觸發器,默認啓用,用--skip-triggers, 不備份觸發器

--default-character-set=utf8 指定字符集

--master-data[=#]: 此選項須啓用二進制日誌

1:所備份的數據之前加一條記錄爲CHANGE MASTER TO語句,非註釋,不指定#,

默認爲1

2:記錄爲註釋的CHANGE MASTER TO語句 此選項會自動關閉--lock-tables功能

自動打開-x|--lock-all-tables功能(除非開啓--single-transaction)


-F, --flush-logs: 備份前滾動日誌,鎖定表完成後,執行flush logs命令,

生成新的二進制日誌文件,配合-A 或 -B 選項時,會導致刷新多次數據庫。

建議在同一時刻執行轉儲和日誌刷新,可通過和--single-transaction或-x,

--master-data 一起使用實現,此時只刷新一次日誌

--compact: 去掉註釋,適合調試,生產不使用

-d, --no-data 只備份表結構

-t, --no-create-info 只備份數據,不備份create table

-n,--no-create-db 不備份create database,可被-A或-B覆蓋

--flush-privileges 備份mysql或相關時需要使用

-f, --force 忽略SQL錯誤,繼續執行

--hex-blob 使用十六進制符號轉儲二進制列(例如,“abc”變爲0x616263)

受影響的數據類型包括BINARY, VARBINARY,BLOB,BIT

-q, --quick 不緩存查詢,直接輸出,加快備份速度


MyISAM備份選項:

支持溫備;不支持熱備,所以必須先鎖定要備份的庫,而後啓動備份操作

鎖定方法如下:

-x,--lock-all-tables:加全局讀鎖,鎖定所有庫的所有表,同時加

--single-transaction或--lock-tables選項會關閉此選項功能

注意:數據量大時,可能會導致長時間無法併發訪問數據庫

-l,--lock-tables:對於需要備份的每個數據庫,在啓動備份之前分別鎖定其所有表,

默認爲on,--skip-lock-tables選項可禁用,對備份MyISAM的多個庫,可能會造成

數據不一致

注:以上選項對InnoDB表一樣生效,實現溫備,但不推薦使用


InnoDB備份選項: 支持熱備,可用溫備但不建議用

--single-transaction

此選項Innodb中推薦使用,不適用MyISAM,

此選項會開始備份前,先執行START TRANSACTION指令開啓事務

此選項通過在單個事務中轉儲所有表來創建一致的快照。 

僅適用於存儲在支持多版本控制的存儲引擎中的表(目前只有InnoDB可以);

轉儲不保證與其他存儲引擎保持一致。 在進行單事務轉儲時,要確保有效的轉

儲文件(正確的表內容和二進制日誌位置),沒有其他連接應該使用以下語句:

ALTER TABLE,DROP TABLE,RENAME TABLE,TRUNCATE TABLE

此選項和--lock-tables(此選項隱含提交掛起的事務)選項是相互排斥

備份大型表時,建議將--single-transaction選項和--quick結合一起使用



InnoDB建議備份策略(下方爲一條命令)

mysqldump –uroot –A –F –E –R --single-transaction --master-data=1 

--flush-privileges --triggers --default-character-set=utf8 --hex-blob

> $BACKUP/fullbak_$BACKUP_TIME.sql


MyISAM建議備份策略(下方爲一條命令)

mysqldump –uroot –A –F –E –R –x --master-data=1 --flush-privileges 

--triggers --default-character-set=utf8 --hex-blob 

>$BACKUP/fullbak_$BACKUP_TIME.sql



mysqldump備份示例(建議還原時關閉bin_log日誌功能)

1. 先備份數據庫(下方爲一條命令)

mysqldump -A -E -R --master-data=2 --single-transaction -uroot

-pcentos  > all.sql

2. 模擬備份數據庫後新插入數據

這裏不寫具體命令了,自行創造,原理和上一個類似

3. 還原所備份的數據

還原第一步先要配置好一個mysql使變成運行狀態

因爲所備份的數據都是sql語句,直接執行命令導入即可

mysql -uroot -pcentos -e 'SET GLOBAL sql_log_gin=0'

mysql -uroot -pcentos < all.sql

4. 根據binlog日誌還原數據庫

因爲all.sql裏有寫備份時所備份的位置即從那個位置之後的binlog都添加至一個文件

即可實現不願

mysqlbinlog --start-position=245 mariadb.bin.log.000005 > rec.sql

mysqlbinlog --start-position=245 mariadb.bin.log.000006 >> rec.sql

mysql -uroot -pcentos < rec.sql

mysql -uroot -pcentos -e 'SET GLOBAL sql_log_gin=1'


總結

1.使用lvm快照備份恢復,即使有事務當時未提交,恢復時也不會丟失數據,原理是因爲事務

在未提交時只是在事務日誌裏有記錄,但並未寫入binlog日誌文件中,即未對錶做修改。

當做備份時,其實事務裏的內容由於未提交所以還原時其實是被丟棄了,但由於解鎖後

事務又提交了,即產生了二進制日誌,所以用二進制日誌即可將之前被丟棄的事務再次

恢復至最新的狀態

2.單臺機器雖然有備份但是還原需要時間會影響線上業務

3.mysqldump備份在一定基礎上可以接受跨版本還原數據庫(測試)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章