用exp、imp遷移包含物化檢視日誌的資料

space6212發表於2019-07-21


今天在測試環境中,原來正常快速重新整理的物化檢視不能同步資料了,最後發現是因為在同一個庫做exp、imp操作後使得物化檢視日誌失效了,不記錄基表的資料變化了。
在解決問題的過程中發現了其他一些問題,這裡一併記錄。


源庫:> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
PL/SQL Release 9.2.0.1.0 - Production
CORE 9.2.0.1.0 Production
TNS for 32-bit Windows: Version 9.2.0.1.0 - Production
NLSRTL Version 9.2.0.1.0 - Production

--在源庫建立使用者> create user a identified by a default tablespace suk;

使用者已建立。

> create user b identified by b default tablespace suk;

使用者已建立。

> grant connect,resource,create materialized view to a;

授權成功。

> grant connect,resource,create materialized view to b;

授權成功。

> conn
已連線。> create table t(a int primary key);

表已建立。

> create materialized view log on t;

實體化檢視日誌已建立。

> insert into t values(1);

已建立 1 行。

> commit;

提交完成。

> select * from mlog$_t;

A SNAPTIME$$ D O CHANGE_VECTOR$$
---------- -------------- - - ------------------------
1 01-1月 -00 I N FE


其他庫:
SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.4.0 - 64bit Production
PL/SQL Release 9.2.0.4.0 - Production
CORE 9.2.0.3.0 Production
TNS for Linux: Version 9.2.0.4.0 - Production
NLSRTL Version 9.2.0.4.0 - Production

--在其他庫建立使用者
SQL> create user suk identified by suk default tablespace suk;

User created.

SQL> create user a identified by a default tablespace suk;

User created.

SQL> grant connect,resource,create materialized view to suk;

Grant succeeded.

SQL> grant connect,resource,create materialized view to a;

Grant succeeded.


1、匯入同一個庫中的另一個使用者
E:oracleora92bin>imp
file=e:a.dmp fromuser=a touser=b log=e:b.log

Import: Release 9.2.0.1.0 - Production on 星期二 10月 30 13:46:10 2007

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.


連線到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production

經由常規路徑匯出由EXPORT:V09.02.00建立的檔案

警告: 此物件由 A 匯出, 而不是當前使用者

已經完成ZHS16GBK字符集和AL16UTF16 NCHAR 字符集中的匯入
. . 正在匯入表 "MLOG$_T" 1行被匯入
. . 正在匯入表 "T" 1行被匯入
IMP-00015: 由於物件已存在,下列語句失敗:
"CREATE SNAPSHOT LOG ON "A"."T" WITH PRIMARY KEY EXCLUDING NEW VALUES USING "
"("MLOG$_T", (5, 'TEST1.COM', 98, '2007-10-30:13:43:30', '2007-10-30:13:43:3"
"0', '2007-10-30:13:43:30', '4000-01-01:00:00:00', '4000-01-01:00:00:00', 1,"
" "A", '2007-10-30:13:43:30', 2, 0, ("RUPD$_T")))"
成功終止匯入,但出現警告。

匯入失敗,從log看原因很清楚:雖然是要匯入到其他使用者下,但建立物化檢視日誌時仍然嘗試在原來的使用者下建立,結果當然是失敗的。
這個還不是最主要的,最嚴重的是這樣導致了原來的物化檢視日誌失效。

> col CHANGE_VECTOR$$ format a30> select * from mlog$_t;

A SNAPTIME$$ D O CHANGE_VECTOR$$
---------- -------------- - - ------------------------------
1 01-1月 -00 I N FE

> insert into t values(2);

已建立 1 行。

> select * from mlog$_t;

A SNAPTIME$$ D O CHANGE_VECTOR$$
---------- -------------- - - ------------------------------
1 01-1月 -00 I N FE

從上面看到,物化檢視日誌已經不能記錄基表的資料變化,所有基於這個表的快速重新整理的物化檢視將不能快速重新整理(重新整理時不會報錯,但是資料修改的資料同步不過去)。
此時的解決方式是,重建原來使用者的物化檢視日誌,然後對引用到這些表的物化檢視做一次完全重新整理。

2、匯入其他庫中的其他使用者
[oracle@datasrv1 dmp]$ imp suk/suk file=a.dmp fromuser=a touser=suk log=imp_suk.log

Import: Release 9.2.0.4.0 - Production on 星期二 10月 30 13:16:04 2007

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.


Connected to: Oracle9i Enterprise Edition Release 9.2.0.4.0 - 64bit Production
With the Partitioning option
JServer Release 9.2.0.4.0 - Production

Export file created by EXPORT:V09.02.00 via conventional path

Warning: the objects were exported by A, not by you

import done in ZHS16GBK character set and AL16UTF16 NCHAR character set
. . importing table "MLOG$_T" 1 rows imported
. . importing table "T" 1 rows imported
IMP-00017: following statement failed with ORACLE error 942:
"BEGIN SYS.DBMS_SNAPSHOT_UTL.SYNC_UP_LOG('A','T'); END;"
IMP-00003: ORACLE error 942 encountered
ORA-00942: table or view does not exist
ORA-06512: at "SYS.DBMS_SNAPSHOT_UTL", line 1589
ORA-06512: at line 1
"CREATE SNAPSHOT LOG ON "A"."T" WITH PRIMARY KEY EXCLUDING NEW VALUES USING "
"("MLOG$_T", (5, 'TEST1.COM', 98, '2007-10-30:13:43:30', '2007-10-30:13:43:3"
"0', '2007-10-30:13:43:30', '4000-01-01:00:00:00', '4000-01-01:00:00:00', 1,"
" "A", '2007-10-30:13:43:30', 2, 0, ("RUPD$_T")))"
IMP-00003: ORACLE error 1435 encountered
ORA-01435: user does not exist
IMP-00000: Import terminated unsuccessfully

匯入失敗,原因和上面所述一樣。
SQL> conn suk/suk
Connected.

SQL> select * from tab;

TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
MLOG$_T TABLE
RUPD$_T TABLE
T TABLE

oracle在匯入的時候是先建立物化檢視日誌表,然後再建立物化檢視日誌的。在這裡,物化檢視日誌表雖然建立成功了,但是物化檢視日誌不能建立成功,此時這系列MOG$_、RUPD$_沒有任何作用。
這種情況下,如果需要在T上記錄物化檢視日誌,則在刪除對應的MLOG$和RUPD$表後重建物化檢視日誌。
如果有必要,你還需要在其他庫上重建指向這些表的物化檢視。

3、匯入其他庫中的相同使用者
[oracle@datasrv1 dmp]$ imp a/a file=a.dmp fromuser=a touser=a log=imp_a.log

Import: Release 9.2.0.4.0 - Production on 星期二 10月 30 13:53:14 2007

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.


Connected to: Oracle9i Enterprise Edition Release 9.2.0.4.0 - 64bit Production
With the Partitioning option
JServer Release 9.2.0.4.0 - Production

Export file created by EXPORT:V09.02.00 via conventional path
import done in ZHS16GBK character set and AL16UTF16 NCHAR character set
. . importing table "MLOG$_T" 1 rows imported
. . importing table "T" 1 rows imported
Import terminated successfully without warnings.

從匯入資訊看,完全沒有錯誤,且物化檢視日誌仍然有效。

SQL> select * from mlog$_t;

A SNAPTIME$$ D O CHANGE_VECTOR$$
---------- ---------- - - ------------------------------
1 01-1月 -00 I N FE

SQL> insert into t values(10);

1 row created.

SQL> select * from mlog$_t;

A SNAPTIME$$ D O CHANGE_VECTOR$$
---------- ---------- - - ------------------------------
1 01-1月 -00 I N FE
10 01-1月 -00 I N FE

從這個測試看,物化檢視日誌也可以反應基表資料的變化,那麼基於這個表的物化檢視也可以快速重新整理。


對於這個問題,Utilities的import章節有如下解釋:

Importing a Snapshot into a Different Schema
Snapshots, snapshot logs, and related items are exported with the schema name explicitly given in the DDL statements; therefore, snapshots and their related items cannot be imported into a different schema.

If you attempt to use FROMUSER and TOUSER to import snapshot data, an error will be written to the Import log file and the items will not be imported.

但是為何在把含有物化檢視日誌的表匯入到同一個庫的另一個使用者後,會使物化檢視日誌失效的問題這裡仍然沒有解釋。

結論:
1、含有物化檢視日誌的表匯入到同一個庫的另一個使用者後,原來使用者下物化檢視日誌會失效;新使用者的物化檢視日誌不能成功匯入。
2、含有物化檢視日誌的表匯入到另一個庫的另一個使用者後,原來使用者下的物化檢視日誌不受影響;物化檢視日誌不能成功匯入到新資料庫中。
3、含有物化檢視日誌的表匯入到另一個庫的同一個使用者後,原來使用者下的物化檢視日誌不受影響;物化檢視日誌可以成功匯入到新資料庫中並正常工作。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/231499/viewspace-63872/,如需轉載,請註明出處,否則將追究法律責任。

相關文章