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

6psbrbz9  于 2023-04-10  发布在  Mysql
关注(0)|答案(6)|浏览(231)

因此,我们有很多导出的例程。我们经常需要在CLI中获取这些例程,进行更改,然后将其重新导入。是的,其中一些例程由不同的人管理,需要更好的更改控制,但目前情况就是这样。
如果我这样做:

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

那么太好了,我有200个函数。我需要通过一个文件来找到我想要的一个或一套。
是否有任何我想要的mysqldump例程,就像表一样?

ujv3wf0j

ujv3wf0j1#

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

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

bkkx9g8r2#

回答你的问题:不是。
但这可能会给予你你想要的。
看看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
这些命令允许您一次转储一个例程的代码。

zzoitvuj

zzoitvuj3#

可以使用Ike步行者提到的命令转储单个函数或过程,但是SHOW CREATE PROCEDURESHOW 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替换它们。
如果你想把所有的程序都转储到不同的文件中,这个例子在批处理中应该可以工作:

dump-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
v6ylcynt

v6ylcynt4#

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

58wvjzkj5#

为什么这么复杂?
这(在我看来)是导出一个过程的创建代码的最简单和最快的方法

mysql -hHOST -uUSER -pPASSWORD -B -e 'SHOW CREATE PROCEDURE DATABASE.PROCEDURE;'

如果你想用一个真实的的换行符来替换\n,只需要使用sed

mysql -hHOST -uUSER -pPASSWORD -B -e 'SHOW CREATE PROCEDURE DATABASE.PROCEDURE;' | sed 's/\\n/\n/g'
0mkxixxg

0mkxixxg6#

这是诡计
1.创建数据库到本地。
1.转储你数据库包括你的STORE PROCEDURE到本地。或者只是使用mysql*yog和复制数据库,检查STORE PROCEDURE(例如:1存储过程)到本地服务器。
1.转储你数据库本地。2是的,你有一个存储过程在你的转储。3记住使用--例程如果你只想要sp/事件。
恶作剧是有趣的,不是懒惰,只是被耍了。

相关问题