2017-02-15 19 views
1

我試圖將大型SQL文件(> 2.5 Gb)還原到Windows上的MySQL數據庫中。導入非常大的SQL文件(MySQL)時的單次提交

我無法編輯這些文件,以便在文件的開頭添加文字(如提高導入時間所需的文件),例如SET autocommit=0;

我也無法使用source,因爲這會輸出到屏幕(非常慢),即使文件中有任何錯誤,執行也會繼續。例如:

mysql> CREATE DATABASE IF NOT EXISTS dbname; 
mysql> USE dbname; 
mysql> SET autocommit=0; 
mysql> source file.sql; 
mysql> COMMIT; 

是否可以在導入僅適用於當前會話的SQL文件之前和之後運行任意命令?我已經試過兩個以下,而在Windows上既不工作(在這兩種情況下,第二操作被忽略):

mysql -u username -p -e "SET autocommit=0;" dbname < file.sql 

,或者

mysql -u username -p < initial_commands.sql < file.sql 

如果可能的話,我不想改變全球autocommit設置每次我這樣做,然後不得不記得改回它(也不知道這將工作沒有最後的COMMIT;)。

也許有一種方法可以使用BEGIN ... COMMIT;而不是關閉autocommit?

我會很高興有人做任何建議這樣的事情!

回答

1

(回波裝置自動提交= 0; & &類型file.sql & &回波& &回聲提交;)| mysql -u用戶名-p密碼

只需使用管道代替輸入重定向,使用echo爲命令,而爲echo。適用於換行

+0

非常好,謝謝。我沒有想到你可以在窗戶上使用管道和相當於'cat'的東西! – isedwards

1

您的目標可能會適得其反。也就是說,將整個負載轉換爲單個事務可能慢於增量提交。

set autocommit=0意味着所有插入(和其他寫入)因此(直到commit)需要記錄潛在的ROLLBACK。起初,常規的日誌記錄機制可以進行一堆寫操作。但是,在某種程度上,更復雜的機制正在起作用。這涉及更多的磁盤I/O,這是數據庫中最慢的部分。

另一種方法是刪除「提交」進程的重要部分 - 用於刷新已提交事務的fsync。 innodb_flush_log_at_trx_commit控件等。對於「安全」,默認值可能是=1。很多人使用=2運行,但安全性較差,但將fsyncs限制爲每秒一次。 「不安全」的部分是,如果你有電源故障,任何在最後一秒運行的事務可能已經被確認給客戶端,實際上被持久化到磁盤。

由於該設置可能有連接之前,考慮一個簡單的3線,.bat腳本(文件)進行:

mysql -e 'SET GLOBAL innodb_flush_log_at_trx_commit = 2' 
mysql dbname < file.sql 
mysql -e 'SET GLOBAL innodb_flush_log_at_trx_commit = 1' 
+1

innodb_flush_log_at_trx_commit = 0是否比2還差? –

+1

@VladislavVaintroub - 也許。性能差異是微不足道的,所以只需使用2. –

+0

在我的簡單測試中,'autocommit = 0'的路線似乎仍然更快,但我會更多地考慮這一點... – isedwards