1. 程式人生 > >處理myloader匯入資料提示主鍵重複問題

處理myloader匯入資料提示主鍵重複問題

一.問題描述
 將abc和abcb兩個庫的mydumper備份,利用myloader匯入abc資料庫時提示主鍵重複錯誤(很多表都有這個錯誤):
* (myloader:15557): CRITICAL **: Error restoring abcb.status_flow from file abcb.status_flow.sql: Duplicate entry '10203' for key 'PRIMARY'
** (myloader:15557): CRITICAL **: Error restoring abcb.task_creation_master from file abcb.task_creation_master.sql: Duplicate entry '280' for key 'PRIMARY'
匯入指令碼如下:
  myloader -h localhost -P 3306 -u dba -p xxxx -S /tmp/mysql3306.sock -B abc  -e -d /apps/mydumper_import/20171225010001 -o -t 8
版本:mariadb 10.1.18 + myloader 0.9.1

二.問題分析

 從報錯來看提示主鍵重複,先想到的是原來的庫和表是否有drop掉,其實在匯入前已經做了drop操作,不存在有庫和表沒有drop掉的問題,而且檢查匯入命令是正常的。嘗試改成匯入abcb庫,同樣提示主鍵重複,如是猜測abc庫和abcb庫兩個庫的名字前三個字相同,會有衝突引起?或是兩個庫下有相同的表衝突引起?再檢查mydumper的備份檔案,果然發現兩個庫存在相同表名:
[email protected] 20171225010001]$ ls -al|grep status_flow
-rw-r--r--. 1 apps apps      1546 Dec 26 17:37 abcb.status_flow_detail-schema.sql
-rw-r--r--. 1 apps apps    162320 Dec 26 17:37 abcb.status_flow_detail.sql
-rw-r--r--. 1 apps apps      1509 Dec 26 17:37 abcb.status_flow-schema.sql
-rw-r--r--. 1 apps apps     19513 Dec 26 17:37 abcb.status_flow.sql
-rw-r--r--. 1 apps apps      1546 Dec 26 17:37 abc.status_flow_detail-schema.sql
-rw-r--r--. 1 apps apps     25078 Dec 26 17:37 abc.status_flow_detail.sql
-rw-r--r--. 1 apps apps      1509 Dec 26 17:37 abc.status_flow-schema.sql
-rw-r--r--. 1 apps apps      2825 Dec 26 17:37 abc.status_flow.sql
分別檢視abc和abcb下的status_flow表定義和結構都相同:
show create table abcb.status_flow\G
*************************** 1. row ***************************
       Table: status_flow
Create Table: CREATE TABLE `status_flow` (
  `........
  PRIMARY KEY (`id`),
  KEY `idx1` (`code`,`WCode`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
show create table abc.status_flow\G
*************************** 1. row ***************************
       Table: status_flow
Create Table: CREATE TABLE `status_flow` (
  .......
  PRIMARY KEY (`id`),
  KEY `idx1` (`code`,`WCode`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
所以猜測為myloader匯入時對兩個庫的相同表進行了重複匯入處理,所以報主鍵重複。

通過上面的對比分析,大致清楚報錯原因:

在匯出備份存在多個庫,且多個庫存在相同的表名和表結構時,myloader工具將兩個庫匯入到一個庫,而兩個庫中的表結構相同,所以就發生了這一問題

重新檢視一下-B引數的作用:

-B, --database                    An alternative database to restore into

在這裡的作用就是將來源多個庫合併匯入到-B後面的庫中。

三.問題解決

  檢視myloader命令帶有的引數:
myloader --help
Application Options:
  -d, --directory                   Directory of the dump to import
  -q, --queries-per-transaction     Number of queries per transaction, default 1000
  -o, --overwrite-tables            Drop tables if they already exist
  -B, --database                    An alternative database to restore into
  -s, --source-db                   Database to restore
  -e, --enable-binlog               Enable binary logging of the restore data
  -h, --host                        The host to connect to
  -u, --user                        Username with privileges to run the dump
  -p, --password                    User password
  -P, --port                        TCP/IP port to connect to
  -S, --socket                      UNIX domain socket file to use for connection
  -t, --threads                     Number of threads to use, default 4
  -C, --compress-protocol           Use compression on the MySQL connection
  -V, --version                     Show the program version and exit
  -v, --verbose                     Verbosity of output, 0 = silent, 1 = errors, 2 = warnings, 3 = info, default 2

發現-s引數可以指定來源資料庫名,所以用下面命令匯入後,問題不再發生:

myloader -h localhost -P 3306 -u dba -p xxxx -S /tmp/mysql3306.sock -s db1 -B db1 -e -d /apps/mydumper_import/20171225010001 -o -t 8

四.總結

  當從來源多個庫匯入一個庫到目標mysql時,推薦-s和-B引數組合使用,且在從庫上設定複製過濾:set global replicate_do_db=abc.


相關推薦

處理myloader匯入資料提示重複問題

一.問題描述  將abc和abcb兩個庫的mydumper備份,利用myloader匯入abc資料庫時提示主鍵重複錯誤(很多表都有這個錯誤): * (myloader:15557): CRITICAL **: Error restoring abcb.status_flow

【mysql】sql刪除多個欄位重複資料和沒解決方法

table user      name age nub      張三    12  23      張三    12  23      張三    12  23      李四    13  21      李四    13  21      王五    11  25

MySQL 處理插入過程中的唯一重複值辦法

介紹 本篇文章主要介紹在插入資料到表中遇到鍵重複避免插入重複值的處理方法,主要涉及到IGNORE,ON DUPLICATE KEY UPDATE,REPLACE;接下來就分別看看這三種方式的處理辦法。 IGNORE 使用ignore當插入的值遇到主鍵(PRIMARY KEY)或者唯一鍵(UNIQ

刪除資料表中的資料id 從1開始自增

一、方法1 清空表資料並且將主鍵自增長從1開始 步驟①先清空表資料 步驟②在把表的自增長設定為1 Sql語句:  DELETE FROM grade; ALTER TABLE grade AUTO_INCREMENT=1;   二、方法2

mybatis 插入資料返回id寫法

1、batis檔案中寫法: <!--插入資料,返回主鍵的insert寫法 -->     <insert id="insert_A"    parameterType="Map" useGeneratedKeys="t

oracle實現插入資料自增

在看ORACLE_PL/SQL例項精解的時候用到了student表,需要自己建立。 1  首先是建表語句 create table student ( student_id number(8) not null primary key, --主鍵列 fi

Python-資料型別 auto_increment

1.詳細的建表語句 ***** create table 表名( 欄位名1 資料型別[(長度) 約束條件], 欄位名2 資料型別[(長度) 約束條件] ); 解釋: 型別:使用限制欄位必須以什麼樣的資料型別傳值 約束條件:約束條件是在型別之外新增一種額

(六)Mybatis插入資料返回id

整個demo放在Github上,地址:【https://github.com/Damaer/Mybatis-Learning】,專案是mybatis-05-CRUD,下載下來只需要maven環境以及mysql環境就可以跑起來,所以不貼全部程式碼。 我們知道很多時候我們有

Hibernate使用時提示不能為null的解決方法

之前用Hibernate時弄了很久都沒弄好,後來在網上看到別人說資料庫建表時,主鍵的標識增量要設定為1。就抱著試一試的心態試了一下,結果就能插入了。   資料庫建表時,主鍵的標識增量要設定為1 建表語句 CREATE TABLE table1&nb

關於Mybatis插入資料返回的小問題

1.在Mybatis Mapper檔案中新增屬性“useGeneratedKeys”和“keyProperty”,其中keyProperty是Java物件的屬性名,而不是表格的欄位名。 <insert id="insert" parameterType="Spare

mybatis 事務下獲取insert資料[id]的值

現在有一個需求:表A 表B的資料,需要在同一個事務中操作。表A bid儲存的是表B的id。 表A:id[主鍵] , name  , bid[表B的主鍵] 表B:id[主鍵] , name  就是先

MyBatis+Oracle用foreach標籤實現批量插入資料以及自增

1.前言          最近做一個批量匯入影像的需求,將多條記錄批量插入資料庫中。解決思路:在程式中封裝一個List集合物件,然後把該集合中的實體插入到資料庫中,因為專案使用了MyBatis,所以打算使用MyBatis的foreach功能進行批量插入。資料庫用的是Ora

mapper.xml檔案中獲取最新插入資料

在開發過程中,我們常常用到在插入資料時,需要得到剛插入的資料的主鍵,MySQL中有以下做法: 1、推薦使用 <insert id="addVehicleParam" parameterType="com.corp.dto.VehicleParamAddDt

【Java】sql實現插入,插入值的自增,防止遷移資料時報衝突的錯誤;

一、問題 我們要自己造一些測試資料,並且這些SQL指令碼要遷移到其他環境,遷移過程中,如果主鍵寫死,在其他環境,可能會出現主鍵衝突;所以,我們要寫活的主鍵,實現起來也很簡單; 二、解決方法 insert into userInfo(id,name,age)val

【MyBatis框架點滴】——mybatis插入資料返回(mysql、oracle)

  向資料庫中插入資料時,大多數情況都會使用自增列或者UUID做為主鍵。主鍵的值都是插入之前無法知道的,但很多情況下我們在插入資料後需要使用剛剛插入資料的主鍵,比如向兩張關聯表A、B中插入資料(A的

ABAP HASH TABLE 重複

當定義內表為hashed table, unique key的時候,如果表裡已經存在一條記錄,你再insert相同主鍵的記錄進去的時候, 結果是insert失敗,SY-SUBRC = 4. 記錄也不會

MySQL:insert若重複則update

插入新紀錄,若存在則update已有記錄: replace into是若存在則把原紀錄刪除再插入,其他欄位會改變(按照新給的資料,若新紀錄中相應欄位沒提供則更新為預設值)。 insert into ...on duplicate key update是若存在則更新已有欄位,其他欄位不

jquery easyui datagrid 遠端載入資料----把渲染為值遇到的問題及解決方案

起因:資料庫中一些欄位存的是代表具體值的數字,需要渲染為具體值 monggodb中的字典 mysql中存放的值為:expertin代表教練擅長的搏擊技能 jquery easyui中的相關程式碼如下:用於載入字典中的資料,注意:這一ajax請求必須設定為同步(async:false),

[轉帖]如何準確高效的獲取資料庫新插入資料id

原文地址 例如我們新建了一張表UserInformation,欄位如下Id,為主鍵,自增,其它欄位Name,Pwd,Email 然後我們來執行一個新增插入操作: insert into UserInformation(Name,Pwd,Email) values('小明','123','111') 我

python筆記6:資料處理匯入資料

# -*- coding: utf-8 -*- #資料一般儲存在檔案(csv、txt、excel)和資料庫中 #1. 匯入csv檔案(第一行是列名) from pandas import read_csv #檔案的編碼格式也應該是 utf-8 才行,否則報錯 df = re