还原:还原的流程
前文可以看出,创建还原点的重点在于如何把所有数据库中的程序进行导出,对于关键字典的备份反而比较简单。接下来对数据进行还原,即关键字典数据处理要加以注意。还原的处理流程是:
1、 对于当前数据库中的字典数据再次创建备份,不过本次备份是在数据库中以表的方式进行备份(因为还原时关键字典表中的数据仍可能会有用到的数据,所以需要备份),同时DROP掉相应的字典表;
2、 利用ORACLE的IMP命令,将数据备份的字典数据进入导入(对于表上的触发器,其实是表的附加属性,在导出时会自动备份,导入时也会自动加上)。
3、 对于数据库中的程序,则利用SQLPLUS执行脚本的方法来完成,即建立相应的执行脚本(由于程序都是升级工具升级上来的,还原要再升级,其程序部分的升级可在升级工具脚本中找到);
还原:创建还原脚本
还原脚本分为表的脚本和程序还原脚本,表处理部分,首先使用:
- ls_querysql = " Select to_char(sysdate,'yyyymmddhh24miss') from dual ";
复制代码
取得时间戳,表示当前进行还原操作的时间点,再利用:
- ls_tables = (string)(configurationAppSettings.GetValue("导出表", typeof(string)));
复制代码
取得还原时的表,最终生成类似于以下的脚本(tabbak.sql):
- Create table R20100213110513gy_canshu as select * from gy_canshu;
- drop table gy_canshu;
- Create table R20100213110513xt_selectsql1 as select * from xt_selectsql1;
- drop table xt_selectsql1;
- ……
复制代码
通过 sqlplus his3/his3@mytest @tabbak.sql就可以执行上述脚本。对于数据库的程序体,也需建立相应脚本,考虑到我们建立的还原点数据可能会备份至新目录,所以我们利用在建立还原点时的列表文件prc.lst,结合配置中设定的目录,重新生成新的执行脚本myprc.sql
- swImp.WriteLine("rem 执行导入所有的存储过程");
- swImp.WriteLine(ls_sqlplus + " " + ls_database + " @" + ls_path + "\\myPrc.sql"); //执行导入所有的存储过程
- swProc.WriteLine( "set define off");
- swProc.WriteLine("spool " + ls_path + "\\update_log.txt");
- while ( (ls_read = srList.ReadLine() ) != null ){
- swProc.WriteLine("prompt "+ls_read );
- swProc.WriteLine("@"+ls_path+"\\"+ls_read);
- }
- swProc.WriteLine("exit");
复制代码
生成脚本目的就是把还原点的程序重新导入,因此生成的结果主要是以下的内容:
- set define off
- spool d:\roll\update_log.txt
- prompt COMPILE_ERROR.prc
- @d:\roll\COMPILE_ERROR.prc
- ......
- exit
复制代码
核心内容生成以后,再生成一个运行的批处理即可:
- …\sqlplus.exe his3/his3@mytest @d:\roll\tabbak.sql
- …\imp.exe his3/his3@mytest file=d:\roll\roll.dat full=y
- …\sqlplus.exe his3/his3@mytest @d:\roll\myPrc.sql
- del d:\roll\imptmp.file
复制代码
并使用Process来完成它的调度:
- Process pro = new Process();
- pro.StartInfo.FileName = ls_path + "\\myImp.bat";
- pro.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
复制代码
在调度前生成临时文件imptmp.file,批处理中完成后删除此文件,这样程序只要查看文件是否存在,来探知进程是否完成。
- while(File.Exists(ls_tmpfile)){
- ldt_end=DateTime.Now;
- lb_name.Text=(ldt_end-ldt_start).ToString();
- Application.DoEvents();
- }
复制代码
一个完整样例我们就做成了,通过建立还原点处理数据备份、程序备份,然后再到还原时,备份字典表、删除表、表导入和数据库程序的导入(如图004):
更进一步
还原工具完成了我们单次的备份与还原,实际上还有一些工作可以加强深入:
1、 可以利用数据库时间作为还原点标记建立目录,方便建立多个还原点;
2、 还原时,建立相应的日志,标记还原时间点,便于查看还原状况;
3、 如果数据库中的程序如包、函数等可以查看最后的时间戳,查看是否在建立还原点之后发生变化,还原时只要还原时间戳有变化的程序,提高还原效率。
由于我们是以还原点为概念,因此可以忽略升级过程中对数据处理的记录。因为要把升级过程的变化记录下来再进行逆操作,实际上是非常困难的。因此在解决实际问题时,有时候找到合适的突破点,理解处理问题的核心要素非常重要,这样就有助于事半功倍的效果。(文/
妖精总比想象多)