我在从MySQL数据库获取数据时遇到问题。这个项目一直在工作,直到我从 Ubuntu 16.04 升级到 Ubuntu 18.04.01。现在,应用程序在连接到数据库时超时。
我的第一个想法是 16.04 到 18.04 升级时有什么东西坏了。为了证明这一点,我启动了一个运行 16.04 的新 VM,执行了"执行发布升级"并将其提升到 18.04。但是,在此 VM 上,我的应用程序运行良好,没有问题。
我不知道从哪里去解决正在发生的事情。以下是两种配置的摘要。VM(工作(和服务器(不工作(如下;
Ubuntu 18.04.01LTS x86_64
内核 4.15.0-34-generic
Go 1.11
MySQL 5.7.23-0ubuntu
这是我的测试程序:
包主
import (
"fmt"
"database/sql"
_"github.com/go-sql-driver/mysql"
)
func main() {
fmt.Printf("Connecting to dbn")
db,err := sql.Open("mysql","Test:@/Test")
if err != nil {
panic(err)
}
fmt.Printf("Trying query Rown")
var Data int
err = db.QueryRow("SELECT Data FROM Test WHERE ID=2").Scan(&Data)
fmt.Printf("After Queryn")
if err != nil {
panic(err)
}
fmt.Printf("Got Data=%dn",Data)
db.Close()
}
在 VM 上,程序可以毫无问题地执行并返回一些有效数据。服务器在 QueryRow 行上挂起。2分钟后我得到这个回报
$ time ./test
Connecting to db
Trying query Row
After Query
panic: dial tcp 127.0.0.1:3306: connect: connection timed out
goroutine 1 [running]:
main.main()
/home/daedalus/test/sqltest.go:20 +0x263
real 2m10.874s
user 0m0.001s
sys 0m0.009s
我意识到问题是程序无法连接到数据库,或者数据库没有响应,但我看不出原因。在 syslog、mysql 的日志文件中也没有记录任何内容。我可以看到MySQL没有任何问题。我可以作为测试用户连接和运行查询。
我不确定如何继续跟踪服务器出现故障的原因,但是当两个配置相同时,虚拟机仍在工作。
任何帮助将不胜感激。
我可以考虑两种可能性:
- MySQL服务器缺少用户"Test@127.0.0.1",但具有用户"Test@localhost">
- 服务器防火墙阻止访问 127.0.0.1 上的端口 3306
回答我的问题只是为了结束它,但谢谢彼得的评论,导致了我的解决方案。
问题具体出在我的防火墙规则上。我对原产国有一些严格的规定,但无意中阻止了来自 127.0.0.1 的流量。一旦我为此破例,一切正常。