2013-10-20 165 views
52

我想通過Ubuntu中的命令行將大約300MB的sql文件導入MySql。我用通過命令行將大型sql文件導入MySql

source /var/www/myfile.sql; 

現在它顯示的一個看似無限行:但是它已經運行了一小會兒,現在

Query OK, 1 row affected (0.03 sec) 

。我之前沒有導入過這麼大的文件,所以我只想知道這是否正常,如果進程停滯或出現一些錯誤,這會顯示在命令行中還是將無限期地繼續進行?

感謝

+0

它將繼續在腳本中運行每個查詢,直到客戶端崩潰或mysql死亡,或者用盡查詢處理。 –

+0

如果客戶端崩潰或mysql死亡,我是否會在命令行中看到這個錯誤消息,或者它是否繼續無限並且「似乎」正在運行。我只是想知道,如果導入拖了幾個小時,我不浪費時間不重新啓動過程 – user2028856

+0

如果客戶端崩潰,你會回到shell提示符。 –

回答

99

您可以使用標準輸入這樣的導入.sql文件:

mysql -u <user> -p<password> <dbname> < file.sql

注:不應該有空間和<password>參考之間<-p>

http://dev.mysql.com/doc/refman/5.0/en/mysql-batch-commands.html

建議編輯的注意事項:此建議稍作修改,建議使用內聯密碼參數進行編輯。我可以推薦它用於腳本,但您應該知道,當您直接在參數(-p<password>)中寫入密碼時,它可能會被任何可以讀取歷史記錄文件的人的歷史記錄顯示出您的密碼。而-p要求您通過標準輸入來輸入密碼。

+0

噢,我明白了,但是我使用的方法還可以,或者是錯誤的 – user2028856

+0

對於您的方法,請參閱此處的參考資料:http://dev.mysql.com/doc/refman/5.0/en/mysql-batch-commands。 html –

+0

好吧,我明白了。根據你的經驗,通過CLI需要多長時間導入一個300MB的sql文件? – user2028856

8

+1 to @MartinNuc,您可以在批處理模式下運行mysql客戶端,然後您將看不到「長」行的「OK」行。

導入給定SQL文件所花費的時間量取決於很多事情。不僅是文件的大小,還有其中的語句類型,服務器服務器的強大程度以及同時運行多少其他事物。

@MartinNuc說他可以在4-5分鐘內加載4GB的SQL,但我已經運行了0.5GB的SQL文件,並且在較小的服務器上花了45分鐘。

我們無法真正猜出在服務器上運行SQL腳本需要多長時間。


回覆您的評論,

@MartinNuc是正確的,你可以選擇將MySQL客戶端打印每條語句。或者您可以打開第二個會話並運行mysql> SHOW PROCESSLIST以查看正在運行的內容。但是,您可能對「已完成百分比」數字或對完成剩餘陳述需要多長時間的估計感興趣。

對不起,沒有這樣的功能。 mysql客戶端不知道運行後面的語句需要多長時間,甚至不知道有多少。所以它不能給出一個有意義的估計,需要多少時間才能完成。

+0

感謝Bill的回覆,Martin提到的命令是否提供某種過程顯示或任何東西?我現在無法真正測試,因爲我必須取消當前的導入。 – user2028856

+0

'mysql --verbose'來查看每個命令。在參考http://dev.mysql.com/doc/refman/5.0/en/mysql-batch-commands.html –

+0

Bill中提到,您可以使用管道視圖實用程序來完成百分比功能....例如'sudo pv - 我1 -p -t -e DB.sql | mysql -uDB_USER -p DBANAME' – abhi

45

關於導入大文件花費時間的問題,最重要的是需要更多時間,因爲默認設置是「autocommit = true」,所以在導入文件之前必須將其設置爲off,然後檢查導入如何像gem一樣工作。 ..

首先打開MySQL的:

的mysql -u根-p

然後,你只需要做如下:

mysql>use your_db

mysql>SET autocommit=0 ; source the_sql_file.sql ; COMMIT ;

+0

這是非常cooooool。我喜歡。也是一條信息。用下面的方法將所有的sql文件收集到一個sql文件中:cat * .sql >> all_data.sql這非常有用。我現在正在導入3.5G文件:)不要忘記表格必須是MyIsam。 – kodmanyagha

+0

表xxx不退出...爲什麼 –

+0

導入完成後,是不是自動提交回到'SET autocommit = 1;'? – machineaddict

0

我用於大型sql還原的解決方案是一個mysqldumpsplitter腳本。我將我的sql.gz分割成單獨的表格。然後加載類似mysql工作臺的東西,並將其作爲恢復到所需的模式進行處理。

這裏是腳本 https://github.com/kedarvj/mysqldumpsplitter

這適用於更大的SQL恢復,我在一個網站上我的工作與平均是2.5GB sql.gz文件,20GB無壓縮〜100Gb的一次全面恢復

相關問題