2

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

4

3 回答 3

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

于 2013-10-24T23:54:17.353 回答
1

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

如果源和目标之间的模式不同,您将遇到......有趣(是的,有趣是一个很好的词)问题。

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

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

您还可以考虑压缩导出的数据文件以最大限度地减少传输时间。

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

bcp 将它们输入。您可以使用目标服务器上的 bcp 实用程序来执行 SQL Server 中的 BULK IMPORT 语句来完成这项工作。没有真正的区别。

使用 BCP 加载数据的好处是加载被描述为“未记录”事务,尽管它实际上更像是“最少记录”事务。

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

根据您的操作,在手术期间将数据库置于单用户模式或仅 dbo 模式有时会有所帮助:http: //msdn.microsoft.com/en-us/library/bb522682 .aspx

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

于 2013-10-25T00:22:02.343 回答
0

使用 BCP 迁移数据。

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

于 2018-08-19T19:02:06.817 回答