March 4, 2013

备库由于表无主键导致延迟

由于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 […]