我该如何对维护计划执行此操作

我该如何对维护计划执行此操作

我有一个非常简单的维护计划,可以将我的数据库完整备份到网络位置。效果很好。

我想在备份完成后对备份文件进行 7zip 压缩。

有没有办法在维护计划中执行此操作? 也许使用 powershell?

编辑:

我没有操作系统访问网络驱动器的权限。只能把它当作另一个硬盘,而不是服务器。从技术上讲,它是我映射的 Z:\ 驱动器。

答案1

SQL 代理作业可以执行cmd.exe脚本。

维护计划可以执行 SQL Agent 作业。

(只需创建代理作业,无需计划。)

答案2

结合 Richard 和 nray 所说的,在 SQL 备份结束时(通过 SQL 代理作业)启动基于 7zip 的归档脚本。

您可以使用以下 CMD/批处理文件作为参考,甚至根据需要进行调整(它是开源的 - 任何错误都归咎于我;)

齐帕西是一个 WINNT shell 脚本,可以安排创建/更新文件(和目录结构)的加密 zip/存档。

该脚本利用了另外两个免费实用程序:7-zip 和 wget。

答案3

正如@Richard 提到的,在脚本中编写脚本%ProgramFiles%\7-Zip\7z.exe是我的第一个想法,但您说您正在通过网络传输备份。

这意味着您需要在文件服务器上执行压缩,而不是在 SQL 服务器(SQLAgent 运行的地方)上执行压缩,否则您将把所有数据传输回 SQL 服务器上的 %TEMP% 以进行压缩,只是为了将压缩位返回到文件服务器。

如果确实如此,那么您可以选择7z.exe在备份结束时在文件服务器上执行,也许采用以下方法之一:

  • psexec \\FILESERVER C:\7-Zip\7z.exe a todays-full-sql-backup.7z 200909201800_db.bak或类似的东西。您需要以某种方式定义要压缩的 .bak 文件的名称。

  • 文件服务器上的计划任务,设置为在备份有足够的时间完成后运行。

  • PowerShell 2 远程处理,但这不是我尝试过的——太新了。

其他想法 - 为什么需要 7z 存档?这是一种压缩要备份到的目录的解决方案吗?您是否有空间在 sql 服务器上本地备份,对文件进行 7zip 然后通过网络发送?


编辑:确定备份文件的名称你可以作弊很多。你不需要知道所有的名称。您可以尝试类似“对于每个名为 2009MMDD*_MyDatabaseName_DB.bak 的文件,压缩此文件,将其复制到 \server\share,检查错误,删除该文件”的操作。

以下是未经测试shell 脚本,例如,

set DB_NAME=MyDatabaseName
set BAK_DIR=<wherever your backup gets created>
set NET_SHARE=\\Server\Share

:GET_NAME_DATE_PART
rem   #This depends entirely how Windows writes dates in your part of the world
rem   #if I were you I'd probably get some utility (now.exe?) to extract yyyymmdd 
rem   #from today's date. On our locale %date% looks like 2009-09-20
set YYYY=%date:~0,4%
set MM=%date:~5,2%
set DD=%date:~8,2%

:ARCHIVE_BAK_FILE
pushd "%BAK_DIR%"
for %%A in (%YYYY%%MM%%DD%*_%DB_NAME%_DB.BAK) do (
    "C:\Program Files\7-Zip\7z.exe" a %%A %%A.7z
    move %%A.7z "%NET_SHARE%\%%A.7z"
    rem   #CHECK FOR ERRORS MAYBE?
    del /q %%A
)
popd

for语句每天只能找到一个要压缩和删除的文件。这个奇怪的%date:~0,4%语法称为变量子字符串,如果您以前没见过它 - 它在帮助中。您可能更forfiles.exe喜欢for

相关内容