一、整體過濾規(guī)則在函數(shù)
今天收到這個需求军援,不由的稍微看了一下宠进,整體過濾規(guī)則為:
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 有響應(yīng)的控制萝风,我們可以稍微看到如下邏輯:
!(variables.binlog_format == BINLOG_FORMAT_STMT &&
!binlog_filter->db_ok(m_db.str))
而m_db則是 current db也就是登陸的db嘀掸。所以按照的登陸db進(jìn)行過濾
三、row格式:
這個過濾是在 check_table_binlog_row_based完成的规惰,判斷是binlog_filter->db_ok(table->s->db.str)睬塌,我們可以看到這個db明顯是表所在的db。而不是當(dāng)前登錄的db歇万。并且是每次open table后判斷一次而已揩晴,一旦判斷完成根據(jù)check_table_binlog_row_based的邏輯則修改了table->s->cached_row_logging_check=0,以后都會進(jìn)行判斷了贪磺,效率也會高一些硫兰。
(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