Как разрешить удаленное подключение к MySQL

362

Я установил MySQL Community Edition 5.5 на свой локальный компьютер и хочу разрешить удаленные подключения, чтобы я мог подключаться из внешнего источника.

Как я могу это сделать?

Лео
источник
1
возможный дубликат включения удаленного подключения MySQL
пользователь
1
Если вам случится использовать DigitalOcean, вы можете попробовать использовать sudo mysql_secure_installation. FYI.
Алан Донг
Не используйте форматирование кода для текста, который не является кодом. Не по теме.
маркиз Лорн
@ EJP почему? честный вопрос из любопытства
Рене Рот

Ответы:

776

Это разрешено по умолчанию в MySQL.

По умолчанию отключен удаленный rootдоступ. Если вы хотите включить это, выполните эту команду SQL локально:

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

А затем найдите следующую строку и закомментируйте ее в своем my.cnfфайле, который обычно используется в /etc/mysql/my.cnfсистемах Unix / OSX. В некоторых случаях местоположение файла - /etc/mysql/mysql.conf.d/mysqld.cnf).

Если это система Windows, вы можете найти ее в установочном каталоге MySQL, обычно что-то вроде этого C:\Program Files\MySQL\MySQL Server 5.5\ и имя файла будет my.ini.

Изменить строку

 bind-address = 127.0.0.1

в

 #bind-address = 127.0.0.1

И перезапустите сервер MySQL ( Unix / OSX и Windows ), чтобы изменения вступили в силу.

mjuarez
источник
4
Итак, я добавил binnd-address = 127.0.0.1 в конец файла, и я попытался подключиться с помощью navicat с внешнего хоста, и я получил ошибку 10060
Лев,
7
Хм, вам не нужно добавлять это. Как и сказал мой ответ, вам нужно комментировать, а не добавлять. По умолчанию там есть один, так что вам нужно найти его и закомментировать, поставив перед ним префикс #
mjuarez
7
Хм, в \ MYsql Server 5.5 \ есть только 1 ini-файл с именем my-default.ini, и единственная строка без # выглядит так: sql_mode = NO_ENGINE_SUBSTITUTION, STRICT_TRANS_TABLES
Лев,
2
этот ответ работает отлично. thnx @mjuarez - ПРЕДОСТАВЛЯЙТЕ ВСЕ ПРИВИЛЕГИИ . «Root» @ «%» идентифицируется «паролем» с опцией GRANT;
yadavr
66
Тем, кто ищет my.cnfфайл и не находит в нем bind-addressдирективы, обратите внимание, что в моем случае (MySQL версия 14.14 на Ubuntu 16.04.2) местоположение файла было/etc/mysql/mysql.conf.d/mysqld.cnf
Эш Менон,
49

После выполнения всего вышеперечисленного я все еще не мог войти как rootудаленно, но Telnetting к порту 3306подтвердил, что MySQLпринимал соединения.

Я начал смотреть на пользователей в MySQL и заметил, что было несколько пользователей root с разными паролями.

select user, host, password from mysql.user;

Поэтому MySQLя снова установил все пароли для пользователя root и, наконец, смог удаленно войти в систему как root.

use mysql;
update user set password=PASSWORD('NEWPASSWORD') where User='root';
flush privileges;
Мэтью Лок
источник
4
Это правильно. При выполнении шагов в других ответах учетные записи пользователей с пустым паролем кажутся созданными. Поэтому вам нужно добавить пароли для них.
chhantyal
1
Мне нужно было объединить принятый ответ с этим, и тогда все работало правильно.
Джеймс
8
SQL для 5.7 и вышеupdate user set authentication_string=password('YOUR_PASSWORD') where user='root';
DalSoft
Принятый ответ устанавливает пароль и работает у меня.
MikeKulls
1
Спасибо, так же, как @James, мне пришлось совместить это с принятым ответом, чтобы исправить.
Бен Эверард
39

Просто заметка из моего опыта, вы можете найти файл конфигурации по этому пути /etc/mysql/mysql.conf.d/mysqld.cnf .

(Я боролся в течение некоторого времени, чтобы найти этот путь)

Майур Патель
источник
1
Это сильно зависит от того, какой дистрибутив вы используете. Лучший способ - просто найти его:sudo find /etc -iname 'mysql*.cnf'
Мартин Конечни
Я ценю команду «найти». Я новичок в командной строке, так что это очень полезно. Спасибо!
Heres2u
Я изо всех сил пытался редактировать /etc/mysq/conf.d/mysql.cnf до тех пор, пока не нашел этот ответ.
Гаян Кавиратне
26

В моем случае я пытался подключиться к удаленному серверу mysql на цент ОС. После прохождения множества решений (предоставление всех привилегий, удаление привязок ip, включение сетей) проблема все еще не решалась.

Как оказалось, при поиске различных решений я наткнулся на iptables, который заставил меня понять, что порт mysql 3306 не принимает соединения.

Вот небольшая заметка о том, как я проверил и решил эту проблему.

  • Проверка, принимает ли порт соединения:
telnet (ip сервера MySQL) [portNo]
  • Добавление правила таблицы ip для разрешения подключений к порту:
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ПРИНЯТЬ
  • Не рекомендую это для производственной среды, но если ваши iptables не настроены должным образом, добавление правил может не решить проблему. В этом случае должно быть сделано следующее:
остановка сервиса iptables

Надеюсь это поможет.

Kushal
источник
17

Пожалуйста, следуйте приведенным ниже инструкциям, чтобы установить удаленный доступ с подстановочными символами для MySQL User.

(1) Открыть cmd.

(2) перейдите к пути C: \ Program Files \ MySQL \ MySQL Server 5.X \ bin и выполните эту команду.

mysql -u root -p

(3) Введите пароль пользователя root.

(4) Выполните следующую команду, чтобы предоставить разрешение.

ПРЕДОСТАВЛЯЙТЕ ВСЕ ПРИВИЛЕГИИ НА *. * ИМЯ «ИМЯ ПОЛЬЗОВАТЕЛЯ» @ «IP», ОПРЕДЕЛЯЕМЫМ ПАРОЛЕМ;

USERNAME: имя пользователя, которое вы хотите подключить к серверу MySQL.

IP: публичный IP-адрес, с которого вы хотите разрешить доступ к серверу MySQL.

ПАРОЛЬ: пароль от имени пользователя.

IP можно заменить на%, чтобы позволить пользователю подключаться с любого IP-адреса.

(5) Сбросьте предпочтения с помощью следующей команды и выйдите.

ПРИВИЛЕГИИ ПРОМЫВКИ;

Выход; или \ q

введите описание изображения здесь

Хирен Парги
источник
3
После этого у моего рута все равно есть доступ запрещен. Что я пропустил?
Teapeng
Вы можете попробовать использовать IP-адрес вашей локальной системы вместо% на 4-м шаге. Он должен работать. % означает любой IP-адрес.
Хирен Парги,
6

Если ваш серверный процесс MySQL прослушивает только 127.0.0.1 или :: 1, вы не сможете подключиться удаленно. Если у вас есть bind-addressнастройки в/etc/my.cnf этом, это может быть источником проблемы.

Вы также должны будете добавить привилегии для не localhostпользователя.

Тадман
источник
Странно, но как ваш сервер может «прослушивать» другой IP-адрес 127.0.0.1?
Pacerier
2
@Pacerier 127.0.0.1 связан только с интерфейсом обратной связи. Внешние соединения не будут работать. Система часто имеет несколько сетевых интерфейсов, каждый из которых должен быть привязан к конкретному, или вы можете использовать адрес привязки 0.0.0.0.
tadman
6

Если вы установили MySQL из brewнего, то он по умолчанию прослушивает только локальный интерфейс. Чтобы это исправить, нужно отредактировать /usr/local/etc/my.cnfи изменить bind-addressс 127.0.0.1на на *.

Тогда беги brew services restart mysql.

Timmmm
источник
1
Для моего сервера Ubuntu 16.04.4 настройка адреса привязки находится в /etc/mysql/mysql.conf.d/mysqld.cnf
Франк
Это не просто использование brew, любой MySQL будет иметь эту настройку по умолчанию, чтобы разрешить только локальные подключения.
nivs1978
6

Весь процесс для удаленного входа. Удаленный вход по умолчанию отключен. Вам нужно открыть его вручную для всех ip .. чтобы дать доступ всем ip

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

Удельный IP

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

тогда

flush privileges;

Вы можете проверить свой пользовательский хост и пароль

SELECT host,user,authentication_string FROM mysql.user;

Теперь ваша обязанность изменить это

bind-address = 127.0.0.1

Вы можете найти это на

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

если вы не найдете этого там, попробуйте это

sudo nano /etc/mysql/my.cnf

комментарий в этом

#bind-address = 127.0.0.1

Затем перезапустите Mysql

sudo service mysql restart

Теперь наслаждайтесь удаленным входом

albus_severus
источник
3

Просто к сведению, я несколько часов пытался справиться с этой проблемой ... наконец, я позвонил своему хостинг-провайдеру и обнаружил, что в моем случае используется облачный сервер, который на панели управления для 1 и 1 имеет дополнительный межсетевой экран, который необходимо клонировать и добавить порт. 3306. После добавления я получил прямо в ..

Дэн
источник
Это звучит очень специфично для вашей ситуации. Я не бесконечный источник знаний о сети, но вы уверены, что это решение хорошо подходит для этой проблемы?
Сэнди Гиффорд
2
У меня тоже была эта проблема. Общий с облачными серверами,
Мэтью Лок
2

Для тех, кому это нужно, проверьте, открыт ли порт брандмауэра 3306, если ваша служба брандмауэра работает.

Zelkovar
источник
1

А для OS X люди должны знать, что параметр bind-address обычно устанавливается в plist launchd, а не в файле my.ini. Так что в моем случае я снял <string>--bind-address=127.0.0.1</string>с /Library/LaunchDaemons/homebrew.mxcl.mariadb.plist.

tdmartin102
источник
Альтернативное местоположение для plist-файла:~/Library/LaunchAgents
Дилан Ниссли
1

Если mysqldдля адреса привязки установлено значение loopback / local address (например, 127.0.0.1), сервер не будет доступен с удаленных хостов, поскольку с любого удаленного хоста невозможно получить доступ к интерфейсу loopback.

Установите эту опцию на 0.0.0.0( ::для IPv4 + 6), чтобы принимать соединения от любого хоста, или на другой внешне достижимый адрес, если вы хотите разрешить соединения только на одном интерфейсе.

Источник

Уэсли Смит
источник
1

Включение удаленного корневого доступа может быть опасным. Было бы предпочтительнее, если бы вы настраивали учетные записи пользователей с более строгими разрешениями. Следующие три шага должны сделать это.

  1. Убедитесь, что строка, начинающаяся с bind-address ..., по крайней мере закомментирована в вашем файле my.ini или my.cnf. Если его не существует, двигайтесь дальше. Вы можете найти этот файл в C:\ProgramData\MySQL\MySQL Server 8.0Windows.

  2. После этого убедитесь, что учетная запись пользователя, с которой вы устанавливаете соединение, не localhostуказана в поле «Соответствие хостам». Хотя это и не рекомендуется, вместо этого вы можете указать %это поле для целей тестирования. Это можно сделать, открыв локальное подключение к серверу с помощью MySQL Workbench, затем перейдя в меню «Сервер> Пользователи и привилегии» в строке меню и найдя учетную запись пользователя, к которой вы хотите подключиться.

Поле «Limit to Hosts Matching» - это то, что запрещает вам подключаться не локально. Т.е. это ограничивает принятые соединения шаблоном IP-адресов. В идеале вы должны получать доступ к серверу MySQL со статического IP-адреса или подсети, чтобы вы могли быть настолько ограничены, насколько это возможно.

  1. Очевидно, ваш брандмауэр должен позволять приложению MySQL Server взаимодействовать через порт, который вы хотите. Физическое сетевое оборудование между вами и вашим сервером должно обеспечивать связь через порт, к которому вы хотите подключиться. (порт 3306 обычно)
Никола Петрович
источник
перенаправление порта (3306) в роутер помогло мне спасибо.
Курдский Программист
0

иногда нужно использовать имя компьютера на Windows

первый шаг) поместите в конфигурационный файл mysql:

mysqld.cnf SET bind-address = 0.0.0.0

(чтобы позволить recibe соединения через TCP / IP)

второй шаг) сделать пользователя в mysql, таблицах пользователей, с именем компьютера в Windows , не IP

введите описание изображения здесь

Рубен Руис
источник