我有一個網頁應用程序,它已經寫入了假設autocommit已經在數據庫上打開了,所以我不想在那裏做任何改變。然而,我所能找到的所有文檔似乎只是談論在數據庫上使用init_connect,即所有客戶端連接的全局設置。如何關閉MySQL客戶端的自動提交功能?
有沒有辦法在Linux命令行上運行mysql時(而不必每次都鍵入)設置autocommit = 0?
我有一個網頁應用程序,它已經寫入了假設autocommit已經在數據庫上打開了,所以我不想在那裏做任何改變。然而,我所能找到的所有文檔似乎只是談論在數據庫上使用init_connect,即所有客戶端連接的全局設置。如何關閉MySQL客戶端的自動提交功能?
有沒有辦法在Linux命令行上運行mysql時(而不必每次都鍵入)設置autocommit = 0?
也許最好的方法是編寫一個啓動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
這是完美的,歡呼!我已經配置了默認的用戶名,密碼等MySQL,所以我不需要通過它。似乎無法對代碼進行格式化,儘管Meta說了什麼,所以請隨時將其添加到主響應中。我期望的腳本是: spawn/usr/local/mysql/bin/mysql期望「mysql>」send「set autocommit = 0; \ r」expect「mysql>」interact – 2010-02-22 11:30:05
Thanks - if by format the code「you意思是在評論中,那麼沒有沒有可用的格式。我會將您的代碼添加到答案中 – DeveloperChris 2010-02-22 22:06:48
你的意思是mysql文本控制檯嗎?然後:
START TRANSACTION;
...
your queries.
...
COMMIT;
是我推薦的。
但是,如果您想避免每次需要運行這種查詢時輸入此內容,請將以下內容添加到my.cnf文件的[mysqld]部分。
init_connect='set autocommit=0'
這將設置autocommit
爲每個客戶端,但是。
這並不關閉自動提交,我想要的東西,我甚至不必輸入每一個會話,更不用說每一塊DML。 – 2010-02-19 11:10:02
對不起,我應該更仔細地閱讀你的文章。據我所知,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
@ e4c5我正在尋找這個。謝謝。 – codeMan 2015-01-22 12:23:46
你在3種不同的方式做到這一點:
你做一個INSERT
之前,總是發出BEGIN;
聲明。這將關閉自動提交。一旦您希望將數據保存在數據庫中,您將需要執行COMMIT;
。
每次您實例化數據庫連接時都使用autocommit=0;
。
對於全局設置,請在您的my.cnf
配置文件中的MySQL中添加一個autocommit=0
變量。
看起來你可以將它添加到你的〜/ .my.cnf,但它需要在你的[客戶]部分添加作爲參數到init命令的標誌,像所以:
[client]
init-command='set autocommit=0'
期望方法也可以工作,這只是更乾淨。順便說一句,這是爲MySQL 5.5,不知道它是否適用於早期版本。 – rascalking 2012-07-31 18:45:26
對我的5.5或5.6實例沒有影響 – auval 2014-05-31 20:04:02
這對我在MySQL 5上工作。5通過添加到/etc/my.cnf來運行在Ubuntu 14.4上。 – 2015-04-12 08:07:57
而不是在還原時,你已經可以轉儲在包含所有必要的陳述權到您的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
這是爲了檢查狀態有用自動提交;
select @@autocommit;
做這項工作: init_connect = '設置自動提交= 0' – 2010-02-17 12:46:53
否,即對於mysqld的一個參數或命令行參數。我正在談論的MySQL客戶端,它給出的錯誤「MySQL:未知變量'init_connect =設置autocommit = 0'」 – 2010-02-17 14:29:37