mysql命令登陆MySQL服务问题
mysql命令登陆MySQL服务问题
最近发现了一个问题:
mysql -u root -p
mysql -h localhost -u root -p
使用上面两个命令登陆mysql服务的时候出现如下错误:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111)
经过网上的一番查询,发现多解决办法, 思路大体都是创建一个mysql.sock的链接或者重新生成一个mysql.sock文件。
在手册上查了一下,找到的解决方案如下:
# 自行指定socket文件
mysql -h localhost -S /var/lib/mysql/mysql.sock -u root -p
mysql -h 127.0.0.1 -u root -p
mysql -h www.example.com -u root -p
mysql -h localhost -u root --protocol = TCP -p
这些都可以解决问题。
具体原因是:
mysql命令如果没有指定-h参数,默认使用localhost主机,连接到localhost服务mysql使用unix socket file, 即mysql.sock。但是mysql命令发现/tmp/mysql.sock与mysql服务使用的mysql.sock不一样, 所以出现了上述错误。可以通过指定socket文件为mysql服务使用的mysql.sock,或者将/tmp/mysql.sock替换为mysql服务使用的mysql.sock。这个mysql.sock文件的位置可以通过如下命令找到:
netstat -ln | grep mysql
而如果-h的参数是ip或者域名,那么mysql使用TCP/IP连接服务。所以换成127.0.0.1和www.example.com没有问题。
还有就是通过–protocol参数指定连接的方式为TCP/IP。
后两种解决方式根本没有使用到mysql.sock。原理明白了才发现解决方法有很多。
2017.6.22 更新
如何保护或改变MySQL的socket文件
服务使用的和本地客户端通信的socket文件的默认位置是/tmp/mysql.sock。(对于某些分发版目录可能不同,例如RPM包的MySQL是/var/lib/mysql/,我碰到的问题可能就是这个原因导致的)。
在一些Unix版本中,任何人都能删除/tmp目录下的文件,或者其他类似的用来存放临时文件的目录。在你的系统上,如果MySQL的socket文件被放在这样的目录中,可能会导致问题。
在大多数Unix系统,你可以保护你的/tmp目录,目的是让文件只能被所有者和超级管理员(root)删除。要做到这一点,先通过root登陆,通过下面的命令设置/tmp目录的黏着位:
chmod +t /tmp
你可以通过执行 ls -ld /tmp 来检查黏着位是否被设置,如果权限的最后一个字符是t,说明已经被设置。
另一个方式是改变服务创建的socket文件的位置。如果你这么做了,你也应该让客户端参数知道文件的新位置。你可以通过几个方式指定文件位置:
- 指定路径通过全局设置或本地配置文件。例如:在/etc/my.cnf里面添加如下行:
[mysqld]
socket=/path/to/socket
[client]
socket=/path/to/socket
-
在命令行中,mysqld_safe命令指定–socket参数配置并且在运行客户端的时候也指定这个参数。
-
为socket设置MYSQL_UNIX_PORT环境变量。
-
使用不同的socket文件默认位置重新编译MySQL源码。在运行CMake的时候使用MYSQL_UNIX_ADDR来定义文件的路径。
你能通过尝试连接服务来测试新的socket文件是否生效,通过下面的命令:
mysqladmin --socket=/path/to/socket version
socket连接要比TCP/IP快,但是只能用来连接同一台电脑上的服务。
(完)
- 本文作者:吴泽辉
- 本文链接:https://mutex.top/posts/081d69c7/
- 发表日期:2017年5月26日
- 版权声明:本文章为原创,采用《知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议》进行许可