级联slave中延迟计算和query event exe time获取方法的示例分析
发表于:2025-11-13 作者:千家信息网编辑
千家信息网最后更新 2025年11月13日,这篇文章主要为大家展示了"级联slave中延迟计算和query event exe time获取方法的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下
千家信息网最后更新 2025年11月13日级联slave中延迟计算和query event exe time获取方法的示例分析
这篇文章主要为大家展示了"级联slave中延迟计算和query event exe time获取方法的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"级联slave中延迟计算和query event exe time获取方法的示例分析"这篇文章吧。
一、级联时间计算方式
逻辑如下:
级联中的Event依然是主库的时间,因此其延迟还是相对主库而言。虽然apply_event_and_update_pos函数中由设置为当前时间thd->set_time()但是最终设置还是在Query_log_event::do_apply_event和Query_log_event::do_apply_event中的的THD::set_time (this=0x7ffe74007da0, t=0x7ffe74007828)因为只有做了数据库修改才会触发记录Event的工作设个设置就是设置为event header的timestamp,因此还是级联中记录的Event的时间还是主库的时间,计算延迟就是相对主库的时间。栈帧#0 THD::set_time (this=0x7ffe74007da0, t=0x7ffe7493c4d0) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/sql_class.h:3526#1 0x00000000018459ab in Query_log_event::do_apply_event (this=0x7ffe7493c3b0, rli=0x676be60, query_arg=0x7ffe740061dc "BEGIN", q_len_arg=5) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/log_event.cc:4714#2 0x0000000001845287 in Query_log_event::do_apply_event (this=0x7ffe7493c3b0, rli=0x676be60) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/log_event.cc:4567#3 0x00000000018420d4 in Log_event::apply_event (this=0x7ffe7493c3b0, rli=0x676be60) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/log_event.cc:3570#4 0x00000000018bc078 in apply_event_and_update_pos (ptr_ev=0x7fffec094830, thd=0x7ffe74007da0, rli=0x676be60) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/rpl_slave.cc:4766#5 0x00000000018bd773 in exec_relay_log_event (thd=0x7ffe74007da0, rli=0x676be60) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/rpl_slave.cc:5300#6 0x00000000018c46e4 in handle_slave_sql (arg=0x6675d30) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/rpl_slave.cc:7543#7 0x0000000001945620 in pfs_spawn_thread (arg=0x7ffe7c02c6c0) at /root/mysqlall/percona-server-locks-detail-5.7.22/storage/perfschema/pfs.cc:2190#8 0x00007ffff7bc6aa1 in start_thread () from /lib64/libpthread.so.0#9 0x00007ffff6719bcd in clone () from /lib64/libc.so.6#0 THD::set_time (this=0x7ffe74007da0, t=0x7ffe7493c4d0) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/sql_class.h:3526#1 0x00000000018459ab in Query_log_event::do_apply_event (this=0x7ffe7493c3b0, rli=0x676be60, query_arg=0x7ffe740061dc "BEGIN", q_len_arg=5) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/log_event.cc:4714#2 0x0000000001845287 in Query_log_event::do_apply_event (this=0x7ffe7493c3b0, rli=0x676be60) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/log_event.cc:4567#3 0x00000000018420d4 in Log_event::apply_event (this=0x7ffe7493c3b0, rli=0x676be60) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/log_event.cc:3570#4 0x00000000018bc078 in apply_event_and_update_pos (ptr_ev=0x7fffec094830, thd=0x7ffe74007da0, rli=0x676be60) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/rpl_slave.cc:4766#5 0x00000000018bd773 in exec_relay_log_event (thd=0x7ffe74007da0, rli=0x676be60) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/rpl_slave.cc:5300#6 0x00000000018c46e4 in handle_slave_sql (arg=0x6675d30) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/rpl_slave.cc:7543#7 0x0000000001945620 in pfs_spawn_thread (arg=0x7ffe7c02c6c0) at /root/mysqlall/percona-server-locks-detail-5.7.22/storage/perfschema/pfs.cc:2190#8 0x00007ffff7bc6aa1 in start_thread () from /lib64/libpthread.so.0#9 0x00007ffff6719bcd in clone () from /lib64/libc.so.6query map event在修改的第一条数据 记录时间 这个时间肯定是Log_event::apply_event的时间,GTID自然是在最后commit的时候 ,XID EVENT也是正确的主库时间。实际上第一个THD::set_time(header->timestamp)后user_time 就正确,下面的逻辑不会设置为当前时间。inline void set_time() { start_utime= utime_after_lock= my_micro_time(); if (user_time.tv_sec || user_time.tv_usec) { start_time= user_time; } else my_micro_time_to_timeval(start_utime, &start_time);#ifdef HAVE_PSI_THREAD_INTERFACE PSI_THREAD_CALL(set_thread_start_time)(start_time.tv_sec);#endif }但是主库dispatch_command的时候不会设置user_time user_time为0,因此设置为当前时间。#0 THD::set_time (this=0x7ffedc0009c0) at /mysqldata/percona-server-locks-detail-5.7.22/sql/sql_class.h:3514#1 0x00000000015c5fe8 in dispatch_command (thd=0x7ffedc0009c0, com_data=0x7fffec5bdd70, command=COM_QUERY) at /mysqldata/percona-server-locks-detail-5.7.22/sql/sql_parse.cc:1247#2 0x00000000015c58ff in do_command (thd=0x7ffedc0009c0) at /mysqldata/percona-server-locks-detail-5.7.22/sql/sql_parse.cc:1021#3 0x000000000170e578 in handle_connection (arg=0x67d01a0) at /mysqldata/percona-server-locks-detail-5.7.22/sql/conn_handler/connection_handler_per_thread.cc:312#4 0x0000000001945538 in pfs_spawn_thread (arg=0x67c9dc0) at /mysqldata/percona-server-locks-detail-5.7.22/storage/perfschema/pfs.cc:2190#5 0x00007ffff7bcfaa1 in start_thread () from /lib64/libpthread.so.0#6 0x00007ffff6b37c4d in clone () from /lib64/libc.so.6二、header中的timestamp和query_event的exe time计算方式
common_header:中的时间来自 命令发起的时间。下面是其初始化 Log_event::Log_event(THD* thd_arg, uint16 flags_arg, enum_event_cache_type cache_type_arg, enum_event_logging_type logging_type_arg, Log_event_header *header, Log_event_footer *footer) : is_valid_param(false), temp_buf(0), exec_time(0), event_cache_type(cache_type_arg), event_logging_type(logging_type_arg), crc(0), common_header(header), common_footer(footer), thd(thd_arg){ server_id= thd->server_id; common_header->unmasked_server_id= server_id; common_header->when= thd->start_time; common_header->log_pos= 0; common_header->flags= flags_arg;}dispatch_command调用时间Query_log_event::Query_log_event(THD* thd_arg, const char* query_arg, size_t query_length, bool using_trans, bool immediate, bool suppress_use, int errcode, bool ignore_cmd_internals): binary_log::Query_event(query_arg, thd_arg->catalog().str, thd_arg->db().str, query_length, thd_arg->thread_id(), thd_arg->variables.sql_mode, thd_arg->variables.auto_increment_increment, thd_arg->variables.auto_increment_offset, thd_arg->variables.lc_time_names->number, (ulonglong)thd_arg->table_map_for_update, errcode, thd_arg->db().str ? strlen(thd_arg->db().str) : 0, thd_arg->catalog().str ? strlen(thd_arg->catalog().str) : 0), Log_event(thd_arg, (thd_arg->thread_specific_used ? LOG_EVENT_THREAD_SPECIFIC_F : 0) | (suppress_use ? LOG_EVENT_SUPPRESS_USE_F : 0), using_trans ? Log_event::EVENT_TRANSACTIONAL_CACHE : Log_event::EVENT_STMT_CACHE, Log_event::EVENT_NORMAL_LOGGING, header(), footer()), data_buf(0){ DBUG_EXECUTE_IF("debug_lock_before_query_log_event", DBUG_SYNC_POINT("debug_lock.before_query_log_event", 10);); /* save the original thread id; we already know the server id */ slave_proxy_id= thd_arg->variables.pseudo_thread_id; if (query != 0) is_valid_param= true; /* exec_time calculation has changed to use the same method that is used to fill out "thd_arg->start_time" */ struct timeval end_time; ulonglong micro_end_time= my_micro_time();//这里获取时间 query event my_micro_time_to_timeval(micro_end_time, &end_time); exec_time= end_time.tv_sec - thd_arg->start_time.tv_sec;//这里计算时间以上是"级联slave中延迟计算和query event exe time获取方法的示例分析"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
时间
延迟
还是
方法
示例
分析
内容
篇文章
就是
数据
方式
时候
逻辑
联中
学习
帮助
函数
只有
命令
实际
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
青岛港慧鼎移动服务器
资讯及网络安全试题富士康
全椒工业软件开发技术销售厂
天翼云服务器作用
服务器生存通关视频教程
通过网络技术找回聊天记录
数据库sql学多久能干活
oracle 数据库转移
数据库查询多张表
excel图表多种数据库
网络技术相关政策分析
当代软件开发的主要模型
江西云猫网络技术有限公司
江门小程序网络技术开发
有什么黑科技软件开发
华为如何删除数据库
linux服务器的优点
服务器管理查看服务器
通过连接数据库复制数据库
网络技术应用会考大题
qt服务器数据库备份功能
网络技术科普动画视频
如何用手机搭建服务器
昭通商城分销软件开发
csgo加载服务器闪退
任我行软件开发公司
网络安全主题团日活动记录
如何提高政府网络安全
清理数据库的命令
服务器错误403