25 Aralık 2008 Perşembe

Oracle' da Türkçe karakter ile sorgulama

Upper fonksiyonu default olarak i harfini I (büyük ı ) harfine dönüştürüyor.
Doğru çalıştırabilmek için NLS_SORT parametresini XTURKISH olarak set etmek
ve upper yerine nls_upper kullanmak gerekiyor.


SQL> alter session set NLS_SORT = 'XTURKISH' ;

SQL> select nls_upper ( 'i' ) from dual;

--Session bazında set etmeden ve herhangi bir ayar yapmadan sorgulamak için bu şekilde de kullanabiliriz.

SELECT sysdate
FROM dual
WHERE nls_upper ( 'i' , 'NLS_SORT = XTURKISH' ) = 'İ' ;


NLS_SORT parametresi client üzerinde veya yukarıdaki gibi session bazında set edilebilir.
Diğer bir yöntem database için logon trigger oluşturmak olabilir.

--database için örnek trigger

CREATE OR REPLACE TRIGGER NLS_LOGON
AFTER LOGON
ON DATABASE
DECLARE
sqlstr VARCHAR2(200) := 'alter session set NLS_SORT=XTURKISH';
BEGIN
IF (USER = 'DENEMEUSER') THEN
execute immediate sqlstr;
END IF;
END nls_logon;
/

--user için örnek trigger

CREATE OR REPLACE TRIGGER user_logon_nls
AFTER LOGON ON scott.schema
BEGIN
DECLARE
sqlstr VARCHAR2(200) := 'alter session set NLS_SORT=XTURKISH';
BEGIN
IF (USER = 'DENEMEUSER') THEN
execute immediate sqlstr;
END IF;
END;
/

24 Aralık 2008 Çarşamba

change SYSMAN password

When changed SYSMAN password  in database the Enterprise Manager doesn't care this case.

You have to change password manually.
you can apply following directions

1 - cd emoms.properties config file directory. open file your editor like vi.

cd $ORACLE_HOME/"hostname"_"SID"/sysman/config/

change  values hostname and SID your values for above command.

2-
change oracle.sysman.eml.mntr.emdRepPwdEncrypted   parameter to  FALSE
change oracle.sysman.eml.mntr.emdRepPwd to your SYSMAN password without encyrpted

save file

3-
emctl start dbconsole

4- check 
emoms.properties config file which has encrpyted password.

You can use your console.



22 Aralık 2008 Pazartesi

RMAN Tablespace Point-in-Time Recovery

RMAN Tablespace Point-in-Time Recovery (TSPITR) veritabanındaki bir tablespace' in belirli bir zamana dönülmesine olanak sağlan veri kurtarma seçeneklerinden biridir. TSPITR tablespace' de bulunan bütün datayı istediğimiz zamana dönecektir.

Bu işlem için gerekli olanlar;

- Veriyi kurtarmak istediğimiz zamandan önce alınmış ve cross-check yapılmış backup(full veya incremental)
- Backup alındıktan sonra Tablespace' i getirmek istediğimiz zamana kadar çıkan arşiv dosyaları
- İşlemi yapabilmek için gerekli disk alanı

Tablespce point-in-time recovery bir recovery işlemi olduğu için öncelikle mevcut tablespace üzerindeki tüm datayı ezecektir. Bu nedenle kesinti gerektirir ve tablespace üzerinde etkilenmesini istemediğimiz başka datamız varsa bunların da export ile bir yere yedeklenmesi gerekir. İşlem bittikten sonra export aldığımız kayıtlarımızı yeniden import edebiliriz.

Senaryo olarak şöyle bir örnek uygulabiliriz. Bir tablo drop edildi(purge dahil) ve tablesapce üzerinde başka bir tablo da yok. Bu durumda tabloyu kurtarmak için bu yöntemi uygulayabiliriz.

TSPITR iki şekilde uygulanabilir:
- uygulama veritabanı üzerinde canlı olarak
- Geçici bir instance üzerinde kurtarılmak istenen tablespace create edilerek. Bu durumda zorunlu tablespacelerin de (SYSTEM,UNDO) create edilmesi gerekir. Bu işlemi yapmak için datanın büyüklüğüne göre ekstra disk alanına ihtiyaç duyabiliriz.

1. yöntem uygulama veritabanı üzerinde çalışması nedeniyle ile riskli gelirse veya kesinti yapma şansınız yoksa 2. yöntemi rahatlıkla uygulabilirsiniz. Ben de kesinti yapamadığım için 2. yöntemi uygulamıştım.

Şimdi sırasıyla bu yöntemleri nasıl uygulabileceğimizi ve hazırlık için neler yapmamız gerektiğini anlatacağım.

Başlamadan önce her iki yöntem için ortak olan kısımlardan bahsedeyim.

Her iki yöntemde de AUX1 adından geçici bir instance create ediyoruz.
Bu instance uygulama veritabanından elde edilmiş bir pfile ile nomount olarak başlatılacak.

AUX1 instance için yapacaklarımız
- orapw dosyası hazırlamak.
- pfile hazırlamak.
- tns ve listener ayarlarını hazırlamak
- nomount olarak çalışır hale getirmek.

Hazırlıklarımızı yaptıktan sonra yöntemlerin kendine has kısımlarına geçebiliriz.

1. yöntem

Aşağıdaki script disk üzerinde alınmış bir backup için hazırlandı. Bu scripti kendi yedek şeklinize göre düzenleyebilirsiniz.

set ORACLE_SID=AUX1
Set NLS_DATE_FORMAT=MM/DD/YYYY HH24:MI:SS

connect target sys/oracle@orcl
connect auxiliary sys/oracle@aux1

run {
ALLOCATE AUXILIARY CHANNEL A1 TYPE DISK;
ALLOCATE CHANNEL c1 TYPE DISK;
recover tablespace tbs until time "TO_DATE('03/11/2008 17:19:29','DD/MM/YYYY HH24:MI:SS')";
}


Scripti çalıştırdığımızda RMAN sırayla şunları yapacak
- Geçici instance(AUX1) üzerinde ismini verdiğimiz tablespace ve gerekli olan tablespaceleri restore edecek.
- Geçici veritabanı istenilen tarihe kadar recover edilecek.
- Geçici veritabanı resetlogs ile açacak.
- Dönmek istediğimiz tablespace' in exportunu alacak.
- Dönmek istediğimiz tablespace' i uygulama veritabanına import edecek.


2. yöntem

Aşağıdaki parametreler datafileları rename etmeden devam edebilmemiz için gereklidir.Datafileları örnek scriptteki gibi rename edeceksek bu parametreleri eklememize gerek yok.


DB_FILE_NAME_CONVERT=("D:\oracle\product\10.2.0\oradata\orcl", "D:\oracle\product\10.2.0\oradata\AUX1")
LOG_FILE_NAME_CONVERT=("D:\oracle\product\10.2.0\oradata\orcl","D:\oracle\product\10.2.0\oradata\AUX1")


--------------------------------------------------

set ORACLE_SID=AUX1
Set NLS_DATE_FORMAT=MM/DD/YYYY HH24:MI:SS

rman connect /

run {
restore controlfile from 'D:\ORACLE\PRODUCT\10.1.0\FLASH_RECOVERY_AREA\ORCL\AUTOBACKUP\2008_11_03\O1_MF_N_669835169_4JY5N2DO_.BKP'
until time "TO_DATE('03/11/2008 17:19:29','DD/MM/YYYY HH24:MI:SS')";
}

sql "alter database mount clone database";

run {

ALLOCATE CHANNEL c1 TYPE DISK;

set until time "TO_DATE('03/11/2008 17:19:25','DD/MM/YYYY HH24:MI:SS')";

set newname for datafile 1 to 'D:\oracle\product\10.2.0\oradata\AUX1\system01.dbf';
set newname for datafile 2 to 'D:\oracle\product\10.2.0\oradata\AUX1\undotbs01.dbf';
set newname for datafile 3 to 'D:\oracle\product\10.2.0\oradata\AUX1\sysaux01.dbf';
set newname for datafile 5 to 'D:\oracle\product\10.2.0\oradata\AUX1\tbs01.dbf';

restore tablespace system, undotbs1, sysaux, tbs;

switch datafile all;

sql "alter database datafile 1,2,3,5 online";

recover database skip forever tablespace USERS;

sql "alter database rename file ''D:\oracle\product\10.1.0\oradata\orcl\REDO01.LOG'' to ''D:\oracle\product\10.2.0\oradata\AUX1\REDO01.LOG''";

sql "alter database rename file ''D:\oracle\product\10.1.0\oradata\orcl\REDO02.LOG'' to ''D:\oracle\product\10.2.0\oradata\AUX1\REDO02.LOG''";

sql "alter database rename file ''D:\oracle\product\10.1.0\oradata\orcl\REDO03.LOG'' to ''D:\oracle\product\10.2.0\oradata\AUX1\REDO03.LOG''";

release channel c1;
}

SQL> connect / as sysdba;
SQL> recover database until cancel using backup controlfile;


Bu aşamadan sonra yeni database resetlogs ile açarız ve istediğimiz tablespace hazır hale gelir.
Bundan sonra export ve import işlemlerini manuel yapmamız gerekir.