内容纲要
概要描述
本文主要介绍,如何将 前语句事件表events_statements_current
、历史语句事件表events_statements_history
中的 TIMER_START
和 TIMER_END
转换成标准时间格式。
详细说明
TIMER_START 和 TIMER_END 字段表示的是事件开始和结束的时间戳,但这些时间戳并不是以常见的日期时间格式存储的。相反,它们是以某个固定时间点(通常是服务器启动时间)为基准的相对时间戳。因此,需要进行一些转换才能将这些时间戳转换为标准的时间格式。
以下是将 TIMER_START 转换为标准时间的步骤:
1.获取服务器的启动时间:你需要知道 MySQL 服务器的启动时间,因为 TIMER_START 和 TIMER_END 是相对于这个时间的。你可以通过查询
performance_schema.global_variables
表中的 uptime 变量来获取服务器已经运行的时间(以秒为单位),然后再结合当前系统时间来推算启动时间。
2.计算绝对时间:将 TIMER_START 或 TIMER_END 转换为相对于 Unix epoch(1970-01-01 00:00:00 UTC)的绝对时间戳。
3.格式化为标准时间:使用 MySQL 的日期时间函数将绝对时间戳转换为可读的时间格式。
下面是一个示例 SQL 查询,提供了两种函数逻辑
select
DATE_SUB(now(),INTERVAL(SELECT variable_value FROM performance_schema.global_status WHERE variable_name='UPTIME')-a.TIMER_START*10e-13 second) start_time1,
FROM_UNIXTIME(UNIX_TIMESTAMP(NOW())-(SELECT variable_value FROM performance_schema.global_status WHERE variable_name='UPTIME') + (TIMER_START / 1000000000000)) AS start_time2,
DATE_SUB(now(),INTERVAL(SELECT variable_value FROM performance_schema.global_status WHERE variable_name='UPTIME')-a.TIMER_END*10e-13 second) end_time1,
FROM_UNIXTIME(UNIX_TIMESTAMP(NOW())-(SELECT variable_value FROM performance_schema.global_status WHERE variable_name='UPTIME') + (TIMER_END / 1000000000000)) AS end_time2
FROM performance_schema.events_statements_history a ;
或者可以写个function
create function lkw.f_convert_timer_to_utc(pi_timer bigint) returns timestamp(6)
DETERMINISTIC
begin
declare value_utc_time timestamp(6);
select FROM_UNIXTIME( (unix_timestamp(sysdate()) - variable_value) + pi_timer/1000000000000 ) from performance_schema.global_status where variable_name = 'Uptime' into value_utc_time;
return value_utc_time;
end;
使用的时候直接调用即可:
select
lkw.f_convert_timer_to_utc(TIMER_START) run_start_time,
lkw.f_convert_timer_to_utc(TIMER_END) run_end_time
from performance_schema.events_statements_history;