`

【转载】探索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 的慢日志配置查询和 Show Processlist 使用的相关知识点。 慢日志配置 慢日志(Slow Query Log)是 MySQL 中的一种日志机制,用于记录执行时间超过一定数值的 SQL 语句。慢...

    mysql-8.0.26-macos11-x86_64.dmg

    - 使用`SHOW PROCESSLIST;`命令查看当前运行的查询,诊断性能瓶颈。 - 通过`EXPLAIN`关键字分析SQL查询计划,优化查询效率。 总之,“mysql-8.0.26-macos11-x86_64.dmg”是针对macOS 11系统优化的MySQL数据库...

    mysql show processlist 显示mysql查询进程

    MySQL中的`SHOW PROCESSLIST`命令是一个非常实用的工具,它允许管理员查看当前正在运行的所有MySQL进程,包括查询、更新和其他数据库操作。这个命令对于诊断性能问题、监控活动以及管理资源至关重要。下面我们将深入...

    mysql-processlist-log

    在`mysql-processlist-log-master`这个文件夹中,可能包含了源代码、配置文件、脚本或者文档,用于实现上述的日志收集和分析功能。要深入学习和利用这个资源,你需要查看其内容,理解其工作原理,并根据自己的需求...

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

    MySQL的`show processlist`命令是数据库管理员用于监控数据库性能和诊断问题的重要工具。它能显示当前所有活动线程的信息,帮助我们理解哪些SQL语句可能导致性能瓶颈或资源消耗过大。下面我们将详细解析这个命令的...

    3-4_processlist(改进1).exe

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

    mysql-getting-started.pdf

    可以使用 `SHOW PROCESSLIST` 命令来查看当前执行的查询。 其他有用的资源 * MySQL 官方文档:https://dev.mysql.com/doc/ * MySQL 论坛:https://forums.mysql.com/ * MySQL 博客:https://mysqlserverteam.com/ ...

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

    `SHOW PROCESSLIST`是MySQL管理工具中非常关键的一个命令,用于查看当前系统中所有线程的状态,帮助数据库管理员监控和诊断系统性能问题。这个命令在MySQL服务器资源占用过高时尤其有用,因为它能揭示哪些SQL语句...

    MySQL5.0常用命令与数据恢复.pdf

    - `SHOW PROCESSLIST;` — 列出当前连接的所有会话信息。 - `SHOW VARIABLES;` — 显示MySQL系统的变量设置。 - `SHOW TABLES FROM db_name;` — 显示指定数据库中的所有表。 - `SHOW [FULL] COLUMNS FROM table...

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

    本文将详细阐述如何使用`SHOW PROCESSLIST`和`KILL`命令来监控和结束MySQL中的线程。 首先,我们来看如何使用`SHOW PROCESSLIST`命令。这个命令用于显示当前所有连接到MySQL服务器的线程状态,包括线程ID(thread_...

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

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

    mysql性能优化-慢查询分析、优化索引和配置.doc

    - 开启慢查询日志的方法有两种:一种是在MySQL配置文件`my.cnf`或`my.ini`中添加相关参数;另一种是通过命令行动态设置。 配置示例: ```ini [mysqld] log-slow-queries = /data/mysqldata/slow-query.log ...

    2022-MYSQL-数据库-运维知识

    - 使用`SHOW PROCESSLIST`检查当前运行的进程,定位阻塞查询。 8. **性能调优**: - 优化查询语句,避免全表扫描,合理使用JOIN和子查询。 - 调整InnoDB存储引擎的参数,如`innodb_flush_log_at_trx_commit`和`...

    linux中mysql5.5--rpm安装包(含安装过程)

    3. 监控与优化:监控MySQL性能,如使用`SHOW VARIABLES LIKE '%%'`查看配置,以及`SHOW PROCESSLIST;`检查当前运行的查询,必要时进行SQL优化。 总结,通过RPM方式安装MySQL 5.5在Linux中是一个简单且有效的方法,...

    Mysql主从搭建及Mysql运维相关命令

    MySQL主从架构是一种常见的数据库高可用性和数据冗余解决方案,它允许数据在主数据库和从数据库之间进行实时或近实时的复制。以下是对标题和描述中提到的知识点的详细解释: 1. **MySQL安装**: - 可以通过RPM包...

    mysql-show命令.docx

    MySQL中的`SHOW`命令是用于获取数据库系统的各种信息和状态的实用工具,它可以帮助管理员和开发者了解数据库的内部工作情况,以及对数据进行操作时的相关信息。以下是对这些`SHOW`命令的详细解释: 1. **`SHOW ...

Global site tag (gtag.js) - Google Analytics