GCP环境MySQL8.0赋权报1045错,如何为新建'user-1'@'%'授予全库权限
核心问题定位
你遇到的报错和你写的SQL语法本身没有关系——之前在MySQL 5.7环境用完全一样的语句能正常跑通,升级到MySQL 8就报错,本质是两个层面的原因叠加:
- GCP的Cloud SQL托管实例在MySQL 8版本上线后收紧了默认安全策略,你当前远程登录使用的
root@%账户,只是开放给外部连接的远程入口账户,本身不具备全局授权、用户管理的操作资格 - 你查询
mysql.user表看到的root@localhost、root@127.0.0.1是托管实例内部的本地超级管理员,平台出于安全考虑,完全将这个账户和外部网络做了隔离,本来就不允许远程登录,你之前的判断是对的 - 执行操作时报出的
SQL Error (1045)不是连接阶段的密码错误:你已经成功连上实例(否则执行SELECT * FROM mysql.user时就会被直接拦截),这个报错是当前登录的远程账户没有执行用户创建、权限分配的权限,触发的操作拒绝。
落地解决步骤
整个过程不需要你想办法登录root@localhost账户,所有权限调整都可以通过GCP控制台完成:
1. 为远程登录的root@%账户补全全量权限
GCP托管的Cloud SQL实例有平台层的权限保护机制,不支持直接修改系统表调整权限,所有账户权限变更必须走控制台流程:
- 登录GCP控制台,进入对应Cloud SQL MySQL 8实例的详情页面
- 切换到「用户」配置板块,找到你当前远程连接使用的
root@%对应用户条目 - 点击编辑权限,在全局权限范围下勾选所有权限项,重点确保开启两类核心权限:
- 用户创建、修改、删除的用户管理权限
- 可将权限授予其他账户的
GRANT OPTION授权能力
- 保存配置后等待10-30秒,让平台完成权限同步
2. 校验权限配置结果
权限同步完成后,用原有HeidiSQL连接重新登录实例,执行权限校验语句:
SHOW GRANTS FOR 'root'@'%';
如果返回结果中包含GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION,说明权限配置已经生效,不会再出现之前的权限拒绝报错。
3. 执行目标用户的创建与授权
权限校验通过后,按照MySQL 8的语法完成目标账户操作:
首先创建目标用户:
CREATE USER 'user-1'@'%' IDENTIFIED BY 'user_password';
*如果你的HeidiSQL版本较低,不支持MySQL 8默认的caching_sha2_password密码插件,可以在创建用户时指定兼容的密码认证方式,避免连接失败:
CREATE USER 'user-1'@'%' IDENTIFIED WITH mysql_native_password BY 'user_password'; ```* 完成用户创建后,为用户分配全库全量操作权限: ```sql GRANT ALL PRIVILEGES ON *.* TO 'user-1'@'%' WITH GRANT OPTION;
最后执行权限刷新语句让配置生效:
FLUSH PRIVILEGES;
补充注意事项
- 同样的语法在GCP MySQL 5.7环境可以正常运行,是因为5.7版本的Cloud SQL默认给远程
root@%账户开放了全量授权权限,升级到8版本后平台收紧了默认的权限边界,才会出现升级后突然报权限错误的问题 - 不要尝试通过SSH隧道连接实例直接修改
mysql.user系统表调整权限,这种操作是自建MySQL环境下的排错方法,对GCP托管实例无效,平台检测到非控制台发起的系统表权限变更会自动回滚,甚至可能导致实例配置异常。
内容的提问来源于stack exchange,提问作者Dhirendra Saw
相关产品推荐
相关产品推荐

