mysql - 表 'session_variables' 的命令被拒绝

标签 mysql sql tsql privileges sql-grant

更新mysql版本5.7.8-rc-log后,我授予权限是这样的:

GRANT select ON test_db.* TO 'test'@'host';

出现以下错误:

SELECT command denied to user 'test'@'host' for table 'session_variables'

但是当我授予这样的权限时:

GRANT select ON *.* TO 'test'@'host';

它有效。有人可以帮忙吗?

最佳答案

这是 article1 , article2 , article3与这个问题有关。 根据这些文章,解决方法是在 /etc/my.cnf 中设置 show_compatibility_56 = on 并重新启动 mysql 服务器。

MySQL 5.7 对我们查询全局变量和状态变量的方式进行了更改:INFORMATION_SCHEMA.(GLOBAL|SESSION)_(VARIABLES|STATUS) 表现在已弃用且为空。相反,我们将使用各自的 performance_schema.(global|session)_(variables|status) 表。

但变化远不止于此;还有一个安全变化。

所以非root用户得到:

mysql> show session variables like 'tx_isolation';
ERROR 1142 (42000): SELECT command denied to user 'normal_user'@'my_host' for table 'session_variables'

解决方案?

以下是解决方案,但并不能真正解决问题:

  • 显示命令。 SHOW GLOBAL|SESSION VARIABLES|STATUS 将正常工作,并将隐式知道是通过 information_schema 还是 performance_schema 表提供结果。 但是,我们不是应该更快乐地使用 SELECT 查询吗?这样我真的可以做比 LIKE 'variable_name%' 更聪明的事情吗? 当然,您不能在服务器端游标中使用 SHOW。您的存储例程现在一团糟。 这并没有解决 GRANT 问题。
  • show_compatibility_56:5.7中引入的变量,boolean。从多个方面来看,这确实是一部伪装的时间旅行悖论小说。 文档介绍了它,并说它已被弃用。 时间旅行悖论:O 但它实际上适用于 5.7.8(最新) 时间旅行悖论情节变厚 你的自动化脚本事先并不知道你的 MySQL 是否有这个变量 因此 SELECT @@global.show_compatibility_56 将在 5.6 上产生错误 但是 SHOW GLOBAL VARIABLES LIKE 'show_compatibility_56' 的“安全”方式将在 5.7 上因特权错误而失败 时间旅行悖论:O 实际上,我的同事 Simon J. Mudd 建议,show_compatibility_56 默认为 OFF。我支持这个思路。否则它又是 old_passwords=1 了。 show_compatibility_56 不能解决 GRANT 问题。 这不会解决任何迁移路径。它只是推迟了我遇到同样问题的那一刻。当我将变量从“1”翻转为“0”时,我回到了第一个方 block 。

建议

如上所述,我声称安全不是问题。我声称,如果当前的解决方案不变,Oracle 将在 5.6 中再次陷入 no-easy-way-to-migrate-to-GTID 的陷阱。我声称一次发生了太多变化。因此,我建议选择两种流程之一:

  • 流程 1:保留 information_schema,稍后迁移到 performance_schema 在 5.7 中,information_schema 表仍应生成数据。 information_schema 没有安全限制 从 information_schema 读取时生成警告(“...这将被弃用...”) performance_schema 也可用。有安全限制,无论如何。 在 5.8 中移除 information_schema 表;我们只剩下 performance_schema。
  • 流程 2:轻松迁移到 performance_schema: 在 5.7 中,performance_schema 表不需要任何特殊权限。任何用户都可以从中读取。 保持 show_compatibility_56 不变。 SHOW 命令自行在 information_schema 或 performance_schema 之间进行选择——就像现在所做的那样。 在 5.8 中,performance_schema 表将需要 SELECT 权限。

希望对您有所帮助。

关于mysql - 表 'session_variables' 的命令被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32053655/

相关文章:

mysql - 需要一个查询根据另一个表的值对一个表中的值进行排序

php - 搜索两个表

sql-server - 如果 FROM/JOIN 子句中未提及更新的表,那么在 UPDATE 语句中会发生什么情况?

sql-server - ALTER ROLE 删除所有成员

mysql - 如何使用 Node 的 Sequelize 更新记录?

php - 从数据库中返回随机行而不重复

php - 将 MySQL 转换为 PDO

sql - 按类次分组时间戳

sql - SQL Server 可以发送 Web 请求吗?

PHP 和 mysql 的 select 出现奇怪的错误