Sepetiniz

ORA-48318: ADR Relation [HM_FINDING] of version=5 cannot be supported hatası

Oracle veritabanlarında downgrade işlemi ya da adrci üzerinden “migrate schema” işlemi yapıldığında , adrci kullanırken , “SYS”.”DRA_REEVALUATE_OPEN_FAILURES” isimli job çalıştığında ORA-48318 hatası alınmaktadır. Hatadaki version değeri değişiklik gösterebilir. 

Sorunun çözümü için veritabanı instance’ı kapalı iken ADR Home dizinin silinmesi ve instance ‘ın açılması gerekmektedir. Instance açıldığında otomatik olarak ilgili versiyonda ADR home dizini oluşacaktır.

Aşağıdaki sorgu ile önce ADR Home dizini tespit edilir.

SQL> select value from v$diag_info where name = 'ADR Home';

VALUE
--------------------------------------------------------------------------------
/u01/app/oracle/diag/rdbms/orcl/ORCL1

İlgili instance kapatılır. sqlplus yada srvctl ile kapatabilirsiniz.

srvctl stop instance -d ORCL -i ORCL1

root kullanıcısı ile ADR Home dizini silinir.

[root@orcldb01 ~]# cd /u01/app/oracle/diag/rdbms/orcl/
[root@orcldb01 orcl]# rm -rf ORCL1/

Sonrasında instance başlatılır.

srvctl start instance -d ORCL -i ORCL1

Bu işlemler RAC veritabanları için tüm instance’larda yapılmalıdır. Instance başladığında olması gerektiği versiyonda ADR Home oluşacak ve hata alınmayacaktır.

 

 

 

Oracle veritabanı ORA hatalarının periyodik olarak e-posta ile bildirimi

Oracle veritabanlarında oluşan ORA- şeklinde hataların belirli periyodlarla e-posta adresine gönderimini sağlayabilirsiniz. Bunun için ADRCI: ADR Command Interpreter kullanılabilir. Aşağıdaki gibi bir script ile adrci kullanılarak ilgili trace dizinlerdeki alert log dosyalarındaki ORA- şeklindeki hatalar e-posta şeklinde bildirimi sağlanabilir.

Script içerisindeki J , ilgili node’daki instance numarasını belirtmektedir. Single instance için bu kullanılmamalıdır. Örnek script’te 3 veritabanı ORCL ORCLTEST ORCLDEV için işlem yapılmaktadır. mg parametresi e-postanın gönderileceği adresi belirtir. E-posta gönderimi UTL_MAIL.SEND fonksiyonu ile ORCL veritabanı üzerinden yapılmaktadır.
UTL_MAIL paketinin kullanımı için gerekli ayarların (ACL , smtp_out_server vs) yapılmış olması gerekmektedir.

Script içeriği :

Script’i oraerr.sh şeklinde bir script içine yazıp ilgili dosyanın modunun 755 olmasını sağlayın.

 

#!/bin/bash
RDBMSUSERPROFILE=/home/oracle/.profile.ORCL
. $RDBMSUSERPROFILE

path1="/u01/app/oracle/diag/rdbms/prod/PROD/trace"
path2="/u01/app/oracle/diag/rdbms/test/TEST/trace"
path3="/u01/app/oracle/diag/rdbms/dev/DEV/trace"

paths=($path1 $path2 $path3 )
dbs=(PROD TEST DEV)
for (( i = 0 ; i < ${#dbs[@]} ; i++ )) 
do
 db=${dbs[$i]}$j
 mg="aduruoz@interiva.com"
 cd  ${paths[$i]} 
 adrci exec="show alert -p  \\\"message_text like '%ORA-%' and message_text not like '%ORA-3136%'  and message_text not like '%ORA-28%' and message_text not like '%ORA-
48913%' and message_text not like '%ORA-609%' and originating_timestamp > systimestamp - 1/144 \\\" -term " >  adrciVarORCL.tmp
   sed -i '1d'  adrciVarORCL.tmp
   sed -i '1d'  adrciVarORCL.tmp
   sed -i '1d'  adrciVarORCL.tmp
   
   mb="<b><font color=\"red\">$db</font></b><br/>"
   k=0
   while read line
   do
      line=$line| tr -d '\n'
      mb=$mb$line"<br/>" 
      k=1
   done <adrciVarORCL.tmp
if [ $k -eq 1 ];
then
   sqlplus / as sysdba << EOF
     exec UTL_MAIL.SEND('oracle@interiva.com.tr','$mg' ,NULL,NULL,'$db Ora Hatasi ','$mb' , 'text/html; charset=us-ascii',NULL);
EOF
fi
done


 

Yukarıdaki gibi içeriği olan script ile her 10 dakika da bir ,son 10 dakikada oluşan ORA- hatalarının gönderimi için oracle kullanıcısının crontab’ına aşağıdaki gibi ekleme yapın.

#ora- hata kontrol 
00,10,20,30,40,50 * * * * /u01/scripts/oraerr.sh

 

Sonrasın düzenli olarak her 10 dakikada bir ilgili veritabanlarında son 10 dakika içinde oluşan hatalar bildirilecektir.

 

Bir sunucudaki Oracle servislerinde oluşan hataların adrci ile görüntülenmesi

Oracle veritabanı, grid , asm , listener gibi servislerin olduğu bir sunucuda bu servislerde oluşan hataların görüntülenmesi için ADRCI: ADR Command Interpreter kullanılabilir. ADRCI tanımlı tüm home’lardaki belirli bir kelime ve belirli bir saat öncesine kadar oluşan hataları görüntülemek için aşağıdaki script’i kullanabilirsiniz. ADRCI ile ilgili detaylı bilgi için ADR Command Interpreter (ADRCI) kullanımı başlıklı makaleyi inceleyebilirsiniz.

ADRCI tanımlı home’ları aşağıdaki gibi sorgulayabilirsiniz. ORACLE_HOME set edilip, PATH değişkenine eklendikten sonra adrci çalıştırılabilir.

-bash-4.3$ export ORACLE_HOME=/u01/app/11.2.0/grid; export PATH=$PATH:$ORACLE_HOME/bin
-bash-4.3$ adrci exec="show homes"

Hataların görüntülenmesi için aşağıdaki komutları içeren show_errors.sh şeklinde bir script oluşturun.

export ORACLE_HOME=/u01/app/11.2.0/grid; export PATH=$PATH:$ORACLE_HOME/bin
adrci exec="show alert -p \\\"message_text like '%$1%' and originating_timestamp > systimestamp-$2/24\\\"" -term 

show_errors.sh dosyası çalıştırlabilir hale getirin.

chmod 755 show_errors.sh

show_errors.sh için ilk parametre aranacak kelime ikinci parametre kaç saat önce oluşan hataları görüntülemek için kullanılmaktadır.

Örneğin, sunucuda çalışan tüm veritabanlarında son 24 saatte oluşan ORA- hatalarını aşağıdaki gibi görüntüleyebilirsiniz.

-bash-4.3$ ./show_errors.sh ORA- 24

Ya da sunucudaki listener’a belirtilen bir ip den sn 10 saatte gelen bağlantı isteklerini aşağıdaki gibi görüntüleyebilirsiniz.

-bash-4.3$ ./show_errors.sh 192.168.40.15 10

 

 

ADRCI ile listener log , trace gibi dosyaların silinmesi

ADR Command Interpreter (ADRCI) ile veritabanı , grid , listener için oluşturulan log , trace , incident , cdump gibi dosyaların belirli bir günden önceki oluşanları silmek mümkündür. Tek tek dizinler dosyaları manuel silmek yerine adrci ile bu işlemi çok kolay bir şekilde yapabilirsiniz.

ADRCI kullanımı için Oracle Base , set edilmiş olmalıdır. Bu aracın kullanımı ile ilgili detaylı bilgiyi ADR Command Interpreter (ADRCI) kullanımı başlıklı makalede bulabilirsiniz.

Aşağıdaki şekilde adrci aracını başlatabiliriz.

-bash-4.3$ . oraenv
ORACLE_SID = [+ASM1] ? +ASM1
The Oracle base remains unchanged with value /u01/app/oracle
-bash-4.3$ adrci 

ADRCI: Release 11.2.0.4.0 - Production on Tue May 16 16:19:40 2017

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

ADR base = "/u01/app/oracle"

Sonrasında mevcut home’ları listeleyerek hangi home için işlem yapacağımıza karar vermemiz gerekiyor. Örnekte listener alert dosyalarının silinmesi için gerekli adımlar gösterilmiştir.

Mevcut home’ların listelenmesi :

adrci> show homes
ADR Homes: 
diag/asm/+asm/+ASM1
diag/clients/user_oracle/host_2585172500_11
diag/clients/user_oracle/host_2585172500_80
diag/diagtool/user_oracle/host_2585172500_11
diag/rdbms/orcltest/ORCLTEST1
diag/rdbms/audit/AUDIT1
diag/rdbms/orcl/ORCL1
diag/tnslsnr/oradb1/listener

Çalışılacak home’un set edilmesi :

adrci> set home diag/tnslsnr/oradb1/listener

Set edilen home daki TRACE ve ALERT dosyalarından 3600 dakika (1 gün) önceden oluşanların silinmesi :

adrci> purge -age 3600 -type TRACE
adrci> purge -age 3600 -type ALERT

Aynı komut ile aşağıdaki dosya tiplerinin silinmesi mümkündür :

  • ALERT – ./alert dizinindeki dosyalar
  • INCIDENT — ./incident/incdir_<incid> dizinindeki dosyalar
  • TRACE — ./trace dizinindeki dosyalar
  • CDUMP — ./cdump dizinindeki dosyalar
  • UTSCDMP — ./trace/cdmp_<timestamp> dizinleri
  • STAGE — ./stage dizinindeki dosyalar
  • SWEEP — ./sweep dizinindeki dosyalar
  • HM — ./hm dizinindeki dosyalar ve HM şemasındaki metadata bilgileri
  • IPS — ./incpkg dizinindeki dosyalar ve IPS şemasındaki metadata bilgileri

Tüm dosyaları temizlemek için aşağıdaki komut kullanılabilir.

adrci> purge -age 10080

Bu işlemleri otomatik olarak da adrci aracının yapması sağlanabilir. 

İlgili home set edildikten sonra mevcut politikaların değiştirilmesi gerekmektedir.

adrci> set home diag/tnslsnr/oradb1/listener
adrci> show control

ADR Home = /u01/app/oracle/diag/tnslsnr/oradb1/listener:
*************************************************************************
ADRID                SHORTP_POLICY        LONGP_POLICY         LAST_MOD_TIME                            LAST_AUTOPRG_TIME                        LAST_MANUPRG_TIME                        ADRDIR_VERSION       ADRSCHM_VERSION      ADRSCHMV_SUMMARY     ADRALERT_VERSION     CREATE_TIME                              
-------------------- -------------------- -------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- -------------------- -------------------- -------------------- -------------------- ---------------------------------------- 
3953762085           720                  8760                 2016-06-08 10:47:22.071463 +03:00                                                 2017-05-16 16:20:48.104055 +03:00        1                    2                    80                   1                    2016-06-08 10:47:22.071463 +03:00       
1 rows fetched

Yukarıdaki çıktıdaki LAST_AUTOPRG_TIME alanının boş olması otomatik olarak hiç temizleme yapılmadığını gösterir.  Incident ve health monitor uyarıları için SHORTP_POLICY , trace ve core dump dosyaları için LONGP_POLICY değerleri değiştirilmelidir. Buradaki değerler saat cinsinden olup, mevcut değerlere göre çok uzun bir süre silmeyeceği görülmektedir. Bu değerleri daha makul yapmak gerekiyor. Örneğin bir hafta öncesi , silinebilir.

SHORTP_POLICY ve LONGP_POLICY değerlerinin set edilmesi :

adrci> set control (SHORTP_POLICY = 168)
adrci> set control (LONGP_POLICY = 168)
adrci> show control

ADR Home = /u01/app/oracle/diag/tnslsnr/oradb1/listener:
*************************************************************************
ADRID                SHORTP_POLICY        LONGP_POLICY         LAST_MOD_TIME                            LAST_AUTOPRG_TIME                        LAST_MANUPRG_TIME                        ADRDIR_VERSION       ADRSCHM_VERSION      ADRSCHMV_SUMMARY     ADRALERT_VERSION     CREATE_TIME                              
-------------------- -------------------- -------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- -------------------- -------------------- -------------------- -------------------- ---------------------------------------- 
3953762085           168                  168                  2017-05-16 16:58:40.865587 +03:00                                                 2017-05-16 16:20:48.104055 +03:00        1                    2                    80                   1                    2016-06-08 10:47:22.071463 +03:00       
1 rows fetched

 

Bu değişikliği tek tek yapmak yerine aşağıdaki gibi bir script ile tek toplu halde yapmak mümkündür.

adrci_set_policy.sh

#!/bin/sh
for ADRHOME in `adrci exec="show home"`
do
    if [ $ADRHOME = "ADR" -o $ADRHOME = "Homes:" ]
    then
        continue;
    fi
    echo $ADRHOME
    adrci <<EOF
         set home $ADRHOME
         set control (SHORTP_POLICY = 168)
         set control (LONGP_POLICY = 168)
         purge
    exit
EOF
done