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

jopen 11年前發布 | 20K 次閱讀 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的批處理特性,來快速且方便地導入您地數據。當然,這樣就省去了打字的麻煩。
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!