Удаленные подключения 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

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

Гаурав Сингх
источник