瞭解你所不知道的SMON功能(三):清理obj$基表
SMON的作用還包括清理obj$資料字典基表(cleanup obj$)
OBJ$字典基表是Oracle Bootstarp啟動自舉的重要物件之一:
SQL> set linesize 80 ;
SQL> select sql_text from bootstrap$ where sql_text like 'CREATE TABLE OBJ$%';
SQL_TEXT
--------------------------------------------------------------------------------
CREATE TABLE OBJ$("OBJ#" NUMBER NOT NULL,"DATAOBJ#" NUMBER,"OWNER#" NUMBER NOT N
ULL,"NAME" VARCHAR2(30) NOT NULL,"NAMESPACE" NUMBER NOT NULL,"SUBNAME" VARCHAR2(
30),"TYPE#" NUMBER NOT NULL,"CTIME" DATE NOT NULL,"MTIME" DATE NOT NULL,"STIME"
DATE NOT NULL,"STATUS" NUMBER NOT NULL,"REMOTEOWNER" VARCHAR2(30),"LINKNAME" VAR
CHAR2(128),"FLAGS" NUMBER,"OID$" RAW(16),"SPARE1" NUMBER,"SPARE2" NUMBER,"SPARE3
" NUMBER,"SPARE4" VARCHAR2(1000),"SPARE5" VARCHAR2(1000),"SPARE6" DATE) PCTFREE
10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE ( INITIAL 16K NEXT 1024K MINEXTEN
TS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 OBJNO 18 EXTENTS (FILE 1 BLOCK 121))
觸發場景
OBJ$基表是一張低階資料字典表,該表幾乎對庫中的每個物件(表、索引、包、檢視等)都包含有一行記錄。很多情況下,這些條目所代表的物件是不存在的物件(non-existent),引起這種現象的一種可能的原因是物件本身已經被從資料庫中刪除了,但是物件條目仍被保留下來以滿足消極依賴機制(negative dependency)。因為這些條目的存在會導致OBJ$表不斷膨脹,這時就需要由SMON程式來刪除這些不再需要的行。SMON會在例項啟動(after startup of DB is started cleanup function again)時以及啟動後的每12個小時執行一次清理任務(the cleanup is scheduled to run after startup and then every 12 hours)。
我們可以通過以下演示來了解SMON清理obj$的過程:
SQL> BEGIN 2 FOR i IN 1 .. 5000 LOOP 3 execute immediate ('create synonym gustav' || i || ' for 4 perfstat.sometable'); 5 execute immediate ('drop synonym gustav' || i ); 6 END LOOP; 7 END; 8 / PL/SQL procedure successfully completed. SQL> startup force; ORACLE instance started. Total System Global Area 1065353216 bytes Fixed Size 2089336 bytes Variable Size 486542984 bytes Database Buffers 570425344 bytes Redo Buffers 6295552 bytes Database mounted. Database opened. SQL> select count(*) from user$ u, obj$ o 2 where u.user# (+)=o.owner# and o.type#=10 and not exists 3 (select p_obj# from dependency$ where p_obj# = o.obj#); COUNT(*) ---------- 5000 SQL> / COUNT(*) ---------- 5000 SQL> / COUNT(*) ---------- 4951 SQL> oradebug setospid 18457; Oracle pid: 8, Unix process pid: 18457, image: oracle@rh2.oracle.com (SMON) SQL> oradebug event 10046 trace name context forever ,level 1; Statement processed. SQL> oradebug tracefile_name; /s01/admin/G10R2/bdump/g10r2_smon_18457.trc select o.owner#, o.obj#, decode(o.linkname, null, decode(u.name, null, 'SYS', u.name), o.remoteowner), o.name, o.linkname, o.namespace, o.subname from user$ u, obj$ o where u.use r#(+) = o.owner# and o.type# = :1 and not exists (select p_obj# from dependency$ where p_obj# = o.obj#) order by o.obj# for update select null from obj$ where obj# = :1 and type# = :2 and obj# not in (select p_obj# from dependency$ where p_obj# = obj$.obj#) delete from obj$ where obj# = :1 /* 刪除過程其實較為複雜,可能要刪除多個字典基表上的記錄 */
現象
我們可以通過以下查詢來了解obj$基表中NON-EXISTENT物件的條目總數(type#=10),若這個總數在不斷減少說明smon正在執行清理工作
select trunc(mtime), substr(name, 1, 3) name, count(*) from obj$ where type# = 10 and not exists (select * from dependency$ where obj# = p_obj#) group by trunc(mtime), substr(name, 1, 3); select count(*) from user$ u, obj$ o where u.user#(+) = o.owner# and o.type# = 10 and not exists (select p_obj# from dependency$ where p_obj# = o.obj#);
如何禁止SMON清理obj$基表
我們可以通過設定診斷事件event=’10052 trace name context forever’來禁止SMON清理obj$基表,當我們需要避免SMON因cleanup obj$的相關程式碼而意外終止或spin從而開展進一步的診斷時可以設定該診斷事件。在Oracle並行伺服器或RAC環境中,也可以設定該事件來保證只有特定的某個節點來執行清理工作。
10052, 00000, "don't clean up obj$" alter system set events '10052 trace name context forever, level 65535'; Problem Description: We are receiving the below warning during db startup:
WARNING: kqlclo() has detected the following :
Non-existent object 37336 NOT deleted because an object
of the same name exists already.
Object name: PUBLIC.USER$
This is caused by the SMON trying to cleanup the SYS.OJB$.
SMON cleans all dropped objects which have a SYS.OBJ$.TYPE#=10.
This can happen very often when you create an object that have the same name as a public synonym.
When SMON is trying to remove non-existent objects and fails because there are duplicates,
multiple nonexistent objects with same name.
This query will returned many objects with same name under SYS schema:
select o.name,u.user# from user$ u, obj$ o where u.user# (+)=o.owner# and o.type#=10
and not exists (select p_obj# from dependency$ where p_obj# = o.obj#);
To cleanup this message:
Take a full backup of the database - this is crucial. If anything goes wrong during this procedure,
your only option would be to restore from backup, so make sure you have a good backup before proceeding.
We suggest a COLD backup. If you plan to use a HOT backup, you will have to restore point in time if any problem happens
Normally DML against dictionary objects is unsupported,
but in this case we know exactly what the type of corruption,
also you are instructing to do this under guidance from Support.
Data dictionary patching must be done by an experienced DBA.
This solution is unsupported.
It means that if there were problems after applying this solution, a database backup must be restored.
1. Set event 10052 at parameter file to disable cleanup of OBJ$ by SMON
EVENT="10052 trace name context forever, level 65535"
2. Startup database in restricted mode
3. Delete from OBJ$, COMMIT
SQL> delete from obj$ where (name,owner#) in ( select o.name,u.user# from user$ u, obj$ o
where u.user# (+)=o.owner# and o.type#=10 and not exists (select p_obj# from
dependency$ where p_obj# = o.obj#) );
SQL> commit;
SQL> Shutdown abort.
4. remove event 10052 from init.ora
5. Restart the database and monitor for the message in the ALERT LOG file
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26838672/viewspace-1839597/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 你所不知道的JavaScript(三)JavaScript
- 你所不瞭解的辦公小技巧:excel插入圖表Excel
- 你所不知道的 Transformer!ORM
- 你所不知道的cssCSS
- 你所不知道的 POST
- 你不知道的 Electron (二):瞭解 Electron 打包
- 你所不知道的XML安全XML
- 你所不知道的JavaScript 二JavaScript
- 你所不知道的ASP.NET Core進階系列(三)ASP.NET
- ·請列舉你所瞭解的測試工具
- 你所不知道的 AI 進展AI
- 你所瞭解的盲盒小程式**方式有哪些?
- 我不知道你是否真的對swoole瞭解
- 我所瞭解的 CSSCSS
- 我所瞭解的 JavsScript
- 我所瞭解的RxJSJS
- Python: 你所不知道的星號 * 用法Python
- 提升----你所不知道的JavaScript系列(3)JavaScript
- Nginx深入瞭解-基礎(三)Nginx
- Python中你所不知道的“隱藏技巧”!Python
- JavaScript中你所不知道的陣列ArrayBufferJavaScript陣列
- 你所不知道的 C# 10新特性C#
- 閉包—-你所不知道的JavaScript系列(4)JavaScript
- 描述下你所瞭解的圖片格式及使用場景
- CRM系統的銷售管理功能,你瞭解多少?
- PPT中這個不起眼的功能你瞭解多少?
- 你所不知道的Java效能優化之String!Java優化
- 你所不知道的跨域資源共享(CORS)跨域CORS
- 關於HTTP/3背後你所不知道的HTTP
- 你所不知道的阿里開源那些事兒阿里
- 你所不知道的 Chrome 控制檯除錯技巧Chrome除錯
- 你所不知道的Python | 字串連線的祕密Python字串
- 你所不知道的js的小知識點(1)JS
- 讓你詳細的瞭解資料庫防火牆的功能資料庫防火牆
- 談一談我所瞭解的HTTPSHTTP
- 效能測試工具Jmeter你所不知道的內幕JMeter
- 效能測試工具LoadRunner你所不知道的內幕
- 你所不知道的 Typescript 與 Redux 型別優化TypeScriptRedux型別優化
- 你所不知道的 CSS 陰影技巧與細節CSS