我们的应用程序的用户意外删除了数据。他们想要恢复它。我们没有可以执行此操作的特殊逻辑或数据存储区实体。
但是,我们使用数据存储区管理员每天将整个数据存储区备份到blobstore。
有哪些选项可以选择性地将部分备份还原回数据存储区?
我们最好不要让其他用户中断服务。最后一个限制是我们无法更改我们的生产应用ID(即将数据复制到新应用,然后将备份恢复到我们的旧应用 - 这是因为我们的客户直接引用我们的appid。)
思想?
更新
我正在考虑在应用程序中的所有blob上运行mapreduce,并找到与备份有关的blob。解析这些备份并根据需要还原实体。唯一的问题是,blob存储的格式是什么?我该如何解析它们?
答案 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
}