技术开发 频道

使用批处理完成数据库备份和上传

  【IT168 技术文章】

       为什么要编写这个批处理文件?

  由于工作需要,需要对生产数据库做每日备份,并将备份文件和日志文件传输到专用备份磁盘柜中,由于没有开启归档日志,无法使用Oracle的RMAN进行备份,只能考虑使用exp或expdp备份方式,恰好生产库既有Oracle 9i也有10g,于是动手写了两个批处理文件,然后使用计划任务定时调用该批处理文件进行数据库逻辑备份。在编写过程中遇到了相当多的问题,为了日后有个参考,赶紧记录下来。

  exp版本

  适合于Oracle 9i/10g,其他Oracle版本应该也可以使用,这里就直接给出批处理文件的内容了,具体每个命令的用途使用注释进行解释。

rem 设置自定义变量,实际使用中根据需要修改这些变量!

  rem 设置日期变量,获取日期前10位,即2008
-11-19,默认%date%返回的值中包括了星期。有的机器上运行date命令返回的日期,星期可能在前,那这里要改为%date:~4,10%

  
set riqi=%date:~0,10%

  rem 设置时间变量,由于Windows time命令返回的时间中有冒号,文件名不支持,做一下字符串截取和连接,这里定义的t1变量很特殊,如果不用0
-,当时间小于10时,如09点,返回时前面的0被空格代替了,后面在exp命令中调用这个变量时,遇到空格,后面的变量就不起作用了。t2也如此。最后将t1和t2连接在一起形成时间变量。

  
set /a t1=0-%time:~0,2%

  
set /a t2=0-%time:~3,2%

  
set shijian=%t1%%t2%

  rem 设置本地备份目录bakurl,使用绝对路径,路径末尾最后不要加“\”。

  
set bakurl=d:\xylis\数据库备份

  rem 设置多个导出文件,f1为第一个,f2为第二个,依次类推,如果5个不够用还可以自行增加。

  
set f1=01

  
set f2=02

  
set f3=03

  
set f4=04

  
set f5=05

  rem 设置ftp服务器ip地址。

  
set ftp_addr=192.168.1.205

  rem 设置ftp服务器端口

  
set ftp_port=22

  rem 设置登陆ftp服务器的用户名。

  
set ftpuser=anonymous

  rem 设置ftp用户的登陆密码。

  
set ftpuser_passwd=abc

  rem 设置上传文件时的目标目录,指ftp根目录下的某个目录。

  
set target_dir=databasebak

  rem 设置导出时Oracle用户名。

  
set expuser=lis

  rem 设置导出时Oracle用户的密码。

  
set expuser_passwd=lis

  rem 设置导出时Oracle连接服务名。

  
set ora_conn=xe

  rem 设置导出文件单个大小,如果是FAT32文件系统则最大只支持2G,如果是NTFS就不受限制。

  
set fsize=2

  rem 开始导出数据,并同步记录导出日志,如果导出文件不足4G,只会产生一个文件!这里就全部调用前面定义的变量了。

  
exp %expuser%/%expuser_passwd%@%ora_conn% file=%bakurl%\%expuser%%riqi%%shijian%_%f1%.dmp,%bakurl%\%expuser%%riqi%%shijian%_%f2%.dmp,%bakurl%\%expuser%%riqi%%shijian%_%f3%.dmp,%bakurl%\%expuser%%riqi%%shijian%_%f4%.dmp,%bakurl%\%expuser%%riqi%%shijian%_%f5%.dmp filesize=%fsize%G owner=%expuser% log=%bakurl%\%riqi%%shijian%数据库备份日志.log

  rem 开始构造临时ftp连接脚本文件!

  rem 打开ftp服务器ip地址和端口,ip地址和端口之间有一个空格。

  echo
open %ftp_addr% %ftp_port% > ftp.tmp

  rem 设置登陆ftp的用户和密码,用户和密码之间有一个空格。

  echo
user %ftpuser% %ftpuser_passwd% >>ftp.tmp

  rem 进入上传文件的目录。

  echo cd
%target_dir% >>ftp.tmp

  rem 设置传输模式为二进制格式,避免使用ASCII模式破坏文件。

  echo type
binary >>ftp.tmp

  rem 开始传输备份时产生的文件和日志文件。

  echo put
%bakurl%\%expuser%%riqi%%shijian%_%f1%.dmp >> ftp.tmp

  echo put
%bakurl%\%expuser%%riqi%%shijian%_%f2%.dmp >> ftp.tmp

  echo put
%bakurl%\%expuser%%riqi%%shijian%_%f3%.dmp >> ftp.tmp

  echo put
%bakurl%\%expuser%%riqi%%shijian%_%f4%.dmp >> ftp.tmp

  echo put
%bakurl%\%expuser%%riqi%%shijian%_%f5%.dmp >> ftp.tmp

  echo put
%bakurl%\%riqi%%shijian%数据库备份日志.log >> ftp.tmp

  echo bye
>> ftp.tmp

  rem 开始使用ftp客户端连接,并执行脚本文件,上传备份文件和备份日志文件!

  ftp
-n -s:ftp.tmp

  rem 删除临时构造的ftp连接脚本文件、当天本地备份文件和备份日志文件!

  del
/f ftp.tmp

  del
/f %bakurl%\%expuser%%riqi%%shijian%_%f1%.dmp

  del
/f %bakurl%\%expuser%%riqi%%shijian%_%f2%.dmp

  del
/f %bakurl%\%expuser%%riqi%%shijian%_%f3%.dmp

  del
/f %bakurl%\%expuser%%riqi%%shijian%_%f4%.dmp

  del
/f %bakurl%\%expuser%%riqi%%shijian%_%f5%.dmp

  del
/f %bakurl%\%riqi%%shijian%数据库备份日志.log

  使用这个批处理脚本备份的文件名如lis2008-11-20-4-20_01.dmp,日志文件名为lis2008-11-20数据库备份日志.log,这样随时都可以运行该文件,不会覆盖掉之前备份的文件。最后使用ftp命令将备份文件和日志传输到专用备份服务器,并将本地备份文件删除。这样不会造成本地磁盘空间不足。

  expdp版本

  适合于Oracle 10g以上的版本,下面是具体的内容。 

rem 设置自定义变量,实际使用中根据需要修改这些变量!

  rem 设置日期变量,获取日期前10位,即2008
-11-19。有的机器上运行date命令返回的日期,星期可能在前,那这里要改为%date:~4,10%

  
set riqi=%date:~0,10%

  rem 设置时间变量,由于Windows time命令返回的时间中有冒号,文件名不支持,做一下字符串截取和连接,这里定义的t1变量很特殊,如果不用0
-,当时间小于10时,如09点,返回时前面的0被空格代替了,后面在exp命令中调用这个变量时,遇到空格,后面的变量就不起作用了。t2也如此。最后将t1和t2连接在一起形成时间变量。

  
set /a t1=0-%time:~0,2%

  
set /a t2=0-%time:~3,2%

  
set shijian=%t1%%t2%

  rem 这里将日期和时间合并成一个datetime变量。

  
set datetime=%riqi%%shijian%

  rem 设置datapump路径,使用绝对路径,路径末尾最后不要加“\”,默认是
%ORACLE_BASE%\app\oracle\admin\%ORACLE_SID%\dpdump,可以以sys登陆到数据库,使用sql语句select * from dba_directories where directory_name='DATA_PUMP_DIR';查询出数据导出路径。

  
set bakurl=C:\oracle\product\10.2.0\admin\orcl\dpdump

  rem 设置多个导出文件,f1为第一个,f2为第二个,依次类推,如果6个不够用还可以自行增加。

  
set f1=01

  
set f2=02

  
set f3=03

  
set f4=04

  
set f5=05

  
set f6=06

  rem 设置ftp服务器ip地址。

  
set ftp_addr=192.168.1.205

  rem 设置ftp服务器端口

  
set ftp_port=22

  rem 设置登陆ftp服务器的用户名。

  
set ftpuser=anonymous

  rem 设置ftp用户的登陆密码。

  
set ftpuser_passwd=abc

  rem 设置上传文件时的目标目录,指ftp根目录下的某个目录。

  
set target_dir=databasebak

  rem 设置导出时Oracle用户名。

  
set expuser=lis

  rem 设置导出时Oracle用户的密码。

  
set expuser_passwd=lis

  rem 设置导出时Oracle连接服务名。

  
set ora_conn=orcl

  rem 设置导出文件单个大小,如果是FAT32文件系统则最大只支持2G,如果是NTFS就不受限制。

  
set fsize=1

  rem 开始导出数据,并同步记录导出日志,这里有个小缺陷,不管1个文件是否够用,总会产生6个文件!

  expdp
%expuser%/%expuser_passwd%@%ora_conn% filesize=%fsize%G schemas=%expuser% logfile=%expuser%%datetime%数据库备份日志.log dumpfile=%expuser%%datetime%_%f1%.dmp,%expuser%%datetime%_%f2%.dmp,%expuser%%datetime%_%f3%.dmp,%expuser%%datetime%_%f4%.dmp,%expuser%%datetime%_%f5%.dmp,%expuser%%datetime%_%f6%.dmp

  rem 开始构造临时ftp连接脚本文件!

  echo
open %ftp_addr% %ftp_port% > ftp.tmp

  echo
user %ftpuser% %ftpuser_passwd% >>ftp.tmp

  echo cd
%target_dir% >>ftp.tmp

  echo type
binary >>ftp.tmp

  echo put
%bakurl%\%expuser%%datetime%_%f1%.dmp >> ftp.tmp

  echo put
%bakurl%\%expuser%%datetime%_%f2%.dmp >> ftp.tmp

  echo put
%bakurl%\%expuser%%datetime%_%f3%.dmp >> ftp.tmp

  echo put
%bakurl%\%expuser%%datetime%_%f4%.dmp >> ftp.tmp

  echo put
%bakurl%\%expuser%%datetime%_%f5%.dmp >> ftp.tmp

  echo put
%bakurl%\%expuser%%datetime%_%f6%.dmp >> ftp.tmp

  echo put
%bakurl%\%expuser%%datetime%数据库备份日志.log >> ftp.tmp

  echo bye
>> ftp.tmp

  rem 开始使用ftp客户端连接,并执行脚本文件,上传备份文件和备份日志文件!

  ftp
-n -s:ftp.tmp

  rem 删除临时构造的ftp连接脚本文件、当天本地备份文件和备份日志文件!

  del
/f ftp.tmp

  del
/f %bakurl%\%expuser%%dattime%*.dmp

  del
/f %bakurl%\%expuser%%datetime%数据库备份日志.log

  运行环境说明

  由于批处理文件中已经假设很多先决条件都具备了,如本地备份目录是否已经创建好,ftp服务器是否已经配置完毕。下面列出具体的运行要求:

  1、 只能在Windows环境下运行,已经在2000/xp/2003下测试通过。

  2、 安装并配置好一个ftp服务器,位于最后备份文件要存放的服务器上,并在ftp根目录下创建好对应的文件存放目录。

  3、 计划任务要能够正常工作。

  4、 如果在你的环境中运行,需要修改bakurl,ftp_addr,ftp_port,ftpuser,ftpuser_passwd,target_dir,expuser,expuser_passwd,ora_conn,fsize这几个变量。

0
相关文章