0

0

MySQL 5.1同步到5.5卡库问题一则

php中文网

php中文网

发布时间:2016-06-07 16:43:06

|

1083人浏览过

|

来源于php中文网

原创

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

今天在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,设置=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,因此只适合跳过少数卡库的命令点。如果从库卡库累积的命令点非常多,此法就不可取了。

    PicWish
    PicWish

    推荐!专业的AI抠图修图,支持格式转化

    下载
  • 用pt-slave-restart工具跳过命令点。这也是推荐的跳过命令点的方法:
  • 2.跳命令点始终只能解决一时的问题,根本上还是应修改代码逻辑,确保不出现无符号减法的溢出。 3.对DBA来说,,采用行格式复制,从根本上可以保证主从数据的一致性。毕竟跳过卡库问题是简单的,但是后续的数据修复过程却是复杂的。 参考资料


    --------------------------------------分割线 --------------------------------------

    Ubuntu 14.04下安装MySQL

    《MySQL权威指南(原书第2版)》清晰中文扫描版 PDF

    Ubuntu 14.04 LTS 安装 LNMP Nginx\PHP5 (PHP-FPM)\MySQL

    Ubuntu 14.04下搭建MySQL主从服务器

    Ubuntu 12.04 LTS 构建高可用分布式 MySQL 集群

    Ubuntu 12.04下源代码安装MySQL5.6以及Python-MySQLdb

    MySQL-5.5.38通用二进制安装

    --------------------------------------分割线 --------------------------------------

    本文永久更新链接地址:

    linux

    相关专题

    更多
    Word 字间距调整方法汇总
    Word 字间距调整方法汇总

    本专题整合了Word字间距调整方法,阅读下面的文章了解更详细操作。

    2

    2025.12.24

    任务管理器教程
    任务管理器教程

    本专题整合了任务管理器相关教程,阅读下面的文章了解更多详细操作。

    2

    2025.12.24

    AppleID格式
    AppleID格式

    本专题整合了AppleID相关内容,阅读专题下面的文章了解更多详细教程。

    0

    2025.12.24

    csgo视频观看入口合集
    csgo视频观看入口合集

    本专题整合了csgo观看入口合集,阅读下面的文章了知道更多入口地址。

    29

    2025.12.24

    yandex外贸入口合集
    yandex外贸入口合集

    本专题汇总了yandex外贸入口地址,阅读下面的文章了解更多内容。

    58

    2025.12.24

    添加脚注通用方法
    添加脚注通用方法

    本专题整合了添加脚注方法合集,阅读专题下面的文章了解更多内容。

    1

    2025.12.24

    重启电脑教程汇总
    重启电脑教程汇总

    本专题整合了重启电脑操作教程,阅读下面的文章了解更多详细教程。

    3

    2025.12.24

    纸张尺寸汇总
    纸张尺寸汇总

    本专题整合了纸张尺寸相关内容,阅读专题下面的文章了解更多内容。

    5

    2025.12.24

    Java Spring Boot 微服务实战
    Java Spring Boot 微服务实战

    本专题深入讲解 Java Spring Boot 在微服务架构中的应用,内容涵盖服务注册与发现、REST API开发、配置中心、负载均衡、熔断与限流、日志与监控。通过实际项目案例(如电商订单系统),帮助开发者掌握 从单体应用迁移到高可用微服务系统的完整流程与实战能力。

    1

    2025.12.24

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    计算机系统从应用层到底层
    计算机系统从应用层到底层

    共6课时 | 0.3万人学习

    简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信

    共1课时 | 771人学习

    Swoole系列-从0到1-新手进阶
    Swoole系列-从0到1-新手进阶

    共29课时 | 1.3万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号