恢复appengine数据存储数据的选项?

时间:2012-05-02 19:00:35

标签: google-app-engine google-cloud-datastore restore database-backups

我们的应用程序的用户意外删除了数据。他们想要恢复它。我们没有可以执行此操作的特殊逻辑或数据存储区实体。

但是,我们使用数据存储区管理员每天将整个数据存储区备份到blobstore。

有哪些选项可以选择性地将部分备份还原回数据存储区?

我们最好不要让其他用户中断服务。最后一个限制是我们无法更改我们的生产应用ID(即将数据复制到新应用,然后将备份恢复到我们的旧应用 - 这是因为我们的客户直接引用我们的appid。)

思想?

更新

我正在考虑在应用程序中的所有blob上运行mapreduce,并找到与备份有关的blob。解析这些备份并根据需要还原实体。唯一的问题是,blob存储的格式是什么?我该如何解析它们?

3 个答案:

答案 0 :(得分:1)

从1.6.5开始,数据存储区管理员现在允许您从现有备份中恢复各个种类。

关于备份格式:根据datastore admin source code,您可以使用RecordsReader来读取MapperPipeline中leveldb log format中存储的备份文件

答案 1 :(得分:0)

当前形式的还原功能对我的应用程序来说并不是很有用。应该有一个选项,只将少数实体或命名空间恢复到当前app-id或另一个app-id。 请为此问题加注星标 http://code.google.com/p/googleappengine/issues/detail?id=7311

答案 2 :(得分:0)

可能会custom backup reader帮助您

final BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
final BlobKey blobKey = blobstoreService.createGsBlobKey("/gs/" + bucket + "/" + pathToOutputFile);

final RecordReadChannel rrc = BlobserviceHelper.openRecordReadChannel(blobKey, blobstoreService);

ByteBuffer bf;
while ((bf = rrc.readRecord()) != null) {
  final OnestoreEntity.EntityProto proto = new OnestoreEntity.EntityProto();
  proto.mergeFrom(bf.array());
  final Entity entity = EntityTranslator.createFromPb(proto);
  entity.removeProperty(""); // Remove empty property
  //Now you can save entity to datastore or read keys and properties
}