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...
26 Ağustos 2010
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...
23 Ağustos 2010
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:
Devamını Okuyunuz...SQL> ALTER PROFILE profil_adi LIMIT FAILED_LOGIN_ATTEMPTS UNLIMITED;
12 Ağustos 2010
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...2 Temmuz 2010
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...15 Haziran 2010
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...14 Mayıs 2010
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...10 Mayıs 2010
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:
Devamını Okuyunuz...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’)) );
6 Mayıs 2010
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...4 Mayıs 2010
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:
Devamını Okuyunuz...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 ;
1 Eylül 2010
1 Comment