Корневой доступ MySQL со всех хостов

Я установил сервер MySQL на удаленной машине с Ubuntu. root пользователь определяется в mysql.user таблица таким образом:

mysql> SELECT host, user, password FROM user WHERE user = 'root';
+------------------+------+-------------------------------------------+
| host             | user | password                                  |
+------------------+------+-------------------------------------------+
| localhost        | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| ip-10-48-110-188 | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| 127.0.0.1        | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| ::1              | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
+------------------+------+-------------------------------------------+

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

mysql> SELECT host, user, password FROM user WHERE host = '%';
+------------------+------+-------------------------------------------+
| host             | user | password                                  |
+------------------+------+-------------------------------------------+
| %                | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
+------------------+------+-------------------------------------------+

Но мой клиент на моем персональном компьютере продолжает говорить мне (я скрыл IP-адрес сервера):

Ошибка SQL (2003): не удается подключиться к серверу MySQL в '46.xxx' (10061)

Я не могу сказать, если это ошибка аутентификации или ошибка сети. На брандмауэре сервера я включил порт 3306/TCP для 0.0.0.0/0, и это нормально для меня...

10 ответов

Решение

В этом процессе два шага:

а) Предоставить привилегии. От имени пользователя root выполните:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password';

б) привязать ко всем адресам:

Самый простой способ - закомментировать строку в вашем my.cnf файл:

#bind-address = 127.0.0.1 

и перезапустите MySQL

service mysql restart

По умолчанию он привязывается только к localhost, но если вы прокомментируете строку, он связывает все найденные интерфейсы. Комментирование строки эквивалентно bind-address=*,

Чтобы проверить, где служба mysql имеет привязку, выполните команду root:

netstat -tupan | grep mysql

Обновление для Ubuntu 16:

Файл конфигурации есть (сейчас)

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

(по крайней мере, на стандартной Ubuntu 16)

Запустите следующий запрос:

use mysql;

update user set host='%' where host='localhost'

ПРИМЕЧАНИЕ: не рекомендуется для производственного использования.

MYSQL 8.0 - открыть клиент командной строки mysql
ПРЕДОСТАВЛЯЙТЕ ВСЕ ПРИВИЛЕГИИ НА *.* TO 'root'@'localhost';
использовать MySQL
ОБНОВЛЕНИЕ mysql.user SET host='%' WHERE user='root';
Перезапустите службу MySQL

Иногда

bind-address = 127.0.0.1

должно быть

bind-address = *

MariaDB работает на Raspbian - файл, содержащий bind-адрес, сложно определить. MariaDB имеет немного не очень полезной информации по этому вопросу.

я использовал

# sudo grep -R bind-address /etc 

чтобы найти, где эта чертова вещь.

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

А также весело провел время, открывая порт 3306 для удаленных подключений к моему Raspberry Pi - наконец, использовал iptables-persistent.

Теперь все прекрасно работает.

Я использую AWS LightSail, и для работы моего экземпляра мне пришлось изменить:

      bind-address = 127.0.0.1

к

      bind-address = <Private IP Assigned by Amazon>

Тогда я смог подключиться удаленно.

В моем случае проблема была связана с настройкой "bind-address". Комментируя этот параметр в my.cnf не помогло, потому что в моем случае mysql по умолчанию установил значение 127.0.0.1.

Чтобы проверить, какой параметр использует MySql, откройте командную строку в вашем локальном окне:

mysql -h localhost -u myname -pmypass mydb

Считайте текущую настройку:

Show variables where variable_name like "bind%"

Вы должны увидеть 0.0.0.0 здесь, если вы хотите разрешить доступ со всех хостов. Если это не так, отредактируйте /etc/mysql/my.cnf и установите bind-адрес в разделе [mysqld]:

bind-address=0.0.0.0

Наконец, перезапустите сервер MySql, чтобы выбрать новый параметр:

sudo service mysql restart

Попробуйте еще раз и проверьте, были ли выбраны новые настройки.

Если у вас много сетей, подключенных к вашей ОС, вы должны указать одну из этих сетей в bind-addres из файла my.conf. пример:

[mysqld]
bind-address = 127.100.10.234

этот ip из конфигурации ethX.

mysql_update это то, что вам нужно.

Я не знаю, почему кто-то пошел бы по более сложным способам исправления этой проблемы, когда MySql любезно создал инструмент, который уже делает это...

Обновите bind-address = 0.0.0.0 в /etc/mysql/mysql.conf.d/mysqld.cnf и из командной строки mysql разрешите root пользователь для подключения с любого IP.

Ниже были единственные команды, работавшие для mysql-8.0, так как другие не работали с ошибкой syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTIFIED BY 'abcd'' at line 1

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost';
UPDATE mysql.user SET host='%' WHERE user='root';

Перезапустите клиент mysql

sudo service mysql restart
Другие вопросы по тегам