最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySql使用存儲(chǔ)過程進(jìn)行單表數(shù)據(jù)遷移的實(shí)現(xiàn)

 更新時(shí)間:2023年11月10日 10:06:33   作者:生命猿于運(yùn)動(dòng)  
近期在進(jìn)行業(yè)務(wù)解耦,對(duì)冗余在一起切又屬于不同業(yè)務(wù)的代碼進(jìn)行分離,同時(shí)也將數(shù)據(jù)庫進(jìn)行分離存儲(chǔ),那么這時(shí)候就涉及到多個(gè)表的數(shù)據(jù)要進(jìn)行遷移,本文就來介紹一下MySql使用存儲(chǔ)過程進(jìn)行單表數(shù)據(jù)遷移,感興趣的可以了解一下

前景

近期在進(jìn)行業(yè)務(wù)解耦,對(duì)冗余在一起切又屬于不同業(yè)務(wù)的代碼進(jìn)行分離,同時(shí)也將數(shù)據(jù)庫進(jìn)行分離存儲(chǔ),那么這時(shí)候就涉及到多個(gè)表的數(shù)據(jù)要進(jìn)行遷移,這里我們就來總結(jié)一下如何使用存儲(chǔ)過程進(jìn)行數(shù)據(jù)高效遷移。

設(shè)計(jì)思路

跨數(shù)據(jù)庫實(shí)例表數(shù)據(jù)遷移,無非就是把一個(gè)表完完整整的復(fù)制到另一個(gè)數(shù)據(jù)庫實(shí)例當(dāng)中,但是怎么做才能簡(jiǎn)單易懂又高效呢?

首先我們寫一個(gè)腳本肯定也希望能夠多次使用,否則何必浪費(fèi)時(shí)間去研究寫大批量處理的腳本呢!我們先分析數(shù)據(jù)遷移的一些主要步驟:目標(biāo)實(shí)例創(chuàng)建表、數(shù)據(jù)分批處理、數(shù)據(jù)遷移記錄、數(shù)據(jù)遷移入庫

  • 目標(biāo)實(shí)例創(chuàng)建表:我們需要根據(jù)個(gè)人所需,明確是否強(qiáng)制重新創(chuàng)建表,通常情況既然是全表遷移那都是要強(qiáng)制重新建表的(無論是否已有表數(shù)據(jù))。
  • 數(shù)據(jù)分批處理:要對(duì)數(shù)據(jù)進(jìn)行分批處理,首先我們需要對(duì)數(shù)據(jù)進(jìn)行排序,那么排序最好我們是以自增主鍵id進(jìn)行排序,這樣方便我們進(jìn)行分批數(shù)據(jù)獲取。
  • 數(shù)據(jù)遷移記錄:這里我們最好有個(gè)臨時(shí)表用來做實(shí)時(shí)數(shù)據(jù)遷移記錄,以免大數(shù)據(jù)遷移我們都不知道遷移到哪了,同時(shí)臨時(shí)表也有助于數(shù)據(jù)分批處理。
  • 數(shù)據(jù)遷移入庫:對(duì)數(shù)據(jù)進(jìn)行排好序后,我們根據(jù)主鍵id對(duì)數(shù)據(jù)進(jìn)行過濾,避免在limit后面進(jìn)行分頁操作,limit只需要確認(rèn)遷移數(shù)據(jù)量即可。

下面我們就具體分析一下完整的遷移腳本。

遷移腳本

首先我們需要明確數(shù)據(jù)要遷移的目標(biāo)數(shù)據(jù)庫,最好要把這點(diǎn)寫在腳本里,方式跑錯(cuò)數(shù)據(jù)庫實(shí)例:

USE `test_db`;

臨時(shí)表創(chuàng)建:主要輔助記錄需要遷移的數(shù)據(jù)量、實(shí)時(shí)更新已遷移的數(shù)據(jù)量、遷移表名、遷移的數(shù)據(jù)最大主鍵id用來進(jìn)行數(shù)據(jù)過濾。

DROP TABLE IF EXISTS tmp_migrate_table_record;
CREATE TABLE tmp_migrate_table_record(
    `id` INT PRIMARY KEY NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
    `table_name` VARCHAR(50) COMMENT '遷移表名',
    `source_table_count` INT COMMENT '源表記錄數(shù)',
    `target_table_count` INT COMMENT '源表記錄數(shù)',
    `max_id` BIGINT COMMENT '已遷移最大主鍵id'
);

全表遷移存儲(chǔ)過程實(shí)現(xiàn),主要包含以下幾個(gè)參數(shù):

  • sourceSchema:數(shù)據(jù)源schema名稱
  • tableName:需要遷移的表名(若需要遷移的目標(biāo)表名與源表名不一致,可自行添加參數(shù)做修改)
  • primaryKey:表主鍵名,用于數(shù)據(jù)排序、過濾、分批處理
  • batchSize:大數(shù)據(jù)遷移分批次大小
DROP PROCEDURE IF EXISTS p_migrate_full_table_data;
DELIMITER $$
CREATE PROCEDURE p_migrate_full_table_data(IN sourceSchema VARCHAR(50), IN tableName VARCHAR(50), IN primaryKey VARCHAR(50), IN batchSize INT)
BEGIN    
    -- 判斷舊表是否存在,若存在則刪除舊表(強(qiáng)制重新建表)
    SET @dropTableSql = CONCAT('DROP TABLE IF EXISTS ', tableName, ';');
    PREPARE dropTableSql FROM @dropTableSql;
    EXECUTE dropTableSql;
    
    -- 依賴源數(shù)據(jù),創(chuàng)建新表(這里可以根據(jù)需要更換表名)
    SET @craeteTable = CONCAT('CREATE TABLE ', tableName, ' LIKE `', sourceSchema, '`.', tableName, ';');
    PREPARE craeteTable FROM @craeteTable;
    EXECUTE craeteTable;

    -- 清除當(dāng)前表遷移數(shù)據(jù)記錄數(shù),防止有舊數(shù)據(jù)影響
    SET @deleteCountSql = CONCAT('DELETE FROM tmp_migrate_table_record WHERE table_name=''', tableName, ''';');
    PREPARE deleteCountSql FROM @deleteCountSql;
    EXECUTE deleteCountSql;
    
    -- 初始記錄臨時(shí)表正在進(jìn)行數(shù)據(jù)遷移的表信息
    SET @countSql = CONCAT('INSERT INTO tmp_migrate_table_record(table_name, source_table_count, target_table_count) SELECT ''', tableName, ''', COUNT(*), 0 FROM `', sourceSchema, '`.', tableName, ';');
    PREPARE countSql FROM @countSql;
    EXECUTE countSql;
    
    -- 用于查看預(yù)編譯后的SQL腳本,若有需要可以打開注釋查看
    -- SELECT @dropTableSql, @craeteTable, @deleteCountSql, @countSql;
    
    -- 數(shù)據(jù)源表記錄數(shù)
    SET @sourceCount = 0;
    -- 目標(biāo)表記錄數(shù)
    SET @targetCount = 0;
    -- 已導(dǎo)入最大id
    SET @maxId = 0;
    
    SELECT source_table_count, target_table_count, IFNULL(max_id, 0) INTO @sourceCount, @targetCount, @maxId FROM tmp_migrate_table_record WHERE table_name=tableName;
    
    -- 循環(huán)分批遷移數(shù)據(jù),根據(jù)已遷移數(shù)量與需要遷移數(shù)量進(jìn)行比較
    WHILE @sourceCount <> @targetCount DO
        -- 開啟事務(wù)
        START TRANSACTION;
        
        -- 執(zhí)行數(shù)據(jù)分批遷移
        SET @insertSql = CONCAT('INSERT INTO ', tableName, ' SELECT * FROM `', sourceSchema, '`.', tableName, ' WHERE ', primaryKey, ' > ', @maxId, ' ORDER BY ', primaryKey, ' ASC ', 'LIMIT ', batchSize, ';');
        PREPARE insertSql FROM @insertSql;
        EXECUTE insertSql;
        
        -- 實(shí)時(shí)更新臨時(shí)表已遷移記錄數(shù)
        SET @updateCountSql = CONCAT('UPDATE tmp_migrate_table_record SET target_table_count = (SELECT COUNT(*) FROM ', tableName, ') WHERE table_name=''', tableName, ''';');
        PREPARE updateCountSql FROM @updateCountSql;
        EXECUTE updateCountSql;
        
        -- 跟新臨時(shí)表以遷移數(shù)據(jù)最大主鍵id
        SET @updateMaxIdSql = CONCAT('UPDATE tmp_migrate_table_record SET max_id = (SELECT IFNULL(MAX(', primaryKey,'), 0) FROM ', tableName, ') WHERE table_name=''', tableName, ''';');
        PREPARE updateMaxIdSql FROM @updateMaxIdSql;
        EXECUTE updateMaxIdSql;
        
        -- 刷新變量
        SELECT target_table_count, max_id INTO @targetCount, @maxId FROM tmp_migrate_table_record WHERE table_name=tableName;
        
        -- 查看上面拼裝后的sql,需要排查問題可打開查看
        SELECT @insertSql, @updateCountSql, @updateMaxIdSql, @sourceCount, @targetCount;
        
        -- 提交事務(wù)
        COMMIT;
    END WHILE;
END $$
DELIMITER ;

存儲(chǔ)過程完成后,接下來就是執(zhí)行存儲(chǔ)過程進(jìn)行數(shù)據(jù)遷移了:

  • CALL p_migrate_full_table_data('test_source_db', 't_student', 'student_id', 50000);
  • CALL p_migrate_full_table_data('test_source_db', 't_student', 'student_id', 50000);
  • CALL p_migrate_full_table_data('test_source_db', 't_student', 'student_id', 50000);

確認(rèn)數(shù)據(jù)沒有問題后,可以對(duì)臨時(shí)表進(jìn)行清理:

DROP TABLE IF EXISTS tmp_migrate_table_record;

遷移示例

創(chuàng)建測(cè)試表

DROP TABLE IF EXISTS t_student;
CREATE TABLE t_student(
    id BIGINT,
    `name` VARCHAR(50),
    age INT(3),
    state CHAR(1),
    PRIMARY KEY (id)
);

DROP TABLE IF EXISTS t_course;
CREATE TABLE t_course(
    id BIGINT,
    `name` VARCHAR(50)
);

使用存儲(chǔ)過程初始化數(shù)據(jù)

DROP PROCEDURE IF EXISTS init_student;
DELIMITER $$
CREATE PROCEDURE init_student()
BEGIN
    DELETE FROM t_student;
    SET @p = 1;
        -- 測(cè)試數(shù)據(jù)數(shù)量自己定
    WHILE @p < 234567 DO
        INSERT INTO t_student
        VALUES(@p, CONCAT('user', @p * 1000000), 18, 'A');
        SET @p = @p + 1;
    END WHILE;
END $$
DELIMITER ;

CALL init_student();

執(zhí)行遷移腳本

CALL p_migrate_full_table_data('test_source_db', 't_student', 'id', 50000);
CALL p_migrate_full_table_data('test_source_db', 't_course', 'id', 50000);

總結(jié)

數(shù)據(jù)遷移的方式有很多,如果是大量的表都要遷移的情況,建議直接整個(gè)庫遷移,再刪掉不需要的表效果會(huì)更好,再大的困難都不是問題,關(guān)鍵是找對(duì)方法很重要。

到此這篇關(guān)于MySql使用存儲(chǔ)過程進(jìn)行單表數(shù)據(jù)遷移的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)MySql 單表數(shù)據(jù)遷移內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySql Binlog的5種場(chǎng)景+實(shí)操步驟全解析

    MySql Binlog的5種場(chǎng)景+實(shí)操步驟全解析

    本文詳細(xì)介紹了5種解析MySQL Binlog的方法,包括基于位點(diǎn)、時(shí)間、GTID、指定數(shù)據(jù)庫和加密Binlog的解析,附帶完整命令與場(chǎng)景說明,適合新手上手,每種方法都有具體適用場(chǎng)景和實(shí)操步驟,感興趣的朋友跟隨小編一起看看吧
    2026-02-02
  • MySQL中SHOW DATABASES語句查看或顯示數(shù)據(jù)庫

    MySQL中SHOW DATABASES語句查看或顯示數(shù)據(jù)庫

    在MySQL中,可使用SHOW DATABASES語句來查看或顯示當(dāng)前用戶權(quán)限范圍以內(nèi)的數(shù)據(jù)庫,下面就來介紹一下如何使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • MySQL數(shù)據(jù)庫自增主鍵的間隔不為1的解決方式

    MySQL數(shù)據(jù)庫自增主鍵的間隔不為1的解決方式

    這篇文章主要介紹了MySQL數(shù)據(jù)庫自增主鍵的間隔不為1的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 一文總結(jié)使用MySQL時(shí)遇到null值的坑

    一文總結(jié)使用MySQL時(shí)遇到null值的坑

    這篇文章給大家總結(jié)了日常使用MySQL時(shí),容易遇到NULL值的坑有哪些,文章通過代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • MySql字符串拆分實(shí)現(xiàn)split功能(字段分割轉(zhuǎn)列)

    MySql字符串拆分實(shí)現(xiàn)split功能(字段分割轉(zhuǎn)列)

    本文主要介紹了MySql字符串拆分實(shí)現(xiàn)split功能(字段分割轉(zhuǎn)列),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • MySql 如何實(shí)現(xiàn)無則插入有則更新

    MySql 如何實(shí)現(xiàn)無則插入有則更新

    這篇文章主要介紹了MySql 實(shí)現(xiàn)無則插入有則更新的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • MySQL數(shù)據(jù)處理梳理講解增刪改的操作

    MySQL數(shù)據(jù)處理梳理講解增刪改的操作

    本篇文章旨在介紹如何使用數(shù)據(jù)處理函數(shù),和其他大多數(shù)計(jì)算機(jī)語言語言,MYSQL支持利用函數(shù)來處理數(shù)據(jù),函數(shù)也就是一般在數(shù)據(jù)上執(zhí)行,它給數(shù)據(jù)的轉(zhuǎn)換和處理提供了方便
    2022-05-05
  • Windows下mysql?8.0.28?安裝配置方法圖文教程

    Windows下mysql?8.0.28?安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了Windows下mysql?8.0.28?安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • MySQL查詢時(shí)指定使用索引的實(shí)現(xiàn)

    MySQL查詢時(shí)指定使用索引的實(shí)現(xiàn)

    在MySQL中,可以通過指定查詢使用的索引來提高查詢性能和優(yōu)化查詢執(zhí)行計(jì)劃,本文就來介紹一下MySQL查詢時(shí)指定使用索引的實(shí)現(xiàn),感興趣的可以了解一下
    2023-11-11
  • MySql中流程控制函數(shù)/統(tǒng)計(jì)函數(shù)/分組查詢用法解析

    MySql中流程控制函數(shù)/統(tǒng)計(jì)函數(shù)/分組查詢用法解析

    這篇文章主要介紹了MySql中流程控制函數(shù)/統(tǒng)計(jì)函數(shù)/分組查詢用法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07

最新評(píng)論

黎平县| 嫩江县| 乌海市| 西乌| 闽清县| 宝丰县| 斗六市| 奉贤区| 阿城市| 泸定县| 财经| 虎林市| 霍林郭勒市| 枣强县| 桦川县| 离岛区| 彝良县| 四川省| 项城市| 东宁县| 临洮县| 大埔县| 东阳市| 临夏县| 岳阳县| 承德县| 德钦县| 罗源县| 绥德县| 文登市| 彭水| 安福县| 嘉义市| 荆门市| 历史| 无棣县| 新和县| 朝阳县| 滨州市| 巴中市| 黄大仙区|