因此我们有许多从出口中产生的例程。我们经常需要在CLI中进行这些操作,进行更改并将其重新导入。是的,其中一些由不同的人管理,需要更好的更改控制,但目前情况就是如此。
如果我这样做:
mysqldump --routines --no-create-info --no-data --no-create-db
然后很好,我有200个功能。我需要通过一个文件找到我想要的那个或一组。
有没有我想要的mysqldump例程,就像表格一样?
答案 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 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
这些命令允许您一次转储一个例程的代码。
答案 2 :(得分:4)
可以使用Ike Walker提到的命令转储单个函数或过程,但SHOW CREATE PROCEDURE
和SHOW 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)
这就是把戏,
在本地创建数据库。
将您的数据库包括您的商店程序转储到本地。 要么 只需使用 mysql*yog 并复制数据库,检查 STORE PROCEDURE(例如:1 个存储过程)到本地服务器。
转储您的 DATABASE local 。是的,您的转储中有 1 个存储过程。如果您只想要 sp/events,请记住使用 --routine。
诡计很有趣,不是偷懒,只是被骗了。