萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> MySQL/MariaDB數據備份與數據恢復完整

MySQL/MariaDB數據備份與數據恢復完整

   MariaDB數據庫管理系統是MySQL的一個分支,主要由開源社區在維護,采用GPL授權許可。開發這個分支的原因之一是:Oracle公司收購了MySQL後,有將MySQL閉源的潛在風險,因此社區采用分支的方式來避開這個風險。

  數據對我們來說再重要不過了,那我們如何做到對數據盡可能的安全呢,當我們的數據丟失了那又該怎麼做呢,所以說數據備份對我們的數據安全性來說太重要了。

  數據對我們來說再熟悉不過了,也最平常不過了,我們每天都在接觸各色各樣的數據,數據記錄了我們平常相關的業務信息,所以數據對於我們來說是很重要的, 這麼重要的數據如果我們的數據丟失了那我們是不是相關的業務都沒法進行了呢,這應該是個很麻煩的問題,那我們怎麼保護我們的數據的安全呢,這就要用到我們 的數據備份了。

  如何執行備份恢復:備份與恢復在工作環境中是重中之重,為什麼需要用到備份和恢復呢:

  1、一般是做災難恢復的,比如說自然災害等。

  2、可以做審計的,比如說某一數據在過去是什麼樣的。

  3、做測試的,比如說一個新的業務架構數據存儲方式是否扛得著業務的訪問

  備份的目的是用於恢復的,如果備份的數據用到時恢復不了數據怎麼辦,所以對備份數據做恢復測試是很有必要的。而且還要定期性的去做測試。

  備份類型:有很多種

  根據備份時,數據庫服務器是否在線:

  冷備份:cold backup,服務器要離線,意味著我們的讀寫操作都不可以進行了,這是最安全的備份方式,也是最不靠譜的方式。

  溫備份:warm backup,全局施加共享鎖,只可讀,不可寫的備份叫溫備份

  熱備份:hot backup,數據庫不離線,讀寫操作都可以進行

  InnoDB記錄數據時都會給數據一個序列號,所以在備份時基於MVCC(多版本並發控制)的機制自動加快照,每啟動一個事務都會創建當前集的一個快 照,而後基於MVCC的機制把每一個序列號都給它記錄一份下來,備份時只備份序列號或序列號之前的數據,往後發生的將不做備份,如果事務的隔離級別不是特 別高的話,它並不會影響事務的讀寫操作,而這樣備份出來的數據一定是時間點一致的數據,所以要完成熱備份,通常是基於事務的存儲引擎才能夠完成的。

  根據備份時的數據集進行分類:

  完全備份:full backup:指備份整個庫,當下數據集的整個庫的數據

  部分備份:partial backup:只備份某張表或某張表的一部份數據,有時備份單張表是有必要的。

  根據備份時的接口(直接備份數據文件還是通過mysql服務器導出數據)

  物理備份:直接復制(歸檔)數據文件的備份方式;跨平台能力沒有邏輯備份好,physucal backup。大數據集用這個比較好。

  邏輯備份:把數據庫中提出來保存為文本文件;通常使用的工具是mysqldump,logical backup,對於大容量數據不適用。恢復速度很慢,占據空間很大

  根據備份時是否備份整個數據還是僅備份變化的數據:

  完全備份:full backup,跟備份數據集中的完全備份概念是相同的,也是備份整個庫

  增量備份:incremental backup,上一次完全備份之後所改變的數據做備份的為增量備份,比如說周一做一次備份,周二做一次備份,周三又做一次,這樣一天天累加上去的叫增量備份。比較節約空間。

  差異備份:differential backup,比如說周一做一次備份,到周二了就把周一和周二這兩天的做一次備份,到周三就把周一周二周三的做一次備份,這就叫差異備份。比較容易恢復。

  備份策略:需要考慮到的問題

  1、選擇備份方式,選擇哪種方式根據我們的生產環境所需要來定;

  2、執行備份時間,選項一個訪問最少的時間做備份是比較合理的;

  3、考慮到恢復成本:恢復時長;

  4、備份成本:考慮到鎖時間、備份時長、備份負載;

  備份對象:我們備份需要備份什麼呢

  1、備份數據庫中的數據是最重要的;

  2、MySQL的配置文件,這個也是我們備份的對象

  3、MySQL的代碼也是需要備份的:存儲過程,存儲函數,觸發器

  4、OS相關的配置文件,如crontab配置計劃及相關的腳本

  5、如果是在主從復制的場景中,跟復制相關的信息也要備份

  6、為了保證數據足夠可靠,二進制日志文件也需要備份

  常用的備份工具:

  mysqldump:邏輯備份工具,是單線程備份工具,所以在某個服務器上做備份時它只能啟動一個CPU啟動一個線程進行備份,性能比較差。

  對InnoDB熱備、對MyISAM只能做到溫備、對Aria溫備,備份和恢復過程較慢;

  mysqldumper:多線程的mysqldump,對多個庫或多張表可以同時進行,提高性能;

  mysqldump、mysqldumper,這兩個都是邏輯備份工具,通常情況也很難實現差異或增量備份,只能做完全備份,但可以做部分備份,比如只備份一張表是可以實現的;

  基於冷備份時:cp, 要基於lvm-snapshot邏輯卷快照進行備份的,接近於熱備工具,因為要先請求全局鎖,而後創建快照,並在創建快照完成後釋放全局鎖;而後使用 cp、tar等工具進行物理備份(因為復制的源數據文件),所以備份和恢復數據速度較快,缺點很難實現增量備份,並且請求全局鎖需要等待一段時間,在繁忙 的服務器上尤其如此。

  SELECT clause INTO OUTFILE ‘/path/to/somefile’;把挑選出來的子句保存到某一個文件中,是個部分備份工具,不會備份關系定義,僅備份表中的數據,但這也是個邏輯 備份工具,在速度上也快於mysqldump,也沒法實現增量備份。

  LOAD ADTA INFILE ‘/path/from/somefile’;表示從哪裡讀數據來恢復的;

  Innobase:提供了商業備份工具為Innobackup,可以實現InnoDB的熱備支持增量備份;但是對於MyISAM不支持增量備份,只能實現完全備份,屬於物理備份,速度比較快。

  Xtrabackup:由Percona組織提供的開源備份工具,物理備份,速度快;

  Mysqlhostcopy:幾乎冷備,吹牛工具,不適用;

  mysqldump:常用的備份工具,也是個邏輯備份工具,用於小數據備份,一般都是在5G以下的小數據進行備份;可以使用文本進行二次處理;相當於MySQL的客戶端工具

  使用格式:mysqldump [options] [db_name [tbl_name ...]]

  備份單個庫時用這個工具:mysqldump[option] db_name

  恢復時,如果目標庫不存在,需要事先手動創建

  --all-databases:備份所有的數據庫--databases db1 db2:備份指定的多個數據庫,用空格隔開--lock-all-tables:請求鎖定所有表之後再備份,一般只對MyISAM做溫備,不過也可以對InnoDB和Aria做溫備。--events:備份事件調度器代碼--routines:備份存儲過程和存儲函數--triggers:備份觸發器--flush-logs:備份前、請求到鎖以後滾動日志,備份時滾動日志,手動滾動就要手動施加鎖--master-data=[0|1|2]復制時的同步位置標記,0表示不記錄,1記錄carnge master語句,2記錄為注釋為change master語句--single-transaction:能夠對InnoDB存儲引擎實現熱備份,啟動一個單一的大事物,基於MVCC(多版本並發控制)實現對InnoDB存儲引擎的熱備,它會自動加鎖的,不要跟--lock-all-tables同時使用;

  # mysqldump --databases hellodb --lock-all-tables > /tmp/hellodb.sql :備份數據庫,並且請求表鎖,這裡備份的所有寫操作都會被阻塞,這種方式也不太理想。

  # mysqldump --databases hellodb --lock-all-tables --flush-logs > /tmp/hellodb.sql

  # mysqldump --databases hellodb --single-transaction --flush-logs > /tmp/hellodb.sql:保證這個庫下所有的表的存儲引擎都是InnoDB的前提下使用--single-transaction進行熱備。

  分時間段查看二進制日志後重定向到某個文件中去:

  # mysqlbinlog --start-porition=367 --stop-position=669 master-bin.000005 > /tmp/hellodb.inc.sql

  定義一個開始點和一個結束點就可以把二進制文件重定向到某個文件中再進行恢復了;

  使用mysqldump備份時:

  請求鎖:--lock-all-tables使用--single-transaction進行innodb熱備;

  滾動日志:--flush-logs

  選定要備份的庫:--databases

  指定二進制日志文件及位置:--master-data=2

  注意:備份前需要加鎖,恢復時,建議關閉二進制日志,關閉其它用戶連接

  備份策略:mysqldump+二進制日志文件:

  恢復:完全備份+各二進制日志文件中至此刻的事件,恢復過程發生的事件沒必要也寫到二進制日志文件中去;所以在恢復時要臨時性的關閉二進制日志文件:

  MariaDB [(hellodb)] > set session sql_log_bin=0:臨時關閉二進制日志文件

  MariaDB [(hellodb)] > source /tmp/hellodb.sql;在數據庫命令行直接讀取備份文件

  對MySQL配置文件,以及與MySQL相關的OS配置文件在每次修改後都應該直接進行備份

  lvm-snapshot:基於LVM快照的備份

  1、基於快照做備份有個提前,事物日志跟數據文件必須在同一個卷上;

  2、創建快照卷之前,要請求MySQL的全局鎖,在快照創建完成之後釋放鎖;

  3、請求全局鎖完成這後做一次日志滾動;做標記,時間記錄,做二進制日志文件及位置標記(需要手動進行);

  注意:

  1、將數據和備份放在不同的磁盤設備上,異機或異地的備份存儲為理想;

  2、備份的數據應該周期性的進行還原測試;

copyright © 萬盛學電腦網 all rights reserved