mysql 備份之邏輯備份mysqldump, mysqlbinlog, 全備及參數說明


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、測試可用性和完整性
55.1 方法一:直接使用臨時庫頂替原生產庫,前端應用割接到新庫
    5.2 方法二:將誤刪除的表導出,導入到原生產庫
6、開啟業務
處理結果:經過20分鍾的處理,最終業務恢復正常

參考原文:

https://www.jianshu.com/p/6fbdcb7695cb


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM