我有一个网络应用程序,它是在假设数据库上打开自动提交的情况下编写的,因此我不想在那里进行任何更改。然而,我能找到的所有文档似乎都只讨论在数据库上使用 init_connect ,即所有客户端连接的全局设置。

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

有帮助吗?

解决方案

也许最好的方法是编写一个启动mysql命令行客户端,然后自动运行任何你想要的SQL它移交控制到你面前的脚本。

Linux带有称为“期望”的应用程序。它用这样的方式来模仿你的击键外壳相互作用。它可以被设置为启动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

期待通过迈克尔Hinds的提供的脚本

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

其他提示

您可以通过 3 种不同的方式执行此操作:

  1. 在你做之前 INSERT, ,总是发出一个 BEGIN; 陈述。这将关闭自动提交。你需要做一个 COMMIT; 一旦您希望将数据保留在数据库中。

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

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

看起来可以将其添加到〜/ .my.cnf,但它需要在[客户]部分被添加作为参数给init-命令标志,像这样:

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

你的意思是MySQL的文本控制台?然后:

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

是我的建议。

不过,如果你想避免这种每次你需要运行此类查询的时间打字,以下内容添加到您的my.cnf文件中的[mysqld]部分。

init_connect='set autocommit=0'

此将设置autocommit为断开为每个客户端虽然。

这是有用的,以检查自动提交的状态;

select @@autocommit;

有关自动提交关闭然后使用下面的命令是肯定的。在my.cnf文件设置如下:

    [mysqld]
    autocommit=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

有关这些参数的细节见的mysqldump的中参考

scroll top