2010-06-02 58 views
32

我想運行一個大文件導入到MySQL中。但是,我不希望它寫入二進制日誌,因爲導入需要很長時間,並導致從屬遠遠落後。事實上,我寧願將它單獨運行在奴隸身上,因爲它在系統上會更容易。所討論的表是一個新表,因此我不必擔心它會不同步,因爲主和所有從屬機器最終將具有相同的數據,因爲它們將全部導入相同的文件最終。我也不想更改任何replicate-ignore- *或binlog_ignore- *選項,因爲它們需要重新啓動相關服務器。有沒有辦法運行一個單一的查詢,而不寫入二進制日誌?如何在MYSQL中運行查詢而不寫入二進制日誌

我已經知道了答案,但我無法在網上很容易找到答案,所以我讓某人發佈答案以獲得一些重要點。如果沒有答案,我會發布我找到的答案。

回答

49

您可以使用sql-log-bin會話變量關閉當前會話的日誌記錄。只需輸入:

SET sql_log_bin = 0; 

並且當前會話的所有查詢都不會發送到二進制日誌。如果你想打開二進制日誌重新打開,運行:

SET sql_log_bin = 1; 

這僅是當前正在運行的會話你是在所有其他的連接。所有其他的查詢仍將繼續進行記錄。此外,您必須擁有SUPER權限才能使用此功能。

+1

如果我在命令行執行此操作,該工作嗎? 'mysqldump mydb | mysql -h remote.host.com remote_db' – vinhboy 2013-03-29 19:01:36

+0

是的,它的主要觀點應該是在一個mysql引發。如果你重新連接它是不同的會話。 – 2013-04-03 09:14:36

+0

您需要在mysqldump的輸出中預先添加命令。 像'echo「SET sql_log_bin = 0;」&mysqldump mydb | mysql -h remote.host.com remote_db'不知道這是否是正確的語法,但可以從此開始。 – 2013-04-03 09:18:19

17

如果你想從CLI做到這一點,試試這個,它的工作對我來說:

$ mysqldump old_DB | mysql --init-command="SET SQL_LOG_BIN = 0;" new_DB 

可能在較新的MySQL版本加入了「初始化命令」參數。