MySQL复制延时排查

今天收到报警,提示从库延时,首先当然是上去查看情况,首先查看机器负载,如下:

可以看到使用cpu已经100%,io没有等待。那么查看mysql是什么情况,执行show processlist没有发现任何异常,执行show slave status查看延时,发现延时一直在增加,且卡在了某个pos点不动了,已经hang住了。这个从库没有跑任何业务的。

继续查下去,执行show engine innodb status查看一下有没有异常:

我擦,还真发现了问题,怎么会提示锁住了23张表?继续排查,根据卡住的pos点,解析binlog,发现一直在操作某张表,而且是非常简单的delete语句。查看该表发现是分区表。 刚好分了23个分区。仔细再看该表结构,发现只有普通索引,没有唯一索引,没有主键。也就解释了上面显示锁住了23张表。找到原因以后,添加唯一索引以后问题解决(添加与业务无关的自增ID做主键也可以解决。)负载下降,延时慢慢减小。哎,历史遗留下来的坑,慢慢踩吧。

总结:

对于innodb的表议用自增列做主键,在无特殊需求的情况下,建议使用与业务无关的自增ID作为主键。

InnoDB引擎表的一些关键特征:

1. InnoDB引擎表是基于B+树的索引组织表(IOT);
2. 每个表都需要有一个聚集索引(clustered index);
3. 所有的行记录都存储在B+树的叶子节点(leaf pages of the tree);
4. 基于聚集索引的增、删、改、查的效率相对是最高的;
5. 如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择器作为聚集索引;
6. 如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引;
7. 如果也没有这样的唯一索引,则InnoDB会选择内置6字节长的ROWID作为隐含的聚集索引(ROWID随着行记录的写入而主键递增,这个ROWID不像ORACLE的ROWID那样可引用,是隐含的)。

综上总结,如果InnoDB表的数据写入顺序能和B+树索引的叶子节点顺序一致的话,这时候存取效率是最高的,也就是下面这几种情况的存取效率最高:

1. 使用自增列(INT/BIGINT类型)做主键,这时候写入顺序是自增的,和B+数叶子节点分裂顺序一致;
2. 该表不指定自增列做主键,同时也没有可以被选为主键的唯一索引(上面的条件),这时候InnoDB会选择内置的ROWID作为主键,写入顺序和ROWID增长顺序一致;
除此以外,如果一个InnoDB表又没有显示主键,又没有可以被选择为主键的唯一索引,但该唯一索引可能不是递增关系时(例如字符串、UUID、多字段联合唯一索引的情况),该表的存取效率就会比较差。

参考文章:

http://17173ops.com/2014/09/14/mysql-faq-why-innodb-table-using-autoinc-int-as-pk.shtml?utm_source=tuicool

http://wubx.net/slave-delay/

时间: 2024-12-25 07:20:10

MySQL复制延时排查的相关文章

MySQL双主环境复制延时故障处理

故障现象生产中的一组MySQL双主(主库A和主库B)+Keepalived高可用单写(主库A),出现B库高延时问题.检查B库复制状态如下图1:(B库的复制状态-图1)问题分析1.和开发人员确认,这组MySQL双主每天有批量的数据导入操作,业务是网站展示前一天股票大盘指数,数据是由脚本批量导入,从而产生了复制延时.2.通过对导数据脚本分析,导数据是对一个表先进行delete后进行insert操作:股指大盘展示数据只保留一天数据,因此确认不需要保留前一天数据,修改脚本先truncate表后inser

MySQL复制异常大扫盲:快速溯源与排查错误全解

MySQL复制异常大扫盲:快速溯源与排查错误全解https://mp.weixin.qq.com/s/0Ic8BnUokyOj7m1YOrk1tA 作者介绍王松磊,现任职于UCloud,从事MySQL数据库内核研发工作,主要负责UCloud云数据库UDB的内核故障排查工作以及数据库新特性的研发工作. 复制作为MySQL原生的数据同步功能,在MySQL高可用架构中起着至关重要的作用.本文梳理了MySQL高可用产品UDB在日常运维中遇到的复制问题,并总结了当复制发生异常时,排查复制异常的方法. 一.

mysql半同步复制问题排查

1.问题背景      默认情况下,线上的mysql复制都是异步复制,因此在极端情况下,主备切换时,会有一定的概率备库比主库数据少,因此切换后,我们会通过工具进行回滚回补,确保数据不丢失.半同步复制则要求主库执行每一个事务,都要求至少一个备库成功接收后,才真正执行完成,因此可以保持主备库的强一致性.为了确保主备库数据强一致,减少数据丢失,尝试在生产环境中开启mysql的复制的半同步(semi-sync)特性.实际操作过程中,发现大部分实例半同步都可以正常运行,但有少部分实例始终开不起来(只能以普

MySQL复制常用拓扑结构详解

复制的体系结构有以下一些基本原则: (1)    每个slave只能有一个master: (2)    每个slave只能有一个唯一的服务器ID: (3)    每个master可以有很多slave: (4)    如果你设置log_slave_updates,slave可以是其它slave的master,从而扩散master的更新. MySQL不支持多主服务器复制(Multimaster Replication)--即一个slave可以有多个master.但是,通过一些简单的组合,我们却可以建

mysql复制主从集群搭建

最近搭了个主从复制,中间出了点小问题,排查搞定,记录下来 1 环境: 虚拟机: OS: centos6.5 Linux host2 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux 服务器IP 192.168.18.66 192.168.18.67 DB: mysql> select version(); +-----------+ | version() | +---

mysql进阶(二)mysql复制架构

mysql复制的优点:     1.数据分布     2.数据备份     3.负载均衡     4.提示高可用性 mysql/slave master/slave较为简单,master负责响应客户端的写请求,slave负责响应客户端的读请求 实现原理: slave在启动两个线程,i/o线程和sql线程,master启动dump线程,每当master的数据发生改变时,master就会将对应的SQL语句存储在二进制日志文件中,slave的通过i/o线程连接master的dump线程并每个一段时间就

MySQL复制介绍及搭建

MySQL复制介绍 MySQL复制就是一台MySQL服务器(slave)从另一台MySQL服务器(master)进行日志的复制然后再解析日志并应用到自身,类似Oracle中的Data Guard. MySQL复制有那些好处: 第一是解决宕机带来的数据不一致,因为MySQL复制可以实时备份数据: 第二点是减轻数据库服务器的压力,多台服务器的性能一般比单台要好.但是MySQL复制不适合大数据量,大数据量推荐使用集群. MySQL复制过程分成三步: master将改变记录到二进制日志(binary l

mysql复制(高可用架构方案的基础)

mysql复制:把一个数据库实例上所有改变复制到另外一个数据库库服务器实例的过程特点:1.没有改变就无所谓复制 ;改变是复制的根本与数据源2.所有的改变:是指可以复制全部改变,也可以复制部分改变 可以在全部改变中根据业务需求选择部分库和部分表的复制复制的场景: 1.数据库容灾 2.需求:创建一个从数据服务器,做数据的测试和分析 3.负载均衡 4.复制时高可用架构方案的基础 mysql高可用架构特点1.数据库故障的检测与排除2.主从数据库的切换3.数据的备份和保护 mysql高可用架构常用方案1.

MySQL 复制过滤器、监控维护及主从复制的读写分离

MySQL 复制过滤器.监控维护及基于SSL的主从复制 =============================================================================== 概述: 本章将主要介绍MySQL复制中如何过滤,监控维护,以及基于SSL的主从复制,具体内容如下: MySQL 复制过滤器 ·从服务器库级别过滤 MySQL 清理日志:PURGE 复制监控 ·Master ·Slave 如何确定主从节点的数据是否一致 MySQL基于SSL的主从复制(