Mysql有两种连接方式:

(1)TCP/IP


(2)socket


程序与mysqlserver处于同一台机器,发起本地连接时可用。


例如你无须定义连接host的具体IP得,只要为空或localhost就可以。


在此种情况下,即使你改变mysql的外部port也是一样可能正常连接。


因为你在my.ini中或my.cnf中改变端口后,mysql.sock是随每一次 mysql server启动生成的。已经根据你在更改完my.cnf后重启mysql时重新生成了一次,信息已跟着变更。




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删了。然后用mysql的源码包重装,重装过后,我用rpm工具查询不了它的安装包,但命令mysql有。同样也启动不了,亦是找不到mysql.sock文件。是不是装了mysql过后要作一些配置?怎么配置?rpm工具都找不到mysql,如果我要删除的话,又该怎么做?很奇怪,我用源码包装了过后,再用rpm包装了一次,它们没有冲突,不过都是启动不了。这又涉及到什么问题?



最佳答案

连接MySQL找不到mysql.sock文件的解决办法

运行程序可能会报错:Can’t connect to local MySQL Server through socket ‘/tmp/mysql.sock’

这个错误的提示是说,不能通过’/tmp/mysql.sock’连接到服务器。Mysql.sock是创建与mysqld服务器相关的MySQL通信端点所使用的套接字。而PHP标准配置正是通过’/tmp/mysql.sock’来连接数据库,可能是一些mysql的安装方法将mysql.sock放到了别的地方,可以通过修改/etc/mysql/my.cnf文件(或者/etc/my.conf文件,和mysql安装的方法有关,该配置文件的路径可能会有所不同)来修改它,打开文件可以看到如下的语句:

[mysqld] 
   

 Socket = /var/lib/mysql/mysql.sock



   说明mysqld.sock文件放在了/var/lib/mysql/文件夹下,所以不能在/tmp路径下找到该文件,通过做一个链接文件就可以解决这个问题:

   您可以在命令行下手动输入如下命令:

ln -s /var/lib/mysqld/mysqld.sock /tmp/mysql.sock



   修改完之后,程序就可以正常启动了。

   如果还是不能启动的话,可能是由于MySQL服务器没有打开,如果MySQL服务器没有打开的话,在/var/lib/mysql/目录下就不会有mysql.sock这个文件,所以即使做了链接文件就没有用,因为它根本找不到/var/lib/mysql/mysql.sock文件。所以使用命令开启MySQL服务器:

$service mysqld start



    如果想让MySQL服务器在每次计算机重启时启动,键入如下命令(root用户身份):

$chkconfig mysqld on



MySQL下mysql.sock丢失问题的解决[ubuntu, linux, mysqld.sock]





MySQL下mysql.sock丢失丢失的原因一般是因为配置文件不一致的原因,mysqld 错误启动,mysqld_safe 会清除一次mysql.sock

判断一般人解决故障时没有切换到mysql用户,造成权限有问题,无法创建mysql授权表,所以也就无法创建/tmp/mysql.sock 和hostname.pid文件。因此,总结解决方法如下(注: 使用root也可以):

#su mysql
$/usr/local/bin/mysql_install_db //重建授权表
$/usr/local/bin/mysqld_safe &
$/usr/local/bin/mysql //测试
mysq>bye;
$

文件已经解决,重新生成新的 /tmp/mysql.sock 和 hostname.pid

$su root

 

关于Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)的问题

找不到mysql socket的问题,我最近碰到了好多次

重装系统以前,我的mysql,apache,php都是自己编译安装的,当时并没有碰到这些问题,

重装系统以后,我的mysql是通过yum安装的,apache1.37和php5.2是自己编译安装的,出现了这个问题

首先是mysqld启动不了,

我通过vim /etc/my.cnf,修改了[mysqld]选项下面的socket的值

socket=/var/lib/mysql/mysql.sock

ok,mysqld可以启动了

接下来,是mysql启动不了,同样,vim /etc/my.cnf,添加了如下脚本:

[mysql]
 socket=/var/lib/mysql/mysql.sock

然后,mysqladmin启动不了,还是一样,在[mysqladmin]下面socket值设置为同样的路径

ok,可以启动了

最后,用php连接的时候,又出现这个问题了

Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

我首先想到的是,在/etc/php.ini修改mysql.default_socket的值,在这个文件中,关于mysql.default_socket的值的说明是这样的,

; Default socket name for local MySQL connects.  If empty, uses the built-in MySQL defaults.

这个值一开始是空的,也就是说,如果我们不主动去修改的话,php将会使用内建在mysql中的默认值

于是,我修改了这个值,设置为:

mysql.default_socket=/var/lib/mysql/mysql.sock

然后我重新启动apache,结果无效;reboot系统,结果无效

我火大了,php就非得去连接/tmp/mysql.sock,可是我的系统里面就是没有这个路径下的这个文件,那我就给你链接一个,于是我做了下面的操作,

ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock

重新打开我的php页面,ok,这下能连接到数据库了。

就这样,我把这个问题解决了,可是我还是有点迷糊,为什么一定要去找/tmp/mysql.sock这个文件,是不是一开始我就给它ln一个链接就可以解决?这个mysql.sock到底是用来做什么的?于是我就产生了看看这个文件内容的想法,

cat /var/lib/mysql/mysql.sock

提示我,cat: /var/lib/mysql/mysql.sock: 没有那个设备或地址

less /var/lib/mysql/mysql.sock
 /var/lib/mysql/mysql.sock is not a regular file (use -f to see it)

我强行查看!

less -f /var/lib/mysql/mysql.sock
 /var/lib/mysql/mysql.sock: 没有那个设备或地址
 ~~
 vim /var/lib/mysql/mysql.sock

提示权限不足,我是root用户耶,还提示权限不足,奇怪了

~~~~
 ll /var/lib/mysql/mysql.sock

看到的属性是:

srwxrwxrwx 1 mysql mysql 0 11-21 14:39 /var/lib/mysql/mysql.sock

这个属性引起了我的注意,档案类型标志是s,还真没去了解过这样的类型,到鸟哥的私房菜去找了一下,原来,这个是资料接口档,用我们大陆说的习惯应该是套接字文件(sockets),这种文件一般用在网络上的资料套接,mysqld守护进程生成了这个文件,其他与mysql相关的程序想使用mysql,估计就是通过这个文件了。

这种特殊文件即使是最高权限的root用户,也是不能查看不能编辑的,有点像档案标志是p的管道文件。


MySQL中mysql.sock找不到的解决方法

链接MySQL时,报错:


cant connect to mysql server through socket '/tmp/mysql.sock'


本质上这个问题是mysql.sock在其他路径导致的。

有文章说可以通过修改my.cnf的socket路径,但个人尝试后发现,这样可能导致mysql的服务起不来。

笔者认为,还是用软连接比较安全,方法如下:


1、找到mysql.sock

使用 find / -name mysql.sock进行寻找。如果找不到,那么说明该socket可能不是这个名字。

因此,需要先找到my.cnf,输入:


find / -name my.cnf
vim /<your path to my.cnf>/my.cnf


在里面找到该sock的名字。例如笔者的就是mysqld.sock.

然后通过 find 定位,找到sock的路径。


2、软链接

把sock软链接到目标路径。以笔者的问题为例,就是:

ln -s /run/mysqld/mysqld.sock /tmp/mysql.sock

Problem Solved !
Happy Coding ~





1、在编译安装 mysql

的时候,会将mysql的配置文件复制到/etc/my.conf中:

[root@mysql ~]# cat /etc/my.cnf 
[mysqld]
port            = 3306
socket          = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 16K
max_allowed_packet = 1M
table_open_cache = 4
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 128K



[root@mysql ~]# mysql -u root -poldboy123 -S /tmp/mysql.sock 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.5.32 MySQL Community Server (GPL)

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

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

mysql>



如果还不行就选择用TCP连接方式连接就行了,其实windows下还支持管道连接方式。

启动或重启mysql不成功,提示:Another MySQL daemon already running with the same unix socket

出现此问题往往是上次mysql意外关闭造成的.最简便的解决方法就是找到mysql.sock文件删除掉,再重新启动mysqld即可成功.


在国外网站发现的解决方法。

原因多个MySQL进程使用了同一个socket。

两个方法解决:

第一个是立即关机 使用命令 shutdown -h now 关机,关机后在启动,进程就停止了。

第二个直接把mysql.sock文件改名即可。也可以删除,推荐改名。

然后就可以启动mysql了。


下面是国外原文


To prevent the problem from occurring, you must perform a graceful shutdown of the server from the command line rather than powering off the server.

# shutdown

This will stop the running services before powering down the machine.

Based on Centos, an additional method for getting it back up again when you run into this problem is to move mysql.sock:

# mv /var/lib/mysql/mysql.sock /var/lib/mysql/mysql.sock.bak

# service mysqld start

Restarting the service creates a new entry called mqsql.sock





1 踩






在国外网站发现的解决方法。

原因多个MySQL进程使用了同一个socket。

两个方法解决:

第一个是立即关机 使用命令 shutdown -h now 关机,关机后在启动,进程就停止了。

第二个直接把mysql.sock文件改名即可。也可以删除,推荐改名。

然后就可以启动mysql了。


下面是国外原文


To prevent the problem from occurring, you must perform a graceful shutdown of the server from the command line rather than powering off the server.

# shutdown

This will stop the running services before powering down the machine.

Based on Centos, an additional method for getting it back up again when you run into this problem is to move mysql.sock:

# mv /var/lib/mysql/mysql.sock /var/lib/mysql/mysql.sock.bak

# service mysqld start

Restarting the service creates a new entry called mqsql.sock