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
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