2010-03-24 188 views
0

我需要将大量数据从旧数据库中的两个表中移动到新数据库中的几个不同表中。数据库是SQL Server 2005,位于同一个盒子和sql服务器实例上。有人告诉我,如果我试图完成所有事务,那么事务日志将会填满。有没有办法禁用每个表的事务日志?如果不是,这样做的好方法是什么?光标会做到吗?这只是一次性转换。如何将旧数据库中的大量数据迁移到新的数据库

回答

1

使用SQL Server Management Studio中的导入/导出数据向导。这里的

  1. 多么正确的对象资源管理器中单击数据库
  2. 选择任务 - >导入数据
  3. 完成“选择源”窗口
  4. 完成“选择目标”窗口
  5. 选择
  6. “从一个或多个表或视图复制数据”选择你的表

不要使用游标,这将永远!

另一种替代方法是在循环中执行插入操作,以限制单个事务中包含的行数(从而防止事务日志增长太多)。

SET ROWCOUNT 10000 
WHILE EXISTS(SELECT * FROM tblA LEFT JOIN tblB on tblA.ID = tblB.ID WHERE tblB.ID IS NULL) 
BEGIN 
    BEGIN TRAN 
    INSERT tblB 
    SELECT * FROM tblA LEFT JOIN tblB on tblA.ID = tblB.ID WHERE tblB.ID IS NULL 
    COMMIT 
    PRINT CAST(@@ROWCOUNT AS VARCHAR) + ' rows have been inserted.' 
END 

SET ROWCOUNT 0 --to reset 
+0

在SSMS表/对象副本将默认为在一个事务中所做的操作。您可以保存包并在SSIS中打开它,并在目的地上修改它以设置批量提交。 – 2010-03-24 17:05:24

+0

那么你发布的第二种方法是在事务日志中创建10000个条目然后清除它们? (对不起,我不太了解事务日志的工作原理。) – adam0101 2010-03-24 18:18:55

+0

在默认配置下,事务日志自动增长以适应在事务处于打开状态时(如插入期间)积累的数据量。如果我们在每10000行后执行一次事务,那么事务日志一次只需要保存一行10000行。基本上,我们将插入分成更小的块。 – MikeZ 2010-03-24 19:11:13

0

一个非常大的INSERT INTO db2.t SELECT * FROM db1.t确实可以填满你的事务日志 - 因为它需要大量的空间,在提交事务之前。但这个大小取决于很多东西 - 行数,行的大小,交易日志的大小等。

我知道这可能听起来很愚蠢,但取决于你的环境风险(以及它的真实可能性填写交易日志),我可能会为此付出代价。你所冒的所有风险都是事务日志的填满,你的事务回滚以及其他数据库用户稍微感到不便,直到这个空间再次被释放。如果是开发或新的数据库,人们可能不会注意到。

你可以将它分成“合理”大小的批量(同样,这取决于)。如果这太难了(没有好的分区策略),请使用SSIS并执行传输并设置批量提交限制。

无论在哪种情况下,如果操作中断,显然您只会对已提交的事务产生ACID。 有时根据实际需要多长时间(取决于索引和唯一键可用性)来确定哪些行已传输,哪些不是,更容易断开目标表并重新尝试整个传输。