最近想起来以前在那家公司时,重构了一个系统。那时候经验还不算足,跌跌撞撞遇到好多问题。
那时候重构上线了,第一天虽然很多问题,但是还算可以解决。
第二天出现了一个奇怪的现象,在某一个时刻突然整个服务卡死,一时间也不知道为什么,一开始还以为被攻击了。
重启一下服务就好了,看错误日志貌似也没有啥报错,翻看临近节点的调用,貌似也没啥异常。
后来和老大在商量,貌似之前在重构测试时,遇到过一个因为改动了公用的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 ~~