级联从机中延迟计算及查询事件exe时间获取方法实例分析

分类:编程技术 时间:2024-02-20 15:43 浏览:0 评论:0
0
本文主要为大家展示《级联从机中延迟计算及查询事件exe时间获取方法示例分析》。内容简单、易懂、清晰。希望可以帮助您解答疑惑。让小编带大家一起来看看吧。学习研究《级联从机中延迟计算与查询事件exe时间获取方法实例分析》一文。

1.级联时间计算方法

逻辑如下:

级联中的事件仍然是主库的时间,所以它的延迟仍然是相对于主库的。虽然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的时间仍然是主库的时间,计算延迟是相对于主库的时间。堆栈帧 #0 THD::set_time (this=0x7ffe74007da0, t=0x7ffe7493c4d0) 位于查询 _log_event:: /root/mysqlall/percona-server-locks-detail-5.7.22/sql/sql_class.h:3526#1 0x00000000018459ab do_apply_event(这= 0x7ffe7493c3b0,rli = 0x676be60,query_arg = 0x7ffe740061dc“开始”,q_len_arg = 5)位于/root/mysqlall/percona-server-locks-detail-5.7.22/sql/log_event.cc:4714#2 0x00000000018452 87 英寸Query_log_event::do_apply_event(this=0x7ffe7493c3b0,rli=0x676be60)位于/root/mysqlall/percona-serv er-locks-detail-5.7。 22/sql/log_event.cc:4567#3 0x00000000018420d4 在 Log_event::apply_event (this=0x7ffe7493c3b0, rli=0x676be60) 位于 /root/mysqlall/percona-server-locks-detail-5.7.22/sql/ log_event.cc: 3570#4 apply_event_and_update_pos中的0x00000000018bc078(ptr_ev = 0x7fffec094830,thd = 0x7ffe74007da0, rli=0x676be60) 位于 /root/mysqlall/percona-server-locks-detail-5。 7.22/sql/rpl_slave.cc:4766#5 0x00000000018bd773 在 exec_relay_log_event (thd=0x7ffe74007da0, rli=0x676be60) 位于 /root/mysqlall/percona-server-locks-detail-5.7.22/sql/rpl_slave.cc:530 0#6 0x00000000018c46e4 在handle_slave_sql (arg=0x66 75d30) 位于/root/mysqlall/percona-server-locks-detail-5.7.22/sql/rpl_slave.cc:7543#7 0x0000000001945620 在pfs_spawn_thread (arg=0x7ffe7c) 02c6c0) 位于 /root/mysqlall/ percona-server- locks-detail- 5.7.22/storage/perfschema/pfs.cc:2190#8 0x00007ffff7bc6aa1 在来自 /lib64/libpthread.so.0#9 的 start_thread () 中 0x00007ffff6719bcd 在来自 /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(这= 0x7ffe7493c3b0,rli = 0x676be60,query_arg = 0x7ffe740061dc“开始”,q_len_arg = 5)位于/root/mysqlall/percona-server-locks-detail-5.7.22/sql/log_event.cc:4714#2 0x0000000001845287 在 Query_log_event::do_apply_event(this=0x7ffe7493c3b0, rli=0x676be60) 位于 /root/mysqlall/percona-server-locks-detail-5.7.22/sql/log_event.cc:4567#3 0x00000000018 Log_event:: 中的 420d4 apply_event (this=0x 7ffe7493c3b0, rli=0x676be60 ) 位于 /root/mysqlall/percona-server-locks-detail-5.7.22/sql/log_event.cc:3570#4 0x00000000018bc078 在 apply_event_and_update_pos (ptr_ev=0x7fffec094830, thd=0x7ffe74007da0, rli=0x676be60) 在 /root/mysqlall/ percona-server-locks-detail-5.7.22/sql/rpl_slave.cc:4766#5 0x00000000018bd773 在 exec_relay_log_event (thd=0x7ffe74007da0,rli=0x676be60) 在 /root/mysqlall/percon一个-server-lock s-detail-5.7.22 /sql/rpl_slave.cc:5300#6 0x00000000018c46e4 在handle_slave_sql (arg=0x6675d30) 位于/root/mysqlall/percona-server-locks-detail-5.7.22/sql/rpl_slave .cc:7543#7 0 x0000000001945620 在 pfs_spawn_thread (arg=0x7ffe7c02c6c0) 中 /root/mysqlall/percona-server-locks-detail-5.7.22/storage/perfschema/pfs.cc:2190#8 0x00007ffff7bc6aa1 中 start_线程 () from /lib64/lib pthread.so .0#9 0x00007ffff6719bcd in clone() from /lib64/libc.so.6query 当时记录了map事件修改的第一个数据。这个时间一定是Log_event::apply_event的时间。 GTID自然是最后一次提交的时间,XID EVENT也是正确的主库时间。事实上,第一次THD::set_time(header->timestamp)之后user_time是正确的,后面的逻辑就不会设置为当前时间了。内联无效 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);#ifdefHAVE_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 在显示中atch_command(thd = 0x7ffec0009c0,com_data = 0x7fffec5bdd70,command = COM_QUERY)在/ mysqldata / percona-server-locks-detail-5.7.22 / sql / sql_parse.cc:1247#2 0x00000000015c58ff在do_command(thd = 0x7ffedc0) 009c0) 位于 /mysqldata /percona-server-lock s-detail-5.7.22 /sql/sql_parse.cc:1021#3 0x000000000170e578 在 /mysqldata/percona-server-locks-detail-5.7.22/sql/conn_handler 的handle_connection (arg=0x67d01a0) /connection_handler_per_thread.cc:312#4 0x0000000001945538 在 pfs_spawn_thread (arg=0x67c9dc0) 在 /mysqldata/percona-server-locks-detail-5.7.22/storage/perfschema/pfs.cc:2190#5 0x00007ffff7bcfaa1 在 start_thread () 来自/ lib64/libpthread.so.0#6 0x00007ffff6 b37c4d 从 /lib64/libc.so.6 克隆()

2. header和query_event中timestamp的exe时间计算方法

common_header:common_header中的时间来自于命令发起的时间。以下g 是其初始化 Log_event::Log_event(THD* thd_arg, uint16 flags_arg, enum_event_cache_type cache_type_arg, enum_event_logging_typelogging_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 IMAGE, boolsculpt_use, int errcode, boolignore_cmd_internals): binary_log::Query_event( query_arg, thd_arg->catalog().str,                                                                         sp; thd_arg->thread_id(), thd_arg->variables.sql_mode ,(ulonglong)thd_arg->table_map_for_update,                                                                                                                             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 :                                                                         ::EVENT_NORMAL_LOGGING,       标头(), footer()), data_buf(0){ DBUG_EXECUTE_IF("debug_lock_before_query_log_event",          DBUG_SYNC_POINT("debug_lock.before_query_log_event", 10);); /* 保存原始线程id;我们已经知道服务器id */slave_proxy_id= thd_arg->variables.pseudo_thread_id; if (查询!= 0) is_valid_param= true; /* exec_time 计算已更改为使用与填写“thd_arg->start_time" */ struct timeval end_time; ulonglong micro_end_time= my_micro_time();//这里获取时间查询事件 my_micro_time_to_timeval(micro_end_time, &end_time); exec_time= end_time.tv_sec - thd_arg->start_time.tv_sec;//这里计算时间< / pre>

以上就是《Cascade Slave中延迟计算及查询事件Exe时间获取方法示例分析》一文的全部内容,感谢您的阅读!相信大家都有一定的了解了了解了,希望分享的内容对大家有所帮助,如果您想了解更多知识,请关注行业资讯频道!

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > 级联从机中延迟计算及查询事件exe时间获取方法实例分析

用户评论