连接Mysql出现2002 - Can‘t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock‘ (2)

情况一 :

首先我们跑起来mysql容器

  docker run -d --name mysql-container -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 mysql:8.0.34

进入容器

docker exec -it mysql-container mysql -u root -p

输入密码后报错:2002 - Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

最快的方法就是

docker exec -it mysql-contaniner bash

mysql -h127.0.0.1 -uroot -p  输入密码后可进入mysql

如果这样失败可以尝试以下方式。、

情况二 :

对应目录找不到sock文件

还有一个原因是在docker的mysql容器会发现 /var/run/mysqld这个目录下没有mysqldsock

为什么没有暂时还没有找到原因。

解决方法

1 在docker的mysql容器中找到这个文件

find / -name mysql.sock   (就是找mysql.sock不是mysqld.sock)

2 执行后会有文件目录

/var/lib/mysql/mysql.sock

3 找到文件路径后给他加上一个软连接

ln -s /var/lib/mysql/mysql.sock /var/run/mysqld/mysqld.sock

情况三(重要总结)

如果不小心把sock文件不小心删除了

如果不小心删除会发现不论如何卸载重装,都会出现问题:

root@server ~# mysql -uroot -p
Enter password: 
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

分析一下为什么出现这个问题,现在讲之总结一下,以备后人查阅。
  出现的问题是:找不到mysql.sock,

如果你可以运行find / -name mysql.sock这条命令,并且能查到结果的话,只需将查到的结果做一个软连接到/tmp目录下即可解决(网上都是这么解决的)。


但是,执行了这条语句之后,并没有任何反应,没有找到mysql.sock文件。

首先我们应该明白mysql.sock的文件有什么用

连接localhost的时候通常要通过一个Unix域套接字文件进行,一般是/tmp/mysql.sock。如果sock文件被删除了,本地客户就不能连接肯呢个发生在运行一个cron任务删除了/tmp下的临时文件。

如果因为丢失sock文件不能连接,可以简单通过重启服务器重新创建得到,如果重启后没有任何变化或者不能随意重启服务器。可以使用:   mysql -h127.0.0.1 -uroot -p; 不出意外是可以使用的。这是因为现在不能用套接字建立连接因为它不见了,所以可以自行建立一个TCP/IP连接。

如果sock套接字文件被一个cron任务删除了问题会重复出现。

解决

1 修改cron任务

2 使用一个不同的套接字文件重新制定一个不同的套接字,或者现在没有mysql.sock文件要想办法生成一个

首先 :更改my.cnf文件   服务器目录为/etc/my.cnf ,如果没有的话考虑find去查找。确认好 mysql.sock的路径。保存退出。

授权

chmod 777 /var/lib/mysql

重启

service mysql restart 

service mysqld restart   重启失败后显示

Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalc
tl -xe" for details.

去查看mysql状态和查看日志我尝试发现/var/run/mysqld目录不存在,也就是说mysqld服务重启缺少一些d。

mkdir /var/run/mysqld && chmod 777 /var/run/mysqld/ && service mysql start

这样重启mysqld服务,发现重启成功那么会发现在/var/run/mysqld中有三个文件

mysqld.pid  mysqld.sock  mysqld.sock.lock  有我们熟悉的mysql.sock我们现在用它来尝试连接一下

root@i:/var/run/mysqld# mysql -uroot -p -S /var/run/mysqld/mysqld.sock 
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.20-0ubuntu0.16.04.1 (Ubuntu)
 
Copyright (c) 2000, 2017, 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>

发现可以了,我们把之前的配置改掉,给原来的路径加上一个软连接

ln -s /var/run/mysqld/mysqld.sock /tmp/mysql.sock

这样在tmp就有了my.cnf配置文件中的mysql.sock文件到此为止这样的问题应该可以修复了。

(部署前脚本可调试一次)docker exec mysql报ERROR 2002 和ERROR 2003错误的解决办法

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'

ERROR 2003 (HY000): Can't connect to MySQL server on '0.0.0.0:3306' (111)

ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost:3306' (101)

调试后不报错了,现在把shell脚本记下来:

# 获取 该容器实例的ip
mysql_docker_ip=$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my_mysql)
echo "容器实例ip:$mysql_docker_ip"
exe_sqls="GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '"$MYSQL_ROOT_PASSWORD"';flush privileges;"
docker exec -id $CNT_NAME mysql -h$mysql_docker_ip -P$MYSQL_PORT --protocol=tcp -uroot -p$MYSQL_ROOT_PASSWORD -e "${exe_sqls}"

注意:

--protocol=tcp

通常进入容器用 docker exec -it 但是这里比较特殊,要改为 docker exec -id,就是后台运行

-h 一定要是容器实例的内网ip,即 mysql_docker_ip,我试了0.0.0.0 127.0.0.1 localhost 都不行

-P 一定是映射出来的端口,不是容器里的端口3306

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值