2011-10-11 66 views
1

现在谷歌已经宣布了应用引擎的可用性Cloud SQL storage,将现有数据从BigTable/GAE Datastore迁移到MySQL的最佳方式是什么?将数据从BigTable/GAE Datastore迁移到RDBMS的最佳方式是什么?

为了应对由彼得带来了出色的问题:

  • 在我的特殊情况下,我一直在我的数据模型非常关系。
  • 我很抱歉让我的网站停机几个小时来完成转换,或者至少警告人们,他们为接下来的几个小时所做的任何更改都将因数据库维护而丢失等。
  • 我的数据设置不是很大 - 我的应用程序的主仪表板显示为.67gb,数据存储统计页面显示它更像200mb。
  • 我正在使用python。
  • 我没有使用blobstore(虽然我认为这是一个单纯的数据存储迁移的问题 - 可以在维护blobstore的同时将数据存储区的使用迁移到MySql)。
  • 我会支付一个合理的金额(比如说少于100美元)。
  • 我相信我的应用程序是主/从 - 它是在App Engine预览期间创建的。我似乎无法找到一个简单的方法来验证,虽然。

好像批量上传应该能够被用于将数据下载到那时,可以装载mysqlimport的文本格式,但我没有与任何一种技术的经验。此外,云SQL似乎只支持导入mysqldumps,所以我将不得不在本地安装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) 
+1

这是一个相当宽敞的问题,可能有点不成熟。例如,所有这些因素都可能影响答案 - 您有多少数据?你需要在迁移时保持你的应用程序生存吗?您是否需要转换数据以使其适合关系模型而不是实体模型?你使用Python或Java?你在使用blobstore吗?你是否愿意付钱来快速完成它,或者你是否想要限制它,以免它发生在你的免费配额中?你是否已经转向HRD? –

+0

你甚至可以访问有限的预览吗? (如果没有的话,你可能要等到人们真正使用这个服务,因为那样你会得到更好的信息。) –

+0

@Peter这是一个有用的清单 – systempuntoout

回答

1

你有没有考虑使用Map Reduce框架? 您可以编写将数据存储实体存储在CloudSQL中的映射器。 不要忘记为数据存储密钥添加一列,这可能会帮助您避免重复行或识别缺少的行。

您可能会看看https://github.com/hudora/gaetk_replication 以获得关于mapper函数的灵感。

相关问题