3

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

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

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

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

想法?

更新

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

4

3 回答 3

1

从 1.6.5 开始,Datastore Admin 现在允许您从现有备份中恢复单个种类。

关于备份格式:根据数据存储管理源代码,您可以使用RecordsReader读取存储在MapperPipeline中的leveldb 日志格式的备份文件

于 2012-05-02T23:30:47.487 回答
0

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

于 2012-05-03T04:10:17.597 回答
0

可能是自定义备份阅读器帮助您

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
}
于 2015-12-17T20:11:02.143 回答