MySQL - mysqldump - 例程只导出1个存储过程(按名称)而不是每个例程

时间:2010-03-25 18:52:22

标签: mysql mysqldump

因此我们有许多从出口中产生的例程。我们经常需要在CLI中进行这些操作,进行更改并将其重新导入。是的,其中一些由不同的人管理,需要更好的更改控制,但目前情况就是如此。

如果我这样做:

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

然后很好,我有200个功能。我需要通过一个文件找到我想要的那个或一组。

有没有我想要的mysqldump例程,就像表格一样?

5 个答案:

答案 0 :(得分:13)

另一种解决方法是:但请注意,您必须在目标数据库中拥有root权限才能将行导入mysql.proc:

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

答案 1 :(得分:4)

回答您的确切问题:否。

但这可能会给你你想要的东西。

查看SHOW CREATE PROCEDURESHOW 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

这些命令允许您一次转储一个例程的代码。

答案 2 :(得分:4)

可以使用Ike Walker提到的命令转储单个函数或过程,但SHOW CREATE PROCEDURESHOW CREATE FUNCTION命令不允许从输出中仅选择几列。 / p>

以下是使用系统表mysql.proc转储单个过程的Windows批处理命令行示例:

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
)

它分为两步,首先将所有过程的列表转储到文件 procedures.csv 中,然后在每行中进行迭代,并使用过程的名称转储每个过程。一个不同的文件。

在这个例子中,我也使用选项 - defaults-extra-file ,其中一些配置参数设置在不同的文件中,并允许调用命令而无需键入每次密码或在批次内写密码。我创建了一个包含此内容的文件

<强> myconfig.cnf

[client]
host=localhost
port=3306

user=myusername
password=mypassword

此解决方案也适用于函数,将routine_type变量定义为:

set routine_type=FUNCTION

答案 3 :(得分:1)

我已经在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

答案 4 :(得分:0)

这就是把戏,

  1. 在本地创建数据库。

  2. 将您的数据库包括您的商店程序转储到本地。 要么 只需使用 mysql*yog 并复制数据库,检查 STORE PROCEDURE(例如:1 个存储过程)到本地服务器。

  3. 转储您的 DATABASE local 。是的,您的转储中有 1 个存储过程。如果您只想要 sp/events,请记住使用 --routine。

诡计很有趣,不是偷懒,只是被骗了。