У меня есть следующие гранты для пользователя / базы данных
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
к %
(и обратно) без отзыва самого разрешения?
Если у вас есть доступ к mysql
базу данных, вы можете изменить таблицы грантов напрямую:
UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';
... и аналогичный UPDATE
-заговор поменять обратно.
Также вам может потребоваться внести изменения в mysql.db
таблица также:
UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';
а затем сбросить, чтобы применить привилегии:
FLUSH PRIVILEGES;
Лучший ответ на Переполнение стека предлагая использовать RENAME USER
которые копируют права пользователя.
Использование языка управления данными (такие операторы, как GRANT, REVOKE, RENAME и т. Д.) Не требует FLUSH PRIVILEGES;
и требуется в такой архитектуре, как Galera или Group Replication в версиях MySQL, имеющих таблицы MyISAM в mysql
базы данных, поскольку таблицы MyISAM не реплицируются.
Я тоже наткнулся на это, и предложенное решение не сработало, поскольку привилегии, специфичные для базы данных, также не были перемещены. что я сделал:
UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';
FLUSH PRIVILEGES;
Чтобы изменить привилегии, сначала отзовите все разрешения для пользователя
revoke all privileges on *.* from 'username'@'localhost';
grant SELECT,INSERT,UPDATE,DELETE ON `db`.* TO 'username'@'%';
flush privileges;
Отсутствует много таблиц, если у вас есть привилегии, отличные от простого 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;