table 'session_variables' 命令被拒绝

Command denied for table 'session_variables'

更新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) 表。

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

因此非根用户获得:

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' 的 "safe" 方式将在 5.7 上因特权错误而失败 时间旅行悖论:O 实际上,我的同事 Simon J. Mudd 建议,show_compatibility_56 默认为关闭。我支持这个思路。否则它又是 old_passwords=1 了。 show_compatibility_56 没有解决 GRANT 问题。 这不会解决任何迁移路径。它只是推迟了我遇到同样问题的那一刻。当我将变量从“1”翻转为“0”时,我回到了第一个方块。

建议

如上所述,我声称安全不是问题。我声称,如果当前的解决方案不变,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 权限。

希望对您有所帮助。

按照下面的方法试试,说不定就会有结果了。

GRANT ALL PRIVILEGES ON bedgeaj_medmax.transactions to 'bedgeaj_root'@'%'  IDENTIFIED BY 'password';

(或)

GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'%' WITH GRANT OPTION;

要访问 GLOBAL|SESSION VARIABLES,请尝试使用 MYSQL 中的命令:-

$ GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar';

$ GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';

如果它不起作用,那么您应该尝试(它仅向 'sonar' 用户提供所有数据库的 SELECT 权限):

$ GRANT SELECT ON *.* TO 'sonar'@'%' IDENTIFIED BY 'sonar';

$ GRANT SELECT ON *.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';

它为 sonar 用户提供访问所有数据库的权限 SELECT,INSERT,UPDATE,DELETE(数据库上所有可能的移动。

$ GRANT ALL ON *.* TO 'sonar'@'%' IDENTIFIED BY 'sonar';

$ GRANT ALL ON *.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';

试试这个,对我有用:

GRANT SELECT ON performance_schema.session_variables TO stevejobs; GRANT SELECT ON performance_schema.session_status TO stevejobs;