Azure SQL Server使用Python执行Bulk Insert出现TCP Provider错误如何解决
Azure SQL Server Python执行Bulk Insert连接强制关闭问题解决方案
报错信息:TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host
1 网络层排查
- 确认运行Python脚本的机器公网IP已经加入Azure SQL Server的入站防火墙允许列表,若机器使用动态公网IP需要及时更新规则
- 检查本地网络的代理、VPN、企业防火墙是否拦截了 outbound 1433端口的请求,Azure SQL Server默认使用1433端口通信
- 可以用
telnet <你的SQL Server域名> 1433命令先测试端口连通性,排除基础网络故障
2 数据库连接配置调整
Bulk Insert操作耗时远高于普通查询,需要调整连接超时、保活相关参数避免被网关主动断开连接,以pyodbc驱动为例,参考连接配置:
import pyodbc conn = pyodbc.connect( 'DRIVER={ODBC Driver 18 for SQL Server};' 'SERVER=tcp:<你的SQL Server地址>.database.windows.net,1433;' 'DATABASE=<目标数据库名>;' 'UID=<登录用户名>;' 'PWD=<登录密码>;' 'Encrypt=yes;' 'TrustServerCertificate=no;' 'Connection Timeout=300;' # 连接超时设置为5分钟,可根据实际情况上调 'Query Timeout=0;' # 查询超时设为0即不限制,适配长耗时批量导入任务 'KeepAlive=30;KeepAliveInterval=10;' # 开启TCP保活,每30秒发送一次保活包 )
3 Bulk Insert操作优化
- 拆分批量插入的数据集,不要一次性导入过大的文件/数据量,建议每次批量插入的行数控制在1万-10万区间(根据单行数据大小调整),分批次提交避免单次操作耗时过长触发连接中断
- 避免在Bulk Insert执行过程中同时运行其他占用大量数据库资源的任务,Azure SQL Server达到资源负载上限时会主动断开超负载的连接
- 若你直接调用
BULK INSERTSQL语句读取本地文件,会触发权限错误,Azure SQL Server无法直接访问本地机器的文件:- 优先改用pyodbc的
fast_executemany参数实现批量插入,示例代码:cursor = conn.cursor() cursor.fast_executemany = True insert_sql = "INSERT INTO 目标表 (列1,列2) VALUES (?,?)" cursor.executemany(insert_sql, 待插入数据列表) conn.commit() - 若必须使用原生
BULK INSERT语句,需要先将数据文件上传到同区域的Azure Blob存储,配置共享访问签名后在SQL Server中创建外部数据源,再调用BULK INSERT读取存储中的文件
- 优先改用pyodbc的
4 Azure侧配置检查
- 查看Azure SQL Server的监控面板,确认CPU、内存、IOPS是否达到瓶颈,如果实例规格过低可以临时升配验证是否解决问题
- 检查Azure SQL Server的连接策略,跨区域访问场景下建议切换为代理模式,减少连接中断概率
内容的提问来源于stack exchange,提问作者OGZ
相关产品推荐
相关产品推荐

