我有一个非常简单的维护计划,可以将我的数据库完整备份到网络位置。效果很好。
我想在备份完成后对备份文件进行 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
。