1.創建物化視圖
alter session set container=pdb; grant create materialized view to scott;
create materialized view 物化視圖名 -- 1. 創建物化視圖
build [immediate | deferred] -- 2. 創建方式,默認 immediate
refresh [force | fast | complete | never] -- 3. 物化視圖重繪方式,默認 force
on [commit | demand] -- 4. 重繪觸發方式
start with 開始時間 -- 5. 設定開始時間
next 間隔時間 -- 6. 設定間隔時間
with [primary key | rowid] -- 7. 型別,默認 primary key
[enable | disable] query rewrite -- 8. 是否啟用查詢重寫
as -- 9. 關鍵字
查詢陳述句; -- 10. select 陳述句
創建語法解釋
1. "創建 build" 的方式 (1) 'immediate':立即生效,默認, (2) 'deferred' : 延遲至第一次 refresh 時才生效 2. "重繪 refresh" 的方式 (1) force :默認,如果可以 '快速重繪' 就 '快速重繪',否則執行 '完全重繪' (2) fast :'快速重繪',只重繪 '增量' 部分(前提:創建 '物化日志') (3) complete: '完全重繪',重繪時更新全部資料,包括視圖中已經生成的原有資料 (4) never : 從不重繪 3. "觸發" (請注意,on demand 中,才需要設定 '開始時間' 和 '間隔時間') -- 沖突 (1) on commit:基表有 commit 動作時,重繪刷圖("不能跨庫執行") (2) on demand:在需要時重繪 [1] 根據后面設定的 '開始時間' 和 '結束時間' 進行重繪 [2] 手動呼叫 dbms_mview 包中的程序進行重繪 4. 基于基表的 primary key 或 rowid 創建 (1) 如果是基于 rowid,則不能對基表執行 '分組函式'、'多表連接' 等需要把 多個 rowid 合成一行的操作(理由很簡單:到底以哪個 rowid 為準呢?) 5. enable query rewrite 啟用查詢重寫(請注意, '開始時間' 和 '間隔時間' 不支持)-- 沖突 (1) 不支持的理由也很簡單, 所謂的 '重寫',就是講對基表的查詢定位到物化視圖上, 而 '開始時間' 和 '間隔時間' 會造成物化視圖上部分資料延遲,所以,不能重寫 (2) 引數: query_rewrite_enabled (可通過 v$parameter 視圖查詢)
測驗延時重繪
scott用戶創建表
CREATE TABLE person_info ( person_no VARCHAR2(10), NAME VARCHAR2(30), create_date DATE ); INSERT INTO person_info(person_no, NAME, create_date) VALUES('001', '瑤瑤', SYSDATE); INSERT INTO person_info(person_no, NAME, create_date) VALUES('002', '倩倩', SYSDATE); COMMIT;
創建1分鐘重繪一次物化視圖
CREATE MATERIALIZED VIEW mvw_person_info BUILD IMMEDIATE REFRESH FORCE ON DEMAND START WITH SYSDATE NEXT SYSDATE + 1/1440 AS SELECT pi.person_no, pi.name, pi.create_date FROM person_info pi;
測驗陳述句:先查詢,等個十幾秒在執行 insert,再等 1 分鐘左右,觀察前后資料
SELECT * FROM mvw_person_info;
INSERT INTO person_info(person_no, NAME, create_date) VALUES('003', '美眉', SYSDATE);
commit;
select * from mvw_person_info;
查詢物化視圖
1. 查詢物化視圖,非 DBA 用戶,請查詢 all_mviews 或 user_mviews SELECT * FROM dba_mviews t WHERE t.owner = 'SCOTT' AND t.mview_name = 'MVW_PERSON_INFO'; 2. 查詢一般視圖 SELECT * FROM dba_views;
修改物化視圖
alter materialized view 物化視圖名 refresh [force | fast | complete | never] on [commit | demand] start with 開始時間 next 間隔時間
洗掉物化視圖
drop materialized view 物化視圖名;
手動重繪
BEGIN dbms_mview.refresh(list => '視圖名', method => 'fast', -- 增量重繪 refresh_after_errors => TRUE); END;
2.創建物化視圖日志
1. 適用于 'fast' 增量重繪 2. with primary key 3. with rowid
測驗 with primary key
CREATE TABLE student_info ( student_no VARCHAR2(10), NAME VARCHAR2(30) ); ALTER TABLE student_info ADD CONSTRAINT pk_student_info_student_no PRIMARY KEY(student_no);
創建物化視圖日志
create materialized view log on student_info with primary key [including new values]; -- including new values 允許 Oracle 將資料庫 新、舊值都保存在物化視圖日志中 -- 即 update 前 和 update 后都保存,按需設定即可
插入一條資料
INSERT INTO student_info(student_no, NAME) VALUES('001', '小優子');
UPDATE student_info t SET t.name = '小游子' WHERE t.student_no = '001';
COMMIT;
查詢物化視圖日志資訊
SELECT * FROM all_mview_logs; SELECT * FROM mlog$_student_info;
with rowid 測驗
創建 'fast' 增量模式的物化視圖條件: (1) select 陳述句中包含到的每一個表都需要創建 '物化日志' (2) select 中必須包含涉及到所有表的 'rowid' (3) select 中必須明確具體的列,不允許使用 '*'
創建表
CREATE TABLE test_a ( a_id VARCHAR(10), NAME VARCHAR2(30) ); ALTER TABLE test_a ADD CONSTRAINT pk_test_a_a_id PRIMARY KEY(a_id); CREATE TABLE test_b ( b_id VARCHAR(10), NAME VARCHAR2(30) ); ALTER TABLE test_b ADD CONSTRAINT pk_test_b_b_id PRIMARY KEY(b_id);
創建物化視圖日志
create materialized view log on test_a with rowid including new values; create materialized view log on test_b with rowid including new values;
fast 增量測驗
創建表
CREATE MATERIALIZED VIEW mvw_test_ab REFRESH FAST WITH ROWID ON DEMAND START WITH SYSDATE NEXT SYSDATE + 3/1440 AS SELECT t1.a_id, t1.name a_name, t1.rowid a_rowid, t2.b_id, t2.name b_name, t2.rowid b_rowid FROM test_a t1, test_b t2 WHERE t1.a_id = t2.b_id;
查詢此時沒有資料
SELECT * FROM mvw_test_ab; SELECT * FROM all_mview_logs; SELECT * FROM mlog$_test_a; SELECT * FROM mlog$_test_b;
插入資料
INSERT INTO test_a(a_id, NAME) VALUES('1', 'a1'); INSERT INTO test_a(a_id, NAME) VALUES('2', 'a2'); INSERT INTO test_a(a_id, NAME) VALUES('3', 'a3'); INSERT INTO test_b(b_id, NAME) VALUES('1', 'b1'); INSERT INTO test_b(b_id, NAME) VALUES('2', 'b2'); INSERT INTO test_b(b_id, NAME) VALUES('3', 'b3'); COMMIT;
在次查詢有資料
SQL> SELECT * FROM mlog$_test_b; M_ROW$$ -------------------------------------------------------------------------------- SNAPTIME$ D O CHANGE_VECTOR$$ XID$$ --------- - - -------------------- ---------- AAASHJAAaAAAAEdAAA 01-JAN-00 I N FE 1.9704E+15 AAASHJAAaAAAAEdAAB 01-JAN-00 I N FE 1.9704E+15 AAASHJAAaAAAAEdAAC 01-JAN-00 I N FE 1.9704E+15
3.進行日志挖掘
查看當前日志
SQL> select max(SEQUENCE#) from v$archived_log; MAX(SEQUENCE#) -------------- 187
日志切換
alter system archive log current;
安裝 LogMiner
@$ORACLE_HOME/rdbms/admin/dbmslm.sql
@$ORACLE_HOME/rdbms/admin/dbmslmd.sql
這兩個腳本必須均以 DBA 用戶身份運行,其中第一個腳本用來創建 DBMS_LOGMNR 包,該包用來分析日志檔案,第二個腳本用來創建 DBMS_LOGMNR_D 包,該包用來創建資料字典檔案,
創建完畢后將包括如下程序和視圖:
|
型別 |
程序名 |
用途 |
|---|---|---|
|
程序 |
Dbms_logmnr_d.build |
創建一個資料字典檔案 |
|
程序 |
Dbms_logmnr.add_logfile |
在類表中增加日志檔案以供分析 |
|
程序 |
Dbms_logmnr.start_logmnr |
使用一個可選的字典檔案和前面確定要分析日志檔案來啟動 LogMiner |
|
程序 |
Dbms_logmnr.end_logmnr |
停止 LogMiner 分析 |
|
視圖 |
V$logmnr_dictionary |
顯示用來決定物件 ID 名稱的字典檔案的資訊 |
|
視圖 |
V$logmnr_logs |
在 LogMiner 啟動時顯示分析的日志串列 |
|
視圖 |
V$logmnr_contents |
LogMiner 啟動后,可以使用該視圖在 SQL 提示符下輸入 SQL 陳述句來查詢重做日志的內容 |
創建資料字典檔案
LogMiner 工具實際上是由兩個新的 PL/SQL 內建包( (DBMS_LOGMNR 和 DBMS_LOGMNR_D)和四個 V$動態性能視圖(視圖是在利用程序 DBMS_LOGMNR.START_LOGMNR啟動 LogMiner 時創建)組成,在使用 LogMiner 工具分析 redo log 檔案之前,可以使用DBMS_LOGMNR_D 包將資料字典匯出為一個文本檔案,該字典檔案是可選的,但是如果沒有它, LogMiner 解釋出來的陳述句中關于資料字典中的部分(如表名、列名等)和數值都將是 16進制的形式,我們是無法直接理解的,例如,下面的 sql 陳述句:
INSERT INTO dm_dj_swry (rydm, rymc) VALUES (00005, '張三');
insert into Object#308(col#1, col#2) values (hextoraw('c30rte567e436'),hextoraw('4a6f686e20446f65'));
CREATE DIRECTORY utlfile AS '/home/oracle/LOGMNR'; alter system set utl_file_dir='/home/oracle/LOGMNR' scope=spfile;
這個方式放棄等后續問問別人
直接分析方式
exec dbms_logmnr.add_logfile(logfilename => '/home/oracle/arch11/1_189_1106805210.dbf',options=>dbms_logmnr.new); exec dbms_logmnr.add_logfile(logfilename => '/home/oracle/arch11/1_189_1106805210.dbf',options=>dbms_logmnr.addfile); exec dbms_logmnr.start_logmnr(options => dbms_logmnr.dict_from_online_catalog); set linesize 200 alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; select timestamp,commit_timestamp,sql_redo from v$logmnr_contents where table_name like '%PER%' and operation='INSERT';
查看分析結果如下
2023-02-14 21:56:22 insert into "SCOTT"."PERSON_INFO"("PERSON_NO","NAME","CREATE_DATE") values ('003','hrz',TO_DATE('2023-02-14 21:56:21', 'yyyy-mm-dd hh24:mi:ss'));
注意:logmnior最大表字符支持最大30,欄位也是字符最大30個
The tables or column names selected for mining must not exceed 30 characters.
本文來自博客園,作者:蚌殼里夜有多長,轉載請注明原文鏈接:https://www.cnblogs.com/dbahrz/p/17121988.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/544063.html
標籤:Oracle
