1. 程式人生 > >mysql的備份及恢復

mysql的備份及恢復

前言:

       我們試著想一想, 在生產環境中什麼最重要?如果我們伺服器的硬體壞了可以維修或者換新, 軟體問題可以修復或重新安裝, 但是如果資料沒了呢?這可能是最恐怖的事情了吧, 我感覺在生產環境中應該沒有什麼比資料跟更為重要. 那麼我們該如何保證資料不丟失、或者丟失後可以快速恢復呢?

為什麼需要備份資料?

其實在前言中也大概說明了為什麼要備份資料, 但是我們還是應該具體瞭解一下為什麼要備份資料

在生產環境中我們資料庫可能會遭遇各種各樣的不測從而導致資料丟失, 大概分為以下幾種.

  • 硬體故障
  • 軟體故障

自然災害

  • 黑客攻擊
  • 誤操作 (佔比最大)

所以, 為了在資料丟失之後能夠恢復資料, 我們就需要定期的備份資料, 備份資料的策略要根據不同的應用場景進行定製, 大致有幾個參考數值, 我們可以根據這些數值從而定製符合特定環境中的資料備份策略

  • 能夠容忍丟失多少資料
  • 恢復資料需要多長時間
  • 需要恢復哪一些資料

資料的備份型別

資料的備份型別根據其自身的特性主要分為以下幾組

完全備份

  • 部分備份

    完全備份指的是備份整個資料集( 即整個資料庫 )、部分備份指的是備份部分資料集(例如: 只備份一個表)

而部分備份又分為以下兩種

增量備份

  • 差異備份

    增量備份指的是備份自上一次備份以來(增量或完全)以來變化的資料; 特點: 節約空間、還原麻煩
    差異備份指的是備份自上一次完全備份以來變化的資料 特點: 浪費空間、還原比增量備份簡單

備份需要考慮的問題

定製備份策略前, 我們還需要考慮一些問題

我們要備份什麼?

一般情況下, 我們需要備份的資料分為以下幾種

資料

  • 二進位制日誌, InnoDB事務日誌
  • 程式碼(儲存過程、儲存函式、觸發器、事件排程器)
  • 伺服器配置檔案

備份工具

這裡我們列舉出常用的幾種備份工具
mysqldump : 邏輯備份工具, 適用於所有的儲存引擎, 支援溫備、完全備份、部分備份、對於InnoDB

儲存引擎支援熱備
cp, tar 等歸檔複製工具: 物理備份工具, 適用於所有的儲存引擎, 冷備、完全備份、部分備份
lvm2 snapshot: 幾乎熱備, 藉助檔案系統管理工具進行備份
xtrabackup: 一款非常強大的InnoDB/XtraDB熱備工具, 支援完全備份、增量備份, 由percona提供

以上的幾種解決方案分別針對於不同的場景

1:如果資料量較小, 可以使用第一種方式, 直接複製資料庫檔案:

2:如果資料量還行, 可以使用第二種方式, 先使用mysqldump對資料庫進行完全備份, 然後定期備份BINARY LOG達到增量備份的效果

3:如果資料量一般, 而又不過分影響業務執行, 可以使用第三種方式, 使用lvm2的快照對資料檔案進行備份, 而後定期備份BINARY LOG達到增量備份的效果:

4:如果資料量很大, 而又不過分影響業務執行, 可以使用第四種方式, 使用xtrabackup進行完全備份後, 定期使用xtrabackup進行增量備份或差異備份

這裡主要介紹兩種備份:

1:使用mysqldump實現部分資料誤刪除的恢復

具體為:有hellodb資料庫,在生產中,A員工對students表進行新增學生one,B員工誤操作把students表給刪除了,C員工再對teachers表進行新增老師two。我們要做的就是將B員工的誤操作給撤回。

首先對資料庫進行整體備份。

[[email protected] ~]# mysqldump -A -F --single-transaction --master-data=2 > /mysql/backup/fullbak_$(date +%F_%T).sql
#-A --all-databases 備份所有資料庫,含create database
#--master-date[=value]         
 1: 記錄為CHANGE MASTER TO 語句、語句不被註釋        
 2: 記錄為註釋的CHANGE MASTER TO語句       
  基於二進位制還原只能全庫還原
# -F, --flush-logs :備份前滾動日誌,鎖定表完成後,執行flush logs命令,生成新的
二進位制日誌檔案,配合-A 或 -B 選項時,會導致重新整理多次資料庫。建議在同一時刻
執行轉儲和日誌重新整理,可通過和--single-transaction或-x,--master-data 一起使
用實現,此時只重新整理一次日誌
[[email protected] ~]# ls /mysql/backup/fullbak_2018-10-10_17\:25\:40.sql 
/mysql/backup/fullbak_2018-10-10_17:25:40.sql

2:產生新資料

MariaDB [hellodb]> insert into students values (26,'one',15,'F',null,null);
MariaDB [hellodb]> drop table students;
MariaDB [hellodb]> insert into teachers values (5,'two',18,'M');

3.恢復
 

檢視/mysql/backup/fullbak_2018-10-10_17\:25\:40.sql 獲取二進位制檔案資訊

裡面註釋行有二進位制檔案起始恢復位置
--
-- Position to start replication or point-in-time recovery from
--

-- CHANGE MASTER TO MASTER_LOG_FILE='bin.000006', MASTER_LOG_POS=245;

[[email protected] ~]# mysql < fullbak_2018-10-10_17\:25\:40.sql #恢復原始資料庫
[[email protected] ~]# mysqlbinlog --start-position=245 mysql-bin.000014 > bin.sql
編輯bin.sql,將其中錯誤的操作註釋或刪除,如
#DROP TABLE `students` /* generated by server */
儲存退出後,匯入bin.sql
[[email protected] ~]#mysql < bin.sql 

檢視資料庫,發現students資料庫已找回

2:使用xtrabackup進行增量備份及還原

xtrabackup介紹

Xtrabackup是由percona提供的mysql資料庫備份工具,據官方介紹,這也是世界上惟一一款開源的能夠對innodb和xtradb資料庫進行熱備的工具。特點:

  1. 備份過程快速、可靠;
  2. 備份過程不會打斷正在執行的事務;
  3. 能夠基於壓縮等功能節約磁碟空間和流量;
  4. 自動實現備份檢驗;
  5. 還原速度快;

一般情況, 備份完成後, 資料不能用於恢復操作, 因為備份的資料中可能會包含尚未提交的事務或已經提交但尚未同步至資料檔案中的事務。因此, 此時的資料檔案仍不一致, 所以我們需要”準備”一個完全備份

1,備份

[[email protected] ~]#  mkdir /mysql/backup/{full,inc{1,2}} #建立備份目錄

先實現全備

 

[[email protected] ~]#  innobackupex /mysql/backup/full

產生第一次的新資料

MariaDB [hellodb]> insert into students values (27,'wang',15,'F',null,null);

第一次增量

[[email protected] ~]#   innobackupex --incremental /mysql/backup/inc1 --incremental-basedir=/mysql/backup/full/2018-10-12_11-14-47/

產生第二次的新資料

MariaDB [hellodb]> insert into students values (28,'zhao ',15,'F',null,null);
[[email protected] ~]#  innobackupex --incremental /mysql/backup/inc2 --incremental-basedir=/mysql/backup/inc1/2018-10-12_11-16-04/

增量備份完成,備份後再產生一次新資料

MariaDB [hellodb]> insert into students values (29,'li ',15,'F',null,null);

2.破壞

[[email protected] ~]#  systemctl stop mariadb.service
[[email protected] ~]#  rm /mysql/data/* -rf

3:恢復

1,備完成備份

[[email protected] ~]#  innobackupex --apply-log --redo-only /backup/full/2018-10-12_11-14-47/
#此選項--apply-log-only阻止回滾未提完成的事務

2,第1次增量備份到完全備份

[[email protected] ~]#  innobackupex --apply-log --redo-only /backup/full/2018-10-12_11-14-47/ --incremental-dir=/backup/inc1/2018-10-12_11-16-04/

3,第2次增量備份到完全備份:最後一次還原不需要加選項--apply-log-only

[[email protected] ~]#  innobackupex --apply-log  /backup/full/2018-10-12_11-14-47/ --incremental-dir=/backup/inc2/2018-10-12_11-17-00/

4,到資料庫目錄,注意資料庫目錄必須為空,MySQL服務不能啟動

[[email protected] ~]#  innobackupex --copy-back /backup/full/2018-10-12_11-14-47/

5,還原屬性

[[email protected] ~]#  chown -R mysql.mysql /mysql/data

 6,啟動服務

[[email protected] ~]# systemctl restart mariadb.service

4.通過二進位制日誌恢復 recovery
先讀取最後一次增量備份目錄下的xtrabackup_binlog_info,獲取需要恢復的二進位制日誌的起始位置

[[email protected] ~]#  mysqlbinlog --start-position=8057 /mysql/logbin/mysql-bin.000003 > /root/bin.sql
[[email protected] ~]#  mysql < /root/bin.sql

完成。