4

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

(我使用的完整迁移脚本在单独的Github 问题中有详细说明)

我们使用以下导出

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 init INFO:本地数据存储已初始化:类型:高复制存储:\WEB-INF\appengine-generated\local_db.bin com.google.appengine.api.datastore.dev。 LocalDatastoreService 加载信息:无法从后备存储加载,\WEB-INF\appengine-generated\local_db.bin java.lang.ClassNotFoundException:com.google.cloud.datastore.emulator.impl.LocalDatastoreFileStub$FileProfile at 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 权限。具体来说,我们已尝试将 Project Editor IAM 角色添加到我们用于我们的帐户的帐户中gcloud login,如激活 App Engine 的 DataStore 权限中所述。

我们还查看了以下内容,其中详细说明了使用 GitHub 问题中详述的导出/导入 Powershell 脚本时所需的权限。

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

我们相信我们当前的角色应该允许本文描述的所需权限。

4

1 回答 1

2

不要复制 local_db.bin 文件,因为这可能会导致不正确的内存引用/指针。请改用以下程序:

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