在Oracle 9中偽造存儲概要

當妳知道如何通過給壹段DML語句添加提示就可以讓它運行的快很多,但是妳卻沒有訪問源代碼並將提示放到適當位置的途徑, 妳會怎麽做?

  在上壹篇文章中,我展示了妳可以如何用存儲概要(也被稱為執行計劃穩定性)來驅使數據庫引擎為妳做這種工作.

  壹個存儲概要由兩個組件組成(寬泛地講)-壹個妳希望控制的SQL語句,壹組每當Oracle發現這條SQL被優化都將在它上面應用的提示.這兩個組件都被保存在壹個被稱為outln的數據庫schema中.

  我們可以使用壹組如圖-1中類似的查詢語句來檢查保存在其中的SQL語句,以及附著在這條SQL語句上的提示.

  1 select  name, used, sql_text

  2 from    user_outlines

  3 where   category = ‘DEFAULT’

  4 ;

  5

  6 select  stage, node, hint

  7 from    user_outline_hints

  8 where   name = ‘{one of the names}’

  9 ;

  Figure 1 Examining stored outlines.

  在前面的文章中,我介紹了這樣壹種想法來欺騙系統, 使用合法的方法創建壹個存儲概要, 接著,使用壹個文本相似的但已經添加過提示的語句來創建壹個存儲概要,最後,使用壹組SQL語句來交換這兩個存儲概要的實際結果來修復存儲概要.

  當時,我曾提到這種方法對Oracle 8來講或許是安全的,但是由於在新版本中引入的變化, 在Oracle 9中可能會導致問題.

  這篇文章將對這些變化進行考查, 介紹壹種合法的方法來得到妳想要的壹組存儲到outln中的提示,用來解決妳的那些問題語句.

  相關變化

  如果妳登錄到outln schema(在Oracle 9中它默認是鎖住的)查看可用的表清單,妳將發現Oracle 9比Oracle 8多出來壹張表. 這些表為:

  ol$ SQL語句

  ol$hints 提示表

  ol$nodes 查詢塊

  第三張表是壹張新表,被用來將提示列表與這條SQL語句(壹份內部重寫的版本)的多個不同查詢塊.妳還將發現,提示列表(ol$hints)也被加強了,其中還包括文本長度與偏移量的細節信息.

  圖2為這三張表的詳細描述,用星號標註了Oracle 9中出現的新字段.

  01 ol$

  02

  03 OL_NAME          VARCHAR2(30)

  04 SQL_TEXT         LONG

  05 TEXTLEN          NUMBER

  06 SIGNATURE        RAW(16)

  07 HASH_VALUE       NUMBER

  08 HASH_VALUE2      NUMBER           ***

  09 CATEGORY         VARCHAR2(30)

  10 VERSION          VARCHAR2(64)

  11 CREATOR          VARCHAR2(30)

  12 TIMESTAMP        DATE

  13 FLAGS            NUMBER

  14 HINTCOUNT        NUMBER

  15 SPARE1           NUMBER           ***

  16 SPARE2           VARCHAR2(1000)   ***

  17

  18 Ol$hints

  19

  20 OL_NAME          VARCHAR2(30)

  21 HINT#            NUMBER

  22 CATEGORY         VARCHAR2(30)

  23 HINT_TYPE        NUMBER

  24 HINT_TEXT        VARCHAR2(512)

  25 STAGE#           NUMBER

  26 NODE#            NUMBER

  27 TABLE_NAME       VARCHAR2(30)

  28 TABLE_TIN        NUMBER

  29 TABLE_POS        NUMBER

  30 REF_ID           NUMBER           ***

  31 USER_TABLE_NAME  VARCHAR2(64)     ***

  32 COST             FLOAT(126)       ***

  33 CARDINALITY      FLOAT(126)       ***

  34 BYTES            FLOAT(126)       ***

  35 HINT_TEXTOFF     NUMBER           ***

  36 HINT_TEXTLEN     NUMBER           ***

  37 JOIN_PRED        VARCHAR2(2000)   ***

  38 SPARE1           NUMBER           ***

  39 SPARE2           NUMBER           ***

  40

  41 ol$nodes  (completely new in 9)

  42

  43 OL_NAME          VARCHAR2(30)

  44 CATEGORY         VARCHAR2(30)

  45 NODE_ID          NUMBER

  46 PARENT_ID        NUMBER

  47 NODE_TYPE        NUMBER

  48 NODE_TEXTLEN     NUMBER

  49 NODE_TEXTOFF     NUMBER

ORACLE STREAMS存儲過程中的壹些參數

1,maintain_mode參數

  可取golbal或transportable tablepsaces,當該參數取global時,表示streams進行全庫復制,否則表示streams進行表空間復制,需要在tablespace_names參數中指定待復制的壹個或多個表空間。

  2,perform_actions參數

  此參數設置為true時,streams配置腳本執行過程將記錄在dba_recoverable_script字典表,如果pre_instantiation_setup 執行時遇到錯誤,可以通過執行dbms_streams_adm的recover_operation過程在更正錯誤後繼續執行streams復制配置。參數為false的話則生成配置腳本到script_directory_object/script_name參數指定的位置。

  3,source_database/destination_database參數

  是指向源庫與目標庫的database link,必須確保正確,否則pre_instantiation_setup過程將會失敗,報ora-23621錯誤,如果錯誤發生,可以利用dbms_streams_adm的recover_operation過程回滾或者是清除上次操作,更正錯誤後再執行pre_instantiation_setup過程。

  4,bi_directional

  此參數設置為true時,表示streams是多源復制,即目標庫與源庫雙向復制對象與數據,否則只從源庫向目標庫復制對象與數據。

  5,include_ddl

  此參數表示復制的過程中,也復制DDL操作。

  6,start_processes

  此參數指streams配置完成後啟動捕獲、傳播及應用進程。

  7,exclude_schemas

  此參數指出全庫復制時不參與復制的用戶,如果有多個用戶不參加復制的話,可以用逗號分開,*號則排除所有schemas,NULL則不排除任何schemas(sys/system/stxsys始終不復制),該參數只有在全庫復制時有效。

  8,exclude_flags

  這裏表示多源復制的時候,為了避免redo entry的遞歸應用問題,應當避免的壹些操作。

  pre_instantiation_setup存儲過程示例:

  SQL>connect strmadmin/strmadmin

  SQL>declare

  2 empty_tbs dbms_streams_tablespace_adm.tablespace_set;

  3 begin

  4  dbms_streams_adm.pre_instantiation_setup(

  5  maintain_mode => ‘global’,

  6  tablespace_names => enpty_tbs,

  7  source_database => ‘dbsour.net’,

  8  destination_database => ‘dbdest.net’,

  9  perform_actions => true,

  10 bi_directional => true,

  11 include_ddl => true,

  12 start_processes => true,

  13 exclude_schemas => NULL,

  14 exclude_flags => dbms_streams_adm.exclude_flags_unsupported + dbms_streams_adm.exclude_flags_dml + dbms_streams

  15 _adm.exclude_flags_ddl);

  16 end;

  17 /

解決oracle用戶連接失敗的方法

oracle用戶連接失敗的問題著實讓我們頭疼,下面就為您介紹oracle用戶連接失敗的解決方法,希望對您學習oracle用戶連接方面能有所幫助。

  安裝完 Oracle11g 之後,想打開自帶的 SQL Plus 來學習,然後按照提示用 sys 用戶來連接數據庫,可輸了好幾次都提示壹個錯誤:

  error: the account is locked

  可能是下面幾個原因。

  1. 嘗試多次登錄未成功(可能密碼不正確);

  2. 此用戶被管理員手工鎖定;

  3. 用戶密碼到期、未按時修改密碼,等等。

  看來 scott 這個用戶肯定是登陸不了了,然後我用嘗試著用 system 這個用戶登錄,我記得在安裝 Oracle 11g 的時候曾提示輸入密碼,然後我自己輸了壹個,結果我用自己原先設定的密碼試了壹下果然連接上了。可見來在 oracle 11g 的 system 這個用戶的密碼並不是默認的,而是安裝的時候自己設定的。

  用 system 登錄進去之後,執行下面的命令:

  SQL> alter user scott account unlock;

  用戶已更改。

  這樣就完成解鎖的操作。接下來,妳還可以重新給 scott 這個用戶設定密碼。

  修改scott的登錄密碼:

  SQL> alter user scott identified by tiger;

  用戶已更改。

  大功告成,此時妳再拿 scott 和 tiger 來登錄就可以了!

  SQL> conn scott/tiger

  已連接。