已部署服务器上的 Grails 数据库迁移
Posted
技术标签:
【中文标题】已部署服务器上的 Grails 数据库迁移【英文标题】:Grails database migration on deployed server 【发布时间】:2014-09-23 01:19:32 【问题描述】:大家好,我在使用 grails 数据库迁移插件时遇到问题/困惑。
用于学习的资源-
-
Grails 数据库迁移插件官方文档-http://grails-plugins.github.io/grails-database-migration/docs/manual/guide/introduction.html
数据库迁移示例-http://grails.github.io/grails-howtos/en/manageDatabases.html
现在在这些帮助下,我可以很好地迁移或更改本地计算机上的数据库,该计算机已安装并正常工作。
问题是生产服务器是在线部署的,我总是上传我的 WAR 文件以部署在 apache tomcat 上。所以它基本上是在 JAVA 上运行的,所以 grails 没有安装在 ubuntu 机器上。 现在我将如何迁移服务器上的 mysql 数据库?
【问题讨论】:
【参考方案1】:在您的 Config.groovy 文件中添加以下配置。迁移将在 WAR 部署期间运行。
//===========================DATA MIGRATION============================
//Run changelog.groovy during application deployment on server?
grails.plugin.databasemigration.updateOnStart = true
//File used to run the db migration scripts
grails.plugin.databasemigration.updateOnStartFileNames = ['changelog.groovy']
//Absolute path of changelog.groovy in the app base dir
grails.plugin.databasemigration.changelogLocation = 'migrations'
// the default schema to use when running auto-migrate on start
//grails.plugin.databasemigration. updateOnStartDefaultSchema ='schema' // You may not need this in MYSQL
//=====================================================================
根据上面的配置,你的文件夹结构应该是这样的:
your-grails-project
--migrations/
--changelog.groovy
--migration1.groovy
--migration2.groovy
changelog.groovy
databaseChangeLog =
include file: 'migration1.groovy'
include file: 'migration2.groovy'
【讨论】:
感谢您的回复拉利特。我的 config.groovy 中已经有了这些行。我使用 2 个命令来生成更改日志 - 第一个 -grails dbm-update
和第二个 grails dbm-gorm-diff changelog.groovy --add
。那么你的意思是我必须在本地机器上运行这两个命令来生成更改日志并将其上传到服务器并让它自动处理更改?
已编辑我的答案,请看一下。在生成 WAR 之前,您需要拥有这些文件。
网络场会发生什么?如果我有 5 个 Web 服务器,changelog 脚本会尝试运行 5 次吗?
@dudemonkey 您的 5 个 Web 服务器是连接到不同的数据库还是都连接到同一个数据库?
@dudemonkey 好的。因此,liquibase 将在您的数据库中维护一个名为:databasechangelog
的表。该表将包含在该数据库上执行的更改日志脚本的所有信息及其校验和。因此,如果您的更改日志脚本在所有 Web 服务器中完全相同,则不应多次执行。以上是关于已部署服务器上的 Grails 数据库迁移的主要内容,如果未能解决你的问题,请参考以下文章
带有数据库迁移插件的 Grails 3:类 [com.mypackage.security.RequestMap] 上的方法在 Grails 应用程序之外使用