带docker的Mysql:无法通过socket连接到本地MySQL服务器

问题描述 投票:1回答:1

我不能再在我的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 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 sockets docker process
1个回答
0
投票

备注: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,从容器内部和外部。

© www.soinside.com 2019 - 2024. All rights reserved.