Tablo ve indexler üzerinde DDL işlemlerinin nasıl yapılacapı konsunda zaman
zaman yazılar yazıyoruz. Örneğin tablo ve indexlerin farklı bir tablespace
taşınması ile ilgili
(http://kamilturkyilmaz.blogspot.com/2010/10/tablo-ve-indexlerin-tasnmas_25.html) bir yazı yazmıştım.
Burada ise logsegment ve logindexleri anlatmaya çalışacağım.
Aslında burada bahsedilmesi gereken en önemli konu lobs ların taşınması
olduğunu düşünüyorum. Dolayısıyla naşıl taşıyabiliriz sorusuna cevap ararken
diğer yapılacak işlemlerinde sırasıyla üzerinden geçmeyi planlıyorum.
Öncelikle üzerinde çalışabileceğimiz lob alan içeren bir tablo create
edelim.
CREATE TABLE deneme_lob (
ad VARCHAR2(30),
soyad VARCHAR2(30),
resim1 BLOB,
resim2 BFILE,
resim3 clob);
Table created
Create edilen her lob alanı için otomatik olarak bir logsegmenti ile
lobindexi create edilir. Create etmiş olduğumuz tabloya ilişkin lob alanları
sorguladığımızda da bunları görebiliyor oluruz.
SELECT segment_name ,
segment_type ,
tablespace_name
tbs_name
FROM user_segments
WHERE segment_name like
'SYS_LOB%'
OR segment_name
like 'SYS_IL%'
SEGMENT_NAME
SEGMENT_TYPE TBS_NAME
SYS_IL0000051350C00005$$
LOBINDEX
TEST1
SYS_LOB0000051350C00005$$
LOBSEGMENT TEST1
SYS_IL0000051350C00003$$
LOBINDEX
TEST1
SYS_LOB0000051350C00003$$
LOBSEGMENT TEST1
Bu örneğimizde create edilen tablomuz test1 tablespace2 inde yer alıyor.
Şimdi tablo üzerinde oynamadan son durumda hangi nesnenin nerde saklandığını
tekrar kontrol edelim ;
SELECT owner,
segment_name seg_name,
segment_type
seg_type,
tablespace_name
tbs_name
FROM dba_segments
WHERE owner = 'KAMIL'
OWNER SEG_NAME
SEG_TYPE
TBS_NAME
KAMIL
DENEME_LOB
TABLE
TEST1
KAMIL
SYS_IL0000051350C00005$$
LOBINDEX
TEST1
KAMIL
SYS_LOB0000051350C00005$$
LOBSEGMENT TEST1
KAMIL
SYS_IL0000051350C00003$$
LOBINDEX
TEST1
KAMIL
SYS_LOB0000051350C00003$$
LOBSEGMENT TEST1
Tüm nesnelerimiz TEST1 tablesspace’ inde.
Tablomuza yeni bir lob alan ekleyelim;
alter table deneme_lob
add (resim4 blob)
ekledik, şimdi bir tane alan ekleyelim ancak bu farklı bir tablespace’ de
store ediliyor olsun ;
alter table deneme_lob
add (resim5
blob)
lob
(resim5) store as resim5_seg
(tablespace
test2)
Kontrol ediyorum ;
SELECT owner,
segment_name seg_name,
segment_type seg_type,
tablespace_name tbs_name
FROM
dba_segments
WHERE owner
= 'KAMIL'
OWNER SEG_NAME
SEG_TYPE
TBS_NAME
KAMIL
DENEME_LOB
TABLE
TEST1
KAMIL
SYS_IL0000051350C00005$$
LOBINDEX
TEST1
KAMIL
SYS_LOB0000051350C00005$$
LOBSEGMENT TEST1
KAMIL
SYS_IL0000051350C00003$$
LOBINDEX
TEST1
KAMIL
SYS_LOB0000051350C00003$$
LOBSEGMENT TEST1
KAMIL
SYS_IL0000051350C00006$$
LOBINDEX
TEST1
KAMIL
SYS_LOB0000051350C00006$$
LOBSEGMENT TEST1
KAMIL
SYS_IL0000051350C00007$$
LOBINDEX
TEST2
KAMIL
RESIM5_SEG
LOBSEGMENT
TEST2
Tamam yeni alanımız istediğimiz gibi test2 tablespace’ inde store edilecek
şekilde create edilmiş oldu.
Şimdi test1 tablespace' inde
yer resim1 alanına ait lob segmentlerini test3 tablespace' ine taşıyalım.
ALTER TABLE deneme_lob
MOVE
LOB(resim1) STORE AS (TABLESPACE test3)
Table altered.
SELECT owner,
segment_name seg_name,
segment_type seg_type,
tablespace_name tbs_name
FROM
dba_segments
WHERE owner
= 'KAMIL'
OWNER SEG_NAME
SEG_TYPE TBS_NAME
KAMIL
DENEME_LOB
TABLE
TEST1
KAMIL
SYS_IL0000051350C00005$$
LOBINDEX
TEST1
KAMIL
SYS_LOB0000051350C00005$$
LOBSEGMENT TEST1
KAMIL
SYS_IL0000051350C00003$$
LOBINDEX
TEST3
KAMIL
SYS_LOB0000051350C00003$$
LOBSEGMENT TEST3
KAMIL
SYS_IL0000051350C00006$$
LOBINDEX
TEST1
KAMIL
SYS_LOB0000051350C00006$$
LOBSEGMENT TEST1
KAMIL
SYS_IL0000051350C00007$$
LOBINDEX
TEST2
KAMIL
RESIM5_SEG
LOBSEGMENT TEST2
Evet, resim alanına ait tüm lob segmentler test3 tablespace’ ine taşınmış
oldu. Yukarıdaki örneklerde tablo’ nun tablespace’ ine dokunmadan sadece lob
alanlarının tablespace’ lerini değiştirmiştik. Şimdi resim4 alanı ile beraber
tablonun tablespace’ inide değiştirellim ;
ALTER TABLE deneme_lob
MOVE
TABLESPACE test4 LOB (resim4) STORE AS (TABLESPACE test4)
Kontrol edelim ;
SELECT owner,
segment_name seg_name,
segment_type seg_type,
tablespace_name tbs_name
FROM
dba_segments
WHERE owner
= 'KAMIL'
OWNER SEG_NAME
SEG_TYPE
TBS_NAME
KAMIL
DENEME_LOB
TABLE
TEST4
KAMIL
SYS_IL0000051350C00005$$
LOBINDEX
TEST1
KAMIL
SYS_LOB0000051350C00005$$
LOBSEGMENT TEST1
KAMIL
SYS_IL0000051350C00003$$
LOBINDEX
TEST3
KAMIL
SYS_LOB0000051350C00003$$
LOBSEGMENT TEST3
KAMIL
SYS_IL0000051350C00006$$
LOBINDEX
TEST4
KAMIL
SYS_LOB0000051350C00006$$
LOBSEGMENT TEST4
KAMIL
SYS_IL0000051350C00007$$
LOBINDEX
TEST2
KAMIL
RESIM5_SEG
LOBSEGMENT TEST2
Resim4 alanı ile birlikte tablonun tablespace’ inide değiştirmiş olduk.
Lobindexlerin nasıl rebuild edilebileceğinden bahsedelim, bilindik rebuild
index komutu ile lobindexleri rebuild etmek istediğimizde aşağıdaki gibi hata
alırız. Lobindexleri rebuild etmek istiyorsak (bulundukları tablespace’
e) move komutu
taşımak suretiyle rebuild etmiş oluruz.
Alter index
SYS_IL0000051350C00005$$ rebuild tablespace test1
Error at line 1
ORA-02327: LOB veri türündeki ifade için dizin
yaratılamaz
Hiç yorum yok:
Yorum Gönder