一、整体过滤规则在函数
今天收到这个需求,不由的稍微看了一下,整体过滤规则为:
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