将1500万条记录复制到新的表/服务器

时间:2017-06-07 18:29:57

标签: c# mysql sql

美好的一天。我需要将一个MySQL表中的1500万条记录移动到其他模式的新表中。这是一个实时系统,时间是个问题。我需要移动的表是历史表,对于日常业务并不重要。我不能离开桌子,因为它是我正在做的更大升级的一部分。

我尝试在测试环境中使用基本的sql移动数据,但这不起作用;服务器在20分钟后把我踢出去。

移动数据的最佳方式是什么?

如果有人有编码解决方案,我是C#程序员

3 个答案:

答案 0 :(得分:0)

嗯,重要的是要知道如何连接这两者。它们是驻留在单个MSSQL实例中还是不同?因为您似乎尝试将整个历史记录下载到应用程序的内存中......

无论哪种方式,您都可以随时批量移动数据。例如,您可以在Entity Framework中执行此操作:

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.
    }
}

我没有测试过这个,但我认为你明白了。

答案 1 :(得分:0)

看看批量导入/导出...我认为这是最快的方式。

答案 2 :(得分:0)

您可以通过几种方式实现目标。

  • 使用T-SQL脚本创建要移动的链接服务器。
  • 创建一个服务文件,为您完成任务。
  • SSIS是您可以探索的选项。
  • 导出/导入。