Perşembe, Ekim 11, 2007

Eski UNIX sistemlerde 2GB'ın üzerinde oracle database exportu almak

Pek çok eski UNIX türevi dosya işlemlerinde(aslında genelinde) 32bit unsigned integer kullanmaktadır ve bunun sonucu olarakda en büyük dosya boyu 2gb ile sınırlı kalmaktadır.

Oracle Export /Import araçları işletim sisteminin orjinal sistem çağrılarıyla yazılmıştır. Bu, işletim sisteminiz izin vermediği sürece 2gb ın üzerinde export veya import yapamayacağınız anlamına gelir. Üzülmeyin, UNIX sistemlerde bununda üstesinden gelmenin yolları var ;)

Oracle 8i ve sonraki versiyonlarda export ve import komutlarına filesize isimli yeni bir parametre eklendi. Bu parametre sayesinde export dosyasının boyutunu belirliyebilmemize izin vermiştir. Burada önemli olan iki nokta var;
1-) export alırken dosya boyunu enfazla 2000m olarak vermeliyiz
exp system/manager file=big.dmp filesize=2000M full=y
2-) import işleminde, export işleminde belirtilen dosya boyu aynı şekilde kullanılmalı
imp system/manager file=big.dmpfilesize=2000M full=y

Oracle 8i den önceki versiyonlar için ise split komutu ve pipe işlemleri ile 2GB limitine takılmadan export işlemin devam etmesini sağlıyabiliriz.
örnek1:
# pipe işleminde kullanacağımız özel bir dosya oluşturalım
mknod pipe.dmp p

# split -b 2000m komutu kendisine parametre olarak verilen dosyayı okur ve her 2000mb
# de dosyayı xaa xab xac şeklinde isimlendirerek böler. Bu örnekte, exp komutu
# pipe.dmp dosyasına export ettikce split komutu onu okuyacak ve her 2000mb de sıralı
# şekilde yeni dosyalar üretecektir.
#not:
# çok eski bazı unix türevlerinde split komutu -b parametresi almaz. bunu yerine
# komuttan hemen sonra bölünmesini istediğiniz satır sayısını yazmanızı bekler.
# 2000mb lik bir export dosyasının kaç satır alabileceği tablo yapısına ve veri boyuna
# göre değişecektir. Yani size bunu için tam bir rakam söyleyemem ama 500000 başlngıç
# için iyi bir rakam olabilir ;)
split -b 2000m < pipe.dmp & exp system/manager file=pipe.dmp full=y

#export işlemi tamalandıktan sonra oluşturduğumu özel dosyamızı silelim
rm pipe.dmp

Bu işlem sonucunda oluşacak dosyaları yine 2GB sorunu olan bir unix makinada kullanacaksanız import işlemi için
# pipe işleminde kullanacağımız özel bir dosya oluşturalım
mknod pipe.dmp p

# export işleminden elde ettiğimiz SIRALI dosyaları sırasını bozmadan
# cat komutu ile özel dosyamıza yazdıralım ve bu dosyadanda import
# işlemini gerçekleştirelim
cat xaa xab xac > pipe.dmp & imp system/manager file=pipe.dmp full=y

# importişlemi tamalandıktan sonra oluşturduğumu özel dosyamızı silelim
rm pipe.dmp

yöntem2:
Bu yöntem ile oluşan export dosyası compress komutu ile sıkıştırılır ve böylelikle 2GB limitine ulaşmadan önce yaklaşık 10Gb a kadar export yapılabilir. Eğer export dosyanız gerçekten çok büyükse bu işlem sizin için kullanışlı olmayabilir.

mknod pipe.dmp p
compress < pipe.dmp > expdat.dmp.Z & exp system/manager file=pipe.dmp full=y
rmpipe.dmp


Oluşan bu dosyanın importu için;
mknodpipe.dmp p
uncompress expdat.dmp.Z > pipe.dmp & imp system/manager file=pipe.dmp full=y
rm pipe.dmp

keşke export / importun en üzücü yanı dosya boyu olsa değil mi :) neyse, en azından bunun için kafa patlatmayacaksınız artık. hepinize kolay gelsin ;)

Hiç yorum yok: