1. 程式人生 > >mysql的備份與恢復詳解

mysql的備份與恢復詳解

一、為什麼要備份

在日常運維工作中,對於mysql資料庫的備份是至關重要的!資料庫對於網站的重要性使得我們對mysql資料的管理不容有失!
然後,是人總難免會犯錯誤,說不定哪天大腦短路了來個誤操作把資料庫給刪除了,怎麼辦???
再者,領導需要檢視過去某一天的資料,怎麼辦?
所以我們備份的重要性,不言而喻

二、備份的方式和型別選擇

(1)根據資料庫狀態劃分
       1)冷備(cold backup): 伺服器離線,讀寫操作都不能進行 ,相當於要停止mysql服務

                最簡單的備份方式就是,關閉MySQL伺服器,然後將data目錄下面的所有檔案進行拷貝儲存,需要恢復時,則將目錄拷貝到需要恢復的機器即可。這種方式確實方便,但是在生產環境中基本沒什麼作用
       2)溫備: 全域性加鎖,資料庫的讀可以執行,但是不能寫;
       3)熱備(hot backup):資料庫線上,讀寫照樣進行 ,讀寫操作均不受影響

(2)根據備份方式
     1)物理備份(physical backup):直接複製資料檔案 ,打包歸檔

                特點: 
                不需要額外工具,直接通過cp,tar等直接打包複製資料庫的資料檔案達到備份的效果 ,但是跨平臺能力比較差;如果資料量超過幾十個G,則適用於物理備份
    2)邏輯備份(logical backup):通過特定工具從資料庫中匯出資料並另存備份把資料抽取出來儲存在sql指令碼中
                特點: 
                可以使用文字編輯器編輯;匯入方便,直接讀取sql語句即可;邏輯備份恢復時間慢,佔據空間大;無法保證浮點數的精度;恢復完資料庫後需要重建索引。

 (3)根據備份整個資料還是變化資料 
       1) 全量備份 full backup
       2) 增量備份 incremental backup 
            在不同時間點起始備份一段資料,比較節約空間;針對的是上一次備份後有變化的資料,備份資料少,備份快,恢復慢
       3) 差異備份 differential backup 
            備份從每個時間點到上一次全部備份之間的資料,隨著時間增多二增多;比較容易恢復;對於很大的資料庫,可以考慮主從模型,備份從伺服器的內容。針對的是上一次全量備份後有變化的資料,備份資料多,備份慢,恢復快。

 (4) Mysql常用的備份工具和選擇

        1)cp, tar 等歸檔複製工具: 物理備份工具, 適用於所有的儲存引擎, 冷備、完全備份、部分備份

             適用場景:資料量很小,比如個人部落格,在生產環境中基本沒什麼作用

        2)mysqldump: 邏輯備份工具, 適用於所有的儲存引擎, 支援溫備、完全備份、部分備份、對於InnoDB儲存引擎支援熱備       

             innodb: 熱備,溫備
             MyISAM, Aria: 溫備 
             單執行緒備份恢復比較慢

             適用場景:資料量還行,比如咱們公司的資料,20G左右,可以先使用mysqldump對資料庫進行完全備份, 然後定期備份binlog達到增量備份的效果

        3)lvm-snapshot:

             接近於熱備的工具:因為要先請求全域性鎖,而後建立快照,並在建立快照完成後釋放全域性鎖;
             使用cp、tar等工具進行物理備份;
             備份和恢復速度較快;
             很難實現增量備份,並且請求全域性需要等待一段時間,在繁忙的伺服器上尤其如此;

              適用場景:如果資料量一般, 而又不過分影響業務執行, 可以使用lvm2的快照對資料檔案進行備份, 而後定期備份binlog達到增量備份的效果

       4)Xtrabackup(通常用innobackupex工具,由percona提供):
               備份mysql大資料
               InnoDB熱備,增量備份;
               MyISAM溫備,不支援增量,只有完全備份 
               屬於物理備份,速度快;

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

mysqldump工具基本使用

1. mysqldump [OPTIONS] database [tables…]
還原時庫必須存在,不存在需要手動建立
    --all-databases: 備份所有庫 
    --databases db1 db2 ...: 備份指定的多個庫,如果使用此命令,恢復時將不用手動建立庫。或者是-B db1 db2 db3 ....
    --lock-all-tables:請求鎖定所有表之後再備份,對MyISAM、InnoDB、Aria做溫備
    --lock-table: 對正在備份的表加鎖,但是不建議使用,如果其它表被修改,則備份後表與表之間將不同步
    --single-transaction: 能夠對InnoDB儲存引擎實現熱備;
啟動一個很大的大事物,基於MOCC可以保證在事物內的表版本一致
自動加鎖不需要,再加--lock-table, 可以實現熱備
備份程式碼:
   --events: 備份事件排程器程式碼
   --routines: 備份儲存過程和儲存函式
   --triggers:備份觸發器
備份時滾動日誌:
   --flush-logs: 備份前、請求到鎖之後滾動日誌;
方恢復備份時間點以後的內容
複製時的同步位置標記:主從架構中的,主伺服器資料。效果相當於標記一個時間點。
   --master-data=[0|1|2]
   0: 不記錄
   1:記錄為CHANGE MASTER語句
   2:記錄為註釋的CHANGE MASTER語句

2. 使用mysqldump備份大體過程:
1) 請求鎖:--lock-all-tables或使用–singe-transaction進行innodb熱備;
2) 滾動日誌:--flush-logs
3) 選定要備份的庫:--databases
4) 記錄二進位制日誌檔案及位置:--master-data=
FLUSH TABLES5 WITH READ LOCK;

3. 恢復:
恢復過程無需寫到二進位制日誌中 
建議:關閉二進位制日誌,關閉其它使用者連線;

4. 備份策略:基於mysqldump
備份:mysqldump+二進位制日誌檔案;(“mysqldump >”)
週日做一次完全備份:備份的同時滾動日誌
週一至週六:備份二進位制日誌;

我們公司是在mysql從伺服器上,每天凌晨對在用的資料庫進行備份,傳輸到內網,線上保留最近7天的,內網儲存所有的資料

不定期進行全庫備份和二進位制日誌的備份傳輸
恢復:(“mysql < ”)或在mysql資料庫中直接執行“source sql備份檔案;”進行恢復。如果sql執行語句比較多,可以將sql語句放在一個檔案內,將檔名命名為.sql結尾,然後在mysql資料庫中使用"source 檔案.sql;"命令進行執行即可!
完全備份+各二進位制日誌檔案中至此刻的事件

5.例項說明