RedoLog Dosyaları Yönetimi
Veri tabani sistemlerinde tutarlılık olmazsa olmaz bir özelliktir. Tutarlılığı sağlamak için "shadow copy" ve "write-ahead logging" (WAL) yöntemleri kullanılır en yaygın olanı WAL’dır. Açık kaynak kodlu (open source) veri tabanlarından postreSQL isim değişikliği yapmadan direk WAL olarak bu yapıyı kullanır, Oracle ise ismini redolog olarak değiştirip kullanmaktadır.
Oracle ın redolog dosyalarının özellikleri
*Bütün değişiklikler önce bu redolog dosyalarına kayıt edilir. *Kurtarma (recovery) mekanizmalarında kullanılır. *Gruplar şeklinde organize edilir. En az iki grup olmak zorundadır. Hata toleransı için grup üyeleri (member) farklı disklerde olmalıdır. Hepsini aynı yerde tutmak isterseniz hata tolaransı olan raid mimarilerinde olmalıdır(raid1,5,10 vb.). Aynı grubun üyeleri birbirlerinin kopyasıdır.Log squence ve boyutları aynıdır. *Redolog dosyalarının grup ve üye sayısı Create database komutu ile belirtilir; maxlogfiles max log file grup sayısını maxlogmembers her gruptaki max üye sayısını *Dairesel bir çalışma şekli vardır . 3 grubumuz olduğunu düşünürsek LOGWR önce grup 1’e bitince grup 2’ye bitince grup 3’e bitince tekrar grup 1’e yazar yani bir önceki bilgilerin üzerine yazar. Grup sayısı VT’ nizin yoğunluğuna/transaction sayısına bağlıdır. Eğer grup sayınız yeterli değilse "threat cannot allocate new log" gibi hatalar alırsınız. Aşağıda anlatılan grup/üye (member) ekleme yöntemi ile yeni gruplar/üyeler ekleyebilirsiniz. Bölümün sonunda da bu kadar teorik bilgiden sonra olmazsa olmaz felaket senoryalarına yer verdim. RedoLog dosyası bozulan VT 'yi çalışır hale getireceğiz. * 6 adet statüsü vardır; Current : o an işlem gören yani işlemlerin yazıldığı redo log Active : current dan bir önceki statudur henüz bilgiler veri dosyalarına (data file lara) yazılmamıştır. (archive modda ise arşivlenme işleminin de bitmediğini gösterir) Inactive : Kullanımda olmayan redo log dosyasını ifade eder.Instance Recovery işlemleri için kullanılmaz. Unused : hiç kullanılmamış redo log dosyasını ifade eder. Invalid : Eişilemez, bozuk (corrupted) redo log dosyasını ifade eder. Stale : İçeriği tamamlanamamışredo log dosyasını ifade eder. Deleted : Kullanılmayacak redo log dosyasını ifade eder. Clearing : alter database clear logfile komutundan sonra içinin temizlenip yeniden oluşturulanredo log dosyasını ifade eder.Oluşturulduktan sonra unused statusune geçer. Felaket durumunda, son dakikaya (felaketin olduğu an) dönmek için veri tabanınızı archive moda almalısınız nasıl alınacağına linkinden erişebilirsiniz. Archive modda dolan redolog dosyaları arşivlenerek saklanır böylece commit edilmiş tüm verileri geri getirebilirsiniz. Archived modun en büyük avantajlarından biri de VT’ yi kapatmadan yedek alabilirsiniz. (Deault da VT archive modda değildir.)
Log Switch : LGWR nin bir grupdan diğerine geçmesine denir. bununla beraber checkpoint işlemi de gerçekleşir.
|
1 |
alter system switch logfile; |
|
1 |
spfile da fast_start_mttr_target = 600 |
Değeri tutarsız kapanırsa 600 sn de ayağa kalksın anlamındadır. Buna göre log switch zamanlarını ayarlayacaktır. Sık check point performansı düşürür seyrek olması da tutarsız kapanan vt nin recover işleminin uzun sürmesine neden olur.
|
1 |
alter system checkpoint ; |
Komutu ile istendiğinde chkpoint yapılabilir.
RedoLog dosyaları ile ilgili bilgileri v$log ve v$file view larından alırız.
|
1 2 |
v$log v$logfile |
RedoLog İşlemleri
Mevcut durum,
|
1 2 3 4 5 6 |
select group#, member from v$logfile; GROUP# MEMBER ---------- ------------------------------------------------------ 3 /export/home/oracle/oradata/suntest/redo03a.log 2 /export/home/oracle/oradata/suntest/redo02a.log 1 /export/home/oracle/oradata/suntest/redo01a.log |
Üye (member) ekleyelim.
|
1 2 3 |
alter database add logfile member '/export/home/oracle/oradata/suntest/redo01b.log' to group 1 alter database add logfile member '/export/home/oracle/oradata/suntest/redo02b.log' to group 2 alter database add logfile member '/export/home/oracle/oradata/suntest/redo03b.log' to group 3 |
Not : Test ortamı olduğu için memberları aynı dizine oluşturduk üretim ortamında farklı fiziksel diskleri oluşturulması gerekmektedir. Aynı diske oluşturulabilir lakin member oluşturmamızdaki amaç hata toleransı, disklerden birinde meydana gelebilecek bir arıza durumunda sistemin devamlılığını sağlamaktır. Ayrıca aynı diske oluşturması performansı da olumsuz etkiliyecektir. Linux ortamında disk ekleme adımlarını dokümanın sonunda bulabilirsiniz.
AlertLog a düşen log
|
1 |
$ tail -f alert_suntest.log |
|
1 2 3 4 |
alter database add logfile member '/export/home/oracle/oradata/suntest/redo01b.log' to group 1 Wed Jun 2 15:45:30 2010 Completed: alter database add logfile member '/export/home/oracle/oradata/suntest/redo01b.log' to group 1 …… |
Tekrar Sorgulayalım.
|
1 2 3 4 5 6 7 8 9 |
select group#, member from v$logfile; GROUP# MEMBER ---------- ------------------------------------------------------ 3 /export/home/oracle/oradata/suntest/redo03a.log 2 /export/home/oracle/oradata/suntest/redo02a.log 1 /export/home/oracle/oradata/suntest/redo01a.log 1 /export/home/oracle/oradata/suntest/redo01b.log 3 /export/home/oracle/oradata/suntest/redo03b.log 2 /export/home/oracle/oradata/suntest/redo02b.log |
Grup Ekleyelim
|
1 2 3 |
alter database add logfile group 4 ('/export/home/oracle/oradata/suntest/redo04a.log','/export/home/oracle/oradata/suntest/redo04b.log') size 50M; |
|
1 |
select group#, member from v$logfile; |
|
1 2 3 4 5 6 7 8 9 10 11 |
GROUP# MEMBER ---------- ---------------------------------------------------- 3 /export/home/oracle/oradata/suntest/redo03a.log 2 /export/home/oracle/oradata/suntest/redo02a.log 1 /export/home/oracle/oradata/suntest/redo01a.log 1 /export/home/oracle/oradata/suntest/redo01b.log 4 /export/home/oracle/oradata/suntest/redo04a.log 4 /export/home/oracle/oradata/suntest/redo04b.log 3 /export/home/oracle/oradata/suntest/redo03b.log 2 /export/home/oracle/oradata/suntest/redo02b.log |
RedoLog Taşıma ya da İsim Değiştirme
2 şekilde yapılabilir;
a- "rename" komutuyla
b- yeni üyeler istenilen yerde ve/veya isimde oluşturup eskisi drop edilir.
a-Rename Komutu ile
DB mount moda alınır.
|
1 2 3 |
shutdown immediate startup mount alter database rename file '/export/home/oracle/oradata/suntest/redo03.log' to '/export/home/oracle/oradata/suntest/redo03a.log' ; |
Farklı bir lokasyona taşıma işlemi de aynı şekilde yapılır. VT kapatıldıktan sonra redo03.log yeni yerine kopyalanır ve alter database rename komutu verilir.
REDOLOG SILME (DROP)
Grup Silme
- Burada dikkat edilmesi gereken sistemin çalışabilmesi için en az 2 gruba ihtiyaç var.
- Statusu current ve active olan gruplar silinemez.
- Silinen grupların işletim sistemi tarafındaki dosyaları silinmez.
|
1 |
SQL> alter database drop logfile group 4; |
Üye (member) silme (drop)
- Çalışır durumdaki son üye ise silinemez
- Statusu current ise önce switch edilmesi lazım
- Database archive modda ise ve henüz arşivlenmemiş ise silinemez.
- OMF özelliği kullanılmıyorsa işletim sistemi tarafındaki dosyaları kalır.
|
1 2 |
SQL> alter database drop logfile member '/export/home/oracle/oradata/suntest/redo01a.log'; |
RedoLog ların bozulması Durumunda Yapılabileceler
test 1
Group 3 current statusunde iken oracle ve oinstall gruplarinin tum yetkileri group 3 redolog dosyalarindan alindi.
|
1 2 |
chmod wrx-a redolog03.rdo alter system switch logfile ; |
ile redo group 1 e gecildi sorun yok,
tekrar "alter system switch logfile" parametresi verildiginde takili kailiyor.
alert log dosyasinda permission denied veARC0: Failed to archive thread 1 sequence 11 (0) hatalarını veriyor.
sys kullanicisi ile tekrar sisteme giris yapılabiliyor.
sorgulamalar calisiyor.
sys kulancisi ile test tablosu create edip commit edilebiliyor.
|
1 2 3 |
conn hr/hr@orclvm ERROR: ORA-00257: archiver error. Connect internal only, until freed. conn scott/1@orclvm ERROR: ORA-00257: archiver error. Connect internal only, until freed. alter database clear logfile group 3; alter database clear logfile group 3 * ERROR at line 1: ORA-00350: log 3 of instance orcl (thread 1) needs to be archived ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/orcl/redo03.log' |
|
1 |
alter database clear unarchived logfile group 3; |
Database altered.
Alert dosyasındaki loglar
|
1 |
WARNING! CLEARING REDO LOG WHICH HAS NOT BEEN ARCHIVED. BACKUPS TAKEN BEFORE 01/24/2010 20:51:55 (CHANGE 635601) CANNOT BE USED FOR RECOVERY. |
Burasi onemli bu tarihden onceki rman ile alinan yedekler ise yaramiyor diyor ama acaba o ana mi donulemez de elinde bulunan archive loga kadar donulebilir mi ?
|
1 |
Clearing online log 3 of thread 1 sequence number 11 Sun Jan 24 21:13:56 2010 Errors in file /u01/app/oracle/admin/orcl/udump/orcl_ora_6815.trc: ORA-00313: open failed for members of log group 3 of thread 1 ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/orcl/redo03.log' ORA-27041: unable to open file Linux-x86_64 Error: 13: Permission denied Additional information: 2 Sun Jan 24 21:14:09 2010 Completed: alter database clear unarchived logfile group 3 Sun Jan 24 21:14:14 2010 Archiver process freed from errors. No longer stopped |
Yapıldıktan sonra scott kullanici ile sisteme giris yapabildim.
current group 1 oldu hatalar dışında db tekrar calışıyor.
|
1 |
alter system switch logfile; |
komutunu verdiğimde
group 3 current oldu ve daha once sistem tarafindan aldigim haklar aynen geri geldi ve sistem düzgün calisiyor. Herşey normale döndü, hemen yedek alınması lazım. Yedek alındı VT kapatıldı.
Açılırken
|
1 2 |
startup ORACLE instance started. |
|
1 |
Total System Global Area 369098752 bytes Fixed Size 2020896 bytes Variable Size 159386080 bytes Database Buffers 201326592 bytes Redo Buffers 6365184 bytes Database mounted. ORA-00314: log 3 of thread 1, expected sequence# doesn't match ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/orcl/redo03.log' |
Hatasini verip mount modda kaldi.
|
1 |
alter database open; |
|
1 |
ORA-03113: end-of-file on communication channel |
|
1 |
recover database until cancel |
|
1 |
Media recovery complete. |
|
1 |
alter database open resetlogs; |
Komutu ile VT açılır.
test 2
|
1 |
$rm -rf redo01.rdo komutu ile sildik |
alert.log doyasina
|
1 |
Shutting down archive processes Tue Jan 26 20:30:06 2010 ARCH shutting down ARC2: Archival stopped |
Loglarını yazdı. Mevcut sessionlarla yazma ve okuma işlemleri devam edebiliyor.
|
1 2 |
select * from v$log; komutu ile batigimizda hala group 1 current olarak goruyoruz. select * from v$log; |
|
1 2 3 4 5 6 7 |
truncating (as requested) before column FIRST_CHANGE# GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRS ---------- ---------- ---------- ---------- ---------- --- ---------------- ---- 1 1 8 52428800 1 NO CURRENT 26-J 2 1 7 52428800 1 YES ACTIVE 25-J 3 1 6 52428800 1 YES INACTIVE 25-J |
alert.log da
|
1 |
Errors in file /u01/app/oracle/admin/orcl/bdump/orcl_arc0_7628.trc: ORA-00313: open failed for members of log group 1 of thread 1 ORA-00312: online log 1 thread 1: '/u01/app/oracle/oradata/orcl/redo01.log' ORA-27037: unable to obtain file status Linux-x86_64 Error: 2: No such file or directory |
hatalarını vermeye başladı.
3. kez "alter system switch logfile" komutu verdiğimizde yani işlem goren grubu önce 2 ye sonra 3 ve en sonunda tekrar 1 almak istediğimizde.
alertlog asagidaki hataları vermeye başlıyor . "alter system switch logfile" komutunu kullandığımız sessionda curser işlem yaptırtmıyor.
|
1 |
Linux-x86_64 Error: 2: No such file or directory Additional information: 3 Tue Jan 26 20:42:12 2010 ARC1: Failed to archive thread 1 sequence 8 (0) |
|
1 |
alter database clear unarchived logfile group 1; |
Database altered.
alertog a düşen bilgiler.
|
1 |
Tue Jan 26 20:45:31 2010 Thread 1 advanced to log sequence 11 Current log# 1 seq# 11 mem# 0: /u01/app/oracle/oradata/orcl/redo01.log Tue Jan 26 20:45:31 2010 Completed: alter database clear unarchived logfile group 1 Tue Jan 26 20:45:31 2010 Archiver process freed from errors. No longer stopped |
|
1 |
alter system switch logfile; |
komutunda asili kalan oturumumuz da islem yapabilir hale geliyor. yazip cizmeye devam edebiliyoruz.
|
1 |
select * from v$log; |
|
1 2 3 4 5 6 7 |
truncating (as requested) before column FIRST_CHANGE# GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRS ---------- ---------- ---------- ---------- ---------- --- ---------------- ---- 1 1 11 52428800 1 NO CURRENT 26-J 2 1 10 52428800 1 YES ACTIVE 26-J 3 1 9 52428800 1 YES INACTIVE 26-J |
işletim sistemteminden baktigmizda redo01.rdo yu yani grup 1 yeniden olusturmus. Gene de güvenmiyoruz kapatalım açalım bakalim ne olacak.
|
1 2 |
shutdown immediate SQL> startup |
|
1 2 3 |
ORACLE instance started. Total System Global Area 369098752 bytes Fixed Size 2020896 bytes Variable Size 121637344 bytes Database Buffers 239075328 bytes Redo Buffers 6365184 bytes Database mounted. ORA-00314: log 1 of thread 1, expected sequence# doesn't match ORA-00312: online log 1 thread 1: '/u01/app/oracle/oradata/orcl/redo01.log |
|
1 |
recover database until cancel alter database open resetlogs; |
Komutulari VT’yi tekrar açabiliyoruz. Tekrar kapatıp acıyorum, sorun yok.
********************************************************************************
|
1 2 |
column member format a50 select f.member,l.bytes/1024/1024 as "Size in MB" from v$log l,v$logfile f where l.group#=f.group#; |
|
1 2 |
column MEMBERS format 99 select STATUS, group#, THREAD#, members, bytes/1024/1024 MB, ARCHIVED, SEQUENCE# from v$log; |
|
1 2 |
column member format a50 select group#, member from v$logfile; |
|
1 2 |
SELECT group#, dbid, thread#, sequence#, status FROM v$standby_log; |
|
1 2 3 4 |
SELECT GROUP#, BYTES, 'ONLINE' AS TYPE FROM V$LOG UNION SELECT GROUP#, BYTES, 'STANDBY' AS TYPE FROM V$STANDBY_LOG ORDER BY 1; |
|
1 2 3 4 5 6 7 8 9 10 |
set linesize 1200 column group# format 99 column THREAD# format 99 column sequence# format 999 column bytes/1024/1024 format 9999 column group format 99 column USED format 99999999999 column ARCHIVED format a5 column STATUS format a10 select group#, THREAD#, sequence#, bytes/1024/1024 MB, USED, ARCHIVED, STATUS from v$standby_log ; |
File System’de RedoLog ekleme
Group Ekleme
|
1 2 |
alter database add logfile group 4 ('/export/home/oracle/oradata/suntest/redo04a.log','/export/home/oracle/oradata/suntest/redo04b.log') size 50M |
Member Ekleme
|
1 2 3 |
alter database add logfile member '/oracle/oradata/suntest/redo01b.log' to group 1 alter database add logfile member '/oracle/oradata/suntest/redo02b.log' to group 1 alter database add logfile member '/oracle/oradata/suntest/redo03b.log' to group 1 |
File System’de StandBYLog ekleme
|
1 2 |
ALTER DATABASE ADD STANDBY LOGFILE ('/u02/app/oracle/oradata/FSM/stdby_log01_1.log') SIZE 100M ; ALTER DATABASE ADD STANDBY LOGFILE ('/u02/app/oracle/oradata/FSM/stdby_log02_1.log') SIZE 100M ; |
ASM’de RedoLog ekleme
|
1 |
ALTER DATABASE ADD LOGFILE THREAD 1 GROUP 11 ( '+DATA') SIZE 100M; |
|
1 |
show parameter db_create_online_log_dest_ |
|
1 2 3 |
alter system set db_create_online_log_dest_1 = '+DATA' scope=both sid='*' alter system set db_create_online_log_dest_2 = '+FRA' scope=both sid='*' alter database add logfile ; |
Alternatif olarak
|
1 |
alter database add logfile group xxx; |
Bu yöntemle +FRA disk grubuna üye(member) eklecektir.
Standby Log Ekleme
|
1 2 3 4 5 6 7 8 9 |
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 5 SIZE 100M, GROUP 6 SIZE 100M, GROUP 7 SIZE 100M; ALTER DATABASE ADD STANDBY LOGFILE THREAD 2 GROUP 8 SIZE 100M, GROUP 9 SIZE 100M, GROUP 10 SIZE 100M; |
Drop (Deleting)
|
1 |
ALTER DISKGROUP FRA DROP FILE '+FRA/mx/onlinelog/redo01b-tmp.log'; |
|
1 |
ALTER DATABASE DROP LOGFILE GROUP 3; |
|
1 |
ALTER DATABASE DROP LOGFILE MEMBER '/oracle/dbs/log3c.rdo'; |
|
1 |
ALTER DATABASE CLEAR LOGFILE GROUP 3; |
|
1 |
ALTER SYSTEM CHECKPOINT GLOBAL; |
Arızalanmıs/okunmaz durumdaki redo log dosyası arşivlenmemişse,
|
1 |
ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 3; |
Alias silme
|
1 |
ALTER DISKGROUP data DROP ALIAS '+data/orcl/erp.dbf'; |
