在 Debian 11 上全新安装的 mariaDB 10.5.12 已使用“mysql_secure_installation”脚本进行了强化,问题“切换到 unix_socket 身份验证 [Y/n]”的答案为“是”。
现在,当主机等于“localhost”时,mariaDB 允许本地 root 登录:
mysql --host=localhost
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 40
Server version: 10.5.12-MariaDB-0+deb11u1-log Debian 11
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
但使用 IP 地址时会拒绝:
mysql --host=127.0.0.1
ERROR 1698 (28000): Access denied for user 'root'@'127.0.0.1'
经过一些 duckducking 操作后,对数据库进行了以下修改:
CREATE USER 'root'@'::1' IDENTIFIED VIA unix_socket;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'::1' WITH GRANT OPTION;
CREATE USER 'root'@'127.0.0.1' IDENTIFIED VIA unix_socket;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION;
flush privileges;
服务器配置中不存在“skip-name-resolve”参数:
show variables like '%skip_name%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| skip_name_resolve | OFF |
+-------------------+-------+
相关根帐户现在是:
MariaDB [mysql]> select user, password, host, plugin from user where user='root';
+------+----------+-----------+-------------+
| User | Password | Host | plugin |
+------+----------+-----------+-------------+
| root | | localhost | unix_socket |
| root | | ::1 | unix_socket |
| root | | 127.0.0.1 | unix_socket |
+------+----------+-----------+-------------+
由于某种原因,本地根目录可以访问“localhost”,但不能访问数据库,无论是通过“127.0.0.1”连接还是通过“::1”连接。
为什么 ?
答案1
简而言之localhost
使用套接字。这个答案StackOverflow 上对此进行了解释:
MariaDB 服务器(也是 MySQL)以特殊方式处理 localhost。其他软件将其视为环回地址 127.0.0.1 的别名,而 MariaDB 会将其解释为与服务器的 UNIX 域套接字连接。默认情况下,此套接字文件位于 /var/lib/mysql/mysql.sock。
由于使用 时您没有通过套接字连接127.0.0.1
,因此套接字身份验证不起作用。您必须使用localhost
或--socket=/path/to/socket
。