30 Mart 2009 Pazartesi

RMAN DUPLICATE

Recovery Manager(RMAN) programının veri yedekleme yanında, veri kurtarma, taşıma konusunda bize sunduğu faydalı özelliklerinden biri de DUPLICATE özelliğidir.

Duplicate özelliği veritabanının tamamının veya bir kısmının kopyasını çıkarmamıza olanak sağlar.
Duplicate özelliğini kullanabilmek için;
- Veritabanının RMAN ile alınmış cross-check edilmiş bir backupının olması(full veya incremental)
- Belirli bir zamana gelebilmek için veritabanın archive modda çalışması ve güncel arşivlerimizin erişilebilir olması gerekir.

DUPLICATE ile online olarak veritabanımızı kopyalabilir veya istediğimiz tablespacelerden oluşan yeni bir veritabanı hazırlayabiliriz.

DUPLICATE ile aynı host üzerinde veya farklı hostlar üzerinde veritabanını kurmak mümkündür.
Host sistemlerin OS versiyonlarının ve tabiki oracle executable versiyonlarının aynı olması gerekir.

DUPLICATE ile yapabileceklerimiz
- Veritabanını online olarak kopyalamak.
- Daha önce aldığımız backupı ve geri dönüş planını test etmek.
- Drop edilen(purge dahil) veya truncate edilen bir tabloyu veya nesneyi kurtarmak.
- Standby db kurulumu.

olarak sayılabilir. Farklı senaryolarda farklı ihtiyaçlar için de elbetteki kullanılabilir.

Örnek olarak databasemizdeki bazı tablespaceler hariç diğer tüm datamızı belirli bir zamana döneceğimiz bir senaryo oluşturalım.

1 - Target db(yani source db) spfile ile başlatıldıysa önce bir pfile create edilir.

--productiona baglanip olusturalim
sqlplus /nolog
conn /as sysdba
create pfile=D:\oracle\product\10.2.0\oradata\AUX1\initAUX1.ora from spfile;
exit


2 - Pfile içindeki lokasyon parametreleri yeni lokasyonlara göre düzenlenir.
Datafilelar farklı bir lokasyona kopyalanacak ise ve datafile isimleri rename edilmeyecekse aşağıdaki iki parametrenin de pfile içinde set edilmesi gerekir.

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


Örneği Windows üzerinde yaptığımız için windows üzerinde db instance' ı başlatabileceğimiz servis girdisini oluşturuyoruz. Unix üzerinde bu kısma gerek yok.

oradim -new -sid AUX1 -intpwd oracle -startmode manual -pfile D:\oracle\product\10.2.0\oradata\AUX1\initAUX1.ora

3 - Hazırlanan pfile kullanılarak AUXILIARY instance (AUX1) nomount olarak başlatılır. Bu instance yeni kurmak isteğimiz database'e aittir.

4 - Her iki instance'ın RMAN tarafından erişilebilir olduğundan emin olmak için gerekli TNS ve listener tanımları yapılır. SYS userı için şifre dosyası ayarlanır.

5 - RMAN DUPLICATE scripti hazırlanır.

CONNECT TARGET system/system@proddb;
CONNECT CATALOG rman/rman@catalogdb;
CONNECT AUXILIARY SYS/oracle;

CONFIGURE CHANNEL DEVICE TYPE disk CLEAR;
CONFIGURE DEFAULT DEVICE TYPE TO disk;
CONFIGURE DEVICE TYPE disk PARALLELISM 3;

RUN {
# the DUPLICATE command uses an automatic disk channel
set until time "TO_DATE('03/11/2008 17:19:25','DD/MM/YYYY HH24:MI:SS')";

DUPLICATE TARGET DATABASE TO AUX1
SKIP TABLESPACE USERS
LOGFILE
GROUP 1 ('D:\oracle\oradata\AUX1\redo01m1.log',
'D:\oracle\oradata\AUX1\redo01m2.log') SIZE 20M REUSE,
GROUP 2 ('D:\oracle\oradata\AUX1\redo02m1.log',
'D:\oracle\oradata\AUX1\redo02m2.log') SIZE 20M REUSE;
}


6 - Scriptimizi çalıştırmadan önce pwd dosyası, tns ayarları, listener ayarları son kez kontrol edilir. Bu kısım özellikle büyük dblerde gereksiz zaman kaybını engellemek için önemlidir.

7 - Hazırlanan script çalıştırılır. Script neticesinde yeni instance' ın çalışır durumda hazır olmasını bekleyebiliriz.


Örneğimizde kullanmak amacıyla tablespace, schema ve tabloları aşağıdaki scriptler ile oluşturabiliriz.

Yapacaklarımız kısaca şöyle :
1 - Örnek datamızı oluşturacağız.
2 - RMAN ile control file dahil full yedek alacağız.
3 - Yedek alındıktan sonra silmek istediğimiz tabloyu drop edeceğiz.
4 - Hazırladığımız RMAN DUPLICATE scriptini çalıştıracağız.


conn /as sysdba
create tablespace tbs datafile 'D:\oracle\oradata\orcl\tbs01.dbf' size 10M;

create user ra identified by ra default_tablespace tbs;
grant connect, resource to ra;

drop table ra.silinecek purge;

create table ra.silinecek
(
id number,
ad varchar(20)
)
tablespace tbs;

insert into ra.silinecek values (to_char(sysdate, 'HH24SS'),'DD'||to_char(sysdate, 'HH24SS'));
insert into ra.silinecek values (to_char(sysdate, 'HH24SS'),'DD'||to_char(sysdate, 'HH24SS'));
insert into ra.silinecek values (to_char(sysdate, 'HH24SS'),'DD'||to_char(sysdate, 'HH24SS'));
insert into ra.silinecek values (to_char(sysdate, 'HH24SS'),'DD'||to_char(sysdate, 'HH24SS'));
insert into ra.silinecek values (to_char(sysdate, 'HH24SS'),'DD'||to_char(sysdate, 'HH24SS'));

commit;

drop table ra.kalacak purge;

create table ra.kalacak
(
id number,
ad varchar(20)
)
tablespace tbs;

insert into ra.kalacak values (to_char(sysdate, 'HH24SS'),'DD'||to_char(sysdate, 'HH24SS'));
insert into ra.kalacak values (to_char(sysdate, 'HH24SS'),'DD'||to_char(sysdate, 'HH24SS'));
insert into ra.kalacak values (to_char(sysdate, 'HH24SS'),'DD'||to_char(sysdate, 'HH24SS'));
insert into ra.kalacak values (to_char(sysdate, 'HH24SS'),'DD'||to_char(sysdate, 'HH24SS'));
insert into ra.kalacak values (to_char(sysdate, 'HH24SS'),'DD'||to_char(sysdate, 'HH24SS'));
insert into ra.kalacak values (to_char(sysdate, 'HH24SS'),'DD'||to_char(sysdate, 'HH24SS'));
insert into ra.kalacak values (to_char(sysdate, 'HH24SS'),'DD'||to_char(sysdate, 'HH24SS'));

commit;

select * from ra.silinecek;

select * from ra.kalacak;

--kayitlarimiz kontrol ettik ve hepsi yerli yerinde.

alter system switch logfile;
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;

--redolar switch edildikten sonra RMAN den control file dahil full yedek alınır.

--Yedek aldıktan sonra ra.silinecek tablomuzu drop(purge ile) edebiliriz.

drop table ra.silinecek purge;


Scriptleri sorunsuz çalıştırdıktan sonra prod dbnin istediğimiz zamana kadar recovery edilmiş halini yeni dbmizde(AUX1) hazır olarak bulmayı umabiliriz.
teşekkürler.





26 Mart 2009 Perşembe

Kill inactive sessions in scheduled time



We needed kill for all inactive reporting users which has been inactive log an hour. This must have been a scheduled time in future. We can use such a below method for this purpose.

- Create schedular job that contaning running time.
- Put the below PL/SQL block in action side in that job.


As a result, sessions are automatically closed. Of course, this only applied to risk-free for users who selects. Users in a transaction with the closure of such a method is risky. You can desire select statement which using v$session view.



begin
FOR i IN (select username from dba_users where username like 'TEMP%')
LOOP
execute immediate 'alter user ' || i.username || ' account lock';
END LOOP;
FOR i IN (select sid, serial#, username from v$session where username like 'TEMP%')
LOOP
EXECUTE IMMEDIATE 'alter system kill session ' || '''' || i.sid || ',' || i.serial# || ''' immediate ';
END LOOP;
end;
/




13 Mart 2009 Cuma

Oracle Block change tracking

Oracle 10g ile gelen yeni ve kullanışlı bir özellik.
Normal şartlarda RMAN incremental backup alırken RMAN tüm blokları tarayarak bir önceki backuptan sonra bloğun değişip değişmediğine bakar ve eğer değişmişse yedeğini alır.
Burada en büyük zaman kaybına sebep olan şey RMAN ın bir bloğun değişip değişmediğini
anlaması için tüm blokları taramak zorunda kalmasıdır.

10g ile gelen bu yeni özellik ile blok değişimleri bir tracking file da tutulur.
Böylece RMAN sadece bu dosyayı inceleyerek yedek alması gereken bloklara karar verir ve tüm blokları okumak zorunda kalmaz. Bu şekilde backup zamanından ciddi anlamda kar edebiliriz.

Block tracking file tek bir dosyadır.
Default olarak DB_CREATE_FILE_DEST altında tutulur. İstenirse farklı bir lokasyonda saklanabilir.
RAC database için tracking file ortak storage üzerinde olmalıdır.

--baslatmak icin

SQL> alter database enable block tracking file;

--default lokasyonda bir tracking file açar

SQL> alter database enable block tracking using file '/disk/filename.f' reuse;

--belirttiğimiz lokasyonda tracking file açar. resuse parametresi mevcut dosyayı ezer.


--Block change tracking disable etmek için

SQL> alter database disable block change tracking;


Block change tracking disable edildiği zaman o ana kadar alınan incremental backuplar
geçersiz olur yeniden Level 0 backup alınması gerekir.

Tracking file başka bir lokasyona taşınabilir. Bunun için

1- database kapatılır

SQL> Shutdown immediate;

2- dosya fiziksel olarak yeni lokasyonuna taşınır.

cp old_file new_file

3- database mount modda açılır, dosya rename edilir ve database açılır

SQL> startup mount;
SQL> ALTER DATABASE RENAME FILE 'ora_home/dbs/change_trk.f' TO '/new_disk/change_trk.f';
SQL> alter database open;

Database açıkken de tracking disable edilip yeni lokasyonda tracking açılabilir. fakat
bu durumda önceki backuplar geçersiz olur.

teşekkürler.