Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
grails:如何在远程生产数据库上使用数据库迁移插件_Grails_Liquibase - Fatal编程技术网

grails:如何在远程生产数据库上使用数据库迁移插件

grails:如何在远程生产数据库上使用数据库迁移插件,grails,liquibase,Grails,Liquibase,如果您使用的是grails数据库迁移插件,有两种方法可以更新数据库,一种是运行: $grails[environment]dbm更新 或者将其添加到数据源: grails.plugin.databasemigration.reports.updateOnStart = true 但是,前者需要连接到目标数据库的能力,后者通常被视为生产不可接受(数据库更新通常在停机期间以受控方式与备份等分开进行) 我们的生产数据库位于客户数据中心,我们无法访问它们。我们现在给他们一个war文件,他们把它放到他们

如果您使用的是grails数据库迁移插件,有两种方法可以更新数据库,一种是运行:

$grails[environment]dbm更新

或者将其添加到数据源:

grails.plugin.databasemigration.reports.updateOnStart = true
但是,前者需要连接到目标数据库的能力,后者通常被视为生产不可接受(数据库更新通常在停机期间以受控方式与备份等分开进行)

我们的生产数据库位于客户数据中心,我们无法访问它们。我们现在给他们一个war文件,他们把它放到他们的环境中

我们可以给他们完整的源代码,告诉他们安装Grails 2.5.0,告诉他们编辑DataSource.groovy以指向他们的数据库,进入app dir并键入
Grails prod dbm update
,但这实际上不是一个选项

还有别的办法吗?我们可以告诉他们安装liquibase,但groovy DSL不受支持(我们可能会迁移到XML版本),只需创建liquibase文件的tar即可。这是唯一的选择吗

==更新===

我们不能去的主要原因是

grails.plugin.databasemigration.updateOnStart = true
是因为它是全局的-不能针对每个环境进行设置。我们的开发人员对SQL一无所知,也不知道添加没有默认值的列(例如,在grails中添加mysql默认约束“”是不可能的),因此他们通常使用
dbCreate=“update”
进行开发。当需要进行测试构建时,DBA/Dev负责人会生成liquibase更改日志。这可以使用dbm更新应用于文本环境,但对于我们无法访问的30个左右的生产数据库,这是行不通的


生成updateSQL的建议不是一个坏主意——我们将对此进行研究。在生产过程中,客户可能拥有具有许多不同版本的系统副本,因此我们可能需要保留每个版本的副本。

如果使用第二种方法,您的迁移将包括在WAR中。如果您使用外部配置,您的开发人员操作团队有一个配置/属性文件/环境变量来配置数据源,他们不需要编辑任何内容,并且当新WAR发布到应用程序服务器时,迁移会在应用程序启动时运行。这有什么问题?理想的解决方案是什么?如果“数据库更新通常在停机期间单独完成…”,那么最好的办法可能是发送一个war文件,其中包含迁移,这是应用程序的“管理”端-他们将war文件放入,然后有一些UI来触发Liquibase更新。数据库更新完成后,管理员war文件甚至可能部署新的应用程序war文件。您可以使用
updateSQL
命令生成文件,而不是让liquibase在数据库上直接执行upate。我们就是这样做的。我们有一个额外的(数据emtpy)“集成”数据库,其唯一目的是保持数据库的当前开发状态。查看我的答案,了解更多详细信息。如果您使用第二种方法,您的迁移将包含在战争中。如果您使用外部配置,您的开发人员操作团队有一个配置/属性文件/环境变量来配置数据源,他们不需要编辑任何内容,并且当新WAR发布到应用程序服务器时,迁移会在应用程序启动时运行。这有什么问题?理想的解决方案是什么?如果“数据库更新通常在停机期间单独完成…”,那么最好的办法可能是发送一个war文件,其中包含迁移,这是应用程序的“管理”端-他们将war文件放入,然后有一些UI来触发Liquibase更新。数据库更新完成后,管理员war文件甚至可能部署新的应用程序war文件。您可以使用
updateSQL
命令生成文件,而不是让liquibase在数据库上直接执行upate。我们就是这样做的。我们有一个额外的(数据emtpy)“集成”数据库,其唯一目的是保持数据库的当前开发状态。查看我的答案,了解更多详细信息。