由于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 andmask 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();}}

备库由于表无主键导致延迟相关推荐

  1. oracle dg 备库未设置convert参数导致ORA-01111,ORA-01110

    2019独角兽企业重金招聘Python工程师标准>>> 查看trace 文件: MRP0: Background Managed Standby Recovery process s ...

  2. mysql大数据表无主键_oracle转mysql 表没有主键

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  3. PostgreSQL 备库apply延迟原理分析与诊断

    标签 PostgreSQL , 物理流复制 , IO不对称 背景 开车的同学都喜欢一马平川,最好是车道很多,车很少,开起来爽. 大家想象一下,同样的车速,6车道每秒可以通过6辆车,而1车道每秒就只能通 ...

  4. [MySQL Bug]DDL操作导致备库复制中断

    ----------------- 在MySQL5.1及之前的版本中,如果有未提交的事务trx,当执行DROP/RENAME/ALTER TABLE RENAME操作时,不会被其他事务阻塞住.这会导致 ...

  5. 频发:记ADG备库日志应用延迟的一次故障处理-云和恩墨技术通讯精选

    各位亲爱的用户/读者朋友们: 为了及时共享行业案例,通告共性问题,达成知识共享和提前预防,我们整理和编辑了<云和恩墨技术通讯>(7月刊),通过对过去一段时间的知识回顾和故障归纳,以期提供有 ...

  6. Xtrabackup在线搭建备库与并行复制延迟

    mysql在线搭建备库&并行复制&备库延迟 1 读写环境准备 主库模拟压力环境 准备一个干净的主库(开undo表空间回收顺便测下) sysbench oltp_common --mys ...

  7. 备库批量查询失败的原因分析

    目前线上有一套环境是10gR2的,采用了一主两备的架构.在其中一个备库上每天凌晨会开放一个窗口运行一些批量的查询,目前使用dg broker会在指定的时间把备库置为read-only,查询完毕之后修改 ...

  8. postgresql中patroni集群备库手动还原后,hac启动日志比主库多1

    主库创建好自定义表空间 备库创好对应路径进行还原                                                                            ...

  9. oracle主备库sync模式,Oracle 探索DG备库undo工作模式

    模拟备库出现 ORA-01555 分析备库 undo 工作模式 一: 修改主库 备库 undo 表空间 1.在主库创建undo表空间(会自动同步到备库) SYS@prod>create undo ...

最新文章

  1. LINUX 下 WEBlogic集群的搭建-01
  2. ros 消息队列与缓冲区_[ROS] [笔记(1)] 一个最简单的例子:Hello Robot(消息、发布者与订阅者)...
  3. python 如何将虚拟环境的项目的所有.py文件的import导包汇总到requirements.txt文件 (pipreqs)
  4. 洛谷P2955题解(Java语言描述)
  5. mysql大项目:新闻管理系统
  6. 使用篇-基于Laravel开发博客应用系列 —— 联系我们 发送邮件 队列使用(基于数据库)...
  7. ArchSummit微课堂|蘑菇街DevOps实践及心路历程分享
  8. 服务注册中心---服务发现nacos
  9. 【数据治理】数据元、元数据、主数据、参考数据概述
  10. 《python算法教程》个人学习心得之(一):归纳、递归与归简
  11. Linux删除账号及主目录,linux 删除用户账号和主目录
  12. 重新注册所有dll文件
  13. oracle sql 取中位数,Oracle / PLSQL MEDIAN函数
  14. Excel如何对合并单元格数据进行排序
  15. Cadence 16.6 Allegro中如何设置多层板的每一层的单端信号的线宽以保证50Ω阻抗?
  16. 服务器该不该选SSD硬盘储存?
  17. 前端开发规范和开发文档的书写规范
  18. 全国计算机一级考级考纲,全国计算机等级考试一级MSOffice考试大纲
  19. 工具nmap常用命令总结
  20. $STRM 空投和 Strategy Stakers 代币分配

热门文章

  1. 开源呼叫中心软件 GOautodial 存在两个漏洞,可导致RCE
  2. 尽快更新!Chrome 修复两个已遭在野利用的 0day
  3. 说实话,我主要是冲着奖金来的
  4. 谷歌修复十多个安卓高危漏洞
  5. Cheat Engine 6.8 设置中文
  6. python内置模块~shutil
  7. 通过Nethogs查看服务器网卡流量情况
  8. 十五张思维导图带你快速学习PHP语言基础
  9. mysql5.7.1 zip版本安装记录
  10. KVM virtio bug整理