資料庫實踐丨使用MTK遷移Mysql源庫後主鍵自增列導致數據無法插入問題

来源:https://www.cnblogs.com/huaweiyun/archive/2023/01/17/17057903.html
-Advertisement-
Play Games

摘要:用戶使用Mogdb 2.0.1版本進行業務上線測試,發現在插入數據時,應用日誌中提示primary key衝突,用戶自查業務SQL沒有問題,接到通知後,招手處理故障。 本文分享自華為雲社區《使用MTK遷移Mysql源庫後主鍵自增列導致數據無法插入問題》,作者:Gauss松鼠會。 故障背景 用戶 ...


摘要:用戶使用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的重置,指向當前主鍵最大值。

 

點擊關註,第一時間瞭解華為雲新鮮技術~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 題目描述 KiKi 學會了 printf 在屏幕輸出信息,他想輸出一架小飛機。請幫他編寫程式輸出這架小飛機。 輸入描述 無 輸出描述 解題思路 方案一 將小飛機的圖形按照行進行劃分,總共可以分成 6行。然後依照每行空格與 * 的排布位置輸出相應的字元即可。 具體代碼如下: #include <std ...
  • 1 什麼是Terraform? Terraform是一個IaC工具,IaC全稱為Infrastructure as Code,基礎設施即代碼。它的理念是通過代碼來管理基礎設施,如伺服器、資料庫等,更多請看《Terraform入門教程,示例展示管理Docker和Kubernetes資源》。 而作為Ia ...
  • 隨著技術的進步,跨平臺開發已經成為了標配,在此大背景下,ASP.NET Core也應運而生。本文主要基於ASP.NET Core+Element+Sql Server開發一個校園圖書管理系統為例,簡述基於MVC三層架構開發的常見知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 前言 眾所周知記憶體緩存(MemoryCache)數據是從記憶體中獲取,性能表現上是最優的,但是記憶體緩存有一個缺點就是不支持分散式,數據在各個部署節點上各存一份,每份緩存的過期時間不一致,會導致幻讀等各種問題,所以我們實現分散式緩存通常會用上Redis 但如果在高併發的情況下讀取Redis的緩存,會進行 ...
  • 大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是國內Cortex-M內核MCU廠商高主頻產品。 在 2021 年初痞子衡寫了篇 《盤點國內Cortex-M內核MCU廠商高性能產品》,搜羅了當時市面上主頻不低於 96MHz 的 CM 核國產 MCU。如今過去了兩年,痞子衡又一次梳理了國 ...
  • 前言 學習知識要掌握有效的學習方法,學習技術也是一樣,本篇分享關於我學習 STM32 後總結的學習方法。 推薦的學習方法 系統學習 在網上購買一款開發板,使用開發板+開發板配套視頻教程+開發板配套源碼+晶元官方手冊搭配學習。 安富萊、正點原子、野火,這三家公司研發的開發板都挺不錯,可自由選擇一款作為 ...
  • APPERK 軟體信息 軟體名稱 ParallelsDesktop 版本號 18.1.1 軟體類型 官網版 + 商業版 安裝包大小 390MB 語言 中文 系統支持 macOS11及以上(M晶元原生) 測試設備 20款Mac Pro 與 M1 Mac Pro 測試系統 macOS 13.1 軟體介紹 ...
  • 1. Openkylin介紹 Openkylin是麒麟軟體公司主導的開源操作系統,正在逐步與該公司的銀河麒麟操作系統保持基礎庫的同源。 時至2022年12月,開源操作系統Openkylin的預設軟體商場版本中還沒有微信可供下載,預計後續會和麒麟銀河系統一樣上線微信官方版本。 2. OpenKylin ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...