1. 程式人生 > >[轉載]mysql備份與恢復

[轉載]mysql備份與恢復

5.9. 備份與恢復
5.9.1. 資料庫備份
5.9.2. 示例用備份與恢復策略
5.9.3. 自動恢復
5.9.4. 表維護和崩潰恢復
5.9.5. myisamchk:MyISAM表維護實用工具
5.9.6. 建立表維護計劃
5.9.7. 獲取關於表的資訊
本節討論如何進行資料庫備份(完全備份和增量備份),以及如何執行表的維護。本節描述的SQL語句語法參見第5章:資料庫管理。此處提供的大多數資訊主要適合MyISAM表。InnoDB備份程式參見15.2.8節,“InnoDB資料庫的備份和恢復”。

5.9.1. 資料庫備份
因為MySQL表儲存為檔案方式,很容易備份。要想保持備份的一致性,對相關表執行LOCK TABLES操作,然後對錶執行FLUSH TABLES。參見13.4.5節,“LOCK TABLES和UNLOCK TABLES語法”和13.5.5.2節,“FLUSH語法”。你只需要讀鎖定;這樣當你複製資料庫目錄中的檔案時,允許其它客戶繼續查詢表。需要FLUSH TABLES語句來確保開始備份前將所有啟用的索引頁寫入硬碟。



如果你想要進行SQL級別的表備份,你可以使用SELECT INTO ...OUTFILE或BACKUP TABLE。對於SELECT INTO ...OUTFILE, 輸出的檔案不能先存在。對於BACKUP TABLE也如此,因為覆蓋完整的檔案會有安全風險。參見13.2.7節,“SELECT語法”和13.5.2.2節,“BACKUP TABLE語法”。

備份資料庫的另一個技術是使用mysqldump程式或mysqlhotcopy指令碼。參見8.8節,“mysqldump:資料庫備份程式”和8.9節,“mysqlhotcopy:資料庫備份程式”。

1. 完全備份資料庫:

2. shell> mysqldump --tab=/path/to/some/dir --opt db_name

或:

shell> mysqlhotcopy db_name /path/to/some/dir
只要伺服器不再進行更新,還可以只複製所有表文件(*.frm、*.MYD和*.MYI檔案)。mysqlhotcopy指令碼使用該方法。(但請注意如果資料庫包含InnoDB表,這些方法不工作。InnoDB不將表的內容儲存到資料庫目錄中,mysqlhotcopy只適合MyISAM表)。 

3. 如果mysqld在執行則停止,然後用--log-bin[=file_name]選項來啟動。參見5.11.3節,“二進位制日誌”。二進位制日誌檔案中提供了 執行mysqldump之後對資料庫的更改進行復制所需要的資訊。

對於InnoDB表,可以進行線上備份,不需要對錶進行鎖定;參見8.8節,“mysqldump:資料庫備份程式”。


MySQL支援增量備份:需要用--log-bin選項來啟動伺服器以便啟用二進位制日誌;參見5.11.3節,“二進位制日誌”。當想要進行增量備份時(包含上一次完全備份或增量備份之後的所有更改),應使用FLUSH LOGS回滾二進位制日誌。然後,你需要將從最後的完全或增量備份的某個時刻到最後某個點的所有二進位制日誌複製到備份位置。這些二進位制日誌為增量備份;恢復時,按照下面的解釋應用。下次進行完全備份時,還應使用FLUSH LOGS或mysqlhotcopy --flushlogs回滾二進位制日誌。參見8.8節,“mysqldump:資料庫備份程式”和8.9節,“mysqlhotcopy:資料庫備份程式”。

如果MySQL伺服器為從複製伺服器,則無論選擇什麼備份方法,當備份從機資料時,還應備份master.info和relay-log.info檔案。恢復了從機資料後,需要這些檔案來繼續複製。如果從機執行復制LOAD DATA INFILE命令,你應還備份用--slave-load-tmpdir選項指定的目錄中的SQL_LOAD-*檔案。(如果未指定,該位置預設為tmpdir變數值)。從機需要這些檔案來繼續複製中斷的LOAD DATA INFILE操作。

如果必須恢復MyISAM表,先使用REPAIR TABLE或myisamchk -r來恢復。99.9%的情況下該方法可以工作。如果myisamchk失敗,試試下面的方法。請注意只有用--log-bin選項啟動了MySQL從而啟用二進位制日誌它才工作;參見5.11.3節,“二進位制日誌”。

1. 恢復原mysqldump備份,或二進位制備份。

2. 執行下面的命令重新更新二進位制日誌:

3. shell> mysqlbinlog hostname-bin.[0-9]* | mysql
在某些情況下,你可能只想要從某個位置重新執行某些二進位制日誌。(通常你想要從恢復備份的日期重新執行所有二進位制日誌,查詢不正確時例外)。關於mysqlbinlog工具和如何使用它的詳細資訊參見8.6節,“mysqlbinlog:用於處理二進位制日誌檔案的實用工具”。

還可以對具體檔案進行選擇備份:

· 要想複製表,使用SELECT * INTO OUTFILE 'file_name' FROM tbl_name。

· 要想過載表,使用LOAD DATA INFILE 'file_name' REPLACE ...並恢復。要避免複製記錄,表必須有PRIMARY KEY或一個UNIQUE索引。當新記錄複製唯一鍵值的舊記錄時,REPLACE關鍵字可以將舊記錄替換為新記錄。

如果備份時遇到伺服器效能問題,可以有幫助的一個策略是在從伺服器而不是主伺服器上建立複製並執行備份。參見6.1節,“複製介紹”。

如果使用Veritas檔案系統,可以這樣備份:

1. 從客戶端程式執行FLUSH TABLES WITH READ LOCK。

2. 從另一個shell執行mount vxfs snapshot。

3. 從第一個客戶端執行UNLOCK TABLES。

4. 從快照複製檔案。

5. 解除安裝快照。

5.9.2. 示例用備份與恢復策略
5.9.2.1. 備份策略
5.9.2.2. 為恢復進行備份
5.9.2.3. 備份策略摘要
本節討論進行備份的程式,在出現崩潰後,可以恢復資料:
· 作業系統崩潰 

· 電源故障 

· 檔案系統崩潰 

· 硬體問題(硬碟、母板等等) 

該命令不包括mysqldump和mysql程式的--user和—password等選項。應包括必要的選項讓MySQL伺服器允許你連線它。

我們假定資料儲存在MySQL的InnoDB儲存引擎中,支援事務和自動崩潰恢復。我們假定崩潰時MySQL伺服器帶負載。如果不帶負載,則不需要恢復。

出現作業系統崩潰或電源故障時,我們可以假定重啟後硬碟上的MySQLś資料仍可用。由於崩潰,InnoDB資料檔案中的資料可能不再保持一致性,但InnoDB讀取它的日誌並會查到掛起的提交的和未提交的事務清單,它們沒有清空到資料檔案中。InnoDB自動捲回未提交的事務,並清空到它的資料檔案中。通過MySQL錯誤日誌將該恢復過程相關資訊傳達給使用者。下面的例子為日誌摘錄:

InnoDB: Database was not shut down normally.
InnoDB: Starting recovery from log files...
InnoDB: Starting log scan based on checkpoint at
InnoDB: log sequence number 0 13674004
InnoDB: Doing recovery: scanned up to log sequence number 0 13739520
InnoDB: Doing recovery: scanned up to log sequence number 0 13805056
InnoDB: Doing recovery: scanned up to log sequence number 0 13870592
InnoDB: Doing recovery: scanned up to log sequence number 0 13936128
...
InnoDB: Doing recovery: scanned up to log sequence number 0 20555264
InnoDB: Doing recovery: scanned up to log sequence number 0 20620800
InnoDB: Doing recovery: scanned up to log sequence number 0 20664692
InnoDB: 1 uncommitted transaction(s) which must be rolled back
InnoDB: Starting rollback of uncommitted transactions
InnoDB: Rolling back trx no 16745
InnoDB: Rolling back of trx no 16745 completed
InnoDB: Rollback of uncommitted transactions completed
InnoDB: Starting an apply batch of log records to the database...
InnoDB: Apply batch completed
InnoDB: Started
mysqld: ready for connections
如果檔案系統崩潰或出現硬體問題,我們可以假定重啟後硬碟上的MySQLś資料不可用。這說明MySQL未能成功啟動,因為一些硬碟資料塊不再可讀。在這種情況下,需要重新格式化硬碟,安裝一個新的,或糾正問題。然後需要從備份中恢復MySQL資料,這說明我們必須先做好備份。要想確保,應及時返回並設計備份策略。

5.9.2.1. 備份策略
我們都知道必須按計劃定期進行備份。可以用幾個工具完全備份(在某個時間點的資料快照)MySQL。例如,InnoDB Hot Backup為InnoDB資料檔案提供