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快,但是只能用来连接同一台电脑上的服务。

(完)