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)?
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
Vous faites cela de 3 manières différentes:
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.
Utilisez autocommit=0;
chaque fois que vous instanciez une connexion à une base de données.
Pour un paramètre global, ajoutez une variable autocommit=0
dans votre fichier de configuration my.cnf
dans MySQL.
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'
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.
Ceci est utile pour vérifier le statut de autocommit;
select @@autocommit;
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