如何合并本地和实时数据库?

时间:2016-02-16 16:27:35

标签: php mysql wordpress

我们已经为Wordpress开发了好几年,虽然我们的工作流程已在几个点升级,但有一件事我们从未解决过......将本地Wordpress数据库与实时数据库。

因此,我正在谈论拥有本地版本的网站,其中文件和数据会发生变化,同时现场网站上的数据也会同时发生变化。

所有我能找到的是完美的世界场景,即拉低网站,没有人(甚至是客户)触摸现场网站,然后推回本地网站。我把一件事复制到另一件事上。

如果不运行一大堆mysql命令,怎么做呢? (如果他们没有经过适当的检查,感觉他们可能会摔倒!)这可以通过Gulp(我已经看过它提到)或插件来完成吗?

为了清楚起见,我不是在谈论通过像WP Migrate DB ProBackupBuddy或类似的东西来回推送/拉取数据 - 这是合并,而不是用另一个数据库替换一个数据库。

我很想知道其他开发者如何解决这个问题!

文件更改相当简单,当数据发生变化时会导致噩梦。

WP Stagecoach会进行合并,但您无法在本地工作,它会从您应该处理的实际网站创建一个暂存网站。合并效果很好,但是无法在当地工作,这是一个杀手锏。

开发人员也告诉我datahawk.io会做我想做的事,但是没有发布日期。

9 个答案:

答案 0 :(得分:5)

听起来像VersionPress可能会做你需要的:

VersionPress staging

有几点需要注意:我还没有使用它,因此无法保证其有效性;并且它目前处于早期访问状态。

答案 1 :(得分:4)

  

重要事项:在将本地数据合并到Live数据库之前,先备份Live数据库。

按照以下步骤操作可能有助于迁移大部分数据并将其合并到实时

  1. 转到本地网站工具 - >导出的wp后端。
  2. 选择所有内容单选按钮(如果未默认选中)。
  3. 这将带来一个Xml文件,其中包含由所有默认帖子类型和自定义帖子类型组成的所有本地数据。
  4. 在记事本++或任何编辑器中打开此XML文件,然后使用实时URL查找并替换本地URL。
  5. 现在访问实时网站并在工具 - >导入下导入XML。
  6. 手动上传文件(图片)。
  7. 这会将大部分数据从本地带到实时。

    您必须编写自定义脚本的其余数据。

      

    风险因素是:

    1. 将图像从Local上传到Live时,同名图像 将被覆盖。
    2. Wordpress将图像保存在post_meta中,为图像生成序列化数据,而不是上传数据库时应注意的事项。
    3. post_type="attachment"的post_meta中的序列化数据可保存图像的3维或4维的序列化数据。
    4. 导入数据时用户的用户名或电子邮件ID可以相同(或者wp执行检查唯一用户名和电子邮件的功能),然后这些用户将不会被导入(可能)。

答案 2 :(得分:3)

如果我是你,我会做以下事情(缓慢但给你最大的成功机会)

首先,在某处设置第三个数据库。云服务可能是理想的,因为您可以使用SSD获得功能强大的服务器几个小时。你需要那个马力。

其次,我们将mysqldump第一个数据库并将输出传输到我们的云数据库中。

mysqldump -u user -ppassword dbname | mysql -u root -ppass -h somecloud.db.internet

现在我们有了DB#1的完整副本。如果您的云支持快照数据,请务必立即购买。

最后一步是编写一个PHP脚本,缓慢但肯定地从第二个DB中选择数据并将其写入第三个DB。我们想一次做一条记录。为什么?好吧,我们需要维护记录之间的关系。所以我们来评论和发帖。当我们从DB#2中提取#1后,它将无法保留记录#1,因为DB#1已经有了#1。所以现在#1号帖子成为第132号帖子。这意味着现在需要将第1篇帖子的所有评论都写成属于第132号帖子。您还必须为发布这些帖子的用户提取记录,因为他们的用户ID也会发生变化。

对此没有简单的解决方法,但WP结构并不是非常复杂。构建一个简单的循环来提取数据并进行翻译不应该超过几个小时的工作量。

答案 3 :(得分:2)

如果我了解你,要合并本地和实时数据库,到目前为止我正在使用其他软件,例如NavicatPremium,它具有Data Sycn功能。

答案 4 :(得分:2)

这可以使用spring-xd实现,创建JDBC Stream以从一个db中提取数据并插入到另一个db中。 (这充当流媒体,因此您不必打扰任何环境)

答案 5 :(得分:2)

您需要做的第一件事是评估是否更容易进行复制粘贴数据输入而不是迁移脚本。有时最好的答案是将其吸收并使用CMS界面手动完成。这可以避免与合并主键之间的任何潜在冲突,但您可能需要查看帖子或类似数据的创建者之类的引用。

如果手动迁移过于彻底,那么您就不得不编写脚本或找到已经为您编写的脚本了。假设那里什么都没有,这就是你做的......

在运行移民之前务必备份!

1)列出您需要转移的内容。你需要用户,帖子等吗?找到数据库表并将它们添加到列表中。

2)在合并到新数据库的数据库表中记下所有可能的foreign keys。例如,wp_postspost_author引用wp_users。迁移期间需要特别注意这些。使用此documentation来帮助查找它们。

3)一旦你知道你需要什么表以及它们引用什么,你就需要编写脚本。首先找出其他数据库的 new 内容。最安全的方法是使用某种并排列表手动执行此操作。但是,您可以就如何自动匹配表行提出自己的规则。也许在文本需要相同的情况下检查$post1->post_content === $post2->post_content。这里唯一的问题是主要/外键是这些规则的禁区。

4)如何合并内容?一般的想法是,所有主要密钥都需要针对任何新内容进行更改。您希望使用除post的id之外的所有内容并将其插入到新数据库中。将会有一个自动增量来创建新的id,因此您不需要以前的id(除非您希望它用于脚本输出/调试)。

5)棘手的部分是处理外键。根据您计划迁移的内容,此过程会发生很大变化。您需要知道的是哪个外键到哪个(可能是新的)主键。如果您仅迁移帖子,则可能需要将用户ID硬编码为post_author列的用户ID映射,然后使用此值替换值。

但是,如果我不知道映射的用户标识,因为某些用户也需要迁移呢?

这就是棘手的问题。您需要首先定义合并规则以查看用户是否已存在。对于 new 用户,您需要记录新插入用户的ID。然后,在迁移所有用户之后,当引用新合并的用户时,需要替换post_author值。

6)编写并测试脚本!首先在虚拟数据库上测试它。再次,在数据库上使用之前进行备份!

答案 6 :(得分:2)

当我将数据从一个CMS移动到另一个CMS时,我已经用ETL (Extract, Transform, Load) process做了一些类似的事情。

我没有编写脚本,而是使用了Pentaho Data Integration (Kettle) tool

ETL的理念非常简单:

  • E 提取数据(例如从一个数据库中)
  • T 改变它以满足您的需求
  • L 将其发送到最终目的地(您的第二个数据库)。

该工具易于使用,它允许您尝试各种步骤和输出来调查数据。当您设计正确的ETL过程时,您已准备好合并您的那些数据库。

答案 7 :(得分:1)

  

如果不运行一大堆mysql命令,怎么做呢?

没办法。如果本地网站和网站同时运行,您如何防止不同内容具有不同的内容?

答案 8 :(得分:-2)

所以如果你想这样做你可以使用mysql repication.i认为它会帮助你合并到不同的数据库mysql。