溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C#怎么完成Oracle數(shù)據(jù)庫鏡像與還原

發(fā)布時(shí)間:2021-07-22 09:07:16 來源:億速云 閱讀:231 作者:chen 欄目:編程語言

這篇文章主要講解了“C#怎么完成Oracle數(shù)據(jù)庫鏡像與還原”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“C#怎么完成Oracle數(shù)據(jù)庫鏡像與還原”吧!

開發(fā)工具:Visual Studio 2008 C#,Oracle管理工具

對(duì)操作系統(tǒng)進(jìn)行備份和還原也許是最常用的。實(shí)際業(yè)務(wù)環(huán)境升級(jí)后,因多方面原因存在嚴(yán)重問題,這時(shí)很可能需要還原到升級(jí)前的狀態(tài)。因此數(shù)據(jù)庫建立備份并能進(jìn)行還原就很有意義。本文是一個(gè)使用C#(Visual Studio 2008)結(jié)合Oracle客戶端完成還原點(diǎn)的建立與恢復(fù)的完整例子。

明確還原目標(biāo)

在建立還原點(diǎn)時(shí),首先要明確還原對(duì)象,我們所提及的還原并不是簡單地對(duì)數(shù)據(jù)庫某個(gè)時(shí)間點(diǎn)整個(gè)數(shù)據(jù)庫的備份與還原,因?yàn)樵谏?jí)后發(fā)生的實(shí)際業(yè)務(wù)數(shù)據(jù)是不能進(jìn)行還原的。

會(huì)引起重要問題的主要是程序,在數(shù)據(jù)庫中體現(xiàn)在包、函數(shù)和存儲(chǔ)過程以及與流程相關(guān)的參數(shù)、方案等核心字典數(shù)據(jù)與界面層的一致性。而具體業(yè)務(wù)中產(chǎn)生的數(shù)據(jù)如收費(fèi)項(xiàng)目、收費(fèi)明細(xì)等,是不能進(jìn)行還原的,明確還原目標(biāo)后,問題的解決就有方向性了。

要建立還原點(diǎn),首先要了解數(shù)據(jù)庫中關(guān)鍵對(duì)象的存放位置,對(duì)于包、函數(shù)等可以在Oracle的數(shù)據(jù)庫視圖user_source中找到。

備份:建立還原對(duì)象列表

在建立C#的工程之后,今天我們利用配置文件app.config.xml,設(shè)定了相應(yīng)的“導(dǎo)出對(duì)象”,“Oracle連接”等內(nèi)容,如圖001:

C#怎么完成Oracle數(shù)據(jù)庫鏡像與還原

這樣參數(shù)就可以在CONFIG中進(jìn)行調(diào)整了。在進(jìn)行備份時(shí),我們首先要取得相關(guān)的程序列表,下面的語句可以找到我們需要的導(dǎo)出對(duì)象:

selectdistinctus.name,us.typefromuser_sourceuswhereus.typein('PROCEDURE','FUNCTION','PACKAGE','PACKAGEBODY');

可以使用configurationAppSettings來取得配置文件中的設(shè)置,如導(dǎo)出對(duì)象、數(shù)據(jù)庫連接、回滾目錄,如:

ls_configs=(string)(configurationAppSettings.GetValue("導(dǎo)出對(duì)象",typeof(string)));

首先針對(duì)“導(dǎo)出對(duì)象”所定義的串進(jìn)行拆分,ls_typeinfo存放需要導(dǎo)出的類型,并建立Oracle的數(shù)據(jù)庫連接,再根據(jù)需要取得數(shù)據(jù)查詢結(jié)果:

ls_querysql="SelectdistinctUs.Name,us.typeFromUser_SourceUswhereus.typein("+ls_typeinfo+")orderbyus.Name,us.Type";  OracleCommand1.CommandText=ls_querysql;  OracleCommand1.CommandType=CommandType.Text;//如何解析commandText的值  OracleDataReadermyReader=OracleCommand1.ExecuteReader(CommandBehavior.CloseConnection);  while(myReader.Read())//使用OracleDateReader前進(jìn)到下一條記錄

通過循環(huán),獲得信息列表存放到對(duì)象列表listPrcInfo中,它包括兩個(gè)項(xiàng)目,分別就是:對(duì)象名strName,對(duì)象類別strType。

備份:有進(jìn)度地產(chǎn)生各個(gè)對(duì)象體

生成了對(duì)象列表后,再根據(jù)每個(gè)對(duì)象名和對(duì)象類別來讀取內(nèi)容,相對(duì)來說就比較簡單,只要使用以下方法:

ls_querysql = " Select us.line, us.text From User_Source Us where us.name = '" + listPrcInfo[i].strName +"' and us.type='"+listPrcInfo[i].strType+"' order by us.line ";  OracleCommand1.CommandText = ls_querysql;  OracleCommand1.CommandType = CommandType.Text;//如何解析commandText的值

來讀取對(duì)象的程序內(nèi)容,并按照我們?cè)贑ONFIG中所對(duì)應(yīng)的各種文件擴(kuò)展名來保存文件:

C#怎么完成Oracle數(shù)據(jù)庫鏡像與還原

注意,由于我們數(shù)據(jù)庫程序需要使用SQLPLUS來進(jìn)行導(dǎo)入,因此***一行我們需要寫入結(jié)束標(biāo)志符,即“/”符號(hào),它的***內(nèi)容是這樣的:

C#怎么完成Oracle數(shù)據(jù)庫鏡像與還原

由于表的導(dǎo)出我們依賴數(shù)據(jù)庫的導(dǎo)出功能,只要使用exp命令導(dǎo)出指定的字典表即可。即與具體業(yè)務(wù)無關(guān)的核心字典表,如功能列表、參數(shù)列表、菜單項(xiàng)目等,基本上使用類似于以下的命令結(jié)構(gòu)即可完成 :

exp.exe his3/his3@mytest file=d:\roll\roll.dat tables=(%1)

其中的%1所對(duì)應(yīng)的項(xiàng)目,是我們需要導(dǎo)出的表項(xiàng)目,由于導(dǎo)入功能的特殊性,會(huì)在導(dǎo)入功能中著重介紹。

還原:還原的流程

前文可以看出,創(chuàng)建還原點(diǎn)的重點(diǎn)在于如何把所有數(shù)據(jù)庫中的程序進(jìn)行導(dǎo)出,對(duì)于關(guān)鍵字典的備份反而比較簡單。接下來對(duì)數(shù)據(jù)進(jìn)行還原,即關(guān)鍵字典數(shù)據(jù)處理要加以注意。還原的處理流程是:

1、 對(duì)于當(dāng)前數(shù)據(jù)庫中的字典數(shù)據(jù)再次創(chuàng)建備份,不過本次備份是在數(shù)據(jù)庫中以表的方式進(jìn)行備份(因?yàn)檫€原時(shí)關(guān)鍵字典表中的數(shù)據(jù)仍可能會(huì)有用到的數(shù)據(jù),所以需要備份),同時(shí)DROP掉相應(yīng)的字典表;

2、 利用Oracle的IMP命令,將數(shù)據(jù)備份的字典數(shù)據(jù)進(jìn)入導(dǎo)入(對(duì)于表上的觸發(fā)器,其實(shí)是表的附加屬性,在導(dǎo)出時(shí)會(huì)自動(dòng)備份,導(dǎo)入時(shí)也會(huì)自動(dòng)加上)。

3、 對(duì)于數(shù)據(jù)庫中的程序,則利用SQLPLUS執(zhí)行腳本的方法來完成,即建立相應(yīng)的執(zhí)行腳本(由于程序都是升級(jí)工具升級(jí)上來的,還原要再升級(jí),其程序部分的升級(jí)可在升級(jí)工具腳本中找到);

還原:創(chuàng)建還原腳本

還原腳本分為表的腳本和程序還原腳本,表處理部分,首先使用:

ls_querysql = " Select to_char(sysdate,'yyyymmddhh34miss') from dual ";

取得時(shí)間戳,表示當(dāng)前進(jìn)行還原操作的時(shí)間點(diǎn),再利用:

ls_tables = (string)(configurationAppSettings.GetValue("導(dǎo)出表", typeof(string)));

取得還原時(shí)的表,最終生成類似于以下的腳本(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就可以執(zhí)行上述腳本。對(duì)于數(shù)據(jù)庫的程序體,也需建立相應(yīng)腳本,考慮到我們建立的還原點(diǎn)數(shù)據(jù)可能會(huì)備份至新目錄,所以我們利用在建立還原點(diǎn)時(shí)的列表文件prc.lst,結(jié)合配置中設(shè)定的目錄,重新生成新的執(zhí)行腳本myprc.sql

swImp.WriteLine("rem 執(zhí)行導(dǎo)入所有的存儲(chǔ)過程");  swImp.WriteLine(ls_sqlplus + " " + ls_database + " @" + ls_path + "\\myPrc.sql"); //執(zhí)行導(dǎo)入所有的存儲(chǔ)過程  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");

生成腳本目的就是把還原點(diǎn)的程序重新導(dǎo)入,因此生成的結(jié)果主要是以下的內(nèi)容:

set define off  spool d:\roll\update_log.txt  prompt COMPILE_ERROR.prc  @d:\roll\COMPILE_ERROR.prc  ......  exit

核心內(nèi)容生成以后,再生成一個(gè)運(yùn)行的批處理即可:

…\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來完成它的調(diào)度:

Process pro = new Process();  pro.StartInfo.FileName = ls_path + "\\myImp.bat";  pro.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;

在調(diào)度前生成臨時(shí)文件imptmp.file,批處理中完成后刪除此文件,這樣程序只要查看文件是否存在,來探知進(jìn)程是否完成。

while(File.Exists(ls_tmpfile)){  ldt_end=DateTime.Now;  lb_name.Text=(ldt_end-ldt_start).ToString();  Application.DoEvents();  }

一個(gè)完整樣例我們就做成了,通過建立還原點(diǎn)處理數(shù)據(jù)備份、程序備份,然后再到還原時(shí),備份字典表、刪除表、表導(dǎo)入和數(shù)據(jù)庫程序的導(dǎo)入(如圖004):

C#怎么完成Oracle數(shù)據(jù)庫鏡像與還原

更進(jìn)一步

還原工具完成了我們單次的備份與還原,實(shí)際上還有一些工作可以加強(qiáng)深入:

1、 可以利用數(shù)據(jù)庫時(shí)間作為還原點(diǎn)標(biāo)記建立目錄,方便建立多個(gè)還原點(diǎn);

2、 還原時(shí),建立相應(yīng)的日志,標(biāo)記還原時(shí)間點(diǎn),便于查看還原狀況;

3、 如果數(shù)據(jù)庫中的程序如包、函數(shù)等可以查看***的時(shí)間戳,查看是否在建立還原點(diǎn)之后發(fā)生變化,還原時(shí)只要還原時(shí)間戳有變化的程序,提高還原效率。

由于我們是以還原點(diǎn)為概念,因此可以忽略升級(jí)過程中對(duì)數(shù)據(jù)處理的記錄。因?yàn)橐焉?jí)過程的變化記錄下來再進(jìn)行逆操作,實(shí)際上是非常困難的。因此在解決實(shí)際問題時(shí),有時(shí)候找到合適的突破點(diǎn),理解處理問題的核心要素非常重要,這樣就有助于事半功倍的效果。

感謝各位的閱讀,以上就是“C#怎么完成Oracle數(shù)據(jù)庫鏡像與還原”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)C#怎么完成Oracle數(shù)據(jù)庫鏡像與還原這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI