CREATE USER 是什么
CREATE USER 用来创建数据库账号,而 MySQL 的账号身份由用户名与来源主机两部分共同组成:'app'@'%' 与 'app'@'localhost' 是两条互相独立的账号,口令、认证插件和权限都要分别设置。创建语句本身不带任何权限,必须再单独授权才能访问数据。8.0 默认认证插件是 caching_sha2_password,老客户端不认识它时,才需要针对个别账号改用旧插件。
基本信息
| 用途 | 创建数据库账号 |
|---|---|
| 语法 | CREATE USER '用户'@'主机' IDENTIFIED BY '口令' |
| 主机通配 | % 任意主机、10.0.% 网段、localhost 本机 |
| 默认认证插件 | caching_sha2_password(MySQL 8.0) |
| 权限关系 | 建账号不含任何权限,需要配合授权语句 |
| 配套操作 | ALTER USER 改口令或插件、DROP USER 删除 |
典型使用场景
- 新业务上线按应用分配独立账号,便于审计与限权
- 只读账号给报表与数据分析工具使用,只授查询权限
- 运维账号绑定本机来源,避免从其他机器登录
- 兼容老客户端:为特定账号单独指定旧认证插件
- 临时排障账号设短生命周期,用完立即删除
- 多环境分别建账号,生产与测试不共用凭证
创建示例
创建示例
CREATE USER 'app'@'10.0.%' IDENTIFIED BY 'Str0ng#Passw0rd!'; # 按来源网段建账号
CREATE USER 'readonly'@'%' IDENTIFIED BY 'Str0ng#Passw0rd!'; # 只读账号,仍需单独授权
CREATE USER 'ops'@'localhost' IDENTIFIED BY 'Str0ng#Passw0rd!'; # 仅本机可登录
CREATE USER 'app2'@'%' IDENTIFIED WITH mysql_native_password BY 'Legacy#Pass1'; # 老客户端兼容账号维护
账号维护
ALTER USER 'app'@'10.0.%' IDENTIFIED BY 'NewStr0ng#Pass!'; # 修改口令
ALTER USER 'app'@'10.0.%' ACCOUNT LOCK; # 临时禁用账号,解锁用 ACCOUNT UNLOCK
DROP USER 'ops'@'localhost'; # 删除账号,其授权一并清除
SELECT user, host, plugin, account_locked FROM mysql.user ORDER BY user, host; # 盘点现有账号来源主机写法
| 写法 | 匹配范围 | 建议用途 |
|---|---|---|
| localhost | 仅本机且经本地 socket 连接 | 运维脚本与本地工具 |
| 127.0.0.1 | 仅本机但走 TCP | 与 localhost 是两条独立记录 |
| 10.0.% | 该网段内的所有主机 | 应用账号推荐写法 |
| 192.168.1.10 | 单个固定地址 | 跳板机或固定节点 |
| % | 任意来源主机 | 公网环境慎用 |
| localhost 与 % 并存 | 按更具体的主机取值优先匹配 | 本地与远程分别配置时使用 |
创建账号不会附带任何权限,必须紧接着授权;主机通配不要随意写 %,除非确实需要任意来源可达,管理类账号尤其要限制到本机或跳板机。
8.0 默认使用 caching_sha2_password,老旧客户端连不上时,只把出问题的那个账号改成 mysql_native_password,而不是把整个实例的默认插件降级。
修改账号口令会影响所有使用该账号的连接池实例,改密前先通知使用方,改后盯一会儿登录失败告警,避免一次性打断全部应用。
账号管理规范
- 一个应用一个账号,禁止多个系统共用同一凭证
- 来源主机尽量收敛到网段,管理账号只用本机或跳板机
- 口令统一交给密钥管理或配置中心,不写进代码与镜像
- 定期按账号清单核对使用情况与权限是否仍然必要
- 服务下线或人员离职后立即删除账号并回收授权
- 账号的插件与锁定状态纳入巡检,登录失败要能告警
账号名与主机组合必须是唯一的:重复创建同名同主机的账号会直接报错,遇到这种情况应改用修改语句调整口令或插件,而不是换个名字绕开。