Mysql有两种连接方式:
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 /
在里面找到该sock的名字。例如笔者的就是mysqld.sock.
然后通过 find 定位,找到sock的路径。
2、软链接
把sock软链接到目标路径。以笔者的问题为例,就是:
ln -s /run/mysqld/mysqld.sock /tmp/mysql.sock
Problem Solved !
Happy Coding ~
-
[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>
在国外网站发现的解决方法。
原因多个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 -h now
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