Корневой доступ 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
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