E 'possibile scaricare una singola funzione o una procedura utilizzando il comando che Ike Walker menzionato , ma i comandi SHOW CREATE PROCEDURE
e SHOW CREATE FUNCTION
non consentono di selezionare solo poche colonne dall'output.
Ecco un esempio di una riga di comando batch di Windows per scaricare una procedura unica, utilizzando la tabella di 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
Ciò reindirizzare l'output di mysql nel file myprocedure.sql.
L'opzione --batch
indica al client mysql di rimuovere i bordi della tabella dall'output. L'opzione --skip-column-names
rimuove le intestazioni di colonna dall'output. L'opzione --raw
dice a MySQL di non sfuggire ai caratteri speciali sull'output, mantenendo le nuove linee come invece di sostituirli con \n
.
E se si desidera eseguire il dump tutte le procedure in file diversi, questo esempio nel lotto dovrebbe funzionare:
discarica-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
)
Funziona in 2 passi, dove si prima scarica l'elenco di tutte le procedure nel file procedure.csv, quindi itera su ogni riga e utilizza i nomi delle procedure per scaricare ciascuna procedura in un file diverso.
In questo esempio, sto anche utilizzando l'opzione --defaults-extra-file, dove alcuni parametri di configurazione sono impostati in un file diverso e consente di richiamare il comando senza dover digitare la password ogni volta o scrivere la password all'interno del batch stesso. Ho creato un file con questo contenuto
myconfig.cnf
[client]
host=localhost
port=3306
user=myusername
password=mypassword
Questa soluzione funziona anche con la funzione, definendo la variabile routine_type a:
set routine_type=FUNCTION
Per ripristinare lo script creato da questa discarica, è necessario qualificare il riferimento tabella 'proc' a mysql.proc manualmente. Tuttavia, in generale, trovo l'output di questo metodo molto più flessibile rispetto al metodo tradizionale mysroulette --routine. Grazie! – ExStackChanger