重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
MYSQL_OPT_READ_TIMEOUT 是 MySQL c api 客户端中用来设置读取超时时间的参数。在 MySQL 的官方文档中,该参数的描述是这样的:
创新互联是创新、创意、研发型一体的综合型网站建设公司,自成立以来公司不断探索创新,始终坚持为客户提供满意周到的服务,在本地打下了良好的口碑,在过去的十余年时间我们累计服务了上千家以及全国政企客户,如展览展示等企业单位,完善的项目管理流程,严格把控项目进度与质量监控加上过硬的技术实力获得客户的一致表扬。
MYSQL_OPT_READ_TIMEOUT (argument type: unsigned int *)The timeout in seconds for each attempt to read from the server. There are retries if necessary, so the total effective timeout value is three times the option value. You can set the value so that a lost connection can be detected earlier than the TCP/IPClose_Wait_Timeout value of 10 minutes.
也就是说在需要的时候,实际的超时时间会是设定值的 3 倍。但是实际测试后发现实际的超时时间和设置的超时时间一致。
而具体什么时候发生三倍超时,在文档中没有找到。所以对 MySQL 5.7.20 的源码进行了一些分析。
使用 GDB 调试代码找了实际与 mysql server 通信的代码,如下:
请点击输入图片描述
其中 vio_read() 函数中,使用 recv 和 poll 来读取报文和做读取超时。net_should_retry() 函数只有在发生 EINTR 时才会返回 true。从这段代码来看是符合测试结果的,并没有对读取进行三次重试。只有在读取操作被系统中断打断时才会重试,但是这个重试并没有次数限制。
从上面代码的分析可以看出,代码的逻辑和文档的描述不符。于是在一顿搜索后,找到了一个 MySQL 的 BUG(Bug #31163)。该 BUG 报告了在 MySQL 5.0 中,MySQL c api 读取的实际超时时间是设置的三倍,与现有文档描述相符。于是对 MySQL 5.0.96 的代码又进行分析。
同样使用 GDB 找到了通信部分的代码。这次找到了重试三次的代码,如下:
请点击输入图片描述
这个版本的 MySQL api 的读写超时是直接使用的 setsockopt 设置的。第一次循环,在 A 点发生了第一次超时(虽然注释写的非阻塞,但是客户端的连接始终是阻塞模式的)。然后在 B 点将该 socket 设置为阻塞模式,C 点这里重置 retry 次数。由于设置了 alarm 第二次以后的循环会直接进入 D 点的这个分支,并且判断循环次数。作为客户端时net-retry_count 始终是 1,所以重试了两次,共计进行了 3 次 vioread 后从 E 点退出函数。
由上面的分析可知,MySQL 文档对于该参数的描述已经过时,现在的 MYSQL_OPT_READ_TIMEOUT 并不会出现三倍超时的问题。而 Bug #31163 中的处理结果也是将文档中该参数的描述更新为实际读取超时时间是设定时间的三倍。也许是 MySQL 的维护者们在后续版本更新时忘记更新文档吧。
有SQL语句执行前,输出当前时间的微秒数,执行SQL守成后,再输出下时间。计算出差值就是了。
右下角的时间是从点击查询到输出查询结果的总时间,而profile中的是收集在执行语句的时候所使用的资源,包括执行sql时完整的数据查询逻辑明细及耗时时间,其中包含查询语句执行时间、索引排序时间、查询结果展示时间等
1、开启和关闭
mysql set profiling=1;
mysql set profiling=0;
information_schema 的 database 会建立一个PROFILING 的 table 记录.
2、执行一些语句
mysqlshow databases;
mysqluse information_schema;
3、查询语句执行时间
mysqlshow profiles;
mysqlhelp show profiles 获得更多提示
一,uptime 可以查看系统的运行时间
show global status like 'uptime';
二,利用linux命令查看
Linux 下有个 uptime 可以查看系统的运行时间,可是 MySQL 可没这个命令
不过用 ps 命令也可以做到
[root@dbserver ~]# ps aux | grep mysql
root 29090 0.0 0.0 70232 1364 ? S Jun05 0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/data/mysql --pid-file=/data/mysql/dbserver.pid
看到了吧, Jun05 就表示这个服务是在6月5日启动的,算一下运行了多久了呢?
三,利用phpmyadmin的状态中可以看如下信息
这台 MySQL 服务器已经运行了 0 天 6 小时,30 分 16 秒,启动时间为 2014 年 01 月 02 日 08:39。