php分享二十八:mysql运行中的问题排查

一:杀掉mysql连接的方法:

kill thread_id:  杀掉当前进程,断开连接

kill query thread_id: 只杀掉某连接当前的SQL,而不断开连接。

批量杀死MySQL连接的几种方法:

1> 通过information_schema.processlist表中的连接信息生成需要处理掉的MySQL连接的语句临时文件,然后执行临时文件中生成的指令。

 mysql> select concat(‘KILL ‘,id,‘;‘) from information_schema.processlist where user=‘root‘;
+------------------------+
| concat(‘KILL ‘,id,‘;‘) |
+------------------------+
| KILL 3101;             |
| KILL 2946;             |
+------------------------+
2 rows in set (0.00 sec)
mysql>select concat(‘KILL ‘,id,‘;‘) from information_schema.processlist where user=‘root‘ into outfile ‘/tmp/a.txt‘;
Query OK, 2 rows affected (0.00 sec)

mysql>source /tmp/a.txt;
Query OK, 0 rows affected (0.00 sec)

2>杀掉当前所有的MySQL连接

mysqladmin -uroot -p processlist|awk -F "|" ‘{print $2}‘|xargs -n 1 mysqladmin -uroot -p ki

mysqladmin -uroot -p processlist|awk -F "|" ‘{if($3 == "Mike")print $2}‘|xargs -n 1 mysqladmin -uroot -p kill

3>通过SHEL脚本实现

杀掉锁定的MySQL连接

for id in `mysqladmin processlist|grep -i locked|awk ‘{print $1}‘`
do
   mysqladmin kill ${id}
done

 

二:MySQL server has gone away 问题的解决方法

原因一. MySQL 服务宕了

判断是否属于这个原因的方法很简单,进入mysql控制台,查看mysql的运行时长

mysql> show global status like ‘uptime‘;
+---------------+---------+
| Variable_name | Value   |
+---------------+---------+
| Uptime        | 3414707 |
+---------------+---------+

或者查看MySQL的报错日志,看看有没有重启的信息

如果uptime数值很大,表明mysql服务运行了很久了。说明最近服务没有重启过。
如果日志没有相关信息,也表名mysql服务最近没有重启过,可以继续检查下面几项内容。

原因二. mysql连接超时

即某个mysql长连接很久没有新的请求发起,达到了server端的timeout,被server强行关闭。
此后再通过这个connection发起查询的时候,就会报错server has gone away
(大部分PHP脚本就是属于此类)

mysql> show global variables like ‘%timeout‘;
+----------------------------+----------+
| Variable_name              | Value    |
+----------------------------+----------+
| connect_timeout            | 10       |
| delayed_insert_timeout     | 300      |
| innodb_lock_wait_timeout   | 50       |
| innodb_rollback_on_timeout | OFF      |
| interactive_timeout        | 28800    |
| lock_wait_timeout          | 31536000 |
| net_read_timeout           | 30       |
| net_write_timeout          | 60       |
| slave_net_timeout          | 3600     |
| wait_timeout               | 28800    |
+----------------------------+----------+
10 rows in set

wait_timeout 是28800秒,即mysql链接在无操作28800秒后被自动关闭

解决办法:

1> 修改my.cnf

wait_timeout=2880000
interactive_timeout = 2880000

如果不能修改my.cnf,则可以在连接数据库的时候设置CLIENT_INTERACTIVE,MySQL默认是8个小 时。

2>检查 MySQL的链接状态,使其重新链接

function ping()
{
    if (!mysql_ping($this->link)) {
        mysql_close($this->link); //注意:一定要先执行数据库关闭,这是关键
        $this->connect();
    }
}

我需要调用这个函数的代码可能是这样子的

$str = file_get_contents(‘http://www.jb51.net‘);
$db->ping();//经过前面的网页抓取后,或者会导致数据库连接关闭,检查并重新连接
$db->query(‘select * from table‘);

ping()这个函数先检测数据连接是否正常,如果被关闭,整个把当前脚本的MYSQL实例关闭,再重新连接。
经 过这样处理后,可以非常有效的解决MySQL server has gone away这样的问题,而且不会对系统造成额外的开销。

sql = "set interactive_timeout=24*3600";
mysql_real_query(...)

原因三. mysql请求链接进程被主动kill

这种情况和原因二相似,只是一个是人为一个是MYSQL自己的动作

mysql> show global status like ‘com_kill‘;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_kill      | 21    |
+---------------+-------+

 原因四. Your SQL statement was too large.

当查询的结果集超过 max_allowed_packet 也会出现这样的报错。定位方法是打出相关报错的语句。

用select * into outfile 的方式导出到文件,查看文件大小是否超过 max_allowed_packet ,如果超过则需要调整参数,或者优化语句。

mysql> show global variables like ‘max_allowed_packet‘;
+--------------------+---------+
| Variable_name      | Value   |
+--------------------+---------+
| max_allowed_packet | 1048576 |
+--------------------+---------+
1 row in set (0.00 sec)

解决办法:

1> 修改参数

mysql> set global max_allowed_packet=1024*1024*16;
mysql> show global variables like ‘max_allowed_packet‘;
+--------------------+----------+
| Variable_name      | Value    |
+--------------------+----------+
| max_allowed_packet | 16777216 |
+--------------------+----------+
1 row in set (0.00 sec)

2> 修改my.cnf,加大max_allowed_packet的值即可

在[mysqld]配置下:

max_allowed_packet = 10M(也可以设置自己需要的大小)
max_allowed_packet 参数的作用是,用来控制其通信缓冲区的最大长度。

参考:

mysql 常用语句:http://www.jb51.net/article/18667.htm

时间: 2024-08-29 21:39:37

php分享二十八:mysql运行中的问题排查的相关文章

Android笔记(二十八) Android中图片之简单图片使用

用户界面很大程度上决定了APP是否被用户接收,为了提供友好的界面,就需要在应用中使用图片了,Android提供了丰富的图片处理功能. 简单使用图片 使用Drawable对象 为Android应用增加了Drawable资源之后,系统会自动在R.java文件中创建一个索引项:R.drawable.fileName,然后在Java中可以通过R.drawable.fileName来获取到该资源的索引(一个int类型的常量),如果要获取实际的Drawable对象,则可以调用Resources的getDra

(二十八)android中注意的事项

一.android在代码中动态设置字体颜色需要注意的问题. 直接这样写是不行的 tv.setTextColor(R.color.textColor_black); 要从resources中获取 tv.setTextColor(this.getResources().getColor(R.color.textColor_black)); 颜色设置必须通过Color类来操作 不然设置无效 二.android在显示listView的时候经常会出现渲染问题,总是不能渲染 出来,主要是 由于没有调用not

(二十八) Android中ViewStub组件使用(转载自:http://blog.csdn.net/mayingcai1987/article/details/6238609)

1. 概述: ViewStub组件和<include>标签的作用类似,主要是为了提高布局的重用性,及布局的模块化.它们之间最大的差别是,ViewStub中的布局不会随着它所在布局的渲染而渲染,而<include>标签中的布局会随着它所在布局的渲染而渲染,ViewStub中的布局只有在你需要的时候才会渲染到主界面中. 2. 效果图: (1)在ButtonOne与ButtonTwo之间存在一个ViewStub布局,如下图: (2)单击ButtonOne后渲染ViewStub中的布局,如

纯干货!二十八道BATJ大厂Java岗之"多线程与并发"面试题分享

年底了,又到了跳槽季啦,该刷题走起了.这里总结了一些被问到可能会懵逼的面试真题,有需要的可以看下- 一.进程与线程 进程是资源分配的最小单位,线程是cpu调度的最小单位.线程也被称为轻量级进程. 所有与进程相关的资源,都被记录在PCB中 进程是抢占处理及的调度单位:线程属于某个进程,共享其资源 一个 Java 程序的运行是 main 线程和多个其他线程同时运行. 二.Thread中的start和run方法的区别 调用start()方法会创建一个新的子线程并启动 run()方法只是Thread的一

ActionScript3游戏中的图像编程(连载二十八)

2.2.1 投影颜色与透明度的模拟 默认的投影滤镜看着比Photoshop的投影样式浑浊,究其原因,似乎是颜色太深所致.(图 2.11). 图 2.11 设置默认投影滤镜后的效果 下面回到Photoshop查看其默认的投影参数(图 2.12). 图 2.12 Photoshop默认投影样式的参数 茫茫人海,我还是第一眼发现了你--颜色样本块.同是黑色,RGB都等于0,怎么差别还这么大?看来是A通道--不透明度惹的祸.从图 2.12中,我们看到Photoshop里对阴影设置了75%的不透明度,那F

[原创]ActionScript3游戏中的图像编程(连载二十八)

2.2.1 投影颜色与透明度的模拟 默认的投影滤镜看着比Photoshop的投影样式浑浊,究其原因,似乎是颜色太深所致.(图 2.11). 图 2.11 设置默认投影滤镜后的效果 下面回到Photoshop查看其默认的投影参数(图 2.12). 图 2.12 Photoshop默认投影样式的参数 茫茫人海,我还是第一眼发现了你——颜色样本块.同是黑色,RGB都等于0,怎么差别还这么大?看来是A通道——不透明度惹的祸.从图 2.12中,我们看到Photoshop里对阴影设置了75%的不透明度,那F

angular学习笔记(二十八-附2)-$resource中的promise对象

下面这种promise的用法,我从第一篇$http笔记到$resource笔记中,一直都有用到: HttpREST.factory('cardResource',function($resource){ return $resource('/card/user/:userID/:id',{userID:123,id:'@id'},{charge:{method:'POST',params:{charge:true},isArray:false}}) }); HttpREST.factory('h

angular学习笔记(二十八-附1)-$resource中的资源的方法

通过$resource获取到的资源,或者是通过$resource实例化的资源,资源本身就拥有了一些方法,比如$save,可以直接调用来保存该资源: 比如有一个$resource创建的服务: var service = angular.module('myRecipe.service',['ngResource']); service.factory('Recipe',['$resource',function($resource){ return $resource('/recipe/:id',

【Unity 3D】学习笔记二十八:unity工具类

unity为开发者提供了很多方便开发的工具,他们都是由系统封装的一些功能和方法.比如说:实现时间的time类,获取随机数的Random.Range( )方法等等. 时间类 time类,主要用来获取当前的系统时间. using UnityEngine; using System.Collections; public class Script_04_13 : MonoBehaviour { void OnGUI() { GUILayout.Label("当前游戏时间:" + Time.t