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備份在一定基礎上可以接受跨版本還原數據庫(測試)
轉載于:https://blog.51cto.com/winthcloud/2300068
總結
以上是生活随笔為你收集整理的Linux 第71天 mariadb backup and recovery的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redhat6.5 yum regist
- 下一篇: Spotify开源其Cassandra编