情况一 :
首先我们跑起来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