无法将 MySQL 中的 root 访问权限更改为 %

Eas*_*Dev 6 mysql mysqli

这是一个新的 MySQL 服务器安装。我创建了我的 root 密码作为设置的一部分(在 Centos 6.4 上)。

当我通过终端连接到服务器时,我可以连接到 MySQL 并使用我的 root 密码发出命令。

选择当前用户;

给我:

+----------------+
| current_user   |
+----------------+
| root@localhost |
+----------------+
Run Code Online (Sandbox Code Playgroud)

如果我做:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'xxxxxx' WITH GRANT OPTION
Run Code Online (Sandbox Code Playgroud)

我得到:

Query OK, 0 rows affected (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时:

SHOW GRANTS;
Run Code Online (Sandbox Code Playgroud)

这是我得到的:

+----------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost                                                                                                              |
+----------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*fdfgdgdggfggfgfg' WITH GRANT OPTION |
+----------------------------------------------------------------------------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

除了 root@localhost 之外,我不应该看到 root@% 的另一行吗?

我遇到的真正问题是我无法从本地主机外部连接到 MySQL(例如,我使用终端会话登录),并且如果 MySQL 服务器没有提供 root 通用访问权限(root@% ),那么就可以解释问题了。当我尝试使用 PHP(从我的本地 MAC)连接时,以下是返回的 MySQLi 对象:

mysqli Object
(
    [affected_rows] => 
    [client_info] => 
    [client_version] => 50008
    [connect_errno] => 2002
    [connect_error] => Connection refused
    [errno] => 
    [error] => 
    [field_count] => 
    [host_info] => 
    [info] => 
    [insert_id] => 
    [server_info] => 
    [server_version] => 
    [stat] => 
    [sqlstate] => 
    [protocol_version] => 
    [thread_id] => 
    [warning_count] => 
)
Run Code Online (Sandbox Code Playgroud)

我意识到从 % 授予 root 访问权限不是一个好主意,但在这一点上,我试图弄清楚为什么我无法连接到 MySQL 服务器,当我解决这个问题时,我将限制访问。

Rol*_*DBA 7

SHOW GRANTS只会给你返回任何你连接的东西,这是root@localhost

root@localhostroot@'%'完全不同的用户。做就是了

SHOW GRANTS FOR root@localhost;
SHOW GRANTS FOR root@'%';
Run Code Online (Sandbox Code Playgroud)
  • root@localhost允许您通过 mysql.sock(套接字文件)从数据库服务器连接
  • root@'%'允许您通过 TCP/IP 进行连接,但您必须明确使用该协议进行连接。否则,mysqld 将您连接为root@localhost. 即使您尝试使用 进行连接也是如此127.0.0.1

建议#1

为了安全起见,您应该使用netblocks而不是'%'。例如,如果您的 Web 服务器位于 10.1.2.20、10.1.2.30 和 10.1.2.40,则应该创建

GRANT ALL PRIVILEGES ON *.* TO 'root'@'10.1.2.%'
IDENTIFIED BY PASSWORD '*fdfgdgdggfggfgfg' WITH GRANT OPTION;
Run Code Online (Sandbox Code Playgroud)

而不是拥有远程根。

建议#2

如果你真的想要远程根,这就是你要做的

UPDATE mysql.user SET host='%'
WHERE user='root' AND host='localhost';
FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)

这将满足您的要求,但不建议使用远程 root。

建议#3

既然root@'%'已经存在,那就删除root@localhost。

DELETE FROM mysql.user WHERE user='root' AND host='localhost';
FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)

这将保留root@'%'为唯一的 root 用户,但您必须使用 TCP/IP 显式连接。