【问题标题】:test and production server deployment with yii framework - syncing DB changes使用 yii 框架部署测试和生产服务器 - 同步数据库更改
【发布时间】:2011-09-13 07:44:11
【问题描述】:

我正在开发一个基于 Yii 框架的应用程序,我必须在我的本地机器上测试该应用程序,然后在准备好时将更改移动到生产服务器。

该应用程序将随着人们使用它并要求新功能而开发。因此,当我在测试机器上对我的数据库架构进行更改时,我必须将这些应用到生产数据库的架构而不破坏那里的数据。

有没有推荐和方便的方法来处理这个问题?同步源代码不是问题,我正在使用 svn 并且可以进行 svn 导出; rsync ...

【问题讨论】:

  • 更新:有人对yii迁移工具或方法有丰富的经验吗?似乎这是他推荐的处理这一切的方法,但也许有理由避免它?

标签: mysql deployment yii mysql-management web-deployment


【解决方案1】:

MySQLWorkbench 有助于同步数据库架构以及其他数据库设计任务。

Yii 确实支持Migrations(从 v1.1.6 开始),尽管它可能比它的价值更麻烦,这取决于您进行更改的频率以及您的项目的协作程度。

我使用的另一种方法是在 svn 中保存更新语句的日志,并且基本上手动处理迁移。

最佳方法将取决于您的特定项目/工作流程的成本/收益。

【讨论】:

  • 没有意识到 yii 支持迁移 - 看起来很有趣,但作为一个新手,我不知道它是如何工作的,而且手册似乎并不容易理解 - 我们的应用程序是一个内部应用程序,它将在我和我的联合创始人之间使用,所以我正在寻找最简单的方法来更新我的本地测试机器上的 yii 应用程序,然后更新它的生产副本,根据需要自动进行必要的数据库转换...
  • @b200000,基本上 MWB 从 GUI 图表(“正向工程师”)生成工作“创建”SQL,并且可以生成现有数据库(“反向工程师”)及其模式的准确可视图表,但那些 GUI盒子和连接器不会以视觉上有用的方式自动布局。把它们拖来拖去。 “逆向工程”还为数据生成“插入”SQL。转储功能似乎在 Server_Admin->Manage_Import/Export 下。
【解决方案2】:

您可以尝试SQLyog's Schema Synchronization Tool,这是一个可视化的比较/同步工具,专为在不同 MySQL 服务器之间工作或需要在两个 MySQL 服务器之间保持数据库同步的开发人员设计。这意味着报告两个数据库的表、索引、列和例程之间的差异,并生成脚本以使它们同步。只有 Schema 会在目标中同步。

【讨论】:

  • 当您运行生产服务器并且您必须更新其数据库模式并同时推送代码更新时,这在实践中如何工作?如果生产服务器/站点在一两分钟内不可用,我只能安全地看到这项工作,在此期间完成更新?
【解决方案3】:

对于类似的项目,我们

  1. 使用 MySQLWorkbench (MWB) 设计和编辑架构
  2. 通过 VCS 共享 .mwb 文件。
  3. 当我们中的一个人对更改感到满意时,他会在生产和测试模式上使用 mysqldump --complete-insert... 以生成带有字段名称的现有测试和生产数据的副本
  4. 将(3)中所有生产服务器的insert语句拉出来放到protected/data/insert.sql中
  5. 在修改后的模型上使用MWB中的“正向工程师”菜单项生成sql保存到名为protected/data/create.sql的文件中,酌情手工编辑(务必使用if exists子句减少错误)
  6. 根据(3)中的drop语句编写一个drop.sql文件
  7. 使用 MWB,在发出标识生产数据库的适当“使用数据库”命令后运行 sql(drop.sql、create.sql、insert.sql)
  8. 通过消除由于新模型/模式中不需要的列/字段而导致的任何无效插入来处理 (7) 中的所有错误。重播 (7)
  9. 处理 (7) 中需要 Null 以外的数据的新字段。重播 (7)

现在您有了架构 (drop.sql create.sql) 和数据的快照,如果您遇到问题,应该可以恢复您的测试或生产服务器。而且您拥有生产服务器(insert.sql)中数据的“固定装置”,可用于使您的测试服务器加速,或作为生产服务器数据的备份(很快就会过时) .显然,所有外键关系都是真正令人痛苦的,因此 insert.sql 很少用于除了升级架构和在此更改后恢复生产数据之外的任何事情。显然需要一些时间来解决这个过程中的问题,以便 (3) 和 (9) 之间的延迟足够小,以至于生产服务器用户不会注意到停机时间。

很明显,“Rerun (7)”重复了,很快就变成了直接调用mysql的shell脚本。 sql 编辑过程中的其他步骤也变成了sed 脚本。

【讨论】:

  • 哇.. 这是一个复杂的过程.. 当您开始在测试服务器上处理代码时,有没有办法拍摄 db 模式的快照,然后进行更改,然后当你已经完成了测试并且很高兴你拍摄了另一个快照,你以某种方式与之前的快照“差异”,然后你可以在更新生产服务器上的代码后立即在生产服务器上应用这个 SQL 转换的“补丁”?
  • @b20000,你是对的。我们正在逐渐自动化我们可以执行的步骤,但所有步骤都需要在那里。似乎您的“转储、转储、差异、补丁、执行”方法可能会自动化 9 个步骤中的至少 3 个。但是没有尝试过,所以可能有一些隐藏的陷阱。如果我在 Yii 和 SQL 中发现了一件事,那么当您想要在中途调整模式时,事情会很快变得复杂。无论您做什么,都不要忘记“--complete-inserts”和“IF EXISTS”调整。
【解决方案4】:

查看 dbForge Studio for MySQL 中的 schema comparison 工具。 此工具将帮助您比较和同步两个数据库或 database project 与指定数据库。

还有一个单独的工具 - dbForge Schema Compare for MySQL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多