zoukankan      html  css  js  c++  java
  • 【转载】备库由于表无主键导致延迟

    摘要: 由于ROW模式的复制已经广泛使用,但对于没有主键的表而言,如果发生大更新,在备库上会表现出极大的延迟,因为在binlog中产生的大量行记录将无法根据主键快速查找,最差的情况,需要对每条修改的记录进行全表扫描。 5.6已经解决了这个问题,可以只扫描一次表;5.5最新的版本只是在错误日志里输出了一些信...

    由于ROW模式的复制已经广泛使用,但对于没有主键的表而言,如果发生大更新,在备库上会表现出极大的延迟,因为在binlog中产生的大量行记录将无法根据主键快速查找,最差的情况,需要对每条修改的记录进行全表扫描。

    5.6已经解决了这个问题,可以只扫描一次表;5.5最新的版本只是在错误日志里输出了一些信息。

    Port 5.6的实现不太现实,因为改动太大。因此我做了些小改动,对于无主键表上的DELETE/UPDATE,转换为STATEMENT模式的binlog记录。

     

    以下是一个改动非常简单的patch,基于Percona5.5.18

     
    Index: /PS5518/branches/PS-r3633-nopk-logstmt/sql/sys_vars.cc
    ===================================================================
    --- /PS5518/branches/PS-r3633-nopk-logstmt/sql/sys_vars.cc	(revision 3639)
    +++ /PS5518/branches/PS-r3633-nopk-logstmt/sql/sys_vars.cc	(revision 3641)
    @@ -396,6 +396,13 @@
            CMD_LINE(OPT_ARG), DEFAULT(FALSE),
            NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(binlog_direct_check));
    
    +static Sys_var_mybool Sys_binlog_use_stmt_for_non_pk(
    +      "binlog_use_stmt_for_non_pk",
    +      "if a table doesn't have primary key ,then log the changes (SQLCOM_DELETE" 
    +      "and SQLCOM_UPDATE) using STATEMENT.",
    +      SESSION_VAR(binlog_use_stmt_for_non_pk),
    +      CMD_LINE(OPT_ARG), DEFAULT(FALSE));
    +
     static Sys_var_ulong Sys_bulk_insert_buff_size(
            "bulk_insert_buffer_size", "Size of tree cache used in bulk "
            "insert optimisation. Note that this is a limit per thread!",
    Index: /PS5518/branches/PS-r3633-nopk-logstmt/sql/sql_class.h
    ===================================================================
    --- /PS5518/branches/PS-r3633-nopk-logstmt/sql/sql_class.h	(revision 3639)
    +++ /PS5518/branches/PS-r3633-nopk-logstmt/sql/sql_class.h	(revision 3641)
    @@ -492,6 +492,7 @@
    
       ulong binlog_format; ///< binlog format for this thd (see enum_binlog_format)
       my_bool binlog_direct_non_trans_update;
    +  my_bool binlog_use_stmt_for_non_pk;
       my_bool sql_log_bin;
       ulong completion_type;
       ulong query_cache_type;
    Index: /PS5518/branches/PS-r3633-nopk-logstmt/sql/sql_class.cc
    ===================================================================
    --- /PS5518/branches/PS-r3633-nopk-logstmt/sql/sql_class.cc	(revision 3639)
    +++ /PS5518/branches/PS-r3633-nopk-logstmt/sql/sql_class.cc	(revision 3641)
    @@ -4495,10 +4495,14 @@
           Get the capabilities vector for all involved storage engines and
           mask out the flags for the binary log.
         */
    +    my_bool table_no_key= false;
         for (TABLE_LIST *table= tables; table; table= table->next_global)
         {
           if (table->placeholder())
             continue;
    +      
    +      if (table->table->s->primary_key >=  MAX_KEY)
    +        table_no_key= true;
    
           if (table->table->s->table_category == TABLE_CATEGORY_PERFORMANCE ||
               table->table->s->table_category == TABLE_CATEGORY_LOG)
    @@ -4680,6 +4684,13 @@
               /* log in row format! */
               set_current_stmt_binlog_format_row_if_mixed();
             }
    +        /*if there is a table without any primary key,log in stmt format*/
    +        else if (table_no_key &&
    +                 (variables.binlog_use_stmt_for_non_pk) &&
    +                 (variables.binlog_format == BINLOG_FORMAT_ROW ) &&
    +                 (lex->sql_command == SQLCOM_DELETE || 
    +                   lex->sql_command == SQLCOM_UPDATE))
    +          clear_current_stmt_binlog_format_row();
           }
         }
  • 相关阅读:
    Ilya Muromets(DP or 思维)
    2018 焦作网络赛 L Poor God Water ( AC自动机构造矩阵、BM求线性递推、手动构造矩阵、矩阵快速幂 )
    上下界的网络流模板
    计蒜客 2018南京网络赛 I Skr ( 回文树 )
    回文树 / 自动机模板
    Nowcoder 练习赛26 D xor序列 ( 线性基 )
    线性基模板
    Tarjan求强连通分量、求桥和割点模板
    Nowcoder 挑战赛23 B 游戏 ( NIM博弈、SG函数打表 )
    第二类斯特林数模板
  • 原文地址:https://www.cnblogs.com/conanwang/p/5848025.html
Copyright © 2011-2022 走看看