2. 備份類型
2.1 熱備
在數據庫正常業務時,備份數據,並且能夠一致性恢復(只能是innodb)
對業務影響非常小
熱備會備份備份開始前及備份過程中產生的新數據。
2.2 溫備
鎖表備份,只能查詢不能修改(myisam)
影響到寫入操作
2.3 冷備
關閉數據庫業務,數據庫沒有任何變更的情況下,進行備份數據.
業務停止
3. 備份方式及工具介紹
3.1 邏輯備份工具
基於SQL語句進行備份 mysqldump ***** mysqlbinlog *****
3.2 物理備份工具
基於磁盤數據文件備份 xtrabackup(XBK) :percona 第三方 ***** MySQL Enterprise Backup(MEB)
4. 邏輯備份和物理備份的比較
4.1 mysqldump (MDP)
優點: 1.不需要下載安裝 2.備份出來的是SQL,文本格式,可讀性高,便於備份處理 3.壓縮比較高,節省備份的磁盤空間 缺點: 4.依賴於數據庫引擎,需要從磁盤把數據讀出 然后轉換成SQL進行轉儲,比較耗費資源,數據量大的話效率較低 建議: 100G以內的數據量級,可以使用mysqldump 超過TB以上,我們也可能選擇的是mysqldump,配合分布式的系統 1EB =1024 PB =1000000 TB
4.2 xtrabackup(XBK)
優點: 1.類似於直接cp數據文件,不需要管邏輯結構,相對來說性能較高 缺點: 2.可讀性差 3.壓縮比低,需要更多磁盤空間 建議: >100G<TB
5.備份策略
備份方式: 全備:全庫備份,備份所有數據 增量:備份變化的數據 邏輯備份=mysqldump+mysqlbinlog 物理備份=xtrabackup_full+xtrabackup_incr+binlog或者xtrabackup_full+binlog 備份周期: 根據數據量設計備份周期 比如:周日全備,周1-周6增量
6.備份工具使用-mysqldump
6.1 mysqldump (邏輯備份的客戶端工具)
6.1.1 客戶端通用參數
-u -p -S -h -P 本地備份: mysqldump -uroot -p -S /tmp/mysql.sock 遠程備份: mysqldump -uroot -p -h 10.0.0.51 -P3306
6.1.2 備份專用基本參數
-A 全備參數
例子1: [root@db01 ~]# mkdir -p /data/backup mysqldump -uroot -p -A >/data/backup/full.sql Enter password: mysqldump: [Warning] Using a password on the command line interface can be insecure. Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don't want to restore GTIDs, pass --set-gtid-purged=OFF. To make a complete dump, pass --all-databases --triggers --routines --events. # 補充: # 1.常規備份時要加 --set-gtid-purged=OFF,解決備份時的警告 # [root@db01 ~]# mysqldump -uroot -p123 -A --set-gtid-purged=OFF >/backup/full.sql # 2.構建主從時,做的備份,不需要加這個參數 # [root@db01 ~]# mysqldump -uroot -p123 -A --set-gtid-purged=ON >/backup/full.sql
# -A表示全備
-B db1 db2 db3 備份多個單庫
說明:生產中需要備份,生產相關的庫和MySQL庫 例子2 : mysqldump -B db1 db2 --set-gtid-purged=OFF >/data/backup/b.sql
備份單個或多個表
例子3 world數據庫下的city,country表 mysqldump -uroot -p world city country >/backup/bak1.sql 以上備份恢復時:必須庫事先存在,並且ues才能source恢復
6.1.3 高級參數應用
特殊參數1使用(必須要加)
-R 備份存儲過程及函數 --triggers 備份觸發器 -E 備份事件 例子4: [root@db01 backup]# mysqldump -uroot -p -A -R -E --triggers >/data/backup/full.sql (5) 特殊參數2使用
-F 在備份開始時,刷新一個新binlog日志
例子5:
mysqldump -uroot -p -A -R --triggers -F >/bak/full.sql
-master-data=2
以注釋的形式,保存備份開始時間點的binlog的狀態信息(記錄position開始號和gtid的所有號)
不論是何種引擎, 都會鎖表,除非配合--single-transaction參數使用。 mysqldump -uroot -p -A -R --triggers --master-data=2 >/back/world.sql [root@db01 ~]# grep 'CHANGE' /backup/world.sql -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000035', MASTER_LOG_POS=194; 功能: (1)在備份時,會自動記錄,二進制日志文件名和位置號 0 默認值 1 以change master to命令形式,可以用作主從復制 2 以注釋的形式記錄,備份時刻的文件名+postion號 (2)自動鎖表
不使用--single-transaction時,實現的是溫備,何種引擎都會鎖表 配合--single-transaction,只對非InnoDB表進行鎖表備份,InnoDB表進行“熱“”備(實際上是實現快照備份),非真正熱備,只備份備份開始時刻數據, 備份過程中產生的新數據不會備份
使用該參數后記錄有備份開始時刻的position,配合mysqlbinlog恢復數據時,我們需要找出備份開始到數據庫異常時刻的所有binlog信息,然后配合全備即可恢復所有
此時我們即可從全備文件中找到記錄的position號,從該號開始到異常時刻的所有binlog就都可以提出來了,--start-position=這里記錄的position號
截取二進制文件參考:https://www.cnblogs.com/quzq/p/12866410.html
--single-transaction
innodb 存儲引擎開啟熱備(快照備份)功能 master-data可以自動加鎖 (1)在不加--single-transaction ,啟動所有表的溫備份,所有表都鎖定 (1)加上--single-transaction ,對innodb進行快照備份,對非innodb表可以實現自動鎖表功能 例子6: 備份必加參數 mysqldump -uroot -p -A -R -E --triggers --master-data=2 --single-transaction --set-gtid-purged=OFF >/data/backup/full.sql
-A 全備
-R 備份過程和函數
-E 備份事件
--triggers 備份觸發器
--master-data=2記錄備份開始時間節點
--single-transaction配合master-data參數區分存儲引擎做快照備份或溫備
--set-gtid-purged=auto
該參數取值默認是auto;
如果開啟了gtid功能,auto時,備份出的備份文件中會記錄gtid信息。off時,備份出的文件不帶gtid信息
使用帶有gtid的備份恢復后數據庫也會有gtid號,不帶是不會有gtid記錄。
取值使用場景: 1. --set-gtid-purged=OFF,可以使用在日常備份參數中. mysqldump -uroot -p -A -R -E --triggers --master-data=2 --single-transaction --set-gtid-purged=OFF >/data/backup/full.sql
2. auto或on:在構建主從復制環境時需要的參數配置 mysqldump -uroot -p -A -R -E --triggers --master-data=2 --single-transaction --set-gtid-purged=ON >/data/backup/full.sql
--max-allowed-packet=#
用於控制備份時傳輸數據包的大小
mysqldump -uroot -p -A -R -E --triggers --master-data=2 --single-transaction --set-gtid-purged=OFF --max-allowed-packet=256M >/data/backup/full.sql --max-allowed-packet=# The maximum packet length to send to or receive from server.
6.2 小練習:
6.2.1. 實現所有表的單獨備份
提示: information_schema.tables mysqldump -uroot -p123 world city >/backup/world_city.sql select concat("mysqldump -uroot -p123 ",table_schema," ",table_name," --master-data=2 --single-transaction --set-gtid-purged=0 -R -E --triggers>/backup/",table_schema,"_",table_name,".sql") from information_schema.tables where table_schema not in ('sys','information_schema','performance_schema');
6.2.2.模擬故障案例並恢復
(1)每天全備 (2)binlog日志是完整 (3)模擬白天的數據變化 (4)模擬下午兩點誤刪除數據庫 需求: 利用全備+binlog回復數據庫誤刪除之前。 故障模擬及恢復: 1. 模擬周一23:00的全備 mysqldump -uroot -p -A -R -E --triggers --master-data=2 --single-transaction --set-gtid-purged=OFF >/data/backup/full.sql 2. 模擬白天的數據變化 Master [(none)]>create database day1 charset utf8; Master [(none)]>use day1 Master [day1]>create table t1(id int); Master [day1]>insert into t1 values(1),(2),(3); Master [day1]>commit; Master [world]>update city set countrycode='CHN'; Master [world]>commit; 模擬磁盤損壞: [root@db01 data]# \rm -rf /data/mysql/data/* 3. 恢復故障 [root@db01 data]# pkill mysqld [root@db01 data]# \rm -rf /data/mysql/data/* 4. 恢復思路 1.檢查備份可用性 2.從備份中獲取二進制日志位置 3.根據日志位置截取需要的二進制日志 4.初始化數據庫,並啟動 5.恢復全備 6.恢復二進制日志
6.3. 壓縮備份並添加時間戳
例子: mysqldump -uroot -p123 -A -R --triggers --master-data=2 --single-transaction|gzip > /backup/full_$(date +%F).sql.gz mysqldump -uroot -p123 -A -R --triggers --master-data=2 --single-transaction|gzip > /backup/full_$(date +%F-%T).sql.gz mysqldump備份的恢復方式(在生產中恢復要謹慎,恢復會刪除重復的表) set sql_log_bin=0; source /backup/full_2018-06-28.sql 注意: 1、mysqldump在備份和恢復時都需要mysql實例啟動為前提。 2、一般數據量級100G以內,大約15-45分鍾可以恢復,數據量級很大很大的時候(PB、EB) 3、mysqldump是覆蓋形式恢復的方法。 一般我們認為,在同數據量級,物理備份要比邏輯備份速度快. 邏輯備份的優勢: 1、可讀性強 2、壓縮比很高
7、故障恢復思路
1、停業務,避免數據的二次傷害 2、找一個臨時庫,恢復周三23:00全備 3、截取周二23:00 --- 周三10點誤刪除之間的binlog,恢復到臨時庫 4、測試可用性和完整性 5、 5.1 方法一:直接使用臨時庫頂替原生產庫,前端應用割接到新庫 5.2 方法二:將誤刪除的表導出,導入到原生產庫 6、開啟業務 處理結果:經過20分鍾的處理,最終業務恢復正常
參考原文: