Что мне нужно сделать, чтобы разрешить удаленный доступ к MySQL на сервере Unbuntu 20.04?

Что мне нужно сделать, чтобы разрешить удаленный доступ к MySQL на сервере Unbuntu 20.04?

У меня есть небольшой скрипт на Python для сбора оценок домашних заданий и онлайн-занятий студентов из таблицы allstudentsAnswers20BE.

Это прекрасно работает на моей старой странице на общем веб-хостинге.

На новом облачном сервере Ubuntu 20.04 я получаю отказ в подключении. У меня нет опыта работы с облачным сервером.

Я разрешил порты 33060 и 3306 в UFW

Мой домашний IP не фиксированный.

Когда я запускаю свой скрипт Python, я получаю эту ошибку при попытке подключения к облачному серверу

pymysql.err.OperationalError: (1130, «183.206.16.30' не разрешено подключаться к этому серверу MySQL»)

netstat сообщает, что mysqld прослушивает порты 33060 и 3306, поэтому я разрешил оба порта в брандмауэре ufw

Подключившись к облачному серверу по ssh, я выполнил:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Я изменил строку bind-address на 0.0.0.0 (я также пробовал *)

Я перезапустил mysql: sudo systemctl restart mysql

Должно быть, есть что-то еще, что нужно настроить на стороне сервера.

Пожалуйста, дайте какие-нибудь советы, что это может быть, мне очень нужно, чтобы это сработало.

Я также получил эту информацию (предположим, что мой облачный IP-адрес — 123.456.789.123):

pedro@ebs-105422:~$ nc -v -w 2 123.456.789.123 3306
Подключение к порту 123.456.789.123 3306 [tcp/mysql] успешно установлено! pedro@ebs-105422:~$

Означает ли это, что mysqld слушает на 3530?? Или это PID mysqld??

pedro@ebs-105422:~$ sudo netstat -tap | grep mysql tcp 0 0 0.0.0.0:mysql 0.0.0.0:* СЛУШАТЬ 3530/mysqld
tcp6 0 0 [::]:33060 [::]:* СЛУШАТЬ 3530/mysqld
pedro@ebs-105422:~$

Ниже приведено из MySQL на сервере, подтверждающее порт 3306

mysql> показать переменные, где variable_name in ('hostname','port');
+--------------+------------+
| Variable_name | Value |
+--------------+------------+
| hostname | ebs-105422 |
| port | 3306 | +--------------+------------+
2 строки в наборе (0,01 сек)

mysql>

решение1

Я понял, этот ответ просто для того, чтобы помочь всем, у кого может быть та же проблема. Этот способ, вероятно, не так безопасен, с открытым 3306, но а) у меня только домашнее задание б) вам все равно нужны имя пользователя и пароль.

Когда вы создаете пользователя в MySQL, это выглядит примерно так, даже если вы делаете это через SSH на сервере:

СОЗДАТЬ ПОЛЬЗОВАТЕЛЯ 'peter'@'localhost' С ИДЕНТИФИКАЦИЕЙ 'password';
ПРЕДОСТАВИТЬ ВСЕ ПРИВИЛЕГИИ НА some_db.* ПОЛЬЗОВАТЕЛЮ 'peter'@'localhost';

Если вам нужен удаленный доступ, вам необходимо изменить данные пользователя (или создать нового пользователя):

ПЕРЕИМЕНОВАТЬ ПОЛЬЗОВАТЕЛЯ 'peter'@'localhost' В 'peter'@'%';
ПРЕДОСТАВИТЬ ВСЕ ПРАВА НА somedb.* В 'peter'@'%';

% здесь, по-видимому, представляет собой любой ip

Затем также через ssh на сервере:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

найдите строку, которая имеет

адрес привязки = 127.0.0.1

измените это на

адрес привязки = 0.0.0.0

ctrl X для выхода nano nano спросит, хотите ли вы сохранить, нажмите y, затем Enter, чтобы сохранить в том же месте, где вы открыли /etc/mysql/mysql.conf.d/mysqld.cnf

Затем (на сервере):

sudo systemctl перезапустите mysql

После этого мой Python нормально заработал из оболочки Idle:

def mysqlRemoteAttn(clas): 
    # To connect remote MySQL database 
    conn = pymysql.connect( 
        host='123.456.789.123',
        port=3306,
        user='myusername',  
        password = 'mypassword', 
        db='allstudentsdb', 
        ) 
      
    cur = conn.cursor()

    sql = f"SELECT studentnr, attn_this_week FROM allstudents{clas}"
    cur.execute(sql)
    output = cur.fetchall()           
            
    # To close the connection 
    conn.close()
    return output

# get the attendance from the webpage MySQL
results = mysqlRemoteAttn(clas)

Связанный контент