Berkant KARDUMAN

Teknoloji günlüğü

Dataguard Kurulumu

Dataguard

Oracle enterprise edition tarafından sağlanan replikasyon teknolojisi dataguard felaket durumlarında kurtarıcınız oluyor.
Bu yazıda redo apply senaryosu üzerinden dataguard yapılandırmasını anlatacağım.

Öncelikle test ortamında kullandığımız sunucuların bilgilerini vereyim.

Primary Server

IP Adresi

10.1.2.1

Hostname

Orcl1

Oracle Version

11.2.0.4

Oracle SID

orcl

İşletim Sistemi

Oracle Linux 7


Standby Server

IP Adresi

10.1.5.155

Hostname

Sby1

Oracle Version

11.2.0.4

Oracle SID

Sby1

İşletim Sistemi

Oracle Linux 7


Standby Server Hazırlanması

Bu bölümde anlatılan tüm işlemler sby1 isimli sunucuda yapılacaktır.
1- Oracle Kurulumu
Oracle kurulumu software only olacak şekilde yapılmalıdır. Oracle SID enverioment değişkenleri düzgün ayarlanmış olmalıdır.
2- Hosts ve tnsnames dosyalarının ayarlanması
/etc/hosts dosyasına sby1 ve orcl1 sunucularının iletişim bilgileri tanımlanmalıdır.
Ayrıca $ORACLE_HOME/network/admin klasörü altına tnsnames.ora dosyası oluşturularak içerisine hem sby1 için hemde orcl için kayıtlar girilmelidir. Daha sonrasında test için aşağıdaki komutları çalıştırın.

Ping orcl
tnsping orcl
3- Listener başlat
lsnrctl start
4- Pfile ayarlanması
Pfile.ora dosyasını aşağıdaki parametrelerle oluşturalım.
Db_name=orcl
Db_unique_name=sby1
Compatible=11.2.0.4.0
Db_file_name_convert='/orcl/','/sby1/'
db_recovery_file_dest_size=107374182400 #100GB fra için yer ayır
db_recovery_file_dest='/home/oracle/fra'#fra nın oluşturulacağı yer
5- İnstance startup
Startup nomount pfile=pfile.ora
6- Spfile ayarlanması
Create spfile from pfile=pfile.ora
Shu immediate
Startup nomount;
7- DGConfig
Alter system set dg_broker_Start=true;
8- NFS Yapılandırma
Kopyalama işlemleri için NFS tercih ettik. O yüzden NFS yapılandırması yapıyoruz. Öncelikle Yedeklerin alıcağı klasörü oluşturalım.
mkdir  /backup
chown oracle:oinstall /backup
/etc/exports dosyasına aşağıdaki ayarları girin.
/backup               *(rw,sync,no_wdelay,insecure_locks,no_root_squash)
Daha sonra nfs servisini yeniden başlatınız.
systemctl restart nfs

9- Oradata klasörünün oluşturulması

Standby tarafında veri dosyalarının ve fast recovery areanın tutulacağı klasörleri oluşturalım. Bu dizinler primary tarafındakine göre düzenlenebilir.

mkdir /oradata/sby1
mkdir /home/oracle/fra

Primary Server Hazırlanması

Bu bölümde anlatılanlar orcl1 sunucusnda yapılacaktır.
1- Hosts ,TnsNames dosyasında erişim bilgilerinin tanımlanması
/etc/hosts dosyasına sby1 ve orcl1 sunucularının iletişim bilgileri tanımlanmalıdır.
Ayrıca $ORACLE_HOME/network/admin klasörü altına tnsnames.ora dosyası düzenlenerek içerisine  sby1 için kayıtlar girilmelidir. Daha sonrasında test için aşağıdaki komutları çalıştırın.
ping sby1	
tnsping  sby1
2- SBY1 üzerindeki diskin mount edilmesi
/etc/fstab dosyası düzenlenerek aşağıdaki satırı ekleyin.
sby1:/backup /backup  nfs  rw,bg,hard,nointr,tcp,vers=3,timeo=300,rsize=32768,wsize=32768,actimeo=0  0 0
daha sonra 
mkdir /backup
mount /backup
3- Enable archivelog mode

Eğer zaten archive mode da değilse.

Shu immediate;
Startup mount;
Alter database archivelog;
Alter database open;
4- Force logging
Alter database force logging ;
5- Standbylog eklenmesi
Alter database add standby logfile size 50M;
6- DGConfig
Alter system set dg_broker_Start=true;
8- Oracle parametrelerini ayarla
Parametre değerlerini değiştirmeden önce show parameter komutu kullanılarak değerlerini kontrol ediniz. log_arch_dest_2 başka bir amaç için kullanılmış ise başka bir destination seçilebilir.
alter system set log_archive_config='dg_config=(orcl,sby1)';
alter system set log_archive_dest_2='SERVICE=sby1 async valid_for=(online_logfile,primary_role) db_unique_name=sby1';
9- Password dosyasını SBY1’e kopyala
scp $ORACLE_HOME/dbs/orapworcl sby1:/$ORACLE_HOME/dbs/orapwsby1
10- Backup database with archivelog
BACKUP incremental level 0 DEVICE TYPE DISK FORMAT '/backup/DbBck_%T_%U' DATABASE PLUS ARCHIVELOG;
BACKUP DEVICE TYPE DISK FORMAT '/backup/CtrlFile%U' CURRENT CONTROLFILE FOR STANDBY;  

Standby Database başlatılması

Bu işlemler sby1 sunucusunda yapılmalıdır.
1- Duplicate 

rman target sys@orcl auxiliary /
DUPLICATE TARGET DATABASE FOR STANDBY;

eğer duplicate srasında confict hatası alırsanız NOFILENAMECHECK ile duplicate yapmayı deneyebilirsiniz.

2- Standbylog eklenmesi
sqlplus->Alter database add standby logfile size 50m;
3- Start recovery
sqlplus->alter database recover managed standby database using current logfile disconnect;

Dataguard Broker Yapılandırma

Bu işlemler primary serverda yapılacaktır.
1- Create configuration
dgmgrl /
create configuration 'DGConfig1' as   primary database is 'orcl' connect identifier is 'orcl';
2- Add database
dgmgrl ->add database sby1 as connect identifier is sby1
3- Enable configuration
dgmgrl-> enable configuration;
4- ShowConfiguration
DGMGRL> show configuration ;
Configuration - dgconfig1
  Protection Mode: MaxPerformance
  Databases:
    orcl - Primary database
    sby1 - Physical standby database
Fast-Start Failover: DISABLED
Configuration Status:
SUCCESS
5- Show Database
DGMGRL> show database sby1 ;
Database - sby1
  Role:            PHYSICAL STANDBY
  Intended State:  APPLY-ON
  Transport Lag:   0 seconds
  Apply Lag:       14 hours 43 minutes 24 seconds
  Real Time Query: OFF
  Instance(s):
    sby1
Database Status:
SUCCESS

Hata izleme ve yönetim

1- Log dosyaları
2- DGBroker



Parametre Değeri(BIND Data)

Parametre Değerlinin Bulunması

Başka oturumlar tarafından çalıştırılmış sorgularla ilgili bilgileri almak için V$SQL,V$SQLAREA görünümleri kullanılıyor.

İncelemek istediğiniz sorguyu

select SQL_ID, SQL_TEXT,SQL_FULLTEXT,BIND_DATA from v$sql s
where
s.SQL_TEXT like '%BLA_TABLE%'

BIND_DATA kolonu bu sorgu çalıştırılırken kullanıcının girdiği parametrelerle ilgili bilgi içerir.

Burda bilmemiz gereken birşey var. Bu kolon bazı durumlarda veri içermez. Örneğin parametre tipi LOB ise parametre ile ilgili bilgiler buraya yansıtılmıyor.

Daha sonrasında BIND_DATA kolonundaki veriyi raw data olarak görebiliyoruz.

Bu data örneğin

BEDA0B20030058231BE30008FF40B40B090B78740B0910360D18BC65C0C0021603C2084440B40B090778740B0901010140B40B090B78740B09183C3C05E69EC0C00216033E6466C0021602C102C0021602C148F0602000270154

Şeklinde görünebiliyor.

Şifreyi çözmek için kafa yormamıza gerek yok.

BIND_DATA değerini okunur halde görmek için DBMS_SQLTUNE.EXTRACT_BINDS fonksyionunu kullanabiliriz.

İşte kullanımı

select * from table (DBMS_SQLTUNE.EXTRACT_BINDS(&bindData))


Bu sorgu bize tablo olarak değişken ile ilgili bilgileri veriyor.

En çok işimize yarayacak kolonlar

 name,position,datatype_string,value_string,max_length




Audit Mekanizması

İzlemenin Önemi

Veri tabanında ne olup bittiğini bilmek hakkınız. Ayrıca düzenli olarak izlenmesi gereken bir durum. Kim hangi kaydı güncelledi,neyi sildi,neyi ne zaman ekledi gibi sorular günlük hayatta çokça duymaya alışık olduğumuz sorular.
Bununla beraber kim hangi veriyi ne zaman görüntüledi sorusunu da sık sık duyarız. 

Oracle veri tabanı seviyesinde pek çok izleme mekanizması sunar. 

Trigger İle İzleme

Tablo seviyesinde hazırlanacak trigger sayesinde DML komutlarının izlenmesi sağlanabilir. before update,delete sırasında çalışacak olan trigger tespit edilen değşiklikleri izleme tablosuna yazabilir. 
Örnek trigger şu şekilde olabilir.

CREATE OR REPLACE TRIGGER TRG_SAMPLE$AUD
AFTER   UPDATE or DELETE ON SAMPLE_TABLE
FOR EACH ROW
begin
insert into AUD$SAMPE_TABLE(ID,NAME,EVENT_DATE,EVENT_USER)values(old.ID,old.NAME,sysdate,user);
end;

Elbette bu yapının bazı Database triggerları ve oturum takip mekanizmaları ile güçlendirilmesi gerekir.


Standart Audit

Oracle standart audit mekanizmasında sistem ve nesne seviyesinde izleme desteği sunar. Örneğin

AUDIT SESSION

kumutu ile tüm session ların izlenmesi sağlanır.

AUDIT DELETE ANY TABLE     BY ACCESS     WHENEVER NOT SUCCESSFUL;

komutu ile başarılı yada başarısız tüm delete istekleri için izleme kaydı oluşturulur.

Ayrıca nesne seviyesinde bu izlemeyi yapmak için 

AUDIT DELETE ON test.table_name; 

komutu kullanılabilir.


Fine Grained Auditing


Oracle ayrıca çok daha gelişmiş izleme mekanizmalarıda sunmaktadır. Bunlardan biride FGA yapısıdır.

Bu yapıda koşullu audit tanımlanabilmekte ve izleme için esnek bir yapı sağlanmaktadır.

FGA audit işlemleri için DBMS_FGA paketi kullanılır.

Bu paket içerisinde 

  • add_policy
  • drop_policy
  • enable_policy
  • disable_policy
komutları ile izleme politikaları yönetilir.

Örnek olarak aşağıdaki kod Maas tablosunda BolumKodu=2 olan kayıtlara yapılan erişimi izlemeye yarayacaktır.

DBMS_FGA.ADD_POLICY (
   object_schema      =>  'IK', 
   object_name        =>  'MAAS', 
   policy_name        =>  'MAAS_BOLUM_fga', 
   audit_condition    =>  'BolumKodu=2 ', 
   audit_column       =>  'Id,NetMaas', 
   handler_schema     =>   NULL, 
   handler_module     =>   NULL, 
   enable             =>   TRUE, 
   statement_types    =>  'SELECT', 
   audit_trail        =>   DBMS_FGA.XML + DBMS_FGA.EXTENDED, 
   audit_column_opts  =>   DBMS_FGA.ANY_COLUMNS); 
   
   end;
   

Burada audit_trail parametresi önemlidir.
  • XML
audit_Trail değeri XML olduğu için izleme dosyaları işletim sistemi seviyesinde audit_dump klasörüne kaydedilecektir. ve sonuçlar V$XML_AUDIT_TRAIL görünümünden izlenir.
  • DB

Eğer parametre değerini DB olarak yarlarsak veri tabanı seviyesinde FGA_LOG$ sistem tablosuna kaydedilir.ve DBA_FGA_AUDIT_TRAIL görünümden sonuçlar izlenir.


Extended değerini sayesinde izleme kayıtlarına SQL komutu ve Bind değişlenlerinin değerleride eklenecektir.


İzleme kayıtlarını silmek için Audit_Trail=DB olarak tanımlanmışsa  FGA_LOG$ tablosu truncate edilebilir.

ORA-02020:Çok Sayıda Veritabanı Bağlantısı Kullanımda

DB Link 

Mevcut oracle sunucusundan başka oracle sunucularına bağlanıp sorgu yazabilmek için oracle'ın sunduğu müthiş bir çözüm.

İster iş zekası uygulamalarında kullanın ister OLTP uygulamalarında çok faydasınını görürsünüz.

Uygulamada çok fazla kullanmaya başladığınızda ise ORA-02020 hatasını görmüş olabilirsiniz.

bu hatanın çözümü için open_links başlangıç parametresinin değerini artırmak yeterlidir. Bu parameter her bir session için açık tutulabilecek maksimum db_link sayısını gösterir. varsayılan değeri ise 4 tür.

Değişiklik yapmak için 
alter system set open_links=8 scope=spfile
komutu kullanılabilir. Burada 8 olarak verdiğimi sayıyı kendi durumunuza göre güncelleyebilirsiniz.
Tabikide bu değişiklikten sonra instance yeniden başlatılması gerekiyor.

Açık olan oturumda db_link kapatmak için

ALTER SESSION CLOSE DATABASE LINK linkname;
kullanılabilir.

V$DBLINK isimli sistem görünümü oturum tarafından kullanılmakta olan db_link listesini gösterir.

select* from V$DBLINK


Değişen Tabloları Bulmak

İşlem yapılan tabloları bulmak


Oracle ALL_TAB_MODIFICATIONS isminde bir system görünümü ile DML işlemi yapılan tablolar hakkında bilgi sunuyor.
Bu görünüm sorgulandığında insert,update,delete işlemlerinin kümülatif sayılarını alabiliyorsunuz.

Elbetteki performans nedenleri nedeni ile anlık güncellenmiyor.

Güncelleme istediğiniz zaman
DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO();

çalıştırmak yeterli.

SqlPlus ile Tablo Kopyalama

Tablo Kopyalama


Bazen bir veri tabanınından başka bir veri tabanına veri kopyalamamız gerekir. Ellbette export-import da bir seçenek olabilir. hatta network_link parametresi ile işler dahada koaly olabilir. 

Ancak sqlplus içerisinde desteklenen bir method data var. ismi copy


hakkında bilgi almak için help komutunu kullanabilirsiniz.

SQL> help copy
 COPY
 ----
 Copies data from a query to a table in the same or another
 database. COPY supports CHAR, DATE, LONG, NUMBER and VARCHAR2.
 COPY {FROM database | TO database | FROM database TO database}
            {APPEND|CREATE|INSERT|REPLACE} destination_table
            [(column, column, column, ...)] USING query
 where database has the following syntax:
     username[/password]@connect_identifier

örnek olarak aşağıdaki komutu kullanabiliriz.
copy from scott@live create scott.emp_20151201 using select * from scott.emp;
daha fazla bilgi için bu dökümana bakabilrsiniz. Recreating Database Objects (Doc ID 30910.1)

DNS Ayarları

Bağlantı Sorunları ve DNS

Oracle client bağlanıları sırasında isim çözümleme işlemi yapıyor. GetHostAddr isimli bir fonksiyon tarafından gerçekleştirilen bu işlem DNS sunucusundan cevap alamadığı durumlarda bağlantı hızını oldukça düşürüyor.

DNS sunucusunun geçici olarak kapandığı durumlarda bağlantı hızı ile ilgili sorun yaşamamak adına şunları yapabilriz

1- TimeOutbelirlememek
linux sistemlerde DNS ile ilgili ayarlar /etc/resolv.conf içinde tutuluyor. Bu dosya aşağıdaki gibi olursa timeout süresinide belirtmiş oluruz.


search sirket.com
nameserver 192.168.1.99
nameserver 192.168.1.100
options timeout:1
options attempts:1
Timeout ve attempts değerlerine dikkat edin.

2- DNS Cache kullanmak

Linux işletim sistemlerinde DNS cache ile görevli nscd isimli bir servis var. Bu servis default olarak pasif geliyor. 
service nscd status
service nscd start 
ayarlarını /etc/nscd.conf dosyasından inceleyebilirsiniz. Ayrıca otomatik başlangıca almayı unutmayın.


LOB Alanlarda ORA-01555

LOB Bozulması

Export Sırasında Aşağıdaki hatayı gördük.


ORA-31693: "USER"."TABLE1" tablo veri nesnesi, yükleme/yüklemeyi kaldırma sırasında başarısız oldu ve hata nedeni ile atlanıyor.
ORA-02354: veriler içe/dışa aktarılırken hata oluştu
ORA-01555: kesit alma çok eski: 6 numaralı geri alma segmenti (adı "_SYSSMU6_2443381498$") çok küçük

Göründüğü gibi hata mesajı çok açıklayıcı :) Durum BLOB içeren tablodaki bazı verilerin bozulmasından kaynaklanıyor. Çözüm ise tek tek tüm kayıtları dolaşıp hatalı olanları tespit etmek. Bu script o iş için verilmiş.
drop table bad_rows;
create table bad_rows (row_id ROWID
                      ,oracle_error_code number);

set concat off
set serveroutput on
declare
  n number;
  error_code number;
  bad_rows number := 0;
  ora600 EXCEPTION;
  PRAGMA EXCEPTION_INIT(ora600, -600);
begin
   for cursor_lob in (select rowid rid, &&lob_column from
&&table_owner.&table_with_lob) loop
   begin
     n:=dbms_lob.instr(cursor_lob.&&lob_column,hextoraw('889911')) ;
   exception
    when ora600 then
     bad_rows := bad_rows + 1;
     insert into bad_rows values(cursor_lob.rid,600);
     commit;
    when others then
     error_code:=SQLCODE;
     bad_rows := bad_rows + 1;
     insert into bad_rows values(cursor_lob.rid,error_code);
     commit;  
   end;
  end loop;
  dbms_output.put_line('Total Rows identified with errors in LOB column:'||bad_rows);
end;
Burda BAD_ROWS isminde bir tablo oluşturuluyor ve tarama sonuçları bu tabloya yazılıyor. İşlem tablonun boyutuna göre biraz uzun sürebilir ancak bittiğinde elinizde bozulmuş olan tüm LOB lar için ROWID değerleri oluyor. Artık istenirse değerler NULL yapılabilir veya satır tamamı ile silinebilir.
-- silmeden önce kontrol etseniz iyi olur
delete from USER.TABLE1 t where exists (select * from bad_rows br where br.row_id=t.rowid)

Daha detaylı bilgi için Doc ID 846079.1 MOS dökümanına bakabilirsiniz.

Audit Trail

Oracle audit loglarını ayarlamak için audit_trail parameteresini ayarlamak gerekiyor.


audit_trail parametresi OS veya DB değerleri alabiliyor.


Audit_trail=DB olarak ayarladığınızda logları okumak için dba_audit_trail isimli view kullanılıyor.


Örneğin iki tarih arasında hatalı şifre denemesi yapan istemcileri tespit etmek için aşağıdaki sorguyu kullanabiliyoruz.



select username,timestamp,userhost  from dba_audit_trail t
where
returncode=1017 and
T.TIMESTAMP between '30.12.2014' and '31.12.2014'  
Burada return code kullanıcının aldığını hata kodunun numarası oluyor. Bu view hakkında daha fazla bilgi için oracle dökümanlarına bakabilirsiniz.