Изменение разрешений хоста для пользователей 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;