MySQL dial tcp 127.0.0.1:3306: connect: connection refused

MySQL dial tcp 127.0.0.1:3306: connect: connection refused

在使用Go语言操作MySQL数据库时,连接失败的问题十分常见。通常会出现一些错误信息,如下所示:

dial tcp 127.0.0.1:3306: connect: connection refused
Mysql
Error 1045: Access denied for user 'root'@'localhost' (using password: YES)
Mysql

这篇文章将从多个方面介绍MySQL连接失败的问题,并提供解决方案。

阅读更多:MySQL 教程

连接MySQL的基本配置

在Go语言项目中连接MySQL数据库,需要执行以下基本配置:

  • 导入mysql驱动:import "github.com/go-sql-driver/mysql"
  • 创建dsn(数据源名称):如下所示
dsn := "用户名:密码@tcp(地址:端口)/数据库名称?charset=UTF8&parseTime=True&loc=Local"
Go

其中:
用户名:MySQL要求的连接用户名
密码:该用户名对应的密码
地址:连接MySQL的地址,通常是本地127.0.0.1localhost,如果服务器上有多个MySQL实例,根据端口号来决定连接哪一个MySQL服务
端口:MySQL的默认端口号是3306
数据库名称:要连接的数据库的名称,需要确保该用户对该数据库拥有正确的权限
charset:设置字符编码为UTF-8
parseTime:解析时间戳格式为Go的Time类型
loc:设置时区为本地

连接MySQL失败的常见原因

MySQL服务未启动

连接MySQL服务时,需要确保MySQL服务已经启动。可以用以下命令来检查:

service mysql status
Mysql

如果MySQL服务未开启,则需要使用以下命令启动MySQL服务:

service mysql start
Mysql

MySQL用户权限错误

当连接MySQL数据库时,如果你使用了错误的用户名或密码,则会出现错误信息:

Error 1045: Access denied for user 'root'@'localhost' (using password: YES)
Mysql

为了避免这个问题,我们需要确认连接MySQL的用户名和密码都是正确的,并且该用户对应的数据库也有正确的权限。

防火墙(Firewall)错误

在Linux服务器上,通常使用防火墙来设置入站和出站规则。如果防火墙不允许连接到MySQL连接端口,则连接将会被拒绝:

dial tcp 127.0.0.1:3306: connect: connection refused
Mysql

通常在Ubuntu服务器上使用以下命令打开端口:

sudo ufw allow 3306/tcp
Mysql

MySQL实例启动运行失败

MySQL实例启动运行时,如果出现了问题,则可能导致MySQL连接失败。此时需要检查MySQL错误日志来找到问题所在:

sudo tail -f /var/log/mysql/error.log
Mysql

如日志中出现了错误信息,则需要按照错误信息进行排查。

MySQL设置错误

MySQL配置文件my.cnf中的一些设置可能会影响连接成功。常见的一个例子是bind-address选项,如果设置了值为127.0.0.1,则只能从本地连接到MySQL服务,无法从其他计算机上连接到MySQL服务。

bind-address选项

如果你的MySQL设置了bind-address选项,将会造成连接失败。如果你的应用程序需要从其他计算机连接MySQL服务,则需要将bind-address设置为0.0.0.0

解决MySQL连接失败的方案

解决防火墙设置问题

MySQL默认使用3306端口。在Ubuntu服务器上,通常通过以下命令打开端口:

sudo ufw allow 3306/tcp
Mysql

修改MySQL的bind-address选项

如果你正在尝试从其他计算机连接MySQL,需要将bind-address选项设置为0.0.0.0,允许从任何IP地址连接到MySQL服务。

  1. 编辑MySQL的配置文件my.cnf,通常位于/etc/mysql/mysql.conf.d/mysqld.cnf路径下。

  2. 将bind-address选项设置为0.0.0.0,即允许从任何IP地址连接到MySQL服务。如下:

[mysqld]
bind-address = 0.0.0.0
Ini
  1. 保存并关闭文件。

  2. 重启MySQL服务:

sudo service mysql restart
Mysql

使用正确的用户名和密码

确认连接MySQL的用户名和密码都是正确的,并且该用户对应的数据库也有正确的权限。

排查MySQL启动运行错误

检查MySQL错误日志来找到问题所在,然后按照错误信息进行排查。

使用连接池

使用MySQL连接池可以有效地减少MySQL连接失败的问题,同时也能提高应用程序的性能。Go语言中,可以使用database/sqlgithub.com/go-sql-driver/mysql包来实现MySQL连接池。

以下是使用连接池的示例代码:

import (
    "database/sql"
    "fmt"
    "time"

    _ "github.com/go-sql-driver/mysql"
)

func main() {
    db, err := sql.Open("mysql", "用户名:密码@tcp(地址:端口)/数据库名称")
    if err != nil {
        panic(err.Error())
    }
    defer db.Close()

    // 开启连接池
    db.SetMaxIdleConns(10)
    db.SetMaxOpenConns(100)
    db.SetConnMaxLifetime(10 * time.Minute)

    // 使用连接池执行查询
    rows, err := db.Query("SELECT * FROM 表名")
    if err != nil {
        panic(err.Error())
    }
    defer rows.Close()

    // 处理查询结果
    for rows.Next() {
        var id int
        var name string
        err := rows.Scan(&id, &name)
        if err != nil {
            panic(err.Error())
        }
        fmt.Printf("id: %d, name: %s\n", id, name)
    }
}
Go

使用重连机制

在某些情况下,由于网络中断或MySQL服务重启等原因,已经建立的MySQL连接可能会失效,导致连接失败。针对这种情况,可以使用重连机制来重新建立连接。

以下是使用重连机制的示例代码:

import (
    "database/sql"
    "fmt"
    "time"

    _ "github.com/go-sql-driver/mysql"
)

func main() {
    retries := 0
    db, err := sql.Open("mysql", "用户名:密码@tcp(地址:端口)/数据库名称")
    if err != nil {
        panic(err.Error())
    }
    defer db.Close()

    // 开启重连机制
    for {
        err := db.Ping()
        if err != nil {
            fmt.Printf("MySQL连接失败,重新连接(%d)...\n", retries)
            time.Sleep(time.Duration(retries) * time.Second)
            db, err = sql.Open("mysql", "用户名:密码@tcp(地址:端口)/数据库名称")
            if err != nil {
                panic(err.Error())
            }
            retries++
        } else {
            fmt.Println("MySQL连接成功!")
            break
        }
    }
}
Go

总结

MySQL连接失败的问题可能有多种原因,如MySQL服务未启动、MySQL用户权限错误、防火墙设置等。为了避免MySQL连接失败的问题,我们需要进行基本的配置,如导入mysql驱动、创建dsn等。如果出现连接失败的情况,可以使用连接池、重连机制等解决方案。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册