MySQL數據備份和恢復的方法大全

拷貝數據庫文件備份:

因爲MySQL的數據庫和表是直接經過目錄和表文件實現的,所以直接複製文件來備份數據庫數據,對MySQL來講特別方便。並且自MySQL 3.23起MyISAM表成爲缺省的表的類型,這種表能夠爲在不一樣的硬件體系中共享數據提供了保證。

使用直接拷貝的方法備份時,尤爲要注意表沒有被使用,應該對錶進行讀鎖定或中止MySQL服務。備份一個表,須要三個文件:

對於MyISAM表:
tbl_name.frm 表的描述文件
tbl_name.MYD 表的數據文件
tbl_name.MYI 表的索引文件

對於ISAM表:
tbl_name.frm 表的描述文件
tbl_name.ISD 表的數據文件
tbl_name.ISM 表的索引文件

對於MyISAM表,你能夠從運行在不一樣硬件系統的服務器之間複製文件,例如,SUN服務器和INTEL PC機之間。
當 然,這只是備份一個數據表,在不少狀況下咱們須要備份完整的數據庫,這個時候一樣能夠直接複製數據庫文件夾便可完成備份;若想再省點兒事,把整個數據庫目 錄「data」複製也能夠,可是在還原數據時要注意,只能一個一個地還原數據庫,由於該目錄下有mysql運行時的配置文件,若正在運行的mysql配置 信息遭到還原破壞,整個mysql服務就會沒法啓動。

SELECT INTO OUTFILE和MYSQLDUMP備份數據:

在「SELECT語句之高級功能使用篇」中講述了select into outfile的語句結構和使用方法,這裏重點講述mysqldump命令。

MySQLdump命令位於MySQL/bin/目錄中,在Windows下使用Commond命令提示符進入該目錄執行。

MySQLdump工具能夠把整個數據庫裝載到一個單獨的文本文件中。這個文件包含全部重建數據庫和表的SQL命令。這個命令取得全部的模式 (Schema)而且將其轉換成DDL語法(CREATE語句,即數據庫定義語句),還取得全部的數據,而且爲這些數據建立INSERT語句。全部的東西 都被包含到了一個文本文件中。這個文本文件能夠用一個簡單的批處理和一個合適SQL語句導回到MySQL中。這個工具使人難以置信地簡單而快速。

有3種方式來調用mysqldump
選擇一個數據庫或一個數據表備份到一個文件:
/bin> mysqldump [options] db_name [tables] > filename.txt

選擇多個數據庫備份到一個文件:
/bin> mysqldump [options] --database DB1 [DB2 DB3...] > filename.txt

全部數據庫備份到一個文件:
/bin> mysqldump [options] --all--database > filename.txt


Option選擇:

--help,-?
顯示幫助消息並退出。

--add-drop-table
這個選項將會在每個表的前面加上DROP TABLE IF EXISTS語句,這樣能夠保證導回MySQL數據庫的時候不會出錯,由於每次導回的時候,都會首先檢查表是否存在,存在就刪除

--add-locks
這個選項會在INSERT語句中捆上一個LOCK TABLE和UNLOCK TABLE語句。這就防止在這些記錄被再次導入數據庫時其餘用戶對錶進行的操做

-c or --complete_insert
這個選項使得MySQLdump命令給每個產生INSERT語句加上列(field)的名字。當把數據導出導另一個數據庫時這個選項頗有用。

--delayed-insert 在INSERT命令中加入DELAY選項

-F or --flush-logs 使用這個選項,在執行導出以前將會刷新MySQL服務器的log.

-f or --force 使用這個選項,即便有錯誤發生,仍然繼續導出

--full 這個選項把附加信息也加到CREATE TABLE的語句中

-l or --lock-tables 使用這個選項,導出表的時候服務器將會給表加鎖。

-t or --no-create- info

這個選項使的MySQLdump命令不建立CREATE TABLE語句,這個選項在您只須要數據而不須要DDL(數據庫定義語句)時很方便。

-d or --no-data 這個選項使的MySQLdump命令不建立INSERT語句。

在您只須要DDL語句時,可使用這個選項。

--opt 此選項將打開全部會提升文件導出速度和創造一個能夠更快導入的文件的選項。

-q or --quick 這個選項使得MySQL不會把整個導出的內容讀入內存再執行導出,而是在讀到的時候就寫入導文件中。

-T path or --tab = path
這 個選項將會將數據庫中每個表建立兩個文件,一個文件包含DDL語句或者表建立語句,另外一個文件包含數據。DDL文件被命名爲 table_name.sql,數據文件被命名爲table_name.txt。該參數的path爲存放目錄,並且該目錄必須已經存在。 如:/bin>mysqldump –uroot –p --tab=d:\\ mydata

-w "WHERE Clause" or --where = "Where clause " 篩選將要放到導出文件的數據。

下面來看幾組mysqldump命令案例:

將數據庫mydata的內容備份到mydata.txt文件中:
/bin>MySQLdump –uroot -p mydata > d:\\mydata.txt

將mydata數據庫中的users表的內容備份到d:\\users.txt:
/bin>MySQLdump –uroot -p mydata users > d:\\users.txt

將mydata數據庫中的users表username值爲「feihu」的數據備份到d:\\users.txt:
/bin>MySQLdump –uroot -p --where=」username=’feihu’」 mydata users > d:\\users.txt;

將mydata數據庫以及內部表的建立結構(DDL)備份到d:\\users.txt:
/bin>MySQLdump –uroot –p -d mydata > d:\\mydata.txt

將mydata和mydata2數據庫同時備份到d:\\users.txt:
/bin> MySQLdump –uroot –p -d mydata mydata2 > d:\\mydata.txt

將全部數據備份到一個數據庫,命令怎麼寫呢???

schema: 模式The set of statements, expressed in data definition language, that completely describe the structure of a data base.(一組以數據定義語言來表達的語句集,該語句集完整地描述了數據庫的結構。)

當須要將還原備份數據時,使用以下語句:
/bin>mysql –uroot –p mydata < d:\\mydata.txt;

注意使用「<」符號,導入數據。還可使用source命令執行文件中的腳原本還原數據,如:

Mysql>source d:\mydata.txt;

LOAD DATA INFILE和MYSQLIMPORT恢復數據

關於load data infile語句的使用已經在別一節講述過了,詳細請參考「使用LOAD DATA和INSERT語句導入Mysql數據」。若是你僅僅恢復數據, mysqlimport徹底是與LOAD DATA 語句對應的,讀者能夠任意選擇一個去實現。

MySQLimport位於MySQL/bin目錄中,是MySQL的一個載入(或者說導入)數據的一個很是有效的工具。這是一個命令行工具。有兩個參數 以及大量的選項可供選擇。這個工具把一個文本文件(textfile)導入到你指定的數據庫和表中。比方說咱們要從文件users.txt中把數據導入到 數據庫mydata中的表users中:


/bin>mysqlimport –uroot –p mydata d:\users.txt

注意:這裏users.txt是咱們要導入數據的文本文件,而mydata是咱們要操做的數據庫,數據庫中的表名是users,這裏文本文件的數據格式必須與users表中的記錄格式一致,不然MySQLimport命令將會出錯。

其中表的名字是導入文件的第一個句號(.)前面文件字符串,另一個例子:MySQLimport mydata users.2009.10.txt;  那麼咱們將把文件中的內容導入到數據庫mydata 中的users表中。

上面的例子中,都只用到兩個參數,並無用到更多的選項,下面介紹MySQLimport的選項

-d or --delete 新數據導入數據表中以前刪除數據數據表中的全部信息

-f or --force 不論是否遇到錯誤,MySQLimport將強制繼續插入數據

-i or --ignore MySQLimport跳過或者忽略那些有相同惟一關鍵字的行, 導入文件中的數據將被忽略。

-l or -lock-tables 數據被插入以前鎖住表,這樣就防止了,你在更新數據庫時,用戶的查詢和更新受到影響。

-r or -replace 這個選項與-i選項的做用相反;此選項將替表明中有相同惟一關鍵字的記錄。

--fields-enclosed-by= char 指定文本文件中數據的記錄時以什麼括起的, 不少狀況下數據以雙引號括起。 默認的狀況下數據是沒有被字符括起的。

--fields-terminated-by=char 指定各個數據的值之間的分隔符,在句號分隔的文件中,分隔符是句號。您能夠用此選項指定數據之間的分隔符。默認的分隔符是跳格符(Tab)

--lines-terminated-by=str 此選項指定文本文件中行與行之間數據的分隔字符串或者字符。 默認的狀況下MySQLimport以newline爲行分隔符。您能夠選擇用一個字符串來替代一個單個的字符:一個新行或者一個回車。

MySQLimport命令經常使用的選項還有-v 顯示版本(version),-p 提示輸入密碼(password)等。

若是,咱們要導入一個文件(Orders.txt)中行的記錄格式是這樣的:
"1", "ORD89876", "1 Dozen Roses", "19991226"

咱們的任務是要把這個文件裏面的數據導入到數據庫mydata中的表格Orders中,咱們使用這個命令:
/Bin>MySQLimport -uroot–prl --fields-enclosed-by=" --fields-terminated-by=, mydata Orders.txt

第一部分,/Bin>,告訴操做系統你要運行的命令是MySQL/bin目錄下的MySQLimport,選項p是要求輸入密碼,這樣就要求你在改 動數據庫以前輸入密碼,操做起來會更安全。咱們用了r選項是由於咱們想要把表中的惟一關鍵字與文件記錄中有重複惟一關鍵字的記錄替換成文件中的數據。咱們 表單中的數據不是最新的,須要用文件中的數據去更新,於是就用r這個選項,替代數據庫中已經有的記錄。l選項的做用是在咱們插入數據的時候鎖住表,這樣就 阻止了用戶在咱們更新表的時候對錶進行查詢或者更改的操做。

附件:

談到數據備份與還原,難免與批處理有些關係,批處理是一種非交互式運行MySQL程序的方法,如同您在MySQL中使用的命令同樣。

爲了實現批處理,您重定向一個文件到MySQL程序中,首先咱們須要一個文本文件,這個文本文件包含有與咱們在MySQL中輸入的命令相同的文本。

好比咱們要插入一些數據,使用包含下面文本的文件(文件名爲New_Data.sql,固然咱們也能夠取名爲New_Data.txt及任何其餘的合法名字,並不必定要之後綴sql結尾):
USE mydata; INSERT INTO Orders (Orders_ID, username) VALUES(1, "Block"); INSERT INTO Orders (Orders_ID, username) VALUES(2, "Newton"); INSERT INTO Orders (Orders_ID, username) VALUES(3, "Simmons");

注意上面的這些句子的語法都必須是正確的,而且每一個句子以分號結束。上面的USE命令選擇數據庫,INSERT命令插入數據。

下面咱們要把上面的文件導入到數據庫中,導入以前要確認數據庫已經在運行,便是MySQLd進程(或者說服務,Windows NT下面稱爲「服務」,unix下面爲「進程」)已經在運行。

而後運行下面的命令:
/bin>mysql –uroot –p mydata < d:\New_Data.txt;

接着按提示輸入密碼,若是上面的文件中的語句沒有錯誤,那麼這些數據就被導入到了數據庫中。

如今讀者可能會問,"究竟爲何我要輸入全部的這些SQL語句到文件中,而後經過程序運行它們呢?」

這樣看起來好像須要大量的工做。很好,你這樣想極可能就對了。可是假如你有從全部這些命令中產生的log記錄呢?如今這樣就很棒,嗯,大多數數據庫都會自 動產生數據庫中的事件記錄的log。而大部分log都包含有用過的原始的SQL命令。所以,若是您不能從您如今的數據庫中導出數據到新的MySQL數據庫 中使用,那麼您可使用log和MySQL的批處理特性,來快速且方便地導入您地數據。固然,這樣就省去了打字的麻煩。
相關文章
相關標籤/搜索