迁移同步开发和生产数据库

Posted

技术标签:

【中文标题】迁移同步开发和生产数据库【英文标题】:migration synch developmental and production databases 【发布时间】:2014-12-30 10:56:33 【问题描述】:

我正在使用 MVC 5 和 NET Framework 4.5.1。代码优先。我还在使用带有 SQL 2012 服务器和 (localdb)\v11.0 的迁移。

我正在使用 C# 和 MVC5 开发一个项目。在开发过程中,我在我的开发计算机中创建了许多新表,并更改了我相信系统为其创建索引的“名称”字段。我添加并删除了几次。

之后,我添加了许多新的不相关表,但由于某种原因,由于“名称”字段的索引,我的迁移开始给我外部约束错误。当我修复它们时,这些错误不断增加,因此,我决定在迁移中恢复到初始状态,并使用当前位置作为新起点进行重置。我希望生产表能够在开发数据库中查看这个新起点,并将自身重新同步到开发状态。我以为我在某处读到生产数据库与开发数据库匹配并自行更新。我相信生产数据库中有一个迁移文件,它会与开发数据库中的文件匹配——该文件显然不同步。我考虑过删除其中的数据,但在得到建议之前我会推迟。

无论如何,我在开发计算机中更改了迁移目录的名称,并将其从项目中排除。然后我在开发计算机上重新初始化了我的表(使用本地数据库中的新数据库名称)并使用初始化数据重新加载它。这一切都奏效了。

现在,我遇到了一个新问题,我的生产数据库和我的开发数据库不同,我在开发计算机中的迁移设置为创建新文件,而处于生产状态的数据库则期待旧的迁移。每次我尝试使用开发计算机更新生产数据库时,我都会收到文件存在的错误 - 他们当然做到了。

因此,我将迁移文件中的所有创建文件都注释掉并重新尝试。现在,生产数据库将启动,但不会运行,因为更新的代码具有它所引用的新字段,这些字段并未在生产数据库中创建。因此,在我的生产数据库中,我开始收到所有缺失字段的错误。我也试图使自动迁移成为现实,但没有奏效。我猜,解决这个问题的唯一方法是手动进入并逐个同步字段。

问题 1:是否有一种自动方式来同步(使用迁移)生产数据库和开发数据库,​​以使它们与开发数据库相同?

问题 2:考虑到上述情况,用生产数据库重新设置迁移的更好方法是什么?

【问题讨论】:

【参考方案1】:

我找到了解决方案。 Red-Gate 的人有一个很棒的 SQL 工具,叫做 SQL 比较。它比较数据库文件结构,甚至使它们完全相同,只需单击一个按钮。

但是,在您使用它之前,请确保您只比较“表”,而不是包括“用户”和“角色”等所有内容。那是因为当您运行该软件时,它会备份、删除和重新创建,如果角色或用户被删除,该软件将无法再访问数据库并且所有内容都会被删除!另外...做​​一个备份! (我在第一次尝试时丢失了所有测试数据)

http://www.red-gate.com/products/sql-development/sql-compare/

(这不是 Red-Gate 人员的销售插件。我不认识他们,但他们的工具对我帮助很大 - 它是一个很好的工具,易于使用,14 天免费! - 我列出了它在这里,以便其他任何人,我相信有很多可能像我一样被卡住的人可以得到帮助。)

2015 年 4 月 24 日

好的。在您同步两个数据库以使它们看起来完全一样之后,还有更多内容。

为您的生产数据创建备份 *

删除开发文件夹中的 Migration 文件夹。

再次启用迁移 添加初始迁移 更新本地数据库

现在您的本地已完全设置完毕 *

转到主机数据库

在主机/生产中找到名为“__MigrationHistory”的表 删除所有数据(您要清除它)(“__MigrationHistory”(主机)) 现在将所有数据从本地“__MigrationHistory”复制到托管的“__MigrationHistory” (将只有一行,即您在上面创建的第一行“) 现在数据已保存,所有内容都将同步并且可以正常工作。 您可以重新开始开发。

【讨论】:

以上是关于迁移同步开发和生产数据库的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 中处理生产迁移和开发迁移

Sequelize 同步与迁移

迁移开发数据库和解析服务器后,是不是可以迁移生产数据库?

在标准“生产”或“开发”之外的不同数据库上使用Rails迁移

数据库迁移expdp impdp 与 OGg 搭建

用于数据库差异的 C# 库