免责声明:我不是的Ruby-on-Rails的程序员
严格在MySQL方面,你基本上有两种提取存储过程(SP)和存储函数(SF)的方法。
请记住,mysql.proc和information_schema.routines为SP提供磁盘和内存中的外壳。但是,有2条SQL语句可以检索它们:SHOW CREATE PROCEDURE和SHOW CREATE FUNCTION。
第一种方法是使用mysql.proc收集所有的SP和SF,并将它们形成SQL语句以公开它们。
示例我的测试数据库中有6个SP和2个SF。以下是如何为所有8个例程生成SQL:
mysql> SELECT CONCAT('SHOW CREATE ',type,' `',db,'`.`',name,'`\\G') SQLStatements FROM mysql.proc;
+-----------------------------------------------------+
| SQLStatements |
+-----------------------------------------------------+
| SHOW CREATE PROCEDURE `test`.`CreateSampleTable`\G |
| SHOW CREATE PROCEDURE `test`.`CreateSampleTables`\G |
| SHOW CREATE PROCEDURE `test`.`GetMissingIntegers`\G |
| SHOW CREATE FUNCTION `test`.`GetTestTableCounts`\G |
| SHOW CREATE PROCEDURE `test`.`ImportWeeklyBatch`\G |
| SHOW CREATE FUNCTION `test`.`InsertName`\G |
| SHOW CREATE PROCEDURE `test`.`LoadSampleTables`\G |
| SHOW CREATE PROCEDURE `test`.`MigrateColumn`\G |
+-----------------------------------------------------+
8 rows in set (0.00 sec)
您可以遍历并收集每个存储过程和函数所需的代码。
触发器必须单独收集。
在MySQL 5.x中,您可以收集使用此查询触发器:
mysql> SELECT CONCAT('SHOW CREATE TRIGGER `',trigger_schema,'`.`',trigger_name,'`\\G') SQLStatements FROM information_schema.triggers;
+--------------------------------------------------+
| SQLStatements |
+--------------------------------------------------+
| SHOW CREATE TRIGGER `test`.`AddPermTempKey`\G |
| SHOW CREATE TRIGGER `test`.`DeletePermTempKey`\G |
+--------------------------------------------------+
或节省时间UNION两个SQL语句
mysql> SELECT CONCAT('SHOW CREATE ',type,' `',db,'`.`',name,'`\\G') SQLStatements FROM mysql.proc UNION SELECT CONCAT('SHOW CREATE TRIGGER `',trigger_schema,'`.`',trigger_name,'`\\G') SQLStatements FROM information_schema.triggers;
+-----------------------------------------------------+
| SQLStatements |
+-----------------------------------------------------+
| SHOW CREATE PROCEDURE `test`.`CreateSampleTable`\G |
| SHOW CREATE PROCEDURE `test`.`CreateSampleTables`\G |
| SHOW CREATE PROCEDURE `test`.`GetMissingIntegers`\G |
| SHOW CREATE FUNCTION `test`.`GetTestTableCounts`\G |
| SHOW CREATE PROCEDURE `test`.`ImportWeeklyBatch`\G |
| SHOW CREATE FUNCTION `test`.`InsertName`\G |
| SHOW CREATE PROCEDURE `test`.`LoadSampleTables`\G |
| SHOW CREATE PROCEDURE `test`.`MigrateColumn`\G |
| SHOW CREATE TRIGGER `test`.`AddPermTempKey`\G |
| SHOW CREATE TRIGGER `test`.`DeletePermTempKey`\G |
+-----------------------------------------------------+
10 rows in set (0.07 sec)
第二种方式是数据库管理员的首选方式,使用mysqldump。
这将收集单个文件中的所有表结构,SP,SF和触发器。
mysqldump -h... -u... -p... --no-data --routines --triggers --all-databases > MySQLSchema.sql
这也将这样做,但没有CREATE TABLE的东西:
mysqldump -h... -u... -p... --no-data --no-create-info --routines --triggers --all-databases > MySQLSchema.sql
给这些一个Try!
我也想知道这个! – 2011-05-06 19:15:27
不知道这是否是你需要的,但是你可以使用table ** information_schema.routines **来转储你的函数和过程。 – rMX 2011-05-11 04:03:56
你可以使用mysql.proc和information_schema.triggers作为我的答案。 – RolandoMySQLDBA 2011-05-12 18:44:09