MySQL拉取上周的慢sql_从MYSQL查查询日志中过滤出一个小时的慢查询日志并找出 TOP SQL...

sed -n   '/# Time: 151226 16:30:../,$'p QITV0223-slow.log > QITV0223-slow-1630.log

在 MYSQL 慢查询日志中 # Time 中只有时间但没有日期的信息,需要知道一条慢查询SQL具体是哪天的,

就需要 unix_timestamp 函数把 # Time 中的时间戳信息转换为日期信息。

unix_timestamp(datetime=>timestamp)

from_unixtime(timestamp=>datetime)

mysql> select unix_timestamp('2015-12-26 17:30:00');

+---------------------------------------+

| unix_timestamp('2015-12-26 17:30:00') |

+---------------------------------------+

|                            1451122200 |

+---------------------------------------+

1 row in set (0.10 sec)

select from_unixtime('1451122200');

mysql> select from_unixtime('1451122200');

+-----------------------------+

| from_unixtime('1451122200') |

+-----------------------------+

| 2015-12-26 17:30:00.000000  |

+-----------------------------+

过滤出16:30到17:30的慢查询日志

方法一:使用时间戳过滤

mysql> select unix_timestamp('2015-12-26 17:30:00');

+---------------------------------------+

| unix_timestamp('2015-12-26 17:30:00') |

+---------------------------------------+

|                            1451122200 |

+---------------------------------------+

1 row in set (0.00 sec)

mysql> select unix_timestamp('2015-12-26 16:30:00');

+---------------------------------------+

| unix_timestamp('2015-12-26 16:30:00') |

+---------------------------------------+

|                            1451118600 |

+---------------------------------------+

1 row in set (0.00 sec)

sed -n   '/SET timestamp=14511186../,/SET timestamp=14511222../'p QITV0223-slow.log > test3.log

方法二:

mysql> select unix_timestamp('2015-12-26 16:30:00');

+---------------------------------------+

| unix_timestamp('2015-12-26 16:30:00') |

+---------------------------------------+

|                            1451118600 |

+---------------------------------------+

sed -n   '/SET timestamp=14511186../,$'p QITV0223-slow.log > test4.log

mysql> select unix_timestamp('2015-12-26 17:30:00');

+---------------------------------------+

| unix_timestamp('2015-12-26 17:30:00') |

+---------------------------------------+

|                            1451122200 |

+---------------------------------------+

1 row in set (0.00 sec)

--使用gred 在 test4.log 定位到17:30执行的SQL,比如定位出在 1085行

grep -n 'SET timestamp=14511222..'  QITV0223-slow.log  test4.log

1085:SET timestamp=1451122200;

--使用sed 过滤出第一行到1085行的数据

sed -n '1,1085'p test3.log  > test5.log

方法三:如果所有的SQL都有 #TIME 项,则使用 #TIME进行过滤

sed -n   '/# Time: 151226 16:30:../,/# Time: 151226 17:30:../'p QITV0223-slow.log > test10.log

如果没有匹配到 “# Time: 151226 17:30:..”,则会把从16:30到慢查询日志结尾的日志全过滤出来。

对于过滤好的慢查询日志检索 TOP SQL:

1. 获取执行时间最长的 10个 TOP SQL。

mysqldumpslow -s t -t 10 test10.log > slow_t_top_sql.txt

2. 获取平均查询时间最长的 10 个 TOP SQL。

mysqldumpslow -s  at -t 10 test10.log > slow_at_top_sql.txt

3. 获取锁定时间最长的 10个 TOP SQL。

mysqldumpslow -s l -t 10 test10.log > slow_l_top_sql.txt

4. 获取平均锁定时间最长的 10个 TOP SQL。

mysqldumpslow -s al -t 10 test10.log > slow_l_top_sql.txt

5. 获取返回记录最多的 10个 TOP SQL。

mysqldumpslow -s r -t 10 test10.log > slow_r_top_sql.txt

6. 获取平均返回记录最多的 10个 TOP SQL。

mysqldumpslow -s ar -t 10 test10.log > slow_r_top_sql.txt

7. 获取执行次数最多的 10个 TOP SQL。

mysqldumpslow -s c -t 10 test10.log > slow_r_top_sql.txt

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21582653/viewspace-2128134/,如需转载,请注明出处,否则将追究法律责任。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
解决docker mysql 8.0遇到sql_mode=only_full_group_by的问题,可以按照以下步骤进行操作: 1. 首先,看当前的sql_mode配置,可以使用以下命令查询:SELECT @@GLOBAL.sql_mode; [1] 2. 复制查询结果字符串,并去掉其的only_full_group_by选项。例如,如果查询结果为STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION,那么去掉only_full_group_by后的结果就是STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION。 3. 找到mysql的配置文件my.cnf,一般位于/etc/my.cnf路径,如果有自定义路径,可以进入自定义路径。 4. 进入配置文件,找到[mysqld]下的sql-mode配置项,如果没有则手动添加。将步骤2得到的结果添加到sql-mode配置项,例如:sql-mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION。 5. 保存配置文件,并重启mysql服务。如果是使用docker安装的mysql,可以使用docker restart命令重启容器。例如:docker restart 容器id。[1] 另外,如果你是第一次使用docker安装mysql 8.0,可以按照以下步骤进行操作: 1. 拉取mysql 8.0版本的镜像,并启动容器并做端口映射。可以使用以下命令拉取镜像并启动容器:docker pull mysql:8.0 和 docker run -p 3306:3306 --name mysql8 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0。[2] 2. 进入容器,可以使用以下命令进入容器:docker exec -it mysql bash。 3. 在容器设置初始密码,可以使用以下命令:ALTER USER 'root' IDENTIFIED WITH mysql_native_password BY '123456';[3] 4. 重启容器,可以使用以下命令重启容器:docker restart mysql8。[3] 通过以上步骤,你应该能够成功解决docker mysql 8.0遇到sql_mode=only_full_group_by的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值