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

本文介绍了解决MySQL连接错误的具体步骤,包括如何启动MySQL服务器、设置正确的socket路径以及配置客户端和服务端的一致性。

解决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.youkuaiyun.com/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保存数据。

在这里插入图片描述

<think>我们面对的错误是:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql/mysql.sock' (2) 这个错误通常表示MySQL客户端无法通过指定的套接字文件连接到MySQL服务器。原因可能有以下几种: 1. MySQL服务器未运行2. 套接字文件路径不正确(可能是配置问题或实际文件不在该路径)。 3. 套接字文件被删除(如/tmp目录被清理)。 4. 权限问题导致无法访问套接字文件。 根据引用[1][2][5]可知,该错误与套接字文件路径有关。在引用[3][4]中提到了通过配置文件解决的方法。 在麒麟V10系统下,我们可以按照以下步骤进行排查和解决: 步骤1:检查MySQL服务器状态 首先确保MySQL服务已经启动。 在麒麟V10中,使用systemctl命令检查: ```bash sudo systemctl status mysqld # 或者mysql,具体服务名可能不同,也可能是mariadb ``` 如果服务未运行,则启动它: ```bash sudo systemctl start mysqld ``` 步骤2:确认套接字文件路径 如果服务已运行,那么我们需要确认MySQL服务器实际使用的套接字文件路径。 方法1:查看MySQL配置文件 MySQL的配置文件通常是/etc/my.cnf或/etc/mysql/my.cnf,也可能是/etc/my.cnf.d/下的文件。在配置文件中查找`socket`选项。 例如: ```bash sudo grep 'socket' /etc/my.cnf ``` 或者查看更常见的配置路径: ```bash sudo grep 'socket' /etc/my.cnf /etc/mysql/my.cnf /etc/my.cnf.d/*.cnf ``` 方法2:通过进程查看 如果配置文件中没有明确指定,可以通过查看MySQL进程信息来获取套接字路径: ```bash ps aux | grep mysqld ``` 在输出中寻找`--socket=...`的参数。 方法3:使用MySQL命令(如果能用TCP/IP连接) 如果MySQL服务器正在运行且允许TCP/IP连接(通常端口3306),我们可以尝试用TCP/IP连接(使用-h127.0.0.1)然后查询socket变量: ```bash mysql -h127.0.0.1 -uroot -p -e "SHOW VARIABLES LIKE 'socket';" ``` 注意:如果服务器只监听套接字而不监听TCP,则此方法无效。 步骤3:比较客户端配置的套接字路径 客户端连接时默认使用的套接字路径可能和服务器端配置的不同。客户端会按照以下顺序确定套接字路径: 1. 命令行参数`--socket`指定 2. 配置文件(如/etc/my.cnf,~/.my.cnf)中[client]部分的`socket`选项 3. 编译时指定的默认路径(通常是/var/lib/mysql/mysql.sock) 根据引用[4],我们可以创建或修改客户端的配置文件,设置正确的套接字路径。 例如,如果我们在步骤2中查到的服务器套接字路径是`/var/run/mysqld/mysqld.sock`,那么我们可以在当前用户的家目录下创建`.my.cnf`文件: ```bash vi ~/.my.cnf ``` 内容如下: ``` [client] socket = /var/run/mysqld/mysqld.sock ``` 保存后,再尝试连接。 步骤4:创建符号链接(如果路径不一致且无法修改配置) 如果服务器套接字文件在A路径,而客户端默认使用B路径,且无法修改配置,则可以创建一个从B路径到A路径的符号链接(需要权限): ```bash sudo mkdir -p /tmp/mysql # 确保目录存在,错误中路径是/tmp/mysql/mysql.sock sudo ln -s /var/run/mysqld/mysqld.sock /tmp/mysql/mysql.sock ``` 注意:/tmp目录是临时目录,重启后符号链接会消失,所以这只是一个临时解决方案。 步骤5:修改MySQL服务器配置(可选) 如果我们希望将套接字文件放在/tmp/mysql/mysql.sock,可以修改MySQL的配置文件,在[mysqld]部分添加: ``` [mysqld] socket=/tmp/mysql/mysql.sock ``` 然后在[client]部分也添加同样的配置(或者确保客户端配置一致),然后重启MySQL服务。 步骤6:检查文件权限 确保套接字文件存在且MySQL用户(通常是mysql)有权限读写,并且连接MySQL的客户端用户(当前用户)有权限读取该文件。 例如,查看套接字文件权限: ```bash ls -l /tmp/mysql/mysql.sock ``` 通常,套接字文件应该属于mysql用户和组,并且有读写权限(如srwxrwxrwx)。如果权限不对,可以修改: ```bash sudo chown mysql:mysql /tmp/mysql/mysql.sock sudo chmod 777 /tmp/mysql/mysql.sock # 注意:宽松权限仅用于测试,生产环境应严格控制 ``` 步骤7:使用TCP连接绕过套接字 如果上述步骤都无效,可以尝试使用TCP连接(如果服务器监听了TCP端口): ```bash mysql -h127.0.0.1 -P3306 -uroot -p ``` 如果连接成功,说明问题只在于套接字连接。 总结:在麒麟V10下解决此问题的关键步骤是确认服务器套接字路径并确保客户端使用相同的路径。优先采用配置客户端套接字路径的方法(步骤3)或修改服务器配置(步骤5)来统一路径。 如果问题仍然存在,请检查错误日志(通常在/var/log/mysqld.log或/var/log/mysql/error.log)以获取更多信息。 引用说明: [^1][^2][^5]:提到了错误现象和套接字文件的重要性。 [^3][^4]:提到了通过配置文件解决套接字路径问题的方法。 根据以上分析,我们给出针对麒麟V10的详细解决步骤。 </think> 在麒麟V10系统下遇到 `ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql/mysql.sock' (2)` 错误,表明MySQL客户端无法通过指定的Unix套接字文件连接到服务器。以下是系统化的解决步骤: --- ### **1. 检查MySQL服务状态** 首先确认MySQL服务是否正常运行: ```bash sudo systemctl status mysqld # 或 mysql/mariadb ``` - **若服务未运行**:启动服务 ```bash sudo systemctl start mysqld ``` - **若启动失败**:查看日志定位原因 ```bash sudo journalctl -u mysqld -n 50 --no-pager # 检查最后50行日志 ``` --- ### **2. 验证套接字文件路径** #### 查找实际套接字路径: ```bash sudo grep "socket" /etc/my.cnf /etc/mysql/my.cnf /etc/my.cnf.d/*.cnf 2>/dev/null ``` - **若输出类似**: ```ini [mysqld] socket=/var/lib/mysql/mysql.sock # 实际路径 ``` - **若未找到配置**:通过进程确认路径 ```bash ps aux | grep mysql | grep -- --socket ``` --- ### **3. 修复套接字路径不匹配** #### 情况1:客户端使用错误路径(需修正配置) 创建客户端配置文件 `~/.my.cnf`: ```bash echo -e "[client]\nsocket=$(sudo grep '^socket' /etc/my.cnf | awk -F= '{print $2}')" > ~/.my.cnf ``` > 此命令自动提取服务端socket路径并写入配置[^4]。 #### 情况2:套接字文件被删除(重建链接) ```bash ACTUAL_SOCKET=$(sudo grep '^socket' /etc/my.cnf | awk -F= '{print $2}') sudo mkdir -p /tmp/mysql sudo ln -s $ACTUAL_SOCKET /tmp/mysql/mysql.sock # 创建符号链接 ``` --- ### **4. 检查文件权限** 确保套接字文件可被当前用户访问: ```bash SOCKET_PATH=$(sudo grep '^socket' /etc/my.cnf | awk -F= '{print $2}') sudo chmod 777 $SOCKET_PATH # 临时放宽权限测试 sudo chown mysql:mysql $SOCKET_PATH # 确保属主为mysql用户 ``` --- ### **5. 使用TCP/IP连接临时绕过** 若套接字问题无法快速解决,通过TCP连接: ```bash mysql -h 127.0.0.1 -u root -p # 强制使用TCP(默认端口3306) ``` --- ### **6. 永久解决方案** 修改MySQL服务端配置,统一套接字路径: ```bash sudo sed -i '/\[mysqld\]/a socket=/tmp/mysql/mysql.sock' /etc/my.cnf sudo mkdir -p /tmp/mysql sudo chown mysql:mysql /tmp/mysql sudo systemctl restart mysqld ``` > 此操作将套接字固定到`/tmp/mysql/mysql.sock`,避免路径不一致。 --- ### **关键原因解析** - **`/tmp`目录特性**:麒麟V10定期清理`/tmp`,可能导致套接字文件丢失[^5]。 - **路径不一致**:服务端与客户端配置的socket路径不同是常见诱因[^1][^2]。 - **权限问题**:`mysql.sock`属主非`mysql`用户或权限不足[^3]。 通过以上步骤,可系统性解决麒麟V10下的MySQL套接字连接错误。若问题仍存,检查SELinux状态(`sudo setenforce 0`临时禁用测试)或防火墙设置。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值