我们正在使用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
我们认为我们当前的角色应该允许其描述所需的权限。
答案 0 :(得分:2)
请勿复制local_db.bin文件,因为这很可能导致错误的内存引用/指针。请按照以下步骤操作:
C:\my_app_engine_app\target\my-app-name-1.0-SNAPSHOT\WEB-INF\appengine-generated\local_db.bin
文件夹中的内容appengine-generated
到包含您的AppEngine应用的目录cd
指定在步骤3中确定的目录)-data-dir
(请参阅https://cloud.google.com/datastore/docs/tools/datastore-emulator#starting_the_emulator)gcloud beta emulators datastore start
--data-dir=C:\my_app_engine_app\target\my-app-name-1.0-SNAPSHOT\
的值$LOCAL_DATASTORE_PORT
-您应该看到它已经膨胀,表明它现在包含您的数据。