找不到mysql.sock的出现原因及解决方案和mysql 默认mysql.sock位置默认问题探讨

背景:(1)偶尔会出现mysql的server和mysql的client默认的socke文件不在一个地方,我们用mysql时会出现一个找不到mysql.sock的情况。
(2)因非正常关机出现:/tmp/mysql.sock 不见了,找不到了,如何连接上去的问题?(其他机器通过tcp可以的)
先放个命令在mysql运行机上链接的方法:

view plainprint?

  1. mysql --protocol=TCP -uroot -p -P3306 -hlocalhost  

  2. Enter password:   

  3. Welcome to the MySQL monitor.  Commands end with ; or \g.  

  4. Your MySQL connection id is 65744  

  5. Server version: 5.6.13-log Source distribution  

  6. Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.  

  7. Oracle is a registered trademark of Oracle Corporation and/or its  

  8. affiliates. Other names may be trademarks of their respective  

  9. owners.  

  10. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.  

  11. mysql> \q  


原因一:
linux系统一次不正常关机后,连接mysql的时候系统提示不能通过/tmp/mysql.sock文件进行连接,或者非正确关闭时,导致mysql.sock文件再次丢失,当你在次启动时出现如下错误,connect mysqld faild ,/tmp/mysql.sock can't find
mysql.sock的丢失主要是因为更改了机器名,在没有正确关闭mysqld的情况下,去执行mysqld_safe,这样他就删除已经运行的mysql.sock了。正常情况下,mysqld_safe 应该告诉我们是已经有Mysqld运行了,而上边并没有这样提示,主要是更改机器名导致mysqld_safe判断是否已经运行,去找的是newhostname.pid文件,但已经运行的mysqld生成的是oldhostname.pid, 肯定找不到newhostname.pid,所以mysqld_safe收拾一下(清理了mysql.sock),然后去重启,但是ibdata需要lock,它lock不了,还是起不了,但是老的mysql.sock就消失。
原因二:
连接localhost通常通过一个Unix域套接字文件进行,一般是/tmp/mysql.sock。如果套接字文件被删除了,本地客户就不能连接。这可能发生在你的系统运行一个cron任务删除了/tmp下的临时文件。
如果你因为丢失套接字文件而不能连接,你可以简单地通过重启服务器重新创建得到它。因为服务器在启动时重新创建它。

解决办法,实时上,在/etc/init.d 下有个连接启动脚本 mysqld ,我们启动时可以直接用它 service mysqld start |stop
来自:http://blog.csdn.net/imzoer/article/details/8444400
实践情况如下:
[root@localhost init.d]# mysqladmin -u root -hlocalhost -p shutdown
Enter password: 
mysqladmin: connect to server at 'localhost' failed
error: 'Can't connect to local MySQL server through socket '/tmp/mysqld.sock' (2)'
Check that mysqld is running and that the socket: '/tmp/mysqld.sock' exists!
直接干死了:
pkill -9 mysql
重启:
/usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/db/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/db/mysql/localhost.err --open-files-limit=65535 --pid-file=/usr/local/mysql/xd_xiyou_db_7.pid --socket=/tmp/mysqld.sock --port=3306

――――――――――――――――上面这种太粗暴,实践操作Ok如下:―――――――――――――――――――――――――
[root@localhost init.d]# service mysql stop
Shutting down MySQL.....                                   [  OK  ]
[root@localhost init.d]# service mysql start
Starting MySQL...                                          [  OK  ]

启动原理:
/etc/init.d/mysql
里写明了basedir及datadir,这块datadir很重要,启动时起了很大的作用,在安装时就定下来不改动最好了:

view plainprint?

  1. basedir=/usr/local/mysql  

  2. datadir=/data/db/mysql  

  3. 启动、停止、重启动脚本简述:  

  4.   'start')  

  5.     # Start daemon  

  6.   

  7.     # Safeguard (relative paths, core dumps..)  

  8.     cd $basedir  

  9.   

  10.     echo $echo_n "Starting MySQL"  

  11.     if test -x $bindir/mysqld_safe  

  12.     then  

  13.       # Give extra arguments to mysqld with the my.cnf file. This script  

  14.       # may be overwritten at next upgrade.  

  15.       $bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &  

  16.   

  17.  'stop')  

  18.     # Stop daemon. We use a signal here to avoid having to know the  

  19.     # root password.  

  20.   

  21.     if test -s "$mysqld_pid_file_path"  

  22.     then  

  23.       mysqld_pid=`cat "$mysqld_pid_file_path"`  

  24.   

  25.       if (kill -0 $mysqld_pid 2>/dev/null)  

  26.       then  

  27.         echo $echo_n "Shutting down MySQL"  

  28.   

  29.   

  30. restart原理:先stop,再start:  

  31.   'restart')  

  32.     # Stop the service and regardless of whether it was  

  33.     # running or not, start it again.  

  34.     if $0 stop  $other_args; then  

  35.       $0 start $other_args  


――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
出现以下的信息:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
如果还不行.就先
#ps -aux|grep mysql
找mysql的进程里的那个socket位置,如:

view plainprint?

  1. /usr/local/mysql/libexec/mysqld --defaults-file=/data/db/mysql/my.cnf --basedir=/usr/local/mysql --datadir=/data/db/mysql --user=mysql --log-error=/data/db/mysql/localhost.localdomain.err --pid-file=/data/db/mysql/localhost.localdomain.pid --socket=/var/lib/mysql/mysql.sock --port=3306  


方法一:
mysql --port=3306 -uroot -p123qwe*** -S /var/lib/mysql/mysql.sock
方法二:
mysql --socket=/var/lib/mysql/mysql.sock --port=3306 -uroot -p123qwe***
方法三:
ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock

我的startmysql.sh :


/usr/local/webserver/mysql/libexec/mysqld --defaults-file=/data0/mysql/3306/my.cnf --basedir=/usr/local/webserver/mysql --datadir=/data0/mysql/3306/data --user=mysql --log-error=/data0/mysql/3306/data/localhost.localdomain.err --pid-file=/data0/mysql/3306/data/localhost.localdomain.pid --socket=/tmp/mysql.sock --port=3306


my.cnf位置:


--defaults-file=/data0/mysql/3306/my.cnf
vi /data0/mysql/3306/my.cnf


里面都是关于启动Mysql的一些东西。

vi /etc/my.cnf


[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid



[root@localhost Lang-zh_cnModule-CE-5.1.0]# mysql
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)



默认去连接的/var/lib/mysql/mysql.sock 这个文件。
而我们的启动配置文件在:--socket=/tmp/mysql.sock
两个配置文件:启动运行的时候是在/data0/mysql/3306/my.cnf 的mysql.sock在位置/tmp/mysql.sock,而/etc/my.cnf 的mysql.sock在位置/var/lib/mysql/mysql.sock 刚好和在终端运行mysql出现在错误相同:Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

my.cnf是mysql的启动配置文件。所以为了使改动生效必须重启mysql!

参考:http://www.linuxidc.com/Linux/2008-06/13675.htm


――――――――――Add Time:2014-08-22――――――――――
mysql连接不上,mysqld.sock丢失
如果你指定localhost 作为一个主机名【也就是你在本机上连接本季的mysql服务】, mysqladmin 默认使用Unix套接字文件连接,而不是TCP/IP。

从MySQL 4.1 开始,通过--protocol= TCP |SOCKET | PIPE | MEMORY}选项,你可以显示地指定连接协议,举例如下:

socket 连接:
[zzz@zzz mysql]$ mysql -uroot
ERROR 2002 (HY000): Can't connect to local MySQL server through socket
'/home/zzx/mysql/mysql.sock' (2)
tcp 连接:
[zzz@zzz mysql]$ mysql --protocol=TCP -uroot -p -P3307 -hlocalhost
Enter password:
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 73 to server version: 5.0.15-standard
Type 'help;' or 'h' for help. Type 'c' to clear the buffer.
mysql>
==========》如果mysql服务器还没启动,由于mysqld.sock丢失启动不了,怎么办《===============

==========》下面是一个由于更改主机名导致的找不到sock.文件《===============

linux系统一次不正常关机后,连接mysql的时候系统提示不能通过/tmp/mysql.sock文件进行连接,或者非正确关闭时,导致mysql.sock文件再次丢失,当你在次启动时出现如下错误,connect mysqld faild ,/tmp/mysql.sock can't find
mysql.sock的丢失主要是因为更改了机器名,在没有正确关闭mysqld的情况下,去执行mysqld_safe,这样他就删除已经运行的mysql.sock了。正常情况下,mysqld_safe 应该告诉我们是已经有Mysqld运行了,而上边并没有这样提示,主要是更改机器名导致mysqld_safe判断是否已经运行,去找的是newhostname.pid文件,但已经运行的mysqld生成的是oldhostname.pid, 肯定找不到newhostname.pid,所以mysqld_safe收拾一下(清理了mysql.sock),然后去重启,但是ibdata需要lock,它lock不了,还是起不了,但是老的mysql.sock就消失。
解决办法,实时上,在/etc/init.d 下有个连接启动脚本 mysqld ,我们启动时可以直接用它 service mysqld start |stop
来自:http://blog.csdn.net/imzoer/article/details/8444400


找不到mysql.sock,mysql.sock丢失问题解决方法?
Can 't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock '(2) ";

是你的mysql.sock 文件不存在了,
可能是被你不小心删除了,

连接localhost通常通过一个Unix域套接字文件进行,一般是/tmp/mysql.sock。如果套接字文件被删除了,本地客户就不能连接。这可能发生在你的系统运行一个cron任务删除了/tmp下的临时文件。

如果你因为丢失套接字文件而不能连接,你可以简单地通过重启服务器重新创建得到它。因为服务器在启动时重新创建它。
另一个解决办法是你现在不能用套接字建立连接因为它不见了,你可以建立一个TCP/IP连接,例如,如果服务器主机是192.168.0.1,你可以这样连接:

%mysql -u root -h 192.168.0.1 -p
%mysqladmin -u root -h 192.168.0.1 -p shutdown

如果套接字文件被一个cron任务删除,问题将重复出现,除非你修改cron任务或使用一个或使用一个不同的套接字文件,你可以使用全局选项文件指定一个不同的套接字,例如,如果数据目录是/usr/local/var,你可以通过将下列行加入/etc/my.cnf中,将套接字文件移到那里:

[mysqld]
socket=/usr/local/var/mysql.sock
[client]
socket=/usr/local/var/mysql.sock
对服务器和客户均指定路径名,使得它们都使用同一个套接字文件。如果你只为服务器设置路径,客户程序将仍然期望在原位置执行套接字,在修改后重启服务器,使它在新位置创建套接字


=============================================
怎样保护“/tmp/mysql.sock ”不被删除

如果你有这个问题,事实上任何人可以删除MySQL通讯套接字“/tmp/mysql.sock”,在Unix的大多数版本上,你能通过为其设置sticky(t)位来保护你的“/tmp”文件系统。作为root登录并且做下列事情:

shell> chmod +t /tmp

这将保护你的“/tmp”文件系统使得文件仅能由他们的所有者或超级用户(root)删除。

你能执行ls -ld /tmp检查sticky位是否被设置,如果最后一位许可位是t,该位被设置了。
=============================================

一个MySQL客户可以两种不同的方式连接mysqld服务器:Unix套接字,它通过在文件系统中的一个文件(缺省“/tmp/mysqld.sock”)进行连接;或TCP/IP,它通过一个端口号连接。Unix套接字比TCP/IP更快,但是只有用在连接同一台计算机上的服务器。如果你不指定主机名或如果你指定特殊的主机名localhost,使用Unix套接字。

错误(2002)Can 't connect to ...通常意味着没有一个MySQL服务器运行在系统上或当试图连接mysqld服务器时,你正在使用一个错误的套接字文件或TCP/IP端口。 

由检查(使用ps)在你的服务器上有一个名为mysqld的进程启动!如果没有任何mysqld过程,你应该启动一个。

如果一个mysqld过程正在运行,你可以通过尝试这些不同的连接来检查服务器(当然,端口号和套接字路径名可能在你的安装中是不同的):

shell> mysqladmin version
shell> mysqladmin variables
shell> mysqladmin -h `hostname` version variables
shell> mysqladmin -h `hostname` --port=3306 version
shell> mysqladmin -h 'ip for your host ' version
shell> mysqladmin --socket=/tmp/mysql.sock version
注意hostname命令使用反引号“`”而非正引号“ '”;这些导致hostname输出(即,当前主机名)被代替进mysqladmin命令中。

这是可能造成Can 't connect to local MySQL server错误的一些原因: 

mysqld不在运行。 
你正在使用MIT-pthreads的一个系统上运行。如果正在运行在一个没有原生线程的系统上,mysqld使用 MIT-pthreads 软件包。然而,MIT-pthreads不支持Unix套接字,因此当与服务器连接时,在这样一个系统上,你总是必须明确地指定主机名。试试使用这个命令检查到服务器的连接:
shell> mysqladmin -h `hostname` version
某人删除了mysqld使用的Unix套接字(缺省“/tmp/mysqld.sock”)。你可能有一个cron任务删除了MySQL套接字(例如,一个把旧文件从“/tmp”目录中删除的任务)。你总是可以运行mysqladmin version并且检查mysqladmin正在试图使用的套接字确实存在。在这种情况下,修复方法是删除cron任务而不删除“mysqld.sock 或将套接字放在其他地方。你能用这个命令在MySQL配置时指定一个不同的套接字地点:
shell> ./configure --with-unix-socket-path=/path/to/socket
你也可以使用--socket=/path/to/socket选项启动safe_mysqld和在启动你的MySQL客户前设置环境变量MYSQL_UNIX_PORT为套接字路径名。你可用--socket=/path/to/socket选项启动mysqld服务器。如果你改变了服务器的套接字路径名,你也必须通知MySQL客户关于新路径的情况。你可以通过设置环境变量MYSQL_UNIX_PORT为套接字路径名或由提供套接字路径名作为客户的参数做到。你可用这个命令测试套接字:

shell> mysqladmin --socket=/path/to/socket version
你正在使用 Linux和线程已经死了(核心倾倒了)。在这种情况中,你必须杀死其它mysqld线程(例如在启动一个新的MySQL服务器之前,可以用mysql_zap脚本)。见18.1 如果MySQL总是崩溃怎么办。 
如果你得到错误Can 't connect to MySQL server on some_hostname,你可以尝试下列步骤找出问题是什么: 

通过执行telnet your-host-name tcp-ip-port-number并且按几次回车来检查服务器是否正常运行。如果有一个MySQL运行在这个端口上,你应该得到一个包含正在运行的MySQL服务器的版本号的应答。如果你得到类似于telnet: Unable to connect to remote host: Connection refused的一个错误,那么没有服务器在使用的端口上运行。 
尝试连接本地机器上的mysqld守护进程,并用mysqladmin variables检查mysqld被配置使用的TCP/IP端口(变量port)。 
检查你的mysqld服务器没有用--skip-networking选项启动。 


不要使用 mysql -h 'localhost '来连接mysql服务器,这样的语句只能在同一台机子上运行,用mysql -h 127.0.0.1 这样的语句来连接服务器。


你可能感兴趣的:(找不到mysql.sock的出现原因及解决方案和mysql 默认mysql.sock位置默认问题探讨)