成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發(fā) 后端
本文將介紹的是利用C#完成Oracle數(shù)據(jù)庫鏡像與還原工作,這些也屬于DBA們經(jīng)常要完成的工作。希望本文能對大家有所幫助。

對于C#相關(guān)開發(fā)技巧,51CTO向您推薦《C#實用基礎(chǔ)教程》和《體驗Visual Studio 2008展望2010》專題來更深入的理解。

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

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

明確還原目標

在建立還原點時,首先要明確還原對象,我們所提及的還原并不是簡單地對數(shù)據(jù)庫某個時間點整個數(shù)據(jù)庫的備份與還原,因為在升級后發(fā)生的實際業(yè)務(wù)數(shù)據(jù)是不能進行還原的。

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

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

備份:建立還原對象列表

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

 建立還原對象列表

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

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

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

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

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

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

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

備份:有進度地產(chǎn)生各個對象體

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

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

來讀取對象的程序內(nèi)容,并按照我們在CONFIG中所對應(yīng)的各種文件擴展名來保存文件:

 各種文件擴展名來保存文件

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

 寫入結(jié)束標志符

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

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

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

還原:還原的流程

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

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

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

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

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

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

  1. ls_querysql = " Select to_char(sysdate,'yyyymmddhh24miss') from dual "

取得時間戳,表示當前進行還原操作的時間點,再利用:

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

取得還原時的表,最終生成類似于以下的腳本(tabbak.sql):

  1. Create table R20100213110513gy_canshu as select * from gy_canshu;  
  2. drop table gy_canshu;  
  3. Create table R20100213110513xt_selectsql1 as select * from xt_selectsql1;  
  4. drop table xt_selectsql1;  
  5. …… 

通過 sqlplus his3/his3@mytest @tabbak.sql就可以執(zhí)行上述腳本。對于數(shù)據(jù)庫的程序體,也需建立相應(yīng)腳本,考慮到我們建立的還原點數(shù)據(jù)可能會備份至新目錄,所以我們利用在建立還原點時的列表文件prc.lst,結(jié)合配置中設(shè)定的目錄,重新生成新的執(zhí)行腳本myprc.sql

  1. swImp.WriteLine("rem 執(zhí)行導(dǎo)入所有的存儲過程");  
  2. swImp.WriteLine(ls_sqlplus + " " + ls_database + " @" + ls_path + "\\myPrc.sql"); //執(zhí)行導(dǎo)入所有的存儲過程  
  3. swProc.WriteLine( "set define off");  
  4. swProc.WriteLine("spool " + ls_path + "\\update_log.txt");  
  5. while ( (ls_read = srList.ReadLine() ) != null ){  
  6. swProc.WriteLine("prompt "+ls_read );  
  7. swProc.WriteLine("@"+ls_path+"\\"+ls_read);  
  8. }  
  9. swProc.WriteLine("exit"); 

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

  1. set define off  
  2. spool d:\roll\update_log.txt  
  3. prompt COMPILE_ERROR.prc  
  4. @d:\roll\COMPILE_ERROR.prc  
  5. ......  
  6. exit 

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

  1. …\sqlplus.exe his3/his3@mytest @d:\roll\tabbak.sql  
  2. …\imp.exe his3/his3@mytest file=d:\roll\roll.dat full=y 
  3. …\sqlplus.exe his3/his3@mytest @d:\roll\myPrc.sql  
  4. del d:\roll\imptmp.file 

并使用Process來完成它的調(diào)度:

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

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

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

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

 數(shù)據(jù)庫程序的導(dǎo)入

更進一步

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

1、 可以利用數(shù)據(jù)庫時間作為還原點標記建立目錄,方便建立多個還原點;

2、 還原時,建立相應(yīng)的日志,標記還原時間點,便于查看還原狀況;

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

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

原文標題:C#打造數(shù)據(jù)庫鏡像與還原:還原無處不在,數(shù)據(jù)庫也不例外

鏈接:http://www.cnblogs.com/hzspa/archive/2010/05/13/1735007.html

 

【編輯推薦】

  1. C#模式窗體中的按鈕操作
  2. C#模式窗體操作詳解
  3. C#窗體繼承原理以及實現(xiàn)淺析
  4. C#窗體關(guān)閉事件的重載實現(xiàn)淺析
  5. C#窗體位置與大小設(shè)置詳解
責任編輯:彭凡 來源: 博客園
相關(guān)推薦

2009-08-24 18:09:13

C#調(diào)用Oracle數(shù)

2010-10-26 15:21:11

連接Oracle數(shù)據(jù)庫

2010-05-31 10:56:48

MySQL數(shù)據(jù)庫

2009-08-07 16:19:00

C#下數(shù)據(jù)庫編程

2009-08-07 16:19:00

C#下數(shù)據(jù)庫編程

2009-03-27 13:15:20

OracleSQL Server鏡像

2011-05-26 14:07:11

SQL ServerOracle數(shù)據(jù)庫鏡像對比

2011-05-19 13:25:14

Oracle數(shù)據(jù)庫

2009-08-20 17:55:43

C#連接Oracle數(shù)

2009-08-10 18:00:30

C#數(shù)據(jù)庫備份及還原

2010-02-01 10:10:41

Oracle數(shù)據(jù)庫優(yōu)化

2010-04-02 17:11:45

Oracle數(shù)據(jù)庫

2010-04-02 13:59:08

Oracle數(shù)據(jù)庫

2010-04-14 15:14:11

Oracle數(shù)據(jù)庫

2010-10-26 15:30:12

連接Oracle數(shù)據(jù)庫

2011-03-29 10:47:49

ORACLE數(shù)據(jù)庫

2011-07-12 14:08:48

OracleODAC

2011-08-18 13:44:42

Oracle悲觀鎖樂觀鎖

2010-09-13 09:03:49

Access數(shù)據(jù)庫

2024-04-03 00:06:03

點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 欧美精品一区二区三区在线 | 国产在线一区二区三区 | 亚洲精品日韩精品 | 国产传媒在线观看 | 欧美一级片在线看 | 欧美视频一区 | 9久9久9久女女女九九九一九 | 日韩久久精品 | 欧美伊人久久久久久久久影院 | 小早川怜子xxxxaⅴ在线 | 亚洲一区二区三区四区五区午夜 | 国产丝袜一区二区三区免费视频 | 日韩一区欧美一区 | 欧美精品一级 | 五月激情婷婷在线 | 中文字幕在线一区 | 国产乱码精品一区二区三区av | 毛片片| 日韩欧美一区二区三区在线播放 | 91在线影院| 国产在线一区观看 | 玖玖精品视频 | 亚洲国产成人久久久 | 激情在线视频 | 国产成人高清视频 | 羞羞视频网站在线观看 | 一区二区三区视频免费看 | 手机在线观看 | 羞羞视频在线观看免费观看 | 国产精品久久久久久影院8一贰佰 | 粉嫩一区二区三区四区公司1 | 九九热最新地址 | 久久青青 | 日韩欧美亚洲综合 | 欧美久久国产精品 | 日韩成人在线看 | 一区二区三区在线观看免费视频 | 欧美日韩国产一区二区三区不卡 | 亚洲精品视频导航 | 日韩免费视频一区二区 | 一区二区三区国产精品 |