2010-03-25 4 views
7

Nous avons donc beaucoup de routines qui sortent de l'exportation. Nous avons souvent besoin de les obtenir en CLI, d'apporter des modifications, et de les ramener. Oui, certains d'entre eux sont gérés par des gens différents et un meilleur contrôle des changements est nécessaire, mais pour l'instant c'est la situation.MySQL - mysqldump --routines pour exporter seulement 1 procédure stockée (par nom) et pas toutes les routines

Si je fais:

mysqldump --routines --no-create-info --no-data --no-create-db 

alors grand, j'ai 200 fonctions. Je dois passer par un fichier pour trouver juste celui ou ensemble que je veux.

Y a-t-il des routines mysqldump pour les tables?

Répondre

13

Une autre façon de procéder est la suivante. Prenez note, cependant, que vous devez avoir les privilèges root dans la base de données cible afin d'importer des lignes dans mysql.proc:

mysqldump --compact --no-create-info --where="db='yourdatabasename' AND type='PROCEDURE' AND name IN ('yoursp1', 'yoursp2')" --databases mysql --tables proc 
+0

Pour restaurer le script créé par cette décharge, vous devrez qualifier la référence de table 'proc' pour mysql.proc manuellement. Cependant, en général, je trouve la sortie de cette méthode beaucoup plus flexible que la méthode traditionnelle mysqldump --routines. Merci! – ExStackChanger

4

Il est possible de vider une seule fonction ou procédure en utilisant la commande que Ike Walker mentionné , mais les commandes SHOW CREATE PROCEDURE et SHOW CREATE FUNCTION ne permettent pas de sélectionner seulement quelques colonnes de la sortie.

Voici un exemple d'une ligne de commande batch Windows pour vider une procédure unique, en utilisant la table système mysql.proc:

mysql --defaults-extra-file=myconfig.cnf --skip-column-names --raw --batch mydatabase -e "SELECT CONCAT('DELIMITER $$\nCREATE PROCEDURE `', specific_name, '`(', param_list, ') AS \n', body_utf8, ' $$\nDELIMITER ;\n') AS `stmt` FROM `mysql`.`proc` WHERE `db` = 'mydatabase' AND specific_name = 'myprocedure';" 1> myprocedure.sql 

Cela va rediriger la sortie de MySQL dans le fichier myprocedure.sql.

L'option --batch indique au client mysql de supprimer les bordures de table de la sortie. L'option --skip-column-names supprime les en-têtes de colonne de la sortie. L'option --raw indique à MySQL de ne pas échapper les caractères spéciaux sur la sortie, en conservant les nouvelles lignes telles quelles au lieu de les remplacer par \n.

Et si vous voulez vider toutes les procédures dans des fichiers différents, cet exemple en batch devrait fonctionner:

vidage procedures.bat

@echo off 

REM set the target database 
set database=mydatabase 

REM set the connection configuration file 
set auth=--defaults-extra-file=myconfig.cnf 

REM set the routine type you want to dump 
set routine_type=PROCEDURE 

set list_file=%routine_type%S.csv 

if "%routine_type%"=="PROCEDURE" (
set ending=AS 
) 
if "%routine_type%"=="FUNCTION" (
set ending=RETURNS ', `returns`, ' 
) 

echo Dumping %routine_type% list to %list_file% 
mysql %auth% --skip-column-names --raw %database% -e "SELECT routine_name FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = DATABASE() AND ROUTINE_TYPE = '%routine_type%';" 1> %list_file% 

for /f "tokens=*" %%a in (%list_file%) do (
    echo Dumping %routine_type% %%a 
    mysql %auth% --skip-column-names --raw --batch %database% -e "SELECT CONCAT('DELIMITER $$\nCREATE PROCEDURE `', specific_name, '`(', param_list, ') %ending% \n', body_utf8, ' $$\nDELIMITER ;\n') AS `stmt` FROM `mysql`.`proc` WHERE `db` = '%database%' AND specific_name = '%%a';" 1> %%a.sql 
) 

Il fonctionne en 2 étapes, où d'abord vide la liste de toutes les procédures dans le fichier procedures.csv, puis itère dans chaque ligne et utilise les noms des procédures pour vider chaque procédure dans un fichier différent.

Dans cet exemple, je suis également en utilisant l'option defaults-extra-file, où certains paramètres de configuration sont définis dans un fichier différent, et permet d'invoquer la commande sans avoir besoin de taper le mot de passe à chaque fois ou écrire le mot de passe dans le lot lui-même. J'ai créé un fichier avec ce contenu

myconfig.cnf

[client] 
host=localhost 
port=3306 

user=myusername 
password=mypassword 

Cette solution fonctionne aussi avec la fonction, la définition de la variable routine_type à:

set routine_type=FUNCTION 
+0

où définir cette variable% en-tête% –

+0

@ Bill.Zhuang merci pour l'observation. Cette variable provient d'une ancienne version dans laquelle j'ai défini le nom de la colonne dans une autre partie du script. J'ai testé cette nouvelle solution en remplaçant seulement le nom de la base de données et le fichier par défaut, et cela fonctionne. – carlososuna86

+0

Pour une raison quelconque, cela perd toutes les sorties échappant à des chaînes dans le corps de la procédure stockée. – badbod99

0

J'ai écrit la solution dans bash .

Pour une procédure

mysql -NB -u root my_database -e 'show create procedure `myProcedure`' |\ 
xargs -n 1 -d '\t' echo |\ 
egrep '^CREATE' |\ 
xargs --null echo -e > 

Pour toutes les procédures

mysql -NB -u root -e 'SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = "my_database" AND ROUTINE_TYPE = "PROCEDURE"' |\ 
xargs -n 1 -I {} mysql -NB -u root my_database -e 'show create procedure `{}`' |\ 
xargs -n 1 -d '\t' echo |\ 
egrep '^CREATE' |\ 
xargs --null echo -e 
Questions connexes