我需要将大量数据从旧数据库中的几个表移动到新数据库中的几个不同表中。数据库是SQL Server 2005,并且位于同一个box和sql server实例上。有人告诉我,如果我尝试一次性完成事务日志就会填满。有没有办法禁用每个表的事务日志?如果没有,这样做的好方法是什么?光标会做吗?这只是一次性转换。
答案 0 :(得分:1)
使用SQL Server Management Studio中的导入/导出数据向导。这是
的方式不要使用光标,这需要永远!
另一种方法是在循环中执行插入操作,以限制单个事务中包含的行数(从而防止事务日志增长太多)。
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
答案 1 :(得分:1)
一个老人,但是一个好人:
答案 2 :(得分:0)
非常大的INSERT INTO db2.t SELECT * FROM db1.t
确实可以填满您的事务日志 - 因为在提交事务之前需要大量的空间。但是这个大小取决于很多东西 - 行数,行大小,事务日志大小等等。
我知道这可能听起来很愚蠢,但是根据你的环境风险(以及它真正填满交易日志的可能性),我可能会选择它。所有风险都是事务日志填满,您的事务回滚,其他数据库用户稍微不方便,直到该空间再次释放。如果是开发或新数据库,人们可能不会注意到。
您可以将其拆分为“合理”大小的批次(再次,这取决于)。如果这太困难了(没有好的分区策略),请使用SSIS并进行传输并设置批量提交限制。
在任何一种情况下,如果操作中断,显然只会对提交的事务进行ACID。 有时更容易TRUNCATE目标表并重新尝试整个传输,具体取决于确定传输哪些行以及哪些行未传输实际需要多长时间(取决于索引和唯一键可用性)。