MySQL數(shù)據(jù)庫備份(4)
發(fā)布時間:2008-08-23 閱讀數(shù): 次 來源:網(wǎng)樂原科技
4 用備份恢復(fù)數(shù)據(jù)
數(shù)據(jù)庫損壞的發(fā)生有很多原因,程度也不同。如果你走運,你可能僅損壞一兩個表(如掉電),如果你倒霉,你可能必須替換整個數(shù)據(jù)目錄(如磁盤損壞)。在某些情況下也需要恢復(fù),比如用戶錯誤地刪除了數(shù)據(jù)庫或表。不管這些倒霉事件的原因,你將需要實施某種恢復(fù)。
如果表損壞但沒丟失,嘗試用myisamchk或isamchk修復(fù)它們,如果這樣的損壞可有修復(fù)程序修復(fù),你可能根本不需要使用備份文件。關(guān)于表修復(fù)的過程,見《數(shù)據(jù)庫維護與修復(fù)》。
恢復(fù)過程涉及兩種信息源:你的備份文件和個更新日志。備份文件將表恢復(fù)到實施備份時的狀態(tài),然而一般表在備份與發(fā)生問題之間的時間內(nèi)已經(jīng)被修改,更新日志包含了用于進行這些修改的查詢。你可以使用日志文件作為mysql的輸入來重復(fù)查詢。這已正是為什么要啟用更新日志的原因。
恢復(fù)過程視你必須恢復(fù)的信息多少而不同。實際上,恢復(fù)整個數(shù)據(jù)庫比單個表跟容易,因為對于數(shù)據(jù)庫運用更新日志比單個表容易。
4.1 恢復(fù)整個數(shù)據(jù)庫
首先,如果你想恢復(fù)的數(shù)據(jù)庫是包含授權(quán)表的mysql數(shù)據(jù)庫,你需要用--skip-grant-table選項運行服務(wù)器。否則,它會抱怨不能找到授權(quán)表。在你已經(jīng)恢復(fù)表后,執(zhí)行mysqladmin flush-privileges告訴服務(wù)器裝載授權(quán)標(biāo)并使用它們。
將數(shù)據(jù)庫目錄內(nèi)容拷貝到其它某個地方,如果你在以后需要它們。
用最新的備份文件重裝數(shù)據(jù)庫。如果你用mysqldump產(chǎn)生的文件,將它作為mysql的輸入。如果你用直接從數(shù)據(jù)庫拷貝來的文件,將它們直接拷回數(shù)據(jù)庫目錄,然而,此時你需要在拷貝文件之前關(guān)閉數(shù)據(jù)庫,然后重啟它。
使用更新日志重復(fù)做備份以后的修改數(shù)據(jù)庫表的查詢。對于任何可適用的更新日志,將它們作為mysql的輸入。指定--one-database選項使得mysql只執(zhí)行你有興趣恢復(fù)的數(shù)據(jù)庫的查詢。如果你知道你需要運用所有更新日志文件,你可以在包含日志的目錄下使用這條命令:
% ls -t -r -1 update.[0-9]* | xargs cat | mysql --one-database db_name
ls命令生成更新日志文件的一個單列列表,根據(jù)服務(wù)器產(chǎn)生它們的次序排序(主意:如果你修改任何一個文件,你將改變排序次序,這導(dǎo)致更新日志一錯誤的次序被運用。)
很可能你會是運用某幾個更新日志。例如,自從你備份以來產(chǎn)生的更新日志被命名為update.392、update.393等等,你可以這樣重新運行:
%mysql --one-database db_name < update.392
%mysql --one-database db_name < update.393
.....
如果你正在實施恢復(fù)且使用更新日志恢復(fù)由于一個錯誤建議的DROP DATABASE、DROP TABLE或DELETE語句造成丟失的信息,在運用更新日志之前,要保證從其中刪除這些語句。
4.2 恢復(fù)單個表
恢復(fù)單個表較為復(fù)雜。如果你用一個由mysqldump生成的備份文件,并且它不包含你感興趣的表的數(shù)據(jù),你需要從相關(guān)行中提取它們并將它們用作mysql的輸入。這是容易的部分。難的部分是從只運用于該表的更新日志中拉出片斷。你會發(fā)覺mysql_find_rows實用程序?qū)Υ撕苡袔椭?,它從更新日志中提取多行查詢?
另一個可能性是使用另一臺服務(wù)器恢復(fù)整個數(shù)據(jù)庫,然后拷貝你想要的表文件到原數(shù)據(jù)庫中。這可能真的很容易!當(dāng)你將文件拷回數(shù)據(jù)庫目錄時,要確保原數(shù)據(jù)庫的服務(wù)器關(guān)閉。