Bazen hedef veritabanının ne zaman açıldığını,açıldığı zamanı, açık olup olmadığını kontrol etmemiz gerekebilir. Veri ambarları sisteminde ETL sürecinde verilerin çekiceleceği database'lerin durumunu bu şekilde kontrol edebiliriz. Aslında şu anda aklıma somut örnekler gelmiyor ama bir şekilde ikinci bir database'den veri çekiyor yada veri gönderiyor iseniz bu bilgiye ihtiyaç duyabilirsiniz.
Şu şekilde bir kullanım yaptım. Hedef database'de (SID) kendim için bir user oluşturuyorum, daha sonra bu user için v$instance erişim yetkisi veriyorum.
grant select on v$instance to scott;
ORA-02030: sadece sabit tablolardan/görünümlerden seçebilir
bu hatadann kurtulmak için yapmamız gereken çok basit oracle görünümün adında ufak bir değişiklik yapıyoruz.
grant select on v_$instance to scott;
Daha sonra SCOTT kullancısı ile bağlanıyorum ve instance durumuna bakıyorum.
SELECT STARTUP_TIME,INSTANCE_NAME FROM V$INSTANCE
Kendi database'imde bu buradaki zamanı yada statu'yü kontrol ederek kendi işlerimi yapıyorum.
v_$instance yetkisini geri almak için
revoke select on v_$instance from scott
Thursday, September 3, 2009
ALERT LOG DOSYASI OKUMA
Çoğu zaman herkez alert log dosyalarında neler döndüğünü merak eder. Bu merakı gidermenin en kısa yolu dosyayı işletim sistemi ortamında açmak ve okumaktır. Yada alert log dosyalarını okuyan işleyen bir tool kullanmak olabilir. Ben bu yazım da kendi SQL cümlelerimiz ile alert loglarını okumanın birkaç yolunu göstermeye çalışacağım.
Alert log dosyasına ne için ihtiyacımız olduğunu kısaca soylemek gerekir ise DB de olan olayları yakalamamızı sağla ne zaman açıldı hangi hataları aldı DB parametreleri neler gibi....
Alert log dosyaları eğer siz konumunu değiştirmediyseniz
C:\ORACLE\PRODUCT\10.2.0\ADMIN\ORCL\BDUMP dizininde bulabilirsiniz. Ama ben yerini değiştirdim ve şu anda nerede olduğunu bilmiyorum diyorsanız
SELECT value FROM v$parameter WHERE name='background_dump_dest';
sorgusu ile konumunu görebiliriz. Farkettiyseniz v$parameter view'inde database için tanımladığız parametleri bulacaksınız.
select * from dba_directories
Sorgusu ile directories'lere bakıyoruz. Eğer ilgili directory yok ise oluşturacağiz.
Asagidaki kod ile bir DIRECTORIES olusturuyorum. Daha sonra scott kullanicisi için bu directory okuma hakki veriyoruz. Sonrasinda SCOTT kullanici için bir external tablo olusturuyorum.Asagidaki islemleri tek tek de yapabiliriz.
DECLARE
--alert_SID.log dosyasinin oldugu dizin
bdump_dizini VARCHAR2(200);
--Hangi SID ilebagli oldugumuz bunu kullanmamizdaki amaç alert_SID.log (alert_orcl.log) seklinde bir dosya olmasi.SID ismi dinamik olarak veriliyor.
v_sid VARCHAR2(16);
--bunu External table olusturma sirasinda dogru script üretim üretmedigimi görmek için tanimladim.
v_dyn_sql VARCHAR2(5000);
--hatalar için tanimlamalar.
objectexists EXCEPTION;
PRAGMA EXCEPTION_INIT(objectexists,-955);
BEGIN
-- alert_orcl.log dosyasinin konumunu ögreniyorruz.
SELECT VALUE
INTO bdump_dizini
FROM v$parameter
WHERE NAME = 'background_dump_dest';
--ekrana dizini yazdiriyorum.
dbms_output.Put_line(bdump_dizini);
-- database'e yeni bir directory tanimliyoruz.
EXECUTE IMMEDIATE 'CREATE OR REPLACE DIRECTORY bdump_dir AS '''
||bdump_dizini
||'''';
--bu directory için SCOTT kullanicina okuma (erisim) hakki veriyorum.
EXECUTE IMMEDIATE 'GRANT READ ON DIRECTORY bdump_dir TO scott
';
--Database'e baglandigim SID ismini ögreniyorum.
SELECT instance_name
INTO v_sid
FROM v$instance;
--ekrana V_SID'yi yazdiriyorum kontrol amaçli.
dbms_output.Put_line(v_sid);
COMMIT;
-- yukarida external table için olusturdugum parametlerler ile simdi external tablomu olusturyorum.
v_dyn_sql := 'CREATE TABLE scott.ALERT_LOG_EXTERNAL
(TEXT VARCHAR2(255)
) ORGANIZATION EXTERNAL
(TYPE ORACLE_LOADER
DEFAULT DIRECTORY BDUMP_DIR
ACCESS PARAMETERS
(records delimited by newline
nobadfile
nologfile
)
LOCATION (''alert_'
||v_sid
||'.log'')
)
REJECT LIMIT UNLIMITED';
--dogru script üretip üretmedgimi kontrol için ekrana basiyorum.
dbms_output.Put_line(v_dyn_sql);
EXCEPTION
WHEN objectexists THEN
NULL;
END;
/
External tablomuzu oluşturduktan sonra artık alert loglarımız okuyabiliriz.
SELECT rownum row_num ,text FROM SCOTT.alert_log_external order by 1 desc;
İlk olarak log filemizi okumayı başardık fakat bu çokda kullanışlı görünmüyor şu aşamada. Çeşitli süslemeler ile daha okunabilir bir hale getirmeyeçalışacağiz.
alert log zamanlarını yakalamak için aşağıdaki gibi bir foksiyon oluşturalım.
CREATE OR REPLACE FUNCTION scott.Alert_log_date
(text IN VARCHAR2)
RETURN DATE
IS
invaliddate EXCEPTION;
PRAGMA EXCEPTION_INIT(invaliddate,-1846);
BEGIN
RETURN To_date(text,'Dy Mon DD HH24:MI:SS YYYY','NLS_DATE_LANGUAGE=AMERICAN');
EXCEPTION
WHEN invaliddate THEN
RETURN NULL;
END;
/
Şimdi bu fonksiyonu kullarak alert loglarımızı okuyalım , burada tarih gördüğü satırlarda tarih column'u ekliyor.
SELECT ROWNUM row_num ,scott.alert_log_date(text) alert_date, text
FROM scottt.alert_log_external
WHERE ROWNUM <50
Yukarıdaki sorguda tarih alanı boş gelen yerlere tarihi eklemek için aşağıdaki yapıyı kullanmabiliriz. Burada iki tarih arasına bir önceki tarihi ekleyerek her satırın başına tarih değerini atıyor. Bu sayede olayların hangi tarihte meydana geldiğini daha iyi gözlemleyebiliyoruz (monitor edebiliyoruz).
SELECT row_num ,LAST_VALUE(alert_date IGNORE NULLS) OVER(ORDER BY row_num
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) alert_date
,alert_text
FROM (SELECT ROWNUM row_num
,SCOTT.alert_log_date(text) alert_date
,text alert_text
FROM SCOTT.alert_log_external
)
WHERE ROWNUM < 50>
Aşağıdaki sorguda ise her bir hatanın ,olayın gerekleştiği zamanıki ilk satırın numarasını diğer satırlara yayıyor.
SELECT row_num
,LAST_VALUE(low_row_num IGNORE NULLS)
OVER(ORDER BY row_num ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) start_row
,LAST_VALUE(alert_date IGNORE NULLS)
OVER(ORDER BY row_num ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) alert_date
,alert_text
FROM (SELECT ROWNUM row_num
,NVL2(SCOTT.alert_log_date(text),ROWNUM,NULL) low_row_num
,SCOTT.alert_log_date(text) alert_date
,text alert_text
FROM SCOTT.alert_log_external
)
WHERE ROWNUM < 50
en son oluşturduğumuz sorgu sonucundan bir view oluşturuyoruz.
CREATE OR REPLACE FORCE VIEW scott.alert_log as
SELECT row_num
,LAST_VALUE(low_row_num IGNORE NULLS)
OVER(ORDER BY row_num ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW) start_row
,LAST_VALUE(alert_date IGNORE NULLS)
OVER(ORDER BY row_num ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW) alert_date
,alert_text
FROM (SELECT ROWNUM row_num
,NVL2(scott.alert_log_date(text),ROWNUM,NULL) low_row_num
,scott.alert_log_date(text) alert_date
,text alert_text
FROM scott.alert_log_external
);
--SYNONYM oluşturuyorum.
DECLARE
objectexists EXCEPTION;
PRAGMA EXCEPTION_INIT(objectexists,-955);
BEGIN
EXECUTE IMMEDIATE 'CREATE PUBLIC SYNONYM alert_log FOR scott.alert_log:';
-- E?er böyle bir synonym var ise silip yeniden yarat?yoruz.
EXCEPTION
WHEN objectexists THEN
EXECUTE IMMEDIATE 'DROP PUBLIC SYNONYM alert_log
';
EXECUTE IMMEDIATE 'CREATE PUBLIC SYNONYM alert_log FOR scott.alert_log
';
END;
/
--evet gerekli hazırlıkalrı yaptıktan sonra şimdi artık view üzerinde çeşitli sorgular yapabiliriz.
SELECT row_num,
alert_text
FROM alert_log
WHERE alert_date > SYSDATE - 1 / 24
/
ora hatalarını görmek için aşağıdaki sorguyu kullanabiliriz
regexp_like kullanımı ile ilgi bilgi için buraya bakabilrisiniz
SELECT row_num,
alert_date,
alert_text
FROM alert_log
WHERE start_row IN (SELECT start_row
FROM alert_log
WHERE Regexp_like(alert_text,'ORA-'))
AND alert_date > Trunc(SYSDATE,'MON')
/
Alert log dosyasına ne için ihtiyacımız olduğunu kısaca soylemek gerekir ise DB de olan olayları yakalamamızı sağla ne zaman açıldı hangi hataları aldı DB parametreleri neler gibi....
Alert log dosyaları eğer siz konumunu değiştirmediyseniz
C:\ORACLE\PRODUCT\10.2.0\ADMIN\ORCL\BDUMP dizininde bulabilirsiniz. Ama ben yerini değiştirdim ve şu anda nerede olduğunu bilmiyorum diyorsanız
SELECT value FROM v$parameter WHERE name='background_dump_dest';
sorgusu ile konumunu görebiliriz. Farkettiyseniz v$parameter view'inde database için tanımladığız parametleri bulacaksınız.
select * from dba_directories
Sorgusu ile directories'lere bakıyoruz. Eğer ilgili directory yok ise oluşturacağiz.
Asagidaki kod ile bir DIRECTORIES olusturuyorum. Daha sonra scott kullanicisi için bu directory okuma hakki veriyoruz. Sonrasinda SCOTT kullanici için bir external tablo olusturuyorum.Asagidaki islemleri tek tek de yapabiliriz.
DECLARE
--alert_SID.log dosyasinin oldugu dizin
bdump_dizini VARCHAR2(200);
--Hangi SID ilebagli oldugumuz bunu kullanmamizdaki amaç alert_SID.log (alert_orcl.log) seklinde bir dosya olmasi.SID ismi dinamik olarak veriliyor.
v_sid VARCHAR2(16);
--bunu External table olusturma sirasinda dogru script üretim üretmedigimi görmek için tanimladim.
v_dyn_sql VARCHAR2(5000);
--hatalar için tanimlamalar.
objectexists EXCEPTION;
PRAGMA EXCEPTION_INIT(objectexists,-955);
BEGIN
-- alert_orcl.log dosyasinin konumunu ögreniyorruz.
SELECT VALUE
INTO bdump_dizini
FROM v$parameter
WHERE NAME = 'background_dump_dest';
--ekrana dizini yazdiriyorum.
dbms_output.Put_line(bdump_dizini);
-- database'e yeni bir directory tanimliyoruz.
EXECUTE IMMEDIATE 'CREATE OR REPLACE DIRECTORY bdump_dir AS '''
||bdump_dizini
||'''';
--bu directory için SCOTT kullanicina okuma (erisim) hakki veriyorum.
EXECUTE IMMEDIATE 'GRANT READ ON DIRECTORY bdump_dir TO scott
';
--Database'e baglandigim SID ismini ögreniyorum.
SELECT instance_name
INTO v_sid
FROM v$instance;
--ekrana V_SID'yi yazdiriyorum kontrol amaçli.
dbms_output.Put_line(v_sid);
COMMIT;
-- yukarida external table için olusturdugum parametlerler ile simdi external tablomu olusturyorum.
v_dyn_sql := 'CREATE TABLE scott.ALERT_LOG_EXTERNAL
(TEXT VARCHAR2(255)
) ORGANIZATION EXTERNAL
(TYPE ORACLE_LOADER
DEFAULT DIRECTORY BDUMP_DIR
ACCESS PARAMETERS
(records delimited by newline
nobadfile
nologfile
)
LOCATION (''alert_'
||v_sid
||'.log'')
)
REJECT LIMIT UNLIMITED';
--dogru script üretip üretmedgimi kontrol için ekrana basiyorum.
dbms_output.Put_line(v_dyn_sql);
EXCEPTION
WHEN objectexists THEN
NULL;
END;
/
External tablomuzu oluşturduktan sonra artık alert loglarımız okuyabiliriz.
SELECT rownum row_num ,text FROM SCOTT.alert_log_external order by 1 desc;
İlk olarak log filemizi okumayı başardık fakat bu çokda kullanışlı görünmüyor şu aşamada. Çeşitli süslemeler ile daha okunabilir bir hale getirmeyeçalışacağiz.
alert log zamanlarını yakalamak için aşağıdaki gibi bir foksiyon oluşturalım.
CREATE OR REPLACE FUNCTION scott.Alert_log_date
(text IN VARCHAR2)
RETURN DATE
IS
invaliddate EXCEPTION;
PRAGMA EXCEPTION_INIT(invaliddate,-1846);
BEGIN
RETURN To_date(text,'Dy Mon DD HH24:MI:SS YYYY','NLS_DATE_LANGUAGE=AMERICAN');
EXCEPTION
WHEN invaliddate THEN
RETURN NULL;
END;
/
Şimdi bu fonksiyonu kullarak alert loglarımızı okuyalım , burada tarih gördüğü satırlarda tarih column'u ekliyor.
SELECT ROWNUM row_num ,scott.alert_log_date(text) alert_date, text
FROM scottt.alert_log_external
WHERE ROWNUM <50
Yukarıdaki sorguda tarih alanı boş gelen yerlere tarihi eklemek için aşağıdaki yapıyı kullanmabiliriz. Burada iki tarih arasına bir önceki tarihi ekleyerek her satırın başına tarih değerini atıyor. Bu sayede olayların hangi tarihte meydana geldiğini daha iyi gözlemleyebiliyoruz (monitor edebiliyoruz).
SELECT row_num ,LAST_VALUE(alert_date IGNORE NULLS) OVER(ORDER BY row_num
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) alert_date
,alert_text
FROM (SELECT ROWNUM row_num
,SCOTT.alert_log_date(text) alert_date
,text alert_text
FROM SCOTT.alert_log_external
)
WHERE ROWNUM < 50>
Aşağıdaki sorguda ise her bir hatanın ,olayın gerekleştiği zamanıki ilk satırın numarasını diğer satırlara yayıyor.
SELECT row_num
,LAST_VALUE(low_row_num IGNORE NULLS)
OVER(ORDER BY row_num ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) start_row
,LAST_VALUE(alert_date IGNORE NULLS)
OVER(ORDER BY row_num ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) alert_date
,alert_text
FROM (SELECT ROWNUM row_num
,NVL2(SCOTT.alert_log_date(text),ROWNUM,NULL) low_row_num
,SCOTT.alert_log_date(text) alert_date
,text alert_text
FROM SCOTT.alert_log_external
)
WHERE ROWNUM < 50
en son oluşturduğumuz sorgu sonucundan bir view oluşturuyoruz.
CREATE OR REPLACE FORCE VIEW scott.alert_log as
SELECT row_num
,LAST_VALUE(low_row_num IGNORE NULLS)
OVER(ORDER BY row_num ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW) start_row
,LAST_VALUE(alert_date IGNORE NULLS)
OVER(ORDER BY row_num ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW) alert_date
,alert_text
FROM (SELECT ROWNUM row_num
,NVL2(scott.alert_log_date(text),ROWNUM,NULL) low_row_num
,scott.alert_log_date(text) alert_date
,text alert_text
FROM scott.alert_log_external
);
--SYNONYM oluşturuyorum.
DECLARE
objectexists EXCEPTION;
PRAGMA EXCEPTION_INIT(objectexists,-955);
BEGIN
EXECUTE IMMEDIATE 'CREATE PUBLIC SYNONYM alert_log FOR scott.alert_log:';
-- E?er böyle bir synonym var ise silip yeniden yarat?yoruz.
EXCEPTION
WHEN objectexists THEN
EXECUTE IMMEDIATE 'DROP PUBLIC SYNONYM alert_log
';
EXECUTE IMMEDIATE 'CREATE PUBLIC SYNONYM alert_log FOR scott.alert_log
';
END;
/
--evet gerekli hazırlıkalrı yaptıktan sonra şimdi artık view üzerinde çeşitli sorgular yapabiliriz.
SELECT row_num,
alert_text
FROM alert_log
WHERE alert_date > SYSDATE - 1 / 24
/
ora hatalarını görmek için aşağıdaki sorguyu kullanabiliriz
regexp_like kullanımı ile ilgi bilgi için buraya bakabilrisiniz
SELECT row_num,
alert_date,
alert_text
FROM alert_log
WHERE start_row IN (SELECT start_row
FROM alert_log
WHERE Regexp_like(alert_text,'ORA-'))
AND alert_date > Trunc(SYSDATE,'MON')
/
TEMPORARY TABLESPACE TEMPFILE EKLEME
TEMPORARY TABLESPACE HATASI
ORA-25153: Temporary Tablespace is Empty
ORA-25153: Geçici Tablo Alanı Boş
yukaridaki hatayi aldiğimizda bakamiz gereken bazi yerler var Öncelik ile tablespcelerimizin yerinde olup olamadığına bakalim.
l - select tablespace_name, STATUS from dba_tablespaces;
Tablespace ve bu tablespacelere ait datafilelerin konumunu görelim. Burada TEMP tablespace'i göremiyoruz.
2- select tablespace_name, file_name from dba_data_files;
Temp tablespace'leri görmek için dba_temp_files bakmamız gerekiyor.
select tablespace_name, file_name from dba_temp_files;
Bu sorgunun sonucunun boş gelmesi durumunda ORA-25153 hatasını alıyoruz.Bir şekilde temp tablespacemize temp datafile eklemeliyiz.
ALTER TABLESPACE "TEMP" ADD TEMPFILE 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEMP01.DBF' SIZE 100M AUTOEXTEND ON NEXT 1024K MAXSIZE 100M
ALTER TABLESPACE "TEMP" ADD TEMPFILE 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEMP02.DBF' SIZE 100M AUTOEXTEND ON NEXT 1024K MAXSIZE 100M
3- select tablespace_name, file_name from dba_temp_files;
TABLESPACE_NAME FILE_NAME
TEMP C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEMP01.DBF
TEMP C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEMP02.DBF
Tempfile silmek işleminde aşağıdaki scripti kullanırsanız
ALTER TABLESPACE "TEMP" DROP DATAFILE 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEMP02.DBF'
Bu hatayı alırsınız burada TEMPFILE cümleciğini kullanmanız gerekiyor.
ORA-03219: Tablo alani 'TEMP' sözlük tarafindan yönetiliyor, çevrimdisi veya geçici
Tempfile silmek için ise aşağıdaki cümleciği kullanmalısınız.
ALTER TABLESPACE "TEMP" DROP TEMPFILE 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEMP02.DBF'
Bu işlemlerden sonra aynı hatayı almayabilirsiniz. Alsanızda sebebi bu olmayacaktir.
Tuesday, September 1, 2009
DATABASE HIZLI BİR ŞEKİLDE KAPATMAK
RESTORE POINT (KURTARMA NOKTASI)
Bazen öyle durumlar olur ki veritabanınızı bir an önce kapatmanız gerekebilir.
böyle durumlarda SHUTDOWN IMMEDIATE demek yeterli olmayacaktır. SHUTDOWN ABORT komutunu kullanmak isteyeceksiniz.
fakat shutdown abort komutunun bazı dezavantajları var, veri kaybı yaşayabilrsiniz. Bu tip durumları aşmak için öncelik ile
restore point(kurtarma noktası) oluşturuyoruz.
Veritabanımızın kurtarma noktası özelliğini kullanabilmemiz için flashback modu'nun açılmış olması gerekmektedir.
Bu konu ilgili bilgiyi buradan alabilirsiniz.
Database'i kapatmadan hemen önce bir kurtarma noktası oluşturuyorum.
SQL> create restore point kapatmadan_once;
Geri yükleme noktası yaratıldı.
database'i hızlı bir şekilde kapatmak için
SQL> shutdown abort;
ORACLE anı kapatıldı.
daha sonra mount modda açıyoruz.Bu şekilde kullanıcıların sisteme erişmelerini kısıtlamış oluyoruz.
SQL> startup mount;
ORACLE anı başlatıldı.
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 234883972 bytes
Database Buffers 369098752 bytes
Redo Buffers 7135232 bytes
Veritabanı kullanıma açıldı.
En son aldığımız restore point'e dönüyoruz.
SQL> flashback database to restore point kapatmadan_once;
Gerisinyal tamamlandı.
Son olarak Veritabanını bütün kullanıcıları açıyoruz. Hadi hayırlısı.
SQL> alter database open resetlogs;
Veritabanı değiştirildi.
oluştuşturduğumuz restore point silmek için
SQL> drop restore point kapatmadan_once;
Geri yükleme noktası bırakıldı.
SQL> drop restore point deneme1;
Geri yükleme noktası bırakıldı.
restore point(kuratma noktaları) listelemek için
SQL> select scn,name from v$restore_point ;
satır seçilmedi
http://www.oracle.com/technology/oramag/oracle/06-nov/o66recovery.html
Bazen öyle durumlar olur ki veritabanınızı bir an önce kapatmanız gerekebilir.
böyle durumlarda SHUTDOWN IMMEDIATE demek yeterli olmayacaktır. SHUTDOWN ABORT komutunu kullanmak isteyeceksiniz.
fakat shutdown abort komutunun bazı dezavantajları var, veri kaybı yaşayabilrsiniz. Bu tip durumları aşmak için öncelik ile
restore point(kurtarma noktası) oluşturuyoruz.
Veritabanımızın kurtarma noktası özelliğini kullanabilmemiz için flashback modu'nun açılmış olması gerekmektedir.
Bu konu ilgili bilgiyi buradan alabilirsiniz.
Database'i kapatmadan hemen önce bir kurtarma noktası oluşturuyorum.
SQL> create restore point kapatmadan_once;
Geri yükleme noktası yaratıldı.
database'i hızlı bir şekilde kapatmak için
SQL> shutdown abort;
ORACLE anı kapatıldı.
daha sonra mount modda açıyoruz.Bu şekilde kullanıcıların sisteme erişmelerini kısıtlamış oluyoruz.
SQL> startup mount;
ORACLE anı başlatıldı.
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 234883972 bytes
Database Buffers 369098752 bytes
Redo Buffers 7135232 bytes
Veritabanı kullanıma açıldı.
En son aldığımız restore point'e dönüyoruz.
SQL> flashback database to restore point kapatmadan_once;
Gerisinyal tamamlandı.
Son olarak Veritabanını bütün kullanıcıları açıyoruz. Hadi hayırlısı.
SQL> alter database open resetlogs;
Veritabanı değiştirildi.
oluştuşturduğumuz restore point silmek için
SQL> drop restore point kapatmadan_once;
Geri yükleme noktası bırakıldı.
SQL> drop restore point deneme1;
Geri yükleme noktası bırakıldı.
restore point(kuratma noktaları) listelemek için
SQL> select scn,name from v$restore_point ;
satır seçilmedi
http://www.oracle.com/technology/oramag/oracle/06-nov/o66recovery.html
DATABASE FLASHBACK AYARLARI
Veritabanımızın flashback özelliğini açmak için aşağıdaki adımları izlemiz yeterli olacaktır.
Bu işlemleri yapmaya başlamadan önce bazı FLASHBACK parametrelerini ayarlamamız gerekecektir.
* DB_RECOVERY_FILE_DEST
* DB_RECOVERY_FILE_DEST_SIZE
* DB_FLASHBACK_RETENTION_TARGET
Bu parametreleri kısaca açıklamak gerekir ise
DB_RECOVERY_FILE_DEST FLASHBACK için kullanılacak olan dosyaların yerini belirtiyoruz.
DB_RECOVERY_FILE_DEST_SIZE ne kadarlık bir alanı bu iş için ayrıcağımızı belirtiyoruz. Bu parametreyi belirlerken FLASHBACK özelliğini kaç gün (ne kadarlık bir zaman dilimi ) için kullanacağız, Bu zaman diliminde üretilmesini tahmin ettiğimiz veri miktarı ne olacak, son olarak disk kapasitemiz ne kadar. Bu iş için ayırdığımız 500GB lik bir diskimiz var ise bunun tamamını buraya tahsis etmeyelim 450 GB sini verelim olurda disk dolar ve database'de işlemler devam ederken DB_RECOVERY_FILE_DEST_SIZE alanı doldu doluyor uyarısı alırsak tam dolmadan önlem alabiliriz.
DB_FLASHBACK_RETENTION_TARGET parametresi verileminiz ne kadarlık bir zaman dilimi için saklayacağimi belirtiyor. Burada 24 saat (1 günlük) olsun derseniz 24*60=1440 değerini belirlememiz gerekir. Anlaşılacağı gibi dakika olarak belirliyoruz.
DB_FLASHBACK_RETENTION_TARGET ve DB_RECOVERY_FILE_DEST_SIZE parametreleri sizin de farkedebileceğiniz gibi birbirleri ile ilişki içerisindeler.
senaryomuzun şu şekilde olduğunu varsayarsak benim günlük olarak 100 gb flashback datam oluşuyor, flashback dönme süremi 7 gün olarak belirliyorum.
bu durumda en az 700 GB lik bir DB_RECOVERY_FILE_DEST_SIZE alanına ihtiyacım olacak.
ORA-38700: Limit of %s flashback database logs has been exceed
Bu hata ile karşılaşmanız kaçınılmaz olacaktır.
Kurulum ile beraber varsayılan olarak gelen parametreler aşağıdaki sorgu ile görülebilir.
select * from v$parameter where name like '%db_recovery%' or name like '%db_flashback%'
Şimdi parametreleri ayarlamaya geldi sıra. Dosyalarımızı nerede saklayacağımızı belirliyoruz.
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='C:\flashback_alani\';
Ne kadarlık bir süre için saklayacağımızı belirliyoruz.
ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=10080; -- 1 hafta haftalık full backup aldığımı varsayıyorum. Yeterli alanımda var :))
FLASHBACK için ayırdığım disk alanını belirliyorum.
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=30G; -- 30 Gb olarak belirledim.
Evet flashback parametrelerini belirdik. Şimdi veritabanımızı flashback moda geçirelim. Ben makinamda yaptığım adımları aşağıda belirtiyorum.
Veritabanını açıyoruz.
SQL> startup;
ORACLE anı başlatıldı.
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 201329540 bytes
Database Buffers 402653184 bytes
Redo Buffers 7135232 bytes
Veritabanı kullanıma açıldı.
Veritabanı açıldı.
SQL>
Hangi modda olduğunu görelim. Ben daha önce ARCHIVELOG moda almıştım (RMAN için). Flashback özelliğinin ARCHIVELOG mod istediğini belirtmek için
gecici olarak NOARCHIVELOG moda gececeğim.
SQL> select name,log_mode from v$database;
NAME LOG_MODE
--------- ------------
ORCL ARCHIVELOG
FLASHBACK özelliğini kontrol ediyoruz.
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
NO
SQL> shutdown immediate;
Veritabanı kapatıldı.
Veritabanı kullanıma kapatıldı.
ORACLE anı kapatıldı.
SQL> alter database noarchivelog;
alter database noarchivelog
*
1 satırında HATA:
ORA-01034: ORACLE not available
SQL> startup mount
ORACLE anı başlatıldı.
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 205523844 bytes
Database Buffers 398458880 bytes
Redo Buffers 7135232 bytes
Veritabanı kullanıma açıldı.
SQL> alter database noarchivelog;
Veritabanı değiştirildi
SQL> select log_mode from v$database;
LOG_MODE
------------
NOARCHIVELOG
NOARCHIVELOG modda olmadığını görüyoruz.
SQL> alter database flashback on;
alter database flashback on
*
1 satırında HATA:
ORA-38706: FLASHBACK VERITABANI günlüge kaydetme açilamiyor.
ORA-38707: Ortam kurtarma etkin degil.
SQL> ALTER DATABASE FLASHBACK ON;
ALTER DATABASE FLASHBACK ON
*
1 satırında HATA:
ORA-38706: FLASHBACK VERITABANI günlüge kaydetme açilamiyor.
ORA-38707: Ortam kurtarma etkin degil.
SQL> alter database archivelog;
Veritabanı değiştirildi
ve işlem tamam.
SQL> ALTER DATABASE FLASHBACK ON;
Veritabanı değiştirildi
SQL> alter database open;
ve işlem tamam. Artık anlık olarak yedekten dönebileceğiz. Kullanıcıların yanlışlık ile sildiği tablolar geri gelebicek.
Veritabanı değiştirildi
SQL>
FLASHBACK alanının son durumunu görmek için
SELECT NAME, TO_CHAR (space_limit, '999,999,999,999') AS flashback_max_size,
TO_CHAR (space_limit - space_used + space_reclaimable,
'999,999,999,999'
) AS flashback_kalan_alan,
ROUND ((space_used - space_reclaimable) / space_limit * 100,
1
) AS pct_full
FROM v$recovery_file_dest;
ayrıntılı bilgili buradan alabilirsiniz.
http://www.oracle.com/technology/deploy/availability/htdocs/Flashback_Overview.htm
http://www.cagataycebi.com/oracle/oracle_flashback_db.pdf
Bu işlemleri yapmaya başlamadan önce bazı FLASHBACK parametrelerini ayarlamamız gerekecektir.
* DB_RECOVERY_FILE_DEST
* DB_RECOVERY_FILE_DEST_SIZE
* DB_FLASHBACK_RETENTION_TARGET
Bu parametreleri kısaca açıklamak gerekir ise
DB_RECOVERY_FILE_DEST FLASHBACK için kullanılacak olan dosyaların yerini belirtiyoruz.
DB_RECOVERY_FILE_DEST_SIZE ne kadarlık bir alanı bu iş için ayrıcağımızı belirtiyoruz. Bu parametreyi belirlerken FLASHBACK özelliğini kaç gün (ne kadarlık bir zaman dilimi ) için kullanacağız, Bu zaman diliminde üretilmesini tahmin ettiğimiz veri miktarı ne olacak, son olarak disk kapasitemiz ne kadar. Bu iş için ayırdığımız 500GB lik bir diskimiz var ise bunun tamamını buraya tahsis etmeyelim 450 GB sini verelim olurda disk dolar ve database'de işlemler devam ederken DB_RECOVERY_FILE_DEST_SIZE alanı doldu doluyor uyarısı alırsak tam dolmadan önlem alabiliriz.
DB_FLASHBACK_RETENTION_TARGET parametresi verileminiz ne kadarlık bir zaman dilimi için saklayacağimi belirtiyor. Burada 24 saat (1 günlük) olsun derseniz 24*60=1440 değerini belirlememiz gerekir. Anlaşılacağı gibi dakika olarak belirliyoruz.
DB_FLASHBACK_RETENTION_TARGET ve DB_RECOVERY_FILE_DEST_SIZE parametreleri sizin de farkedebileceğiniz gibi birbirleri ile ilişki içerisindeler.
senaryomuzun şu şekilde olduğunu varsayarsak benim günlük olarak 100 gb flashback datam oluşuyor, flashback dönme süremi 7 gün olarak belirliyorum.
bu durumda en az 700 GB lik bir DB_RECOVERY_FILE_DEST_SIZE alanına ihtiyacım olacak.
ORA-38700: Limit of %s flashback database logs has been exceed
Bu hata ile karşılaşmanız kaçınılmaz olacaktır.
Kurulum ile beraber varsayılan olarak gelen parametreler aşağıdaki sorgu ile görülebilir.
select * from v$parameter where name like '%db_recovery%' or name like '%db_flashback%'
Şimdi parametreleri ayarlamaya geldi sıra. Dosyalarımızı nerede saklayacağımızı belirliyoruz.
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='C:\flashback_alani\';
Ne kadarlık bir süre için saklayacağımızı belirliyoruz.
ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=10080; -- 1 hafta haftalık full backup aldığımı varsayıyorum. Yeterli alanımda var :))
FLASHBACK için ayırdığım disk alanını belirliyorum.
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=30G; -- 30 Gb olarak belirledim.
Evet flashback parametrelerini belirdik. Şimdi veritabanımızı flashback moda geçirelim. Ben makinamda yaptığım adımları aşağıda belirtiyorum.
Veritabanını açıyoruz.
SQL> startup;
ORACLE anı başlatıldı.
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 201329540 bytes
Database Buffers 402653184 bytes
Redo Buffers 7135232 bytes
Veritabanı kullanıma açıldı.
Veritabanı açıldı.
SQL>
Hangi modda olduğunu görelim. Ben daha önce ARCHIVELOG moda almıştım (RMAN için). Flashback özelliğinin ARCHIVELOG mod istediğini belirtmek için
gecici olarak NOARCHIVELOG moda gececeğim.
SQL> select name,log_mode from v$database;
NAME LOG_MODE
--------- ------------
ORCL ARCHIVELOG
FLASHBACK özelliğini kontrol ediyoruz.
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
NO
SQL> shutdown immediate;
Veritabanı kapatıldı.
Veritabanı kullanıma kapatıldı.
ORACLE anı kapatıldı.
SQL> alter database noarchivelog;
alter database noarchivelog
*
1 satırında HATA:
ORA-01034: ORACLE not available
SQL> startup mount
ORACLE anı başlatıldı.
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 205523844 bytes
Database Buffers 398458880 bytes
Redo Buffers 7135232 bytes
Veritabanı kullanıma açıldı.
SQL> alter database noarchivelog;
Veritabanı değiştirildi
SQL> select log_mode from v$database;
LOG_MODE
------------
NOARCHIVELOG
NOARCHIVELOG modda olmadığını görüyoruz.
SQL> alter database flashback on;
alter database flashback on
*
1 satırında HATA:
ORA-38706: FLASHBACK VERITABANI günlüge kaydetme açilamiyor.
ORA-38707: Ortam kurtarma etkin degil.
SQL> ALTER DATABASE FLASHBACK ON;
ALTER DATABASE FLASHBACK ON
*
1 satırında HATA:
ORA-38706: FLASHBACK VERITABANI günlüge kaydetme açilamiyor.
ORA-38707: Ortam kurtarma etkin degil.
SQL> alter database archivelog;
Veritabanı değiştirildi
ve işlem tamam.
SQL> ALTER DATABASE FLASHBACK ON;
Veritabanı değiştirildi
SQL> alter database open;
ve işlem tamam. Artık anlık olarak yedekten dönebileceğiz. Kullanıcıların yanlışlık ile sildiği tablolar geri gelebicek.
Veritabanı değiştirildi
SQL>
FLASHBACK alanının son durumunu görmek için
SELECT NAME, TO_CHAR (space_limit, '999,999,999,999') AS flashback_max_size,
TO_CHAR (space_limit - space_used + space_reclaimable,
'999,999,999,999'
) AS flashback_kalan_alan,
ROUND ((space_used - space_reclaimable) / space_limit * 100,
1
) AS pct_full
FROM v$recovery_file_dest;
ayrıntılı bilgili buradan alabilirsiniz.
http://www.oracle.com/technology/deploy/availability/htdocs/Flashback_Overview.htm
http://www.cagataycebi.com/oracle/oracle_flashback_db.pdf
Subscribe to:
Posts (Atom)