【问题标题】:How do I turn off autocommit for a MySQL client?如何关闭 MySQL 客户端的自动提交?
【发布时间】:2011-01-17 20:06:19
【问题描述】:

我有一个 Web 应用程序,它假设自动提交已在数据库上打开,所以我不想在那里进行任何更改。然而,我能找到的所有文档似乎都只谈论在数据库上使用 init_connect,即所有客户端连接的全局设置。

有没有办法在 Linux 命令行上运行 mysql 时设置 autocommit=0(无需每次都输入)?

【问题讨论】:

  • 这项工作完成了吗:init_connect='set autocommit=0'
  • 不,那是mysqld的参数或命令行参数。我说的是mysql客户端,它给出了错误“mysql: unknown variable 'init_connect=set autocommit=0'”

标签: mysql client autocommit


【解决方案1】:

mysql中自动提交变量的默认值为1; 在 mysql 使用命令查看 autocommit 的当前值 mysql> 选择@@autocommit; 那么如果你想关闭自动提交使用命令 mysql> 设置自动提交 = 0;

【讨论】:

    【解决方案2】:

    对于自动提交关闭,请务必使用以下命令。在my.cnf文件中设置如下:

        [mysqld]
        autocommit=0
    

    【讨论】:

      【解决方案3】:

      这对于检查自动提交的状态很有用;

      select @@autocommit;
      

      【讨论】:

      • 你可以使用这个命令来改变状态:set @@autocommit=0;
      【解决方案4】:

      您无需在恢复时手动关闭自动提交,您就可以将 MySQL 数据转储到您的 SQL 文件中,其中包括所有必要的语句。

      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

      【讨论】:

        【解决方案5】:

        你是说mysql的文本控制台吗?那么:

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

        是我推荐的。

        但是,如果您不想在每次需要运行此类查询时都输入此内容,请将以下内容添加到 my.cnf 文件的 [mysqld] 部分。

        init_connect='set autocommit=0'
        

        这会将autocommit 设置为对每个客户端关闭。

        【讨论】:

        • 这不会关闭自动提交,而且我想要的东西我什至不必在每个会话中都输入,更不用说为每个 DML 片段了。
        • 对不起,我应该更仔细地阅读您的帖子。据我所知,自动提交不是可以作为初始化连接参数传递的东西 - 那是因为它是一个全局变量。如您所知,全局变量只能由超级用户设置。现在要注意 22:超级用户不允许使用手册的 init_connect 设置相关页面在这里:dev.mysql.com/doc/refman/5.0/en/server-system-variables.html(向下滚动直到您到达 --init-connect 部分)
        • @e4c5 我正在寻找这个。谢谢。
        【解决方案6】:

        您可以通过 3 种不同的方式做到这一点:

        1. 在执行INSERT 之前,请始终发出BEGIN; 语句。这将关闭自动提交。一旦您希望将数据保存在数据库中,您将需要执行COMMIT;

        2. 每次实例化数据库连接时都使用autocommit=0;

        3. 对于全局设置,在 MySQL 的 my.cnf 配置文件中添加一个 autocommit=0 变量。

        【讨论】:

        • autocommit=0 in ~/.my.cnf 不适用于mysql-5.7.33,我收到以下错误:mysql: [ERROR] unknown variable 'autocommit=0'
        • init-command='set autocommit=0' 在另一个答案中工作
        【解决方案7】:

        看起来您可以将其添加到 ~/.my.cnf,但需要将其作为参数添加到 [client] 部分中的 init-command 标志,如下所示:

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

        【讨论】:

        • expect 方法也可以,这样更简洁。顺便说一句,这是针对 mysql 5.5 的,不确定它是否适用于早期版本。
        • 通过添加到 /etc/my.cnf,这对我在 Ubuntu 14.4 上运行的 MySQL 5.5 有效。
        • 我建议将此设置添加到[mysql] 部分。如果在[client] 中使用mysqldump 时出现未知变量错误。在 MySQL 5.6 上测试
        【解决方案8】:

        也许最好的方法是编写一个脚本来启动 mysql 命令行客户端,然后在将控制权交给你之前自动运行你想要的任何 sql。

        linux 带有一个名为“expect”的应用程序。它以模仿您的击键的方式与外壳交互。可以设置启动mysql,等你输入密码。运行更多命令,例如SET autocommit = 0;,然后进入交互模式,这样你就可以运行任何你想要的命令。

        有关命令SET autocommit = 0; 的更多信息,请参阅..http://dev.mysql.com/doc/refman/5.0/en/innodb-transaction-model.html

        在我的情况下,我使用 expect 登录到命令行实用程序,它启动 ssh,连接到远程服务器,启动应用程序,输入我的用户名和密码,然后将控制权交给我。节省了我大量的打字时间:)

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

        直流

        期待 Michael Hinds 提供的脚本

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

        expect 非常强大,可以让生活变得更轻松,就像在这种情况下一样。

        如果你想让脚本在不调用期望的情况下运行,请使用 shebang 行

        将此作为脚本的第一行插入(提示:使用which expect 查找预期可执行文件的位置)

        #! /usr/bin/expect
        

        然后用..更改脚本的权限。

        chmod 0744 myscript
        

        然后调用脚本

        ./myscript
        

        直流

        【讨论】:

        • 太完美了,干杯!我已经为 MySQL 配置了默认用户名、密码等,所以我不需要传递这些。尽管 meta 说了什么,但似乎无法格式化代码,所以请随意将其添加到主要响应中。我的期望脚本是: spawn /usr/local/mysql/bin/mysql expect "mysql>" send "set autocommit=0;\r" expect "mysql>" interact
        • 谢谢 - 如果“格式化代码”是指在 cmets 中,那么没有可用的格式化。我会将您的代码添加到答案中
        猜你喜欢
        • 2018-04-27
        • 2014-01-08
        • 1970-01-01
        • 2016-09-07
        • 1970-01-01
        • 1970-01-01
        • 2016-04-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多