在 MySQL 里,“用户”= 用户名 + 来源主机(host)。 所以 **“给用户新增可登录的 host”** 实际上就是 **再建一个同名不同 host 的账号**,或 **修改已有账号的 host**。下面给出 3 种常用做法,按场景自取。 --- 1. 查看现有账号的 host --- ```sql SELECT user, host FROM mysql.user WHERE user='alice'; ``` 常见结果示例 ``` +-------+-----------+ | user | host | +-------+-----------+ | alice | localhost | +-------+-----------+ ``` 目前 alice 只能从本机登录。 --- 2. 新增 host(推荐:再建一个同名账号) --- 想让她 **既能本机登录,又能从 10.0.0.% 网段登录**: ```sql -- 1. 建新 host 的账号 CREATE USER 'alice'@'10.0.0.%' IDENTIFIED BY 'SameOrNewPass!'; -- 2. 把权限跟原来保持一致(假设原来有全库权限) GRANT ALL PRIVILEGES ON *.* TO 'alice'@'10.0.0.%'; -- 3. 生效 FLUSH PRIVILEGES; ``` 现在就有两条记录: ``` +-------+------------+ | user | host | +-------+------------+ | alice | localhost | | alice | 10.0.0.% | +-------+------------+ ``` --- 3. 修改 host(替换已有账号的来源) --- 如果 **不再需要旧 host**(例如把 `localhost` 换成 `%`),可直接改系统表: ```sql RENAME USER 'alice'@'localhost' TO 'alice'@'%'; FLUSH PRIVILEGES; ``` 注意: - 旧 host 立即失效,连接会断开。 - 权限保留,无需重新 GRANT。 --- 4. 模糊 host 写法速查 --- | host 值 | 含义 | | ------------------- | ------------------------ | | `'localhost'` | 仅本地 socket / TCP 回环 | | `'127.0.0.1'` | 仅回环地址 | | `'192.168.%'` | 192.168.0.0/16 网段 | | `'%.example.com'` | 域名后缀匹配 | | `'%'` | 任意主机(最开放) | --- 5. 一键脚本示例 --- ```sql -- 允许用户 report 从 192.168.10.0/24 登录,只读业务库 CREATE USER 'report'@'192.168.10.%' IDENTIFIED BY 'Rpt#2025'; GRANT SELECT ON business.* TO 'report'@'192.168.10.%'; FLUSH PRIVILEGES; ``` --- 6. 小贴士 --- - 创建账号时 `IDENTIFIED BY` 可以跟现有密码一致,MySQL 会分别存储。 - 删除某个 host: ```sql DROP USER 'alice'@'10.0.0.%'; ``` - 远程 host 首次连接失败,优先检查 **防火墙 / bind-address / 密码插件**。 就这么简单,一条 `CREATE USER` 或 `RENAME USER` 就能让 MySQL “认识”新的来源主机! Loading... 在 MySQL 里,“用户”= 用户名 + 来源主机(host)。 所以 **“给用户新增可登录的 host”** 实际上就是 **再建一个同名不同 host 的账号**,或 **修改已有账号的 host**。下面给出 3 种常用做法,按场景自取。 --- 1. 查看现有账号的 host --- ```sql SELECT user, host FROM mysql.user WHERE user='alice'; ``` 常见结果示例 ``` +-------+-----------+ | user | host | +-------+-----------+ | alice | localhost | +-------+-----------+ ``` 目前 alice 只能从本机登录。 --- 2. 新增 host(推荐:再建一个同名账号) --- 想让她 **既能本机登录,又能从 10.0.0.% 网段登录**: ```sql -- 1. 建新 host 的账号 CREATE USER 'alice'@'10.0.0.%' IDENTIFIED BY 'SameOrNewPass!'; -- 2. 把权限跟原来保持一致(假设原来有全库权限) GRANT ALL PRIVILEGES ON *.* TO 'alice'@'10.0.0.%'; -- 3. 生效 FLUSH PRIVILEGES; ``` 现在就有两条记录: ``` +-------+------------+ | user | host | +-------+------------+ | alice | localhost | | alice | 10.0.0.% | +-------+------------+ ``` --- 3. 修改 host(替换已有账号的来源) --- 如果 **不再需要旧 host**(例如把 `localhost` 换成 `%`),可直接改系统表: ```sql RENAME USER 'alice'@'localhost' TO 'alice'@'%'; FLUSH PRIVILEGES; ``` 注意: - 旧 host 立即失效,连接会断开。 - 权限保留,无需重新 GRANT。 --- 4. 模糊 host 写法速查 --- | host 值 | 含义 | | ------------------- | ------------------------ | | `'localhost'` | 仅本地 socket / TCP 回环 | | `'127.0.0.1'` | 仅回环地址 | | `'192.168.%'` | 192.168.0.0/16 网段 | | `'%.example.com'` | 域名后缀匹配 | | `'%'` | 任意主机(最开放) | --- 5. 一键脚本示例 --- ```sql -- 允许用户 report 从 192.168.10.0/24 登录,只读业务库 CREATE USER 'report'@'192.168.10.%' IDENTIFIED BY 'Rpt#2025'; GRANT SELECT ON business.* TO 'report'@'192.168.10.%'; FLUSH PRIVILEGES; ``` --- 6. 小贴士 --- - 创建账号时 `IDENTIFIED BY` 可以跟现有密码一致,MySQL 会分别存储。 - 删除某个 host: ```sql DROP USER 'alice'@'10.0.0.%'; ``` - 远程 host 首次连接失败,优先检查 **防火墙 / bind-address / 密码插件**。 就这么简单,一条 `CREATE USER` 或 `RENAME USER` 就能让 MySQL “认识”新的来源主机! 最后修改:2025 年 08 月 30 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏