【问题标题】:Migrate data from MySQL with auto-increment Ids to the Google Datastore?将具有自动增量 ID 的 MySQL 数据迁移到 Google 数据存储区?
【发布时间】:2017-06-11 03:13:36
【问题描述】:

我正在尝试将一些数据从 MySql 迁移到 Datastore。我有一个名为 User 的表,带有自动增量主键 (Bigint(20))。现在我想将数据从 User 表移动到数据存储区。

我的计划是让 Datastore 为迁移的用户以及迁移完成后创建的所有新用户生成新的 ID。然而,我们有许多依赖于旧 ID 的服务(通知、URL 等)。所以我想为迁移的用户使用旧的id,但是如何保证所有新生成的id不会与迁移的id冲突?

【问题讨论】:

  • 一千左右。
  • 对不起,丹尼,我误解了你的问题。 Jeffrey 为您提供了正确答案。

标签: mysql google-app-engine google-cloud-platform google-cloud-datastore


【解决方案1】:

在迁移前记录最大和最小 id。将所有 sql 行迁移到数据存储实体,设置 entity.key.id = sql.row.id。

为防止新的数据存储 id 与旧的冲突,请始终调用 AllocateIds() 来分配新的 id。在 C# 中,代码如下所示:

        Key key;
        Key incompleteKey = _db.CreateKeyFactory("Task").CreateIncompleteKey();
        do
        {
            key = _db.AllocateId(incompleteKey);
        } while (key.Path[0].Id >= minOldId && key.Path[0].Id <= maxOldId);
        // Use new key for new entity.

实际上,您中奖的可能性比看到钥匙碰撞的可能性更大,因此检查旧 ID 的范围不会花费更多。

【讨论】:

  • 虽然这可能有效,但 ID 分配需要往返数据存储,这是不必要的。创建实体的最快方法是发送带有不完整键的实体以进行添加/放置操作。
  • 确实如此。为了避免每个新实体的往返,您可以一次分配 100 个 id,然后一个一个地使用它们。
【解决方案2】:

您无法提示/告诉数据存储区保留特定 ID。因此,如果您在插入现有数据时手动设置 ID,然后让 Datastore 分配一个 ID,我会选择一个您已经使用过的 ID。根据您使用的操作(例如 INSERT 或 UPSERT),该操作可能会失败或覆盖现有实体。

您需要制定迁移计划以将现有 ID 映射到数据存储 ID。根据您拥有的表的数量和它们之间关系的复杂性,这可能会成为一个耗时的项目,但您仍然应该能够做到。

我们举一个简单的例子,假设你有两个表:

USER(USER_ID 是主键) USER_DATA(USER_ID 是外键)

您可以将另一列添加到 USER(或其他方式)以将 USER_ID 映射到 DATASTORE_ID。在这里,您为要使用的 Kind 调用 Datastore 的 allocateID 方法,并将返回的 ID 存储到新列中。

现在,您可以将 USER 数据移动到 Cloud Datastore,而忽略 MySQL 用户 ID,而是使用新列中的 ID。

要从 USER_DATA 迁移数据,请在两个表之间进行连接,并使用数据存储 ID 推送数据。

另外,请注意,使用顺序 ID(称为单调递增值)可能会导致 Datastore 出现性能问题。因此,您可能希望使用数据存储区生成的 ID。

【讨论】:

    猜你喜欢
    • 2012-11-16
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    • 2023-03-25
    • 1970-01-01
    • 2013-12-22
    相关资源
    最近更新 更多