首页 > 代码库 > 【转载】备库由于表无主键导致延迟
【转载】备库由于表无主键导致延迟
摘要: 由于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(); } }
【转载】备库由于表无主键导致延迟
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。