今天在MySQL 5.1同步到5.5时遇到一则卡库问题,在从库上show slave status \G,报错如下:

Error 'BIGINT UNSIGNED value is out of range in
'(group.mg_group_var.grp_status_cnt + -(38))'' on query. Default
database: 'group'. Query: 'update mg_group_var set
grp_status_cnt=grp_status_cnt+(-38) where mgid = '302412' and
grp_status_cnt>0'

为何在主库上能执行,在从库上就会失败呢?

追查原因

在从库上,show create table 查看表结构:

*************************** 1. row ***************************
Table: mg_group_var
Create Table: CREATE TABLE mg_group_var (
mgid bigint(20) NOT NULL,
grp_status_cnt int(11) unsigned NOT NULL DEFAULT '0',
grp_member_cnt int(11) unsigned NOT NULL DEFAULT '0',
grp_apply_cnt int(6) DEFAULT NULL, 

发现grp_status_cnt 列为无符号的整数类型。 查询一下grp_status_cnt的值:

mysql> select grp_status_cnt from mg_group_var  where  mgid = '302412';
+----------------+
| grp_status_cnt |
+----------------+
|             27 |
+----------------+

27-38后得到的是负数。
官方手册中有一段话:对于无符号数,如果相减得到负数,mysql会自动转化为最大的正数。

(Subtraction between integer values, where one is of type  UNSIGNED, produces an unsigned result by default. If the  result would otherwise have been negative, it becomes the  maximum integer value)

验证一下

在5.1上执行如下语句:

mysql> SELECT CAST(0 AS UNSIGNED) - 1;
+-------------------------+
| CAST(0 AS UNSIGNED) - 1 |
+-------------------------+
|    18446744073709551615 |
+-------------------------+

但是在5.5上执行的时候就会报错:

mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '()cast(0 as unsigned) - 1)'

按照官方文档的解释,在5.1上,当相减得到负数,马上就被转化为18446744073709551615,而它超出了无符号整数的范围,所以被转化为最大的int类型的无符号数4294967295(但是在5.5上,这个转化报错,因此导致同步中断)。

(When an out-of-range value is assigned to an integer
column, MySQL stores the value representing the corresponding
endpoint of the column data type range. If you store 256 into a
TINYINT or TINYINT UNSIGNED column, MySQL stores 127 or 255,
respectively. )

回到生产数据库,在主库上,执行:

mysql> select grp_status_cnt from mg_group_var where
grp_status_cnt > 300000000 limit 3;
+----------------+
| grp_status_cnt |
+----------------+
|     4294967295 |
|     4294967295 |
|     4294967272 |
+----------------+

可以发现这种溢出的情况很多,它们其实都是从负数转化来的,这些数据从应用的角度来说,都是错误的。

解决方法

解决从库卡库问题的办法很多,常用的有如下几种:

1.跳过指定的错误代码

  • 重启mysql,设置slave_skip_errors=1069。这需要重启数据库,代价太大,所以不推荐。
  • 用watch -n与mysql命令相结合,每秒跳过一个命令点:
watch -n 1 'mysql -uroot -prootpassword -S /tmp/
mysql4389.sock -e "set global sql_slave_skip_counter=1;start slave;" '

但是watch的时间间隔最小只能到1s,因此只适合跳过少数卡库的命令点。如果从库卡库累积的命令点非常多,此法就不可取了。

  • 用pt-slave-restart工具跳过命令点。这也是推荐的跳过命令点的方法:

    • 可以指定按照错误代码匹配,例如1062,1069等;
    • 可以指定按照错误文本进行正则匹配;
    • 智能的调整从库同步状态检查的时间间隔,因此如果发现连续的卡库问题,1s内可以跳过非常多的sql语句。这些特点对于快速恢复服务是非常重要的。

2.跳命令点始终只能解决一时的问题,根本上还是应修改代码逻辑,确保不出现无符号减法的溢出。

3.对DBA来说,采用行格式复制,从根本上可以保证主从数据的一致性。毕竟跳过卡库问题是简单的,但是后续的数据修复过程却是复杂的。

MySQL 5.1同步到5.5卡库问题一则相关推荐

  1. binlog流程 mysql_小米 MySQL 数据实时同步到大数据数仓的架构与实践

    背景MySQL由于自身简单.高效.可靠的特点,成为小米内部使用最广泛的数据库,但是当数据量达到千万/亿级别的时候,MySQL的相关操作会变的非常迟缓:如果这时还有实时BI展示的需求,对于mysql来说 ...

  2. MySQL主从数据库同步延迟问题解决

    MySQL主从数据库同步延迟问题 摘要: MySQL的主从同步是一个很成熟的架构,优点为:①在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力;②在从主服务器进行备份,避免备份期间影响 ...

  3. 小米 MySQL 数据实时同步到大数据数仓的架构与实践

    背景 MySQL由于自身简单.高效.可靠的特点,成为小米内部使用最广泛的数据库,但是当数据量达到千万/亿级别的时候,MySQL的相关操作会变的非常迟缓:如果这时还有实时BI展示的需求,对于mysql来 ...

  4. MySQL数据库主从同步的3种一致性方案实现,及优劣比较

    数据主从同步的由来 互联网的很多业务,特别是在高并发的场景下,基本都是读远远大于写,如果数据库读和写的压力都同在一台主机上,这显然不太合理. 于是,把一台数据库主机分为单独的一台写主库(主要负责写操作 ...

  5. 小米技术分享:Mysql数据实时同步实践

    背景 MySQL由于自身简单.高效.可靠的特点,成为小米内部使用最广泛的数据库,但是当数据量达到千万/亿级别的时候,MySQL的相关操作会变的非常迟缓:如果这时还有实时BI展示的需求,对于mysql来 ...

  6. Mysql数据实时同步实践

    关于小米内部使用的数据库你知道多少?(文末有福利) 往期文章回顾:Flink流式计算在节省资源方面的简单分析 背景 MySQL由于自身简单.高效.可靠的特点,成为小米内部使用最广泛的数据库,但是当数据 ...

  7. mysql不同实例数据同步_两台Mysql数据库数据同步实现实例

    做开发的时候要做Mysql的数据库同步,两台安装一样的系统,都是FreeBSD5.4,安装了Apache 2.0.55和PHP 4.4.0,Mysql的版本是4.1.15,都是目前最新的版本. 1. ...

  8. mysql数据库主从同步过程详述(三)

    续mysql数据库主从同步过程详述(二) 在此说明下:在最后试验过程中,当查看从库状态的时候,IO_Running显示为no,从error_log中看到如下报错提示: 120523  0:55:31 ...

  9. Linux下MySQL数据库主从同步配置

    操作系统:CentOS 6.x 64位 MySQL数据库版本:mysql-5.5.35 MySQL主服务器:192.168.21.128 MySQL从服务器:192.168.21.129 准备篇: 说 ...

最新文章

  1. C#快速整理代码格式
  2. LeetCode 873. 最长的斐波那契子序列的长度 题目详解
  3. MYSQL 开启root远程登录权限
  4. 算法漫画:什么是 “哈夫曼树” ?
  5. jquery实现回车键触发事件
  6. NgRx createSelector 工具函数的三个类型参数
  7. [react] 如何提高组件的渲染效率呢?
  8. centos7 下 的lamp 的安装原创详细教程
  9. OPPO Reno 3 Pro细节流出:同价位最轻薄的双模5G手机
  10. php ezsql,ezSQL PHP数据库操作类库
  11. MySQL引擎详解(三)——InnoDB引擎特性
  12. 01 Django简介
  13. 【Vue实战】基于Vue的九宫格在线抽奖附源代码
  14. 中国人民大学与加拿大女王大学金融硕士项目不仅实现自我升华还能拿到闪亮文凭
  15. 使用python计算与你投缘与无缘的生肖
  16. BAT等互联网公司薪资分享
  17. java计算机毕业设计基于ssm的协同过滤算法的电影推荐系统(源代码+数据库+Lw文档)
  18. 华为云初次使用和配置安装宝塔配置mysql、Redis远程连接访问
  19. 写作论文文献导入方法
  20. python求和函数1-n_python 用for循环实现1~n求和的实例

热门文章

  1. linux atom 升级,Github更新Atom,主要集中在Windows
  2. 2019.7.25作业
  3. vim调试Shell脚本: unexpected EOF while looking for matching
  4. Python调用ansible API系列(一)获取资产信息
  5. python基础之if、while、for语句
  6. 1.5 引入解释性变量
  7. Kindeditor图片上传Controller
  8. UINavigationbar的背景修改方法集合
  9. 编译php的时候,报configure: error: mcrypt.h not found. Please reinstall libmcrypt.错误的解决办法...
  10. tslib 编译移植步骤