gpt4 book ai didi

带有 docker : Can't connect to local MySQL server through socket 的 Mysql

转载 作者:行者123 更新时间:2023-11-29 05:56:28 25 4
gpt4 key购买 nike

我不能再在我的 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中注释绑定(bind)地址并重启我的Docker容器
  • kill mysqld process => 不起作用,进程仍由 ps -eax 列出
  • 重新创建我的 Docker 容器
  • 重启Docker
  • 重启服务器
  • 删除pid和sock文件,并/etc/init.d/mysql start

cat /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守护进程无法被杀死,因为它属于Docker用户systemd+,并且是容器的入口点。事实上,mysqld 是 PID 为 1 的进程。这意味着可以通过简单地重新启动 Docker 容器来重新启动 MySQL 守护进程,并且可以在两者之间修改 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。

关于带有 docker : Can't connect to local MySQL server through socket 的 Mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49012903/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com