oracle 19c 創建物化視圖並測試logminer進行日誌挖掘

来源:https://www.cnblogs.com/dbahrz/archive/2023/02/15/17121988.html
-Advertisement-
Play Games

1.創建物化視圖 alter session set container=pdb; grant create materialized view to scott; create materialized view 物化視圖名 -- 1. 創建物化視圖build [immediate | defer ...


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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 設計原則系列文章 必知必會的設計原則——單一職責原則 必知必會的設計原則——開放封閉原則 必知必會的設計原則——依賴倒置原則 必知必會的設計原則——里氏替換原則 必知必會的設計原則——介面隔離原則 必知必會的設計原則——迪米特原則 必知必會的設計原則——合成復用原則 概述 在面向對象設計中,可以通過 ...
  • 重要註意事項 由於佈線原因筆記本只能採用無線的方式連接路由器,在Windows10的環境下使用無線網卡橋接,結果軟路由無法上網,翻閱了各種帖子最終發現跟系統底層的協議棧有關係,隨即放棄使用有線網卡,不能上網等亂七八糟的問題瞬間解決,因此務必提醒各位,==千萬不要使用無線網卡橋接!!!== 參考文章如 ...
  • 前面3篇我們講解了camera的基礎概念,MIPI協議,CSI2,常用命令等,本文帶領大家入門,如何用c語言編寫應用程式來操作攝像頭。 Linux下攝像頭驅動都是基於v4l2架構,要基於該架構編寫攝像頭的應用程式,必須先要搞清楚什麼是v4l2。 1. 什麼是v4l2 v4l2是video for L ...
  • ###2.1 布爾值 布爾數據類型只有兩種:True和False,要註意大小寫。 類真與類假:其它數據類型中的一些值,條件會認為它們等價於True和False,例如:0、0.0 和 ' '(空字元串)會被認為是False,其它值被認為是True。 布爾數據類型可以用於表達式,並且可以保存到變數中,但 ...
  • Linux 配置vim/**********************************************/Vim 是最重要的編輯器之一,主要有下麵幾個優點。1.可以不使用滑鼠,完全用鍵盤操作。2.系統資源占用小,打開大文件毫無壓力。3.鍵盤命令變成肌肉記憶以後,操作速度極快。4.伺服器默 ...
  • 開發的軟體安裝後,windows上提示病毒,默默被系統刪除了。 一開始以為是自己軟體的簽名問題,後面發現,將被隔離的文件還原,文件的簽名是存在的。 這是微軟denfender的誤報,為啥會報病毒呢? emmm,這個Entry.exe是作為應用版本的啟動入口。 啟動了太多的應用,就被安全中心識別成流氓 ...
  • 閱識風雲是華為雲信息大咖,擅長將複雜信息多元化呈現,其出品的一張圖(雲圖說)、深入淺出的博文(雲小課)或短視頻(雲視廳)總有一款能讓您快速上手華為雲。更多精彩內容請單擊此處。 摘要:當HDFS集群出現DataNode節點間磁碟利用率不平衡時,會導致MapReduce應用程式無法很好地利用本地計算的優 ...
  • pdf下載:密碼7281 專欄目錄首頁:【專欄必讀】(考研覆試)資料庫系統概論第五版(王珊)專欄學習筆記目錄導航及課後習題答案詳解 SQL數據更新主要有三種形式 插入數據(INSERT) 修改數據(UPDATE) 刪除數據(DELETE) 一:插入數據(INSERT) (1)插入元組 語法:格式如下 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...