摘要:设计一种针对中小企业数据中心数据备份的方案和实现方法。 结合 DOS 批处理命令和 Windows 任务计划功能实现文件、文件夹、数据库的自动本地或异地备份以及备份文件过期自动删除。 通过独立配置备份方案的参数,实现备份内容、存储目标、保存周期的灵活性和通用性。 非常适合中小企业自主制定快速高效的数据备份方案。
1 引言
大型企业的数据中心一般都有专业的存储设备和备份软件来实现数据的安全备份和管理, 而一般的中小企业财力所限, 部署专业的备份作业和设备会有一定困难。 本方案主要内容是如何利用现有的网络资源打造免费的备份工具, 实现廉价高效的数据备份管理目的。 不论有没有专业的存储设备, 都可以使用 DOS批处理命令和 Windows 任务计划制作属于自己的备份工具。 DOS 批处理命令和 Windows 任务计划不是新鲜事物, 通过巧妙的设计, 我们将备份工作所要求的参数,如:备份时间、备份内容、存储目标、保存周期独立出来,配合一个以批处理命令为主的文件来制作通用型的备份工具,在不同的主机上配置不同的参数,使用相同的备份工具来实现不同的备份目的。
2 备份工作管理需求
本方法将主要实现对文件、文件夹、Oracle 数据库和 SQL Server数据库的本地或异地备份 。 适用于Windows系统,单机或网络环境。 处于网络环境中的服务器同时实现本地备份和异地备份, 是最为理想的备份方式。 有条件的公司可以购置存储系统搭建 SAN 或NAS 的存储阵列来保存备份, 没有条件的公司可以将大容量磁盘主机做共享来存储备份,本文不对存储空间的配置管理展开讨论。
3 备份工具的编制
建立两个文件。 一个 Config.ini 文件,配置备份参数;一个 Autobackup.com 文件,编辑执行备份相关的批处理命令。
3.1 备份参数的配置和传递
在固定格式的 Config.ini 文件中配置所需的各参数,如:数据备份后需要保存的周期、备份数据的源地址和内容、备份数据的存储目标地址、备份数据库所需的账号、密码、数据库名。 Config.ini 文件配置三组参数,分别确定了备份文件夹、备份数据库、备份文件三种不同备份功能的参数。 以下为具体的参数说明。
keep Time:指定备份数据保存的周期(取整数,单位为月),指定周期之前的备份数据将被删除。
src Dir1,dst Dir1: 用于备份文件夹内容 ,
指定备份文件夹的源和目标地址,备份文件不改名,保存在以系统日期生成的子目录下。
dst Dir2,user,password,database:用于备份数据库 ,指定备份数据库的目标地址,
向备份命令传递数据库的用户名、密码、数据库名。 如果指定了 database 参数,就认为是 SQLserver 数据库,否则为 Oracle 数据库。 数据库备份文件名格式:oracle+年月日.dmp 或数据库名+年月日.bak (如果是 SQLserver 数据库)。
src Dir3,dst Dir3,file:用于备份指定的文件 ,指定备份文件的源和目标地址;需要备份的具体文件(多文件可重复指定)。 备份后文件名格式:年月日+原文件名。
以下为参数实例:
备份保存的周期
Keep Time=15
文件夹备份参数
src Dir1="D:\Net Work Soft"
dst Dir1="\10.18.2.1\Data Backup\Files"
数据库备份参数
dst Dir2="\\10.18.2.1\Data Backup\Database"
user="admin"password="123456"
database="msdb"
文件备份参数
src Dir3="C:\Program Files\Kiwi Syslog"
dst Dir3="\\10.18.2.1\Data Backup\Syslog"
file="Un RAR.exe"
file="Rar.exe"
file="Order.htm"
如上所示,用户只能修改等号后的参数。 文件备份功能中如果备份多个文件,
可以重复指定多个 file 参数。 备份目标地址既可以是本地磁盘,也可以是远程共享文件夹或存储系统的阵列空间。 各参数在执行文件执行时按行依次被读入。
3.2 执行文件的编制
主要功能是从参数文件 Config.ini 中读取备份参数;根据备份保存周期计算日期下限;将日期下限之前的旧备份数据删除; 将被备份文件或文件夹拷贝至目标地址; 导出 SQL Server 数据库或 Oracle 数据库到目标地址。
执行文件AutoBackup.com的主要内容:
(1)读取配置文件,传递除file外的其他参数
set n=0
for /f "eol=一delims== tokens=1,2" %%i in (config.ini) do(
set /a n=! n! +1
if!n! LSS 10 (set %%i=%%j))
(2)将备份保存周期分解为年和月(即整年和余月),用于倒推数据保存周期的下限年月
set /a Keep Year=%Keep Time%/12
set /a Keep Month=%Keep Time%%%12
截取系统日期的年、月、日字节,用于文件夹命名
set y=%date:~0,4%
set m=%date:~5,2%
set d=%date:~8,2%
将日期简化为年月日组合,
不带分割符如 20150629,用于文件命名
set ymd=%date:~0,4%%date:~5,2%%date:~8,2%
月和日整数化,用于日期比较
if %date:~5,1%==0 (set m0=%date:~6,1%) else (set m0=%date:~5,2%)
if %date:~8,1%==0 (set d0=%date:~9,1%) else (set d0=%date:~8,2%)
确定备份保存周期的月份下限
set Check List =010203040506070809101112010203040506070809101112
set /a move=(11+%m0%-%Keep Month%)*2
set del Month=! Check List:~%move%,2!
也可以通过 m0 和 Keep Month 比较大小来确定月份是否向上年倒推,
本文采用字符串对照表的方式推断备份周期的月份下限。
确定备份保存周期的年份下限
if %m0% GTR %Keep Month% (
set /a del Year=%y%-%Keep Year%
) else (
set /a del Year=%y%-%Keep Year%-1)
(3)开始备份前要判断是否存在指定的源和目标地址,以及数据库参数(此处略去相关判断代码),如果所需参数存在,则开始将备份周期之前的旧备份删除。考虑到运行的效率,不用大范围检索过期的旧备份,只检索备份周期下限月份中的过期备份,前提是我们假定备份作业每月至少被执行一次,这样可以保证不会有过期的旧备份会被保留下来。如下所示为删除过期的备份文件夹:
for /1 %%i in (1,1,%d0%) do(
if 0Ic0Ici LSS 10(
if exist %dstDirl%\%delYear%\%delMonth%0%%i rd/s /q 0}edstDirl0Ic\0}edelYear0Ic\0}edelMonth0Ic00Ic0Ici
)else(
if exist %dstDirl%\%delYear%\%delMonth%%%i rd/s /q %dstDirl%\%delYear%\%delMonth%%%i))
(4)备份指定的文件夹下全部文件,生成日期文件夹,备份文件名不变。
if not exist 0IcdstDirl0Ic\0}cv%\0}cm0Ic0Icd0Ic(
and %dstDirl%\0}cv%\0}cm%%d%
if errorlevel 0 xcopy %srcDirl0Ic\*.* 0IcdstDirl0Ic\0}cy%\0}cm%%d%\ /e /v)
如果子目录为空,则删除父目录。
if exist %dstDirl%\%delYear%(
set n=0
for /f %%j in ('dir %dstDirl%\%delYear% /b') do set /an=! n! +1
if!n! ==0 rd /s /q %dstDirl%\%delYear%)
(5)备份数据库,如果指定了,database参数,就认为是SQL Server数据库,否则为Oracle数据库。略去参数判断和过期备份的删除代码。备份SQL Server和Oracl。数据库时要分别用到数据库自带的、qlcmd.exe工具和exp.exe工具,这些工具在安装数据库时已被安装在服务器上,且所在路径已被设为全局路径。
备份SQL Serve:数据库
if not exist 0IcdstDir20Ic\0}cdatabase0Ic0Icvmd0Ic.bak(
set database=%database:~1,-1%
set dst Dir2=%dst Dir2:~1,-1%sqlcmd -U %user% -P %password% -S localhost -Q "backupdatabase ! database! to disk='! dst Dir2! \! database! %ymd%.bak'")
备份 Oracle 数据库
if not exist %dst Dir2%\oracle%ymd%.dmp (
exp %user%/%password% buffer=556677 file=% dst Dir2% \oracle%ymd%.dmp log=%dst Dir2%\oracle%ymd%.txt)
(6)备份指定的文件,略去参数判断和过期备份的删除代码。
读取配置文件,获得 file 参数
set n=0
for /f "eol=- delims== tokens=1,2" %%a in (config.ini) do (
set /a n=! n! +1if ! n! GTR 9 (set %%a=%%b
if ! %%a! NEQ "" (
if not exist % dst Dir3% \% ymd% ! %% a! copy %src Dir3%\! %%a! %dst Dir3%\%ymd%! %%a! )))
4 备份作业执行方式
针对本地备份和异地备份,根据 Config.ini 文件中指定的目标目录,分别在本地磁盘或异地存储空间中建好对应于不同备份工作的存储目录。 如果是异地共享存储,要对该目录具有读写权限;对于异地共享目录在本地映射成网络驱动器以及异地 SAN 存储方式,可以完全按照本地备份来对待 (因为存储空间已经映射为本地磁盘了)。
将 Config.ini 和 Auto Backup.com 文件一起放在需要数据备份的服务器上,存放位置可以任意确定。 然后打开 Windows 管理工具中的”任务计划程序”,“创建任务”并设置好执行时间(触发器)和执行程序(操作)Au-to Backup.com,并在“安全选项”中设置好用户权限 。 至此,就将备份工作部署好了,系统将根据任务计划中设定的时间点来自动完成备份作业。 备份示意图如图 1所示。
5 结语
本方法将需要用户干预的参数独立出来, 作为一个单独的配置文件由主体备份程序在执行时读取,提高了程序的灵活性和通用性。 采用简洁的算法将当前时间作为为备份保存周期的日期上限, 倒推计算出备份保存周期的日期下限, 删除过期备份数据并备份新的备份数据。 在服务器上制定任务计划来定期自动执行,可以自动、高效的执行备份作业。 是系统管理员进行备份管理工作的一个很好工具, 很适合一般中小企业数据中心使用。