问题描述
在使用 Python 设置数据库参数时遇到以下问题
mysql.connector.errors.ProgrammingError: 1227 (42000): Access denied; you need (at least one of) the SUPER or SYSTEM_VARIABLES_ALWIN privilege(s) for this operation
以下是我执行的 Python 代码:
import mysql.connector
connection = mysql.connector.connect(
database= 'tpch', user= 'dbbert',
password= 'dbbert', host="localhost")
connection.autocommit = True
cursor = connection.cursor(buffered=True)
cursor.execute(f'set global table_definition_cache=400')
但是我在命令行使用 dbbert 用户连接数据库进行参数更改是可以成功运行的,如下图:
很怪!
解决方案:
首先(一定要做的)
在网上找的解决方法大多数都是让我使用 root 权限给我的 user 赋予 ’SUPER‘ 权限,如下:
GRANT SUPER ON *.* TO 'dbbert'@'localhost';
FLUSH PRIVILEGES;
但是还是会出现相同的问题。
解决
这里的权限不够并不是我的用户 dbbert 的权限不够,而是 ‘localhost’ 的问题,‘localhost’ 的权限不够。这里创建了一个 ‘%’ 的新用户规避掉了 mysql 远程访问权限的问题。
在 MySQL 的用户权限设置中,‘%’ 是主机部分的通配符。当用户被定义为 ‘user_name’@‘%’ 这种形式时,它代表该用户可以从任何主机连接到 MySQL 服务器。与指定特定主机(如 ‘user_name’@‘192.168.1.100’)的用户权限设置不同。如果用户权限是针对特定主机设置的,那么这个用户只能从该特定 IP 地址对应的主机进行连接。例如,若设置 ‘dbbert’@‘192.168.1.100’,则用户 dbbert 只能从 IP 地址为192.168.1.100 的计算机连接 MySQL 服务器,其他主机即使使用相同的用户名和密码也无法建立连接。—— by 豆包
按照上面的解释,理论上讲 dbbert 用户应该无法连接到 mysql,但是实际上是连接上了的。很怪!望解答。
使用 root 用户进入 mysql 重新创建一个 ‘%’ 用户即可解决该问题:
CREATE USER 'dbbert1'@'%' IDENTIFIED BY 'dbbert1';
GRANT SUPER ON *.* TO 'dbbert1'@'%';
FLUSH PRIVILEGES;
后续使用用户 dbbert1 和密码 dbbert1 即可成功连接。