不用“维护计划”实现mssql定期备份并压缩存档

mssql有命令行客户端工作,可以通过bat脚本调用命令行工具执行备份命令,这样还可以很方便的调用7z,(win)rar等来自动压缩,比mssql 自带的维护计划灵活多了。“维护计划”好像也可以调用压缩工具,只是要启用xp_cmd这个很风险的存储过程,让人不安心,所以一般不这么用,备份文件都是手工压缩再下载到本地存档备份。

MS sql 的官方命令行客户端叫sqlcmd,ms sql2005默认安装的,位于 X:\Program Files\Microsoft SQL Server\90\Tools\Binn ,该目录会被自动加入windows 的PATH环境变量中,所以可以直接调用,先看看基本的帮助文档:

C:\Documents and Settings\Administrator>sqlcmd /?Microsoft (R) SQL Server 命令行工具版本 9.00.1399.06 NT INTEL X86版权所有 (c) Microsoft Corporation。保留所有权利。用法: Sqlcmd            [-U 登录 ID]          [-P 密码] [-S 服务器]            [-H 主机名]          [-E 可信连接] [-d 使用数据库名称] [-l 登录超时值]     [-t 查询超时值] [-h 标题]           [-s 列分隔符]      [-w 屏幕宽度] [-a 数据包大小]        [-e 回显输入]        [-I 允许带引号的标识符] [-c 命令结束]            [-L[c] 列出服务器[清除输出]] [-q "命令行查询"]   [-Q "命令行查询" 并退出] [-m 错误级别]        [-V 严重级别]     [-W 删除尾随空格] [-u unicode 输出]    [-r[0|1] 发送到 stderr 的消息] [-i 输入文件]         [-o 输出文件]        [-z 新密码] [-f <代码页> | i:<代码页>[,o:<代码页>]] [-Z 新建密码并退出] [-k[1|2] 删除[替换]控制字符] [-y 可变长度类型显示宽度] [-Y 固定长度类型显示宽度] [-p[1] 打印统计信息[冒号格式]] [-R 使用客户端区域设置] [-b 出错时中止批处理] [-v 变量 = "值"...]  [-A 专用管理连接] [-X[1] 禁用命令、启动脚本、环境变量[并退出]] [-x 禁用变量情况] [-? 显示语法摘要]C:\Documents and Settings\Administrator> 

详细参数介绍可以参看这里: sql server 2005 使用命令行备份数据

一个最简单的一个命令行备份实例C:\Documents and Settings\Administrator >sqlcmd -U sa -P sa -S localhost -Q "backup database foo to disk='f:\backup\foo_110630.bak'" 已为数据库 'foo',文件 'foo' (位于文件 1 上)处理了 5032 页。已为数据库 'foo',文件 'foo_log' (位于文件 1 上)处理了 1 页。BACKUP DATABASE 成功处理了 5033 页,花费 1.871 秒(22.036 MB/秒)。一个比较完善的自动批处理脚本 

一个比较完善的自动批处理脚本,可以同时备份并rar压缩多个数据库,可以按需要在此基础上修改改进。

@ECHO ONset d=%date:~0,10%set d=%d:-=%set t=%time:~0,8%set t=%t::=%set stamp=%p%%d%%t%set bakupfolder=F:\backup\rem    1按子目录保存备份文件;0不按set lay_in_subfolder=1call :backupone foocall :backupone foo2call :backupone foo3call :backupone foo4goto :EOF  @ECHO OFF:backupone setlocal echo %1 set dbname=%1if not exist %bakupfolder%%dbname% mkdir %bakupfolder%%dbname%if %lay_in_subfolder%==1 (set subfolder=%dbname%\)else set subfolder=rem echo %bakupfolder%%subfolder%%dbname%%stamp%.baksqlcmd -U sa -P "sa" -S localhost -Q "backup database %dbname% to disk='%bakupfolder%%subfolder%%dbname%%stamp%.bak'""C:\Program Files\WinRAR\RAR.exe" a -ep1 -r -o+ -m5 -s -df "%bakupfolder%%subfolder%%dbname%%stamp%".rar "%bakupfolder%%subfolder%%dbname%%stamp%.bak"endlocal&goto :EOF 

脚本说明

1. set bakupfolder=F:\backup\

备份文件存放于目录F:\backup\ (此目录需要事先建好)

2. 默认每个数据库放置到bakupfolder下的同名的子目录(脚本自动创建)中;设置lay_in_subfolder=0后,将直接放置到bakupfolder

3. 备份文件名中自动添加备份时的时间字符串,不用担心备份目录下名字重复,也便于管理。

4. call :backupone foo

foo是需要备份的数据库,需要备份其它数据库,按同样的方式一行写一条即可

这是在批处理里中调用自定义函数

5. 命令行驱动备份操作:sqlcmd -U sa -P "sa" -S localhost -Q "xxx"

这里连接数据库的用户名密码都是sa,请改成你的实际用户名密码。mssql密码中如果有一些特殊字符,可能报错,所以加上双引号。如果密码简单,不加也可以;不过sa密码,一般都是很变态的吧~~

备份脚本的调用 

加到windows计划任务里,定期执行,是一个很好的主意。

上面脚本里,只对mssql数据库执行了备份的操作,如果加入整理索引碎片、重建索引等维护操作,也是很好的自动化维护方案。

这样处理,就可以弃用mssql自带的“维护计划”了。

 

你可能感兴趣的:(windows,Microsoft,客户端,sql2005,Documents)