[MySQL 工具] 备库预热工具relayfetch及错误处理工具seh

今年上半年,由于线上许多实例存在主备延迟,并且经常有备库复制中断导致DBA同学需要半夜起来处理,出于这样的需求,所以写了这两个工具,不过严格来讲,seh算是relayfetch的衍生品。

两个工具都可以从如下地址checkout:

http://code.google.com/p/relay-fetch/

Relayfetch

由于在备库上(尤其是没有读写负载的备库)SQL线程是单线程的,比较悲观的情况是,需要从磁盘读取数据,然后再做DML。当数据量远大于buffer pool的大小时,这种磁盘IO开销尤为明显。

通常的作法是将binlog中的事件转换成select操作,目前社区也有很多类似的工具,不过都是只支持STATEMENT模式,如果你是基于STATEMENT模式复制的话,可以在主备产生延迟时,挑一个用。

为了不重复发明轮子,relayfetch主要用于支持row模式(只支持简单的statement模式,没做充分测试),通过解析binlog中的DELETE_ROWS_EVENT/UPDATE_ROWS_EVENT/WRITE_ROWS_EVENT,获取其中的primary key和unique key,然后转换成select语句,使用多线程执行select,默认5个线程,能够控制预热不会“走的太快”。

当然备库预热并不总是有效果的,也有一些限制:

1、如果buffer pool足够大到容纳大部分数据/热点数据的话,可能没什么效果(瓶颈不在磁盘IO)

2、需要有主键或者唯一键

3、对insert操作产生的延迟预热效果不明显,尤其是连续插入(但对存在多个唯一键(包括主键)会有不错的效果,因为按照主键顺序插入时,唯一键上的INSERT可能是随机的IO)

4、目前主要针对ROW模式预热,基于STATEMENT模式的同学请自行谷歌目前社区的预热工具

 

Seh备库错误处理工具

写这个工具的初衷是由于各种原因(复制bug,人为失误,主备切换导致数据丢失等等。。。)备库经常会出现复制中断,DUPLICATE KEY和KEY NOT FOUND错误应该是比较常见的(对应的错误码为1062和1032)

通常的处理办法是设置sql_slave_skip_counter来跳过错误,但这样明显的会产生主备数据不一致。seh不是跳过错误,而是将导致错误的数据补上。

seh通过解析binlog,找到发生错误的事件,对于找不到键的错误,将相应的记录补上。代码里面还实现了处理重复键的代码,不过没有开启(删除记录太暴力。。。。),对于重复键错误,如果是插入操作导致的,可以通过将slave_exec_mode设置为IDEMPOTENT来解决。

同样seh需要表上有主键存在,并且无法处理同时存在主键错误和唯一键冲突的情况,例如丢失的记录上如果有唯一键并且和已有记录冲突时,就会补数据失败。

有兴趣的同学可以玩一下这两个工具,有问题的话可以在google code上提交issue,或邮件我.

时间: 2024-10-29 22:41:55

[MySQL 工具] 备库预热工具relayfetch及错误处理工具seh的相关文章

备库查询导致的ORA-01110错误及修复

   最近帮助业务部门解决了一个技术问题,因为发现有数据问题需要对存在问题的数据做分析.当然一个难点就是把数据给筛选出来,当我看到他们提供的语句,在备库做了简单的数据评估之后,发现数据量比想象的要多,大概有200万条左右的数据,而业务部门手头有一个excel文件,需要和这些数据做一些比对,当然停了下筛选逻辑还蛮复杂,最开始建议他们数据量太大,使用excel还是可能出问题,但是业务部门认为应该没有太大的问题,他们会有excel中的公式等来处理,想想也有道理,就提供给了他们一个近40M的文件.   

备库中ORA-00600错误的简单修复

最近偶尔会接到一条短信,提示某个备库中出现了ORA-00600的错误.对于这个问题还真不能心存侥幸,自己带着疑问查看了一下, 这是一个一主两备的库,主库和其中的一个备库没有任何的ORA-00600的错误,只有这一个备库中偶尔会出现ORA-00600的错误. 这个问题如果放大还是很严重的,比如主库出现问题了,如果切换到这个备库,那么ORA-00600的错误就会直接转移过来,这个时候这儿备库就有点鸡肋的味道了.所以这个问题一种思路就是重新搭建备库,另外一种就是手工修复.我还是更希望通过手工修复的方式

[MySQL Patch]自动处理备库错误

转载请署名:印风 ----------------– 备库因为某些错误停止时有发生,最常见的错误就是"HA_ERR_KEY_NOT_FOUND"和 "HA_ERR_FOUND_DUPP_KEY".这既有可能是主备切换导致的,也可能是MySQL Bug导致的 通常有两种办法来处理备库错误: 1). 设置 "sql_slave_skip_counter"来忽略错误. 2).set slave_exec_mode = "idempotent&

MySQL · 捉虫动态 · 备库1206错误问题说明

问题背景 一个用户自建MySQL,出现备库复制中断的问题,报错为slave sql thread 错误,The total number of locks exceeds the lock table size. 报错代码 这个报错在代码中的抛错逻辑为: if UT_LIST_GET_LEN(buf_pool->free) + UT_LIST_GET_LEN(buf_pool->LRU) < buf_pool->curr_size / 4 文字解释是:如果buffer pool中的

网站开发中, php所扮演的角色,以及与其他语言,工具或库的关系,这个问题很重要

问题描述 网站开发中, php所扮演的角色,以及与其他语言,工具或库的关系,这个问题很重要 网站开发中, php所扮演的角色,以及与其他语言,工具或库的关系,这个问题很重要 解决方案 php是一种web脚本语言,它主要用来编写应用层.web应用层需要iis或者apache这样的web服务器去执行.只使用php其实也可以开发一个完整的服务器端程序了.如果你希望一部分业务放在客户端执行,那么需要用js脚本.如果你希望调用一些别的语言的库,或者出于性能的优化,可以用C++写dll,用php模块加载.

MySQL复制(2) 主备库都为空的情况下创建主备复制

本文适用于新安装的主库和备库,假定主备库为空,如果你是从已存在的主库复制,请转到<[MySQL] 复制(3)- 创建主备复制(从另一个服务器开始复制)> 主库的配置 主库需要打开二进制日志,并制定一个唯一的server id,my.cnf文件中增加或修改如下内容: server_id=60 log-bin = /data/mysql/log/mysql-bin 备库的配置 备库my.cnf的配置如下: server_id=61 read_only=1 log_bin = /data/mysql

怎样保证mysql备库slave只读(授权)

怎样保证mysql备库slave只读(授权) slave服务器my.cnf上配置了read-only选项,为什么还可以在slave中插入/更新数据呢? 因为是使用具有super权限的帐号连接的,改用普通帐号就不行了,也就是授权时不能指定有super或all权限

mysql主键的缺少导致备库hang

最近线上频繁的出现slave延时的情况,经排查发现为用户在删除数据的时候,由于表主键的主键的缺少,同时删除条件没有索引,或或者删除的条件过滤性极差,导致slave出现hang住,严重的影响了生产环境的稳定性,也希望通过这篇博客,来加深主键在innodb引擎中的重要性,希望用户在使用RDS,设计自己的表的时候,一定要为表加上主键,主键可以认为是innodb存储引擎的生命,下面我们就来分析一下这个案例(本案例的生产环境的binlog为row模式,对于myisam存储引擎也有同样的问题): (1).现

mysql 数据库-mysql搭主备和proxy,备库change master to的问题

问题描述 mysql搭主备和proxy,备库change master to的问题 mysql搭主备和proxy,备库change master to master_host,这里的master_host是主库的IP还是proxy的IP,跪求Mysql高人指点.