Windows Oracle Standby Veritabanı Arşiv Silme Scripti

Merhabalar,

Önceki yazımda Linux ve Unix işletim sistemleri için Standby veritabanında biriken arşiv dosyalarımızın temizlenmesi için script oluşturmuştuk. O scripte yeralan archiveDelete.sh scriptini windows için uyarladım. Geri kalan dosyalarda herhangi bir değişiklik olmayacak.
archiveDelete.bat

cd %archivePath% -- archivePath yerine arşiv scriptinin bulunduğu klasörü yazın.
del MAXSEQ.tmp
sqlplus -S /nolog < Maxseq.sql 
for /f "tokens=1,2" %%a in ('type MAXSEQ.tmp') do set seq%%a=%%b
set DD=%date:~-4%%date:~4,2%%date:~7,2%%time:~0,2%%time:~3,2%%time:~6,2%
set logfile=STANDBY_ARC_DEL_%DD%.log
(
 echo run{
 echo crosscheck archivelog all;
 echo delete noprompt archivelog until sequence %seq1% thread 1;
 echo delete noprompt archivelog until sequence %seq2% thread 2;
 echo delete noprompt archivelog until sequence %seq3% thread 3;
 echo delete noprompt archivelog until sequence %seq4% thread 4;
 echo }
) | rman target / nocatalog log %logfile%

forfiles /P %archivePath% /D -7 /M STANDBY*.* /C "cmd /c del @file" -- archivePath yerine arşiv scriptinin bulunduğu klasörü yazın.

Oracle Standby Veritabanı Arşiv Silme Scripti

Merhabalar,
Bu yazımda standby veritabanında biriken yüklenmiş arşivleri temizlemek için kullanabileceğimiz bir scriptten bahsedeceğim.
Scriptimiz Linux ve Unix işletim sistemlerinde çalışıyor ve 3 dosyadan oluşuyor. Şimdi bunları açıklayalım:

maxThreadNumber.sql

// Aşağıdaki sql komutunda veritabanında bulunan thread'lerin max sequence sayılarını öğrenip, maxThreadNumber.tmp adında bir dosyaya yazıyoruz.
// Select sorgusunda max değerden 10 çıkarıyoruz çünkü her türlü ihtimale karşı standby veritabanında en son 10 arşiv logunu tutuyoruz.
connect / as sysdba 
set heading off pages 0 echo off feedback off; 
spool maxThreadNumber.tmp; 
select thread#, max(sequence#)-10 from v$archived_log where applied ='YES' and REGISTRAR='RFS' group by thread# ; 
spool off; 
exit; 

archiveDelete.sh

#!/bin/bash

export ORACLE_HOME=Bu kısıma Oracle Home tam adresini yazacağız. Ör: /oracle/app/product/11.2.0/dbhome_1
export ORACLE_SID=Bu kısıma Oracle SID i yazacağız
export archivePath=Bu kısıma arsiv silme scriptini koyacağımız klasörün adresini yazacağız. Ör: /home/oracle/archiveDelete

## arsivDelete scriptini her çalıştırdığımızda maxThreadNumber.sql scripti maxThreadNumber.tmp adında bir dosya üretiyor. 
## Yeni dosya oluşturmadan önce eskisini siliyoruz.
 rm -f $archivePath/maxThreadNumber.tmp

 $ORACLE_HOME/bin/sqlplus / as sysdba < $archivePath/maxThreadNumber.sql 

## maxThreadNumber.tmp dosyasında veritabanımızda kaç tane thread olduğu yazmaktadır.
## Bu dosyaya göre aşağıda bulunan seq1,seq2.. gibi satırları çoğaltalım.
## Örneğin veritabanımızda 4 tane thread varsa seq2 ve seq3 teki '#' işaretlerini kaldırıp, seq4 için de bir satır oluşturmamız lazım.
 seq1=`cat $archivePath/maxThreadNumber.tmp | awk 'NR==1{print $2}'`
#seq2=`cat $archivePath/maxThreadNumber.tmp | awk 'NR==2{print $2}'`
#seq3=`cat $archivePath/maxThreadNumber.tmp | awk 'NR==3{print $2}'`

$ORACLE_HOME/bin/rman << EOF
 connect target /
 run{
 crosscheck archivelog all;
## Yukarıdaki thread sayısına göre aşağıdaki satırları düzenlemeyi unutmayın.
 delete noprompt archivelog until sequence $seq1 thread 1;
#delete noprompt archivelog until sequence $seq2 thread 2;
#delete noprompt archivelog until sequence $seq3 thread 3;
 }
 EOF
exit

Arşivleri silmek için sadece archiveDelete.sh scriptini çalıştırmamız gerekiyor.

$./archiveDelete.sh

Oracle Standby Veritabanı Komutları

Merhabalar,
Bu yazımda standby veritabanlarını yönetmek için kullanacağımız birkaç komuttan bahsedeceğim.

Öncelikle produciton veritabanından standby da hata olup olmadığını v$archive_dest view’ina bakarak görebiliriz.

$ sqlplus / as sysdba
SQL> show parameter log_archive_dest

Yukarıdaki komutla standby veritabanının hangi arşiv lokasyonuna yazıldığını öğrenebiliriz. Daha sonra öğrendiğimiz lokasyonun dest_id numarasını aşağıdaki komuta yazacağız.

SQL> select DEST_NAME, status,error from v$archive_dest where dest_id = 2;

DEST_NAME                             STATUS           ERROR
-----------------------------------   ---------        --------------------
LOG_ARCHIVE_DEST_2                    VALID

Yukarıdaki gibi VALID yazısını görüyorsak standby veritabanımız sorunsuz çalışıyor demektir. Eğer status bölümünde INVALID yazısı geliyorsa, Error bölümünde standby veritabanına bağlantı sorununun nedenini yazıyor.
Eğer standby veritabanımız çalışıyorsa, standby veritabanına bağlanıp production veritabanıyla arasındaki eksik arşiv sayısını aşağıdaki komut ile öğrenebiliriz.

SQL> select count(1) from v$archived_log where registrar='RFS' and APPLIED<>'YES';

Standby veritabanını kapatıp açtıktan sonra otomatik arşivleri üzerine apply etmesi için aşağıdaki komutu çalıştırmamız gerekiyor. Genellikle standby veritabanları kapatılıp açıldığında aşağıdaki komut çalıştırılmayı unutulur. Bu durumda production veritabanı standby veritabanına arşivleri yazmaya devam eder fakat standby veritabanı bu arşivleri üzerine apply etmez ve verilerimiz en sonra standby veritabanı kapatıldığı andaki production veritabanındaki verilerle aynı olur.

SQL> alter database recover managed standby database using current logfile disconnect from session;

Genel Oracle Hataları — ORA-12154, ORA-00600, ORA-01722, ORA-03113, ORA-01000

Merhabalar,

Bu yazımda genel olarak Oracle veritabanlarında ve uygulamalarda sıkça karşımıza çıkan oracle hatalarından bahsedeceğim. Genellikle bir oracle hatası aldığımızda ilk yaptığımız şey hata kodunu kopyalayıp Google’da aramaktır. Bence ilk olarak support.oracle.com’u tercih edin. Daha hızlı ve güvenli çözüme ulaşabilirsiniz. Bu yazımda ise Google’da en çok aranan 5 tane hatadan bahsedeceğim.

ORA-12154: TNS:could not resolve the connect identifier specified

Bu hatayı aldığınız zaman veritabanınız TNS bağlantısı kuramıyor demektir. Genellikle bağlantı bilgilerinde sıkıntı olabiliyor. Bağlantı bilgilerini kontrol ettikten sonra Listener’ın açık olup olmadığına bakın.

$ cat $ORACLE_HOME/network/admin/tnsnames.ora

TNSNAMES.ora dosyası içinde bağlanmaya çalıştığınız veritabanı bilgilerinin sunucu adına ve servis adına dikkat edin. Genellikle yanlış bilgiler yüzünden bağlantı sağlanamıyor. Bağlantı bilgileri doğruysa listener’ın açık olup olmadığına bakın.

$ lsnrctl status
$ lsnrctl start -- listener kapalıysa, listener'ı çalıştırın

ORA-00600: internal error code, arguments: [%s], [%s],[%s], [%s], [%s]

Eğer veritabanınızda ora-600 hatası alıyorsanız, veritabanınızda ciddi sıkıntılar var demektir. Belki bir bug’la karşılaşmışsınızdır belki sistem parametrelerini doğru ayarlamamışsınızdır, belki de farklı bir sıkıntıdan kaynaklanıyordur. ORA-600 hatası aldığınız zaman yanında birkaç tane parametre de gelir. İlk yapmanız gereken support.oracle.com a girip ora-600 hatalarına bakmaktır. Support sitesinde Note 153788.1 diye arama yaparsanız karşınıza oracle generic hatalarının olduğu bir araç geliyor. Bu sayfayı kullanarak ora-600 hatasını, onun yanında gelen parametretleri ve veritabanı versiyonunuzu girerek, sorunuzun kaynağını ve onunla ilgili dökümanları görebilirsiniz.

ORA-01722: Invalid Number

Bu hatayı genellikle sql de sayısal olmayan string bir değeri sayıya çevirmeye çalıştığınız zaman alıyorsunuz. Genellikle tablolarımızda verileri varchar2 alanında tutuyoruz. Bazen sayısal verileri de string olarak tutabiliyoruz. Bu sayısal verileri de karşılaştırma yapmak için to_number() gibi fonksiyonlarla dönüştürmek istiyoruz. Fakat bizim string olarak sakladığımız sayısal verilere bazen yanlış veri girişinde bulunuyor ve bu hatayı alıyoruz.
Örneğin,
no adında bir alanımız olsun ve buraya sürekli sayısal değer girelim.

create table deneme (no varchar2(10));
insert into deneme values ('1');
insert into deneme values ('2');
commit;

Peki ya yanlışlıkla biri farklı bir değer girerse:

insert into deneme values ('uc');
commit;

to_number() fonksiyonunu kullandığınızda bu hatayı alacaksınız.

select to_number(no,'999');
ORA-01722: Invalid Number

ORA-03113: end-of-file on communication channel

Bu hatayı aldığımız zaman client makinesinden veritabanına olan bağlantımız bir nedenden dolayı kopmuş demektir. Bu sorunun kaynağı,
Server crashed olmuş olabilir, işletim sistemi seviyesinde çalışan process’ler kapanmış olabilir, ya da oracle veritabanından kaynaklanan içsel bir problem olabilir. Genelde çok basit hatalardan dolayı bile oracle bu hatayı vermektedir.
Bu hatayı aldığınız zaman bence en iyisi alert.log dosyasında hatayla ilgili detaylı olarak logları incelemektir. Çözüm tahmin ettiğinizden de kolay olabilir.

ORA-01000: maximum open cursors exceeded

Bu hata, veritabanında olan maksimum açık cursor sayısına ulaştığınız zaman oluşuyor. Yani genelde programcılar kod kısmında veritabanına bağlantı sağladıktan sonra bağlantıyı sonlardırmıyorlar ya da her işlem için ayrıca bağlantı açıyorlar. Böyle durumlarda sistem çok fazla kullanıldığı anda ORA-01000 hatası oluşuyor. Maksimum açık cursor parametresi veritabanı açılış parametrelerinden biridir. sqlplus ile bağlanıp

SQL> show parameter open_cursor 

komutunu çalıştırdıktan sonra mevcut değeri görebilirsiniz. Çözüm olarak ya bu değeri arttıracaksınız ya da programcılarınızda kodu tekrar inceleyip açık kalan cursor’leri kapatmasını isteyeceksiniz.
Bu değeri arttırmak için, sqlplus‘s bağlanın :

SQL> alter system set OPEN_CURSOR=1000 scope=both;

Burada 1000 yerine, sisteminize uygun bir değer vermelisiniz.

TNS-12545: Hatası

Merhabalar,

Öncelikle eğer bir oracle hatası alırsanız ilk işiniz sunucuya bağlanıp oerr komutuyla sorunun kaynağına ve çözümüne bakmak olmalıdır.
TNS-12545 hatası aldığınız zaman veritabanına bağlantı hatası alıyorsunuz demektir. oerr komutunu kullanarak hataya ve çözümüne bakalım.

oerr TNS 12545 

TNS-12545:  Connect failed because target host or object does not exist

Cause:  The address specified is not valid, or the program being connected to does not exist.

Action:  Ensure the ADDRESS parameters have been entered correctly; the most likely incorrect parameter is the node name. Ensure that the executable for the server exists (perhaps "oracle" is missing.)

Eğer TCP/IP kullanıyorsanız TNSNAMES.ora dosyasında bulunan veritabanı bağlantı bilgilerine dikkat etmeniz gerekiyor. Genellikle yazım yanlışı olabiliyor ya da sunucu adı veya servis adı yanlış giriliyor olabilir. TNSNAMES.ora yı kontrol ettikten sonra tnsping komutuyla veritabanına bağlanmayı deneyin.

tnsping oracledb

Eğer tnsping komutu başarılı çalışırsa problemi çözmüş olursunuz. Hala sorun devam ederse listener ayakta ve çalışıyormu diye kontrol etmelisiniz.

 lnsrctl status

Listener çalışmıyorsa, çalıştırıp tekrar tnsping komutunu çalıştırıp deneyin.

lsnrctl start
tnsping oracledb

Linux – Volume Group'dan Fiziksel Sürücüleri Çıkarmak

Merhabalar,

Bazen LVM için oluşturmuş olduğunuz fiziksel sunucuları geri almak isteyebilirsiniz. Ya da o fiziksel sürücüleri başka bir LVM için kullanmak isteyebilirsiniz. Fakat bu işlemi yapmadan önce fiziksel sürücüleirn kullanılmadığından emin olmalısınız. Bunun için ‘pvdisplay’ komutunu kullanabilirsiniz. PV Size bölümünde NOT usable yazısını görmelisiniz.

# pvdisplay /dev/hda1

--- Physical volume ---
PV Name               /dev/hda1
VG Name               myvg
PV Size               1.95 GB / NOT usable 4 MB [LVM: 122 KB]
PV#                   1
PV Status             available
Allocatable           yes (but full)
Cur LV                1
PE Size (KByte)       4096
Total PE              499
Free PE               0
Allocated PE          499
PV UUID               Sd44tK-9IRw-SrMC-MOkn-76iP-iftz-OVSen7

Eğer fiziksel sürücü kullanılıyorsa, öncelikle verileri başka sürücülere aktarmalısınız. Bunun için pvmove komutunu kullanabilirsiniz.

Diskimiz hazır ise vgreduce komutunu kullanarak fiziksel sürücüyü volume group’dan çıkarabiliriz.

# vgreduce myvg  /dev/hda1

Sequence Numarasına ve Thread Numarasına Göre Arşivlerin Yedeğini Almak

Merhabalar,

Bazen kayıtlı arşivlerimizin belirli bir bölümünün yedeğini almak isteriz. Standby veritabanı kurarken belirli arşivlerin eksik olduğunu gördüm. Production veritabanına bağlanarak thread numarasına ve sequence numarasına göre arşivlerin sıkıştırılmış yedeğini alıp standby a kopyaladım. Basit bir script ama sizlerle paylaşmak istedim.

run{
ALLOCATE CHANNEL ch1 DEVICE TYPE DISK FORMAT='/oracle/rman/thread2.bkp';
BACKUP ARCHIVELOG FROM SEQUENCE 7273 UNTIL SEQUENCE 7380 THREAD 2;
release channel ch1;
}

LVM Boyutunu Düşürme

Merhabalar,

Bu yazımda Linux sistemimizde bulunan mevcut LVM diskimizin boyutunu düşürmekten bahsedeceğim. Öncelikle sistemimizde yeterli miktarda boş alan bulunduğunu kontrol etmemiz lazım.
Daha sonra sırasıyla aşağıdaki komutları uygulayın. Bu işlemi uygularken yanlış yaptığınız zaman veri kaybı yaşayabileceğiniz unutmayın.

# umount /oracle
# resize2fs /dev/oraclevg/oraclelv 50000
# lvreduce -L-1G /dev/oraclevg/oraclelv
# mount /home

Oracle Primary Standby Switchover Scriptleri

Merhabalar,

Çalışan production veritbanımızdan Felaket Kurtarma Merkezi sistemine switch etmemiz için 4 tane script çalıştırmamız yeterlidir. Öncelikle bu scriptler Linux ve Unix işletim sistemlerinde çalışmaktadır. Ssiwthover scriptlerini çalıştırmadan önce standby makinesinin düzgün çalışıp çalışmadığını kontrol etmelisiniz. Aksi takdirde veri kaybı yaşayabilirsiniz. Bu scriptleri çalıştırmadan önce hem production sisteminde hem de standby sisteminde oracle kullanıcısının profile dosyalarında(/home/oracle/.bash_profile), ORACLE_SID, ORACLE_HOME ve ORACLE UNQNAME parametrelerinin tanımlanıp tanımlanmadığını kontrol etmelisiniz.

  1. Primary Makinesine bağlanıp oracle kullanıcısıyla aşağıdaki scripti çalıştırın:

primary2standby_script1.sh

#!/bin/bash
. /home/oracle/.bash_profile
srvctl stop database -d db_name
sqlplus / as sysdba << EOF
shutdown immediate
startup restrict
alter system archive log all;
alter database commit to switchover to physical standby with session shutdown wait;
exit
EOF
  1. Standby Makinesine bağlanıp oracle kullanıcısıyla aşağıdaki scripti çalıştırın:

standby2primary_script1.sh

#!/bin/bash
. /home/oracle/.bash_profile
sqlplus / as sysdba << EOF
alter database recover managed standby database disconnect;
exit
EOF
sleep 5

sqlplus / as sysdba <
  1. Primary Makinesine bağlanıp oracle kullanıcısıyla aşağıdaki scripti çalıştırın:
primary2standby_script2.sh
#!/bin/bash
. /home/oracle/.bash_profile
sqlplus / as sysdba << EOF
shutdown immediate
EOF
srvctl start database -d db_name-o mount
sqlplus / as sysdba << EOF
startup
alter database recover managed standby database using current logfile disconnect;
exit
EOF
  1. Standby Makinesine bağlanıp oracle kullanıcısıyla aşağıdaki scripti çalıştırın:
standby2primary_script2.sh
#!/bin/bash
. /home/oracle/.bash_profile
sqlplus / as sysdba << EOF
shutdown immediate
exit
EOF
srvctl start database -d db_name
 
sqlplus / as sysdba <