mysql 8.0 bi只读账号需强制指定mysql_native_password插件、显式授予information_schema.columns/tables权限、逐项回收写权限,并用新连接验证current_user()及元数据查询。

直接给 BI 系统用的 MySQL 8.0 只读账号,不能只靠 GRANT SELECT 就完事——必须显式禁用写类权限、处理 information_schema 访问、规避认证插件兼容问题,否则报表跑一半报错或连不上是常态。
创建用户时必须指定 mysql_native_password 插件
MySQL 8.0 默认用 caching_sha2_password,但多数 BI 工具(Tableau、Power BI、Metabase 旧版驱动)不支持。连不上不是密码错,是握手失败。
- 先查当前插件:
SELECT user, host, plugin FROM mysql.user WHERE user = 'bi_reader'; - 建用户时强制指定:
CREATE USER 'bi_reader'@'10.20.0.%' IDENTIFIED WITH mysql_native_password BY 'R3ad0nly!2026'; - 别用
ALTER USER ... IDENTIFIED BY后补,有些 BI 客户端会缓存初始认证方式
授予权限要拆开:先 GRANT SELECT,再 REVOKE 写类权限
GRANT SELECT 本身不清理已有权限。如果用户之前被授予过 ALL PRIVILEGES 或继承了角色,残留的 INSERT、LOCK TABLES 会让 BI 查询意外失败(比如 SELECT ... FOR UPDATE 被 ORM 自动生成)。
- 只读库授权:
GRANT SELECT ON `sales_db`.* TO 'bi_reader'@'10.20.0.%'; - 显式回收写权限:
REVOKE INSERT, UPDATE, DELETE, DROP, CREATE, ALTER, INDEX, LOCK TABLES, EXECUTE, TRUNCATE, CREATE TEMPORARY TABLES ON `sales_db`.* FROM 'bi_reader'@'10.20.0.%'; - 检查全局高危权限:
SELECT Super_priv FROM mysql.user WHERE User = 'bi_reader';,若为Y,必须执行REVOKE SUPER ON *.* FROM 'bi_reader'@'10.20.0.%';
BI 工具必查 information_schema,但不能全放开
Tableau 加载字段列表、Power BI 推断数据类型、Metabase 自动发现表结构,都会查 information_schema.COLUMNS 和 information_schema.TABLES。只授 SELECT ON sales_db.* 不够,但 GRANT SELECT ON information_schema.* 会暴露所有库名甚至表结构细节。
- 最小化授权:
GRANT SELECT ON `information_schema`.`COLUMNS` TO 'bi_reader'@'10.20.0.%'; - 加一条查表名的:
GRANT SELECT ON `information_schema`.`TABLES` TO 'bi_reader'@'10.20.0.%'; - 别碰
STATISTICS、ROUTINES、SCHEMATA——BI 工具通常不需要,且可能泄露敏感库名
验证必须用新连接 + 典型 BI 操作组合测
复用 root 会话执行 SHOW GRANTS 看不出问题。BI 连接池、预编译语句、自动元数据查询行为复杂,得模拟真实路径。
- 新开终端,用新账号登录:
mysql -u bi_reader -p -h db-prod.internal -P 3306 - 立刻确认身份:
SELECT CURRENT_USER();(必须匹配'bi_reader'@'10.20.0.%') - 跑 BI 常见操作:
SELECT COUNT(*) FROM sales_db.orders JOIN sales_db.customers USING(customer_id);(验证 JOIN 权限) - 触发元数据查询:
SHOW FULL COLUMNS FROM sales_db.orders;(依赖information_schema授权) - 反向验证写操作:
INSERT INTO sales_db.orders VALUES ();→ 必须报ERROR 1142 (42000)
最容易被忽略的是 CURRENT_USER() 匹配结果和 information_schema 的表级粒度控制——BI 工具不会告诉你它在查哪张系统表,只报“无法加载元数据”,得从日志或抓包定位具体表名再补授权。











