開發與維運

記錄一次大規模數據庫遷移(java)

@[toc]
在這裡插入圖片描述

為什麼要數據遷移

  • 1.系統重構 (代碼跟不上現在的用戶量)
  • 2.數據庫設計不合理,與sql 垃圾,導致數據庫qps大大的降低,從而導致數據庫掛掉
  • 3.業務不斷增長,現有資源不夠用,戰略的轉移

當這些問題出現的時候,我們會選擇更好的系統架構 ,與解決方案,但是有個不可避免的問題 (數據遷移)當原有系統存在 幾十萬,幾百萬用戶數據的時候,我們就要考慮,這些用戶數據這樣才能完美的在新系統 或者新數據庫上應用

真實案例:

  • 數據庫建立的不合理,數據格式錯亂,sql效率低下,導致索引失效,用戶訪問量達 C端項目,導致數據庫服務器和 應用服務器天天掛,
  • 所以決定系統重構,數據庫重新設計
  • 在開發完成,項目上線前一個階段,就要設計要數據遷移

解決方案

  1. 導入固定的數據

    ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200802151031610.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxOTc3ODM4,size_16,color_FFFFFF,t_70)
    
  2. 導入用戶數據
    在這裡插入圖片描述
  3. 做好之前數據庫以及現在測試數據庫的備份,以及快照
  4. 少於 5w 以下的數據可以使用 並且 數據格式一樣的數據可以使用
  5. into (select * from aa) 大於5w 以上的數據,就不能使用
  6. 大規模數據遷移方式,首先就要考慮多線程 方式,單線程方式可能需要哥好幾十個小時

    • 如果跑代碼腳本的話 最好考慮 @asyc 註解式多線程操作
    • 如果需要做關係,切記一定要加索引,當遷移百萬級別的數據的時候,就會發現索引的威力是多麼強大

案例

@PostMapping("move")
    public ResultBody moveUnderOrderrelationship() {
        for (int i = 1; i <50 ; i++) {
            int pageNum = (i-1) * 10000;
            undersService.moveUnderOrderrelationship(pageNum,10000);
        }
        return ResultBody.success();
    }
    @Async
    public void moveUnderOrderrelationship(int pageNum, int pageSize) {
                ……
        }
        
select * from *** limit #{pageNum},#{pageSize}

Leave a Reply

Your email address will not be published. Required fields are marked *