美好的一天。我需要將1500萬條記錄從一個MySQL表移動到其他模式的新表。這是一個現場系統,時間是一個問題。我需要移動的表格是歷史表格,對於日常業務並不重要。我不能離開桌子,因爲它是我正在做的更大升級的一部分。將1500萬條記錄複製到新表格/服務器
我試着用基本的sql在測試環境中移動數據,但這不起作用;服務器在20分鐘後踢我。
什麼是移動數據的最佳方式?
我是一個C#程序員,如果有人有一個編碼解決方案
美好的一天。我需要將1500萬條記錄從一個MySQL表移動到其他模式的新表。這是一個現場系統,時間是一個問題。我需要移動的表格是歷史表格,對於日常業務並不重要。我不能離開桌子,因爲它是我正在做的更大升級的一部分。將1500萬條記錄複製到新表格/服務器
我試着用基本的sql在測試環境中移動數據,但這不起作用;服務器在20分鐘後踢我。
什麼是移動數據的最佳方式?
我是一個C#程序員,如果有人有一個編碼解決方案
好,重要的是要知道你是怎麼連接兩個。它們駐留在單個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.
}
}
我沒有測試過這一點,但我覺得你的想法。
看看批量導入/導出...我認爲這是最快的方法。
有幾個選項可以實現它。
https://dev.mysql.com/doc/refman/5.7/en/select-into.html –
只是[傾銷整個表](https://dba.stackexchange.com/a/9309 )也不起作用? – SimMac
它是「相同的服務器」/不同的方案 - 或一個全新的生產數據庫(在不同的主機上?) – dognose