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 ON set 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=1 call :backupone foo call :backupone foo2 call :backupone foo3 call :backupone foo4 goto :EOF @ECHO OFF :backupone setlocal echo %1 set dbname=%1 if not exist %bakupfolder%%dbname% mkdir %bakupfolder%%dbname% if %lay_in_subfolder%==1 ( set subfolder=%dbname%\ )else set subfolder= rem echo %bakupfolder%%subfolder%%dbname%%stamp%.bak sqlcmd -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自带的“维护计划”了。
------ 在windows2008下使用请参阅如下 ---- 20130723 补------------
windows 2008的命令行下,date输出的日期,默认使用/作为分隔符,这样上面的脚本就不行了,要把第三行 set d=%d:-=% 作下修改:
set d=%d:/=%
其它不用变。