<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Decode360's Blog

    業(yè)精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 ::  :: 管理 ::
      397 隨筆 :: 33 文章 :: 29 評論 :: 0 Trackbacks
    Streams流復(fù)制的異常檢測
    ?
    ?
    ??? 本文為轉(zhuǎn)載,但基本上屬于常識類知識,自己修改一下,附上轉(zhuǎn)載地址:
    ??? http://www.eygle.com/archives/2007/11/streams_print_transaction.html
    ?
    ??? 在使用Streams流復(fù)制的過程中,遇到各種錯誤的時候很常見。在Oracle的文檔(Oracle? Streams Concepts and Administration 10g Release 2)上提供了一個異常檢測方案。即可以通過Oracle自己的數(shù)據(jù)字典,來確定具體的傳輸內(nèi)容,以便作出相應(yīng)的調(diào)整:
    ?
    ??? 首先在創(chuàng)建這幾個過程時,要記得給stradmin用戶賦權(quán),使其對dba_apply_error和dbms_apply_adm包有使用權(quán)限,即便是stradmin已經(jīng)具有dba權(quán)限,也還是需要進(jìn)行賦權(quán)后才能順利得創(chuàng)建這幾個包,賦權(quán)的語句如下所示:
    ?
    ??? GRANT SELECT ON DBA_APPLY_ERROR TO stradmin;
    ??? GRANT EXECUTE ON DBMS_APPLY_ADM TO stradmin;
    ?
    ??? 生成的主要包括四個過程(具體代碼見附錄):
    ?
    ??? print_any
    ??? print_lcr
    ??? print_errors
    ??? print_transaction

    ??? 前面兩個是中間的過程,就不需要了解了,關(guān)鍵是后面的兩個過程,用來打印錯誤的信息。print_errors是用來打印所有的錯誤信息,但是當(dāng)錯誤非常多時,會造成output的溢出,即便設(shè)置了很大的值,輸出也會很慢,所以又提供了print_transaction過程,用以顯示某個單獨(dú)的錯誤信息的對應(yīng)錯誤說明:
    ?
    ??? print_transaction的用法是這樣的:
    ?
    SQL> select apply_name,LOCAL_TRANSACTION_ID,SOURCE_TRANSACTION_ID,ERROR_MESSAGE
    ? 2? from dba_apply_error;
    ?
    APPLY_NAME? LOCAL_TRANSACTION_ID? SOURCE_TRANSACTION_ID? ERROR_MESSAGE
    ----------- ---------------------- ---------------------- -------------------------
    APP97_APPLY 5.27.1273????????????? 4.46.576????????????? ORA-01403: no data found
    ?
    SQL> SET SERVEROUTPUT ON SIZE 1000000
    SQL> EXEC print_transaction('5.27.1273')
    ?
    ----- Local Transaction ID: 5.27.1273
    ----- Source Database: TEST201.EYGLE.COM
    ----Error in Message: 1
    ----Error Number: 1403
    ----Message Text: ORA-01403: no data found
    ?
    --message: 1
    type name: SYS.LCR$_ROW_RECORD
    source database: TEST201.EYGLE.COM
    owner: SCOTT
    object: DEPT
    is tag null: Y
    command_type: UPDATE
    old(1): DEPTNO
    50
    old(2): LOC
    CHINA
    new(1): LOC
    CHINA
    ?
    PL/SQL procedure successfully completed
    ?
    ?
    ?
    ?
    關(guān)于詳細(xì)的用法,可以參見下面這個地址,就不轉(zhuǎn)貼了:
    http://www.eygle.com/archives/2007/11/streams_ora_01403.html
    ?
    ?
    附:Check腳本
    **************************************************************

    CREATE OR REPLACE PROCEDURE print_any (DATA IN ANYDATA)
    IS
    ?? tn??? VARCHAR2 (61);
    ?? str? VARCHAR2 (4000);
    ?? CHR? VARCHAR2 (1000);
    ?? num? NUMBER;
    ?? dat? DATE;
    ?? rw??? RAW (4000);
    ?? res? NUMBER;
    BEGIN
    ? IF DATA IS NULL
    ? THEN
    ????? DBMS_OUTPUT.put_line ('NULL value');
    ????? RETURN;
    ? END IF;
    ?
    ? tn := DATA.gettypename ();
    ?
    ? IF tn = 'SYS.VARCHAR2'
    ? THEN
    ????? res := DATA.getvarchar2 (str);
    ????? DBMS_OUTPUT.put_line (SUBSTR (str, 0, 253));
    ? ELSIF tn = 'SYS.CHAR'
    ? THEN
    ????? res := DATA.getchar (CHR);
    ????? DBMS_OUTPUT.put_line (SUBSTR (CHR, 0, 253));
    ? ELSIF tn = 'SYS.VARCHAR'
    ? THEN
    ????? res := DATA.getvarchar (CHR);
    ????? DBMS_OUTPUT.put_line (CHR);
    ? ELSIF tn = 'SYS.NUMBER'
    ? THEN
    ????? res := DATA.getnumber (num);
    ????? DBMS_OUTPUT.put_line (num);
    ? ELSIF tn = 'SYS.DATE'
    ? THEN
    ????? res := DATA.getdate (dat);
    ????? DBMS_OUTPUT.put_line (dat);
    ? ELSIF tn = 'SYS.RAW'
    ? THEN
    -- res := data.GETRAW(rw);
    -- DBMS_OUTPUT.PUT_LINE(SUBSTR(DBMS_LOB.SUBSTR(rw),0,253));
    ????? DBMS_OUTPUT.put_line ('BLOB Value');
    ? ELSIF tn = 'SYS.BLOB'
    ? THEN
    ????? DBMS_OUTPUT.put_line ('BLOB Found');
    ? ELSE
    ????? DBMS_OUTPUT.put_line ('typename is ' || tn);
    ? END IF;
    END print_any;
    /
    ?
    ?
    ?
    CREATE OR REPLACE PROCEDURE print_lcr (lcr IN ANYDATA)
    IS
    ?? typenm??? VARCHAR2 (61);
    ?? ddllcr??? SYS.lcr$_ddl_record;
    ?? proclcr??? SYS.lcr$_procedure_record;
    ?? rowlcr??? SYS.lcr$_row_record;
    ?? res??????? NUMBER;
    ?? newlist??? SYS.lcr$_row_list;
    ?? oldlist??? SYS.lcr$_row_list;
    ? ddl_text? CLOB;
    ? ext_attr? ANYDATA;
    BEGIN
    ? typenm := lcr.gettypename ();
    ? DBMS_OUTPUT.put_line ('type name: ' || typenm);
    ?
    ? IF (typenm = 'SYS.LCR$_DDL_RECORD')
    ? THEN
    ????? res := lcr.getobject (ddllcr);
    ????? DBMS_OUTPUT.put_line (? 'source database: '
    ??????????????????????????? || ddllcr.get_source_database_name
    ????????????????????????? );
    ????? DBMS_OUTPUT.put_line ('owner: ' || ddllcr.get_object_owner);
    ????? DBMS_OUTPUT.put_line ('object: ' || ddllcr.get_object_name);
    ????? DBMS_OUTPUT.put_line ('is tag null: ' || ddllcr.is_null_tag);
    ????? DBMS_LOB.createtemporary (ddl_text, TRUE);
    ????? ddllcr.get_ddl_text (ddl_text);
    ????? DBMS_OUTPUT.put_line ('ddl: ' || ddl_text);
    -- Print extra attributes in DDL LCR
    ????? ext_attr := ddllcr.get_extra_attribute ('serial#');
    ?
    ????? IF (ext_attr IS NOT NULL)
    ????? THEN
    ??????? DBMS_OUTPUT.put_line ('serial#: ' || ext_attr.accessnumber ());
    ????? END IF;
    ?
    ????? ext_attr := ddllcr.get_extra_attribute ('session#');
    ?
    ????? IF (ext_attr IS NOT NULL)
    ????? THEN
    ??????? DBMS_OUTPUT.put_line ('session#: ' || ext_attr.accessnumber ());
    ????? END IF;
    ?
    ????? ext_attr := ddllcr.get_extra_attribute ('thread#');
    ?
    ????? IF (ext_attr IS NOT NULL)
    ????? THEN
    ??????? DBMS_OUTPUT.put_line ('thread#: ' || ext_attr.accessnumber ());
    ????? END IF;
    ?
    ????? ext_attr := ddllcr.get_extra_attribute ('tx_name');
    ?
    ????? IF (ext_attr IS NOT NULL)
    ????? THEN
    ??????? DBMS_OUTPUT.put_line (? 'transaction name: '
    ????????????????????????????? || ext_attr.accessvarchar2 ()
    ????????????????????????????? );
    ????? END IF;
    ?
    ????? ext_attr := ddllcr.get_extra_attribute ('username');
    ?
    ????? IF (ext_attr IS NOT NULL)
    ????? THEN
    ??????? DBMS_OUTPUT.put_line ('username: ' || ext_attr.accessvarchar2 ());
    ????? END IF;
    ?
    ????? DBMS_LOB.freetemporary (ddl_text);
    ? ELSIF (typenm = 'SYS.LCR$_ROW_RECORD')
    ? THEN
    ????? res := lcr.getobject (rowlcr);
    ????? DBMS_OUTPUT.put_line (? 'source database: '
    ??????????????????????????? || rowlcr.get_source_database_name
    ????????????????????????? );
    ????? DBMS_OUTPUT.put_line ('owner: ' || rowlcr.get_object_owner);
    ????? DBMS_OUTPUT.put_line ('object: ' || rowlcr.get_object_name);
    ????? DBMS_OUTPUT.put_line ('is tag null: ' || rowlcr.is_null_tag);
    ????? DBMS_OUTPUT.put_line ('command_type: ' || rowlcr.get_command_type);
    ????? oldlist := rowlcr.get_values ('old');
    ?
    ????? FOR i IN 1 .. oldlist.COUNT
    ????? LOOP
    ??????? IF oldlist (i) IS NOT NULL
    ??????? THEN
    ??????????? DBMS_OUTPUT.put_line ('old(' || i || '): '
    ????????????????????????????????? || oldlist (i).column_name
    ??????????????????????????????? );
    ??????????? print_any (oldlist (i).DATA);
    ??????? END IF;
    ????? END LOOP;
    ?
    ????? newlist := rowlcr.get_values ('new', 'n');
    ?
    ????? FOR i IN 1 .. newlist.COUNT
    ????? LOOP
    ??????? IF newlist (i) IS NOT NULL
    ??????? THEN
    ??????????? DBMS_OUTPUT.put_line ('new(' || i || '): '
    ????????????????????????????????? || newlist (i).column_name
    ??????????????????????????????? );
    ??????????? print_any (newlist (i).DATA);
    ???????? END IF;
    ?????? END LOOP;
    ?
    -- Print extra attributes in row LCR
    ?????? ext_attr := rowlcr.get_extra_attribute ('row_id');
    ?
    ?????? IF (ext_attr IS NOT NULL)
    ?????? THEN
    ???????? DBMS_OUTPUT.put_line ('row_id: ' || ext_attr.accessurowid ());
    ?????? END IF;
    ?
    ?????? ext_attr := rowlcr.get_extra_attribute ('serial#');
    ?
    ?????? IF (ext_attr IS NOT NULL)
    ?????? THEN
    ???????? DBMS_OUTPUT.put_line ('serial#: ' || ext_attr.accessnumber ());
    ?????? END IF;
    ?
    ?????? ext_attr := rowlcr.get_extra_attribute ('session#');
    ?
    ?????? IF (ext_attr IS NOT NULL)
    ?????? THEN
    ???????? DBMS_OUTPUT.put_line ('session#: ' || ext_attr.accessnumber ());
    ?????? END IF;
    ?
    ?????? ext_attr := rowlcr.get_extra_attribute ('thread#');
    ?
    ?????? IF (ext_attr IS NOT NULL)
    ?????? THEN
    ???????? DBMS_OUTPUT.put_line ('thread#: ' || ext_attr.accessnumber ());
    ?????? END IF;
    ?
    ?????? ext_attr := rowlcr.get_extra_attribute ('tx_name');
    ?
    ?????? IF (ext_attr IS NOT NULL)
    ?????? THEN
    ???????? DBMS_OUTPUT.put_line (? 'transaction name: '
    ?????????????????????????????? || ext_attr.accessvarchar2 ()
    ?????????????????????????????? );
    ?????? END IF;
    ?
    ?????? ext_attr := rowlcr.get_extra_attribute ('username');
    ?
    ?????? IF (ext_attr IS NOT NULL)
    ?????? THEN
    ???????? DBMS_OUTPUT.put_line ('username: ' || ext_attr.accessvarchar2 ());
    ?????? END IF;
    ?? ELSE
    ?????? DBMS_OUTPUT.put_line ('Non-LCR Message with type ' || typenm);
    ?? END IF;
    END print_lcr;
    /
    ?
    ?
    ?
    CREATE OR REPLACE PROCEDURE print_errors
    IS
    ?? CURSOR c
    ?? IS
    ?????? SELECT? local_transaction_id, source_database, message_number,
    ?????????????? message_count, error_number, error_message
    ?????????? FROM dba_apply_error
    ?????? ORDER BY source_database, source_commit_scn;
    ?
    ? i??????? NUMBER;
    ? txnid??? VARCHAR2 (30);
    ? SOURCE? VARCHAR2 (128);
    ? msgno??? NUMBER;
    ? msgcnt? NUMBER;
    ? errnum? NUMBER??????? := 0;
    ? errno??? NUMBER;
    ? errmsg? VARCHAR2 (255);
    ? lcr????? ANYDATA;
    ? r??????? NUMBER;
    BEGIN
    ? FOR r IN c
    ? LOOP
    ????? errnum := errnum + 1;
    ????? msgcnt := r.message_count;
    ????? txnid := r.local_transaction_id;
    ????? SOURCE := r.source_database;
    ????? msgno := r.message_number;
    ????? errno := r.error_number;
    ????? errmsg := r.error_message;
    ????? DBMS_OUTPUT.put_line
    ??????????????????????? ('*************************************************');
    ????? DBMS_OUTPUT.put_line ('----- ERROR #' || errnum);
    ????? DBMS_OUTPUT.put_line ('----- Local Transaction ID: ' || txnid);
    ????? DBMS_OUTPUT.put_line ('----- Source Database: ' || SOURCE);
    ????? DBMS_OUTPUT.put_line ('----Error in Message: ' || msgno);
    ????? DBMS_OUTPUT.put_line ('----Error Number: ' || errno);
    ????? DBMS_OUTPUT.put_line ('----Message Text: ' || errmsg);
    ?
    ????? FOR i IN 1 .. msgcnt
    ????? LOOP
    ??????? DBMS_OUTPUT.put_line ('--message: ' || i);
    ??????? lcr := DBMS_APPLY_ADM.get_error_message (i, txnid);
    ??????? print_lcr (lcr);
    ????? END LOOP;
    ? END LOOP;
    END print_errors;
    /
    ?

    CREATE OR REPLACE PROCEDURE print_transaction (ltxnid IN VARCHAR2)
    IS
    ?? i??????? NUMBER;
    ?? txnid??? VARCHAR2 (30);
    ?? SOURCE? VARCHAR2 (128);
    ?? msgno??? NUMBER;
    ?? msgcnt? NUMBER;
    ?? errno??? NUMBER;
    ?? errmsg? VARCHAR2 (128);
    ? lcr????? ANYDATA;
    BEGIN
    ? SELECT local_transaction_id, source_database, message_number,
    ????????? message_count, error_number, error_message
    ??? INTO txnid, SOURCE, msgno,
    ????????? msgcnt, errno, errmsg
    ??? FROM dba_apply_error
    ??? WHERE local_transaction_id = ltxnid;
    ?
    ? DBMS_OUTPUT.put_line ('----- Local Transaction ID: ' || txnid);
    ? DBMS_OUTPUT.put_line ('----- Source Database: ' || SOURCE);
    ? DBMS_OUTPUT.put_line ('----Error in Message: ' || msgno);
    ? DBMS_OUTPUT.put_line ('----Error Number: ' || errno);
    ? DBMS_OUTPUT.put_line ('----Message Text: ' || errmsg);
    ?
    ? FOR i IN 1 .. msgcnt
    ? LOOP
    ????? DBMS_OUTPUT.put_line ('--message: ' || i);
    ????? lcr := DBMS_APPLY_ADM.get_error_message (i, txnid);??? -- gets the LCR
    ????? print_lcr (lcr);
    ? END LOOP;
    END print_transaction;
    /
    ?
    **************************************************************
    ?
    ?
    ?
    posted on 2009-06-24 21:53 decode360 閱讀(403) 評論(0)  編輯  收藏 所屬分類: 07.Oracle
    主站蜘蛛池模板: 亚洲区小说区激情区图片区| 亚洲精品国产综合久久久久紧| 99爱在线精品免费观看| 亚洲精品无播放器在线播放| 久久久久亚洲爆乳少妇无 | 亚洲无线一二三四区| 免费看国产精品3a黄的视频| 一级毛片免费播放试看60分钟| 亚洲综合一区二区国产精品| 精品免费国产一区二区三区| 久久免费福利视频| 国产亚洲欧美日韩亚洲中文色| 亚洲免费在线播放| 五月婷婷亚洲综合| 四虎免费影院ww4164h| 激情吃奶吻胸免费视频xxxx| 亚洲综合激情六月婷婷在线观看| 亚洲 自拍 另类小说综合图区| 亚洲大片免费观看| 羞羞视频免费网站在线看| 亚洲天然素人无码专区| 日本亚洲欧洲免费天堂午夜看片女人员| 在线jyzzjyzz免费视频| 麻豆高清免费国产一区| 中文字幕免费在线播放| 国产在亚洲线视频观看| 亚洲人成网站色在线观看| 亚洲国产精品一区| 亚洲永久无码3D动漫一区| 免费人成视频x8x8入口| 可以免费看黄的网站| 亚洲免费在线视频| 久久精品成人免费国产片小草| 精品久久久久久亚洲综合网| 亚洲色欲或者高潮影院| 亚洲国产成人片在线观看| 国产偷国产偷亚洲高清日韩| 免费播放春色aⅴ视频| 在线jyzzjyzz免费视频| 成人毛片手机版免费看| 美女被免费喷白浆视频|