MySQL下PID文件丢失的相关错误的解决方法

 更新时间:2015年07月08日 11:05:56   投稿:goldensun  
这篇文章主要介绍了MySQL下PID文件丢失的相关错误的解决方法,具体的提示可能会是"mysql PID file not found and Can’t connect to MySQL through socket mysql.sock",需要的朋友可以参考下

今天同事A找到我,说是Mysql server X的负载很高,查询很慢。他自己捣鼓了一阵未果后,我们一起看了下。

[root@redhat var]# uname -a
Linux xxx 2.6.18-128.el5 #1 SMP Wed Dec 17 11:41:38 EST 2008 x86_64 x86_64 x86_64 GNU/Linux

[root@redhat var]# mysql -u root -p -e “select version();”
+------------+
| version() |
+------------+
| 5.1.32-log |
+------------+

同事A的操作:
A一看mysql server有问题第一反应是重启mysql server,囧!!o(╯□╰)
但是又使用了错误的命令

[root@redhat var]# /var/lib/mysql/libexec/mysqld restart ----操作①
100708 14:43:53 [ERROR] Fatal error: Please read "Security" section of the manual to find out how to run mysqld as root!
100708 14:43:53 [ERROR] Aborting
100708 14:43:53 [Note] /var/lib/mysql/libexec/mysqld: Shutdown complete

发现问题后,他又想起来应该是用下面的命令重启

[root@redhat var]# service mysql restart ----操作②
MySQL manager or server PID file could not be found! [FAILED]
Starting MySQL......

CTRL+C取消

这时候

[root@redhat var]# ps aux | grep mysql

可以看到,系统又启动了一个Mysql进程,但是过一会后,会自动消失,这时候看日志可以发现以下错误:

100708 15:26:52 [ERROR] Can't start server: Bind on TCP/IP port: Address already in use
100708 15:26:52 [ERROR] Do you already have another mysqld server running on port: 30017 ?
100708 15:26:52 [ERROR] Aborting

然后后面我们一起看。
首先我用client工具连接,发现mysql正常。web应用连接数据库也正常只是查询很慢。
其次我在命令下面,连接:

[root@redhat var]# mysql -u root -p

提示:

Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

这时候同事A提醒我,可以重启服务没关系。囧,o(╯□╰)o,他在建议我重启解决问题。
好吧,如他所愿。于是我先:

[root@redhat var]# service mysql stop
MySQL is running but PID file could not be found

然后去mysql data dir下面查看,果然没有pid file。
这时候我的第一反应是配置文件不对,导致不能正常停止和重启。
由于server是好的,因此我没有急着去比较以前备份的/etc/my.cnf.bak和/etc/my.cnf。
我们先查找负载高的原因。因为命令行下无法进入mysql,在client下使用

复制代码 代码如下:
show processlist;

可以看到里面有很多locked的查询,其中等待时间最久的一个是一个select查询,显示正在sending data,然后其余都是locked。
猜想是sending data的线程占用了“所有的分配给mysql的资源”,导致后来的线程全部挂起,由于“查询(线程)是依次执行的”,后面locked的线程一直在等待前面sending data的线程结束。(这一段是猜想的…)
sending data的这个线程U是一个select 查询,这个select对6张表进行了连接(公司的一个实习生提交的一个查询),其中有两张表的数据量在10w左右,另外有张data表数据量在 1000w左右,另外还有sum(distinct ) ,group by,order by… 可以想象下…不知道要到何年何月这个查询才能执行完。
这个sending data的慢查询的processid为799,当机立断运行

复制代码 代码如下:
kill 799

然后再运行

复制代码 代码如下:
show processlist;

可以看到前面locked的线程在一个个依次执行,后面还有好多个跟线程U类似的select线程,全部kill掉后,被堵塞的别的正常的几个Update,select,insert操作很快就执行完了。
而后,web应用恢复正常,速度变快。
返回linux命令行,使用

[root@redhat var]# top
<shift+m 按内存使用排序>
<1 显示cpu使用情况>

这时候可以发现server负载恢复正常。

下面解决无法正常关闭重启的情况。
也就是因为前面同事的误操作引起的

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
和MySQL manager or server PID file could not be found! [FAILED]

的错误。
我前面不是怀疑是配置文件里面有什么无法识别的参数选项么。
通过

[root@redhat var]# diff /etc/my.cnf /etc/my.cnf.bak

发现,配置文件没有问题。

#我的server的hostname,mysql pid文件默认名字为hostname.pid,如果没有在/etc/my.cnf里面指定特定和pid filename和pid file path的话,这个文件是跟mysql数据在一起的。

[root@redhat var]# diff /etc/my.cnf /etc/my.cnf.bak

这时候通过

#切换到mysql data dir(mysql的数据文件目录下)
#你们的mysql data dir或许跟我的不一样哦,我的是/var/lib/mysql/var/
[root@redhat var]# cd /var/lib/mysql/var/

获取mysql用户运行的mysql进程的 pid,然后导入到hostname.pid文件里面

[root@redhat var]# echo `ps aux | grep mysql | grep "user=mysql" | grep -v "grep" | awk '{print $2}'`>> redhat.pid
#注意这里的redhat.pid跟hostname相关,这里是我的hostname.pid

将文件的属主和属主组改为mysql:mysql

[root@redhat var]# chown mysql:mysql redhat.pid

然后运行

[root@redhat var]# mysql -u root -p

还是会提示:

Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
[root@redhat var]# ls /tmp | grep sock

果然没有mysql.sock这个文件

但是这时候运行

[root@redhat var]# service mysql status

显示

MySQL running (10949) [ OK ]

恩,pid file文件恢复正常,然后运行

[root@redhat var]# service mysql restart
Shutting down MySQL. [ OK ]
Starting MySQL. [ OK ]

这时候再运行

[root@redhat var]# ls /tmp | grep sock

可以发现重启后,/tmp下有了mysql.sock这个文件。

大家可以搜索下mysql.sock的用途以及使用产生等等。

同事A的 操作① 导致pid 文件丢失, 操作② 导致mysql.sock文件丢失,大家感兴趣可以去vi mysqld脚本和server mysql脚本,然后导致service mysql status/stop/start/restart运行异常,导致命令行下mysql -u root -p登录mysql异常。

That's all.

相关文章

  • MySQL DISTINCT 的基本实现原理详解

    MySQL DISTINCT 的基本实现原理详解

    这篇文章主要介绍了MySQL DISTINCT 的基本实现原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • mysql建库时提示Specified key was too long max key length is 1000 bytes的问题的解决方法

    mysql建库时提示Specified key was too long max key length is 1000

    本文将详细提供mysql建库时提示Specified key was too long max key length is 1000 bytes的问题的解决方法,有需求的朋友可以参考
    2012-11-11
  • MySQL多版本并发控制MVCC详解

    MySQL多版本并发控制MVCC详解

    这篇文章主要介绍了MySQL多版本并发控制MVCC详解,MVCC是通过数据行的多个版本管理来实现数据库的并发控制,这项技术使得在InnoDB的事务隔离级别下执行一致性读操作有了保证
    2022-07-07
  • MYSQL实现排名及查询指定用户排名功能(并列排名功能)实例代码

    MYSQL实现排名及查询指定用户排名功能(并列排名功能)实例代码

    这篇文章主要给大家介绍了关于MYSQL实现排名及查询指定用户排名功能(并列排名功能)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧
    2018-10-10
  • 快速解决mysql深分页问题

    快速解决mysql深分页问题

    这篇文章主要介绍了优雅地解决mysql深分页问题,本文将会讨论当mysql表大数据量的情况,如何优化深分页问题,并附上最近的优化慢sql问题的案例伪代码,需要的朋友可以参考下
    2022-07-07
  • MySQL中的TRUNCATE TABLE命令的使用

    MySQL中的TRUNCATE TABLE命令的使用

    TRUNCATE TABLE命令是一个用于快速删除表中所有数据的重要工具,本文介绍了MySQL中的TRUNCATE TABLE命令的用法、工作原理以及实际应用中的注意事项,感兴趣的可以了解一下
    2024-08-08
  • MySql中的常用参数查询

    MySql中的常用参数查询

    这篇文章主要介绍了MySql中的常用参数查询,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Linux中MySQL 双主复制的配置指南

    Linux中MySQL 双主复制的配置指南

    在数据驱动的时代,数据库的高可用性和数据一致性是每个企业必须考虑的重要问题,MySQL 双主复制提供了一种有效的解决方案,通过配置两台服务器互为主从,保证数据的实时同步和高可用性
    2024-07-07
  • MySql闪退和服务无法启动的解决方法

    MySql闪退和服务无法启动的解决方法

    今天小编就为大家分享一篇关于MySql闪退和服务无法启动的解决方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • mysql 存储过程的问题

    mysql 存储过程的问题

    最近我接触了一本php 与 mysql,老外写的一本书,书中有个tshirtshop网店代码,其中操作数据库的大多用的是mysql存储过程
    2009-06-06

最新评论