Magento:生产、暂存和开发环境之间的数据库同步

4

今天我阅读了有关Magento数据库同步的文章。

目前我遇到的一个问题是在开发期间和上传到生产环境期间需要同步哪些内容。假设一批更改包括对数据库和代码的更改,以下是我对模型工作流程的理解(我当前不使用“stage”服务器,因此在此示例中将其略过):

  1. production数据库同步dev数据库
  2. 在开发机器上检出代码副本
  3. 进行更改并在dev服务器上测试
  4. 接受更改并将其提交到svn存储库
  5. 触摸Maintenance.flag以准备升级生产服务器 (这可以消除用户与即将更改的实时数据交互的同步问题,对吧?)
  6. 合并分支到主干并部署存储库到生产服务器
  7. dev数据库重新同步到production数据库并测试更改

所以,有两点我在使用Magento时不太明白:

  • 需要同步什么,不需要同步什么?
    • 我认为将订单和客户信息同步似乎毫无意义,所以我不会这样做。
    • 我会希望同步产品模式和数据,以及任何管理员更改、模块更改等。如何处理?
  • 同步方式是什么?(MySql转储、导入/导出等)
    • 目前我使用的是Navicat 10 Premium,它具有结构和数据同步功能(我还没有尝试过,但它们看起来非常有帮助)

所以我不一定需要具体的答案(但这些会很有帮助)。更多地了解您使用的系统以及您对该系统的满意度。

2个回答

5
如果您正在使用CE版本,则:
  • 放弃SVN,使用GIT :)
  • 永远不要同步数据库,将数据库升级准备为扩展升级文件

    1. 有3个站点开发、阶段、生产
    2. 需要时将生产数据库复制到阶段和开发
    3. 从生产中进行所有管理更改,然后将整个数据库沿着线路复制即可

这样,您就永远不必同步数据库了。如果您通过扩展升级脚本进行所有配置更改,那么您可以在任何想要的地方冷启动magento到新的数据库结构,而不会丢失数据结构


1
使用Git加1分。通过使用脚本将实时数据库复制到stage/dev,进行数据修改,例如更改核心URL条目、存储电子邮件地址和第三方支付接口的授权信息。匿名化/更改客户和订单数据。 - Matthias Zeis
我个人使用 Fabric 脚本来处理这个问题,并且正如 Matthias 所解释的那样,一些 SQL 更新脚本也是必要的,以确保环境之间的连续和平稳流动。 - Anton S
嘿,如果你想让我放弃SVN,至少告诉我为什么:)。如果你们中的任何人能向我展示一个脚本或样例,或者指导我开始编写一个,那将不胜感激。 - Jared Eitnier
问题是,你确定在实时环境中进行管理员更改是个好主意吗?如果出现错误怎么办? - James Roeiter
谁在乎你实时赚不到100万美元呢 :) 那么你只需要修正你的错误即可。 - Anton S

2
我使用phpunit构建开发数据库。我编写了一个简短的脚本,从实时数据库中转储xml数据,并逐个表格使用,修改敏感内容并删除不需要的内容。我的开发数据库模式从不改变,也不会被重建。每次运行phpunit时,只有数据会被删除和重新创建。
这可能不是每个人的正确解决方案,因为它永远不会对将开发同步到阶段/生产环境有好处,但我不需要这样做。
主要优点是我所需的开发数据库非常小。它大约有12000行xml,可以处理大约30个不同的表格。一些小的核心表格保持不变,因为我不写入它们,许多表格为空,因为我不使用它们。
该数据库是代表性的样本,非常小。足够小,可以作为文本文件进行编辑,并且每次运行测试时只需几秒钟即可填充。
以下是每个 PHPUnit 测试的顶部内容。PHPUnitDbUnit 都有很好的文档。
<?php
require_once dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR . 'top.php';
require_once "PHPUnit/Extensions/Database/TestCase.php";

class SomeTest extends PHPUnit_Extensions_Database_TestCase 
{
    /**
     * @return PHPUnit_Extensions_Database_DB_IDatabaseConnection
     */
    public function getConnection() {
        $database = MY_DB
        $hostname = MY_HOST
        $user     = MY_USER
        $password = MY_PASS
        $pdo      = new PDO("mysql:host=$hostname;dbname=$database", $user, $password);
        return $this->createDefaultDBConnection($pdo, $database);
    }

   /**
    * @return PHPUnit_Extensions_Database_DataSet_IDataSet
    */
    public function getDataSet() {
    return $this->createXMLDataSet(dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR . 'Tests/_files/seed.xml');
    }
}

“所以,现在你只需要一个种子文件,DbUnit 从中读取并重新填充你的数据库,每次单元测试被调用时。

首先,将你的完整数据库复制两次。一个是开发数据库,另一个是你的“原始”数据库,你可以使用它来转储 XML 数据,以防出现键问题。

然后,使用类似于我的 XML 转储器对“原始”数据库进行操作,以获取你的 XML 转储,并开始构建你的种子文件。”

generate_flat_xml.php -tcatalog_product_entity -centity_id,entity_type_id,attribute_set_id,type_id,sku,has_options,required_options -oentity_id >> my_seed_file.xml

编辑种子文件,仅使用您需要的内容。由于开发数据库的大小较小,因此您可以通过查看数据库与文本文件中的内容之间的差异来检查它们。更不用说,减少数据量可以加快速度。

我对这种方法很感兴趣,因为我同意您的观点:dev db不需要太多数据进行测试。主要是产品、设置等。在看到这篇文章之前,我甚至从未听说过phpUnit。如果您不介意的话,我很想看看您如何实现这个场景的更多实际操作。尤其是因为我在版本控制和管理这样一个规模的网站方面还非常新手,所以我只想保持简单愚蠢且易于管理。 - Jared Eitnier
太棒了,我非常感激你的所有帮助。在我完成一些事情并有一些空闲时间后,我会尝试这个。 - Jared Eitnier

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