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

5 回复

不幸的是,我目前只在运行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地址而非主机名进行连接。

回到顶部