一、整体过滤规则在函数
今天收到这个需求,不由的稍微看了一下,整体过滤规则为:
Rpl_filter::db_ok
二、语句模式:
#0 Rpl_filter::db_ok (this=0x2f3ba10, db=0x0) at /opt/percona-server-locks-detail-5.7.22/sql/rpl_filter.cc:165 #1 0x000000000181a00f in THD::decide_logging_format (this=0x7fff90000b70, tables=0x7fff90006770) at /opt/percona-server-locks-detail-5.7.22/sql/binlog.cc:10844 #2 0x00000000014e5bde in lock_tables (thd=0x7fff90000b70, tables=0x7fff90006770, count=1, flags=0) at /opt/percona-server-locks-detail-5.7.22/sql/sql_base.cc:6850 #3 0x000000000178c5a4 in Sql_cmd_insert::mysql_insert (this=0x7fff90006cf8, thd=0x7fff90000b70, table_list=0x7fff90006770) at /opt/percona-server-locks-detail-5.7.22/sql/sql_insert.cc:617 #4 0x0000000001793615 in Sql_cmd_insert::execute (this=0x7fff90006cf8, thd=0x7fff90000b70) at /opt/percona-server-locks-detail-5.7.22/sql/sql_insert.cc:3121 #5 0x000000000156bc46 in mysql_execute_command (thd=0x7fff90000b70, first_level=true) at /opt/percona-server-locks-detail-5.7.22/sql/sql_parse.cc:3746 #6 0x0000000001571bed in mysql_parse (thd=0x7fff90000b70, parser_state=0x7fffec14e5b0) at /opt/percona-server-locks-detail-5.7.22/sql/sql_parse.cc:5901 #7 0x000000000156673d in dispatch_command (thd=0x7fff90000b70, com_data=0x7fffec14ed90, command=COM_QUERY) at /opt/percona-server-locks-detail-5.7.22/sql/sql_parse.cc:1490 #8 0x00000000015655c5 in do_command (thd=0x7fff90000b70) at /opt/percona-server-locks-detail-5.7.22/sql/sql_parse.cc:1021 #9 0x00000000016a635c in handle_connection (arg=0x3bc97f0) at /opt/percona-server-locks-detail-5.7.22/sql/conn_handler/connection_handler_per_thread.cc:312 #10 0x00000000018ce0ca in pfs_spawn_thread (arg=0x4001e00) at /opt/percona-server-locks-detail-5.7.22/storage/perfschema/pfs.cc:2190 #11 0x00007ffff7bc6ea5 in start_thread () from /lib64/libpthread.so.0 #12 0x00007ffff66748dd in clone () from /lib64/libc.so.6
复制
Breakpoint 1, Rpl_filter::db_ok (this=0x2f3ba10, db=0x0) at /opt/percona-server-locks-detail-5.7.22/sql/rpl_filter.cc:165 165 DBUG_ENTER("Rpl_filter::db_ok"); (gdb) bt #0 Rpl_filter::db_ok (this=0x2f3ba10, db=0x0) at /opt/percona-server-locks-detail-5.7.22/sql/rpl_filter.cc:165 #1 0x0000000001812d57 in MYSQL_BIN_LOG::write_event (this=0x2dc09e0 <mysql_bin_log>, event_info=0x7fffec14c0f0) at /opt/percona-server-locks-detail-5.7.22/sql/binlog.cc:7621 #2 0x000000000181d87a in THD::binlog_query (this=0x7fff90000b70, qtype=THD::ROW_QUERY_TYPE, query_arg=0x7fff90005bf0 "insert into test.tu10 values(10)", query_len=32, is_trans=true, direct=false, suppress_use=false, errcode=0) at /opt/percona-server-locks-detail-5.7.22/sql/binlog.cc:12437 #3 0x000000000178d046 in Sql_cmd_insert::mysql_insert (this=0x7fff90006cf8, thd=0x7fff90000b70, table_list=0x7fff90006770) at /opt/percona-server-locks-detail-5.7.22/sql/sql_insert.cc:866 #4 0x0000000001793615 in Sql_cmd_insert::execute (this=0x7fff90006cf8, thd=0x7fff90000b70) at /opt/percona-server-locks-detail-5.7.22/sql/sql_insert.cc:3121 #5 0x000000000156bc46 in mysql_execute_command (thd=0x7fff90000b70, first_level=true) at /opt/percona-server-locks-detail-5.7.22/sql/sql_parse.cc:3746 #6 0x0000000001571bed in mysql_parse (thd=0x7fff90000b70, parser_state=0x7fffec14e5b0) at /opt/percona-server-locks-detail-5.7.22/sql/sql_parse.cc:5901 #7 0x000000000156673d in dispatch_command (thd=0x7fff90000b70, com_data=0x7fffec14ed90, command=COM_QUERY) at /opt/percona-server-locks-detail-5.7.22/sql/sql_parse.cc:1490 #8 0x00000000015655c5 in do_command (thd=0x7fff90000b70) at /opt/percona-server-locks-detail-5.7.22/sql/sql_parse.cc:1021 #9 0x00000000016a635c in handle_connection (arg=0x3bc97f0) at /opt/percona-server-locks-detail-5.7.22/sql/conn_handler/connection_handler_per_thread.cc:312 #10 0x00000000018ce0ca in pfs_spawn_thread (arg=0x4001e00) at /opt/percona-server-locks-detail-5.7.22/storage/perfschema/pfs.cc:2190 #11 0x00007ffff7bc6ea5 in start_thread () from /lib64/libpthrea
复制
这里THD::decide_logging_format 有响应的控制,我们可以稍微看到如下逻辑:
!(variables.binlog_format == BINLOG_FORMAT_STMT && !binlog_filter->db_ok(m_db.str))
复制
而m_db则是 current db也就是登陆的db。所以按照的登陆db进行过滤
三、row格式:
这个过滤是在 check_table_binlog_row_based完成的,判断是binlog_filter->db_ok(table->s->db.str),我们可以看到这个db明显是表所在的db。而不是当前登录的db。并且是每次open table后判断一次而已,一旦判断完成根据check_table_binlog_row_based的逻辑则修改了table->s->cached_row_logging_check=0,以后都会进行判断了,效率也会高一些。
(gdb) bt #0 Rpl_filter::db_ok (this=0x2f3ba10, db=0x7fff9000fc08 "test") at /opt/percona-server-locks-detail-5.7.22/sql/rpl_filter.cc:165 #1 0x0000000000f634ec in check_table_binlog_row_based (thd=0x7fff90000b70, table=0x7fff90010820) at /opt/percona-server-locks-detail-5.7.22/sql/handler.cc:8177 #2 0x0000000000f638b3 in binlog_log_row (table=0x7fff90010820, before_record=0x0, after_record=0x7fff90011720 "\375\n", log_func=0xf692d4 <Write_rows_log_event::binlog_row_logging_function(THD*, TABLE*, bool, unsigned char const*, unsigned char const*)>) at /opt/percona-server-locks-detail-5.7.22/sql/handler.cc:8288 #3 0x0000000000f6428e in handler::ha_write_row (this=0x7fff900111e0, buf=0x7fff90011720 "\375\n") at /opt/percona-server-locks-detail-5.7.22/sql/handler.cc:8473 #4 0x000000000178fb3e in write_record (thd=0x7fff90000b70, table=0x7fff90010820, info=0x7fffec14d000, update=0x7fffec14d080) at /opt/percona-server-locks-detail-5.7.22/sql/sql_insert.cc:1881 #5 0x000000000178cca0 in Sql_cmd_insert::mysql_insert (this=0x7fff90006cf8, thd=0x7fff90000b70, table_list=0x7fff90006770) at /opt/percona-server-locks-detail-5.7.22/sql/sql_insert.cc:773 #6 0x0000000001793615 in Sql_cmd_insert::execute (this=0x7fff90006cf8, thd=0x7fff90000b70) at /opt/percona-server-locks-detail-5.7.22/sql/sql_insert.cc:3121 #7 0x000000000156bc46 in mysql_execute_command (thd=0x7fff90000b70, first_level=true) at /opt/percona-server-locks-detail-5.7.22/sql/sql_parse.cc:3746 #8 0x0000000001571bed in mysql_parse (thd=0x7fff90000b70, parser_state=0x7fffec14e5b0) at /opt/percona-server-locks-detail-5.7.22/sql/sql_parse.cc:5901 #9 0x000000000156673d in dispatch_command (thd=0x7fff90000b70, com_data=0x7fffec14ed90, command=COM_QUERY) at /opt/percona-server-locks-detail-5.7.22/sql/sql_parse.cc:1490 #10 0x00000000015655c5 in do_command (thd=0x7fff90000b70) at /opt/percona-server-locks-detail-5.7.22/sql/sql_parse.cc:1021 #11 0x00000000016a635c in handle_connection (arg=0x3bc97f0) at /opt/percona-server-locks-detail-5.7.22/sql/conn_handler/connection_handler_per_thread.cc:312 #12 0x00000000018ce0ca in pfs_spawn_thread (arg=0x4001e00) at /opt/percona-server-locks-detail-5.7.22/storage/perfschema/pfs.cc:2190 #13 0x00007ffff7bc6ea5 in start_thread () from /lib64/libpthread.so.0 #14 0x00007ffff66748dd in clone () from /lib64/libc.so.6
复制
链接:https://www.jianshu.com/p/83f91b1ab243
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【MySQL 30周年庆】MySQL 8.0 OCP考试限时免费!教你免费领考券
墨天轮小教习
3066次阅读
2025-04-25 18:53:11
MySQL 30 周年庆!MySQL 8.4 认证免费考!这次是认真的。。。
严少安
863次阅读
2025-04-25 15:30:58
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
509次阅读
2025-04-17 17:02:24
MySQL 9.3 正式 GA,我却大失所望,新特性亮点与隐忧并存?
JiekeXu
444次阅读
2025-04-15 23:49:58
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
381次阅读
2025-04-15 14:48:05
MySQL 8.0 OCP 1Z0-908 考试解析指南(二)
JiekeXu
317次阅读
2025-04-30 17:37:37
SQL优化 - explain查看SQL执行计划(下)
金同学
288次阅读
2025-05-06 14:40:00
记录MySQL数据库的一些奇怪的迁移需求!
陈举超
285次阅读
2025-04-15 15:27:53
MySQL 8.0 OCP 1Z0-908 考试题解析指南
青年数据库学习互助会
273次阅读
2025-04-30 12:17:54
MySQL 30 周年庆!MySQL 8.4 认证免费考!这次是认真的。。。
数据库运维之道
271次阅读
2025-04-28 11:01:25