App Engine-LocalDatastoreService加载-无法从后备存储加载

时间:2019-03-07 06:38:22

标签: java google-app-engine google-cloud-platform google-cloud-datastore datastore-mode-emulator

我们正在使用App Engine,数据存储区和Java,但一直没有成功尝试将生产的Google数据存储区复制到本地副本。

(我正在使用的完整迁移脚本在单独的 Github question 中进行了详细说明)

我们使用以下内容导出

gcloud datastore export --namespaces="(default)" gs://$GOOGLE_CLOUD_BUCKET

然后导入,看起来像这样

'http://' + $LOCAL_DATASTORE_HOSTNAME + ':' + $LOCAL_DATASTORE_PORT + '/v1/projects/' + $PROJECT_ID + ':import'

运行脚本会创建一个看起来正确的“ local_db.bin”,然后将其复制到所需位置并运行它,我们遇到以下错误。

  

com.google.appengine.api.datastore.dev.LocalDatastoreService初始化   INFO:本地数据存储已初始化:       类型:高复制       储存空间:\ WEB-INF \ appengine-generated \ local_db.bin   com.google.appengine.api.datastore.dev.LocalDatastoreService负载   INFO:无法从后备存储\ WEB-INF \ appengine-generation \ local_db.bin加载   java.lang.ClassNotFoundException:com.google.cloud.datastore.emulator.impl.LocalDatastoreFileStub $ FileProfile       在java.net.URLClassLoader.findClass(URLClassLoader.java:382)       在java.lang.ClassLoader.loadClass(ClassLoader.java:424)

如果我们再保存一条新记录,它会吹走local_db.bin并创建一个新记录。

有人知道这个问题可能在哪里吗?

更新:

我已经按照@Chris Halcrow在其答案中描述的确切过程重新导入了数据。现在,数据已成功成功直接导入到App Engine应该看到的local_db.bin中,但是我仍然看到错误。

我们怀疑可能存在权限问题。我们已经尝试更改AppEngine运行所在帐户的一些IAM权限。具体来说,我们已尝试将activate DataStore permissions for App Engine中记录的项目编辑器IAM角色添加到我们用于gcloud login的帐户中。

我们还回顾了以下内容,其中详细介绍了我们使用GitHub问题中详细介绍的Export / import Powershell脚本时所需的权限。

https://cloud.google.com/datastore/docs/export-import-entities#permissions

我们认为我们当前的角色应该允许其描述所需的权限。

1 个答案:

答案 0 :(得分:2)

请勿复制local_db.bin文件,因为这很可能导致错误的内存引用/指针。请按照以下步骤操作:

  1. 停止本地AppEngine(在控制台中终止,或关闭Eclipse / IntelliJ或其他正在运行的引擎)
  2. 停止正在运行DataStore Emulator的所有内容(例如,如果您通过命令提示符运行该过程,则终止该过程)。
  3. 确定正在运行的AppEngine实例在哪里寻找local_db.bin文件(对于在AppEngine本地实例下运行的Java应用程序,默认位置与包含WAR文件的目录有关,例如{{1 }})
  4. 删除C:\my_app_engine_app\target\my-app-name-1.0-SNAPSHOT\WEB-INF\appengine-generated\local_db.bin文件夹中的内容
  5. 打开常规的Windows命令提示符(以管理员身份运行)
  6. appengine-generated到包含您的AppEngine应用的目录
  7. 使用以下命令运行仿真器(确保cd指定在步骤3中确定的目录)-data-dir(请参阅https://cloud.google.com/datastore/docs/tools/datastore-emulator#starting_the_emulator
  8. 记下DataStore模拟器启动的端口
  9. 确保您的DataStore导入脚本将此端口用作gcloud beta emulators datastore start --data-dir=C:\my_app_engine_app\target\my-app-name-1.0-SNAPSHOT\的值
  10. 在本地DataStore模拟器仍在运行的情况下,再次运行导入脚本(对于Powershell脚本,请确保在以管理员身份运行Powershell的同时运行该脚本)
  11. 如果成功,您应该在控制台中看到一些类似于以下某些或全部的消息: INFO:将处理程序添加到新注册的频道 INFO:检测到HTTP / 2连接 INFO:检测到非HTTP / 2连接 保留数据存储的时间:125毫秒
  12. 现在检查您的local_db.bin文件,例如$LOCAL_DATASTORE_PORT-您应该看到它已经膨胀,表明它现在包含您的数据。