備份是最簡單的保護資料的方法,本節将介紹多種備份方法。為了得到一個一緻的備份,在相關的表上做一個LOCK TABLES,你隻需一個讀鎖定,當你在資料庫目錄中做檔案的一個拷貝時,這允許其他線程繼續查詢該表;當你恢複資料時,需要一個寫鎖定,以避免沖突。
AD:
使用SQL語句備份和恢複
你可以使用SELECT INTO OUTFILE語句備份資料,并用LOAD DATA INFILE語句恢複資料。這種方法隻能導出資料的内容,不包括表的結構,如果表的結構檔案損壞,你必須要先恢複原來的表的結構。
文法:
SELECT * INTO {OUTFILE | DUMPFILE} 'file_name' FROM tbl_name
LOAD DATA [LOW_PRIORITY] [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE]
INTO TABLE tbl_name
SELECT ... INTO OUTFILE 'file_name'格式的SELECT語句将選擇的行寫入一個檔案。檔案在伺服器主機上被建立,并且不能是已經存在的(不管别的,這可阻止資料庫表和 檔案例如“/etc/passwd”被破壞)。SELECT ... INTO OUTFILE是LOAD DATA INFILE逆操作。
LOAD DATA INFILE語句從一個文本檔案中以很高的速度讀入一個表中。如果指定LOCAL關鍵詞,從客戶主機讀檔案。如果LOCAL沒指定,檔案必須位于伺服器上。(LOCAL在MySQL3.22.6或以後版本中可用。)
為了安全原因,當讀取位于伺服器上的文本檔案時,檔案必須處于資料庫目錄或可被所有人讀取。另外,為了對伺服器上檔案使用LOAD DATA INFILE,在伺服器主機上你必須有file的權限。使用這種SELECT INTO OUTFILE語句,在伺服器主機上你必須有FILE權限。
為了避免重複記錄,在表中你需要一個PRIMARY KEY或UNIQUE索引。當在唯一索引值上一個新記錄與一個老記錄重複時,REPLACE關鍵詞使得老記錄用一個新記錄替代。如果你指定IGNORE, 跳過有唯一索引的現有行的重複行的輸入。如果你不指定任何一個選項,當找到重複索引值時,出現一個錯誤,并且文本檔案的餘下部分被忽略時。
如果你指定關鍵詞LOW_PRIORITY,LOAD DATA語句的執行被推遲到沒有其他客戶讀取表後。
使用LOCAL将比讓伺服器直接存取檔案慢些,因為檔案的内容必須從客戶主機傳送到伺服器主機。在另一方面,你不需要file權限裝載本地檔案。如 果你使用LOCAL關鍵詞從一個本地檔案裝載資料,伺服器沒有辦法在操作的當中停止檔案的傳輸,是以預設的行為好像IGNORE被指定一樣。
當在伺服器主機上尋找檔案時,伺服器使用下列規則:
◆如果給出一個絕對路徑名,伺服器使用該路徑名。
◆如果給出一個有一個或多個前置部件的相對路徑名,伺服器相對伺服器的資料目錄搜尋檔案。
◆如果給出一個沒有前置部件的一個檔案名,伺服器在目前資料庫的資料庫目錄尋找檔案。
假定表tbl_name具有一個PRIMARY KEY或UNIQUE索引,備份一個資料表的過程如下:
1、鎖定資料表,避免在備份過程中,表被更新
mysql>LOCK TABLES READ tbl_name;
2、導出資料
mysql>SELECT * INTO OUTFILE ‘tbl_name.bak’ FROM tbl_name;
3、解鎖表
mysql>UNLOCK TABLES;
相應的恢複備份的資料的過程如下:
1、為表增加一個寫鎖定:
mysql>LOCK TABLES tbl_name WRITE;
2、恢複資料
mysql>LOAD DATA INFILE ‘tbl_name.bak’
->REPLACE INTO TABLE tbl_name;
如果,你指定一個LOW_PRIORITY關鍵字,就不必如上要對表鎖定,因為資料的導入将被推遲到沒有客戶讀表為止:
mysql>LOAD DATA LOW_PRIORITY INFILE ‘tbl_name’
http://www.51cto.com/art/200811/98519.htm
本文轉自yunlielai51CTO部落格,原文連結:http://blog.51cto.com/4925054/1105759,如需轉載請自行聯系原作者