将巨大的 SQL 文件导入 SQL Server
Posted
技术标签:
【中文标题】将巨大的 SQL 文件导入 SQL Server【英文标题】:Import huge SQL file into SQL Server 【发布时间】:2014-07-11 10:51:34 【问题描述】:我使用sqlcmd
实用程序将一个 7 GB 的大型 SQL 转储文件导入远程 SQL Server。我使用的命令是这样的:
sqlcmd -S IP address -U user -P password -t 0 -d database -i file.sql
大约 20-30 分钟后,服务器会定期回复:
Sqlcmd:错误:脚本错误。
有什么建议或建议吗?
【问题讨论】:
这正在推动网络技术的极限:D 我也遇到过类似的情况,但我很幸运能够做到 db to db 并实现了分页/重试功能。 【参考方案1】:我假设file.sql
只是一堆INSERT
语句。对于大量行,我建议使用 BCP 命令行实用程序。这将比单个 INSERT
语句快几个数量级。
您还可以使用 T-SQL BULK INSERT
命令批量插入数据。在这种情况下,数据库服务器需要可以访问文件路径(即 UNC 路径或复制到服务器上的驱动器)以及所需的权限。见http://msdn.microsoft.com/en-us/library/ms188365.aspx。
【讨论】:
您建议我先将数据转换为分隔符分隔的文件(例如 CSV)?) 默认的 BCP 字符格式是制表符分隔的。如果需要,您可以指定不同的分隔符。如果源数据是 SQL Server 表的导出,则可以使用 BCP 输出以本机格式创建文件。原生格式更快。 【参考方案2】:为什么不使用 SSIS。虽然我拥有 DBA 证书,但我总是尝试使用正确的工具来完成这项工作。
以下是使用 SSIS 的一些原因。
1 - 使用仍然可以使用快速加载、批量复制。确保您设置了批量大小。
2 - 错误处理要好得多。
但是,如果您使用的是快速加载,则要么批量提交,要么被丢弃。
如果您使用单个记录,则可以将每个错误行定向到单独的目标。
3 - 您可以在将源数据加载到目标之前对其执行转换。
简而言之,Extract Translate Load。
4 - SSIS 喜欢内存和缓冲区。如果您想深入了解,请阅读 Matt Mason 或 Brian Knight 的一些文章。
最后但并非最不重要的一点是,如果作业未在目标服务器上运行且输入文件位于本地磁盘上,则 LAN/WAN 始终会发挥作用。
如果您使用良好的管道在同一主干上,事情就会进展得很快。
总之,是的,您可以使用 BCP。它非常适合小型快速工作。任何复杂的错误处理都应该使用 SSIS 来完成。
祝你好运,
【讨论】:
以上是关于将巨大的 SQL 文件导入 SQL Server的主要内容,如果未能解决你的问题,请参考以下文章
如何将非表数据导入 SQL Server Reporting Services?