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

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

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 в % (и обратно) без отзыва самого разрешения?

6 ответов

Решение

Если у вас есть доступ к 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';

Лучшим вариантом для MySQL 8+/MariaDB 10+ будет:

      RENAME USER 'username'@'oldhost' TO 'username'@'newhost';

См. https://dev.mysql.com/doc/refman/8.0/en/rename-user.html .

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

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