CONN / AS SYSDBA
CREATE USER snap_query IDENTIFIED BY snap_query
DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp;
GRANT CONNECT TO snap_query;
GRANT SELECT ON userb.test1 TO snap_query;
CREATE MATERIALIZED VIEW LOG ON userb.test1
TABLESPACE ts12
WITH PRIMARY KEY
EXCLUDING NEW VALUES;
關鍵點: WITH PRIMARY KEY 支持快速刷新;EXCLUDING NEW VALUES 減少日志體積 (不記錄新值,僅記錄主鍵)。
SHOW PARAMETER job_queue_processes;
ALTER SYSTEM SET job_queue_processes=10 SCOPE=SPFILE; -- 需重啟或動態生效
CREATE TABLESPACE ts_event
DATAFILE 'I:\ts_event_01.dbf' SIZE 5000M,
'I:\ts_event_02.dbf' SIZE 5000M;
CREATE USER ts12_st IDENTIFIED BY ts12_st_2010
DEFAULT TABLESPACE ts_event TEMPORARY TABLESPACE temp;
GRANT CONNECT, RESOURCE, CREATE SNAPSHOT TO ts12_st;
GRANT CREATE DATABASE LINK TO ts12_st;
-- tnsnames.ora 新增
TS12TJ = (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.81)(PORT=1521))
(CONNECT_DATA=(SERVICE_NAME=source_svc)))
-- 創建 DB Link
CONN ts12_st/ts12_st_2010
CREATE DATABASE LINK DBLINK_SNAP_QUERY
CONNECT TO snap_query IDENTIFIED BY snap_query
USING 'TS12TJ';
CREATE MATERIALIZED VIEW test1_st2
BUILD IMMEDIATE
USING INDEX
REFRESH FORCE
NEXT SYSDATE + 12/24 -- 每 12 小時自動刷新
AS
SELECT Event_ID, EVENT_CODE, CALL_TIME, TELE_X, TELE_Y, EVENT_TYPE,
EVENT_CONTENT, ROAD_CODE, PLACE, DIRECTION, PLACE_X, PLACE_Y,
UPDATE_TIME, MAIN_ASSISTANT_ROAD
FROM userb.test1@DBLINK_SNAP_QUERY;
REFRESH FORCE:優先嘗試 FAST REFRESH (需 MLog),失敗則降級 COMPLETE REFRESH。
GRANT SELECT ON mlog$_test1 TO snap_query;
MLog 表 (mlog$_test1) 也需授予查詢權限,否則快速刷新會報 ORA-12004。
EXEC DBMS_MVIEW.REFRESH('TEST1_ST2');
SELECT mview_name, last_refresh_type, last_refresh_date, staleness
FROM user_mviews;
ALTER TABLE mlog$_test1 MOVE TABLESPACE ts12; -- 移動回收高水位
-- 或
TRUNCATE TABLE mlog$_test1; -- 僅在確認無進行中刷新時執行
300 萬行數據,FORCE REFRESH 耗時約 1 小時 (含網絡傳輸)。優化建議:
- 確保源表主鍵索引、MLog 表主鍵索引完好
- 目標庫 DB_FILE_MULTIBLOCK_READ_COUNT 調大
- 並行刷新:DBMS_MVIEW.REFRESH('TEST1_ST2', METHOD=>'F', PARALLELISM=>4) (11g+)