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

msyql编译版运行出现问题如:can't connect ‘/tmp/mysql.sock '(2)


解决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)

要解决这个问题,首先了解mysql的几种连接方式:
想看详细,见下文总结
https://blog.csdn.net/qinglingLS/article/details/96864122

解决方案:

先启动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实例,他们却并不冲突,
在这里插入图片描述
mysqld跑起来了,
其中,它们的sock地址

--socket=/data/3506/mysql.sock
--socket=/data/3406/mysql.sock
--socket=/var/lib/mysqlmysql.sock

端口:
在这里插入图片描述
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保存数据。

在这里插入图片描述

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qinglingLS/article/details/97031100
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢