如何关闭MySQL客户端的自动提交?
我有一个web应用程序,它是在数据库上打开自动提交的假设下编写的,所以我不想在那里做任何更改。然而,我所能找到的所有文档似乎只讨论在数据库上使用init_connect,即所有客户端连接的全局设置如何关闭MySQL客户端的自动提交?,mysql,client,autocommit,Mysql,Client,Autocommit,我有一个web应用程序,它是在数据库上打开自动提交的假设下编写的,所以我不想在那里做任何更改。然而,我所能找到的所有文档似乎只讨论在数据库上使用init_connect,即所有客户端连接的全局设置 只有在Linux命令行上运行mysql时(不必每次都输入),有没有办法设置autocommit=0?你是说mysql文本控制台吗?然后: START TRANSACTION; ... your queries. ... COMMIT; 这是我推荐的 但是,如果您希望避免每次需要运行此类查
只有在Linux命令行上运行mysql时(不必每次都输入),有没有办法设置autocommit=0?你是说mysql文本控制台吗?然后:
START TRANSACTION;
...
your queries.
...
COMMIT;
这是我推荐的
但是,如果您希望避免每次需要运行此类查询时都键入此内容,请将以下内容添加到my.cnf文件的[mysqld]部分
init_connect='set autocommit=0'
这将为每个客户端设置
autocommit
您可以通过三种不同的方式来实现:
插入之前,请始终发出开始代码>语句。这将关闭自动提交。您将需要执行提交代码>一旦您希望将数据持久化到数据库中
autocommit=0代码>每次实例化数据库连接时
my.cnf
配置文件中添加一个autocommit=0
变量也许最好的方法是编写一个脚本,启动mysql命令行客户机,然后在将控制权移交给您之前自动运行您想要的任何sql linux附带了一个名为“expect”的应用程序。它与shell的交互方式可以模仿您的按键。可以设置为启动mysql,等待您输入密码。运行进一步的命令,例如
SET autocommit=0代码>然后进入交互模式,以便您可以运行所需的任何命令
有关命令SET autocommit=0的详细信息代码>请参见
我使用expect登录到命令行实用程序,在我的情况下,它启动ssh,连接到远程服务器,启动应用程序,输入我的用户名和密码,然后将控制权移交给我。为我节省大量的打字时间:)
直流电
请期待Michael Hinds提供的脚本
spawn /usr/local/mysql/bin/mysql
expect "mysql>"
send "set autocommit=0;\r"
expect "mysql>" interact
expect功能非常强大,可以让生活变得更加轻松
如果希望在不调用expect的情况下运行脚本,请使用shebang行
将其作为脚本的第一行插入(提示:使用whichexpect
查找expect可执行文件的位置)
然后使用..更改脚本的权限
chmod 0744 myscript
然后调用脚本
./myscript
DC看起来您可以将其添加到~/.my.cnf中,但需要将其作为参数添加到[client]部分的init命令标志中,如下所示:
[client]
init-command='set autocommit=0'
您不必在恢复时手动关闭自动提交,而是可以将MySQL数据转储到包含所有必要语句的SQL文件中
mysqldump的命令行参数是--无自动提交
。您还可以考虑添加<代码> -opt<代码>,它设置了其他参数的组合以加快恢复操作。
下面是我使用的完整mysqldump命令行的示例,其中包含--no autocommit
和--opt
:
mysqldump -hlocalhost -uMyUser -p'MyPassword' --no-autocommit --opt --default-character-set=utf8 --quote-names MyDbName > dump.sql
有关这些参数的详细信息,请参见这有助于检查自动提交的状态
select @@autocommit;
对于“自动提交关闭”,请务必使用下面的命令。在my.cnf
文件中设置如下:
[mysqld]
autocommit=0
这是否有效:init_connect='set autocommit=0'否,这是mysqld的参数或命令行参数。我说的是mysql客户端,它给出的错误“mysql:unknown variable'init_connect=set autocommit=0'”并没有关闭autocommit,而且我想要的东西即使在每个会话中都不必键入,更不用说每个DML了。对不起,我应该更仔细地阅读你的帖子。据我所知,autocommit不能作为init connect参数传递,因为它是一个全局变量。正如您所知,全局变量只能由超级用户设置。现在,第22条:超级用户不允许使用手册中的init_connect设置相关页面:(向下滚动,直到到达--init connect部分)@e4c5我正是在寻找这个。谢谢。太好了,干杯!我已经用默认用户名、密码等配置了MySQL,所以我不需要传递这些。不管meta怎么说,似乎都无法格式化代码,所以可以将其添加到主响应中。我的expect脚本是:spawn/usr/local/mysql/bin/mysql expect“mysql>”send“set autocommit=0;\r“expect”mysql>“interactionThank-如果您在评论中所说的“格式化代码”,那么没有可用的格式化。我会将您的代码添加到答案中expect方法也可以,这只是更简洁而已。顺便说一句,这是针对mysql 5.5的,不确定它是否适用于早期版本。通过添加到/etc/my.cnf,这对我在运行于Ubuntu 14.4的mysql 5.5上的工作是有效的。我建议将此设置添加到[mysql]
部分。如果在[client]
中,我在使用mysqldump时得到未知变量的错误。在MySQL 5.6上测试,您可以使用此命令更改状态:set@@autocommit=0
autocommit=0
在~/.my.cnf
不适用于mysql-5.7.33
,我得到以下错误:mysql:[error]未知变量“autocommit=0”
init command='set autocommit=0'
与另一个答案中的情况相同
[mysqld]
autocommit=0