mysql client常见error总结

本文详细解释了MySQL客户端连接服务器时可能出现的几种错误及其原因,包括连接重置、超时、被拒绝及中断的系统调用等问题,并分析了不同错误代码对应的解决思路。

mysql 客户端连接服务器,客户端报对应的错误号总结:

 1.      Error  104

mysql@longxibendi-dba-u-abcd00.longxibendi:~$perror 104

OS error code 104:  Connection reset by peer

这个是由于server端 backlog 满了 导致。

 2.  Error 110

mysql@longxibendi-dba-u-abcd00.longxibendi:~$perror 110

OS error code 110:  Connection timed out

这个是与server端 连接时 超时 导致。超时时间超过了客户端time out。

 3. Error 111

mysql@longxibendi-dba-u-abcd00.longxibendi:~$perror 111

OS error code 111:  Connection refused

这个是与server端 连接,被server连接拒绝,说明这个端口不处于监听状态,或该端口不开放导致。

 4. Error 4

mysql@longxibendi-dba-u-abcd00.longxibendi:~$perror 4

OS errorcode   4:  Interrupted system call

这个说明,客户端发起第一个tcp包(syn包),在客户端设置的时间内,没有得到响应。在没有超过客户端的timeout时间(也有其它原因,比如文件句柄不够也会被OS断开这次连接),客户端被OS断开了。

 重点说明下 error 4

mysql@longxibendi-dba-u-abcd00.longxibendi:~$mysql -hlongxibendi-cd-pa-abcd00  -P3309 --connect-time=5

ERROR 2003 (HY000): Can't connect to MySQL server on'longxibendi-cd-pa-abcd00' (4)

mysql@longxibendi-dba-u-abcd00.longxibendi:~$time mysql -hlongxibendi-cd-pa-abcd00  -P3306 --connect-time=8

ERROR 2003 (HY000): Can't connect to MySQL server on'longxibendi-cd-pa-abcd00' (4)

real    0m8.006s

user    0m0.004s

sys     0m0.001s

mysql@longxibendi-dba-u-abcd00.longxibendi:~$mysql -hlongxibendi-cd-pa-abcd00 -P3309 --connect-time=10

ERROR 2013 (HY000): Lost connection to MySQL server at 'readinginitial communication packet', system error: 110

 客户端与server进行连接,连接重试次数,取决于/proc/sys/net/ipv4/tcp_syn_retries 这个参数(测试的服务器,该参数=1)

这样,客户端,第一次发起连接,持续3s,不成功,进行第一次重试,持续6s,如果不成功,则被OS断开。

 所以,在设置为 connect-time=5、8s 的二次测试中,都是因为,第一次重试,重试还没完成,但超过connect-time时间,客户端被OS断开。(因为要完成第一次重试,至少需要9s,而connect-time小于9s)。故而报 error 4 。

       在设置为connect-time=10s的测试中,客户端第一次发起连接,持续3s,不成功,进行第一次重试,重试完,还没成功,到达connect-time时间,客户端断开。故而报 error 110 。

 总结下,假设 /proc/sys/net/ipv4/tcp_syn_retries的值为 n

 则,在 tcp发起连接时,先发送syn包,在没有超过 connect-time 之前,依次重试时间间隔规律为

3s    6s     12s   24s     48s

0次    第1次   第2次  第3次   第4次    

 第0次,发syn包,持续3s等响应,如果没有,重试第1次,发送syn包,持续6s,如果没有重试第2次,发syn包,持续12s,依次类推

总花费时间为:

传输时间+间隔时间=传输时间  + 3*[1*(1-2n)/(1-2) + 2 n]=3 (2n+1 -  1 ) + 传输时间

因为传输时间基本为0s

所以省略传输时间,总花费时间大概为 3 (2n+1  -  1 ) 秒

<think>好的,用户需要寻找适用于Go语言的MySQL客户端库或驱动。首先,我得回忆一下常见的Go语言数据库库。Go的标准库里有database/sql,这是一个通用的接口,但具体的数据库驱动需要第三方实现。 对于MySQL来说,最常用的应该是Go-MySQL-Driver,也就是github.com/go-sql-driver/mysql这个库。这个库使用广泛,维护也积极,应该作为首推。用户可能关心性能和稳定性,这个驱动支持连接池、预处理语句等,能有效防止SQL注入,符合引用[3]提到的使用预编译解决注入问题。 接下来,是否还有其他选择?比如gorm,这是一个ORM库,底层可能还是基于go-sql-driver/mysql。如果用户需要ORM功能,可以推荐gorm,但用户的问题明确是客户端库或驱动,所以可能需要分清楚层次。另外,可能还有xorm这样的库,但同样属于ORM,不是底层驱动。 需要检查是否有其他驱动,比如mymysql,但根据社区活跃度,可能go-mysql-driver更主流。此外,还要考虑兼容性,比如是否支持最新的MySQL特性,TLS连接等。Go-MySQL-Driver在这方面做得不错。 然后,用户可能关心如何安装和使用。需要给出安装命令,比如go get github.com/go-sql-driver/mysql,并提供一个简单的示例代码,包括导入驱动、连接数据库、执行查询等步骤。示例代码要规范,避免SQL注入,使用占位符,如引用[3]中的建议。 另外,可能需要提到连接字符串的格式,比如"user:password@tcp(host:port)/dbname"。还有错误处理,比如检查ping是否成功。 关于引用中的其他内容,比如引用[5]提到Rust的驱动,但用户需要的是Go语言,所以可以忽略。引用[2]和[4]可能涉及数据库链接和启动命令,但与当前问题关联不大。引用[1]是关于ODBC驱动的,可能不适用于Go语言,但可以提一下如果有ODBC需求,可以使用相应的库,但推荐原生的驱动。 最后,用户可能需要知道如何选择,比如标准驱动满足大部分需求,ORM适合复杂操作。因此,在回答中分点说明推荐库、安装、使用示例以及扩展选项,确保结构清晰,符合用户要求的中文回答,同时正确应用LaTeX格式的数学表达式,但在这个问题中可能不太需要,所以可能不需要添加数学内容,但需确保其他格式符合要求,如代码块用反引号包裹,引用标识正确添加。</think>### Go语言的MySQL客户端库/驱动推荐 #### 1. **标准驱动推荐:go-sql-driver/mysql** 这是Go语言中最主流的MySQL驱动库,支持标准库`database/sql`接口,具备以下特性: - **高性能**:支持连接池、预处理语句(防止SQL注入,符合引用[3]的建议)。 - **兼容性**:覆盖MySQL 5.5+版本及常见功能(如TLS加密)。 - **维护活跃**:GitHub Star数超过13k,社区支持强大。 **安装命令**: ```bash go get -u github.com/go-sql-driver/mysql ``` **使用示例**: ```go package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" ) func main() { // 连接字符串格式:用户名:密码@协议(地址:端口)/数据库名 dsn := "demo:demo@tcp(127.0.0.1:3306)/mytest" db, err := sql.Open("mysql", dsn) if err != nil { panic(err.Error()) } defer db.Close() // 测试连接 if err := db.Ping(); err != nil { panic("连接失败: " + err.Error()) } // 执行查询(使用预编译防止SQL注入) rows, err := db.Query("SELECT id, name FROM users WHERE age > ?", 18) if err != nil { panic(err.Error()) } defer rows.Close() for rows.Next() { var id int var name string if err := rows.Scan(&id, &name); err != nil { panic(err.Error()) } fmt.Printf("ID: %d, Name: %s\n", id, name) } } ``` #### 2. **扩展选项:ORM库** 若需更高层封装,可选择ORM(对象关系映射)库: - **GORM**:功能全面的ORM,支持事务、关联关系等。 ```bash go get -u gorm.io/gorm go get -u gorm.io/driver/mysql ``` - **XORM**:轻量级ORM,适合复杂查询场景。 #### 3. **特殊场景驱动** - **ODBC驱动**:若需通过ODBC连接(如旧系统兼容),可参考引用[1]的`mysql-connector-odbc`,但需结合Go的ODBC库(如`github.com/alexbrainman/odbc`)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值