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.





Hiç yorum yok:

Yorum Gönder