Arşiv | Oracle RSS feed for this section

Ubuntu, Oracle XE ve SQL Developer

1 Eylül 2010

1 Comment

Ubuntu üzerine Oracle XE kurup onda çalışma yaptığımı daha önce yazmıştım. Karşılaştığım bir iki sorunla ilgili olarak bulduğum çözümleri paylaşmak istedim.

Oracle XE yüklenince, XWindows ana paneline gerekli menüleri ekliyor, ama “Start Database” dediğinizde veritabanı açılmasına rağmen listener açılmıyordu. Terminal penceresi açıp listener’ı manuel olarak başlatmaya çalışınca hatayı gördüm:

Listener programı listener.log dosyasına yazamıyordu. Dosyanın yetkilerini kontrol edince sadece oracle kullanıcısının yazma yetkisi olduğunu gördüm. Kendi kullanıcımı hali hazırda DBA grubuna atamış olduğumdan, root oldum ve dba grubuna yazma yetkisi verdim:

# chmod g+w /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/network/log/listener.log

Devamını Okuyunuz...

Oracle 8i ve ORA-00257: archiver error

26 Ağustos 2010

0 Comments

Legacy sunucularımızdan birinin bağlantı yapılmak istendiğinde ORA-00257 hatası verdiğini fark ettim. Üzerinde Oracle 8i koşan sunucunun disklerinde yeterince boş alan olmasına rağmen archiever çalışmıyordu. Oracle 8i’de, db_recovery_file_dest_size parametresi de yok, bu tip bir sınırlama olmadığı halde ve diskler boşken bu hatanın alınmaması gerekirdi. Alert logları inceleyince şu hatayı gördüm:

ARC0: Beginning to archive log# 2 seq# 85055
ARC0: Failed to archive log# 2 seq# 85055
Wed Aug 25 10:43:21 2010
Wed Aug 25 10:43:10 2010
ARC0: Beginning to archive log# 1 seq# 85051
ARC0: Archiving not possible: No primary destinations
ARC0: Failed to archive log# 1 seq# 85051

Devamını Okuyunuz...

Veritabanı hesabını kim kilitliyor?

23 Ağustos 2010

1 Comment

Ceviz.net Veritabanı ve SQL bölümünde sorulan bir soru:

Arada bir oracle de hatalı girişten oracle hesabı kilitlenmesi yaşıyorum hatalı girişi yapan makınanın ip adresini bulmam gerekiyor bu bilgiye nasıl ulasabilirim?

Oracle kullanıcısının şifresi değiştirildiğinde sıklıkla karşılaşılan durumlardan biri. Muhtemelen eski kullanıcı şifresi ile veritabanına bağlanmaya çalışan bir istemci var ve bu yanlış şifre denemeleri hesabın kilitlenmesine yol açıyor. Hesabın kilitlenmesini önlemek için kullanıcının ait olduğu profile ait FAILED_LOGIN_ATTEMPTS parametresini UNLIMITED olarak değiştirebilirsiniz:

SQL> ALTER PROFILE profil_adi LIMIT FAILED_LOGIN_ATTEMPTS UNLIMITED;

Devamını Okuyunuz...

Data Guard için TCP Socket Buffer Boyutunun Hesaplanması

12 Ağustos 2010

2 Comments

Alejandro Vargas’în blogunda yayınlanan bir yazı dikkatimi çekti. Fiziksel Data Guardlarda optimum TCP scoket buffer boyutunu hesaplamak için çok basit bir formül vermiş.

Optimum socket buffer boyutu = (Bant genişliği * round trip time (rtt) * 3)

Bant genişliği: Primary ile secondary sunucular arasındaki iletişimi sağlayan network bağlantısının hızı.

Round Trip Time: İki sunucu arasında paketlerin gidip gelme (ping) süresi

Bu değeri set etmemiz, sunucular arasında archivelogların transferlerinin daha sağlıklı ve hızlı gerçekleşmesini sağlayacak. Formülün mantığını aslında basit. Bant genişliği ile paketin ulaşın süresini çarparak  gerçek gönderim hızımızı buluyor ve bunu sabit bir katsayı ile (3) çarpıyoruz. Alejandro Vargas, neden 3 kullanıldığını açıklamamış. Aslında genelde network otoriteleri, tcp socket bufferını hesaplarken bu katsayının 2 olarak alınmasını öneriyor ama biz Vargas’ın Oracle konusundaki deneyimlerine güvenerek 3 alacağız.

Formülü örnek bir senaryoda kullanalım:

Devamını Okuyunuz...

Problem : ORA-119, ORA-132, ORA-1078

2 Temmuz 2010

0 Comments

Bu gün, production sunucularımızdan birinde veritabanı yaratırken ORA-119, ORA-132 ve ORA-1078 hatalarını aldım. Listener’ın hali hazırda ayakta olduğunu bildiğimden “ignore” ile devam etmeye çalıştıysam da veritabanı oluşturulamadı ve DBCA ekranına geri döndüm. Bu tip hataları “tekrar deneme” yöntemiyle çözmeye çalışmak Oracle ile uğraşıyorsanız %99 ihtimalle işe yaramaz. %1 ihtimalle çalışsa bile, “şans eseri” elde edilen başarılar uğraştığınız yazılımın görevi ve önemi yüzünden içinize hiç sinmez. Bu yüzden deneme yanılma yerine, her zaman için net olarak sorunu tespit etmek ve çözümünü bulmak gerekir. Tahmin edeceğiniz üzere, deneme yanılma yönteminin işe yaramayacağını çok iyi bilmeme rağmen iç güdüsel olarak aynı şeyi 2 kez denedim. Yaklaşık 5 dakikalık bir zaman kaybından sonra, deneme yanılmalarla daha fazla vakit kaybetmeden, google ve metalink’de araştırma yaptım ve Metalink sayesinde çözüme ulaştım.

Devamını Okuyunuz...

Oracle 11g ve DDL_LOCK_TIMEOUT

15 Haziran 2010

0 Comments

Oracle 11g’nin getirdiği bir çok yenilik var ve zaman buldukça onlar üzerine yazmaya çalışıyorım. Bir tablonun yapısında değişiklik yapmak, örneğin yeni kolon eklemek veya kaldırmak için, DDL komutları çalıştırdığınızda Oracle tabloya exclusive lock koymaya çalışır. Eğer tablo üzerinde o an işlem yapılıyorsa, kaynağın meşgul olduğunu bildiren ”ORA-00054: resource busy” hatası alırız. Özellikle sıkça kayıt yapılan, erişilen tablolarda bu tip DDL komutlarını, LOCK veya DMS_LOCK ile tabloya exclusive lock koymadan çalıştırmak gerçekten zor bir olay olabilir.

Oracle 11g’de bunun için bir kolaylık gelmiş. Instance bazında veya kendi oturumunuzda belirleyebileceğiniz DDL_LOCK_TIMEOUT adlı parametre sayesinde, DDL komutlarının, exclusive lock koyabilmek için kaç saniye boyunca bekleyeceğini belirtebiliyorsunuz. Böylece siz tablo üzerinde değişiklik yapmak istediğinizde, tablonuz erişiliyorsa DDL komutunuz o değişiklik bitmesini bekliyor. Verdiğiniz süre boyunca lock koyup tabloyu kilitleyemezse o zaman “ORA-00054: resource busy” hatasını alıyoruz.

Devamını Okuyunuz...

Oracle 11g ve Virtual Kolonlar

14 Mayıs 2010

0 Comments

Oracle 11g ile gelen yeniliklerden biri sanal kolonlar. Sanal kolonlar programcıların, kolonlar üzerinde sürekli yaptıkları işlemleri tablo tanımında saklayarak işlerini kolaylaştıran bir özellik. Sanal kolonlar, gerçek kolonlar gibi yer kaplamıyorlar. Bu sanal kolonlarda INSERT, UPDATE işlemlerini yapamıyorsunuz, zaten bu kolonları güncellemeye gerek yok, sanal kolonun formülünde yer alan kolonlar üzerinde işlem yaptığınızda sanal kolonun değeri otomatik olarak güncel değeri yansıtıyor.

Sanal kolonları tanımlarken kolonun veritipi yerine AS () kalıbı içinde kolonu hesaplamak için gereken formülü veriyorsunuz. Olayı örnek bir tablo üzerinde inceleyelim:

CREATE TABLE urunler (ID NUMBER, isim VARCHAR2(40), fiyat NUMBER, kdvlifiyat AS (fiyat*1.18));

Çok basit bir ürün tablosu oluşturup, ürünlerin KDV’li fiyatlarını hesaplamak için kdvlifiyat adında sanal bir kolon tanımladım. Bu tabloya örnek iki kayıt girip SELECT ile verileri çekiyorum:

Devamını Okuyunuz...

Oracle 11g ve Interval Partitioning

10 Mayıs 2010

2 Comments

Subpartition templates gibi interval partitioning de Partition oluşturma işini kolaylaştıran özelliklerden biri. Oracle 11g ile gelen interval partitioning, sıklıkla kullandığımız RANGE partitionların verilen zaman aralığı parametresine göre otomatik olarak oluşturulmasını sağlıyor. Tarih aralıklarına göre partitionlanmış örnek bir tablo oluşturalım:

CREATE TABLE pdeneme ( deneme_id NUMBER, tarih DATE, olay VARCHAR2(100)) PARTITION BY RANGE (tarih) (
PARTITION pdeneme_062010 VALUES LESS THAN (TO_DATE(’01-06-2010′, ‘DD-MM-YYYY’)),
PARTITION pdeneme_072010 VALUES LESS THAN (TO_DATE(’01-07-2010′, ‘DD-MM-YYYY’)),
PARTITION pdeneme_082010 VALUES LESS THAN (TO_DATE(’01-08-2010′, ‘DD-MM-YYYY’)),
PARTITION pdeneme_092010 VALUES LESS THAN (TO_DATE(’01-09-2010′, ‘DD-MM-YYYY’)),
PARTITION pdeneme_102010 VALUES LESS THAN (TO_DATE(’01-10-2010′, ‘DD-MM-YYYY’)),
PARTITION pdeneme_112010 VALUES LESS THAN (TO_DATE(’01-11-2010′, ‘DD-MM-YYYY’))   );

Devamını Okuyunuz...

Ubuntu’ya Oracle XE ve APEX Yüklemek

6 Mayıs 2010

2 Comments

Her ne kadar kurumsal yazılımlar açısından Redhat Linux tabanlı dağıtımlar ideal olsa da ben notebookumda Ubuntu kullanıyorum. Test ortamı oluşturmak için Oracle veritabanı kurmam gerektiğinde, Ubuntu üzerine Oracle kurmak yerine (ki resmi olarak desteklenmese de kurulabilir) virtualbox ile oluşturduğum sanal makinaya Oracle Enterprise Linux yükleyip, Oracle veritabanını bu sanal makinada kuruyorum. Böylece production sistemlere benzer bir ortamda çalışma imkanım oluyor. Buna karşın özellikle APEX ile uğraşırken, rahatlıkla erişebileceğim ve az kaynak kullanacak bir geliştirme platformuna ihtiyacı duyduğumdan Ubuntu’ya Oracle XE (Express Edition) kurup üzerine APEX kurmayı terchih ediyorum.

Bilmeyenler için açıklamak da fayda var: Oracle XE, standart sürüm özelliklerine sahip ama 1 CPU, 1G RAM ve 4G storage sınırlaması olan ücretsiz veritabanı sürümüdür. Oracle XE, APEX ile uygulama geliştirmek için kolay kurulan ve yönetilebilen bir platform sağlıyor. Oracle XE’nin güzel yanlarından biri kurulum için Debian paketlerine sahip olması. Bu paketleri kullanarak Ubuntu’ya Oracle XE kurulumunu çok rahatlıkla yapabiliyoruz.

Devamını Okuyunuz...

Oracle’da UPDATE JOIN

4 Mayıs 2010

0 Comments

Uygulamalarımızdan birini MS SQL Server’dan Oracle’a geçiriyoruz. Uygulama için hazırlanmış DTS (data transformation services) sorgularının Oracle’a aktarılması için bana danışılınca sorguları inceledim ve daha önce görmediğim UPDATE JOIN sorguları ile karşılaştım.

UPDATE tablo_adi
SET kolon_adi = deger
FROM lookup_tablo_adi JOIN join_koşulu
WHERE kısıt

Görüldüğü üzere iki tablo birleştirilmiş ve tek tabloymuş gibi işlem yapılmış. Oracle’da böyle bir yazıma rastlamamıştım ama ne olur ne olmaz diye Oracle dökümanlarından kontrol ettim. Bu şekilde bir yazımın olmadığını teyit ettikten sonra, biraz internette araştırma yaptım. Genelde bu tip sorguların subquery kullanılarak yapılmasını tavsiye eden siteler var. Şimdi bu sorgunun subquery ile nasıl yazılabileceğini görmek için iki tablo oluşturup testlere başlayalım:

SQL> CREATE TABLE emp ( ID NUMBER, NAME VARCHAR2(100), sal NUMBER, dep_id NUMBER );
SQL> CREATE TABLE dep ( ID NUMBER, NAME VARCHAR2(50 ) );
SQL> INSERT INTO emp VALUES (1, ‘GÖKHAN’, 10000, 1);
SQL> INSERT INTO emp VALUES (2, ‘OSMAN’, 10000, 1);
SQL> INSERT INTO emp VALUES (3, ‘HAKAN’, 10000, 1);
SQL> INSERT INTO emp VALUES (4, ‘ACAR’, 5000, 2);
SQL> INSERT INTO emp VALUES (5, ‘CEMİL’, 5000, 2);
SQL> INSERT INTO dep VALUES (1, ‘IT’);
SQL> INSERT INTO dep VALUES (2, ‘SALES’);
SQL> COMMIT ;

Devamını Okuyunuz...
Sayfa 1 : Toplam 7123...Son Sayfa »