25 Şubat 2011 Cuma

LOBINDEX ve LOBSEGMENT’ lerin create, move, rebuild edilmesi


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


Kamil TÜRKYILMAZ 

23 Şubat 2011 Çarşamba

Automatic Workload Repository (AWR) Raporlarının Compare Edilmesi


Bundan önceki yazımda AWR’ ın kullanımı ile giriş yaparak, AWR aracılığı ile snaphotları nasıl create, drop ederizden bahsettik. Şimdi alınan bu snaphotlara ait raporları nasıl compare ederiz buna bakacağız. Özetle şunu yapmaya çalışıyoruz aslında database’ de yaşanan bir performans probleminin ne boyutta olduğuna veya aynı dönemi kapsayan başka bir aralığa göre problemin neden kaynaklandığını, yoğunluk olarak hangi alanlarda artış olduğunu görebilmek ve içinde bulunduğumuz durumu daha iyi yorumlayabilmek için karşılaştırma yapabiliriz.

Şöyle bir problem olduğunu varsayalım. Her gün saat 09:00 ile 11:00 arasında database’ imizin performansı stabil iken, gün içerisinde bu saatler aralığında performansın ciddi bir şekilde düştüğünü varsayalım. Buradaki sorunu tespit içinde dün ile bugün aynı saatler aralığını gösteren AWR raporlarını compare etmeye çalışalım. (bu işlemi konsol üzerinden grafik ekranda çok rahatlıkla yapabilirsiniz ancak biz ortada bir problem var iken konsolun çalışmama riskini gözönünde bulundurarak komut satırından yapmaya çalışacağız)

Bu işlemler için dba yetkisi gerektiğini tekrar hatırlatalım.

Komut satırından  scriptimizin yer aldığı awrddrpt.sql dosyasını çalıştırıyoruz.

@$ORACLE_HOME/rdbms/admin/awrddrpt.sql

Sonrasında yapılan işlemlerle ilgili loglarıda ekliyorum ;

SQL> @$ORACLE_HOME/rdbms/admin/awrddrpt.sql

Current Instance
~~~~~~~~~~~~~~~~
   DB Id       DB Id    DB Name      Inst Num Inst Num Instance
----------- ----------- ------------ -------- -------- ------------
 2656835042  2656835042 TEST                 1        TEST

Specify the Report Type
~~~~~~~~~~~~~~~~~~~~~~~
Would you like an HTML report, or a plain text report?
Enter 'html' for an HTML report, or 'text' for plain text
Defaults to 'html'
Enter value for report_type: text

Type Specified:  text

Instances in this Workload Repository schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   DB Id     Inst Num DB Name      Instance     Host
------------ -------- ------------ ------------ ------------
* 2656835042        TEST          TEST          tester

Database Id and Instance Number for the First Pair of Snapshots
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Using 2656835042 for Database Id for the first pair of snapshots
Using          1 for Instance Number for the first pair of snapshots

Specify the number of days of snapshots to choose from
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Entering the number of days (n) will result in the most recent
(n) days of snapshots being listed.  Pressing without
specifying a number lists all completed snapshots.

Enter value for num_days: 2

Listing the last 2 days of Completed Snapshots
                                                    Snap
Instance     DB Name        Snap Id    Snap Started    Level
------------ ------------ --------- ------------------ -----
TEST      TEST     6480 22 Feb 2011 00:00      1
                               6481 22 Feb 2011 01:00      1
                               6482 22 Feb 2011 02:00      1
                               6483 22 Feb 2011 03:00      1
                               6484 22 Feb 2011 04:00      1
                               6485 22 Feb 2011 05:00      1
                               6486 22 Feb 2011 06:00      1
                               6487 22 Feb 2011 07:00      1
                               6488 22 Feb 2011 08:00      1
                               6489 22 Feb 2011 09:00      1
                               6490 22 Feb 2011 10:00      1
                               6491 22 Feb 2011 11:00      1
                               6492 22 Feb 2011 12:00      1
                               6493 22 Feb 2011 12:48      1
                               6494 22 Feb 2011 12:48      2
                               6496 22 Feb 2011 14:00      1
                               6497 22 Feb 2011 15:00      1
                               6498 22 Feb 2011 16:00      1
                               6499 22 Feb 2011 17:00      1
                               6500 22 Feb 2011 18:00      1
                               6501 22 Feb 2011 19:00      1
                               6502 22 Feb 2011 20:00      1
                               6503 22 Feb 2011 21:00      1
                               6504 22 Feb 2011 22:00      1
                               6505 22 Feb 2011 23:00      1
                               6506 23 Feb 2011 00:00      1
                               6507 23 Feb 2011 01:00      1
                               6508 23 Feb 2011 02:00      1
                               6509 23 Feb 2011 03:00      1
                               6510 23 Feb 2011 04:00      1
                               6511 23 Feb 2011 05:00      1
                               6512 23 Feb 2011 06:00      1
                               6513 23 Feb 2011 07:00      1
                               6514 23 Feb 2011 08:00      1
                               6515 23 Feb 2011 09:00      1
                               6516 23 Feb 2011 10:00      1
                               6517 23 Feb 2011 11:00      1
                               6518 23 Feb 2011 12:00      1
                               6519 23 Feb 2011 13:00      1
                               6520 23 Feb 2011 14:00      1
                               6521 23 Feb 2011 15:00      1
                               6522 23 Feb 2011 16:00      1

Specify the First Pair of Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for begin_snap: 6489
First Begin Snapshot Id specified: 6489

Enter value for end_snap: 6491
First End   Snapshot Id specified: 6491

Instances in this Workload Repository schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   DB Id     Inst Num DB Name      Instance     Host
------------ -------- ------------ ------------ ------------
* 2656835042        TEST          TEST          tester

Database Id and Instance Number for the Second Pair of Snapshots
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Using 2656835042 for Database Id for the second pair of snapshots
Using          1 for Instance Number for the second pair of snapshots

Specify the number of days of snapshots to choose from
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Entering the number of days (n) will result in the most recent
(n) days of snapshots being listed.  Pressing without
specifying a number lists all completed snapshots.


Enter value for num_days2: 2

Listing the last 2 days of Completed Snapshots

                                                   Snap
Instance     DB Name        Snap Id    Snap Started    Level
------------ ------------ --------- ------------------ -----
TEST       TEST    6480 22 Feb 2011 00:00      1
                               6481 22 Feb 2011 01:00      1
                               6482 22 Feb 2011 02:00      1
                               6483 22 Feb 2011 03:00      1
                               6484 22 Feb 2011 04:00      1
                               6485 22 Feb 2011 05:00      1
                               6486 22 Feb 2011 06:00      1
                               6487 22 Feb 2011 07:00      1
                               6488 22 Feb 2011 08:00      1
                               6489 22 Feb 2011 09:00      1
                               6490 22 Feb 2011 10:00      1
                               6491 22 Feb 2011 11:00      1
                               6492 22 Feb 2011 12:00      1
                               6493 22 Feb 2011 12:48      1
                               6494 22 Feb 2011 12:48      2
                               6496 22 Feb 2011 14:00      1
                               6497 22 Feb 2011 15:00      1
                               6498 22 Feb 2011 16:00      1
                               6499 22 Feb 2011 17:00      1
                               6500 22 Feb 2011 18:00      1
                               6501 22 Feb 2011 19:00      1
                               6502 22 Feb 2011 20:00      1
                               6503 22 Feb 2011 21:00      1
                               6504 22 Feb 2011 22:00      1
                               6505 22 Feb 2011 23:00      1
                               6506 23 Feb 2011 00:00      1
                               6507 23 Feb 2011 01:00      1
                               6508 23 Feb 2011 02:00      1
                               6509 23 Feb 2011 03:00      1
                               6510 23 Feb 2011 04:00      1
                               6511 23 Feb 2011 05:00      1
                               6512 23 Feb 2011 06:00      1
                               6513 23 Feb 2011 07:00      1
                               6514 23 Feb 2011 08:00      1
                               6515 23 Feb 2011 09:00      1
                               6516 23 Feb 2011 10:00      1
                               6517 23 Feb 2011 11:00      1
                               6518 23 Feb 2011 12:00      1
                               6519 23 Feb 2011 13:00      1
                               6520 23 Feb 2011 14:00      1
                               6521 23 Feb 2011 15:00      1
                               6522 23 Feb 2011 16:00      1

Specify the Second Pair of Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for begin_snap2: 6515
Second Begin Snapshot Id specified: 6515

Enter value for end_snap2: 6517
Second End   Snapshot Id specified: 6517

Specify the Report Name
~~~~~~~~~~~~~~~~~~~~~~~
The default report file name is awrdiff_1_6489_1_6515.txt  To use this name,
press to continue, otherwise enter an alternative.

Enter value for report_name: 22-23_compare_awr

Using the report name 22-23_compare_awr

WORKLOAD REPOSITORY COMPARE PERIOD REPORT

Snapshot Set    DB Id    Instance     Inst Num Release     Cluster Host          Std Block Size
------------ ----------- ------------ -------- ----------- ------- ------------ ---------------
First (1st)   2656835042 TEST                 1 11.2.0.1.0  NO      tester        8192
Second (2nd)  2656835042 TEST                 1 11.2.0.1.0  NO      tester        8192
..
..
..
..
..
Report written to 22-23_compare_awr
Sql>

Rapor çıktısı çok uzun ve çok detaylı olduğu için maalesef buraya ekleyemiyorum. (sadece ilk satırını ekledim) Burada scripti çalıştırdığımızda neleri set ettiğimize bakalm;

Enter value for report_type: text
(raporun çıktı formatını belirledim, html de seçebilirdim)

Enter value for num_days: 2
(karşılaştırma yapmak için ilk döneme ait değerleri seöçebilmek için son 2 günlük snapshotları listelemesini istedim)

Enter value for begin_snap: 6489
(listelenen bu snapshotlardan 22 Şubatın sabah 09:00 aralığına denk gelen ilk snapshot aralığını seçtim)

Enter value for end_snap: 6491
(listelenen bu snapshotlardan 22 Şubatın sabah 11:00 aralığına denk gelen son snapshot aralığını seçtim)

Buraya kadar compare edeceğim iki dönemden ilkine ait tüm bilgileri girmiş oldum, sıra ikinci dönemimi belirlemeye geldi,

Enter value for num_days2: 2
(karşılaştırma yapmak için ilk döneme ait değerleri seöçebilmek için son 2 günlük snapshotları listelemesini istedim)

Enter value for begin_snap2: 6515
(listelenen bu snapshotlardan 23 Şubatın sabah 09:00 aralığına denk gelen ilk snapshot aralığını seçtim)

Enter value for end_snap2: 6517
(listelenen bu snapshotlardan 23 Şubatın sabah 11:00 aralığına denk gelen son snapshot aralığını seçtim)

Enter value for report_name: 22-23_compare_awr
(ortaya çıkacak olan text dökümanına isim verdim)

Hepsi bu kadar, sonrasında iş ortaya çıkan bu dökümanı incelemeye ve yorumlamaya kaldı. (aslında snapshot create etmekteki adımları sadece peşpeşe 2 defa yaptığımızı düşünebilirizde başka hiçbir fark yok, fark rapor çıktısında göze çarpıyor, tüm sonuçlar 1st period, 2st period başlığı altında teker teker karşılaştırılıyor)

Buraya kadar olan kısım single instance kullanıyor iseniz yapacaklarınızı ifade ediyor,peki RAC kullanılıyor iseniz bu işlemleri nasıl yapacaksınız?

Değişen pek bişey yok, yapılacak olan işlemler hemen hemen aynı, çalıştırılacak olan dosya awrgdrpt.sql isimli file olacaktır.
@$ORACLE_HOME/rdbms/admin/awrgdrpt.sql

Rac’ ın kurulu olduğu instance’ lardan spesifik olarak biri üzerinde almak isterseniz, awrddrpi.sql dosyasını çalıştırmanız yeterli olacaktır.
@$ORACLE_HOME/rdbms/admin/awrddrpi.sql

Umarım faydalı olmuştur.



Kamil TÜRKYILMAZ