這篇文章主要為大家展示了“級(jí)聯(lián)slave中延遲計(jì)算和query event exe time獲取方法的示例分析”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“級(jí)聯(lián)slave中延遲計(jì)算和query event exe time獲取方法的示例分析”這篇文章吧。
成都創(chuàng)新互聯(lián)公司是一家專業(yè)從事網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、網(wǎng)頁設(shè)計(jì)的品牌網(wǎng)絡(luò)公司。如今是成都地區(qū)具影響力的網(wǎng)站設(shè)計(jì)公司,作為專業(yè)的成都網(wǎng)站建設(shè)公司,成都創(chuàng)新互聯(lián)公司依托強(qiáng)大的技術(shù)實(shí)力、以及多年的網(wǎng)站運(yùn)營經(jīng)驗(yàn),為您提供專業(yè)的成都網(wǎng)站建設(shè)、營銷型網(wǎng)站建設(shè)及網(wǎng)站設(shè)計(jì)開發(fā)服務(wù)!
邏輯如下:
級(jí)聯(lián)中的Event依然是主庫的時(shí)間,因此其延遲還是相對(duì)主庫而言。 雖然apply_event_and_update_pos函數(shù)中由設(shè)置為當(dāng)前時(shí)間thd->set_time() 但是最終設(shè)置還是在Query_log_event::do_apply_event和Query_log_event::do_apply_event中的 的 THD::set_time (this=0x7ffe74007da0, t=0x7ffe74007828) 因?yàn)橹挥凶隽藬?shù)據(jù)庫修改才會(huì)觸發(fā)記錄Event的工作 設(shè)個(gè)設(shè)置就是設(shè)置為event header的timestamp,因此還是級(jí)聯(lián)中記錄的Event的時(shí)間還是 主庫的時(shí)間,計(jì)算延遲就是相對(duì)主庫的時(shí)間。 棧幀 #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.6 query map event在修改的第一條數(shù)據(jù) 記錄時(shí)間 這個(gè)時(shí)間肯定是Log_event::apply_event的時(shí)間, GTID自然是在最后commit的時(shí)候 ,XID EVENT也是正確的主庫時(shí)間。 實(shí)際上第一個(gè)THD::set_time(header->timestamp)后user_time 就正確,下面的邏輯不會(huì)設(shè)置為當(dāng)前時(shí)間。 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的時(shí)候不會(huì)設(shè)置user_time user_time為0,因此設(shè)置為當(dāng)前時(shí)間。 #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
common_header:中的時(shí)間來自 命令發(fā)起的時(shí)間。下面是其初始化 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調(diào)用時(shí)間 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();//這里獲取時(shí)間 query event my_micro_time_to_timeval(micro_end_time, &end_time); exec_time= end_time.tv_sec - thd_arg->start_time.tv_sec;//這里計(jì)算時(shí)間
以上是“級(jí)聯(lián)slave中延遲計(jì)算和query event exe time獲取方法的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
標(biāo)題名稱:級(jí)聯(lián)slave中延遲計(jì)算和queryeventexetime獲取方法的示例分析
URL鏈接:http://bm7419.com/article14/iiopge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊、網(wǎng)站策劃、網(wǎng)頁設(shè)計(jì)公司、網(wǎng)站排名、網(wǎng)站導(dǎo)航、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)