【去重】當SYS和SYSTEM使用者出現重複資料庫物件時的應對措施
當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 --
什麼情況下會出現這種重複現象呢?
一般情況下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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料庫存資料時,邏輯上防重了為啥還會出現重複記錄?資料庫
- Oracle:重複資料去重,只取最新的一條資料Oracle
- 2.5.2 保護資料庫:為SYS和SYSTEM使用者指定密碼資料庫密碼
- es6陣列去重(連重複的物件也可以去掉)陣列物件
- 小心避坑:MySQL分頁時出現的資料重複問題MySql
- 陣列合並且去重&向一個陣列新增一條資料(重複的就不新增)&陣列物件去重處理陣列物件
- mysql連表查詢出現資料重複MySql
- java陣列中重複元素的去重Java陣列
- MySQL去重資料MySql
- 陣列物件去重陣列物件
- sql - distinct 去重複的用法SQL
- ClickHouse 實時資料去重final+group by
- php資料庫資料如何去除重複資料呢?PHP資料庫
- 【資料庫】PostgreSQL中使用`SELECT DISTINCT`和`SUBSTRING`函式實現去重查詢資料庫SQL函式
- 【Flink】基於 Flink 的流式資料實時去重
- C#資料去重C#
- js物件陣列去重JS物件陣列
- js陣列物件去重JS陣列物件
- python對excel檔案中指定表格的指定列資料進行去重複操作。PythonExcel
- Cannot set property ‘dataIndex‘ of undefined 大資料關係圖報錯,賦予的資料有重複,去重AIIndexUndefined大資料
- KaiwuDB 時序引擎資料去重功能詳解AI
- mysql 查詢出重複資料的第一條MySql
- mysql 清除重複資料MySql
- 刪除重複資料
- dataset 判斷整列是否有重複,找出重複資料
- List中去除重複物件物件
- iOS 模型陣列去重複iOS模型陣列
- js 去掉陣列物件中的重複物件JS陣列物件
- java繼承——對物件中的重複內容說ByeJava繼承物件
- MySQL 查詢重複的資料MySql
- 陣列物件的去重然後排序陣列物件排序
- mybatis oracle資料庫批次插入資料,忽略主鍵重複MyBatisOracle資料庫
- [重慶思莊每日技術分享]-使用RMAN活動複製資料庫時出現報錯Ora-19625資料庫
- 原生JS去重(一)--兩種方法去掉重複字元JS字元
- 大資料去重(data deduplication)方案大資料
- mongodb如何去除重複資料MongoDB
- mysql避免插入重複資料MySql
- MySQL 處理重複資料MySql
- mongodb刪除重複資料MongoDB