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備份在一定基礎上可以接受跨版本還原數據庫(測試)