【去重】當SYS和SYSTEM使用者出現重複資料庫物件時的應對措施

secooler發表於2011-04-26
  當SYS和SYSTEM使用者中出現重複資料庫物件的時候會對資料庫的使用帶來很多的問題。系統一旦使用到這些重複物件的時候將會報錯。

  什麼情況下會出現這種重複現象呢?
  一般情況下SYS和SYSTEM使用者下的資料庫物件都是在資料庫安裝的過程中完成的。不過個別情況下為了部署新特性需要手工執行建立指令碼。一般規律是這樣的:但凡涉及到手工操作的部分,就潛在出錯因素,一旦可能出錯,便一定會出錯。這便是“墨菲定律”。

  本文給出這類故障的模擬和處理方法。

1.確認系統SYS和SYSTEM使用者中是否存在重複資料庫物件
sys@ora10g> show user
USER is "SYS"
sys@ora10g> select object_name, object_type from dba_objects where (object_name,object_type) in (select object_name,object_type from dba_objects where wner = 'SYS') and wner = 'SYSTEM';

OBJECT_NAME                    OBJECT_TYPE
------------------------------ -------------------
AQ$_SCHEDULES                  TABLE
AQ$_SCHEDULES_PRIMARY          INDEX
DBMS_REPCAT_AUTH               PACKAGE
DBMS_REPCAT_AUTH               PACKAGE BODY

注意,以上四條重複資訊是正常現象,不要人為刪除。

除此之外的資訊需要考慮清理。

2.模擬誤操作導致生成重複資料庫物件
$ORACLE_HOME/rdbms/admin目錄下的大部分指令碼都應該在SYS使用者下執行,如果手工在SYSTEM使用者下執行後便會出現重複問題。
我們選取其中一個指令碼sql.bsq在SYSTEM使用者下執行。

system@ora10g> show user
USER is "SYSTEM"
system@ora10g> @sql.bsq
……省略執行輸出……

sys@ora10g> select object_name, object_type from dba_objects where (object_name,object_type) in (select object_name,object_type from dba_objects where wner = 'SYS') and wner = 'SYSTEM';

OBJECT_NAME                    OBJECT_TYPE
------------------------------ -------------------
AQ$_SCHEDULES                  TABLE
AQ$_SCHEDULES_PRIMARY          INDEX
DBMS_REPCAT_AUTH               PACKAGE
DBMS_REPCAT_AUTH               PACKAGE BODY
I_INDSUBPART_POBJSUBPART$      INDEX
I_INDSUBPART_OBJ$              INDEX
INDCOMPART$                    TABLE
I_INDCOMPART_BOPART$           INDEX
I_INDCOMPART$                  INDEX
……省略部分輸出資訊……
C_COBJ#                        CLUSTER
I_COBJ#                        INDEX
CCOL$                          TABLE
I_ICOL1                        INDEX
I_CCOL1                        INDEX
I_CCOL2                        INDEX
TSQ$                           TABLE
SUPEROBJ$                      TABLE
I_SUPEROBJ1                    INDEX
I_SUPEROBJ2                    INDEX
IDL_UB1$                       TABLE
IDL_CHAR$                      TABLE

122 rows selected.

可見此時在SYSTEM使用者下出現了很多重複的資料庫物件。

3.批次刪除重複的資料庫物件
可以使用SQL指令碼生成批次傷處重複物件的指令碼。
sys@ora10g> select 'DROP ' || object_type || ' SYSTEM.' || object_name || ';' "Generate Drop Scrips" from dba_objects where object_name||object_type in (select object_name||object_type from dba_objects where wner = 'SYS') and wner = 'SYSTEM';

Generate Drop Scrips
-----------------------------------------------------------------------------------------------------------------------------------
DROP TABLE SYSTEM.AQ$_SCHEDULES;
DROP INDEX SYSTEM.AQ$_SCHEDULES_PRIMARY;
DROP PACKAGE SYSTEM.DBMS_REPCAT_AUTH;
DROP PACKAGE BODY SYSTEM.DBMS_REPCAT_AUTH;
DROP INDEX SYSTEM.I_INDSUBPART_POBJSUBPART$;
DROP INDEX SYSTEM.I_INDSUBPART_OBJ$;
DROP TABLE SYSTEM.INDCOMPART$;
DROP INDEX SYSTEM.I_INDCOMPART_BOPART$;
DROP INDEX SYSTEM.I_INDCOMPART$;
DROP TABLE SYSTEM.PARTLOB$;
……省略部分輸出資訊……
DROP CLUSTER SYSTEM.C_COBJ#;
DROP INDEX SYSTEM.I_COBJ#;
DROP TABLE SYSTEM.CCOL$;
DROP INDEX SYSTEM.I_ICOL1;
DROP INDEX SYSTEM.I_CCOL1;
DROP INDEX SYSTEM.I_CCOL2;
DROP TABLE SYSTEM.TSQ$;
DROP TABLE SYSTEM.SUPEROBJ$;
DROP INDEX SYSTEM.I_SUPEROBJ1;
DROP INDEX SYSTEM.I_SUPEROBJ2;
DROP TABLE SYSTEM.IDL_UB1$;
DROP TABLE SYSTEM.IDL_CHAR$;

122 rows selected.

刪除指令碼已經生成完畢。
批次執行這些指令碼即可,注意最前面的四個資料庫物件不要刪除。
在刪除的過程也許會遇到很多ORA錯誤,根據具體提示進行處理即可。確保清理的完整性。

4.重複資料清理效果確認
sys@ora10g> select object_name, object_type from dba_objects where (object_name,object_type) in (select object_name,object_type from dba_objects where wner = 'SYS') and wner = 'SYSTEM';

OBJECT_NAME                    OBJECT_TYPE
------------------------------ -------------------
AQ$_SCHEDULES                  TABLE
AQ$_SCHEDULES_PRIMARY          INDEX
DBMS_REPCAT_AUTH               PACKAGE
DBMS_REPCAT_AUTH               PACKAGE BODY

OK,重複資料庫物件清理完畢。

5.小結
這裡提醒各位DBA朋友的是:
1)對生產系統進行升級和手工操作之前儘量做好有效備份;
2)執行手工維護前一定要確保執行的當前使用者是否正確;
3)出現問題後不要急於處理,做好縝密分析;
4)處理過程中儘量選擇批次的方法以便節省時間。

本文提到的方法同樣適用於多個普通使用者間出現重複資料庫物件的場景。

Good luck.

secooler
11.04.26

-- The End --

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

相關文章