天天看點

記錄一次大規模資料庫遷移(java)為什麼要資料遷移真實案例:解決方案

@[toc]

記錄一次大規模資料庫遷移(java)為什麼要資料遷移真實案例:解決方案

為什麼要資料遷移

  • 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. 導入使用者資料
    記錄一次大規模資料庫遷移(java)為什麼要資料遷移真實案例:解決方案
  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}