2010-02-17 2 views
27

У меня есть веб-приложение, которое было написано с предположением, что autocommit включен в базе данных, поэтому я не хочу вносить туда никаких изменений. Однако вся документация, которую я могу найти, только говорит об использовании init_connect в базе данных, т. Е. Глобальном параметре для всех клиентских подключений.Как отключить autocommit для клиента MySQL?

Есть ли способ установить autocommit = 0 только при запуске mysql в командной строке Linux (без необходимости вводить его каждый раз)?

+0

сделал эту работу: init_connect = «установить Autocommit = 0» –

+1

Нет, это параметр или аргумент командной строки для туздЫ. Я говорю о клиенте mysql, который дает ошибку «mysql: неизвестная переменная» init_connect = set autocommit = 0 '" –

ответ

20

Возможно, лучший способ - написать скрипт, который запускает клиент командной строки 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

Ожидайте сценарий предоставленный Майкл Хайндса

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 с именем пользователя по умолчанию, паролем и т. Д., Поэтому мне не нужно передавать его. Кажется, что формат не форматирует код, несмотря на то, что говорит мета, поэтому не стесняйтесь добавлять его к основному ответу. Мой сценарий ожидания: spawn/usr/local/mysql/bin/mysql ожидать «mysql>« отправить »set autocommit = 0; \ r" ожидать "mysql>" взаимодействовать –

+0

Спасибо - если по "форматировать код" вы в комментариях, то нет никакого форматирования.Я добавлю ваш код к ответу – DeveloperChris

3

Вы имеете в виду консоль текстовых сообщений mysql? Затем:

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

Является тем, что я рекомендую.

Однако, если вы не хотите набирать это каждый раз, когда вам нужно запустить такой запрос, добавьте следующее в раздел [mysqld] вашего файла my.cnf.

init_connect='set autocommit=0' 

Это позволит создать autocommit быть выключен для каждого клиента, хотя.

+0

Это не отключает автообновление, и я хочу что-то, что мне не нужно вводить даже каждый сессия, не говоря уже о каждом фрагменте DML. –

+0

Извините, я должен был внимательно прочитать ваш пост. Насколько мне известно, autocommit не является чем-то, что может пройти через параметр connect connect - это потому, что это глобальная переменная. Как вы знаете, глобальные переменные могут задаваться только суперпользователями. Теперь уловкам 22: суперпользователям не разрешено использовать страницу установки параметров установки init_connect в руководстве: http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html (прокрутка вниз, пока не дойдете до секции -init-connect) – e4c5

+0

@ e4c5 Я искал именно это. Благодарю. – codeMan

17

Вы можете сделать это в 3 различными способами:

  1. Перед тем, как сделать INSERT, всегда выдает BEGIN; заявление. Это отключит автокоманды. Вам нужно будет сделать COMMIT;, если вы хотите, чтобы ваши данные сохранялись в базе данных.

  2. Используйте autocommit=0; каждый раз, когда вы создаете соединение с базой данных.

  3. Для глобальной настройки добавьте переменную autocommit=0 в конфигурационный файл my.cnf в MySQL.

8

Похоже, вы можете добавить его в ~/.my.cnf, но оно должно быть добавлено в качестве аргумента флага инициализации-команды в вашем [клиента] раздел, как так:

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

Ожидаемый подход тоже работает, это просто чище. BTW, это для mysql 5.5, не уверен, что он работает для более ранних версий. – rascalking

+1

не влияет на мои версии 5.5 или 5.6 – auval

+0

Это работало для меня в MySQL 5.5, работающем на Ubuntu 14.4, добавив в /etc/my.cnf. –

0

Вместо переключения автоматической фиксации выключен вручную во время восстановления вы уже можете сбросить данные MySQL таким образом, что включает в себя все необходимые заявления прямо в файл SQL.

Параметр командной строки для mysqldump - --no-autocommit. Вы можете также рассмотреть возможность добавления --opt, который устанавливает комбинацию других параметров для ускорения операций восстановления.

Ниже приведен пример для полной командной туздЫшпр линии, как я использую его, содержащий --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; 
Смежные вопросы