我对用户/数据库有以下授权
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
为(并改回)?%
答案1
如果您有权访问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;
答案2
MySQL 8+ / MariaDB 10+ 上的最佳选项是:
RENAME USER 'username'@'oldhost' TO 'username'@'newhost';
答案3
最佳答案堆栈溢出建议使用RENAME USER
复制用户权限。
使用数据控制语言(如 GRANT、REVOKE、RENAME 等语句)不需要,FLUSH PRIVILEGES;
但在 Galera 或 Group Replication 等架构中是必需的,mysql
因为 MyISAM 表不会被复制。
答案4
要更改权限,首先撤销用户的所有权限
revoke all privileges on *.* from 'username'@'localhost';
grant SELECT,INSERT,UPDATE,DELETE ON `db`.* TO 'username'@'%';
flush privileges;