PowerShell从Oracle导入SQL Server大数据时遇超时错误求助
问题描述
使用PowerShell脚本从Oracle导入数据到SQL Server时,小量数据可正常运行,但导入15345678条数据时出现超时错误。已将两个服务器连接的Connection Timeout设为0,问题依旧。
正常运行的脚本
add-type -path 'C:\Oracle\Client\ODP.NET\managed\common\Oracle.ManagedDataAccess.dll'; $Orclconn = "User Id=Oracle_Net;Password=*****;Data Source=Nexus;Connection Timeout=0"; $qry = "SELECT Cust_id, Relation_id, Order_id, quantity FROM Cust_Order ob WHERE Pay_method = '110' AND Set = 0"; $adapter = new-object Oracle.ManagedDataAccess.Client.OracleDataAdapter($qry, $Orclconn); $tbl = new-object System.Data.DataTable('T_Order_Intake'); $adapter.Fill($tbl); $sqlconn = "server=Customer_Nexus;database=Cust_Order;trusted_connection=true;Connection Timeout=0"; $sqlld = new-object system.data.sqlclient.Sqlbulkcopy($sqlconn); $sqlld.DestinationTableName="dbo.T_Order_Intake"; $sqlld.WriteToServer($tbl);
报错信息
15345678 *** 此为直接在Oracle服务器上执行查询时的相同行数 *** Exception calling "WriteToServer" with "1" argument(s): "Execution Timeout Expired. The timeout period elapsed prior to completion of the operation or the server is not responding" At E:\A_SCRIPT\Scripts\Orcl.ps1:23 char:1 + $sqlld.WriteToServer($tbl); + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : SqlException
解决方案
你遗漏的是SqlBulkCopy自身的超时与批量写入配置:
- 连接字符串中的
Connection Timeout仅控制建立连接的超时,而数据批量写入的超时由SqlBulkCopy.BulkCopyTimeout属性单独控制,默认值为30秒,大数据量导入必然超时。 - 一次性写入百万级数据会给服务器带来极大性能压力,需通过
BatchSize分批次写入。
修改后的关键代码如下:
$sqlld = new-object system.data.sqlclient.Sqlbulkcopy($sqlconn); $sqlld.DestinationTableName="dbo.T_Order_Intake"; # 设置批量写入超时(单位:秒,0表示无超时) $sqlld.BulkCopyTimeout = 0; # 设置每批次写入行数,可根据服务器性能调整,例如10000条/批 $sqlld.BatchSize = 10000; $sqlld.WriteToServer($tbl);
额外优化建议:
- 检查Oracle查询的索引情况,确保查询用到合适的索引,避免全表拖慢数据读取速度。
- 若数据量极大,可分页查询Oracle数据,分批次读取后再写入SQL Server,避免一次性加载所有数据到内存引发内存压力。
内容的提问来源于stack exchange,提问作者HarryS
相关产品推荐
相关产品推荐

