2010-02-17 78 views
27

我有一個網頁應用程序,它已經寫入了假設autocommit已經在數據庫上打開了,所以我不想在那裏做任何改變。然而,我所能找到的所有文檔似乎只是談論在數據庫上使用init_connect,即所有客戶端連接的全局設置。如何關閉MySQL客戶端的自動提交功能?

有沒有辦法在Linux命令行上運行mysql時(而不必每次都鍵入)設置autocommit = 0?

+0

做這項工作: init_connect = '設置自動提交= 0' – 2010-02-17 12:46:53

+1

否,即對於mysqld的一個參數或命令行參數。我正在談論的MySQL客戶端,它給出的錯誤「MySQL:未知變量'init_connect =設置autocommit = 0'」 – 2010-02-17 14:29:37

回答

20

也許最好的方法是編寫一個啓動mysql命令行客戶端,然後自動運行任何你想要的SQL它移交控制到你面前的腳本。

linux自帶了一個名爲'expect'的應用程序。它以與模仿你的擊鍵的方式與外殼交互。它可以設置爲啓動mysql,等待你輸入你的密碼。運行更多命令,如SET autocommit = 0;然後進入交互模式,以便您可以運行任何您想要的命令。

更多關於命令SET autocommit = 0;看到... http://dev.mysql.com/doc/refman/5.0/en/innodb-transaction-model.html

我用期待登錄到我的情況下,命令行實用程序啓動SSH,連接到遠程服務器,啓動應用程序輸入自己的用戶名和密碼然後把控制權交給我。爲我節省打字堆的:)

http://linux.die.net/man/1/expect

DC

期待邁克爾·海因茲提供的腳本

spawn /usr/local/mysql/bin/mysql 
expect "mysql>" 
send "set autocommit=0;\r" 
expect "mysql>" interact 

想到的是非常強大的,可以使生活變得更容易,因爲在這種情況下。

如果你想使腳本運行,而無需調用

希望使用家當線

插入本作中,你的腳本的第一行(提示:使用which expect找到的位置您希望可執行文件)

#! /usr/bin/expect 

然後更改腳本的權限與..

chmod 0744 myscript 

然後調用腳本

./myscript 

DC

+0

這是完美的,歡呼!我已經配置了默認的用戶名,密碼等MySQL,所以我不需要通過它。似乎無法對代碼進行格式化,儘管Meta說了什麼,所以請隨時將其添加到主響應中。我期望的腳本是: spawn/usr/local/mysql/bin/mysql期望「mysql>」send「set autocommit = 0; \ r」expect「mysql>」interact – 2010-02-22 11:30:05

+0

Thanks - if by format the code「you意思是在評論中,那麼沒有沒有可用的格式。我會將您的代碼添加到答案中 – DeveloperChris 2010-02-22 22:06:48

3

你的意思是mysql文本控制檯嗎?然後:

START TRANSACTION; 
    ... 
    your queries. 
    ... 
COMMIT; 

是我推薦的。

但是,如果您想避免每次需要運行這種查詢時輸入此內容,請將以下內容添加到my.cnf文件的[mysqld]部分。

init_connect='set autocommit=0' 

這將設置autocommit爲每個客戶端,但是。

+0

這並不關閉自動提交,我想要的東西,我甚至不必輸入每一個會話,更不用說每一塊DML。 – 2010-02-19 11:10:02

+0

對不起,我應該更仔細地閱讀你的文章。據我所知,autocommit不是可以作爲init連接參數傳遞的東西 - 這是因爲它是一個全局變量。如您所知,全局變量只能由超級用戶設置。現在catch 22:超級用戶不允許使用init_connect設置手冊的相關頁面在這裏:http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html(scroll直到你到達--init-connect部分) – e4c5 2010-02-19 12:37:34

+0

@ e4c5我正在尋找這個。謝謝。 – codeMan 2015-01-22 12:23:46

17

你在3種不同的方式做到這一點:

  1. 你做一個INSERT之前,總是發出BEGIN;聲明。這將關閉自動提交。一旦您希望將數據保存在數據庫中,您將需要執行COMMIT;

  2. 每次您實例化數據庫連接時都使用autocommit=0;

  3. 對於全局設置,請在您的my.cnf配置文件中的MySQL中添加一個autocommit=0變量。

8

看起來你可以將它添加到你的〜/ .my.cnf,但它需要在你的[客戶]部分添加作爲參數到init命令的標誌,像所以:

[client] 
init-command='set autocommit=0' 
+0

期望方法也可以工作,這只是更乾淨。順便說一句,這是爲MySQL 5.5,不知道它是否適用於早期版本。 – rascalking 2012-07-31 18:45:26

+1

對我的5.5或5.6實例沒有影響 – auval 2014-05-31 20:04:02

+0

這對我在MySQL 5上工作。5通過添加到/etc/my.cnf來運行在Ubuntu 14.4上。 – 2015-04-12 08:07:57

0

而不是在還原時,你已經可以轉儲在包含所有必要的陳述權到您的SQL文件的方式你的MySQL數據手動切換自動提交設置。

mysqldump的命令行參數是--no-autocommit。您也可以考慮添加--opt,它設置其他參數的組合來加速恢復操作。

下面是一個完整的mysqldump命令行的示例,因爲我使用它,含有--no-autocommit--opt

mysqldump -hlocalhost -uMyUser -p'MyPassword' --no-autocommit --opt --default-character-set=utf8 --quote-names MyDbName > dump.sql 

有關這些參數的細節見reference of mysqldump

1

這是爲了檢查狀態有用自動提交;

select @@autocommit;