mysql慢查询设置和线上事故排查

1 篇文章 0 订阅
1 篇文章 0 订阅

最近想起来以前在那家公司时,重构了一个系统。那时候经验还不算足,跌跌撞撞遇到好多问题。

那时候重构上线了,第一天虽然很多问题,但是还算可以解决。

第二天出现了一个奇怪的现象,在某一个时刻突然整个服务卡死,一时间也不知道为什么,一开始还以为被攻击了。

重启一下服务就好了,看错误日志貌似也没有啥报错,翻看临近节点的调用,貌似也没啥异常。

后来和老大在商量,貌似之前在重构测试时,遇到过一个因为改动了公用的sql查询,查询变的很慢,导致后台卡死了。

难道是这个原因?

于是乎想着看看mysql有没有打印出慢sql的设置,最终发现是几个接口给内部其他部门调用的时候,没有带分页,后台没有设置好判断,导致一个sql查了很长时间,出了大量数据撑爆了java内存。

OK知道问题所在,赶紧补充默认分页,解决问题~

记录一下如何设置,没准以后遇到这种事情会用到呢~

慢sql参考 https://www.cnblogs.com/qmfsun/p/4844472.html

window下(文章测试用window下,差异不大,注意mysql版本号!)

MySQL在Windows系统中的配置文件一般是是my.ini找到[mysqld]下面加上

log-slow-queries = C:\mysql-5.7.30-winx64\log-slow-queries\log-slow-queries.log。
long_query_time = 2

linux下

MySQL在Windows系统中的配置文件一般是是my.cnf找到[mysqld]下面加上

log-slow-queries=/data/mysqldata/log-slow-queries.log。
long_query_time=2

【说明注意看】

slow_query_log = on   开启设置

log-slow-queries = C:\mysql-5.7.30-winx64\log-slow-queries\log-slow-queries.log。

为慢查询日志存放的位置,一般这个目录要有MySQL的运行帐号的可写权限,一般都将这个目录设置为MySQL的数据存放目录;
long_query_time=2中的2表示查询超过两秒才记录;

我在测试的时候发现我设置了log-slow-queries是怎么都启动不了mysql的,于是乎我添加了

log-error=E:\log-error.txt

看看启动为啥启动不了,发现报错了 unknown variable XXXX  ,未知变量? 难道这个log-slow-queries不是这样写?

百度一番真的是【mysql5.6版本以上,取消了参数log-slow-queries,更改为slow-query-log-file】

我用的是5.7 ,所以应该写为

# 写入慢sql日志
slow-query-log-file=C:\mysql-5.7.30-winx64\log-slow-queries\log-slow-queries.log

OK 设置好了,可是我本地没有数据可以测试 怎么办? 

借鉴一下别人的插入大量数据,我插入多点数据,查询出来不久慢咯

步骤:
1 创建数据表(MYISAM方式存储插入速度比innodb方式快很多)
  
数据表描述
 
数据量:1千万
 
字段类型:
id :编号
uname:用户名
ucreatetime: 创建时间
age:年龄
 
CREATE TABLE usertb(   
id serial,    
uname  varchar(20) ,   
ucreatetime  datetime  ,   
age  int(11))   
ENGINE=MYISAM 
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci   
AUTO_INCREMENT=1   
ROW_FORMAT=COMPACT;    
 
2 创建插入数据存储过程 
 
delimiter $$ 
SET AUTOCOMMIT = 0$$   
 
create  procedure test1()  
begin
declare v_cnt decimal (10)  default 0 ; 
dd:loop            
        insert  into usertb values         
        (null,'用户1','2010-01-01 00:00:00',20),         
        (null,'用户2','2010-01-01 00:00:00',20),         
        (null,'用户3','2010-01-01 00:00:00',20),         
        (null,'用户4','2010-01-01 00:00:00',20),         
        (null,'用户5','2011-01-01 00:00:00',20),         
        (null,'用户6','2011-01-01 00:00:00',20),         
        (null,'用户7','2011-01-01 00:00:00',20),         
        (null,'用户8','2012-01-01 00:00:00',20),         
        (null,'用户9','2012-01-01 00:00:00',20),         
        (null,'用户0','2012-01-01 00:00:00',20)             
                ;                   
        commit;                     
        set v_cnt = v_cnt+10 ;                            
            if  v_cnt = 10000000 then leave dd;                           
            end if;          
        end loop dd ; 
end;$$   
 
delimiter ;    
 
3 执行存储过程
 
call test1;  

1100W条数据 我本地查询是13秒,通过设置了慢sql,我们看看有没有打印出来

看到可以打印sql~ OK ~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值