Logmnr獲取SQL長度超過4000的問題
如果LOGMNR獲取的SQL_REDO或SQL_UNDO的長度超過4000,則會導致Oracle自動合併拆分行記錄。
一個簡單的例子來描述這個問題:
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
Database altered.
SQL> SELECT GROUP# FROM V$LOG WHERE STATUS = 'CURRENT';
GROUP#
----------
2
SQL> ALTER SYSTEM SWITCH LOGFILE;
System altered.
SQL> SELECT GROUP# FROM V$LOG WHERE STATUS = 'CURRENT';
GROUP#
----------
3
SQL> CREATE TABLE T_LARGE_SQL (ID NUMBER, COL1 VARCHAR2(4000), COL2 VARCHAR2(4000), COL3 VARCHAR2(4000));
Table created.
SQL> INSERT INTO T_LARGE_SQL VALUES (1, 'A', 'A', 'A');
1 row created.
SQL> INSERT INTO T_LARGE_SQL VALUES (2, LPAD('B', 4000, 'B'), LPAD('B', 4000, 'B'), LPAD('B', 4000, 'B'));
1 row created.
SQL> COMMIT;
Commit complete.
SQL> SELECT MEMBER FROM V$LOGFILE WHERE GROUP# = 3;
MEMBER
----------------------------------------------------------------------------------------
/oracle/oradata/orcl/redo03.log
SQL> ALTER SYSTEM SWITCH LOGFILE;
System altered.
SQL> EXEC DBMS_LOGMNR.ADD_LOGFILE('/oracle/oradata/orcl/redo03.log', DBMS_LOGMNR.NEW)
PL/SQL procedure successfully completed.
SQL> EXEC DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG)
PL/SQL procedure successfully completed.
SQL> CREATE TABLE T_BAK_LOGMNR AS SELECT * FROM V$LOGMNR_CONTENTS;
Table created.
SQL> COL SQL_REDO FORMAT A80 WRAP
SQL> SELECT RS_ID, SSN, CSF, SQL_REDO FROM T_BAK_LOGMNR WHERE SEG_NAME =
'T_LARGE_SQL';
RS_ID SSN CSF
-------------------------------- ---------- ----------
SQL_REDO
--------------------------------------------------------------------------------
0x000069.0000001a.005c 0 0
CREATE TABLE T_LARGE_SQL (ID NUMBER, COL1 VARCHAR2(4000), COL2 VARCHAR2(4000),
C
OL3 VARCHAR2(4000));
0x000069.0000002a.0010 0 0
insert into
"TEST"."T_LARGE_SQL"("ID","COL1","COL2","COL3")
values ('1','A','A',
'A');
0x000069.0000002a.01dc 0 1
insert into
"TEST"."T_LARGE_SQL"("ID","COL1","COL2","COL3")
values ('2','BBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
.
.
.
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
0x000069.0000002a.01dc 0 1
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB','BBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
.
.
.
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
0x000069.0000002a.01dc 0 1
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB','B
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
.
.
.
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
0x000069.0000002a.01dc 0 0
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB'
);
6 rows selected.
由於SQL_REDO和SQL_UNDO都是VARCHAR2(4000)型別的欄位,當SQL本身很長導致長度超過4000時,必須透過多條記錄來儲存這一條語句。當發生這種情況時,除了SQL_REDO和SQL_UNDO外,V$LOGMNR_CONTENTS檢視中透過RS_ID和SSN來唯一標識一條語句。而CSF則標識當前是否是語句的結束部分。
比較有意思的是,Oracle並沒有給出一個順序列來標識同一個語句的多個行記錄之間的先後順序。雖然預設情況下,這個順序由Oracle自動保證,但是一旦使用者在查詢V$LOGMNR_CONTENTS檢視時新增了排序欄位,這時一個語句中的行記錄順序就可能無法保證,因此介於這種情況,對於查詢V$LOGMNR_CONTENTS檢視需要謹慎一些。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-708588/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何捕獲問題SQL解決過度CPU消耗的問題SQL
- 如何捕獲問題SQL解決過度CPU消耗問題 (zt)SQL
- 捕獲問題SQL解決過度CPU消耗問題-- 轉載SQL
- svg獲取路徑的長度SVG
- C++獲取陣列的長度C++陣列
- jquery獲取元素中文字的長度jQuery
- shell 怎麼獲取引數的長度
- 自定義聚集函式,仿wm_concat,使用CLOB,可處理超過4000長度字串函式字串
- PHP如何獲取最大檔名長度PHP
- 用 GetLength(int dimension) 獲取陣列指定維度的長度。陣列
- c# word操作篇,解決字串長度超過255就不能替換的問題C#字串
- Python 獲取檔案中最長行的長度和最長行Python
- 安卓獲取百度地圖sha1問題安卓地圖
- c語言獲取陣列長度的函式C語言陣列函式
- 通過nginx中轉獲取不到IP的問題解決Nginx
- MYSQL單行長度不能超過 65535MySql
- 產生10個長度不超過10的字串字串
- input最大長度限制問題
- 獲取C/C++字串、字元陣列長度C++字串字元陣列
- 關於filter獲取session的問題!!!FilterSession
- SpringMVC的資料獲取問題SpringMVC
- oracle 9i 獲取sql執行計劃(書寫長的sql)OracleSQL
- 執行長查詢時,怎樣獲取進度?
- ZT:字元長度與共享問題字元
- Node.js 解決Gzip下獲取真實的下載進度問題Node.js
- 關於海量資料的獲取問題
- 直播軟體原始碼,JS獲取指定長度的隨機字元原始碼JS隨機字元
- 解決Android通過BitmapFactory獲取圖片寬高度相反的問題Android
- created mounted 動態獲取資料渲染後,獲取DOM問題
- Sql Server 資料庫超時問題SQLServer資料庫
- SQL Server 查詢超時問題排查SQLServer
- shell獲取字串長度字串
- php獲取一維,二維陣列長度的方法(有例項)PHP陣列
- 預設的sql_mode,即使值的長度超過欄位的定義,也能截斷資料插入SQL
- victoriaMetrics無法獲取抓取target的問題
- js的getFullYear()和getYear()獲取年份問題JS
- MySQL中需要注意的欄位長度問題MySql
- 【轉】通過sql語句獲取資料庫的基本資訊SQL資料庫