SQL,将数百万条记录从数据库移动到其他数据库

时间:2013-10-24 23:45:00

标签: sql sql-server

我是一名C#开发人员,我对SQL并不擅长。我这里有一个简单的问题。我需要将超过5000万条记录从数据库移动到其他数据库。我尝试在ms SQL中使用导入功能,但由于日志已满而卡住(我收到错误消息由于'LOG_BACKUP',数据库'mydatabase'的事务日志已满)。数据库恢复模型设置为简单。我的朋友说使用task->导入数据导入数百万条记录会导致日志变得庞大,并告诉我使用循环代替传输数据,有谁知道如何以及为什么?提前谢谢

3 个答案:

答案 0 :(得分:4)

如果您要移动整个数据库,请使用备份和还原,这将是最快捷,最简单的。

http://technet.microsoft.com/en-us/library/ms187048.aspx

如果您只是移动单个表,请阅读并使用BCP命令行工具来获取这么多记录:

  

bcp实用程序在Microsoft SQL Server实例和用户指定格式的数据文件之间批量复制数据。 bcp实用程序可用于将大量新行导入SQL Server表或将数据从表中导出到数据文件中。除了与queryout选项一起使用外,该实用程序不需要Transact-SQL知识。要将数据导入表中,您必须使用为该表创建的格式文件,或者了解表的结构以及对其列有效的数据类型。

http://technet.microsoft.com/en-us/library/ms162802.aspx

答案 1 :(得分:1)

最快且可能最可靠的方法是通过SQL Server的bcp.exe utility批量复制数据。如果目标数据库上的模式与源数据库上的模式完全相同,包括列的可为空性,则以“本机格式”导出它:

如果源和目标之间的架构不同,你会遇到......有趣(是的,有趣的是一个好词)问题。

如果架构不同或者您需要对数据执行任何转换,请考虑使用文本格式。或者另一种格式(BCP允许您创建和使用格式文件来指定导出/导入数据的格式。)

您可以考虑以块的形式导出数据:如果遇到问题,它可以让您更轻松地重新启动,而不会丢失到目前为止完成的所有工作。

您可能还会考虑将导出的数据文件压缩到最小化线路上的时间。

然后将文件FTP到目标服务器。

bcp它们。您可以使用目标服务器上的bcp实用程序为SQL Server中的BULK IMPORT语句执行此操作。没有什么不同。

使用BCP加载数据的好处在于,负载是所谓的“非记录”事务,尽管它更像是“最少记录”的事务。

如果目标服务器上的表具有IDENTITY列,则需要使用SET IDENTITY语句来禁用nonce所涉及的表上的标识列(不要忘记重新启用它) )。导入数据后,您需要运行DBCC CHECKIDENT以恢复同步。

根据您的行为,在手术期间将数据库置于single-user mode或仅限dbo模式有时会有所帮助:http://msdn.microsoft.com/en-us/library/bb522682.aspx

我曾经使用的另一种方法是使用Perl的DBI / DBD模块(提供对批量复制接口的访问)并编写一个perl脚本来从源服务器中提取数据,转换它并批量加载它直接进入目标服务器,而不必将其保存到磁盘并移动它。也意味着您可以捕获错误并设计用于恢复的设备,并在故障点重新启动。

答案 2 :(得分:0)

使用BCP迁移数据。

我过去使用的另一种方法是备份事务日志并在迁移之前缩小日志。将迁移脚本分成几部分,然后运行日志备份-收缩-迁移迭代几次。