2010-03-25 6 views
7

Quindi abbiamo un sacco di routine che escono dall'esportazione. Spesso abbiamo bisogno di capirli in CLI, apportare modifiche e riportarli indietro. Sì, alcuni di questi sono gestiti da persone diverse e è necessario un controllo dei cambiamenti migliore, ma per ora questa è la situazione.MySQL - mysqldump --routine per esportare solo 1 stored procedure (per nome) e non tutte le routine

Se devo fare:

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

poi grande, ho 200 funzioni. Devo passare attraverso un file per trovare solo quello o l'insieme che voglio.

Esiste comunque una routine mysqldump che desidero come per le tabelle?

risposta

13

Un altro modo per ottenere questo sarebbe il seguente. Do atto, tuttavia, che è necessario disporre di privilegi di root nel database di destinazione per importare righe in mysql.proc:

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

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

4

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

dove definire questa variabile% header% –

+0

@ Bill.Zhuang grazie per l'osservazione. Quella variabile proveniva da una vecchia versione in cui ho definito il nome della colonna in un'altra parte dello script. Ho provato questa nuova soluzione sostituendo solo il nome del database e il file di default, e funziona. – carlososuna86

+0

Per qualche motivo, questo perde tutto l'output che sfugge all'interno delle stringhe nel corpo della stored procedure. – badbod99

0

ho scritto la soluzione all'interno di bash .

Per una procedura di

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

Per tutte le procedure

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