Mysql 将数据从BigTable/GAE数据存储迁移到RDBMS的最佳方法是什么?

Mysql 将数据从BigTable/GAE数据存储迁移到RDBMS的最佳方法是什么?,mysql,google-app-engine,google-cloud-datastore,Mysql,Google App Engine,Google Cloud Datastore,既然Google已经宣布了for app engine的可用性,那么将现有数据从BigTable/GAE数据存储迁移到MySQL的最佳方式是什么 回答Peter提出的精彩问题: 在我的特定场景中,我将数据模型保持为非常相关的 我可以将我的站点关闭几个小时进行转换,或者至少警告人们,他们在接下来的几个小时内所做的任何更改都将由于数据库维护等原因丢失 我的数据集不是很大——我的应用程序的主仪表板显示为.67gb,数据存储统计页面显示为200mb 我正在使用python 我没有使用blobstore

既然Google已经宣布了for app engine的可用性,那么将现有数据从BigTable/GAE数据存储迁移到MySQL的最佳方式是什么

回答Peter提出的精彩问题:

  • 在我的特定场景中,我将数据模型保持为非常相关的
  • 我可以将我的站点关闭几个小时进行转换,或者至少警告人们,他们在接下来的几个小时内所做的任何更改都将由于数据库维护等原因丢失
  • 我的数据集不是很大——我的应用程序的主仪表板显示为.67gb,数据存储统计页面显示为200mb
  • 我正在使用python
  • 我没有使用blobstore(尽管我认为这是一个与纯数据存储迁移不同的问题——可以在维护blobstore的同时将数据存储使用迁移到MySql)
  • 我可以支付合理的金额(比如说,少于100美元)
  • 我相信我的应用程序是主/从的-它是在AppEngine的预览期间创建的。不过,我似乎找不到一个简单的方法来验证这一点
看起来大容量上传器应该能够将数据下载成文本格式,然后用mysqlimport加载,但我对这两种技术都没有任何经验。另外,云SQL似乎只支持导入mysqldump,因此我必须在本地安装MqSQL,mysqlimport数据,然后转储数据,然后导入转储

我当前的型号代码示例,如果需要:

class OilPatternCategory(db.Model):
    version = db.IntegerProperty(default=1)
    user = db.UserProperty()
    name = db.StringProperty(required=True)
    default = db.BooleanProperty(default=False)

class OilPattern(db.Model):
    version = db.IntegerProperty(default=2)
    user = db.UserProperty()
    name = db.StringProperty(required=True)
    length = db.IntegerProperty()
    description = db.TextProperty()
    sport = db.BooleanProperty(default=False)
    default = db.BooleanProperty(default=False)
    retired = db.BooleanProperty(default=False)
    category = db.CategoryProperty()

class League(db.Model):
    version = db.IntegerProperty(default=1)
    user = db.UserProperty(required=True)
    name = db.StringProperty(required=True)
    center = db.ReferenceProperty(Center)
    pattern = db.ReferenceProperty(OilPattern)
    public = db.BooleanProperty(default=True)
    notes = db.TextProperty()

class Tournament(db.Model):
    version = db.IntegerProperty(default=1)
    user = db.UserProperty(required=True)
    name = db.StringProperty(required=True)
    center = db.ReferenceProperty(Center)
    pattern = db.ReferenceProperty(OilPattern)
    public = db.BooleanProperty(default=True)
    notes = db.TextProperty()

class Series(db.Model):
    version = db.IntegerProperty(default=3)
    created = db.DateTimeProperty(auto_now_add=True)
    user = db.UserProperty(required=True)
    date = db.DateProperty()
    name = db.StringProperty()
    center = db.ReferenceProperty(Center)
    pattern = db.ReferenceProperty(OilPattern)
    league = db.ReferenceProperty(League)
    tournament = db.ReferenceProperty(Tournament)
    public = db.BooleanProperty(default=True)
    notes = db.TextProperty()
    allow_comments = db.BooleanProperty(default=True)
    complete = db.BooleanProperty(default=False)
    score = db.IntegerProperty(default=0)

class Game(db.Model):
    version = db.IntegerProperty(default=5)
    user = db.UserProperty(required=True)
    series = db.ReferenceProperty(Series)
    score = db.IntegerProperty()
    game_number = db.IntegerProperty()
    pair = db.StringProperty()
    notes = db.TextProperty()
    entry_mode = db.StringProperty(choices=entry_modes, default=default_entry_mode)

您是否考虑过使用Map Reduce框架? 您可以编写映射程序,将数据存储实体存储在CloudSQL中。 不要忘记为数据存储键添加一列,这可能会 帮助您避免重复行或识别丢失的行

你可以看看
获取有关mapper函数的灵感。

您是否考虑过使用Map Reduce框架? 您可以编写映射程序,将数据存储实体存储在CloudSQL中。 不要忘记为数据存储键添加一列,这可能会 帮助您避免重复行或识别丢失的行

你可以看看
这是一个非常开放的问题,可能有点为时过早。例如,所有这些因素都可能影响答案——你有多少数据?迁移时是否需要保持应用程序的活动状态?您是否需要转换数据以使其适合关系模型而不是实体模型?您使用的是python还是java?你在用blobstore吗?你愿意花钱快速完成它,还是想限制它,让它在你的免费配额内发生?你已经切换到人力资源部了吗?你甚至可以访问有限的预览吗?(如果没有,你可能想等到人们真正使用了这项服务,因为你会得到更好的信息。)@Peter这是一个有用的方法checklist@Peter我为我的情况提供了更多的细节。我注册了有限预览-我还没有被授予访问权限,但在某个时候我会想这样做。@Petercore我现在可以访问有限预览。这是一个非常开放的问题,可能有点为时过早。例如,所有这些因素都可能影响答案——你有多少数据?迁移时是否需要保持应用程序的活动状态?您是否需要转换数据以使其适合关系模型而不是实体模型?您使用的是python还是java?你在用blobstore吗?你愿意花钱快速完成它,还是想限制它,让它在你的免费配额内发生?你已经切换到人力资源部了吗?你甚至可以访问有限的预览吗?(如果没有,你可能想等到人们真正使用了这项服务,因为你会得到更好的信息。)@Peter这是一个有用的方法checklist@Peter我为我的情况提供了更多的细节。我注册了有限预览-我还没有被授予访问权限,但在某个时候我会想这样做。@PeterRecore我现在可以访问有限预览了。