生产系统DRDS建表报sequence已经存在问题

1、 问题描述

客户反馈生产环境系统drds创建表报错sequence已经存在,具体报错如下:

1
但是虽然执行create已经报错,但是表已经有了,并且可以正常的插入数据;

2、 问题排查

排查drds的docker节点tddl log日志发现如下的相关sequence的报错
2
3
报错主要显示还是因为sequence已经存在导致的;
但是经过check table 报错的表状态是ok的,证明表实际上不存在什么问题,可以正常使用;
经过排查后台tddl log日志,由于数据格式的问题插入数据频繁报错,发现端倪,经过咨询客户以及观察sql log日志 ,生产数据录入报错的表数据的频繁插入的;
后台有程序在不断的向amc_match_log 这张表插数据

同客户沟通的结果分析如下:
如果有程序写数据库频率很高 出现这样的报错 就可以解释的通了;
创建表之后,创建序列之前的空档,程序向表中插入数据,drds发现auto_increment字段存在,所以会自动创建序列,此时ddl的创建序列再去创建 就会出错(序列已经存在);
如果是这种场景 在建表的时候指定 if not exist就可以了

然后在测试环境使用如下的命令来模拟频繁插入数据的场景;

for i in {1..1000000};do mysql –h192.168.1.1 –uroot –ppasswd –e”insert into test(name) values(rand());”; done

测试表是test,表结构如下:

create table test(id varchar(100) not null auto_increment,name varchar(100),primary key(id)) engine=InnoDB dbpartition by hash(id) tbpartition by hash(id) tbpartitions 3;

开启两个窗口测试如下:
5
频繁的执行create和drop表的测试操作,来回执行几次就可以复现生产的报错问题;
然后根据研发提供的添加if not exists的create操作进行建表测试,不会复现报错问题;
create TABLE IF NOT EXISTS amc_match_log
6
原因:因为 if not exist会检查sequence是否存在 如果存在 不会再去创建了;

3、问题解决

使用create table if not exists tablename进行建表或者直接忽略报错也可以;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值