从开发环境同步Magento数据库到生产环境

4
我使用git进行版本控制。我有开发、暂存和生产环境。在开发中完成后,我会将更改推送到暂存环境供客户审核。审核通过后,我会将更改从暂存环境推送到生产环境。只要没有数据库更改就可以正常工作。但是,如果我通过Magento Connect在本地开发中安装模块并对数据库进行修改,那么会发生什么?
由于生产服务器始终在变化,所以该如何将这些更改推送到生产服务器?
编辑:
我编写了两个shell脚本。一个将生产数据库拉到我的开发服务器上,将基本网址替换为开发网址,并相应地更新我的开发数据库。它还保留了生产SQL转储,以添加到我的git存储库中。我不确定在源代码控制中保留原始转储是否有益,但我会尝试一下。第二个脚本将开发数据库移到暂存环境,并执行与第一个脚本相同的操作。
现在,当需要切换到生产环境时,我将更新的生产repo拉入生产服务器,并允许Magento做它的事情。我最近也开始使用SQLYog,它有一个数据库比较向导,可以给出我开发和生产数据库之间的差异,并允许我进行选择性合并更改。它总是创建一个迁移脚本,我也将其添加到源代码控制中。如果出现任何问题,我可以运行比较来查看是否遗漏了什么。
你们觉得这个工作流程不错吗?
3个回答

8
这是开发人员常见的情况。当有一个小而深入了解的代码库且对UI没有太多灵活性时,修改代码和模式并确保一切正常要容易得多。当然,Magento并非如此,在自动化测试和持续集成方案中将其整合起来可能相当困难。尽管如此,仍有一些已知、可测试的行为可以依赖。
概述
在处理合并到生产环境中的本地开发时,必须确保与新功能或更改相关的模式和数据更改在更新文件系统时也被应用。这实际上是Magento本身的工作方式。模块配置文件可以提供版本号并配置设置资源。这些信息用于进入模式和数据修改工作流程,结果是将版本信息添加到数据库中。在文件指定的版本号和数据库注册的版本号之间的一致性,可以推断出(系统)在所需的状态下给定存在的文件时,数据库也处于适当的状态。
这意味着,当新的/更新的模块文件合并到生产环境时,并满足必要的条件(例如,配置缓存无效等),应进行数据库升级。你需要考虑的是,这个过程可能会因远程服务器级别差异、远程数据差异等而导致破裂。如果没有紧密监管的集成测试流程,会有一些开销。
攻略:选择正确的策略
这个领域的基本活动是评估模块对数据库影响的区域。这对于任何值得安装的模块来说都应该很简单;检查下面的任何一个:
1. system.xml文件 2. sql或data文件夹中存在安装/升级脚本 3. 自定义设置资源类(配置在global/resources xpath下) 4. 适当的配置XML(模块配置节点中的版本号和global/resources xpath下的设置资源)
对于第1点,仅需查看结构并了解其对数据库的影响将被限制为core_config_data表,并且通常只有管理员通过GUI保存值后才能生效(注意下面的1也适用)。
对于2和3,查看要运行的脚本。这些可以分为三个一般领域: 1. 配置设置-查找setConfigData()和deleteConfigData()调用 2. 表添加和编辑(新表、添加列等) 3. EAV相关的更改和添加;查找EAV设置资源 4. 非EAV数据更改:安装新数据或修改现有数据

这是一种感觉和直觉的问题,但评估对数据库的影响程度将使您确定是否应克隆生产数据到本地开发环境并测试设置工作流程,验证其是否正常运行,然后推送到生产环境并重新检查(始终备份!)。如果更改范围很广,最好将网站下线,以便确保在失败的升级之后不会丢失订单或客户数据。


2
我想补充一点,为了拥有一个适当的分阶段、QA和开发环境,需要有一个明确定义的生产数据库导出流程。通常,在进行灾难恢复备份时可以同时完成此操作。一个简单的方法是导出整个数据库,清除任何客户/敏感数据并导入到目标环境中。在导入到目标数据库后,运行一个脚本来更新存储在数据库中的任何必要配置。使用答案中概述的方法可以更可靠地测量变化的影响。 - beeplogic
谢谢大家的反馈。我之前不知道Magento可以处理从代码迁移数据库的问题。我已经更新了我的帖子,并想知道你们的想法。如果听起来合理,请告诉我。 - ringerce

3

通常情况下,您不应该将开发环境中数据库中包含的数据推送到生产环境。您的模式定义应包含在Magento SQL安装脚本中。如果您确实有要推送到生产环境的实际新数据,则必须逐个案例进行。在运行实际用例之前,您很可能需要从生产环境中拉取数据和配置以在开发环境中进行测试。


-3

情况 - 1:

如果您的生产服务器具有与本地相同的数据(DB),则只需将数据库和文件复制到生产服务器并执行以下操作:

1)删除文件夹/var的内容

2)更改文件/app/etc/local.xml的值。在那里,您可以找到连接字符串数据(数据库用户、主机和名称)。

3)一旦您上传了数据库,您需要进行一些更改。

运行此查询:

SELECT * FROM core_config_data WHERE path = 'web/unsecure/base_url' OR path = 'web/secure/base_url';

您将获得2行。通过运行此查询更新这些行。

UPDATE core_config_data SET value = 'YOUR_NEW_LIVE_URL' WHERE path LIKE 'web/%/base_url';

就这些。

案例 - 2:

如果您不想在生产环境中更改数据库数据,则需要通过Magento Connect直接安装模块到生产服务器。而您可以更新本地更改的文件。


1
嗨,Case 1的问题在于开发和生产数据库始终不同步,因为生产数据库始终被客户修改。通过新订单、新客户、统计等...我能想到的唯一办法是在生产环境中进行所有核心配置更改,并将更改复制到开发环境以保持其最新状态。 - ringerce
4
通过Magento Connect下载扩展程序在生产网站上并不是一个好的建议,替换数据库也一样存在数据丢失和意外后果的风险。 - beeplogic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接