Golang中如何解决MySQL Error 1045: 用户访问被拒绝的问题
Golang中如何解决MySQL Error 1045: 用户访问被拒绝的问题 我最近开始自学Go语言,并遇到了这个错误。可能是我没有理解Go语言教程中用于数据库连接的mysql驱动程序的正确用法。
db, err := sql.Open("mysql", "user:pass@tcp(mywebserver)/networking_test")
错误返回的是我的本地IP地址,提示在使用密码时访问被拒绝。SQL查询是否从未离开我的网络?完整代码如下,下方附有完整的错误信息。
package main
import (
"fmt"
"database/sql"
_ "mysql"
)
func main() {
fmt.Println("Go MySQL Tutorial")
db, err := sql.Open("mysql", "user:npass@tcp(mywebserver)/networking_test")
if err != nil {
panic(err.Error())
}
defer db.Close()
dbuser, err := db.Query("SELECT user FROM authentication")
if err != nil {
panic(err.Error())
}
defer dbuser.Close()
}
//Error - panic: Error 1045: Access denied for user 'networkuser'@'LOCALHOST(using password: YES)
更多关于Golang中如何解决MySQL Error 1045: 用户访问被拒绝的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html
不幸的是,我目前只在运行Windows。命令提示符中是否有内置的SQL功能?
更多关于Golang中如何解决MySQL Error 1045: 用户访问被拒绝的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
mysql-cli GRANT 命令?
你能从终端访问MySQL吗?
对于Ubuntu Linux,你可以输入:
sudo mysql -u username -p
是的,必须是相同的。 “要启动客户端,请在命令提示符窗口中输入以下命令:mysql -u root -p。”
或者,您能否使用相同的用户名和密码通过 MySQL Workbench 访问您的数据库?
请尝试以这种方式访问,因为您的问题看起来与 MySQL 配置有关。
这个错误通常是由于MySQL用户权限配置问题导致的。以下是几种可能的解决方案:
1. 检查连接字符串格式
确保连接字符串使用正确的格式:
// 标准格式
db, err := sql.Open("mysql", "username:password@tcp(hostname:port)/database")
// 示例
db, err := sql.Open("mysql", "networkuser:npass@tcp(mywebserver:3306)/networking_test")
2. 验证MySQL用户权限
需要在MySQL服务器上检查用户权限:
-- 查看用户权限
SELECT user, host FROM mysql.user WHERE user = 'networkuser';
-- 授予权限(如果需要)
GRANT ALL PRIVILEGES ON networking_test.* TO 'networkuser'@'%' IDENTIFIED BY 'npass';
FLUSH PRIVILEGES;
3. 检查MySQL绑定地址
确保MySQL服务器允许远程连接:
-- 查看绑定地址
SHOW VARIABLES LIKE 'bind_address';
-- 如果绑定地址是127.0.0.1,需要修改为0.0.0.0或特定IP
-- 修改my.cnf或my.ini文件:
-- bind-address = 0.0.0.0
4. 使用正确的驱动导入
确保使用正确的MySQL驱动:
import (
"database/sql"
_ "github.com/go-sql-driver/mysql" // 使用这个驱动
)
func main() {
// 连接字符串示例
db, err := sql.Open("mysql", "networkuser:npass@tcp(mywebserver:3306)/networking_test?charset=utf8&parseTime=True&loc=Local")
if err != nil {
panic(err.Error())
}
defer db.Close()
// 测试连接
err = db.Ping()
if err != nil {
panic(err.Error())
}
fmt.Println("Connected successfully")
}
5. 检查防火墙设置
确保MySQL端口(默认3306)在防火墙中是开放的:
# Linux检查端口
sudo ufw status
sudo ufw allow 3306
# 或者临时测试
telnet mywebserver 3306
6. 完整示例代码
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql"
)
func main() {
// 连接字符串参数说明:
// networkuser: 用户名
// npass: 密码
// mywebserver:3306: 服务器地址和端口
// networking_test: 数据库名
// charset=utf8&parseTime=True&loc=Local: 连接参数
dsn := "networkuser:npass@tcp(mywebserver:3306)/networking_test?charset=utf8&parseTime=True&loc=Local"
db, err := sql.Open("mysql", dsn)
if err != nil {
log.Fatal("Failed to open database:", err)
}
defer db.Close()
// 验证连接
err = db.Ping()
if err != nil {
log.Fatal("Failed to connect to database:", err)
}
fmt.Println("Successfully connected to MySQL database")
// 执行查询
rows, err := db.Query("SELECT user FROM authentication")
if err != nil {
log.Fatal("Query failed:", err)
}
defer rows.Close()
// 处理查询结果
for rows.Next() {
var user string
err := rows.Scan(&user)
if err != nil {
log.Fatal("Scan failed:", err)
}
fmt.Println("User:", user)
}
}
错误信息显示'networkuser'@'LOCALHOST',这表明MySQL服务器认为连接来自localhost。如果实际上是从远程连接,可能需要检查MySQL的skip-name-resolve配置或确保使用IP地址而非主机名进行连接。

