當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
……省略執行輸出……
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$;
删除腳本已經生成完畢。
批量執行這些腳本即可,注意最前面的四個資料庫對象不要删除。
在删除的過程也許會遇到很多ORA錯誤,根據具體提示進行處理即可。確定清理的完整性。
4.重複資料清理效果确認
OK,重複資料庫對象清理完畢。
5.小結
這裡提醒各位DBA朋友的是:
1)對生産系統進行更新和手工操作之前盡量做好有效備份;
2)執行手工維護前一定要確定執行的目前使用者是否正确;
3)出現問題後不要急于處理,做好缜密分析;
4)處理過程中盡量選擇批量的方法以便節省時間。
本文提到的方法同樣适用于多個普通使用者間出現重複資料庫對象的場景。
Good luck.
secooler
11.04.26
-- The End --