奇葛格的BLOG

          紅塵最可笑,我自樂逍遙

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            59 隨筆 :: 23 文章 :: 11 評論 :: 0 Trackbacks
          注:當出現(xiàn)類似 mysqlimport: Error: Can't get stat of '/usr/t2.txt' (Errcode: 13), when using table: t2 這樣的錯誤,檢查文件權限。如果不行,加上 --local 選項。

          1).MySQLimport的語法介紹:

            MySQLimport位于MySQL/bin目錄中,是MySQL的一個載入(或者說導入)數(shù)據(jù)的一個非常有效的工具。這是一個命令行工具。有兩個
          參數(shù)以及大量的選項可供選擇。這個工具把一個文本文件(text
          file)導入到你指定的數(shù)據(jù)庫和表中。比方說我們要從文件Customers.txt中把數(shù)據(jù)導入到數(shù)據(jù)庫Meet_A_Geek中的表
          Custermers中:

            mysqlimport Meet_A_Geek Customers.txt

            注意:這里Customers.txt是我們要導入數(shù)據(jù)的文本文件,而Meet_A_Geek是我們要操作的數(shù)據(jù)庫,數(shù)據(jù)庫中的表名是Customers,這里文本文件的數(shù)據(jù)格式必須與Customers表中的記錄格式一致,否則MySQLimport命令將會出錯。

            其中表的名字是導入文件的第一個句號(.)前面文件字符串,另外一個例子:MySQLimport Meet_A_Geek Cus.to.mers.txt

            那么我們將把文件中的內容導入到數(shù)據(jù)庫Meet_A_Geek 中的Cus表中。

            上面的例子中,都只用到兩個參數(shù),并沒有用到更多的選項,下面介紹MySQLimport的選項

            2).MySQLimport的常用選項介紹:

            選項 功能

            -d or --delete 新數(shù)據(jù)導入數(shù)據(jù)表中之前刪除數(shù)據(jù)數(shù)據(jù)表中的所有信息

            -f or --force 不管是否遇到錯誤,MySQLimport將強制繼續(xù)插入數(shù)據(jù)

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

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

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

            --fields-enclosed- by= char 指定文本文件中數(shù)據(jù)的記錄時以什么括起的, 很多情況下數(shù)據(jù)以雙引號括起。 默認的情況下數(shù)據(jù)是沒有被字符括起的。

            --fields-terminated- by=char 指定各個數(shù)據(jù)的值之間的分隔符,在句號分隔的文件中,分隔符是句號。您可以用此選項指定數(shù)據(jù)之間的分隔符。

            默認的分隔符是跳格符(Tab)

            --lines-terminated- by=str 此選項指定文本文件中行與行之間數(shù)據(jù)的分隔字符串或者字符。 默認的情況下MySQLimport以newline為行分隔符。

            您可以選擇用一個字符串來替代一個單個的字符:

            一個新行或者一個回車。

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

            3).例子:導入一個以逗號為分隔符的文件

            文件中行的記錄格式是這樣的:

            "1", "ORD89876", "1 Dozen Roses", "19991226"

            我們的任務是要把這個文件里面的數(shù)據(jù)導入到數(shù)據(jù)庫Meet_A_Geek中的表格Orders中,我們使用這個命令:

            bin/MySQLimport –prl –fields-enclosed-by=" –fields-terminated-by=, Meet_A_Geek Orders.txt

            這個命令可能看起來很不爽,不過當你熟悉了之后,這是非常簡單的。第一部分,bin/MySQLimport
          ,告訴操作系統(tǒng)你要運行的命令是MySQL/bin目錄下的MySQLimport,選項p是要求輸入密碼,這樣就要求你在改動數(shù)據(jù)庫之前輸入密碼,操作
          起來會更安全。我們用了r選項是因為我們想要把表中的唯一關鍵字與文件記錄中有重復唯一關鍵字的記錄替換成文件中的數(shù)據(jù)。我們表單中的數(shù)據(jù)不是最新的,需
          要用文件中的數(shù)據(jù)去更新,因而就用r這個選項,替代數(shù)據(jù)庫中已經(jīng)有的記錄。l選項的作用是在我們插入數(shù)據(jù)的時候鎖住表,這樣就阻止了用戶在我們更新表的時
          候對表進行查詢或者更改的操作。

          批處理是一種非交互式運行MySQL程序的方法,如同您在MySQL中使用的命令一樣,你仍然將使用這些命令。

            為了實現(xiàn)批處理,您重定向一個文件到MySQL程序中,首先我們需要一個文本文件,這個文本文件包含有與我們在MySQL中輸入的命令相同的文本。

            比如我們要插入一些數(shù)據(jù),使用包含下面文本的文件(文件名為New_Data.sql,當然我們也可以取名為New_Data.txt及任何其他的合法名字,并不一定要以后綴sql結尾):

            USE Meet_A_Geek;

            INSERT INTO Customers (Customer_ID, Last_Name) VALUES(NULL, "Block");

            INSERT INTO Customers (Customer_ID, Last_Name) VALUES(NULL, "Newton");

            INSERT INTO Customers (Customer_ID, Last_Name) VALUES(NULL, "Simmons");

            注意上面的這些句子的語法都必須是正確的,并且每個句子以分號結束。

            上面的USE命令選擇數(shù)據(jù)庫,INSERT命令插入數(shù)據(jù)。

            下面我們要把上面的文件導入到數(shù)據(jù)庫中,導入之前要確認數(shù)據(jù)庫已經(jīng)在運行,即是MySQLd進程(或者說服務,Windows NT下面稱為”服務“,unix下面為”進程“)已經(jīng)在運行。

            然后運行下面的命令:

            bin/MySQL –p

            接著按提示輸入密碼,如果上面的文件中的語句沒有錯誤,那么這些數(shù)據(jù)就被導入到了數(shù)據(jù)庫中。

            命令行中使用LOAD DATA INFILE 從文件中導入數(shù)據(jù)到數(shù)據(jù)庫:

            現(xiàn)在您可能會問自己,"究竟為什么我要輸入所有的這些SQL語句到文件中,然后通過程序運行它們呢?”

          這樣看起來好像需要大量的工作。很好,你這樣想很可能就對了。但是假如你有從所有這些命令中產生的log記錄呢?現(xiàn)在這樣就很棒,嗯,大多數(shù)數(shù)據(jù)庫都會自
          動產生數(shù)據(jù)庫中的事件記錄的
          log。而大部分log都包含有用過的原始的SQL命令。因此,如果您不能從您現(xiàn)在的數(shù)據(jù)庫中導出數(shù)據(jù)到新的MySQL數(shù)據(jù)庫中使用,那么您可以使用
          log和MySQL的批處理特性,來快速且方便地導入您地數(shù)據(jù)。當然,這樣就省去了打字的麻煩。

            LOAD DATA INFILE

            這是我們要介紹的最后一個導入數(shù)據(jù)到MySQL數(shù)據(jù)庫中的方法。這個命令與MySQLimport非常相似,但這個方法可以在MySQL命令行中使用。也就是說您可以在所有使用API的程序中使用這個命令。使用這種方法,您就可以在應用程序中導入您想要導入的數(shù)據(jù)。

            使用這個命令之前,MySQLd進程(服務)必須已經(jīng)在運行。

            啟動MySQL命令行:

            bin/MySQL –p

            按提示輸入密碼,成功進入MySQL命令行之后,輸入下面的命令:

            USE Meet_A_Geek;

            LOAD DATA INFILE "/home/mark/data.sql" INTO TABLE Orders;

            簡單的講,這樣將會把文件data.sql中的內容導入到表Orders中,如MySQLimport工具一樣,這個命令也有一些可以選擇的參數(shù)。比如您需要把自己的電腦上的數(shù)據(jù)導入到遠程的數(shù)據(jù)庫服務器中,您可以使用下面的命令:

            LOAD DATA LOCAL INFILE "C:\MyDocs\SQL.txt" INTO TABLE Orders;

          上面的LOCAL參數(shù)表示文件是本地的文件,服務器是您所登陸的服務器。

            這樣就省去了使用ftp來上傳文件到服務器,MySQL替你完成了.

            您也可以設置插入語句的優(yōu)先級,如果您要把它標記為低優(yōu)先級(LOW_PRIORITY),那么MySQL將會等到?jīng)]有其他人讀這個表的時候,才把插入數(shù)據(jù)。可以使用如下的命令:

            LOAD DATA LOW_PRIORITY INFILE "/home/mark/data.sql" INTO TABLE Orders;

            您也可以指定是否在插入數(shù)據(jù)的時候,取代或者忽略文件與數(shù)據(jù)表中重復的鍵值。替代重復的鍵值的語法:

            LOAD DATA LOW_PRIORITY INFILE "/home/mark/data.sql" REPLACE INTO TABLE Orders;

            上面的句子看起來有點笨拙,但卻把關鍵字放在了讓您的剖析器可以理解的地方。

            下面的一對選項描述了文件的記錄格式,這些選項也是在MySQLimport工具中可以用的。他們在這里看起來有點不同。首先,要用到FIELDS關鍵字,如果用到這個關鍵字,MySQL剖析器希望看到至少有下面的一個選項:

            TERMINATED BY character

            ENCLOSED BY character

            ESCAPED BY character

            這些關鍵字與它們的參數(shù)跟MySQLimport中的用法是一樣的. The

            TERMINATED BY 描述字段的分隔符,默認情況下是tab字符(\t)

            ENCLOSED BY描述的是字段的括起字符。比方以引號括起每一個字段。

            ESCAPED BY 描述的轉義字符。默認的是反些杠(backslash:\ ).

            下面仍然使用前面的MySQLimport命令的例子,用LOAD DATA INFILE語句把同樣的文件導入到數(shù)據(jù)庫中:

            LOAD DATA INFILE "/home/mark/Orders.txt" REPLACE INTO TABLE Orders FIELDS TERMINATED BY ','   ENCLOSED BY '"';

            LOAD DATA INFILE語句中有一個MySQLimport工具中沒有特點:

            LOAD DATA INFILE 可以按指定的列把文件導入到數(shù)據(jù)庫中。

            當我們要把數(shù)據(jù)的一部分內容導入的時候,這個特點就很重要。比方說,我們要從Access數(shù)據(jù)庫升級到MySQL數(shù)據(jù)庫的時候,需要加入一些欄目(列/字段/field)到MySQL數(shù)據(jù)庫中,以適應一些額外的需要。

            這個時候,我們的Access數(shù)據(jù)庫中的數(shù)據(jù)仍然是可用的,但是因為這些數(shù)據(jù)的欄目(field)與MySQL中的不再匹配,因此而無法再使用
          MySQLimport工具。盡管如此,我們仍然可以使用LOAD DATA
          INFILE,下面的例子顯示了如何向指定的欄目(field)中導入數(shù)據(jù):

            LOAD DATA INFILE "/home/Order.txt" INTO TABLE Orders(Order_Number, Order_Date, Customer_ID);

            如您所見,我們可以指定需要的欄目(fields)。這些指定的字段依然是以括號括起,由逗號分隔的,如果您遺漏了其中任何一個,MySQL將會提醒您^_^

            Importing Data from Microsoft Access (從Access中導入數(shù)據(jù),略)

            您可以看到MySQL有很多可以導入數(shù)據(jù)的方法,然而這些只是數(shù)據(jù)傳輸中的一半。另外的一般是從MySQL數(shù)據(jù)庫中導出數(shù)據(jù)。有許多的原因我們需要導
          出數(shù)據(jù)。一個重要的原因是用于備份數(shù)據(jù)庫。數(shù)據(jù)的造價常常是昂貴的,需要謹慎處理它們。經(jīng)常地備份可以幫助防止寶貴數(shù)據(jù)地丟失;另外一個原因是,也許您希
          望導出數(shù)據(jù)來共享。 在這個信息技術不斷成長的世界中,共享數(shù)據(jù)變得越來越常見。

            比方說Macmillan
          USA維護護著一個將要出版的書籍的大型數(shù)據(jù)庫。這個數(shù)據(jù)庫在許多書店之間共享,這樣他們就知道哪些書將會很快出版。醫(yī)院越來越走向采用無紙病歷記錄,這
          樣這些病歷可以隨時跟著你。世界變得越來越小,信息也被共享得越來越多。有很多中導出數(shù)據(jù)得方法,它們都跟導入數(shù)據(jù)很相似。因為,畢竟,這些都只是一種透
          視得方式。從數(shù)據(jù)庫導出的數(shù)據(jù)就是從另一端導入的數(shù)據(jù)。這里我們并不討論其他的數(shù)據(jù)庫各種各樣的導出數(shù)據(jù)的方法,您將學會如何用MySQL來實現(xiàn)數(shù)據(jù)導
          出。

          使用MySQLdump:

            MySQLdump命令位于MySQL/bin/目錄中

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

            因此,如果您像裝載整個數(shù)據(jù)庫Meet_A_Geek的內容到一個文件中,可以使用下面的命令:

            bin/MySQLdump –p Meet_A_Geek > MeetAGeek_Dump_File.txt

            這個語句也允許您指定一個表進行dump(備份/導出/裝載?)。如果您只是希望把數(shù)據(jù)庫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數(shù)據(jù)庫的時候不會出錯,因為每次導回的時候,都會首先檢查表是否存在,存在就刪除

            --add-locks

            這個選項會在INSERT語句中捆上一個LOCK TABLE和UNLOCK TABLE語句。這就防止在這些記錄被再次導入數(shù)據(jù)庫時其他用戶對表進行的操作

            -c or - complete_insert

            這個選項使得MySQLdump命令給每一個產生INSERT語句加上列(field)的名字。當把數(shù)據(jù)導出導另外一個數(shù)據(jù)庫時這個選項很有用。

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

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

            -f or -force 使用這個選項,即使有錯誤發(fā)生,仍然繼續(xù)導出

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

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

            -t or -no-create- info

            這個選項使的MySQLdump命令不創(chuàng)建CREATE TABLE語句,這個選項在您只需要數(shù)據(jù)而不需要DDL(數(shù)據(jù)庫定義語句)時很方便。

            -d or -no-data 這個選項使的MySQLdump命令不創(chuàng)建INSERT語句。

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

            --opt 此選項將打開所有會提高文件導出速度和創(chuàng)造一個可以更快導入的文件的選項。

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

            -T path or -tab = path
          這個選項將會創(chuàng)建兩個文件,一個文件包含DDL語句或者表創(chuàng)建語句,另一個文件包含數(shù)據(jù)。DDL文件被命名為table_name.sql,數(shù)據(jù)文件被命
          名為table_name.txt.路徑名是存放這兩個文件的目錄。目錄必須已經(jīng)存在,并且命令的使用者有對文件的特權。

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

            如前面所講的,您可以使用這一選項來過篩選將要放到導出文件的數(shù)據(jù)。

            假定您需要為一個表單中要用到的帳號建立一個文件,經(jīng)理要看今年(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.

            一組以數(shù)據(jù)定義語言來表達的語句集,該語句集完整地描述了數(shù)據(jù)庫的結構。

          SELECT INTO OUTFILE :

            如果您覺得MySQLdump工具不夠酷,就使用SELECT INTO OUTFILE吧, MySQL同樣提供一個跟LOAD DATA
          INFILE命令有相反作用的命令,這就是SELECT INTO OUTFILE
          命令,這兩個命令有很多的相似之處。首先,它們有所有的選項幾乎相同。現(xiàn)在您需要完成前面用MySQLdump完成的功能,可以依照下面的步驟進行操作:

            1. 確保MySQLd進程(服務)已經(jīng)在運行

            2. cd /usr/local/MySQL

            3. bin/MySQLadmin ping ;// 如果這個句子通不過,可以用這個:MySQLadmin -u root -p ping

          MySQLadmin ping用于檢測MySQLd的狀態(tài),is alive說明正在運行,出錯則可能需要用戶名和密碼。

            4. 啟動MySQL 監(jiān)聽程序.

            5. bin/MySQL –p Meet_A_Geek;// 進入MySQL命令行,并且打開數(shù)據(jù)庫Meet_A_Geek,需要輸入密碼

            6. 在命令行中,輸入一下命令:

            SELECT * INTO OUTFILE '/home/mark/Orders.txt'

            FIELDS

            TERMINATED BY = ','

            FROM Orders

            WHERE Order_Date >= '2000-01-01'

            在你按了Return(回車)之后,文件就創(chuàng)建了。這個句子就像一個規(guī)則的SELECT語句,只是把想屏幕的輸出重定向到了文件中。這意味這您可以使用JOIN來實現(xiàn)多表的高級查詢。這個特點也可以被用作一個報表產生器。

            比方說,您可以組合這一章中討論的方法來產生一個非常有趣的查詢,試試這個:

            在MySQL目錄建立一個名為Report_G.rpt 的文本文件,加入下面的行:

            USE Meet_A_Geek;

            INSERT INTO Customers (Customer_ID, Last_Name, First_Name)

            VALUES (NULL, "Kinnard", "Vicky");

            INSERT INTO Customers (Customer_ID, Last_Name, First_Name)

            VALUES (NULL, "Kinnard", "Steven");

            INSERT INTO Customers (Customer_ID, Last_Name, First_Name)

            VALUES (NULL, "Brown", "Sam");

            SELECT Last_Name INTO OUTFILE '/home/mark/Report.rpt'

            FROM Customers WHERE Customer_ID > 1;

            然后確認 MySQL進程在運行,并且您在MySQL目錄中, 輸入下面的命令:

            bin/MySQL

          posted on 2006-09-22 16:45 奇葛格 閱讀(6044) 評論(1)  編輯  收藏 所屬分類: 數(shù)據(jù)庫|Oracle,Mysql

          評論

          # re: mysqlimport的用法[引] 2007-12-02 11:18 ccj
          Can't get stat 那個加--local幫我大忙了,謝謝……
          QQ 408985556  回復  更多評論
            

          主站蜘蛛池模板: 大冶市| 伊通| 绵阳市| 满城县| 射阳县| 康马县| 郎溪县| 靖西县| 元阳县| 师宗县| 霸州市| 军事| 隆德县| 云和县| 临沂市| 靖江市| 福建省| 娱乐| 会宁县| 泸州市| 鸡东县| 石嘴山市| 河池市| 巢湖市| 鄂温| 常德市| 北辰区| 中牟县| 迭部县| 肇庆市| 裕民县| 蚌埠市| 北流市| 新竹市| 土默特左旗| 翁牛特旗| 安徽省| 抚州市| 栾川县| 霍山县| 余干县|