脚本连接MySQL返回ERROR 2002错误但终端执行相同命令正常是什么原因?
问题原因
- MySQL服务启动后无等待就绪逻辑
你脚本中执行的./mysql_start.sh是后台启动mysqld进程,mysqld从启动到完成初始化、生成socket文件、启动监听需要数百毫秒到数秒不等的时间。脚本没有加等待逻辑,执行完启动命令后立刻执行mysql连接命令,此时socket文件还未生成,所以会抛出ERROR 2002找不到socket的错误。
当你注释掉脚本最后一行,等脚本执行完成后再手动敲命令时,中间的时间差已经足够mysqld完成启动,socket已经生成,所以可以正常连接。 - 配置文件段不匹配(非核心报错原因)
你写入~/.my.cnf的配置放在了[mysqld]段,这个段是给MySQL服务端读取的,mysql客户端命令只会读取[client]段的配置,所以你写的socket、密码配置对客户端不生效,不过这个问题不会触发本次的2002错误。
修复方案
在./mysql_start.sh之后新增socket文件存在性等待逻辑即可,示例代码如下:
# 启动MySQL服务 ./mysql_start.sh # 新增等待逻辑,最多等待30秒 SOCKET_PATH="$SQLDIR/mysql/socket" WAIT_COUNT=0 MAX_WAIT=60 # 每次等待0.5秒,累计最多等30秒 while [ ! -S "$SOCKET_PATH" ] && [ $WAIT_COUNT -lt $MAX_WAIT ]; do sleep 0.5 WAIT_COUNT=$((WAIT_COUNT + 1)) done if [ ! -S "$SOCKET_PATH" ]; then echo "MySQL启动超时,未找到socket文件 $SOCKET_PATH" return 1 fi
你也可以额外在执行mysql连接命令前加一行ls -l $SQLDIR/mysql/socket,打印socket文件状态,确认是启动时序问题。
如果需要让~/.my.cnf的配置对客户端生效,可以把配置段从[mysqld]改成[client],后续执行mysql命令不需要额外带--socket、-u、-p参数也能正常连接。
内容的提问来源于stack exchange,提问作者Lou
相关产品推荐
相关产品推荐

