2017-06-07 35 views
0

美好的一天。我需要將1500萬條記錄從一個MySQL表移動到其他模式的新表。這是一個現場系統,時間是一個問題。我需要移動的表格是歷史表格,對於日常業務並不重要。我不能離開桌子,因爲它是我正在做的更大升級的一部分。將1500萬條記錄複製到新表格/服務器

我試着用基本的sql在測試環境中移動數據,但這不起作用;服務器在20分鐘後踢我。

什麼是移動數據的最佳方式?

我是一個C#程序員,如果有人有一個編碼解決方案

+0

https://dev.mysql.com/doc/refman/5.7/en/select-into.html –

+0

只是[傾銷整個表](https://dba.stackexchange.com/a/9309 )也不起作用? – SimMac

+1

它是「相同的服務器」/不同的方案 - 或一個全新的生產數據庫(在不同的主機上?) – dognose

回答

0

好,重要的是要知道你是怎麼連接兩個。它們駐留在單個MSSQL實例中還是不同?因爲您似乎嘗試將整個歷史記錄下載到您的應用程序的內存中......

無論哪種方式,您都可以隨時分批移動數據。例如,你可以做到這一點的實體框架是這樣的:

using(var src = new MyFirstContext()) 
using(var tr = src.DataBase.BeginTransaction(IsolationLevel.ReadUncommited)) //this will speed up read of history 
{ 
    int i = 0; 
    const int batchSize = 100000; 
    try 
    { 
     while(true) 
     { 
      var batch = src.History.AsNoTracking().Skip(i*batchSize).Take(batchSize).ToList(); 
      if(!batch.Any()) 
      { 
       break; 
      } 
      using(var dst = new MySecondContext()) 
      { 
       dst.Configuration.AutoDetectChangesEnabled = false; 
       foreach(var ent1 in batch) 
       { 
        var ent2 = Map(ent1); //here you can perform map of one history type of row to another. 
        dst.Set<HistoryRowFromSecondDatabase>().Add(ent2); 
       } 
       dst.SaveChanges(); 
      } 
      i++; 
     } 
    } 
    finally 
    { 
     //this is really helpful scope in case of exception. 
     //save variable 'i', so you can start from the point you left last time. 
     //Because by default your data is commited under ReadCommited transaction, it is pretty safe to rely only on 
     //single 'i' variable. Even if you add some new data in source table. 
    } 
} 

我沒有測試過這一點,但我覺得你的想法。

0

看看批量導入/導出...我認爲這是最快的方法。

0

有幾個選項可以實現它。

  • 創建鏈接服務器以使用T-SQL腳本移動。
  • 創建一個服務文件,爲您完成任務。
  • SSIS是一個您可以探索的選項。
  • 導出/導入。
相關問題