FAQ系列 | 列类型被自动修改导致复制失败

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: FAQ系列 | 列类型被自动修改导致复制失败

0、导读

在复制环境中,有个表的列类型总是被修改,导致复制进程报错停止

1、问题描述

问题发生在朋友的数据库上,做了主从复制,其中某表有一列类型是INT,但是该表上的INSERT事件在BINLOG中却总被记录为MEDIUMINT类型,导致这个事件在SLAVE上执行失败。

相关现场信息见下:

MySQL版本:官方5.5.版本。

表DDL定义:

CREATE TABLE `t` (

 `userid` int(10) unsigned NOT NULL DEFAULT 0,


这个表上的INSERT事件在BINLOG中的记录:

### INSERT INTO `imysql`.`t`

### SET

###   @1=207 /* MEDIUMINT meta=0 nullable=0 is_null=0 */


我们看到BINLOG中,这个列类型显示为MEDIUMINT,这个事件在SLAVE上就会报告下面的错误,导致SLAVE无法继续复制:

Column 0 of table 'imysql.t' cannot be converted from type 'mediumint' to type 'int(10) unsigned

又是一个看起来很奇葩的案例。

2、原因分析

经过沟通排查,了解到他们的业务模式有点特殊,是从一个旧的空表中复制表结构生成每天日志表,然后再将当天的日志写入该表。也就是大概做法是:

1、创建每天日志表

CREATE TABLE t SELECT t_orig;


2、写入日志

INSERT INTO t SELECT * FROM t_orig;


其实问题就出在每天创建新表的过程中,源表结构像是这样的:

CREATE TABLE `t_orig` (

 `userid` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,


从源表复制到新表之后,又执行了ALTER TABLE,把 userid 列类型从 MEDIUMINT 改为 INT,创建存储过程等其他工作。

生成新表后,再写入生成的日志。但是呢,写入日志却又是采用INSERT...SELECT的用法。一般情况下当然没问题,但这个例子中,源表、目标表的 userid 列类型恰好不一样(源是MEDIUMINT,目标是INT),结果导致在 binglog 中记录event时,将 userid 列类型强制转换为 MEDIUMINT 了。这个 INSERT 在 MASTER 端可以正常执行完毕,但却引发了 SLAVE 检测到二者数据类型不一致,写入失败,复制异常中断。

3、问题建议

遇到这种案例也真的是醉了,从源表每天克隆一个新表做法没问题,采用INSERT...SELECT也没问题,但为啥要源表和新表使用不同数据类型呢,直接把源表的也改成INT不就行了吗,只能说某些人懒得不像样了。

4、类似案例

FAQ系列 | 写新数据时某列值总是被自动修改

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
6月前
vxe-table表格校验失败后保持可以编辑状态
vxe-table表格校验失败后保持可以编辑状态
vxe-table表格校验失败后保持可以编辑状态
|
6月前
|
前端开发
Antd中Table列表行默认包含修改及删除功能的封装
Antd中Table列表行默认包含修改及删除功能的封装
155 0
|
10天前
|
XML 数据库 数据格式
数据库 校验名称唯一性,用于新增和修改功能
数据库 校验名称唯一性,用于新增和修改功能
27 1
|
4月前
|
DataWorks 数据管理 大数据
DataWorks操作报错合集之表中新增字段,设置定时任务重新发布,报错:缺失字段,是什么情况
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
6月前
|
SQL Java 数据库
dts在数据迁移过程中,出现“无效的表或视图名”错误
dts在数据迁移过程中,如果出现“无效的表或视图名”错误
566 6
|
SQL 关系型数据库 MySQL
一个索引创建错误引发的思考
同事反馈说某个 MySQL 数据库创建索引提示错误,模拟报错如下: CREATE INDEX t_reg_code_idx USING BTREE ON t(reg_code) BLOB/TEXT column 'reg_code' used in key specification without a key length 从该提示可知,给 T 表的 reg_code 列创建一个 BTREE 索引,而这个 reg_code 列的字段类型是 BLOB 或 TEXT。 需要在键的说明中有长度定义,这是什么意思?
99 0
|
SQL 数据库 数据库管理
​数据库之定义删除修改基本表
​数据库之定义删除修改基本表
115 0
【Excel自动化办公Part3】:工作表的创建、删除、复制和修改名称,冻结窗格,添加筛选
【Excel自动化办公Part3】:工作表的创建、删除、复制和修改名称,冻结窗格,添加筛选
162 0
【Excel自动化办公Part3】:工作表的创建、删除、复制和修改名称,冻结窗格,添加筛选
|
缓存 索引
ES的删除和更新,旧数据到低是如何处理的?
根据ES的读写入原理,大家都知道ES写入时每秒从内存缓冲区(memory buffer)生成小的segment,将其递交给系统缓存(OS filesystem cache)中,后台会定期的对这些小的segment 合并成一个大的segment段
376 0
ES的删除和更新,旧数据到低是如何处理的?
|
存储 SQL 关系型数据库
FAQ系列 | 列类型被自动修改导致复制失败
FAQ系列 | 列类型被自动修改导致复制失败
112 0