Удаленные подключения Mysql Ubuntu


96

По какой-то причине мне не удалось удаленно подключиться к моему серверу MySQL. Я все перепробовал и все еще получаю ошибки.

root@server1:/home/administrator# mysql -u monty -p -h www.ganganadores.cl
Enter password:
ERROR 1045 (28000): Access denied for user 'monty'@'server1.ganganadores.cl' (using password: YES)

Теперь я пробовал бежать

 GRANT ALL ON *.* to monty@localhost IDENTIFIED BY 'XXXXX'; 
 GRANT ALL ON *.* to monty@'%' IDENTIFIED BY 'XXXXXX';` 

и все равно ничего! Что я делаю не так?

EDIT : my.cnfзакомментировал привязку ip.


какую версию MySQL вы используете?
Стив

Версия сервера: 5.5.29-0ubuntu0.12.10.1 (Ubuntu)
Cristian Eduardo Lehuede Lyon

что возвращает эта команда? ubuntu ~ $ sudo lsof -i -P | grep: 3306
apesa

Ответы:


346

Чтобы предоставить MySQL кому-либо другому, кроме localhost, вам понадобится следующая строка

Для mysql версии 5.6 и ниже

раскомментированный /etc/mysql/my.cnfи назначенный вашим компьютерам IP-адрес, а не loopback

Для mysql версии 5.7 и выше

раскомментированный /etc/mysql/mysql.conf.d/mysqld.cnfи назначенный вашим компьютерам IP-адрес, а не loopback

#Replace xxx with your IP Address 
bind-address        = xxx.xxx.xxx.xxx

Или добавьте, bind-address = 0.0.0.0если вы не хотите указывать IP

Затем остановите и перезапустите MySQL с новой записью my.cnf. После запуска перейдите к терминалу и введите следующую команду.

lsof -i -P | grep :3306

Это должно получиться примерно так с вашим фактическим IP-адресом в xxx

mysqld  1046  mysql  10u  IPv4  5203  0t0  TCP  xxx.xxx.xxx.xxx:3306 (LISTEN)

Если приведенный выше оператор вернется правильно, вы сможете принимать удаленных пользователей. Однако для того, чтобы удаленный пользователь мог подключиться с правильными привилегиями, вам необходимо, чтобы этот пользователь был создан как на локальном хосте, так и в '%', как в.

CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'mypass';
CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypass';

затем,

GRANT ALL ON *.* TO 'myuser'@'localhost';
GRANT ALL ON *.* TO 'myuser'@'%';

и наконец,

FLUSH PRIVILEGES; 
EXIT;

Если у вас нет такого же пользователя, как указано выше, при локальном входе в систему вы можете унаследовать базовые привилегии localhost и иметь проблемы с доступом. Если вы хотите ограничить доступ myuser, вам нужно будет прочитать синтаксис оператора GRANT ЗДЕСЬ. Если вы прошли через все это, но у вас все еще остались проблемы, опубликуйте дополнительный вывод ошибок и соответствующие строки my.cnf.

ПРИМЕЧАНИЕ. Если lsof не возвращается или не обнаруживается, вы можете установить его ЗДЕСЬ в зависимости от вашего дистрибутива Linux. Вам не нужен lsof для работы, но он очень удобен, когда что-то работает не так, как ожидалось.


1
Спасибо, хотя я правильно выполнил эти шаги в первый раз, я сделал их снова, как вы писали, и работал как шарм!
Cristian Eduardo Lehuede Lyon

14
Для всех, кто борется с lsof -i -P | grep :3306этим, это не сработало, но удаленное соединение по-прежнему работает нормально без этого подтверждения, не обращайте внимания, если вы не видите правильного вывода.
Mike S

@Mike Slutsky Спасибо за заметку, я отредактировал свой ответ. Вы можете установить lsof, если он еще не установлен.
apesa

2
FWIW во многих системах sudo lsof -i -Pбудет намного полезнее lsof -i -P(при условии, что вы вошли в систему как непривилегированный пользователь).
Дэн Пассаро

2
lsof -i -P | grep :3306ничего не возвращает!
Green

39

Добавьте несколько пунктов к отличному посту apesa:

1) Вы можете использовать команду ниже, чтобы проверить IP-адрес, который прослушивает сервер mysql.

netstat -nlt | grep 3306

sample result:

tcp 0  0  xxx.xxx.xxx.xxx:3306  0.0.0.0:*   LISTEN

2) Используйте FLUSH PRIVILEGESдля принудительной загрузки таблиц грантов, если по какой-то причине изменения не вступают в силу немедленно.

GRANT ALL ON *.* TO 'user'@'localhost' IDENTIFIED BY 'passwd' WITH GRANT OPTION;
GRANT ALL ON *.* TO 'user'@'%' IDENTIFIED BY 'passwd' WITH GRANT OPTION;
FLUSH PRIVILEGES; 
EXIT;

user == пользователь, который вы используете для подключения к mysql ex.root
passwd == пароль, который вы используете для подключения к mysql с

3) Если брандмауэр netfilter включен ( sudo ufw enable) на сервере mysql, выполните следующие действия, чтобы открыть порт 3306 для удаленного доступа:

sudo ufw allow 3306

проверить статус с помощью

sudo ufw status

4) После того, как удаленное соединение установлено, его можно проверить на клиентском или серверном компьютере с помощью команд

netstat -an | grep 3306
netstat -an | grep -i established

3
Это спасло мне весь день! Спасибо за sudo ufw status!!
Riddhiman Adib

netstat -nlt | grep 3306возвращается пустым
Жоао Пиментел Феррейра

@ João Pimentel Ferreira сначала убедитесь, что mysql запущен, используйте команду "/etc/init.d/mysql status" для проверки
Джонатан Л.

8

MySQL слушает только localhost, если мы хотим разрешить удаленный доступ к нему, нам нужно внести некоторые изменения в файл my.cnf:

sudo nano /etc/mysql/my.cnf

Нам нужно закомментировать строки адреса привязки и пропуска внешней блокировки:

#bind-address = 127.0.0.1
# skip-external-locking

После внесения этих изменений нам необходимо перезапустить службу mysql:

sudo service mysql restart

1
обязательно прокомментируйтеskip-external-locking
calebeaires

1
Я не комментировал skip-external-lock, и он все еще работает.
Marcia Ong

Пришлось поменять в /etc/mysql/mysql.conf.d
Бартандо

у меня это место:sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Лестер

1

При тестировании в Windows не забудьте открыть порт 3306.


Ах, вы гений, это СУПЕР важно, если вы используете подсистему Windows для Linux, вам нужно открыть порт 3306 для входящего трафика через брандмауэр Windows, и ничего из вышеперечисленного, чтобы проверить, слушает ли MySQL, работает с подсистема
Брайан Лейшман

1

Вы используете ubuntu 12 (довольно старый)

Сначала откройте файл /etc/mysql/mysql.conf.d/mysqld.cnf ( /etc/mysql/my.cnf в Ubuntu 14.04 и более ранних версиях

В [mysqld] найдите строку, bind-address = 127.0.0.1 и измените ее на, bind-address = 0.0.0.0 или прокомментируйте ее.

Затем перезапустите сервер Ubuntu MysQL. systemctl restart mysql.service

Теперь Ubuntu Server разрешит удаленный доступ к серверу MySQL, но все же вам нужно настроить пользователей MySQL, чтобы разрешить доступ с любого хоста.

Пользователь должен иметь 'username'@'%'все необходимые гранты

Чтобы убедиться, что сервер MySQL прослушивает все интерфейсы, выполните команду netstat следующим образом.

netstat -tulnp | grep mysql

Надеюсь, это сработает!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.