irpas技术客

解决Can‘t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock‘

大大的周 6440

今天是最新的消息,大年初四, 我遇到的问题似乎解决了, 先看三个地方

一,查看MySQL 日志

MySQL日志记录中显示有错误, 服务无法启动,绑定的地址已被使用, 有其他的 MySQL 运行在端口 3306上,

[root@bogon ~]# cat /var/log/mysqld.log

2022-02-04 10:19:34 1539 [Note] Server hostname (bind-address): ‘*’; port: 3306 2022-02-04 10:19:34 1539 [Note] IPv6 is available. 2022-02-04 10:19:34 1539 [Note] - ‘::’ resolves to ‘::’; 2022-02-04 10:19:34 1539 [Note] Server socket created on IP: ‘::’. 2022-02-04 10:19:34 1539 [ERROR] Can’t start server: Bind on TCP/IP port: Address already in use 2022-02-04 10:19:34 1539 [ERROR] Do you already have another mysqld server running on port: 3306 ? 2022-02-04 10:19:34 1539 [ERROR] Aborting

二,查看当前MySQL 进程状况

查看当前和 MySQL 有关的进程中,有一个是 root 开头的, 这是不对的,所有的 mysql 进程 都应该是以 mysql 开头的, 举个正确的例子,

[root@bogon ~]# ps aux |grep mysql

root … /bin/bash /usr/bin/mysql-systemd-start post

mysql 1209 0.1 11.4 963188 114064 ? Sl 11:38 0:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock mysql 1042 0.0 0.1 113260 1616 ? Ss 11:38 0:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usr

三,查看MySQL服务当前状态

查看当前mysqld 服务的状态,发现有一行描述是, 拖延超时,计划重启

[root@bogon ~]# systemctl status mysqld

mysqld.service holdoff time over, scheduling restart

这三点,充分的说明了,因为有莫名其妙的MySQL服务已经运行了,并且占用了3306的端口,从而导致了MySQL 不得不等待好长时间才能再次重启计划,解决被占用的问题,所以出现了,systemctl start mysqld 开启MySQL的mysqld 服务的时候,卡住了,等了好久都不一定能起来.

所以,就是要找出来是谁在一开机就占用了3306端口, 通过查找,发现了很多docker 的东西, [root@bogon ~]# find / -name mysql

/var/lib/docker/…

反正现在也不用docker了,干脆删除它. [root@bogon mysqld]# yum list installed |grep docker [root@bogon mysqld]# yum -y removedocker-engine.x86_64

重启主机,秒进MySQL 丝滑,

所以说,历时5天,终于把遇到的MySQL启动慢,长达十分钟有时甚至半个小时的问题解决了,开心

总结,当遇到MySQL的问题, 第一时间要去看MySQL的日志 /var/log/mysqld.log 那里才是真正的原因所在. 每个人的安装/运行环境往往都不太一样,所以同样的表象也许背后的原因并不相同,不能一概而论,需要根据 MySQL的日志去针对处理. 这才是正解. 一定要学会看日志,

今天是大年初二

又有了新的研究成果, 最新的, 分享给大家, 在 centos7里新装的MySQL 开机需要很长时间,或者是提示错误 Can‘t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock‘ (2) 的解决方法都如下,非常的简单,

看日志是卡在了 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended 这里,然后过了10分钟才又开始执行下面的语句 mysqld_safe Logging to '/var/log/mysqld.log'.

这之后的日志里还有

2022-02-01 14:02:04 1789 [ERROR] Can’t start server: Bind on TCP/IP port: Address already in use 2022-02-01 14:02:04 1789 [ERROR] Do you already have another mysqld server running on port: 3306 ? 2022-02-01 14:02:04 1789 [ERROR] Aborting

但这都不是问题的根本, 直到我看了一位大神的文章豁然开朗,其实道理很简单, 如下:

版权声明:本文为CSDN博主「有一种人仅仅是认识就很好了」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_36350532/article/details/79591803

myslq 出于安全考虑, 默认拒绝用 centos 的root账号启动mysql服务。

这才是问题根本, 就是说,卡住的那段时间是因为,咱们尝试使用 centos 的root这个用户去 启动 MySQL 服务 mysqld,但MySQL又出于安全原因拒绝 root 用户启动 MySQL 的服务,所以就僵持住了,

这个,看下面两处,

[root@bogon ~]# systemctl status mysqld ● mysqld.service - MySQL Community Server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)

mysqld.service 服务要去引导,/usr/lib/systemd/system/mysqld.service

[root@bogon ~]# cat /usr/lib/systemd/system/ mysqld.service

[Service] User=mysql

mysqld.service里的服务启动用户是centos的 mysql

[root@bogon system]# cat /etc/passwd

root:x:0:0:root:/root:/bin/bash mysql:x:27:27:MySQLServer:/var/lib/mysql:/bin/bash

可以看到centos里有mysql这个用户,

解决起来也非常简单 去改 MySQL 的启动配置文件 /etc/my.cnf 就可以了 在 [mysqld]里加这句 user=mysql [root@bogon system]# vi /etc/my.cnf

[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=mysql

[mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid

保存,退出 vi, 然后再将 mysqld 加进 chkconfig 自己动中 开机再启动MySQL就没问题了,

[root@bogon ~]# chkconfig --add mysqld [root@bogon ~]# chkconfig --list mysqld

注:该输出结果只显示 SysV 服务,并不包含 原生 systemd 服务。SysV 配置数据 可能被原生 systemd 配置覆盖。

要列出 systemd 服务,请执行 'systemctl list-unit-files'。 查看在具体 target 启用的服务请执行 'systemctl list-dependencies [target]'。

mysqld 0:关 1:关 2:开 3:开 4:开 5:开 6:关

不会再卡了,很顺畅,

总结一下,MySQL 为了安全,是默认阻止 centos的 root 用户去开机启动 MySQL 的服务 mysqld 的,因为 centos 的 root 用户权限太大了,太危险了,所以 默认拒绝 root 启动 mysqld 所以,我们在 MySQL 的启动配置文件 /etc/my.cnf 中 告诉 MySQL 用centos 的mysql 用户去启动 MySQL ,等MySQL 启动后,用谁去连MySQL 数据库就都随意了,

下面的文章,是我大年三十 临时找的解决方案,不够科学,不用看,要是感兴趣可以简单读一下,看看我 解题思路,

[root@xxx ~]# mysql

ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2)

出现这个错误,表示 MySQL 的服务进程 mysqld 没起来,

[root@xxx ~]# systemctl status mysqld

● mysqld.service - MySQL Community Server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled) Active: inactive (dead) since 一 2022-01-31 18:46:40 CST; 3min 15s ago Process: 2131 ExecStartPost=/usr/bin/mysql-systemd-start post (code=exited, status=0/SUCCESS) Process: 2130 ExecStart=/usr/bin/mysqld_safe –basedir=/usr (code=exited, status=0/SUCCESS) Process: 2116 ExecStartPre=/usr/bin/mysql-systemd-start pre (code=exited, status=0/SUCCESS) Main PID: 2130 (code=exited, status=0/SUCCESS)

没起来的状态也有可能是

● mysqld.service - MySQL Community Server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled) Active: activating (start-post) since 一 2022-01-31 17:56:47 CST; 4min 44s ago Process: 5839 ExecStart=/usr/bin/mysqld_safe --basedir=/usr (code=exited, status=0/SUCCESS) Process: 5824 ExecStartPre=/usr/bin/mysql-systemd-start pre (code=exited, status=0/SUCCESS) Main PID: 5839 (code=exited, status=0/SUCCESS);

不管遇到的是哪一种,都说明 mysqld 没起来,这种情况下,尝试登陆 MySQL 就会报本文标题中的错误, [root@bogon ~]# mysql

ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2)

同时,如果尝试使用 systemctl restart mysqld 或者 systemctl start mysqld 重新启动 mysqld 服务,会卡住一直不动,直到很长时间之后最后返回错误 ,

[root@bogon lib]# service mysqld restart Redirecting to /bin/systemctl restart mysqld.service Job for mysqld.service failed because a timeout was exceeded. See “systemctl status mysqld.service” and “journalctl -xe” for details.

这个问题的原因很简单,就是在 MySQL 启动的时候,没有找到 mysql.sock

[root@xxx ~]# cat /etc/my.cnf

[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock symbolic-links=0 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

[mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid

从上面可以看到,mysql.sock 的位置在 /var/lib/mysql/

[root@xxx bin]# ll /var/lib/mysql

总用量 110604 -rw-rw----. 1 root root 56 1月 31 15:35 auto.cnf -rw-rw----. 1 root root 12582912 1月 31 17:52 ibdata1 -rw-rw----. 1 root root 50331648 1月 31 17:52 ib_logfile0 -rw-rw----. 1 root root 50331648 1月 31 17:52 ib_logfile1 drwx------. 2 root root 4096 1月 31 15:35 mysql drwx------. 2 root root 4096 1月 31 performance_schema

但经过查询目录并没有文件 mysql.sock

解决的办法也很简单, 使用 mysqld_safe & 重新创建 mysql.sock

第一步: [root@xxx opt]# systemctl stop mysqld

第二步: [root@xxx opt]# cd /var/lib/ [root@xxx lib]# ll

drwxr-xr-x. 4 root root 114 1月 31 18:11 mysql drwxr-x—. 2 root root 6 1月 5 2021 mysql-files

[root@xxx lib]# chown -R mysql:mysql mysql [root@xxx lib]# chown -R mysql:mysql mysql-files [root@xxx lib]# ll

drwxr-xr-x. 4 mysql mysql 114 1月 31 18:11 mysql drwxr-x—. 2 mysql mysql 6 1月 5 2021 mysql-files

第三步: [root@xxx lib]# cd /usr [root@xxx usr]# cd bin [root@xxx bin]# mysqld_safe & & 符号的意思是,在后台运行.个人认为可加可不加,不影响结果

默认情况下,进程是在前台运行的,这时就把shell给占据了,我们无法进行其它操作。对于那些没有交互的进程,很多时候,我们希望将其在后台启动,可以在启动参数的时候加一个’&'实现这个目的。

[root@xxx bin]# ll /var/lib/mysql/

总用量 110604 -rw-rw----. 1 mysql mysql 56 1月 31 15:35 auto.cnf -rw-rw----. 1 mysql mysql 12582912 1月 31 18:30 ibdata1 -rw-rw----. 1 mysql mysql 50331648 1月 31 18:30 ib_logfile0 -rw-rw----. 1 mysql mysql 50331648 1月 31 17:52 ib_logfile1 drwx------. 2 mysql mysql 4096 1月 31 15:35 mysql srwxrwxrwx. 1 mysql mysql 0 1月 31 18:30 mysql.sock drwx------. 2 mysql mysql 4096 performance_schema

[root@xxx mysql]# systemctl start mysqld [root@xxx mysql]# systemctl status mysqld

● mysqld.service - MySQL Community Server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled) Active: active (running) since 一 2022-01-31 19:31:50 CST; 13s ago Process: 3401 ExecStartPost=/usr/bin/mysql-systemd-start post (code=exited, status=0/SUCCESS) Process: 3386 ExecStartPre=/usr/bin/mysql-systemd-start pre (code=exited, status=0/SUCCESS) Main PID: 3400 (mysqld_safe)

[root@xxx bin]# mysql

Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.6.51 MySQL Community Server (GPL)

Copyright ? 2000, 2021, 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> select user(); ±---------------+ | user() | ±---------------+ | root@localhost | ±---------------+ 1 row in set (0.00 sec)

这里再补充几点, 一:出现问题最好的方法是,查看 log 中的 [root@xxx mysql]# cat /etc/my.cnf

[mysqld_safe] log-error=/var/log/mysqld.log

[root@xxx mysql]# cat /var/log/mysqld.log 看里面的 [ERROR] 举例:

[ERROR] Can’t start server: Bind on TCP/IP port: Address already in use

二:解决问题往往就一两个命令就可以了, 不要去修改文件权限和归属,不要去修改配置文件my.cnf,不要把简单的事情搞复杂了,

这个报错,一个命令就能解决 记好: [root@xxx bin]# mysqld_safe &

如果,以后一旦重启又出现 无法启动的问题,请先执行一遍 [root@xxx opt]# systemctl stop mysqld 再去开启 mysqld 就可以了, 如果嫌麻烦可以编辑 /etc/rc.local 把mysqld 加进去

开机自启动。

[root@xxx etc]# vi /etc/rc.local

touch /var/lock/subsys/local service mysqld start

January the 31th 2022 monday

补充,这篇文章也可以解决,centos 全新安装 MySQL 无法启动 mysqld 和使用 MySQL 的问题 [root@xxx ~]# rpm -ivh MySQL-client-5.6.13-1.el6.x86_64.rpm [root@xxx ~]# rpm -ivh MySQL-server-5.6.13-1.el6.x86_64.rpm 这么安装的MySQL遇到无法启动的问题,都可以用这个方法解决


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #解决Cant #connect #To #local #MySQL #Server #through #socket