tmp mysql.sock 2_msyql编译版运行出现问题如:can't connect ‘/tmp/mysql.sock '(2)-Go语言中文社区...

本文介绍了如何解决Linux环境下MySQL连接错误2002,问题根源在于客户端尝试连接的socket文件与mysqld服务器实际使用的socket文件不匹配。解决方案包括检查和设置正确的socket路径,以及调整文件权限。通过修改配置文件、使用不同的连接方式(如通过socket或端口)和赋予正确权限,可以成功解决此问题。
摘要由CSDN通过智能技术生成

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

环境linux,windows也可以通用,配置文件在mysql文件夹my.ini下,没有的话自己创建一个;

报错:

root:~# mysql -uroot -p

Enter password:

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

解决方案:

先启动mysqld服务器,

defaults-file是你的配置文件地址,默认/etc/my.cnf

/data1/mysql_root/base/mysql5.7/bin/mysqld_safe --defaults-file=/data/3506/my-large.cnf

查看下运行情况:

ps -ef |grep mysql

我的电脑上有4 个mysql实例,他们却并不冲突,

adef9c0163518ceb44ea96c8b5e078e5.png

mysqld跑起来了,

其中,它们的sock地址:

--socket=/data/3506/mysql.sock

--socket=/data/3406/mysql.sock

--socket=/var/lib/mysqlmysql.sock

端口:

7d5447221767befaa1776660d34efc6b.png

port可以在defaults-file配置文件里设定,下面有一个.cnf的文件示例

3506

3406

第三个没写出来的默认是3306

配置文件也有多个:

--defaults-file=/data/3506/my-large.cnf

--defaults-file=/data/3406/my-large.cnf

没写出来的那个在默认的/etc/my.cnf

登陆方式:sock连接

mysql -S /data/3406/mysql.sock

mysql -S /data/3506/mysql.sock

mysql -S /var/lib/mysqlmysql.sock

端口连接登录

mysql -uroot -proot -h127.0.0.1 -P3406

mysql -uroot -proot -h127.0.0.1 -P3506

mysql -uroot -proot -h127.0.0.1 -P3306

出现can’t connect ‘/tmp/mysql.sock '(2)无法连接的原因是启动的mysqld服务器和client要连接的服务器的sock地址不一致,

所以,按照上面的方式,保证他们一一对应,再给出权限:

chown mysql.mysql /sock文件报错地址

chmod -R 777 /sock文件保存地址

就解决了问题,

其实这说不上是bug,应该可以算是用户不会配置。。。

简单说一下原因:

1.sock连接,当你安装mysql的时候,配置了一个my.cnf文件(默认是在/etc/my.cnf下),打开看一下,内容大同小异,

里面有client和mysqld的区别,

这里client就是mysql运行用户,平时用命令

mysql -uroot -proot -h127.0.0.1 -P3306就是在启动client

mysqld是mysql的服务器

[root@TENCENT64 ~]# cat /etc/my.cnf

# The following options will be passed to all MySQL clients

[client]

#password= your_password

port= 3406

socket= /data/3406/mysql.sock

# Here follows entries for some specific programs

# The MySQL server

[mysqld]

user = mysql

port= 3406

socket= /data/3406/mysql.sock

datadir = /data/3406/data

basedir = /data1/mysql_root/base/mysql5.7

pid-file = /data/3406/mysql.pid

skip-external-locking

key_buffer_size = 256M

max_allowed_packet = 1M

table_open_cache = 256

sort_buffer_size = 1M

read_buffer_size = 1M

read_rnd_buffer_size = 4M

myisam_sort_buffer_size = 64M

thread_cache_size = 8

query_cache_size= 16M

# Try number of CPU's*2 for thread_concurrency

skip-grant-tables

[mysqldump]

quick

max_allowed_packet = 16M

[mysql]

no-auto-rehash

# Remove the next comment character if you are not familiar with SQL

#safe-updates

[myisamchk]

key_buffer_size = 128M

sort_buffer_size = 128M

read_buffer = 2M

write_buffer = 2M

[mysqlhotcopy]

interactive-timeout

[mysql_safe]

log-error=/data/3406/mysql_log3406.err

pid-file=/data/3406/mysqld.pid

我们重点要看的是:

socket= /data/3406/mysql.sock

一般是定义在/tmp/mysql.sock下的,它会带给我们一种感觉,好像是socket连接。

实际上,在mysqld启动的时候,也就是你运行了下面命令

service start mysqld

之后,linux启动mysqld也就是mysql服务器,创建了一个“接口”,这个接口很安全,只跟本机localhost连接,它很小气,连127.0.0.1都不给连,

连接的时候,用命令:

这里,/var/lib/mysql/mysql.sock是我的my.cnf里面设定的地址。

mysql -S /data/3406/mysql.sock

现在你知道了,mysql.sock在mysqld运行的时候创建,在mysqld关闭的时候被删除、根本就在本地运行,没有上网。

而mysql -uroot -proot -h127.0.0.1 -P3306 则不一样,是通过网络端口连接的,

你可以登录后用一句show grants看出两种方式的区别。

mysqld的一个启动脚本如下:

运行这个脚本来启动服务:/mysqld_op 的保存路径/mysqld_op start

运行这个脚本来关闭服务:/mysqld_op 的保存路径/mysqld_op stop

mysqld_op文件:

#!/bin/sh

#init

port=3406

mysql_user="root"

mysql_pwd="root"

CmdPath="/data1/mysql_root/base/mysql5.7/bin"

mysql_sock="/data/${port}/mysql.sock"

#startup func

function_start_mysql()

{

if [ ! -e "$mysql_sock" ];then

printf "Starting MYsql...n"

/bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my-large.cnf 2>&1 >/dev/null &

else

printf "mysql is running!n"

exit

fi

}

#stop function

function_stop_mysql()

{

if [ ! -e "$mysql_sock"];then

printf "MYsql is stopped...n"

exit

else

printf "mysql is stopping!n"

${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdown

fi

}

case $1 in

start)

function_start_mysql

;;

stop)

function_stop_mysql

;;

*)

printf "Usage: /data/${port}/mysql {start|stop}n"

esac

我的文件目录:

mysql是启动脚本,和mysql.sh一样,就是上面的脚本mysqld_op文件

改叫mysqld_op是为了和linux安装mysql后默认的/bin/mysql启动文件做区分。mysqld_op就是个bash脚本。

my-large.cnf就是配置文件,

mysql.sock就是连接socket,自动创建的,

data保存数据。

a5fba8952305dea061c0251755daa2be.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值