ITPub博客

首页 > 数据库 > Oracle > Java程序调用expdp数据泵实现自动逻辑备份Oracle数据库的方案设计

Java程序调用expdp数据泵实现自动逻辑备份Oracle数据库的方案设计

原创 Oracle 作者:neverinit 时间:2018-11-09 23:14:06 0 删除 编辑

如果用Java开发一个程序,能够调用Oracle的数据泵expdp实现自动备份,这样即使是一个不懂Linux,UNIX等操作系统命令以及Oracle数据库的业务人员,也能通过点击页面上的菜单,实现数据库的逻辑备份。本文提供了一个设计的思路,供大家学习与交流。


针对数据量比较小的情况下,使用expdp进行备份速度也是比较快的。如果数据量稍大,还可以通过添加parallel参数,用于提升备份的速度,但parallel数值不要超过服务器CPU数量。


针对Java程序调用expdp的方案,需要思考如下几个问题:

(1)备份需要等待返回吗?还是通过Java程序调起expdp进程就好?

(2)如果需要等待返回,等了很长时间没返回怎么办?

(3)如果需要等待返回,expdp备份失败怎么办?

(4)如果备份失败,该又怎样告诉用户?


对于问题1,这里选择等待返回。一个用户友好型的设计,是需要和用户进行交互的,所以要设计成有返回的程序。

对于问题2,3,4,其实是同一个问题,就是程序怎么告知用户备份成功了,或者备份失败了。这里选择计时器+日志检索+状态查询+消息中心的设计模式,用于应对下列几种情况:

(1)如果备份程序正常完成工作,各项检查无误,通过消息中心向用户返回成功信息。

(2)如果备份程序执行失败,检查export.log存在ORA报错信息,通过消息中心向用户返回失败信息。

(3)如果备份程序hang住了,很长时间无返回,比如设定1小时,同时expdp的job状态也是存在的,那么就通过消息中心向用户返回告警信息。


下面描述完整的设计过程:

1.准备工作

(1)创建directory和操作系统目录,配置read,write权限。

(2)检查计划备份数据的Oracle实例当前状态为read,write。

(3)手工备份hr用户,测试expdp命令能否正常运行。我曾遇到directory为NFS文件系统,备份时提示错误。

(4)评估备份所需的空间,使用数据泵expdp的estimate=statistics|blocks和estimate_only=y参数对数据库备份大小进行评估。

(5)检查逻辑备份的存储空间是否充足,可以执行命令df -k或df -h查看。

2.程序设计

设计Java程序,部署在Oracle数据库服务器的某一个节点下(可以部署在Tomcat,Weblogic等中间件里,也可以选择独立部署,开发人员按照规范自行开发),与服务器的Oracle用户进行命令交互,发起expdp的备份命令。

这里解释一下计时器+日志检索+状态查询+消息中心的设计模式,每个功能的作用:

(1)状态查询

状态查询的功能是确定expdp是否还在运行,通过定时任务每几秒查询数据库sql,查看服务器进程等方式确认,这里时间间隔可以选择3秒,5秒等,短时间的偏差不会影响功能体验。

① 程序调用sql,查询expdp发起时的job是否还在运行

② ps -ef | grep expdp |grep job_name查看Linux系统进程是否存在

(2)日志检索设计

在expdp命令执行完成之后,检查导出日志中是否存在ORA字符,如果存在,意味着有报错信息。

(注:如果想设计的更加智能,可以抓取ORA信息,调用oerr获取报错信息,通过消息中心发送给技术人员)

(3)计时器

计时器从程序向系统调用expdp命令时开始启用,状态查询确认执行完毕后停止。如果出现超过1小时expdp进程还未停止,程序通过消息中心向技术人员发送告警信息。

(注:超时时间的阈值可以根据实际情况自行调整,30分钟,2小时都行)

(4)消息中心

消息中心是一套独立的消息发送程序,可选择方案较多,这里列举常用四种方案:

①较为简单的就是向操作界面返回消息,显示在页面上;

②时效性比较低的可以选择调用邮件服务器,向相关人员发送成功/失败/告警邮件;

③时效性较高的是调用微信/QQ等互联网通讯软件的API接口向用户推送消息;

④时效性最高的是通过移动、联通、电信等运营商向用户手机发送短信。


到这里,心中应该有一个程序方案的雏形了。

不过有一点需要注意一下,expdp的命令最好设计成为可配置的,千万不要硬编码到程序中,不然程序的可拓展性、可维护性就大大降低。


3.测试案例/场景的准备

为了能够充分测试各种应用场景以及测试的便利性,这里做一些约定,同时设计一些测试场景/案例。

约定内容如下:

(1)新挂载一个50M的盘,directory备份路径指向该盘

(2)使用最简单的界面操作返回消息。

测试场景/案例

(1)成功:备份scott用户,expdp很快完成备份,操作界面在1分钟之内显示备份成功消息。

(2)失败:全备数据库,备份会因为磁盘空间满报错,操作界面稍后会收到备份失败消息。

(3)失败:删除备份directory目录后,备份scott用户,操作界面会收到备份失败消息。

(4)失败:在expdp备份数据库的时候,kill备份进程,操作界面会收到备份失败消息。

(5)失败:在expdp备份数据库的时候,暂停job,操作界面会收到备份失败消息。

(6)告警:将计时器超时时间改为1分钟,全备数据库,操作界面在1分钟之后收到告警消息。


如果读者有兴趣,可以自行开发微信的API推送消息,或者通过邮件服务器推送邮件消息。

如果要发送短信的话,需要和运营商签订协议,有条件的朋友,可以在公司的测试环境测试。


4.程序调优/修复BUG

经过多轮测试之后,可能会发现程序某些地方设计不合理,可能会发现程序未按照预期运行,也可能会发现程序有BUG报错。

那么下一步,那就是程序调优和修复BUG的工作了,直到自己用着方便,业务用着舒服 ,开发用着满意。加油吧~


至此,一套完整的Java程序调用expdp数据泵实现自动逻辑备份Oracle数据库的方案设计完毕。

如有其他问题,欢迎交流指正。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31394774/viewspace-2219493/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
技术爱好者,自学Oracle并拿下OCM,参与某金融系统的需求、开发、测试、上线、运维全流程,在此学习技术,分享知识。微信公众号“IT技术佳肴”,有干货,有扯皮……

注册时间:2016-09-15

  • 博文量
    65
  • 访问量
    116374