原文出處:http://hi.baidu.com/yghao123/blog/item/7a6e2b1f763a4806304e15bd.html
實用程序,爲備份或爲把數據轉移到另外的SQL服務器上傾倒一個數據庫或許多數據庫。傾倒將包含 創建表或充實表的SQL語句。
shell> mysqldump [OPTIONS] database [tables]
如果你不給定任何表,整個數據庫將被傾倒。
通過執行mysqldump --help,你能得到你mysqldump的版本支持的選項表。
注意,如果你運行mysqldump沒有--quick或--opt選項,mysqldump將在傾倒結果前裝載整個結果集到內存中,如果你正在傾倒一個大的數據庫,這將可能是一個問題。
mysqldump支持下列選項:
--add-locks
在每個表傾倒之前增加LOCK TABLES並且之後UNLOCK TABLE。(爲了使得更快地插入到MySQL)。
--add-drop-table
在每個create語句之前增加一個drop table。
--allow-keywords
允許創建是關鍵詞的列名字。這由表名前綴於每個列名做到。
-c, --complete-insert
使用完整的insert語句(用列名字)。
-C, --compress
如果客戶和服務器均支持壓縮,壓縮兩者間所有的信息。
--delayed
用INSERT DELAYED命令插入行。
-e, --extended-insert
使用全新多行INSERT語法。(給出更緊縮並且更快的插入語句)
-#, --debug[=option_string]
跟蹤程序的使用(爲了調試)。
--help
顯示一條幫助消息並且退出。
--fields-terminated-by=...
--fields-enclosed-by=...
--fields-optionally-enclosed-by=...
--fields-escaped-by=...
--fields-terminated-by=...
這些選擇與-T選擇一起使用,並且有相應的LOAD DATA INFILE子句相同的含義。見7.16 LOAD DATA INFILE語法。
-F, --flush-logs
在開始傾倒前,洗掉在MySQL服務器中的日誌文件。
-f, --force,
即使我們在一個表傾倒期間得到一個SQL錯誤,繼續。
-h, --host=..
從命名的主機上的MySQL服務器傾倒數據。缺省主機是localhost。
-l, --lock-tables.
爲開始傾倒鎖定所有表。
-t, --no-create-info
不寫入表創建信息(CREATE TABLE語句)
-d, --no-data
不寫入表的任何行信息。如果你只想得到一個表的結構的傾倒,這是很有用的!
--opt
同--quick --add-drop-table --add-locks --extended-insert --lock-tables。應該給你爲讀入一個MySQL服務器的儘可能最快的傾倒。
-pyour_pass, --password[=your_pass]
與服務器連接時使用的口令。如果你不指定“=your_pass”部分,mysqldump需要來自終端的口令。
-P port_num, --port=port_num
與一臺主機連接時使用的TCP/IP端口號。(這用於連接到localhost以外的主機,因爲它使用 Unix套接字。)
-q, --quick
不緩衝查詢,直接傾倒至stdout;使用mysql_use_result()做它。
-S /path/to/socket, --socket=/path/to/socket
與localhost連接時(它是缺省主機)使用的套接字文件。
-T, --tab=path-to-some-directory
對於每個給定的表,創建一個table_name.sql文件,它包含SQL CREATE 命令,和一個table_name.txt文件,它包含數據。 注意:這隻有在mysqldump運行在mysqld守護進程運行的同一臺機器上的時候才工作。.txt文件的格式根據--fields-xxx和 --lines--xxx選項來定。
-u user_name, --user=user_name
與服務器連接時,MySQL使用的用戶名。缺省值是你的Unix登錄名。
-O var=option, --set-variable var=option
設置一個變量的值。可能的變量被列在下面。
-v, --verbose
冗長模式。打印出程序所做的更多的信息。
-V, --version
打印版本信息並且退出。
-w, --where='where-condition'
只傾倒被選擇了的記錄;注意引號是強制的!
"--where=user='jimf'" "-wuserid>1" "-wuserid<1"
最常見的mysqldump使用可能製作整個數據庫的一個備份:
mysqldump --opt database > backup-file.sql
但是它對用來自於一個數據庫的信息充實另外一個MySQL數據庫也是有用的:
mysqldump --opt database │ mysql --host=remote-host -C database
__________________________________________
用msyqldump從表A中導出部分數據,其中 -w 條件部分用到了表B的內容,請問這兩個表怎麼加在mysqldump語句中呀?
我相信,很多人用mysqldump工具,要麼就dump真個數據庫或是某幾個數據,要麼就是dump指定數據庫中的某個(些)表,很少會提出上面的這個高級需求吧。其實,反過來想想,很多時候我們都只是用這些工具和命令的最最基本的功能,很少會進一步去深入下去挖掘它們更加精髓的東西,再比如說,有多少人,去嘗試過/MYSQL_HOME/bin下的所有命令和腳本,至少我相當的懶,儘管思想動了,但是行動很少,我相信hiro一定都做到了,因爲他是一個精益求精的人。
再來說說,這個問題吧。我在本地實驗如下:
Table:a、b
Structure:
+-----------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| timestamp | date | YES | | NULL | |
+-----------+---------+------+-----+---------+-------+
Operations:
mysql>mysqldump -w "(id) in (select id from b where b.timestamp < '2009-01-01')" test a --lock-all-table -uroot -p >/tmp/a_b.sql
mysql>system less /tmp/a_b.sql
----omitted-------
-- Table structure for table `a`
--
DROP TABLE IF EXISTS `a`;
CREATE TABLE `a` (
`id` int(11) DEFAULT NULL,
`timestamp` date DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-- Dumping data for table `a`
--
-- WHERE: (id) in (select id from b where b.timestamp < '2009-01-01')
LOCK TABLES `a` WRITE;
INSERT INTO `a` VALUES (1,'2007-01-23'),(3,'2009-12-30');
UNLOCK TABLES;
-----omitted------
分析:通過這些操作,我們可以很清楚的瞭解mysqldump是如何通過-w來構造執行語句的。-w後面雙引號中的部分就是你要where的條件,而test a,告訴mysqldump我們要操作的是數據庫test中的表a。其實,mysqldump執行了這麼一條sql語句:
'SELECT * FROM `a` WHERE (id) in (select id from b where b.timestamp < '2009-01-01');'
此外,--lock-all-table這個選項也很必要。
mysqldump -uroot -p123456 --default-character-set=utf8 --opt --single-transaction --extended-insert=false -R test a "-wnews.Adddate > '2010-05-12 10:17:00'" | gzip > /bak/autodatabak/test_a_201005261200.gz
mysqldump -uroot -p123456 --default-character-set=utf8 --opt --single-transaction --extended-insert=false -R test b -w "(pid) in (select id from a where news.Adddate > '2010-05-12 10:17:00')" | gzip > /bak/autodatabak/test_b_201005261200.gz