![使用 Windows Taskscheduler 的 pgdump](https://linux22.com/image/508184/%E4%BD%BF%E7%94%A8%20Windows%20Taskscheduler%20%E7%9A%84%20pgdump.png)
我对此有点迷茫。我在一台装有 Windows Server 2008 的生产机器上的 Postgres 实例上运行了一些数据库,我想安排数据库备份。
我所需要的只是定期转储数据库。因此,我创建了一个小型 .NET 应用程序,它加载一个配置文件,其中包含定位每个数据库所需的数据以及保存转储文件的路径。如果我通过命令行手动执行它,它会运行良好,并且符合预期。我得到了必要的反馈,并创建了转储文件。该应用程序动态创建命令参数,并在执行之前在环境变量中设置数据库密码:
Command Args: -ibv -Z3 -f "C:\Users\Administrator\Desktop\FlamingoRepo\BackupFiles\Cisne\Cisne20100311_104423.backup" -Fc -h localhost -U postgres -p 5432 Cisne
当我尝试从 TaskScheduler 执行同一个应用程序时,就会出现问题。我设置了调度程序来执行应用程序的 .exe,历史记录选项卡显示它已执行,但未创建任何文件。这就是我无法理解的。我以管理员身份安排了任务(使用我登录的帐户),标记了与最高权限相关的复选框,但我仍然没有得到任何输出(即备份文件),即使历史记录选项卡会显示它已执行并完成(在最近的尝试中,我甚至没有在历史记录选项卡中获得任何信息......)。我在两台机器上尝试过(一台是标准机器,一台是 R2 机器),结果相同。
如有任何建议我将不胜感激!
答案1
明白了。但没想到会是这样。
我查看了日志,发现了一些 System.IO.FileNotFound 异常。结果发现我的设置文件(不是 .config)在代码中没有被正确引用。在我的配置文件中,我定义了文件名(“settings.xml”),并假设它位于应用程序文件夹中(事实确实如此)。我是这样引用它的:
xdoc.Load(System.Environment.CurrentDirectory.TrimTrailingPathSlash() + "\\" + ConfigurationManager.AppSettings["SettingsFile"]);
我使用 TrimTrailingPathSlash() 清除最后的斜线以确保正确无误。虽然直接执行应用程序可以工作(并且 System.Environment.CurrentDirectory 会给我正确的路径),但在任务调度程序中运行时,System.Enviroment.CurrentDirectory 返回的路径肯定不行,我猜它有 taskeng.exe 的上下文,因此无法在其文件夹中找到 Settings.xml 文件。
我清理了该行,并在配置文件中设置了完整路径,然后就可以了。
答案2
显然,您的目标路径C:\Users\Administrator\Desktop
导致了此问题。您可以尝试不同的目标路径,例如C:\MyBackups
,并确保它被允许允许您计划任务正在运行的帐户进行写访问。
请注意,你可以大概通过其他方式解决这个问题,但这会干扰操作系统的正常运行方式,所以不推荐这样做。