У меня проблема с проектом golang, получающим данные из базы данных MySQL. Этот проект работал без проблем, пока я не обновился с Ubuntu 16.04 до Ubuntu 18.04.01. Теперь время ожидания приложения при подключении к базе данных истекает.

Первой моей мыслью было, что что-то сломалось при обновлении с 16.04 по 18.04. Чтобы доказать это, я создал новую виртуальную машину под управлением 16.04, выполнил «do-release-upgrade» и довел ее до 18.04. Однако на этой виртуальной машине мое приложение работает без проблем.

Я не понимаю, куда идти дальше, чтобы выяснить, что происходит. Вот краткое изложение двух конфигураций. И виртуальная машина (рабочая), и сервер (неработающий) следующие:

Ubuntu 18.04.01 LTS x86_64
Ядро 4.15.0-34-общий
Перейти 1.11
MySQL 5.7.23-0ubuntu

Вот моя тестовая программа:
основной пакет

import (
        "fmt"
        "database/sql"
        _"github.com/go-sql-driver/mysql"
)

func main() {
        fmt.Printf("Connecting to db\n")
        db,err := sql.Open("mysql","Test:@/Test")
        if err != nil {
                panic(err)
        }
        fmt.Printf("Trying query Row\n")
        var Data int 
        err = db.QueryRow("SELECT Data FROM Test WHERE ID=2").Scan(&Data)
        fmt.Printf("After Query\n")
        if err != nil {
                panic(err)
        }
        fmt.Printf("Got Data=%d\n",Data)
        db.Close()
}

На виртуальной машине программа выполняется без проблем и возвращает некоторые достоверные данные. Сервер зависает на строке 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 нет ничего плохого. Я могу подключаться и выполнять запросы как тестовый пользователь.

Я не уверен, как продолжить отслеживать, почему сервер выходит из строя, но виртуальная машина работает, когда обе конфигурации одинаковы.

Любая помощь была бы признательна.

0
Michael Anonymous 26 Сен 2018 в 00:25

2 ответа

Лучший ответ

Отвечая на мой вопрос, просто чтобы закрыть его, но спасибо, Питер, за ваши комментарии, которые привели к моему решению.

Проблема была именно в моих правилах брандмауэра. У меня есть строгие правила в отношении страны происхождения, но я случайно заблокировал трафик с 127.0.0.1. Как только я сделал для этого исключение, все работает нормально.

0
Michael Anonymous 10 Окт 2018 в 16:30

Я могу думать о двух вариантах:

  • На сервере MySQL отсутствует пользователь «Test@127.0.0.1», но есть пользователь «Test @ localhost».
  • брандмауэр сервера блокирует доступ к порту 3306 на 127.0.0.1
0
Manuel 25 Сен 2018 в 23:01