web-dev-qa-db-fra.com

Comment désactiver l'auto-validation pour un client MySQL?

J'ai une application Web qui a été écrite avec l'hypothèse qu'autocommit est activé sur la base de données, je ne souhaite donc pas y apporter de modifications. Cependant, toute la documentation que je trouve ne semble parler que d’initialiser init_connect sur la base de données, c’est-à-dire un paramètre global pour toutes les connexions client.

Existe-t-il un moyen de définir autocommit = 0 uniquement lorsque vous exécutez mysql sur une ligne de commande Linux (sans avoir à le taper à chaque fois)?

29
Michael Hinds

Le meilleur moyen est peut-être d'écrire un script qui lance le client en ligne de commande mysql, puis lance automatiquement le fichier SQL que vous voulez avant de vous en donner le contrôle.

linux est livré avec une application appelée 'expect'. il interagit avec le shell de manière à imiter vos frappes principales. il peut être configuré pour démarrer mysql, attendez que vous entriez votre mot de passe. exécutez d’autres commandes telles que SET autocommit = 0;, puis passez en mode interactif pour pouvoir exécuter la commande de votre choix.

pour plus d'informations sur la commande SET autocommit = 0;, voir .. http://dev.mysql.com/doc/refman/5.0/fr/innodb-transaction-model.html

J'utilise normalement s'attendre à me connecter à un utilitaire de ligne de commande dans le cas où il démarre ssh, se connecte au serveur distant, lance l'application entre mon nom d'utilisateur et mon mot de passe, puis me redonne le contrôle. me sauve des tas de dactylographie :)

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

DC

Script attendu fourni par Michael Hinds

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

attendre est assez puissant et peut rendre la vie beaucoup plus facile comme dans ce cas. 

si vous voulez que le script s'exécute sans appel, utilisez la ligne Shebang

insérez ceci comme première ligne de votre script (astuce: utilisez which expect pour trouver l'emplacement de votre exécutable attendu)

#! /usr/bin/expect

puis changez les permissions de votre script avec ..

chmod 0744 myscript

puis appelez le script

./myscript

DC

24
DeveloperChris

Vous faites cela de 3 manières différentes:

  1. Avant de faire une INSERT, émettez toujours une instruction BEGIN;. Cela désactivera les autocommits. Vous devrez faire un COMMIT; lorsque vous souhaitez que vos données soient conservées dans la base de données.

  2. Utilisez autocommit=0; chaque fois que vous instanciez une connexion à une base de données.

  3. Pour un paramètre global, ajoutez une variable autocommit=0 dans votre fichier de configuration my.cnf dans MySQL.

20
nanda

Il semble que vous puissiez l'ajouter à votre ~/.my.cnf, mais il doit être ajouté comme argument à l'indicateur init-command de votre section [client], comme suit:

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

Voulez-vous dire la console de texte mysql? Ensuite:

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

Est ce que je recommande. 

Toutefois, si vous souhaitez éviter de taper ceci chaque fois que vous devez exécuter ce type de requête, ajoutez ce qui suit à la section [mysqld] de votre fichier my.cnf.

init_connect='set autocommit=0'

Ceci définirait autocommit pour être désactivé pour chaque client cependant. 

4
e4c5

Ceci est utile pour vérifier le statut de autocommit;

select @@autocommit;
1
PodTech.io

Au lieu de désactiver l'auto-validation manuellement au moment de la restauration, vous pouvez déjà vider vos données MySQL de manière à inclure toutes les instructions nécessaires directement dans votre fichier SQL. 

Le paramètre de ligne de commande pour mysqldump est --no-autocommit. Vous pouvez également envisager d’ajouter --opt qui définit une combinaison d’autres paramètres pour accélérer les opérations de restauration.

Voici un exemple de ligne de commande mysqldump complète telle que je l’utilise, contenant --no-autocommit et --opt:

mysqldump -hlocalhost -uMyUser -p'MyPassword' --no-autocommit --opt --default-character-set=utf8 --quote-names  MyDbName  >  dump.sql

Pour plus de détails sur ces paramètres, voir la référence de mysqldump

0
Jpsy