翼度科技»论坛 编程开发 mysql 查看内容

数据库实践丨使用MTK迁移Mysql源库后主键自增列导致数据无法插入问题

2

主题

2

帖子

6

积分

新手上路

Rank: 1

积分
6
摘要:用户使用Mogdb 2.0.1版本进行业务上线测试,发现在插入数据时,应用日志中提示primary key冲突,用户自查业务SQL没有问题,接到通知后,招手处理故障。
本文分享自华为云社区《使用MTK迁移Mysql源库后主键自增列导致数据无法插入问题》,作者:Gauss松鼠会。
故障背景

用户使用Mogdb 2.0.1版本进行业务上线测试,发现在插入数据时,应用日志中提示primary key冲突,用户自查业务SQL没有问题,接到通知后,招手处理故障。
故障描述及根源分析

通过对用户数据表的检查,发现在id列上有一个primary key,并且制定了一个序列器作为自增主键的代替。初步怀疑是id中的值,已经超过了序列器的最大值,导致了故障的发生。 分别检查序列器和表.id字段的最大值,发现果然max(id)为474,序列器最大值刚刚44。
  1. file_manage=> \d file_table
  2.                                    Table "file_manage.file_table"
  3.    Column     |            Type             |                        Modifiers                        
  4. ---------------+-----------------------------+---------------------------------------------------------
  5. id            | bigint                      | not null default nextval('file_table_id_seq'::regclass)
  6. type_id       | bigint                      |
  7. column_name   | character varying(32)       | default NULL::character varying
  8. file_id       | character varying(64)       | default NULL::character varying
  9. file_name     | character varying(100)      | default NULL::character varying
  10. category_type | integer                     | default 0
  11. pieces_id     | bigint                      |
  12. flag          | smallint                    | default (0)::smallint
  13. del_flag      | smallint                    | default (0)::smallint
  14. create_time   | timestamp without time zone | default pg_systimestamp()
  15. update_time   | timestamp without time zone | default pg_systimestamp()
  16. file_manage=> \d file_table_id_seq
  17.   Sequence "file_manage.file_table_id_seq"
  18.    Column     |  Type   |        Value        
  19. ---------------+---------+---------------------
  20. sequence_name | name    | file_table_id_seq
  21. last_value    | bigint  | 44
  22. start_value   | bigint  | 1
  23. increment_by  | bigint  | 1
  24. max_value     | bigint  | 9223372036854775807
  25. min_value     | bigint  | 1
  26. cache_value   | bigint  | 1
  27. log_cnt       | bigint  | 32
  28. is_cycled     | boolean | f
  29. is_called     | boolean | t
  30. uuid          | bigint  | 0
  31. Owned by: file_manage.file_table.id
复制代码
同时查看报错的id对应值是否在file_table表中是否存在:
  1. file_manage=> select count(*) from file_table where id=43;
  2. count
  3. -------
  4. 1
  5. (1 row)
  6. file_manage=> select count(*) from file_table where id=44;
  7. count
  8. -------
  9. 1
  10. (1 row)
复制代码
由此,基本上可以确定故障原因在于表中主键列已经保存了一定数量的值,在操作过程中,序列器并没有进行累加,导致序列器nextval已经远远小于主节列值,从而引发主键冲突。咨询用户后,用户确实使用过insert into语句为数据表插入了部分测试数据库上的数据。
故障处理流程

使用语句重新为序列器重置currval
  1. file_manage=> select setval('file_table_id_seq',(select max(id) from file_table));
  2. setval
  3. --------
  4. 474
  5. (1 row)
复制代码
通知用户重新启动应用进行测试,故障现象消失。故障总结分析本次故障的成因是通过MTK进行数据数据迁移时,如果源库是MySQL,MTK会通过判断MySQL数据表是否存在自增主键,如果存在泽辉建立一个序列器模拟MySQL自增主键效果。 但是如果在此类表上进行手动gs_dump或者insert into操作时,由于在操作过程中指定了主键列的值,并不会推搞序列器的currval,最会导致在正常的数据增删改之后,出现类似主键冲突的问题。 对应的处理办法是需要在数据插入后,手动进行序列器的currval的重置,指向当前主键最大值。
 
点击关注,第一时间了解华为云新鲜技术~

来源:https://www.cnblogs.com/huaweiyun/p/17057903.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具