Esta pregunta se puede solucionar de variadas maneras, sin embargo te enseñamos la que para nosotros es la solución más completa.
Solución:
Otra forma de hacerlo sería la siguiente. Sin embargo, tenga en cuenta que debe tener privilegios de root en la base de datos de destino para importar filas en mysql.proc:
mysqldump --compact --no-create-info --where="db='yourdatabasename' AND type='PROCEDURE' AND name IN ('yoursp1', 'yoursp2')" --databases mysql --tables proc
Para responder a su pregunta exacta: no.
Pero esto probablemente te dará lo que quieres.
Echa un vistazo a SHOW CREATE PROCEDURE
y SHOW CREATE FUNCTION
:
http://dev.mysql.com/doc/refman/5.0/en/show-create-procedure.html
http://dev.mysql.com/doc/refman/5.0/en/show-create-function.html
Esos comandos le permiten volcar el código de una rutina a la vez.
Es posible volcar una sola función o procedimiento usando el comando que mencionó Ike Walker, pero el SHOW CREATE PROCEDURE
y SHOW CREATE FUNCTION
Los comandos no permiten seleccionar solo unas pocas columnas de la salida.
Aquí hay un ejemplo de una línea de comando por lotes de Windows para volcar un solo procedimiento, usando la tabla del sistema 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
Esto redirigirá la salida de mysql al archivo. miprocedimiento.sql.
Él --batch
La opción le dice al cliente mysql que elimine los bordes de la tabla de la salida. Él --skip-column-names
La opción elimina los encabezados de columna de la salida. Él --raw
La opción le dice a MySQL que no escape los caracteres especiales en la salida, manteniendo las nuevas líneas como están en lugar de reemplazarlas con n
.
Y si desea volcar TODOS los procedimientos en diferentes archivos, este ejemplo por lotes debería funcionar:
dump-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
)
Funciona en 2 pasos, donde primero vuelca la lista de todos los procedimientos en el archivo procedimientos.csvy luego itera en cada línea y usa los nombres de los procedimientos para volcar cada procedimiento en un archivo diferente.
En este ejemplo, también estoy usando la opción –defaults-archivo-extra, donde algunos parámetros de configuración se establecen en un archivo diferente y permite invocar el comando sin necesidad de escribir la contraseña cada vez o escribir la contraseña dentro del propio lote. He creado un archivo con este contenido.
miconfig.cnf
[client]
host=localhost
port=3306
user=myusername
password=mypassword
Esta solución también funciona con función, definiendo la variable tipo_rutina para:
set routine_type=FUNCTION
Si guardas alguna incertidumbre y capacidad de acrecentar nuestro ensayo puedes realizar un paráfrasis y con mucho placer lo ojearemos.