Можно вывести одну функцию или процедуру с помощью команды, упомянутой Айк Уокер, но команды 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