docker mysql “ERROR 2002(HY000):Can‘t connect to local MySQL server through socket,mysql容器不断重启”处理方法

docker mysql “ERROR 2002 (HY000):Can't connect to local MySQL server through socket”,“mysql容器不断重启”处理方法

错误描述

  • 1、错误现象1
    mysql 容器不断重启,如下图:

    mysql 容器不断重启

  • 2、错误现象2
    进入mysql容器后,执行命令:

    mysql -uroot -p
    

    报错信息:

    ERROR 2002 (HY000): Can't connect to local MySQL server through socket
    

运行环境

  • Docker version 20.10.2, build 2291f61
  • ubuntu 16.04 LTS
  • mysql 5.6.39

szZack的文章

错误分析

先执行 docker logs mysql 查看日志
输入下面命令查看日志信息:

docker logs mysql

可以看到如下错误信息:

2022-09-29 06:43:20 1 [ERROR] InnoDB: Unable to lock ./ibdata1, error: 11
2022-09-29 06:43:20 1 [Note] InnoDB: Check that you do not already have another mysqld process using the same InnoDB data or log files.
2022-09-29 06:43:20 1 [Note] InnoDB: Unable to open the first data file
2022-09-29 06:43:20 7f4bf44f9740  InnoDB: Operating system error number 11 in a file operation.
InnoDB: Error number 11 means 'Resource temporarily unavailable'.
InnoDB: Some operating system error numbers are described at
InnoDB: http://dev.mysql.com/doc/refman/5.6/en/operating-system-error-codes.html
2022-09-29 06:43:20 1 [ERROR] InnoDB: Can't open './ibdata1'
2022-09-29 06:43:20 1 [ERROR] InnoDB: Could not open or create the system tablespace. If you tried to add new data files to the system tablespace, and it failed here, you should now edit innodb_data_file_path in my.cnf back to what it was, and remove the new ibdata files InnoDB created in this failed attempt. InnoDB only wrote those files full of zeros, but did not yet use them in any way. But be careful: do not remove old data files which contain your precious data!
2022-09-29 06:43:20 1 [ERROR] Plugin 'InnoDB' init function returned error.
2022-09-29 06:43:20 1 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2022-09-29 06:43:20 1 [ERROR] Unknown/unsupported storage engine: InnoDB
2022-09-29 06:43:20 1 [ERROR] Aborting

这里有2条重要的错误信息:
错误信息1:

2022-09-29 06:43:20 1 [ERROR] InnoDB: Can't open './ibdata1'

错误信息2:

2022-09-29 06:43:20 1 [ERROR] InnoDB: Could not open or create the system tablespace. If you tried to add new data files to the system tablespace, and it failed here, you should now edit innodb_data_file_path in my.cnf back to what it was, and remove the new ibdata files InnoDB created in this failed attempt. InnoDB only wrote those files full of zeros, but did not yet use them in any way. But be careful: do not remove old data files which contain your precious data!

szZack的文章

解决方法

1、使用网上的处理方法

  • 1、尝试方法1
    从错误信息:

    ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/data/mysqldata/mysql.sock' (111)
    

    来判断可能是 /etc/my.cnf 中的配置错误
    判断 mysql.sock 的路径在 my.cnf 是否与错误信息的路径一致,如果不一致,参考下面这篇文章去解决:
    https://www.jb51.net/article/56952.htm
    http://t.zoukankan.com/magmell-p-8384525.html

    我的 my.cnf 的mysql.sock 路径与错误信息的路径一致,故不是该问题导致的。

  • 2、尝试方法2
    执行命令:

    service mysqld status
    

    提示信息:

    mysqld is stopped
    

    试图启动mysql服务

    service mysqld start
    

    提示报错:

    mysqld: unrecognized service
    

    判断一下mysql是否安装

    安装方法参考这篇解决:
    https://blog.youkuaiyun.com/u012979864/article/details/79626427

    我的安装了mysql,不是这个错误。

  • 3、尝试方法3
    如果 mysql 启动正常,参考这篇文章进行解决:
    https://blog.youkuaiyun.com/qq_30938705/article/details/87166459

    我的 mysql 明显启动不正常,而且mysql容器不断重启,不是这个问题。

2、我的处理方法

  • 错误分析:
    从错误信息:

    [ERROR] InnoDB: Can't open './ibdata1'
    

    来判断,与 ibdata1 有关系,由于 docker 进程有异常中断过,我怀疑是文件损坏导致 ibdata1 无法打开。故采取下面的步骤解决了该问题:

szZack的文章

  • 2.1 进入容器

    docker exec -it mysql bash
    
  • 2.2 删除 ib_logfile0 ib_logfile1 ibdata1
    先查找文件位置

    find / -name ib_logfile0 
    

    我的文件路径:

    /var/lib/mysql
    

    删除文件 ib_logfile0 ib_logfile1 ibdata1:

    rm ib_logfile0  ib_logfile1  ibdata1
    
  • 2.3 重启mysql容器
    先退出mysql容器

    exit
    

    再重启mysql容器

    docker restart mysql
    
  • 2.4 测试mysql
    进入容器:

    docker exec -it mysql bash
    

    执行命令(以root账号进入mysql,可根据需要修改):

    mysql -u root -p
    

    输入密码后,得到如下信息:

    root@xxx:/# mysql -u root -p
    Enter password:
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 1
    Server version: 5.6.39 MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2018, 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> 
    
    

    出现上面的信息则说明 mysql 启动正常了。
    到此,我的问题解决了。

参考

1.http://t.zoukankan.com/magmell-p-8384525.html
2.https://blog.youkuaiyun.com/qq_37844454/article/details/122834493
3.https://www.jb51.net/article/56952.htm
4.https://blog.youkuaiyun.com/u012979864/article/details/79626427

szZack的文章

### 解决 Docker 中无法通过 Socket 连接到本地 MySQL 服务器的问题 当遇到 `Error 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'` 的错误时,这通常表明客户端尝试通过 Unix 套接字文件连接到 MySQL 服务失败。以下是可能的原因以及解决方案: #### 可能原因分析 1. **MySQL 容器未运行** 如果容器中的 MySQL 服务尚未启动,则会引发此错误[^1]。 2. **套接字路径不匹配** 默认情况下,Docker 容器内的 MySQL 使用 `/var/lib/mysql/mysql.sock` 或其他指定位置作为套接字文件的位置。如果客户端配置的路径与实际路径不符,也会导致该问题[^2]。 3. **权限不足** 文件系统的权限设置可能导致访问 `/var/run/mysqld/mysqld.sock` 失败[^3]。 4. **绑定地址冲突** 当 MySQL 配置为仅监听特定 IP 地址(而非 localhost),则可能会阻止基于套接字的连接请求[^4]。 --- #### 解决方案 ##### 方法一:确认 MySQL 容器状态并重启服务 确保 MySQL 容器正在运行,并验证其内部的服务是否正常工作: ```bash docker ps | grep mysql ``` 如果没有找到对应的容器实例或者发现它已停止,请重新拉取镜像并创建新的容器: ```bash docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag ``` ##### 方法二:修改 MySQL 配置以启用套接字支持 进入容器内检查是否存在有效的 sock 文件及其具体存储目录;随后调整 my.cnf 来适配这些更改。 编辑位于 `/etc/mysql/my.cnf` 下面的部分参数如下所示: ```ini [mysqld] socket=/var/run/mysqld/mysqld.sock bind-address=0.0.0.0 ``` 保存退出后再执行一次重启命令让改动生效: ```bash docker exec -it some-mysql service mysql restart ``` ##### 方法三:切换至 TCP/IP 方式代替 UNIX SOCKET 登录方式 对于某些场景下坚持使用网络协议来替代本机进程间通信更为可靠稳定些。因此可以考虑直接利用主机名加端口号的形式完成认证过程而不是依赖于物理设备上的临时文件对象实现身份校验功能。 更新数据库工具里的链接字符串样例如下: ```python import pymysql.cursors connection = pymysql.connect( host='localhost', user='root', password='my-secret-pw', database='testdb', port=3306, cursorclass=pymysql.cursors.DictCursor ) ``` ##### 方法四:挂载宿主机的 mysqld.sock 到容器中 如果你希望从外部程序调用容器化的 MySQL 实例的话,那么可以通过共享同一份 unix domain socket 资源达成目的。比如这样操作即可满足需求: ```bash sudo docker run \ --name=mysql-container \ -v /tmp/mysql_sockets:/var/run/mysqld \ -e MYSQL_ROOT_PASSWORD=rootpassword \ -d mysql:latest ``` --- ### 总结 上述方法涵盖了多种常见情况下的处理手段,用户可以根据实际情况选取最合适的策略加以实施。无论是修正基础环境设定还是优化应用程序接口设计都能有效缓解乃至彻底消除此类异常现象的发生几率。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

szZack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值