近日公司有一個9i 的Oracle數據庫,運行效率低下。想要將其升級到11G. 但是升級之前 要將數據進行同步,好在表不是很多。只有三張表。業務壓力也不大,就想到了使用物 化視圖的方式將數據同步過來。
1.1 環境
| 數據庫主機 | IP地址 | TNS | DB_LINK | ORACLE 版本 |
|---|---|---|---|---|
| db2 | 10.100.99.114 | to_118 |
11G | |
| db1 | 10.100.99.118 | 9iG |
上面是本次操作測試的環境。說明: 將9i 數據庫中的表實時同步到11G.
1.2 在db2配置指向db1的tns
配置tns 方便創建dblink。當然不配置也可以創建。此步完全依賴於個人愛好。 我習慣配置,在創建dblink時,會更簡潔一些。TNS如下:
t118 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.100.99.114)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ktdb)
)
)
1.3 在db2的數據庫中創建dblink
create public database link to_118 connect to test identified by test123 using 't118';
1.4 給db1中相應的表上添加物化視圖日志
1.4.1 有主鍵表
create table test(id number,name varchar2(20)); alter table test add constraint pk_testid primary key(id); create materialized view log on test with primary key;
對於有主鍵的表,日志依賴於主鍵。
create materialized view log on test with primary key;
1.4.2 無主鍵表
對於無主鍵的表,依賴於rowid
create table test_noprimarykey(id number,name varchar2(20)); create materialized view log on test_noprimarykey with rowid;
1.5 在db2上創建物化視圖
分布式查詢中(也就是使用db_link), 不能以on commit 方式指定刷新方式,創建時會遇到ORA-12054.
1.5.1 有主鍵表的物化視圖
CREATE MATERIALIZED VIEW dbmon.test
(id,name)
REFRESH force
start with sysdate next sysdate+1/1440 # 指定刷新頻率為1分鍾
AS
SELECT id,name FROM dbmon.test@to_118;
1.5.2 無主鍵表的物化視圖
CREATE MATERIALIZED VIEW test_noprimarykey
(id,name)
REFRESH force
start with sysdate next sysdate+1/1440 # 指定刷新頻率為1分鍾
WITH rowid
AS
SELECT id,name FROM dbmon.test_noprimarykey@to_118;
1.6 測試數據同步
在db1數據庫插入數據后,稍等 1分鍾,然后連到db2數據庫查看結果。
1.6.1 有主鍵表
在db1 上向表中插入一行數據:
insert into test values(1,'aaa'); commit;
1.6.2 無主鍵表
insert into test values(1,'bbb');
commit;
