问题描述
我已经创建了一个从机器A到机器B的转发器(通过SSH)。机器B正在运行一个MysqL实例,其root帐户使用 unix_socket 身份验证:
+----------+-----------+-------------+
| User | Host | plugin |
+----------+-----------+-------------+
| root | localhost | unix_socket |
+----------+-----------+-------------+
无论我使用什么密码(空白,Linux root密码等),我都无法以root用户身份从计算机A登录:
machineA:~$ MysqL -h 127.0.0.1 -P 1111 -u root -p
Enter password:
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
machineA:~$ MysqL -h 127.0.0.1 -P 1111 -u root
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
如果我尝试使用不是根帐户的帐户从计算机B登录MysqL,也会发生同样的情况。
解决方法
要直接或通过SSH隧道连接到远程MySQL服务器,您不能使用unix_socket
身份验证插件,该插件需要对DB Server操作系统上的Unix套接字文件进行本地访问。 / p>
unix_socket
插件是使用特殊类型的文件(unix套接字)实现的,该文件是* nix系统中进程间通信(IPC)的一种形式。它允许您的mysql CLI客户端与数据库对话,并且需要本地访问套接字文件(即:/tmp/mysql.sock
)。当您连接到套接字时,unix_socket
插件(服务器端)将获取连接到套接字的用户的uid(即:youruser),并且无需密码即可自动对您进行身份验证。
可能的解决方案:
如果使用非root用户连接到计算机B,则需要创建一个与非root操作系统用户帐户名相同的数据库用户。
GRANT ALL PRIVILEGES ON *.* TO 'youruser'@'localhost' IDENTIFIED VIA unix_socket;
现在,您只需使用以下命令即可使用用户帐户和mysql CLI客户端连接到mysql:
youruser:~$ mysql
如果要以root用户连接到数据库,则需要访问root帐户或与用户关联的sudo策略才能运行mysql客户端。
youruser:~$ sudo mysql
您显然可以对您的数据库根帐户启用常规的经过身份验证的网络访问。这可能会导致安全问题,因此最好将其限制为本地主机:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' IDENTIFIED BY 'xxx' WITH GRANT OPTION;
现在,如果您可以验证登录名,则可以从任何本地操作系统帐户登录:
youruser:~$ mysql -u root -p