Drush sql-dump能否导出存储过程?如何添加该功能?
先给你明确答案:默认确实无法导出,--routines参数无效是常见情况
没错,默认情况下Drush sql-dump不会导出MySQL的存储过程、自定义函数这类数据库对象,哪怕你加了--routines参数也可能没效果。核心原因是早期Drush版本(比如Drush 8及更早)在封装底层的mysqldump命令时,压根没把--routines这类参数传递过去。
不过要注意:Drush 10+的新版本已经修复了这个问题,但如果你的项目还在使用旧版本,或者数据库驱动配置有特殊情况,还是会遇到这个问题。你可以自己验证下:直接跑原生的mysqldump --routines --databases your_db,如果能导出存储过程,但Drush命令不行,那肯定是Drush的封装层没传参数。
想自己加这个功能?从这几个地方入手就行
如果你的Drush版本确实不支持,动手扩展也不难,步骤如下:
1. 找到sql-dump的核心代码文件
Drush的命令逻辑都在源码里,不同版本路径略有差异:
- Drush 10+:找
src/Commands/SqlCommands.php,里面的dump方法就是处理导出的核心 - 旧版本(Drush 8及更早):找
commands/sql/sql.drush.inc,对应的命令定义和逻辑都在这里
2. 添加入参支持
先让Drush识别--routines和--triggers参数:
- 新版本(注解式):在
dump方法的注解里加参数定义:/** * Exports the Drupal DB as SQL. * * @option routines Include stored procedures and functions in the dump. * @option triggers Include database triggers in the dump. * @command sql:dump */ - 旧版本:在
drush_command()函数的options数组里加对应的项:'options' => [ 'routines' => 'Include stored procedures and functions in the dump.', 'triggers' => 'Include triggers in the dump.', ],
3. 把参数传递给底层的导出命令
找到构建底层导出命令的逻辑(比如调用dumpCmd()的地方),判断用户是否传了--routines,然后把参数追加到底层命令里:
// 先获取基础导出命令 $dump_cmd = $this->sql->dumpCmd(); // 如果用户指定了--routines,追加参数 if ($this->input->getOption('routines')) { $dump_cmd .= ' --routines'; } // 触发器同理,常和存储过程一起导出 if ($this->input->getOption('triggers')) { $dump_cmd .= ' --triggers'; }
注意:如果是PostgreSQL数据库,参数不一样,要先判断当前数据库驱动,再添加对应参数(比如PostgreSQL用--functions)。
4. 测试验证
修改代码后,本地安装修改后的Drush,执行drush sql-dump --routines,然后打开导出的SQL文件,搜索存储过程的名字,看看有没有对应的CREATE PROCEDURE/CREATE FUNCTION语句。另外要确保执行Drush的用户有足够的数据库权限读取存储过程定义。
5. 贡献给官方(可选)
如果你的修改是通用的,不妨提交PR到Drush官方仓库,帮其他遇到同样问题的开发者解决麻烦~
内容的提问来源于stack exchange,提问作者Raf A.

