You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Terraform为MySQL数据库授予SYSTEM_USER权限?

问题

使用Terraform在GCP上自动化部署MySQL数据库时,执行需要SYSTEM_USER权限的SQL脚本时触发权限错误,具体报错如下:

执行命令错误
'mysql -h <IP_ADDRESS> -P 3306 -u root -p < ./database.sql': 退出状态1。
输出: mysql:
[警告] 在命令行界面使用密码存在安全风险。
ERROR 1227 (42000) 在第510行: 访问被拒绝;执行此操作需要(至少一个)SYSTEM_USER权限

相关Terraform配置代码:

resource "google_sql_database_instance" "mysql_instance" {
  name             = var.instance_name
  database_version = "MYSQL_8_0"
  region           = "us-central1"
  root_password    = var.password

  settings {
      disk_autoresize = "false"
      disk_size       = "10"
      disk_type       = "PD_SSD"
      tier            = "db-n1-standard-1"
      ip_configuration {
        ipv4_enabled = "true"
        dynamic "authorized_networks" {
          for_each = var.cloud_sql.authorized_networks
          iterator = network
          content {
            name  = "ip-${network.key}"
            value = network.value
          }
        }
      }
  }
}
resource "google_sql_database" "database" {
  name     = "cloud_sql_db"
  instance = google_sql_database_instance.mysql_instance.name

  provisioner "local-exec" {
      command = "mysql -h ${google_sql_database_instance.mysql_instance.public_ip_address} -P 3306 -u root -p${google_sql_database_instance.mysql_instance.root_password} ${google_sql_database.database.name} < ${var.sql_script}"
  }
}

resource "google_sql_user" "users" {
  name     = "root"
  instance = google_sql_database_instance.mysql_instance.name
  host     = "%"
  password = google_sql_database_instance.mysql_instance.root_password
}
原因

GCP Cloud SQL的默认root用户不具备SYSTEM_USER权限——作为托管数据库服务,Cloud SQL限制了部分超级管理员权限,需要手动为root用户授予该权限后才能执行相关操作。

解决方案

1. 调整local-exec命令,先授予SYSTEM_USER权限再执行SQL脚本

修改google_sql_database资源中的local-exec命令,先执行授权语句,再导入脚本:

resource "google_sql_database" "database" {
  name     = "cloud_sql_db"
  instance = google_sql_database_instance.mysql_instance.name

  # 确保用户资源创建完成后再执行脚本
  depends_on = [google_sql_user.users]

  provisioner "local-exec" {
      command = <<EOT
mysql -h ${google_sql_database_instance.mysql_instance.public_ip_address} -P 3306 -u root -p${google_sql_database_instance.mysql_instance.root_password} -e "GRANT SYSTEM_USER ON *.* TO 'root'@'%';" && \
mysql -h ${google_sql_database_instance.mysql_instance.public_ip_address} -P 3306 -u root -p${google_sql_database_instance.mysql_instance.root_password} ${google_sql_database.database.name} < ${var.sql_script}
EOT
  }
}

2. 补充依赖关系

添加depends_on = [google_sql_user.users]确保root用户资源完全创建后,再执行SQL脚本,避免因用户未就绪导致的权限问题。

说明

  • 授权语句GRANT SYSTEM_USER ON *.* TO 'root'@'%';会为所有主机(%)的root用户授予SYSTEM_USER权限,满足脚本执行需求。
  • 命令行明文传递密码存在安全风险,生产环境建议使用MySQL配置文件(如~/.my.cnf)或环境变量传递认证信息。

内容的提问来源于stack exchange,提问作者Deepak Singh Rajput

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 15:02:43