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

摘要:用户使用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。

file_manage=> \d file_table
                                   Table "file_manage.file_table"
   Column     |            Type             |                        Modifiers                        
---------------+-----------------------------+---------------------------------------------------------
id            | bigint                      | not null default nextval('file_table_id_seq'::regclass)
type_id       | bigint                      | 
column_name   | character varying(32)       | default NULL::character varying
file_id       | character varying(64)       | default NULL::character varying
file_name     | character varying(100)      | default NULL::character varying
category_type | integer                     | default 0
pieces_id     | bigint                      | 
flag          | smallint                    | default (0)::smallint
del_flag      | smallint                    | default (0)::smallint
create_time   | timestamp without time zone | default pg_systimestamp()
update_time   | timestamp without time zone | default pg_systimestamp()
file_manage=> \d file_table_id_seq
  Sequence "file_manage.file_table_id_seq"
   Column     |  Type   |        Value        
---------------+---------+---------------------
sequence_name | name    | file_table_id_seq
last_value    | bigint  | 44
start_value   | bigint  | 1
increment_by  | bigint  | 1
max_value     | bigint  | 9223372036854775807
min_value     | bigint  | 1
cache_value   | bigint  | 1
log_cnt       | bigint  | 32
is_cycled     | boolean | f
is_called     | boolean | t
uuid          | bigint  | 0
Owned by: file_manage.file_table.id

同时查看报错的id对应值是否在file_table表中是否存在:

file_manage=> select count(*) from file_table where id=43;
count 
-------
 1
(1 row)
file_manage=> select count(*) from file_table where id=44;
count 
-------
 1
(1 row)

由此,基本上可以确定故障原因在于表中主键列已经保存了一定数量的值,在操作过程中,序列器并没有进行累加,导致序列器nextval已经远远小于主节列值,从而引发主键冲突。咨询用户后,用户确实使用过insert into语句为数据表插入了部分测试数据库上的数据。

故障处理流程

使用语句重新为序列器重置currval

file_manage=> select setval('file_table_id_seq',(select max(id) from file_table));
setval 
--------
 474
(1 row)

通知用户重新启动应用进行测试,故障现象消失。故障总结分析本次故障的成因是通过MTK进行数据数据迁移时,如果源库是MySQL,MTK会通过判断MySQL数据表是否存在自增主键,如果存在泽辉建立一个序列器模拟MySQL自增主键效果。 但是如果在此类表上进行手动gs_dump或者insert into操作时,由于在操作过程中指定了主键列的值,并不会推搞序列器的currval,最会导致在正常的数据增删改之后,出现类似主键冲突的问题。 对应的处理办法是需要在数据插入后,手动进行序列器的currval的重置,指向当前主键最大值。

 

点击关注,第一时间了解华为云新鲜技术~

本文转载于网络 如有侵权请联系删除

相关文章

  • 二进制补码-反码-原码「建议收藏」

    大家好,又见面了,我是你们的朋友全栈君。最近学习java基础语法的时候,对其基本数据结构中的二进制位数与十进制大小间的转换产生了疑惑,想起学习IP地址的时候也貌似产生了相同的困惑,所以干脆总结一下,权当学习及备忘了。在计算机内,定点数有3种表示法:原码、反码和补码 原码:就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。 反码:表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。 补码:表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。首先需要明确是java中是用补码表示二进制数,补码的最高位是符号位,最高位为“0”表示正数,最高位为“1”表示负数。 正数补码为其本身; 负数补码为其绝对值各位取反加1;(这里还记得“若干年”前C语言老师说的一句“各位取反,末位加一”。。。)例如: +21,其二进制表示形式是00010101,则其补码同样为00010101 -21,按照概念其绝对值为00010101,各位取反为11101010,再加1为11101011,即-21的二进制表示形式为11101011步骤:

  • 自定义注解3-组合注解

        组合注解用处很多,只是我们有时没注意而已,比如RestController,PostMapping,GetMapping等。他们的意义在于将多个注解组合在一起,写一个注解就够了。定义组合注解    本节目的在于,组合Cacheable注解,将它的cacheNames写成默认的default(想想第一节最后的讨论)。@Target({ElementType.METHOD,ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Cacheable(cacheNames="default") public@interfaceInterest{ Stringkey(); Stringunless(); }复制    其实以上代码就完成了注解组合,你在一个方法上夹Interest注解就相当于加了Cacheable注解。小技巧    以上代码虽然完成了组合,但是你会发现你用spel写key或者unless时。没有提示,也没有高光。@Target({ElementType.METHOD,ElementType.T

  • iOS开发--UIApplication与UIApplication的Delegate

    UIApplication1.UIApplication—是应用程序的象征,每个应用都是UIApplication对象,而且是单例单例通过:share开头 [UIApplicationsharedApplication]2.UIApplication的常用属性应用右上角的数字@property(nonatomic)NSIntegerapplicationIconBadgeNumber复制设置联网指示器的可见性@property(nonatomic,getter=isNetworkActivityIndicatorVisible)BOOLnetworkActivityIndicatorVisible复制3.UIApplication一般用来做一些应用级别的操作(App的提示框,联网状态,打电话,打开网页)App的提示框(在iOS8-之前没有这个直接设置数字提醒就可以)判断版本Paste_Image.png设置APP提醒数字Paste_Image.pngUIApplication一联网状态Paste_Image.pngUIApplication一打开网页(在button中打开)Paste_

  • java中的接口概略

    接口是Java中的很重要的一个知识点,首先我们要初步了解从生活中了解“接口”的概念,什么是接口?1.生活中的接口生活中比较常见的接口:USB接口,国标插座,Type-C,3.5MM,ARJ45,Lighting接口,HDMI,VGA,SATA,M.2,DisplayPort,雷电口,PCI-E这些接口有什么作用? USB接口USB-A 1.鼠标连接,键盘连接,声卡连接,麦克风,摄像头,补光灯,U盘,移动硬盘 2.规范,都是USB设备 3.设备本身决定了,要做什么事情。2.Java中接口使用格式: interface接口名{ 成员变量 成员方法 }类【遵从】接口 implements class类名implements接口{}接口中成员变量和成员方法缺省属性原因从生活角度USB接口规定了尺寸和连接方式,但是该接口做什么内容,是由设备决定的!!! 尺寸是固定==>成员变量缺省属性是publicstaticfinal设备做什么事情,不管但是规定连接方式==>成员方法,需要设备自己完成 缺省属性publicabstract修饰3.接口使用总结接口中的 成员变量缺省属性publics

  • Cisco路由器之IPSec 虚拟专用网(内附配置案例)

    一、虚拟专用网的定义 虚拟专用网就是在两个网络实体之间建立的一种受保护的连接,这两个实体可以通过点到点的链路直接相连,但通常情况下他们会相隔较远的距离。对于定义中提到的“受保护”一词,可以从以下几个方面理解:通过使用加密技术防止数据被窃听。通过数据完整性验证防止数据被破坏、篡改。通过认证机制实现通信方身份确认,来防止通信数据被截获和回放。此外,虚拟专用网技术还定义了以下功能:何种流量需要被保护。数据被保护的机制。数据的封装过程。实际生产环境中的虚拟专用网解决方案不一定包含上面所有功能,还要由具体的环境需求和实现方式决定,而且很多企业可能采用不止一种的虚拟专用网解决方案。 二、虚拟专用网的连接模式 虚拟专用网的连接模式有两种:传输模式和隧道模式。(1)传输模式: 在整个虚拟专用网的传输过程中,IP包头并没有被封装进去,这就意味着从源端的数据始终使用原有的IP地址进行通信。而传输的实际数据载荷被封装在虚拟专用网报文中,对大多数虚拟专用网传输而言,虚拟专用网的报文封装过程就是数据的加密过程,因此,第三者无法破解数据内容,但却可以清晰的知道通信双方的地址信息。 由于传输模式封装结构相对简单,

  • 7天学会腾讯云服务器建站(二) – 学会使用SSH工具一键安装宝塔面板

    我们在上一篇《7天学会腾讯云服务器建站(一)–腾讯云服务器选择与系统安装》文章中有学到如何购买腾讯云服务器,以及安装系统。商家支持可以安装Linux和Windows系统,一般我们在做网站的时候大部分是PHP+MYSQL程序,也有少部分是ASP程序或者有需要在WINDOWS界面操作软件的。所以,如果我们用来做网站程序是PHP+MYSQL居多的,会选择LiNUX系统,且这里我建议选择CENTOS7.x版本,因为在这篇文章中我需要安装WEB系统环境,没错,我们要开始建站了。在操作下面一步之前,看看我们购买的腾讯云是是系统。确保是CentOS7+版本。在安装完毕系统知道,你还知道自己服务器的IP地址吗?不知道赶紧去服务器列表中看,以及默认的服务器账户是root,密码是你自己设置的密码。第一、学习SSH工具的使用在上一篇文章最后,小编有告诉大家预习XSHELL软件如何使用,这里我就不多介绍。下载软件和安装你如果还不会的话,那肯定得多花点时间。新建会话,直接输入我们服务器名称,这个随意。主要是IP地址。端口是默认22.然后是腾讯云服务器用户名root,密码是我们自己当初安装系统时候设置的。我们就可

  • 快速入门系列--CLR--01基本概念

    在.NET平台用C#这么久,自然会发现其版本很多,相应的概念也会很多,常常都是萌萌哒。而在实际工作中经常会遇到需要配置dll版本号,公钥token等场景,因而对C#、NET、CLR、框架类型等基础概念有个大略的了解有很大必要性。当涉及到程序集版本时,注意查看全局程序集缓存GAC(GlobalAssemblyCache),路径为c:\windows\assembly,还有几个相似的.netframework路径,同时可以使用ILDisassembler(x64)查看DLL中所引用的外部库信息。C#特性一览 C#1.0,foreach循环支持自动Dispose等小特性。C#2.0,主要特性包括泛型、可空类型、匿名方法与委托的增强、迭代块。小特性有分部类型、静态类、包含不同访问修饰符的取值和赋值方法、命名空间别名、pragma指令以及固定大小的缓冲器。C#3.0,主要特性就是LINQ了,包括:Lambda表达式、表达式树、扩展方法。其他特性包括:自动属性、数组和局部变量的隐式类型、对象和集合的初始化程序、匿名类型。C#4.0,主要集中于提高互操作性的动态类型。小特性包括命名实参、可选参数、更

  • 腾讯云数据安全中心数据安全能力

    数据安全审计登录数据安全中心控制台,在左侧导航栏中,单击数据安全能力>数据安全审计,即跳转到数据安全审计控制台。 堡垒机登录数据安全中心控制台,在左侧导航栏中,单击数据安全能力>堡垒机,即跳转到堡垒机控制台。 数据脱敏登录数据安全中心控制台,在左侧导航栏中,单击数据安全能力>数据脱敏,即跳转到数据脱敏控制台。

  • Realtime Data Processing at Facebook

    概要 这篇论文发表于2016年,主要是介绍Facebook内部的流式计算平台的设计与思考,对于流式计算的关键特性的实现选型上进行深度对比分析。 流式计算系统5个衡量指标 文中提到有5个重要的考量部分 易用性。用户使用什么语言来开发,例如SQL,C++,Java,用户开发,测试,发布一个应用需要花费多久? 性能。时延需要达到什么级别?例如毫秒级,秒级,分钟级?吞吐量需要达到多少?在这一点上Facebook设计的流处理系统基本是为了应对秒级的延迟,这是一个大的前提 容错处理。什么样的故障能够自动容错处理?以及在容错处理时对数据是怎么样的语义,系统如何来存储和恢复内存的状态? 可扩展性。数据是否可以被切分来并行化处理?是否能够回刷老数据进行处理,系统对于数据分区的变化的调整的难易程度 正确性。是否需要提供ACID的保障 流式计算系统5个设计维度 不同的维度对流式计算系统的不同评价维度所产生的影响 Languageparadigm 语言范式通常的选择有以下几种 Declarative。例如SQL语言,SQL以其简单性和声明式著称,开发起来很快,但是SQL的一大缺点就是表达力偏弱,无法描

  • Kafka 博文索引

    博文索引 KafkaBroker简析 KafkaConsumer简析 KafkaProducer简析 KafkaMirrorMaker的不足以及一些改进 Kafka简介 数据是系统的燃料,系统的效率高低很大程度取决于数据流转是否及时: 将数据从生产源头移动到分析处理终端,这个过程完成得越快,组织的反应就越敏捷。 移动工具越是简单易用,花费在数据移动上的精力就越少,开发者就越能专注于核心业务。 Kafka是一款为数据整合而生的基于发布与订阅的消息系统MessagingSystem,方便用户在多系统间实现松散耦合的异步数据传输。 Kafka为消息提供顺序持久化保存,可按需读取。并通过集群部署与冗余副本保障数据安全并提供性能伸缩能力。 核心概念 消息message:最基本的数据单元,由字节数组组成。消息可以有一个可选的键key,键也是一个字节数组。 主题topic:消息通过主题进行分类。主题就好比数据库的表,或者文件系统里的文件夹。 分区partition:一个提交日志,主题可以被分为若干个分区。消息以追加的方式写入分区尾部,然后以先入先出的顺序读取。 偏移o

  • 目前深度学习的瓶颈认识

    目前深度学习的瓶颈认识   深度学习算是爆炸了最近年,主要缘由据说是算力爆炸和数据爆炸。 但是在我看来,成也萧何败萧何,这两个就是瓶颈。 好吧,至少是我的炼丹瓶颈。 没有良好的gpu和数据,做深度学习真是一言难尽。  

  • Git常用命令

    Git版本控制下的工程区域只有三种1.版本库(Repository)在工作区中有一个隐藏目录.git,这个文件夹就是Git的版本库,里面存放了Git用来管理该工程的所有版本数据,也可以叫本地仓库2.工作区(WorkingDirectory)日常工作的代码文件或者文档所在的文件夹3.暂存区(stage)一般存放在工程根目录.gitindex文件中所以我们也可以把暂存区叫作索引(index) Git版本控制下的文件状态只有三种 1.已提交(committed)该文件已经被安全地保存在本地数据库中了2.已修改(modified)修改了某个文件,但还没有提交保存3.已暂存(staged)把已修改的文件放在下次提交时要保存的清单中 工程准备gitinit用于在本地目录下新建git项目仓库。执行gitinit后,当前目录下自动生成一个名为.git的目录,这代表当前项目所在目录已纳入Git管理。.git目录下存放着本项目的Git版本库下图可知,Git仓库下的.git目录默认是不可见的,有一定程度上是出于防止用户误操作考虑 gitclone用于克隆远端工程到本地磁盘本地命令行执行gitclone[U

  • 计算机网络: IP地址,子网掩码,网段表示法,默认网关,DNS服务器详解

    楔子:   以Windows系统中IP地址设置界面为参考(如图1),IP地址,子网掩码,默认网关和DNS服务器,这些都是什么意思呢?          学习IP地址的相关知识时还会遇到网络地址,广播地址,子网等概念,这些又是什么意思呢?             一IP地址 概述 计算机要实现网络通信,就必须要有一个用于快速定位的网络地址。IP地址就是计算机在网络中的唯一身份ID,与现实世界中快递的配送需要有具体的住宅地址是一个道理。 ip地址以圆点分隔号的四个十进制数字表示,每个数字从0到255,如某一台主机的ip地址为:128.20.4.1   IP地址的组成 IP地址=网络地址 +主机地址(又称:主机号和网络号组成) 想想,为什么会有行政区划的划定(国家、省市区、街道等),为了更加高效的进行管理、定位; 相同的,我们通常将网络也可以分为很多的子网络,每个子网络有自己的网络地址,每个子网络由很多的计算机组成(当然也可以包含另外一个子网络)。 我们要找到指定的IP地址

  • centos 7下ldap安装

    环境说明:  操作系统:CentOSLinuxrelease7.5.1804(Core)  LDAP:2.4.44 前提条件:   关闭防火墙、selinux,同时进行时钟同步。其中XXX需要用域名进行替换,例如example.com,则需要将xxx修改为example. 1、安装软件。 yum-yinstallopenldapcompat-openldapopenldap-clientsopenldap-serversopenldap-servers-sqlopenldap-develmigrationtools复制 2、生成管理员用户和密码。 slappasswd-sxxxxxolcRootPW:{SSHA}+111111p+aUXGlhYIEMr+6ToCxxxxxx 需要记录下该密码,后续在配置/etc/openldap/slapd.d/cn=config/olcDatabase\=\{2\}hdb.ldif会使用到。复制 3、修改域信息、管理员信息。 vim/etc/openldap/slapd.d/cn=config/olcDatabase\=\{2\}hdb.l

  • c语言编译器介绍

    目录一、IDE(集成开发环境)1.windows编译器2.Mac中使用二、环境安装1.windows安装gccA、进入安装所在目录,找到MinGW.B、找到我的电脑,右键选择属性.C、进入属性,选择高级系统设置.D、进入高级系统设置,选择环境变量.E、在系统变量下边找到path,双击打开.F、在打开的path中填入如图信息,然后一路确认.三、依赖库安装地址Qt四、国内镜像网站 一、IDE(集成开发环境) 集成了文本编辑器,编译器,调试器 1.windows编译器 软件名称 版本 相关地址推荐 Dev-C++ 0.0.0 https://bloodshed-dev-c.en.softonic.com/ Dev-C++ 0.0.0 https://bloodshed-dev-c.softonic.cn/ visualstudio 0.0.0 https://visualstudio.microsoft.com/zh-hans/ 2.Mac中使用 文本编辑器(Vim),编译器(gcc) 软件名称 版本 相关地址推荐 Vim 0.0.0 htt

  • Fire net

    FireNetTimeLimit: 2Seconds     MemoryLimit: 65536KB Supposethatwehaveasquarecitywithstraightstreets.Amapofacityisasquareboardwithnrowsandncolumns,eachrepresentingastreetorapieceofwall. Ablockhouseisasmallcastlethathasfouropeningsthroughwhichtoshoot.ThefouropeningsarefacingNorth,East,South,andWest,respectively.Therewillbeonemachinegunshootingthrougheachopening. Hereweassumethatabulletissopowerfulthatitcanrunacrossanydistanceanddestroyablockhouseonitsway.Ontheoth

  • 内联汇编中的asm和__asm__

    基本的内联汇编代码:asm格式:asm(“assemblycode”); 使用替换的关键字:如果必须的话,可以改变用于标识内联汇编代码段的关键字asm。ANSIC规范把关键字asm用于其他用途,不能将它用于内联汇编语句。如果使用ANSIC约定编写代码,你必须使用关键字__asm__替换一般的关键字asm。__asm__(“assemblycode”);

  • Python爬虫基础——正则表达式

    说到爬虫,不可避免的会牵涉到正则表达式。 因为你需要清晰地知道你需要爬取什么信息?它们有什么共同点?可以怎么去表示它们? 而这些,都需要我们熟悉正则表达,才能更好地去提取。 先简单复习一下各表达式所代表的意思: 案例: 定义密码的正则表达式: 英文字母开头,可以包括数字、大小写英文字母、下划线,6-16位。 表达式为: password_pattern='^[a-zA-Z]{1}[a-zA-Z0-9_]{5-15}$' 或passwordpattern='^[a-zA-Z][a-zA-Z0-9_]{5-15}$' 匹配div标签,class="class1"中的文本内容: <divclass="class1">要匹配的内容</div> 表达式为: div_pattern1='<divclass="class1">(.*)</div>' 匹配div标签中div标签,class="class1"中的文本内容: <div><divclass="class1">要匹配的内容</div><

  • Vue的第一课

    终于学习到Vue了,美滋滋,给自己点个赞 前后端作用:       1、1vs1(一个Vue对象控制一个) <body> <divid="app"> <p>{{msg}},{{name}}</p> <p>{{msg}}</p> <p>{{msg}}</p> <p>{{msg}}</p> <p>{{person.name}}</p> </div> </body> <scriptsrc="./js/vue.js"></script> <script> letvm=newVue({ el:"#app",//el:element这里是要选择的父元素 data:{ msg:"first", name:"small_zhouzhou", person:{ name:"nana",//可以在数据中继续添加 }, }, }); </script>复制

  • Asp.net core中间件实现原理及用法解说

    Asp.netcore中间件实现原理及用法解说   简述asp.netcore中间件的实现思路   一次http请求的过程,就是对一个Request请求进行若干次逻辑处理,并最终设置Response的过程。从代码的实现维度看,由于Request和Response都在HttpContext里,可将此过程表示为“以一个httpContext为输入的委托函数”,即delegateTaskRequestDelegate(HttpContextcontext),为方便此文的描述,我们将此委托函数暂时称为“请求处理逻辑”     而中间件的作用,就是在请求的后面加入一个处理逻辑,这个处理逻辑是以“前一个请求处理逻辑”为输入,并经过中间件自己的处理后,返回一个“新的请求处理逻辑”。所以从代码上可将“中间件”表式为以一个“请求处理逻辑”为输入并返回另一个“请求处理逻辑”的委托,即Func<RequestDelegate,RequestDelegate>。而多个中间件即表示为List<Func<RequestDelegate,Request

  • MongoDB数据库用户名和密码的设置

    首先是对MongoDB用户和权限的设置,如果不设置用户的话,直接使用mongo命令就可以进入客户端shell界面进行操作了,但是如果没有设置用户的话,总感觉少了点什么,于是经过半天的查找和实践,差不多把用户和权限弄明白了。总结如下:如果按照以下这个指令安装的话:mongod--install--dbpath"C:\ProgramFiles\mongodb\data\db"--logpath"C:\ProgramFiles\mongodb\data\log\MongoDB.log"如下:c:\ProgramFiles\mongodb\bin>mongod--install--dbpath"C:\ProgramFiles\mongodb\data\db"--logpath"C:\ProgramFiles\mongodb\data\log\MongoDB.log"FriApr0513:47:43.164FriApr0513:47:43.168warning:32-bitserversdon'thavejournalingenabledbydefault.Pleaseuse--journ

相关推荐

推荐阅读