`

【转载】探索MYSQL源代码-在SHOW PROCESSLIST里添加字段

阅读更多
原文链接:http://ourmysql.com/archives/930
收藏了

探索MYSQL源代码-在SHOW PROCESSLIST里添加字段


show processlist是诊断MySQL常用的命令,它会列出THD对象里所有的线程当前状况。

下面将为show processlist添加一个新的列,表示当前连接查询之后返回的行数,字段名为my_row_count。

当你要修改一个命令的时候,最好从sql/sql_yacc.yy出发,根据命令的关键字语法匹配到后续的动作。打开sql/sql_yacc.yy后搜索关键字show:,就找到了所有show命令的语法规则。继续往下找就能看到,

| opt_full PROCESSLIST_SYM
{ Lex->sql_command= SQLCOM_SHOW_PROCESSLIST;}
| ....

找到了相应的sql命令SQLCOM_SHOW_PROCESSLIST,命令对应的行为呢?

我们来到sql/sql_parse.cc的dispatch_command函数,这是所有命令和查询的总路口,搜索关键字SQLCOM_SHOW_PROCESSLIST会发现,

case SQLCOM_SHOW_PROCESSLIST:
if (!thd->security_ctx->priv_user[0] && check_global_access(thd,PROCESS_ACL))
    break;
mysqld_list_processes(thd, (thd->security_ctx->master_access & PROCESS_ACL ? NullS :
thd->security_ctx->priv_user), lex->verbose);
break;

是的msyqld_list_processes就是服务端处理show processlist 的函数。如果你配置好cscope和ctag,这里就可以很方便的快速切换进入这个函数。

进入mysqld_list_processes(sql/sql_show.cc)之后,可以看到这个函数还是比较简单,先是往field_list插入一些item,这些item就是show processlist的字段title, 很熟悉把。这里我们添加一个字段名my_row_count。

field_list.push_back(field=new Item_empty_string("Info",max_query_length));
field->maybe_null=1;
/* start */
field_list.push_back(field=new Item_int("my_row_count", MY_INT32_NUM_DECIMAL_DIGITS));
field->maybe_null=1;
/* end */
if (protocol->send_fields(&field_list,
Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF))
DBUG_VOID_RETURN;

可以看到上面代码最后的send_fields就是把字段名发送给客户端。
接下来就是从tmp对象(THD)把内容复制给thd_info对象(thread_info)。

thd_info->query=(char*) thd->strmake(tmp->query,length);
}
/* start */
thd_info->my_row_count = tmp->my_row_count;
/* end */
pthread_mutex_unlock(&tmp->LOCK_thd_data);

接下来把thd_info 打包到protocol,随后就发送出去了。

protocol->store(thd_info->query, system_charset_info);
/*start*/
protocol->store((ulonglong) thd_info->my_row_count);
/*end*/
if (protocol->write())
....

好了show processlist 函数添加的新列就结束了。接下来我们要填充my_row_count的值, 这就涉及到为THD类的添加新的成员。

打开sql/sql_class.h,查找关键字sent_row_count,然后添加一个my_row_count成员。

ha_rows    sent_row_count;
/* start */
ha_rows  my_row_count;
/* end */

再打开sql/sql_class.cc 为my_row_count赋初值。

cuted_fields= sent_row_count= row_count=my_row_count =  0L;

接着在sql/sql_class.cc 为每次select进行累加,找到函数 bool select_send::send_data(List &items)

thd->sent_row_count++;
/* start */
thd->my_row_count++;
/* end */

好了,重新make &&sudo make install,这里花费时间比较长,因为sql_class被修改,很多lib、binary需要重新编译。

编译后就可以看到

mysql> show processlist;
+----+------+-----------------+------+---------+------+-------+------------------+--------------+
| Id | User | Host            | db   | Command | Time | State | Info             | my_row_count |
+----+------+-----------------+------+---------+------+-------+------------------+--------------+
|  3 | root | localhost:39325 | NULL | Query   |    0 | NULL  | show processlist |            3 |
+----+------+-----------------+------+---------+------+-------+------------------+--------------+
1 row in set (0.00 sec)

mysql> insert into test.dddd values(1);
Query OK, 1 row affected (0.10 sec)

mysql> select * from test.dddd;
+------+
| a    |
+------+
|    1 |
|    1 |
|    1 |
+------+
3 rows in set (0.00 sec)

mysql> show processlist;
+----+------+-----------------+------+---------+------+-------+------------------+--------------+
| Id | User | Host            | db   | Command | Time | State | Info             | my_row_count |
+----+------+-----------------+------+---------+------+-------+------------------+--------------+
|  3 | root | localhost:39325 | NULL | Query   |    0 | NULL  | show processlist |            6 |
+----+------+-----------------+------+---------+------+-------+------------------+--------------+
1 row in set (0.00 sec)
分享到:
评论

相关推荐

    mysql show processlist 显示mysql查询进程

    得到数据形式如下(只截取了三条): mysql> show processlist; +—–+————-+——————–+——-+———+——-+———————————-+———- | Id | User | Host | db | Command | Time| State | Info +...

    mysql的慢日志配置查询和show processlist使用

    mysql的慢日志配置查询和show processlist使用

    mysql-processlist-log

    mysql-processlist-log

    3-4_processlist(改进1).exe

    操作系统的线程控制创建记事本,操作系统的线程控制退出记事本,操作系统的线程控制查看内存,操作系统的线程控制退出程序。

    MySQL数据库show processlist指令使用解析

    在实际项目开发中,如果我们对数据库的压力比较大,比如有大批量的查询或者插入等sql,尤其是多线程插入等情况,针对部分执行比较慢的sql,我们可以将其kill掉,常用的一个命令就是show processlist  1. show ...

    通过mysql show processlist 命令检查mysql锁的方法

    processlist命令的输出结果显示了有哪些线程在运行,可以帮助识别出有问题的查询语句,两种方式使用这个命令。1. 进入mysql/bin目录下输入mysqladmin processlist;2. 启动mysql,输入show processlist;如果有SUPER...

    MySQL SHOW PROCESSLIST协助故障诊断全过程

    一、SHOW PROCESSLIST命令 SHOW PROCESSLIST显示正在运行(用户运行线程)的...如果不使用该FULL关键字,则每个语句的前100个字符都将显示在该Info字段中。 进程信息也可从performance_schema.threads表中获得。但是,

    Mysql查看当前线程_杀死线程1

    mysql查看当前执行线程_关闭当前的某些线程 show processlist_kill每个与mysqld的连接都在一个独立的线程里运行,您可以使用SHOW

    MySQL通过show processlist命令检视性能的讲解

    今天小编就为大家分享一篇关于MySQL通过show processlist命令检视性能的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    MySQL学习笔记.docx

    比较全面的mysql学习笔记,如: /* 启动MySQL */ net start mysql /* 连接与断开服务器 */ ... ...SHOW PROCESSLIST -- 显示哪些线程正在运行 SHOW VARIABLES -- /* 数据库操作 */ ---------------

    mysql基础笔记

    SHOW PROCESSLIST -- 显示哪些线程正在运行 SHOW VARIABLES -- 显示系统变量信息 /* 数据库操作 */ ------------------ -- 查看当前数据库 SELECT DATABASE(); -- 显示当前时间、用户名、数据库版本 SELECT now(),...

    MYSQL优化-一篇很好的优化文章

    25. 学会使用SHOW PROCESSLIST 26. 如何知晓MYSQL解决一条查询 27. MYSQL非常不错 28. MYSQL应避免的事情 29. MYSQL各种锁定 30. 给MYSQL更多信息以更好地解决问题的技巧 31. 事务的例子 32. 使用REPLACE的...

    processlist命令 查看mysql 线程

    启动mysql,输入show processlist(关闭某一线程 kill id;); 如果有 SUPER 权限,则可以看到全部的线程,否则,只能看到自己发起的线程(这是指,当前对应的MySQL帐户运行的线程)。 得到数据形式如下(只截取了三条...

    Mysql-使用show profiles分析你的SQL

    文章目录是什么如何用工具-SHOW PROCESSLIST工具-SHOW PRIFILES 是什么 慢查询:执行超过指定时间的SQL语句;分析MySQL语句查询性能的方法除了使用 EXPLAIN 输出执行计划,还可以让MySQL记录下查询超过指定时间的语句...

    MYSQL锁表问题的解决方法

    mysql>show processlist; 参看sql语句 一般少的话 mysql>kill thread_id; 就可以解决了 kill掉第一个锁表的进程, 依然没有改善. 既然不改善, 咱们就想办法将所有锁表的进程kill掉吧, 简单的脚本如下. #!/bin...

    mysql SKIP-NAME-RESOLVE 错误的使用时机造成用户权限

    登陆到mysql,查看进程的信息 代码如下:show processlist; 发现大量的进程的状态为 login 原来默认的时候mysql启动时是不使用 skip-name-resolve选项的,这样的话,从其它主机的连接会比较慢,因为mysql会对这个ip做...

Global site tag (gtag.js) - Google Analytics