mysqldump

mysqldump

mysqldump是mysql用於轉存儲資料庫的實用程式。它主要產生一個SQL腳本,其中包含從頭重新創建資料庫所必需的命令CREATE TABLE INSERT等。

簡介

mysqldump工具很多方面類似相反作用的工具mysqlimport。它們有一些同樣的選項。但mysqldump能夠做更多的事情。它可以把整個資料庫裝載到一個單獨的文本檔案中。這個檔案包含有所有重建您的資料庫所需要的SQL命令。這個命令取得所有的模式(Schema,後面有解釋)並且將其轉換成DDL語法(CREATE語句,即資料庫定義語句),取得所有的數據,並且從這些數據中創建INSERT語句。這個工具將您的資料庫中所有的設計倒轉。因為所有的東西都被包含到了一個文本檔案中。這個文本檔案可以用一個簡單的批處理和一個合適SQL語句導回到MySQL中。這個工具令人難以置信地簡單而快速。決不會有半點讓人頭疼地地方。

因此,如果您想裝載整個資料庫Meet_A_Geek的內容到一個檔案中,可以使用下面的命令:

bin/mysqldump –p Meet_A_Geek > MeetAGeek_Dump_File.txt

這個語句也允許您指定一個表進行dump(備份/導出/裝載?)。如果您只是希望把資料庫Meet_A_Geek中的表Orders中的整個內容導出到一個檔案,可以使用下面的命令:

bin/mysqldump –p Meet_A_Geek Orders >MeetAGeek_Orders.txt

這個非常的靈活,您甚至可以使用WHERE從句來選擇您需要的記錄導出到檔案中。要達到這樣的目的,可以使用類似於下面的命令:

bin/mysqldump –p –where="Order_ID > 2000" Meet_A_Geek Orders > Special_Dump.txt

mysqldump工具有大量的選項,部分選項如下表:

選項/Option 作用/Action Performed

--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.路徑名是存放這兩個檔案的目錄。目錄必須已經存在,並且命令的使用者有對檔案的特權。

-w "WHERE Clause" or -where = "Where clause "

如前面所講的,您可以使用這一選項來過篩選將要放到 導出檔案的數據。

假定您需要為一個表單中要用到的帳號建立一個檔案,經理要看今年(2004年)所有的訂單(Orders),它們並不對DDL感興趣,並且需要檔案有逗號分隔,因為這樣就很容易導入到Excel中。 為了完成這個任務,您可以使用下面的句子:

bin/mysqldump –p –where "Order_Date >="2000-01-01""

–tab = /home/mark –no-create-info –fields-terminated-by=, Meet_A_Geek Orders

這將會得到您想要的結果。

schema:模式

The set of statements, expressed in data definition language, that completely describe the structure of a data base.

一組以數據定義語言來表達的語句集,該語句集完整地描述了資料庫的結構。

mysqldump mysqldump

SELECT INTO OUTFILE :

使用幫助

進行數據備份與恢復

下面假設要備份tm這個資料庫:

Shell>mysqldump -uroot –p123456 tm > tm_050519.sql

這時可以利用gzip壓縮數據,命令如下:

Shell>mysqldump -uroot -p123456 tm | gzip > tm_050519.sql.gz

恢複數據:

Shell>mysql -uroot -p123456 tm < tm_050519.sql

從壓縮檔案直接恢復:

Shell>gzip -d < tm_050519.sql.gz | mysql -uroot -p123456 tm

如何使用mysqldump

(1)直接使用mysqldump -uroot -pxxxx tetratest > "d:\data1.sql"

導出數據時,沒有建庫語句,這時你可以手動創建一個庫,然後使用:

mysql -uroot -pabcd mydatabase < "d:\data1.sql",即將一個資料庫“複製”到一個不同名稱的資料庫下。同時,這種情況下,存儲過程及函式並沒有轉儲到檔案中。

(2)如果你未使用--quick或者--opt選項,那么mysqldump將在轉儲結果之前把全部內容載入到記憶體中。這在你轉儲大數據量的資料庫時將會有些問題。該選項默認是打開的,但可以使用--skip-opt來關閉它。

(3)使用--skip-comments可以去掉導出檔案中的注釋語句

(4)使用--compact選項可以只輸出最重要的語句,而不輸出注釋及刪除表語句等等

(5)使用--database或-B選項,可以轉儲多個資料庫,在這個選項名後的參數都被認定為資料庫名

mysqldump -uroot -paaa --database db1 db2 >"d:\mydata.sql"。同時,使用該參數會使用導出檔案中增加創建庫的語句。如不帶該選項,則第二個參數將被認定為表名,即:mysqldump -uroot -paaa my1 mytable1 >"d:\mydata.sql",將導出表mytable1的結構及數據。

(6)--tables ,在此選項之後的參數都被認定為表名。

(7)--no-create-db

(8)--no-create-info

(9)--no-data

(10)--routines, -R 將使存儲過程、函式也轉儲到檔案中來。

(11)-h或--help 可以查看有哪些選項可用。

(12)--opt 如果你正將數據移動到更新版本的MySQL,你應當使用mysqldump --opt來利用各種最佳化性能來產生更小、可以更快處理的轉儲檔案

(更多請參考MySQL手冊)

3. MySQL 中的臨時表及 HEAP

給正常的CREATE TABLE語句加上TEMPORARY關鍵字:

CREATE TEMPORARY TABLE tmp_table (

name VARCHAR(10) NOT NULL,

value INTEGER NOT NULL

)

臨時表將在你連線MySQL期間存在。當你斷開時,MySQL將自動刪除表並釋放所用的空間。當然你可以在仍然連線的時候刪除表並釋放空間。

DROP TABLE tmp_table

如果你聲明臨時表是一個 HEAP表,MySQL也允許你指定在記憶體中創建它:

CREATE TEMPORARY TABLE tmp_table (

name VARCHAR(10) NOT NULL,

value INTEGER NOT NULL

) TYPE = HEAP

HEAP表格使用一個哈希索引並且存儲在記憶體中,這使他們更快,但是如果MySQL崩潰,你將失去所有存儲的數據。HEAP作為臨時表很可用!

當你使用HEAP表時,這裡是你應該考慮的一些事情:

你應該總是在CREATE語句中指定MAX_ROWS以保證你有意不使用所有的記憶體。

索引將只能與與=和一起使用(但是很快)。

HEAP表使用一個固定的記錄長度格式。

HEAP不支持BLOB/TEXT列。

HEAP不支持AUTO_INCREMENT列。

HEAP不支持在一個NULL列上的索引。

你可以在一個HEAP表中有非唯一鍵(哈希表一般不這樣)。

HEAP表格在所有的客戶之間被共享(就象任何其他的表)。

HEAP表的數據以小塊分配。表是100%動態的(在插入時),無需溢出區和額外的鍵空間。刪除的行放入一個連結表並且當你把新數據插入到表時,它將被再次使用。

為了釋放記憶體,你應該執行DELETE FROM heap_table或DROP TABLE heap_table。

為了保證你不會偶然做些愚蠢的事情,你不能創建比max_heap_table_size大的HEAP表。

什麼時候用到mysqldump

如果你需要在不同的架構之間轉移資料庫,可以使用mysqldump創建含有SQL語句的檔案。然後你可以將檔案轉移到其它機器上,並將它輸入到MySQL客戶端。

實例

如果你想要從遠程機器通過慢速網路複製資料庫,可以使用:

shell> mysqladmin create db_name

shell> mysqldump -h 'other_hostname' --opt --compress db_name | mysql db_name

還可以將結果保存到檔案中,然後將檔案轉移到目標機器上並將檔案裝載到資料庫中。例如,可以在源機器上使用下面的命令將資料庫備份到檔案中:

shell> mysqldump --quick db_name | gzip > db_name.contents.gz

(該例子中創建的檔案是壓縮格式)。將含有資料庫內容的檔案到目標機上並運行命令:

shell> mysqladmin create db_nameshell> gunzip < db_name.contents.gz | mysql db_name

還可以使用mysqldump和mysqlimport來轉移資料庫。對於大的表,比只是使用mysqldump要快得多。在下面的命令中,DUMPDIR代表用來保存mysqldump輸出的目錄全路徑名。

首先,創建保存輸出檔案的目錄並備份資料庫:

shell> mkdir DUMPDIRshell>mysqldump --tab=DUMPDIR db_name

然後將DUMPDIR目錄中的檔案轉移到目標機上相應的目錄中並將檔案裝載到MySQL:

shell> mysqladmin create db_name # create database

shell> cat DUMPDIR/*.sql | mysql db_name # create tables in database

shell> mysqlimport db_name DUMPDIR/*.txt # load data into tables

不要忘記複製MySQL資料庫,因為授權表保存在該資料庫中。你可能需要在新機器上用MySQL root用戶運行命令,直到產生MySQL資料庫。

將mysql資料庫導入目標機器後,執行mysqladmin flush-privileges,以便伺服器重載授權表信息。

或者 shell > flush privileges;

相關詞條

相關搜尋

熱門詞條

聯絡我們