Изменение разрешений хоста для пользователей MySQL

45

У меня есть следующие гранты для пользователя / базы данных

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'              |
+---------------------------------------------------------------------------+

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

Есть ли способ , чтобы изменить имя хоста localhostк %(и обратно) без отмены самого разрешения?

Fu86
источник

Ответы:

60

Если у вас есть доступ к mysqlбазе данных, вы можете изменить таблицы предоставления напрямую:

UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';
FLUSH PRIVILEGES;

... и аналогичное UPDATEзаявление, чтобы изменить его обратно.

Также вам может потребоваться внести изменения в mysql.dbтаблицу:

UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';
nickgrim
источник
Небольшое исправление (версия MySQL Server: 5.7.5-m15 - MySQL Community Server): как из phpmyadmin, так и из командной строки mysql - UPDATE mysql. userSET Host= 'localhost' ГДЕ user. Host= '%' AND user. User= 'XXXdbusr';
Jadeye
1
Для производственной базы данных я бы с осторожностью отнесся к%, это может быть угрозой безопасности. Если у вас есть несколько веб-серверов, вы также можете использовать хосты с подстановочными символами, например «192.168.0.%» Или «% .example.com». Другой вариант - добавить одного и того же пользователя несколько раз для каждого хоста или создать отдельно именованного пользователя для каждого веб-сервера.
okdewit
Если, как и я, попытаться разрешить root-доступ на локальном тестовом компьютере (RasPi в моем случае), это не будет работать с MySQL 5.7. Смотрите эту тему
Рауль Пинто
@RaulPinto: кажется, что эта тема о phpMyAdmin, что здесь не совсем уместно, но приятно отметить для людей, которые только используют это.
Никгрим
Лучше использовать хорошо документированное заявление RENAME USER
Антонио Бардацци
6

Лучший ответ на Stackoverflow, предлагающий использовать, RENAME USERкакие копии пользовательских привилегий.

Использование языка управления данными (операторы GRANT, REVOKE, RENAME и т. Д.) Не требуется FLUSH PRIVILEGES;и требуется в архитектуре, такой как Galera или Group Replication, где таблицы MyISAM не реплицируются.

Антонио Бардацци
источник
2

Я тоже наткнулся на это, и предлагаемое решение не сработало, поскольку особые привилегии для базы данных также не были бы перенесены. что я сделал:

UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';
FLUSH PRIVILEGES;
Роман Хафели
источник
И "это" сработало?
Pierre.Vriens
1

Чтобы изменить привилегии, сначала отмените все разрешения для пользователя

 revoke all privileges on *.* from 'username'@'localhost';

 grant SELECT,INSERT,UPDATE,DELETE ON `db`.* TO 'username'@'%';

 flush privileges;
Абхишек Ананд Амралкар
источник
Это именно моя проблема, я не могу отозвать разрешение из-за пароля. Пожалуйста, прочитайте мой вопрос.
Fu86
Вы можете установить хэш пароля таким же, как и старый, через обновление. Вам не нужно знать фактический пароль, чтобы сделать это.
Дрогарт
0

Отсутствует много таблиц, если у вас есть права, отличные от просто db (например, таблицы или столбцы и т. Д.). В зависимости от того, какие гранты имеет ваш пользователь, вам может потребоваться обновить все эти таблицы или некоторые из них:

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;
mikew
источник