I have the following grants for a user/database
mysql> SHOW GRANTS FOR 'username'@'localhost';
+---------------------------------------------------------------------------+
| Grants for username@localhost |
+---------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'username'@'localhost' IDENTIFIED BY PASSWORD 'xxx' |
| GRANT ALL PRIVILEGES ON `userdb`.* TO 'username'@'localhost' |
+---------------------------------------------------------------------------+
To enable external access to the database, I need to change localhost to %
. One way to do this is REVOKE
all permissions and set it again. The problem is, that there is a password set which I don’t know, so if I revoke the permission, I can’t set it back.
Is there a way to change the hostname localhost
to %
(and back again) without revoking the permission itself?
asked Feb 28, 2013 at 9:20
If you’ve got access to the mysql
database, you can change the grant tables directly:
UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';
…and an analogous UPDATE
-statement to change it back.
Also you might need to make changes to the mysql.db
table as well:
UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';
and then flush to apply the privileges:
FLUSH PRIVILEGES;
answered Feb 28, 2013 at 10:31
nickgrimnickgrim
4,3761 gold badge17 silver badges27 bronze badges
6
Best answer on Stackoverflow suggesting to use RENAME USER
which copy the user privileges.
Using Data Control Language (statements as GRANT, REVOKE, RENAME and so on) does not require FLUSH PRIVILEGES;
and is required in architecture like Galera or Group Replication in MySQL versions having MyISAM tables in mysql
database because MyISAM tables are not replicated.
answered Oct 4, 2017 at 14:16
I stumbled across this one, too, and the proposed solution didn’t work, since the database specific privileges wouldn’t be moved as well. what I did:
UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';
FLUSH PRIVILEGES;
answered Apr 19, 2016 at 15:46
1
To change privileges, first revoke all the permission to user
revoke all privileges on *.* from 'username'@'localhost';
grant SELECT,INSERT,UPDATE,DELETE ON `db`.* TO 'username'@'%';
flush privileges;
answered Feb 28, 2013 at 9:59
2
Missing a lot of the tables if you have privileges other than simply db (like tables or columns etc). Depending on what grants your user has, you may need to update all these tables or some:
UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.tables_priv SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.columns_priv SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.procs_priv SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.proxies_priv SET Host='%' WHERE Host='localhost' AND User='username';
FLUSH PRIVILEGES;
answered Oct 13, 2016 at 16:43
mikewmikew
1211 silver badge3 bronze badges
Редко, но бывают ситуации, когда требуется подключение к базе MySQL с любого хоста.
Для того чтобы это было возможно, нужно сначала изменить конфигурацию самого MySQL сервера.
Ее мы меняем в файле /etc/mysql/my.cnf
Там нужно найти строки bind-address и закомментировать их.
Должно получиться что-то похожее на:
#bind-address = 127.0.0.1
#bind-address = 192.168.0.201
Теперь нужно создать пользователя (или изменить существующего), где в записи пользователя в поле host будет % , что означает любой хост.
Список пользователей и прав доступа с хоста можно посмотреть сделав сделав выборку по таблице user в базе mysql.
Для этого подключаемся к базе от имени пользователя, который имеет привелегии на просмотр и редактирование данной таблицы (например пользователь root)
mysql -uroot -p
и выполняем следующие команды.
use mysql;
select host, user from user;
На выходе получаем список пользователей
+--------------+------------------+
| host | user |
+--------------+------------------+
| % | malinina |
| 127.0.0.1 | root |
| 192.168.0.96 | falc |
| ::1 | root |
| localhost | |
| localhost | debian-sys-maint |
| localhost | falc |
| localhost | malinina |
| localhost | phpmyadmin |
| localhost | root |
| web-server | |
| web-server | root |
+--------------+------------------+
Далее изменяем нужного пользователя (для примера взят пользователь falc с хостом 192.168.0.96):
update user set host=’%’ where user=’falc’ and host=’192.168.0.96’;
flush privileges;
Теперь пользователь falc может подключиться с любого IP.
Заказать создание и поддержку безопасной IT-инфраструктуры любой сложности
Быть уверенным в своей IT-инфраструктуре – это быть уверенным в завтрашнем дне.
Для того, чтобы сделать заказ:
Безопасные и надежные IT решения
0 / 0 / 0 Регистрация: 21.07.2013 Сообщений: 23 |
|
1 |
|
27.12.2013, 20:18. Показов 10885. Ответов 8
Здравствуйте . У хостера не стандартный хост для mysql (localhost) а какой то типа user.local.com . На винде я справлялся с этим просто создав такой домен в openserver и подключался к базе без проблем . Сейчас пробую на linux’е (Xubuntu) , но просто создание домена не помогло . Подскажите , что и как нужно настроить , уже пол вечера копаюсь в google но толи я с ним не умею разговаривать толи он со мной не хочет . Пробовал удалять строку bind-address = 127.0.0.1 в my.cnf , подставлял свою , но чет все не то .
__________________
0 |
407 / 361 / 141 Регистрация: 09.04.2011 Сообщений: 1,028 |
|
27.12.2013, 21:06 |
2 |
Хост это составная часть аккаунта в mysql, подробнее см тут
0 |
0 / 0 / 0 Регистрация: 21.07.2013 Сообщений: 23 |
|
27.12.2013, 21:22 [ТС] |
3 |
retvizan
0 |
407 / 361 / 141 Регистрация: 09.04.2011 Сообщений: 1,028 |
|
27.12.2013, 21:34 |
4 |
Откуда и куда вы пытаетесь подключиться? С локальной на удаленную, с локальной на локальную, с удаленной на удаленную?
0 |
0 / 0 / 0 Регистрация: 21.07.2013 Сообщений: 23 |
|
27.12.2013, 21:36 [ТС] |
5 |
Вот . Вот и у меня не получается , как то нужно создать этот user.local.com . А вот как . Добавлено через 1 минуту
0 |
407 / 361 / 141 Регистрация: 09.04.2011 Сообщений: 1,028 |
|
27.12.2013, 21:45 |
6 |
Обращаться к базе по tcp/ip от имени ‘user’@’user.local.com’ Но зачем вам это на локальной машине?
0 |
0 / 0 / 0 Регистрация: 21.07.2013 Сообщений: 23 |
|
27.12.2013, 21:51 [ТС] |
7 |
Попробую описать на примере . В базе данных уже создал пользователя Но откуда взяться этому хосту user.local.com . Его ведь нужно как то создать . А вот как и где , здесь я не как .
0 |
407 / 361 / 141 Регистрация: 09.04.2011 Сообщений: 1,028 |
|
27.12.2013, 22:02 |
8 |
Ага, понял. Для этого вам нужно настроить на локалке вебсервер через который и будут идти запросы к базе. Т.е. чтобы сама база считала, что находится не на локальной машине, а на user.local.com С конкретным по помочь не смогу. Имхо, проще менять настройки при переносе на хостинг.
0 |
0 / 0 / 0 Регистрация: 21.07.2013 Сообщений: 23 |
|
28.12.2013, 10:34 [ТС] |
9 |
Я на винде , на openserver просто создавал домен user.local.com ( прсто пустой домен ) и все , все работало . Подозревал конечно что на лине это будет сложнее , но надеялся на google . А тут на те , засада . Добавлено через 1 час 38 минут Добавлено через 10 минут Добавлено через 10 часов 34 минуты
0 |
Для доступа к MySQL из-вне должно быть выполнено 2 условия:
- MySQL должен слушать все адреса, а не только 127.0.0.1
- У пользователя должны быть пермишены для коннекта не только с localhost (с самого сервера где установлена БД), а и других адресов.
Слушать все адреса
Во-первых, изначально mysql слушает только localhost. Нужно исправить это в конфигурационном файле my.cnf
(обычно в линуксах путь /etc/mysql/my.cnf). В my.cnf находим строку:
bind-address = 127.0.0.1
И заменяем её на:
bind-address = 0.0.0.0
Теперь после service mysql restart
мы можем коннектиться к mysql с любого ip (если создан пользователь). При этом для супер-пользователя root доступ из-вне под пустым паролем остаётся закрыт.
bind-address 127.0.0.1
означает, что mysql слушает соединения только с текущего хоста.
Создание пользователя для коннекта к базе данных из-вне
Во-вторых, нужно создать пользователя, под которым мы будем подключаться из-вне к mysql. У пользователя должны быть пермишены для подключения не только по localhost, но и иных адресов.
CREATE USER 'username'@'%' IDENTIFIED BY 'password'; #создаём пользователя username с паролем password GRANT ALL PRIVILEGES ON database.* TO 'username'@'%'; #даём пользователю username все права для работы с базой данных database FLUSH PRIVILEGES; # применяем новые права (чтобы не делать restart)
В команде CREATE USER мы создали пользователя, который может коннектиться к mysql со всех ip. Мы можем разрешать коннектиться только с определённых ip, например:
#создаём пользователя user с паролем pass, который может подключаться только с ip '10.10.50.50 CREATE USER 'user'@'10.10.50.50' IDENTIFIED BY 'pass';
Если разрешаете внешние подключения к базе данных, то нужно давать сложные пароли пользователям mysql.
В случае проблем с внешними подключениями, проверить не блокирует ли брандмауэр или фаервол MySQL-порт 3306 или другой, если используете не стандартный порт.
Узнать порт mysql:
mysql> show variables like 'port'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | port | 3306 | +---------------+-------+ 1 row in set (0,05 sec)
После изменения bind-address в MySQL и создания пользователя с пермишенами (либо грант пермишенов текущим пользователям), к базе данных можно подключиться передавая параметр -h
<host>. Хост — адрес машины, на которой установлен MySQL:
mysql -u -root -p -h <ip адрес>
Дата добавления:
7 лет назад