【问题】

最近查看MySQL的error log文件时,发现有很多服务器的文件中有大量的如下日志,内容很长(大小在200K左右),从记录的内容看,并没有明显的异常信息。

有一台测试服务器也有类似的问题,为什么会记录这些信息,是谁记录的这些信息,分析的过程比较周折。Status information:

Current dir:

Running threads: 2452  Stack size: 262144

Current locks:

lock: 0x7f783f5233f0:

Key caches:

default

Buffer_size:       8388608

Block_size:           1024

Division_limit:        100

Age_limit:             300

blocks used:            10

not flushed:             0

w_requests:           6619

writes:                  1

r_requests:         275574

reads:                1235

handler status:

read_key:   32241480828

read_next:  451035381896

read_rnd     149361175

read_first:    1090473

write:      4838429521

delete        12155820

update:     3331297842

【分析过程】

1、首先在官方文档中查到,当mysqld进程收到SIGHUP信号量时,就会输出类似的信息,

On Unix, signals can be sent to processes.mysqldresponds to signals sent to it as follows:

SIGHUPcauses the server to reload the grant tables and to flush tables, logs, the thread cache, and the host cache. These actions are like various forms of theFLUSHstatement. The server also writes a status report to the error log that has this format:

2、有别的程序在kill mysqld进程吗,用systemtap脚本监控kill命令probe nd_syscall.kill

{

target[tid()] = uint_arg(1);

signal[tid()] = uint_arg(2);

}

probe nd_syscall.kill.return

{

if (target[tid()] != 0) {

printf("%-6d %-12s %-5d %-6d %6d\n", pid(), execname(),

signal[tid()], target[tid()], int_arg(1));

delete target[tid()];

delete signal[tid()];

}

}

用下面命令测试,确实会在error log中记录日志kill -SIGHUP 12455

从systemtap的输出看到12455就是mysqld进程,被kill掉了,信号量是1,对应的就是SIGHUP

不过在测试环境后面问题重现时,却没有抓到SIGHUP的信号量。

FROM   COMMAND      SIG   TO     RESULT

17010  who          0     12153  1340429600

36681  bash         1     12455     642

3、看来并不是kill导致的,后面用gdb attach到mysqld进程上,在error log的三个入口函数sql_print_error,sql_print_warning,sql_print_information加上断点

但是在问题重现时,程序并没有停在断点处

4、写error log还有别的分支吗,翻源码找到了答案,原来是通过mysql_print_status函数直接写到error log中void mysql_print_status()

{

char current_dir[FN_REFLEN];

STATUS_VAR current_global_status_var;

printf("\nStatus information:\n\n");

(void) my_getwd(current_dir, sizeof(current_dir),MYF(0));

printf("Current dir: %s\n", current_dir);

printf("Running threads: %u  Stack size: %ld\n",

Global_THD_manager::get_instance()->get_thd_count(),

(long) my_thread_stack_size);

puts("");

fflush(stdout);

}

5、再次用gdb attach到mysqld进程上,在mysql_print_status函数上加断点,在问题重现时,线程停在断点处,通过ps的结果多次对比,判断是pt-stalk工具运行时调用了mysql_print_status

6、从堆栈中看到dispatch_command调用了mysql_print_status,下面是具体的逻辑,当command=COM_DEBUG时就会执行到mysql_print_statuscase COM_DEBUG:

thd->status_var.com_other++;

if (check_global_access(thd, SUPER_ACL))

break;                /* purecov: inspected */

mysql_print_status();

query_logger.general_log_print(thd, command, NullS);

my_eof(thd);

break;

7、查看pt-stalk的代码

if [ "$mysql_error_log" -a ! "$OPT_MYSQL_ONLY" ]; then

log "The MySQL error log seems to be $mysql_error_log"

tail -f "$mysql_error_log" >"$d/$p-log_error" &

tail_error_log_pid=$!

$CMD_MYSQLADMIN $EXT_ARGV debug

else

log "Could not find the MySQL error log"

在调用mysqladmin时使用了debug模式

debug         Instruct server to write debug information to log

8、在percona官网上搜到了相关的bug描述,目前bug还未修复,会在下个版本中3.0.13中修复。

https://jira.percona.com/browse/PT-1340

【解决方案】

定位到问题后,实际修复也比较简单,将pt-stalk脚本中$CMD_MYSQLADMIN $EXT_ARGV debug中的debug去掉就可以了,测试生效。

mysql 超长记录_谁记录了mysql error log中的超长信息(记pt-stalk一个bug的定位过程)...相关推荐

  1. 【转载】谁记录了mysql error log中的超长信息

    转载: https://www.cnblogs.com/DataArt/p/10260994.html [问题] 最近查看MySQL的error log文件时,发现有很多服务器的文件中有大量的如下日志 ...

  2. 谁记录了mysql error log中的超长信息

    [问题] 最近查看MySQL的error log文件时,发现有很多服务器的文件中有大量的如下日志,内容很长(大小在200K左右),从记录的内容看,并没有明显的异常信息. 有一台测试服务器也有类似的问题 ...

  3. mysql架构组成_第 2 章 MySQL 架构组成

    麻雀虽小,五脏俱全.MySQL 虽然以简单著称,但其内部结构并不简单.本章从MySQL物理组成.逻辑组成,以及相关工具几个角度来介绍 MySQL 的整体架构组成,希望能够让读者对 MySQL 有一个更 ...

  4. Windows7操作记录_操作时间记录_启动时间记录_日志查看

    Windows7操作记录_操作时间记录_启动时间记录_日志查看 桌面>>计算机>>(鼠标右键)管理>>系统工具>>事件查看器>>Window ...

  5. mysql数据库二级_全国计算机二级mysql数据库模拟试题及答案

    全国计算机二级mysql数据库模拟试题及答案 很多人都想拿到二级mysql证,那么在参考二级mysql考试前,可要做好充分的准备,下面小编为大家带来了全国计算机二级mysql数据库模拟试题及答案,欢迎 ...

  6. 让两个 mysql 自动同步_实现两个Mysql数据库之间同步的方案

    实现两个Mysql MySQL 为了实现replication 必须打开bin-log 项,也是打开二进制的MySQL 日志记录选项.MySQL 的bin log 二 进制日志,可以记录所有影响到数据 ...

  7. mysql隐藏用户名_系统默认的MySQL用户名消失的解决方法(修正版)

    修改MySQL下的默认mysql数据库的user表,删除所有host为localhost记录,另 外添加一些其他记录,重新启动MySQL服务器.执行show databases,只出现informat ...

  8. mysql 连接 优化_(一)MySQL 连接优化

    1.查看连接参数(show variables) mysql> show variables like '%connect%'; +------------------------------- ...

  9. mysql qps提升_上亿数据MYSQL的innodb优化 QPS轻松过5000

    最近2周时间, 对于MYSQL 5.5.15-log Windows XP版本,进行了各种测试和优化.目前mysql的许多单表数据已经超过了1亿条记录,MYSQL在经过各种优化后,处理上亿条记录非常轻 ...

最新文章

  1. Spring Boot 中引入 MyBatisPlus 的常规流程
  2. Android 异常: failed to connect to localhost/127.0.0.1
  3. G7终极2.3.7完美版,黑白分明,值得永久收藏使用
  4. linux创建mysql视图_MySQL视图基本操作
  5. ios 上运行linux,你可曾想过在iOS上跑Linux?
  6. 下载kaggle数据集的小妙招
  7. openstack中resize更改虚拟机内存、cpu大小后虚拟机状态显示VERIFY_RESIZE
  8. Java基础---键盘录入工具(Scanner类)
  9. 详解Vue八大生命周期钩子函数
  10. java如何无感知部署_干货!如何平稳用户无感知的完成系统重构升级
  11. CentOS _ RHEL 防止Kernel升级
  12. 设计模式之桥接模式(Java语言描述)
  13. Python爬虫爬取网页数据
  14. 深入剖析Spring架构与设计原理(一)
  15. 手机九宫格解锁所有可能
  16. Linux正则表达式和文本处理工具(gred、awk、sed)
  17. MFC自用小工具源码
  18. 黑马程序员--Java学习01--java简介
  19. 背景减除算法之K-Nearest(KNN)和Mixture of Gaussians(MOG2)
  20. Kubernetes服务发现:Service、Kube-Proxy(Netfilter)

热门文章

  1. [渝粤教育] 西南科技大学 计算机工业控制 在线考试复习资料
  2. 【渝粤题库】国家开放大学2021春2508学前儿童语言教育题目
  3. 【渝粤题库】国家开放大学2021春1107传感器与测试技术题目
  4. CC1310射频芯片的433M无线模块设计
  5. imx6的Linux默认颜色,MY-IMX6 Linux-3.14 测试手册(1)
  6. 计算机考博哪个学校好考,管理学博士哪个学校好考
  7. jdbc mysql ssh通道_Jdbc使用ssh通道连接Mysql
  8. Verilog HDL中模块参数传递的方法
  9. nit计算机应用基础是考试大纲,NIT考试大纲--计算机应用基础.doc
  10. IMA文件如何打开,winimage使用方