我计划每天运行一个SQL Server代理作业。两个步骤中的第一步调用SSIS包,该包将查询结果写入文件。第二步执行批处理文件,该文件重命名文件以包含日期,将文件上载到合作伙伴的FTP站点,将文件移动到存档目录并清理。这通常很好。
但是,有时候不会发送作业成功完成的通知。当我登录服务器时,我看到ftp.exe仍在运行,但该文件尚未上传,也未移至存档。当我终止FTP进程时,作业继续,移动文件并清理。查看作业历史记录可揭示这些失败案例中的两种不同情况。首先,建立了连接,但看到的最后一个FTP输出是150 Opening data channel for file transfer.
- 没有226 Transfer OK
,因为有成功的作业运行。第二种情况是连接永远不会建立,因此脚本关闭并尝试在没有连接打开时登录。
以下是包含host,user和pass munged的脚本:
@echo off
setlocal
D:
cd D:\Backups
set file_name=ssis_output.txt
set new_file_name=SDCL.%date:~-4,4%-%date:~-10,2%-%date:~-7,2%-00-00-00.txt
set user=XXXXXXXXXXXXX
set pass=XXXXXXXXXXXXX
set host=XXXXXXXXXXXXX
ren "%file_name%" "%new_file_name%"
echo user %user%> ftpcmd.dat
echo %pass%>> ftpcmd.dat
echo bin>> ftpcmd.dat
echo put %new_file_name%>> ftpcmd.dat
echo close>> ftpcmd.dat
echo bye>> ftpcmd.dat
ftp -n -s:ftpcmd.dat %host%
del ftpcmd.dat
move %new_file_name% data_files
我想要做的是找到一种在批处理文件中包含一些错误检测的方法,这样如果在传输完成之前未建立FTP连接或超时,脚本会识别并失败,允许工作失败并发送适当的通知。更好的是,在最终放弃并报告失败之前,连接失败会导致在适当的暂停之后进行一些额外的尝试。
编辑:我不反对安装不同的免费软件FTP客户端,例如WinSCP,如果这有助于达成解决方案。
答案 0 :(得分:3)
我花了一个周末的时间来试图让Windows FTP客户端在连接失败时退出,但无法找到任何东西。我很确定这是不可能的。取而代之的是,我安装了WinSCP,它具有控制台模式并且具有良好的可编写脚本。它有一个重新连接时间选项,允许您指定进程在尝试重新连接之前等待的秒数。在测试中,即使我多次从服务器端断开FTP会话,作业也已成功完成。永久断开导致程序以退出代码1退出,这足以使SQL Server代理检测到作业失败并相应地通知我们。
但是,在处理断开连接时,WinSCP似乎并不一致。在某些试验中,会话的第二次断开导致程序以1退出,而在其他试验中,它在多次断开连接后重新连接。我将这些设置降级为最大化重新连接和成功完成工作的概率:option batch on
option reconnecttime 30
option confirm off
答案 1 :(得分:0)
OP可能会有点迟到。但是要记录FTP,您可以在每次上传文件时将确认写入日志文件。然后在脚本完成后,让它检查日志文件以查看传输是否成功完成。如果没有,请从最后一个已知的传输文件中恢复。可能是批处理脚本的一个非常混乱的循环。