MySQL权限模型以'user'@'host'为独立账号,需分别授权;GRANT后无需FLUSH PRIVILEGES,仅直改系统表时需要;权限分五层且不继承,同账号多层级权限叠加;生产环境慎用caching_sha2_password认证插件。
MySQL 的权限模型基于「用户+主机+密码」三元组
MySQL 不像 PostgreSQL 那样按数据库用户全局唯一,而是把
当作一个独立账号。比如
和
是两个完全无关的账户,权限需分别授予。常见错误是只给远程 IP 授权却忘了
,导致本地命令行连得上、程序连不上——因为 MySQL 客户端默认用
连接时走 socket,实际匹配的是
,而非
。
创建用户必须显式指定 host:
不写 host 默认是
GRANT 语句不自动刷新权限,但 FLUSH PRIVILEGES 多数时候没必要
执行
或
后,权限已写入
等系统表,并由服务端即时加载——不需要手动
。只有在直接 UPDATE 系统表(如绕过 GRANT 修改
)后才需要刷新。
✅ 正确做法:
❌ 多余操作:
⚠️ 真要用到 FLUSH:仅当你用
这类直改系统表的操作之后
权限层级混乱是线上事故高发区
MySQL 权限分五层:全局(
)、库级(
)、表级(
)、列级(
)、存储过程级。低层级权限不会继承高层级,且**同名账号在不同层级的权限是叠加的**。
典型陷阱:
MySQL(Linux)
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
下载
给
授予
在
表,又单独给
授予
在
表——这没问题;
但如果误对
执行了
,会清掉所有全局和库级权限,但**表级、列级权限不受影响**,导致行为不可预测;
更隐蔽的是:同一账号在
和
中都有记录时,MySQL 按“最具体匹配”生效,调试需查
而非只看某张表
生产环境禁用 IDENTIFIED WITH caching_sha2_password 的匿名访问风险
MySQL 8.0 默认认证插件是
,它要求 TLS 或安全连接,否则客户端可能静默降级失败。而很多旧脚本或中间件(如某些版本的 Django ORM)未显式配置
,连上去就报
,实际是握手阶段被拒绝,不是权限问题。
解决方式(选其一):
创建用户时强制指定旧插件:
或在服务端配置
(需重启)
或确保客户端连接串含
(仅测试环境,勿用于生产)
权限本身没毛病,但认证链断了,
看起来一切正常,排查时容易卡在权限逻辑里绕圈子。
'user'@'host''app'@'192.168.1.%''app'@'localhost''localhost'localhost'user'@'localhost''user'@'%'CREATE USER 'dev'@'10.0.2.%' IDENTIFIED BY 'pwd123';'%',但这是模糊且不安全的,应避免。GRANTCREATE USERmysql.userFLUSH PRIVILEGESmysql.dbGRANT SELECT ON sales.* TO 'report'@'%';GRANT ...; FLUSH PRIVILEGES;UPDATE mysql.user SET authentication_string=...*db.*db.tbldb.tbl(col1)'api'@'%' SELECTshop.users'api'@'%' INSERTshop.orders'api'@'%' REVOKE ALL ON *.* FROM 'api'@'%'mysql.dbmysql.tables_privSHOW GRANTS FOR 'user'@'host';caching_sha2_passwordssl_disabled = FalseAccess denied for userCREATE USER 'svc'@'%' IDENTIFIED WITH mysql_native_password BY 'xxx';default_authentication_plugin=mysql_native_password?ssl-mode=DISABLEDSHOW GRANTS