【问题标题】:Mysql with docker: Can't connect to local MySQL server through socketMysql with docker:无法通过套接字连接到本地 MySQL 服务器
【发布时间】:2018-08-07 08:23:33
【问题描述】:

我不能再在我的 Docker 容器中使用 MySQL:

root@mysql-container:/# mysql -uroot -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111)

mysqld 正在运行:

root@mysql-spirit-ssl:/etc/mysql/conf.d# /etc/init.d/mysql start
[info] A MySQL Server is already started.

试图停止mysqld超时:

root@mysql-container:/# /etc/init.d/mysql stop
............................................................[info] Attempt to shutdown MySQL Community Server 5.7.17 timed out.

于是我尝试开始使用mysqladmin的方式:

root@mysql-container:/# /usr/bin/mysqladmin --port=8889 -u root shutdown
mysqladmin: connect to server at 'localhost' failed
error: 'Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111)'

所以我检查了 MySQL 守护进程是否正在运行:

root@mysql-container:/# ps -eax
  PID TTY      STAT   TIME COMMAND
    1 ?        Ssl    0:01 mysqld

并且那个套接字存在:

root@mysql-container:/# ls -l /var/run/mysqld/mysqld.sock
-rwxrwxrwx. 1 mysql mysql 0 Jan  4 10:12 /var/run/mysqld/mysqld.sock

我已经尝试过:

  • 重启我的 Docker 容器
  • 在 my.cnf 中注释绑定地址并重启我的 Docker 容器
  • kill mysqld 进程 => 不起作用,进程仍由ps -eax 列出
  • 重新创建我的 Docker 容器
  • 重启 Docker
  • 重启服务器
  • 删除pid和sock文件,和/etc/init.d/mysql start

/var/log/mysql/error.log的结果:

2018-02-27T15:27:35.966028Z 0 [ERROR] InnoDB: Unable to lock ./ibdata1 error: 11
2018-02-27T15:27:35.966061Z 0 [Note] InnoDB: Check that you do not already have another mysqld process using the same InnoDB data or log files.

但是我不能用pkill mysqldkill -9 1initctl --system stop mysql杀死那个mysqld进程。

这可能与 Docker 有关吗?

【问题讨论】:

    标签: mysql sockets docker process


    【解决方案1】:

    备注:无法杀死 MySQL 守护进程,因为它是 Docker 用户 systemd+ 拥有的,并且是容器的入口点。事实上,mysqld 是 PID 1 的进程。这意味着 MySQL 守护进程可以通过简单地重新启动 Docker 容器来重新启动,并且可以在其间修改 MySQL 配置。

    我在 MySQL 日志tail -f /var/log/mysql/error.log 中注意到,由于在内部日志扫描期间检测到异常:数据库未正确关闭,因此在守护程序启动时触发了数据恢复。但是,恢复无法修复数据,并且执行了故意崩溃。结果,容器被重新启动等等。这个无限循环阻止了 mysqld 的启动和客户端 mysql 使用的套接字。

    1) /etc/mysql/conf.d/my.cnf 的此配置启用跳过恢复:

    [mysqld]
    innodb_force_recovery=4
    

    并使用带有套接字的 mysql 客户端转储重要的模式和/或删除损坏的模式。 完成后不要忘记从 my.cnf 中删除这一行!

    2) 执行 mysql 升级和修复也可能是有益的:

    docker exec -it mysql-container mysql_upgrade -u root -p --force
    mysqlcheck -u root -p --auto-repair --check --all-databases
    

    此步骤后需要重新启动 Docker 容器。

    3) 此外,删除 MySQL 内部日志(已扫描并触发恢复)是必要的:

    cd /var/lib/mysql/mysql/
    rm ibdata1 ib_logfile0 ib_logfile1
    

    现在我可以在容器内外再次使用 MySQL。

    【讨论】:

    • 我的情况非常相似,删除 ib* 文件有帮助。我有一个mysql 进程在主机上以root 运行,尽管我可能也不得不杀死它。
    猜你喜欢
    • 2019-07-03
    • 2020-11-14
    • 2017-10-07
    • 2020-02-29
    • 1970-01-01
    • 2011-01-12
    • 2017-01-21
    • 2013-03-04
    相关资源
    最近更新 更多