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;
更新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;