Sheared cursor detail v$sql_shared_cursor


Aşağıdaki sorgu yardımı ile, belirlediğimiz bir sql'in sqlid ni girerek, SGA içerisindeki davranış detayını, oluşturduğu child tipini görebilirsiniz.

P.S: Neden ihtiyaç duyabiliriz ?
P.S.S: Pek çok kez sql detayını incelediğimizde bir sql'in pek çok childinin oluştuğunu görebiliriz. Bunların hangi type yapısınıda olduğunun detayını bize verir. Ve buna göre aksiyon alabiliriz.


select sql_id,sebep reason,sum(decode(sorun,'Y',1,0)) adet from (
select sql_id,
UNBOUND_CURSOR ,
SQL_TYPE_MISMATCH ,
OPTIMIZER_MISMATCH ,
OUTLINE_MISMATCH ,
STATS_ROW_MISMATCH ,
LITERAL_MISMATCH ,
FORCE_HARD_PARSE ,
EXPLAIN_PLAN_CURSOR ,
BUFFERED_DML_MISMATCH ,
PDML_ENV_MISMATCH ,
INST_DRTLD_MISMATCH ,
SLAVE_QC_MISMATCH ,
TYPECHECK_MISMATCH ,
AUTH_CHECK_MISMATCH ,
BIND_MISMATCH ,
DESCRIBE_MISMATCH ,
LANGUAGE_MISMATCH ,
TRANSLATION_MISMATCH ,
BIND_EQUIV_FAILURE ,
INSUFF_PRIVS ,
INSUFF_PRIVS_REM ,
REMOTE_TRANS_MISMATCH ,
LOGMINER_SESSION_MISMATCH ,
INCOMP_LTRL_MISMATCH ,
OVERLAP_TIME_MISMATCH ,
EDITION_MISMATCH ,
MV_QUERY_GEN_MISMATCH ,
USER_BIND_PEEK_MISMATCH ,
TYPCHK_DEP_MISMATCH ,
NO_TRIGGER_MISMATCH ,
FLasHBACK_CURSOR ,
ANYDATA_TRANSFORMATION ,
PDDL_ENV_MISMATCH ,
TOP_LEVEL_RPI_CURSOR ,
DIFFERENT_LONG_LENGTH ,
LOGICAL_STANDBY_APPLY ,
DIFF_CALL_DURN ,
BIND_UACS_DIFF ,
PLSQL_CMP_SWITCHS_DIFF ,
CURSOR_PARTS_MISMATCH ,
STB_OBJECT_MISMATCH ,
CROSSEDITION_TRIGGER_MISMATCH ,
PQ_SLAVE_MISMATCH ,
TOP_LEVEL_DDL_MISMATCH ,
MULTI_PX_MISMATCH ,
BIND_PEEKED_PQ_MISMATCH ,
MV_REWRITE_MISMATCH ,
ROLL_INVALID_MISMATCH ,
OPTIMIZER_MODE_MISMATCH ,
PX_MISMATCH ,
MV_STALEOBJ_MISMATCH ,
FLasHBACK_TABLE_MISMATCH ,
LITREP_COMP_MISMATCH ,
PLSQL_DEBUG ,
LOAD_OPTIMIZER_STATS ,
ACL_MISMATCH ,
FLasHBACK_ARCHIVE_MISMATCH ,
LOCK_USER_SCHEMA_FAILED ,
REMOTE_MAPPING_MISMATCH ,
LOAD_RUNTIME_HEAP_FAILED ,
HasH_MATCH_FAILED ,
PURGED_CURSOR ,
BIND_LENGTH_UPGRADEABLE ,
USE_FEEDBACK_STATS
from v$sql_shared_cursor where sql_id='&sql_id')
unpivot (sorun for sebep in (
UNBOUND_CURSOR as 'UNBOUND_CURSOR',
SQL_TYPE_MISMATCH as 'SQL_TYPE_MISMATCH',
OPTIMIZER_MISMATCH as 'OPTIMIZER_MISMATCH',
OUTLINE_MISMATCH as 'OUTLINE_MISMATCH',
STATS_ROW_MISMATCH as 'STATS_ROW_MISMATCH',
LITERAL_MISMATCH as 'LITERAL_MISMATCH',
FORCE_HARD_PARSE as 'FORCE_HARD_PARSE',
EXPLAIN_PLAN_CURSOR as 'EXPLAIN_PLAN_CURSOR',
BUFFERED_DML_MISMATCH as 'BUFFERED_DML_MISMATCH',
PDML_ENV_MISMATCH as 'PDML_ENV_MISMATCH',
INST_DRTLD_MISMATCH as 'INST_DRTLD_MISMATCH',
SLAVE_QC_MISMATCH as 'SLAVE_QC_MISMATCH',
TYPECHECK_MISMATCH as 'TYPECHECK_MISMATCH',
AUTH_CHECK_MISMATCH as 'AUTH_CHECK_MISMATCH',
BIND_MISMATCH as 'BIND_MISMATCH',
DESCRIBE_MISMATCH as 'DESCRIBE_MISMATCH',
LANGUAGE_MISMATCH as 'LANGUAGE_MISMATCH',
TRANSLATION_MISMATCH as 'TRANSLATION_MISMATCH',
BIND_EQUIV_FAILURE as 'BIND_EQUIV_FAILURE',
INSUFF_PRIVS as 'INSUFF_PRIVS',
INSUFF_PRIVS_REM as 'INSUFF_PRIVS_REM',
REMOTE_TRANS_MISMATCH as 'REMOTE_TRANS_MISMATCH',
LOGMINER_SESSION_MISMATCH as 'LOGMINER_SESSION_MISMATCH',
INCOMP_LTRL_MISMATCH as 'INCOMP_LTRL_MISMATCH',
OVERLAP_TIME_MISMATCH as 'OVERLAP_TIME_MISMATCH',
EDITION_MISMATCH as 'EDITION_MISMATCH',
MV_QUERY_GEN_MISMATCH as 'MV_QUERY_GEN_MISMATCH',
USER_BIND_PEEK_MISMATCH as 'USER_BIND_PEEK_MISMATCH',
TYPCHK_DEP_MISMATCH as 'TYPCHK_DEP_MISMATCH',
NO_TRIGGER_MISMATCH as 'NO_TRIGGER_MISMATCH',
FLASHBACK_CURSOR as 'FLASHBACK_CURSOR',
ANYDATA_TRANSFORMATION as 'ANYDATA_TRANSFORMATION',
PDDL_ENV_MISMATCH as 'PDDL_ENV_MISMATCH',
TOP_LEVEL_RPI_CURSOR as 'TOP_LEVEL_RPI_CURSOR',
DIFFERENT_LONG_LENGTH as 'DIFFERENT_LONG_LENGTH',
LOGICAL_STANDBY_APPLY as 'LOGICAL_STANDBY_APPLY',
DIFF_CALL_DURN as 'DIFF_CALL_DURN',
BIND_UACS_DIFF as 'BIND_UACS_DIFF',
PLSQL_CMP_SWITCHS_DIFF as 'PLSQL_CMP_SWITCHS_DIFF',
CURSOR_PARTS_MISMATCH as 'CURSOR_PARTS_MISMATCH',
STB_OBJECT_MISMATCH as 'STB_OBJECT_MISMATCH',
CROSSEDITION_TRIGGER_MISMATCH as 'CROSSEDITION_TRIGGER_MISMATCH',
PQ_SLAVE_MISMATCH as 'PQ_SLAVE_MISMATCH',
TOP_LEVEL_DDL_MISMATCH as 'TOP_LEVEL_DDL_MISMATCH',
MULTI_PX_MISMATCH as 'MULTI_PX_MISMATCH',
BIND_PEEKED_PQ_MISMATCH as 'BIND_PEEKED_PQ_MISMATCH',
MV_REWRITE_MISMATCH as 'MV_REWRITE_MISMATCH',
ROLL_INVALID_MISMATCH as 'ROLL_INVALID_MISMATCH',
OPTIMIZER_MODE_MISMATCH as 'OPTIMIZER_MODE_MISMATCH',
PX_MISMATCH as 'PX_MISMATCH',
MV_STALEOBJ_MISMATCH as 'MV_STALEOBJ_MISMATCH',
FLASHBACK_TABLE_MISMATCH as 'FLASHBACK_TABLE_MISMATCH',
LITREP_COMP_MISMATCH as 'LITREP_COMP_MISMATCH',
PLSQL_DEBUG as 'PLSQL_DEBUG',
LOAD_OPTIMIZER_STATS as 'LOAD_OPTIMIZER_STATS',
ACL_MISMATCH as 'ACL_MISMATCH',
FLASHBACK_ARCHIVE_MISMATCH as 'FLASHBACK_ARCHIVE_MISMATCH',
LOCK_USER_SCHEMA_FAILED as 'LOCK_USER_SCHEMA_FAILED',
REMOTE_MAPPING_MISMATCH as 'REMOTE_MAPPING_MISMATCH',
LOAD_RUNTIME_HEAP_FAILED as 'LOAD_RUNTIME_HEAP_FAILED',
HASH_MATCH_FAILED as 'HASH_MATCH_FAILED',
PURGED_CURSOR as 'PURGED_CURSOR',
BIND_LENGTH_UPGRADEABLE as 'BIND_LENGTH_UPGRADEABLE',
USE_FEEDBACK_STATS as 'USE_FEEDBACK_STATS'
) )
group by sql_id,sebep
having sum(decode(sorun,'Y',1,0))>0;

Disable Transparent Huge Pages

Transparent Huge Pages kurulum sırasında default var (enabled) olarak gelen bir özellik. Fakat bu özelliğin disable edilmesi öneriliyor. “Doc ID 1557478.1

Transparent Huge Pages özellikle Oracle RAC ortamında, enable olması bilinmeyen node rebootlarına ve performans sorunlarına yol açıyor. Bunun yanında Huge Pages kullanımı yapılıyor ise Transparent Huge Pages disabled olmalıdır. 

Şimdi nasıl disable edeceğimize bakalım. Doc ID 1557478.1”  göre 2 farklı yönden workaround uygulanabilirsiniz. Ben aşağıdaki gibi uyguladım.  

1-) Transparent huge pages parametresini kontrol edelim
[root@s0db01  ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never

2-) Aynı şekilde AnonHugePages değeride disabled olduğunda 0 olmalı. Şuan aşağıdaki gibi
[root@s0db01  ~]# cat /proc/meminfo
MemTotal:       66087116 kB
MemFree:          373444 kB
Buffers:          311244 kB
Cached:         29615640 kB
SwapCached:            8 kB
AnonHugePages:    423936 kB
HugePages_Total:   15360
HugePages_Free:     7092
HugePages_Rsvd:     2485
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:        5360 kB
DirectMap2M:    67100672 kB
[root@s0db01  ~]#

Gördüğümüz üzere disable edilmemiş. Şimdi Disable işlemini gerçekleştirelim 

3-) grub.conf da Transparent Huge Pages disable edelim. Support.Oracle da  

grub.conf  içerisine girip güncellemeyi yapalım 

[root@s0db01  ~]# vi /etc/grub.conf










Güncelleme sonrası reboot ediyoruz. Sonra kontrol edelim
 



Oracle supplemental logging

Soru: Supplemantal logging nedir? Ve nasıl çalışır
Cevap: Database level suplemental logging, Capture edilecek database üzerinde enable edilmesi gereken bir konfigürasyondur. Bu sayede redo log izlenir ve yapılan  x bir değişiklik capture edilmiş olur.

İki çeşit olarak ayrılabilir. Minimal supplemental logging ve identification key logging. Oracle en azından minimal supplemental loging’i logMiner için enable edilmesini öneriyor.
Minimal Supplemental Logging minimal oranda bilgi capture edilmiş olur

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
Database altered.

Database level identification key level ise daha kapsamlıdır.  İçeriği ve Oracle örneklerine bakarsak 

ALL system-generated unconditional supplemental log group
This option specifies that when a row is updated, all columns of that row  are placed in the redo log file.

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
  • PRIMARY KEY system-generated unconditional supplemental log group

This option causes the database to place all columns of a row's primary key in the redo log file whenever a row containing a primary key is updated (even if no value in the primary key has changed).
If a table does not have a primary key, but has one or more non-null unique index key constraints or index keys, then one of the unique index keys is chosen for logging as a means of uniquely identifying the row being updated.
If the table has neither a primary key nor a non-null unique index key, then all columns except LONG and LOB are supplementally logged; this is equivalent to specifying ALL supplemental logging for that row. Therefore, Oracle recommends that when you use database-level primary key supplemental logging, all or most tables be defined to have primary or unique index keys.
To enable primary key logging at the database level, execute the following statement:

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
  •  UNIQUE system-generated conditional supplemental log group

This option causes the database to place all columns of a row's composite unique key or bitmap index in the redo log file if any column belonging to the composite unique key or bitmap index is modified. The unique key can be due to either a unique constraint or a unique index.
To enable unique index key and bitmap index logging at the database level, execute the following statement:
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (UNIQUE) COLUMNS;
  • FOREIGN KEY system-generated conditional supplemental log group

This option causes the database to place all columns of a row's foreign key in the redo log file if any column belonging to the foreign key is modified.

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (FOREIGN KEY) COLUMNS;

İyi çalışmalar, 
Usta

ORA-04052 Remote query fail

Bu hatayı db link ile remote db den bir distributed query çekmek isterken aldım.

SELECT o.OWNER, o.OBJECT_NAME, o.OBJECT_TYPE, os.source_size
  FROM dba_objects@db_link o, dba_object_size@db_link os
   WHERE o.OWNER=os.owner
       and o.OBJECT_NAME = os.name
       and o.OBJECT_TYPE = os.type
       and o.object_name = upper(p_OBJECT_NAME)
   

LINE/COL ERROR
-----------------------------------------------------------------
ORA-04052: error occurred when looking up remote object
SYS.IDL_UB2$@DB_LINK
ORA-00604: error occurred at recursive SQL level 1
ORA-06552: PL/SQL: Compilation unit analysis terminated
ORA-06553: PLS-201: identifier 'UNDEFINED' must be decl

workarounds olarak bir çözüm üretmek gerekirse

1-) Local db üzerinden bir view yaratabiliriz.
On local
Create or replace view remote_obje
SELECT o.OWNER, o.OBJECT_NAME, o.OBJECT_TYPE, os.source_size
  FROM dba_objects@db_link o,dba_object_size@db_link os
   WHERE o.OWNER=os.owner
       and o.OBJECT_NAME = os.name
       and o.OBJECT_TYPE = os.type
       and o.object_name = upper(p_OBJECT_NAME);

2-)Ya da remote db üzerinde bu view yaratıp sorgumuzu yapabiliriz. 
on destination

Create or replace view remote_obje 
SELECT o.OWNER, o.OBJECT_NAME, o.OBJECT_TYPE, os.source_size
   FROM dba_objects o, dba_object_size os
   WHERE o.OWNER=os.owner
       and o.OBJECT_NAME = os.name
       and o.OBJECT_TYPE = os.type
       and o.object_name = upper(p_OBJECT_NAME);

Ara