MySQL - mysqldump --routines экспортировать только 1 хранимую процедуру (по имени), а не каждую процедуру - PullRequest
7 голосов
/ 25 марта 2010

Итак, у нас есть много процедур, которые возникают при экспорте. Нам часто нужно выводить их в CLI, вносить изменения и возвращать их обратно. Да, некоторые из них управляются разными людьми, и требуется лучший контроль изменений, но на данный момент это ситуация.

Если я это сделаю:

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

тогда отлично, у меня 200 функций. Мне нужно пройти через файл, чтобы найти только один или набор, который я хочу.

Есть ли в любом случае подпрограммы mysqldump, которые я хочу, как для таблиц?

Ответы [ 4 ]

13 голосов
/ 16 августа 2011

Другим способом было бы следующее. Однако обратите внимание, что для импорта строк в mysql.proc необходимо иметь привилегии root в целевой базе данных:

mysqldump --compact --no-create-info --where="db='yourdatabasename' AND type='PROCEDURE' AND name IN ('yoursp1', 'yoursp2')" --databases mysql --tables proc
4 голосов
/ 02 сентября 2014

Можно вывести одну функцию или процедуру с помощью команды, упомянутой Айк Уокер, но команды SHOW CREATE PROCEDURE и SHOW CREATE FUNCTION не позволяют выбрать только несколько столбцов из вывода.

Вот пример пакетной командной строки Windows для выгрузки одной процедуры с использованием системной таблицы 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

Это перенаправит вывод mysql в файл myprocedure.sql .

Опция --batch указывает клиенту mysql удалить границы таблицы из выходных данных. Опция --skip-column-names удаляет заголовки столбцов из вывода. Опция --raw указывает MySQL не экранировать специальные символы в выводе, сохраняя новые строки как есть, вместо замены их на \n.

И если вы хотите сбросить ВСЕ процедуры в разные файлы, этот пример в пакетном режиме должен работать:

дамп-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
)

Он работает в 2 этапа, где сначала выдает список всех процедур в файл процедуры.csv , а затем выполняет итерацию в каждой строке и использует имена процедур для вывода каждой процедуры в другой файл.

В этом примере я также использую опцию - defaults-extra-file , где некоторые параметры конфигурации установлены в другом файле, и позволяет вызывать команду без необходимости ввода пароля каждый раз или писать пароль внутри самой партии. Я создал файл с этим содержанием

myconfig.cnf

[client]
host=localhost
port=3306

user=myusername
password=mypassword

Это решение также работает с функцией, определяющей переменную рутинная_типа:

set routine_type=FUNCTION
4 голосов
/ 25 марта 2010

Чтобы ответить на ваш точный вопрос: нет.

Но это, вероятно, даст вам то, что вы хотите.

Взгляните на SHOW CREATE PROCEDURE и 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

Эти команды позволяют вам выгружать код для одной процедуры за раз.

1 голос
/ 15 сентября 2014

Я написал решение в bash.

За одну процедуру

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

Для всех процедур

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