表'session_variables'的命令被拒绝

时间:2015-08-17 14:59:05

标签: mysql sql tsql privileges grant

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

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

并收到以下错误:

  

SELECT'命令被拒绝用户'test'@'host'表'session_variables'

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

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

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

4 个答案:

答案 0 :(得分:3)

以下是与此问题相关的article1article2article3。 根据这些文章,解决方法是在show_compatibility_56 = on中设置/etc/my.cnf并重新启动mysql服务器。

MySQL 5.7引入了我们查询全局变量和状态变量的方式的变化:INFORMATION_SCHEMA.(GLOBAL|SESSION)_(VARIABLES|STATUS)表现已弃用且为空。相反,我们将使用相应的performance_schema。(全局|会话)_(变量|状态)表。

但这种变化比这更远;还有一个安全变化。

非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命令。 SHOW GLOBAL | SESSION VARIABLES | STATUS将正常工作,并将隐式知道是否通过information_schema或performance_schema表提供结果。 但是,我们不是想让SELECT查询更快乐吗?这样我才能真正做到比LIKE'variable_name%'更聪明的东西? 当然,您不能在服务器端游标中使用SHOW。你存储的例程现在很乱。 这并不能解决GRANTs问题。
  • show_compatibility_56:5.7中引入的变量,布尔值。它在多个方面都是伪装的时间旅行 - 悖论小说。 文档介绍了它,并说它已被弃用。 时间旅行 - 悖论:O 但它实际上适用于5.7.8(最新) 时间旅行 - 悖论情节变厚 您的自动化脚本事先不知道您的MySQL是否具有此变量 因此,SELECT @@ global.show_compatibility_56将在5.6上产生错误 但SHOW GLOBAL VARIABLES LIKE'how_compatibility_56'的“安全”方式将因5.7上的权限错误而失败 时间旅行 - 悖论:O 实际上我的同事Simon J. Mudd建议,show_compatibility_56默认为OFF。我支持这种想法。或者它的old_passwords = 1重新开始。 show_compatibility_56无法解决GRANTs问题。 这不能解决任何迁移路径。它只是推迟了我遇到同样问题的那一刻。当我将变量从“1”翻转到“0”时,我回到了第一个方位。

<强>建议

我声称安全不是问题,如上所述。我声称,如果当前的解决方案没有改变,Oracle将再次陷入5.6中不容易迁移到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权限。

希望这会对你有所帮助。

答案 1 :(得分:0)

尝试以下方式,也许你会得到结果。

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

(OR)

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

答案 2 :(得分:0)

试试这个,它对我有用:

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

答案 3 :(得分:-1)

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

$全部收听声纳。*播放声音&#39; @&#39;%&#39;由声纳&#39;;

识别

$全部收听声纳。*播放声音&#39; @&#39; localhost&#39;由声纳&#39;;

识别

如果它不起作用,那么你应该尝试(它只为所有DATABASES的#son;&#39;用户提供SELECT权限):

$ GRANT SELECT ON *。* TO&#39; sonar&#39; @&#39;%&#39;由声纳&#39;;

识别

$ GRANT SELECT ON *。* TO&#39; sonar&#39; @&#39; localhost&#39;由声纳&#39;;

识别

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

$ GRANT ALL ON *。* to&#39; sonar&#39; @&#39;%&#39;由声纳&#39;;

识别

$ GRANT ALL ON *。* to&#39; sonar&#39; @&#39; localhost&#39;由声纳&#39;;

识别