Veritabanındaki tüm DDL işlemlerinin izlenmesi

24 Eki by Ahmet Duruöz

Veritabanındaki tüm DDL işlemlerinin izlenmesi

Veritabanındaki nesneler üzerinde yapılan yapısal değişiklikleri , veritabanı yada şema genelinde izlemek mümkündür. Bu sayede nesnelerdeki tüm yapısal değişiklikleri izleyip, bir sorun anında eski halini yeniden oluşturabiliriz.

İzleme , trigger’lar ile yapılmaktadır. İlgili trigger , bir ddl işlemi sonrasında , talep edilen bilgileri bir tabloya yazabilir. 

Aşağıdaki şekilde bir tablo ve trigger oluşturup, veritabanındaki tüm ddl işlemlerini takip edebiliriz.

Tablo oluşturulması : 

CREATE TABLE AUDIT_DDL
(
   D              DATE,
   OSUSER         VARCHAR2 (255),
   SESSION_USER   VARCHAR2 (255),
   HOST           VARCHAR2 (255),
   TERMINAL       VARCHAR2 (255),
   MODULE         VARCHAR2 (255),
   OWNER          VARCHAR2 (30),
   TYPE           VARCHAR2 (30),
   NAME           VARCHAR2 (30),
   SYSEVENT       VARCHAR2 (30),
   SQL_TEXT        VARCHAR2 (4000)
);

 

 

Trigger oluşturulması :

Aşağıdaki trigger tüm veritabanı seviyesindeki ddl işlemlerini takip edecektir. Eğer trigger’daki “on database” yerine “on schema” yazılırsa , sadece trigger’ı oluşturan kullanıcının ddl işlemlerini kayıt edecektir.

create or replace trigger audit_ddl_trg after ddl on database
declare
  sql_text ora_name_list_t;
  stmt VARCHAR2(4000) := '';
  n number;
begin
    n:=ora_sql_txt(sql_text);
    for i in 1..n
    loop
      stmt:=substr(stmt||sql_text(i),1,4000);
    end loop; 
    insert into audit_ddl(d, osuser,session_user,host,terminal,module,owner,type,name,sysevent,sql_txt)
    values(
      sysdate,
      sys_context('USERENV','OS_USER') ,
      sys_context('USERENV','SESSION_USER') ,
      sys_context('USERENV','HOST') , 
      sys_context('USERENV','TERMINAL') ,
      sys_context('USERENV','MODULE') ,
      ora_dict_obj_owner,
      ora_dict_obj_type,
      ora_dict_obj_name,
      ora_sysevent,
      stmt
    );
end;
/

Yukarıdaki işlemler ile 11g ve öncesindeki veritabanlarında ddl işlemlerinin izlenmesi mümkündür. 12c ile gelen yeni bir özellik ile bu işlemlere gerek olmadan da ddl işlemlerini izlemek mümkündür.

 12c ile birlikte ENABLE_DDL_LOGGING parametresi enable edilerek log ve xml dosyası olarak $ORACLE_BASE/diag/rdbms/DBNAME/SID/log/ddl dizini altında loglanabiliyor. Bu parametre 11g veritabanlarında da bulunmaktadır. 11g veritabanlarında true yapıldığında log.xml şeklindeki dosya yerine alert<SID>.log dosyasına sadece işlemin komutu yazılmaktadır. Detaylı bilgi bulunmamaktadır.

Aşağıdaki şekilde ENABLE_DDL_LOGGING  parametresinin değişimi yapılabilir.

SQL> show parameter ENABLE_DDL_LOGGING

NAME				     TYPE		VALUE
---------------------------------------------
enable_ddl_logging		 boolean	FALSE


SQL> alter system set enable_ddl_logging=TRUE scope=both sid='*';

System altered.

NAME				     TYPE		VALUE
---------------------------------------------
enable_ddl_logging		 boolean	TRUE

Parametre değişimi sonrasında ilk ddl işleminde $ORACLE_BASE/diag/rdbms/DBNAME/SID/log/ddl dizini altında log.xml şeklinde bir dosya oluşturulup bu dosyay tüm ddl işlemleri aşağıdaki gibi yazılmaktadır.

<msg time='2018-05-11T13:40:37.219+03:00' org_id='oracle' comp_id='rdbms'
 msg_id='opiexe:4695:2946163730' type='UNKNOWN' group='diag_adl'
 level='16' host_id='db01.local' host_addr='10.10.1.120'
 pid='326761' version='1'>
 <txt>create table a(ad varchar(100))
 </txt>
</msg>
<msg time='2018-05-11T13:55:40.162+03:00' org_id='oracle' comp_id='rdbms'
 msg_id='opiexe:4695:2946163730' type='UNKNOWN' group='diag_adl'
 level='16' host_id='db.local' host_addr='10.10.1.120'
 pid='393307'>
 <txt>alter table a add soyad varchar(100)
 </txt>
</msg>

 

Loading

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir