1.1 檢查初始化參數
確認gloal_names是否爲true,job_queue_process大於0。分別在主站點和物化視圖站點執行下面兩條sqlplus 命令,檢查數據庫初始化參數是否符合要求。
show parameter global_names
show parameter job
如果初始化參數設置的不滿足要求,可以通過下列語句動態修改。
alter system set global_names = true;
alter system set job_queue_processes = 20;
1.2 檢查全局數據庫名稱
兩個數據庫的db_domain 名稱應該相同,只有db_name 不同。通過下列語句檢查主站點和物化視圖站點的全局數據庫名:
select * from global_name;
GLOBAL_NAME
--------------------------------------------------------------------------------
RANDY.REGRESS.RDBMS.DEV.US.ORACLE.COM
如果全局數據庫名設置不符合規範,可以通過如下語句動態修改。
alter database rename global_name to RANDY.REGRESS.RDBMS.DEV.US.ORACLE.COM; (主站點)
alter database rename global_name to TEST.REGRESS.RDBMS.DEV.US.ORACLE.COM; (物化視圖站點)
1.3 修改tnsnames.ora 文件
主站點和物化視圖站點的tnsnames.ora參數文件中都添加下列內容,注意需要按照實際情況修改HOST的ip地址,以及SERVICE_NAME的值,PORT一般都默認爲1521。
RANDY =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 19.168.0.66)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = randy)
)
)
TEST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 19.168.0.68)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = test)
)
)
二、主體站點配置
2.1 建立複製管理用戶並授權
以sys或者system用戶登陸到主體站點
conn sys/test as sysdba;
--建立複製管理員,在實際應用中,需要修改repadmin帳號的密碼,以確保安全。
CREATE USER repadmin IDENTIFIED BY repadmin;
--授權
BEGIN
DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA (username => 'repadmin');
END;
/
GRANT COMMENT ANY TABLE TO repadmin;
GRANT LOCK ANY TABLE TO repadmin;
GRANT SELECT ANY DICTIONARY TO repadmin;
2.2 註冊傳播者
這裏使用了管理用戶repadmin,也可以分別建立用戶。
BEGIN
DBMS_DEFER_SYS.REGISTER_PROPAGATOR (username => 'repadmin');
END;
/
2.3 註冊接收者
這裏使用了管理用戶repadmin,也可以分別建立用戶。
BEGIN
DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (
username => 'repadmin',
privilege_type => 'receiver',
list_of_gnames => NULL);
END;
/
2.4 建立物化視圖站點複製管理員的代理用戶
--出於簡單考慮,這裏也使用repadmin 用戶
BEGIN
DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (
username => 'repadmin',
privilege_type => 'proxy_snapadmin',
list_of_gnames => NULL);
END;
/
--授權
--對於repadmin 而言,不需要create session 權限
--但是這裏如果新建用戶的話,create session 權限則是必須的
GRANT CREATE SESSION TO repadmin;
GRANT SELECT ANY TABLE TO repadmin;
2.5 設置清除延遲序列的job
--以複製管理員身份登陸到主站點
CONNECT repadmin/repadmin;
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PURGE (
next_date => SYSDATE,
interval => 'SYSDATE + 1/24',
delay_seconds => 0);
END;
/
Commit;
2.6 對複製用戶授權
conn sys/test as sysdba
create user rbt
identified by rbt
default tablespace users
temporary tablespace temp;
GRANT CREATE SESSION,CREATE TABLE,CREATE PROCEDURE,CREATE SEQUENCE,CREATE TRIGGER,
CREATE VIEW,CREATE SYNONYM,ALTER SESSION,CREATE MATERIALIZED VIEW,
ALTER ANY MATERIALIZED VIEW,CREATE DATABASE LINK,select any dictionary
TO rbt;
2.7 建立複製測試表
conn sys/test as sysdba
create table rbt.jobs
as
select * from hr.jobs;
alter table rbt.jobs
add constraint pk_jobs primary key(job_id);
2.8 在主體站點上建立主體組,將複製對象增加到複製組中
conn repadmin/repadmin
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPGROUP (
gname => 'RBTSYN');
END;
/
Commit;
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPOBJECT (
gname => 'RBTSYN',
type => 'TABLE',
oname => 'JOBS',
sname => 'RBT',
use_existing_object => TRUE,
copy_rows => FALSE);
END;
/
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPOBJECT (
gname => 'RBTSYN',
type => 'INDEX',
oname => 'PK_JOBS',
sname => 'rbt',
use_existing_object => TRUE,
copy_rows => FALSE);
END;
/
--添加的時候如果一次沒有成功,再次添加可能會報ORA-23308或ORA-23309的錯誤
--使用DBMS_REPCAT.DROP_MASTER_REPOBJECT刪除對象後重新添加
2.9 在主體站點上生成複製支持
BEGIN
DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT (
sname => 'RBT',
oname => 'JOBS',
type => 'TABLE',
min_communication => TRUE);
END;
/
2.10 在主體站點上開始複製
BEGIN
DBMS_REPCAT.RESUME_MASTER_ACTIVITY (
gname =>'RBTSYN');
END;
/
2.11 主體站點上面建立物化視圖日誌表
conn rbt/rbt
create materialized view log on jobs;
3. 物化視圖站點配置
--連接到物化視圖站點
conn sys/test as sysdba;
3.1 建立物化視圖管理員並授權
CREATE USER mvadmin IDENTIFIED BY mvadmin;
BEGIN
DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA (
username => 'mvadmin');
END;
/
GRANT COMMENT ANY TABLE TO mvadmin;
GRANT LOCK ANY TABLE TO mvadmin;
GRANT SELECT ANY DICTIONARY TO mvadmin;
3.2 註冊傳播者,並授權
--這裏使用mvadmin 用戶,也可以建立單獨的用戶
BEGIN
DBMS_DEFER_SYS.REGISTER_PROPAGATOR (username => 'mvadmin');
END;
/
--建立刷新者,並授權,這裏使用mvadmin 用戶刷新物化視圖
--對於mvadmin 而言,不需要create session 權限
--但是這裏如果新建用戶的話,create session 權限則是必須的
GRANT CREATE SESSION TO mvadmin;
GRANT ALTER ANY MATERIALIZED VIEW TO mvadmin;
3.3 註冊接收者,並授權
--註冊接受者
BEGIN
DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (
username => 'mvadmin',
privilege_type => 'receiver',
list_of_gnames => NULL);
END;
/
3.4 建立到主站點公用的數據庫鏈接
--通過sys用戶,建立公用的數據庫鏈接,注意在正式使用的時候,需要按照需要修改數據--庫鏈接的名字和主站點上面的別名
CREATE PUBLIC DATABASE LINK RANDY.REGRESS.RDBMS.DEV.US.ORACLE.COM USING 'randy';
3.5 從物化視圖站點建立到主站點上代理物化視圖管理員的數據庫鏈
conn mvadmin/mvadmin
create database link RANDY.REGRESS.RDBMS.DEV.US.ORACLE.COM
connect to repadmin identified by repadmin;
3.6 在物化視圖站點設置清除延遲序列的job
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PURGE (
next_date => SYSDATE,
interval => 'SYSDATE + 1/24',
delay_seconds => 0,
rollback_segment => '');
END;
/
3.7 在物化視圖站點上設置將修改推入到主站點的job
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PUSH (
destination => 'RANDY.REGRESS.RDBMS.DEV.US.ORACLE.COM',
interval => 'sysdate + 10/(60*60*24)',
next_date => SYSDATE,
stop_on_error => FALSE,
delay_seconds => 0,
parallelism => 0);
END;
/
3.8 建立複製用戶並對其授權
create user rbt identified by rbt;
alter user rbt temporary tablespace temp;
GRANT CREATE SESSION,CREATE TABLE,CREATE PROCEDURE,CREATE SEQUENCE,
CREATE TRIGGER,CREATE VIEW,CREATE SYNONYM,ALTER SESSION,CREATE MATERIALIZED VIEW,
ALTER ANY MATERIALIZED VIEW,CREATE DATABASE LINK,select any dictionary
TO rbt;
3.9 在目標站點上面建立複製用戶到主站點代理刷新者的數據庫鏈
conn rbt/rbt
CREATE DATABASE LINK RANDY.REGRESS.RDBMS.DEV.US.ORACLE.COM
CONNECT TO repadmin IDENTIFIED BY repadmin;
3.10 在物化視圖管理帳號上建立物化視圖組
--以物化視圖管理員身份登陸物化視圖站點
CONNECT mvadmin/mvadmin
--物化視圖組必須和複製站點上的複製組名稱相同
BEGIN
DBMS_REPCAT.CREATE_MVIEW_REPGROUP (
gname => 'RBTSYN',
master => 'RANDY.REGRESS.RDBMS.DEV.US.ORACLE.COM',
propagation_mode => 'ASYNCHRONOUS');
END;
/
--創建刷新組,從物化視圖上面刷新數據到本地表
--對於只包含只讀物化視圖的站點,不需要此步驟
BEGIN
DBMS_REFRESH.MAKE (
name => 'mvadmin.rbt_refresh',
list => '',
next_date => SYSDATE,
interval => 'sysdate + 10/(60*60*24)',
implicit_destroy => FALSE,
rollback_seg => '',
push_deferred_rpc => TRUE,
refresh_after_errors => FALSE);
END;
/
--創建物化視圖
create table rbt.jobs
as
select * FROM [email protected]
where 1=2;
CREATE MATERIALIZED VIEW RBT.JOBS
ON PREBUILT TABLE
REFRESH FAST
NEXT sysdate + 5/1440
AS
SELECT * FROM [email protected];
BEGIN
DBMS_REFRESH.ADD(
name => '"MVADMIN"."RBT_REFRESH"',
list => '"RBT"."JOBS"',
lax => TRUE);
END;
--將物化視圖添加到刷新組
BEGIN
DBMS_REFRESH.ADD(
name => '"MVADMIN"."RBT_REFRESH"',
list => '"RBT"."JOBS"',
lax => TRUE);
END;
--將物化視圖添加到物化視圖組
--對於只讀物化視圖,此步驟可以省略
BEGIN
DBMS_REPCAT.CREATE_SNAPSHOT_REPOBJECT(
gname => '"RBTSYN"',
sname => '"RBT"',
oname => '"JOBS"',
type => 'SNAPSHOT',
min_communication => FALSE);
END;
BEGIN
DBMS_REPCAT.CREATE_SNAPSHOT_REPOBJECT(
gname => '"RBTSYN"',
sname => '"RBT"',
oname => '"PK_JOBS"',
type => 'INDEX');
END;
--至此,物化視圖的配置就全部完成了。
四、生成測試數據,並驗證配置
--在主站點執行數據修改
begin
for i in 1..20
loop
insert into jobs values(i,i,i,i);
end loop;
commit;
end;
/
--在複製站點驗證結果
conn rbt/rbt
select * from jobs;
JOB_ID JOB_TITLE MIN_SALARY MAX_SALARY
---------- ----------------------------------- ---------- ----------
1 1 1 1
10 10 10 10
......
19 19 19 19
20 20 20 20
5 注意事項
5.1 複製對象的限制
序列不能複製;
主鍵索引和其他索引,均需要添加到複製對象裏面,不能自動複製;
ddl語句,不會自動複製。
5.2 如何使用序列同步
只能對所有的序列,建立一個job,掃描對應表的最大id值,並定時執行,或者在需要使用的時候,手工執行序列同步job。
本文參照網上的一篇文章《oracle物化視圖配置指導書》,因爲作者沒有留下姓名,只有表示精神上的感謝了。