天天看点

生产系统DRDS建表报sequence已经存在问题1、 问题描述2、 问题排查3、问题解决

1、 问题描述

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

生产系统DRDS建表报sequence已经存在问题1、 问题描述2、 问题排查3、问题解决

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

2、 问题排查

排查drds的docker节点tddl log日志发现如下的相关sequence的报错

生产系统DRDS建表报sequence已经存在问题1、 问题描述2、 问题排查3、问题解决
生产系统DRDS建表报sequence已经存在问题1、 问题描述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;           

开启两个窗口测试如下:

生产系统DRDS建表报sequence已经存在问题1、 问题描述2、 问题排查3、问题解决

频繁的执行create和drop表的测试操作,来回执行几次就可以复现生产的报错问题;

然后根据研发提供的添加if not exists的create操作进行建表测试,不会复现报错问题;

create TABLE IF NOT EXISTS

amc_match_log

生产系统DRDS建表报sequence已经存在问题1、 问题描述2、 问题排查3、问题解决

原因:因为 if not exist会检查sequence是否存在 如果存在 不会再去创建了;

3、问题解决

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