如何通过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
相关产品推荐
相关产品推荐

