我已经按照MySQL导出指南成功导出了MySQL数据库。
现在,我正在尝试按照MySQL导入指南导入MySQL数据库。
我已经检查了我正在使用的service_account_email
的权限,并且我允许管理员 SQL和管理员存储权限。
我能够在本地使用此命令成功激活我的服务帐户:
gcloud auth activate-service-account <service_account_email> --key-file=<service_account_json_file>
运行命令后:
gcloud sql import sql <instance> <gstorage_file> --database=<db_name> --async
我得到了这些信息:
{
"error": {
"errors": Array[1][
{
"domain": "global",
"reason": "required",
"message": "Login Required",
"locationType": "header",
"location": "Authorization"
}
],
"code": 401,
"message": "Login Required"
}
}
我尝试过的其他事情
我还尝试使用我的 SQL 实例的service_account_email
,它来自:
gcloud sql instances describe <instance_name>
但是,它似乎有同样的错误。
问题
根据我给出的 REST API JSON 错误,如何使用service_account_email
"登录",这样我就不会得到401 Error
?
问题在于数据库实例服务帐户在创建的存储桶上写入的权限。解决此问题的步骤
1( 进入您的云 SQL 实例,复制实例的服务账号(云 SQL->{实例名称}->概述->服务账号(
2( 复制服务帐户后,转到要转储的云存储桶,并为该帐户设置所需的权限(存储->{存储桶名称}->权限->添加成员(。
云 SQL 实例在不属于您项目的 Google 服务帐号下运行。 您需要授予此用户对要导入的 Cloud Storage 中文件的权限。 这是一个方便的花花公子 bash 片段可以做到这一点。
SA_NAME=$(gcloud sql instances describe YOUR_DB_INSTANCE_NAME --project=YOUR_PROJECT_ID --format="value(serviceAccountEmailAddress)")
gsutil acl ch -u ${SA_NAME}:R gs://YOUR_BUCKET_NAME;
gsutil acl ch -u ${SA_NAME}:R gs://${YOUR_BUCKET_NAME}/whateverDirectory/fileToImport.sql;
第一行获取服务帐户电子邮件地址。 下一行授予此服务账户对存储桶的读取权限。 最后一行授予服务帐户对文件的读取权限。
谷歌也有一些最糟糕的错误报告。如果您收到此错误消息,也可能是您输入的 PATH 不正确。就我而言,这是我通往存储桶目录的路径。去想一想,我没有访问不存在的存储桶的权限。技术上正确,但几乎没有用处。
根据谷歌文档
- 描述要导入到的实例:
gcloud sql instances describe INSTANCE_NAME
- 复制"服务帐户电子邮件地址"字段。
- 使用 gsutil iam 将 storage.objectAdmin IAM 角色授予存储桶的服务账户.
gsutil iam ch serviceAccount:SERVICE-ACCOUNT:objectAdmin gs://BUCKET-NAME
- 然后导入数据库
在进行一些研究并根据权限错误后,这些是我认为对您解决问题更有用的步骤:
为了更轻松地测试 ACL 和权限,您可以:
- 为相关服务帐户创建和下载密钥
- 使用"gcloud 身份验证激活服务帐户"获取服务帐户的凭据
- 像往常一样使用 gsutil 查看是否可以访问相关对象
您可能需要向相关服务账户授予其他 IAM 角色,例如"roles/storage.admin",请参阅此处的更多信息。