26 Kasım 2010 Cuma

ORA-01552: cannot use system rollback segment for non-system tablespace USERS


Bugün test ortamlarımızdan birinde ora-01552 hatası almaya başladık. Hata undo tablespace’ i altında oracle tarafından manage edilen rollback segmentlerini işaret ediyordu.

Öncelikle hali hazırda mevcut olan rollback segmentlerin durumun kontrol ettiğimde ;

select segment_name, status from dba_rollback_segs;

SEGMENT_NAME    STATUS
SYSTEM    ONLINE
_SYSSMU1$    OFFLINE
_SYSSMU2$    OFFLINE
_SYSSMU3$    OFFLINE
_SYSSMU4$    OFFLINE
_SYSSMU5$    OFFLINE
_SYSSMU6$    OFFLINE
_SYSSMU7$    OFFLINE
_SYSSMU8$    OFFLINE
_SYSSMU9$    OFFLINE
_SYSSMU10$    OFFLINE

Çıkan sonuçdan da görüleceği üzere tüm rollback segmentlerin durumu offline’ dı. Burada aslında öncelikli olarak aşağıdaki scriptle offline olan rollback segmentlerinin online’ a alınması denebilir. Ancak zaman zaman burada başka bir takım hatalar alınabiliyor.

alter rollback segment _SYSSMU1$  online ;

Bu yöntem işe yararsa problem yok, kullanabilirsiniz.  Undo tablepace’ i ile ilgili olarak 2 önemli initial parametresi bulunmaktadır ;

(sql satırından çalıştıracaksanız)
SQL> Show wparameter undo  ;                

(toad veya benzeri third party bir tool üzerinden çalıştıracaksanız) 
select num, name, value  from v$parameter where name like 'undo%' ;           

NUM   NAME                                     VALUE
710     undo_management               AUTO
711     undo_tablespace                  UNDOTBS1
724     undo_retention                      900

9i ve öncesinde rollback segmentlerini dba’ ler manuel olarak manage ederken, 10g ile birlikte artık oracle undo tablespace’ inin içerisinde otomatik olarak bunları manage etmektedir.  Undo ile ilgili parametrelere baktığımızda undo_management’ ı AUTO, undo_tablespace’ i UNDOTBS1 olarak mutlaka görmeliyiz. (Burada undo_tablespace parametresi default olarak belirlenmiş olan undo tablespace’ inin adını ifade etmektedir. Dolayısıyla her sistemde farklı olabilir). Bu iki parametrenin değerini  belirttiğim şekilde göremiyorsak o zaman bu tarz hatalar alabiliriz demektir.  Örneğin ; Bizim örneğimizde olduğu gibi rollback segmentsler offline ise sistem crash olmaz, çalışmaya devam eder ancak ne zamanki undo tablespace’ ini kullanacak bir transaction çalışır o zaman hata almaya başlarız.

Nasıl düzelteceğimize gelince ;

Undo parametreleri istenildiği gibi değilse onları set ediyoruz ;

alter system set undo_management = 'AUTO' scope=spfile ;

ALTER SYSTEM SET Undo_Tablespace=UNDOTBS1 scope=spfile ;

Database' i kapatıp açıyoruz. 
(bu değişiklikleri initSID.ora dosyasından değiştirip, create spfile from pfile ile yeni bir spfile oluşturup, database’ i  restart edersekde aynı işlemi yapmış oluruz) 

Hatanın oluşma durumuna göre farklı durumlarla karşılabilirsiniz, kimi durumlarda Undo tablespace’ ini drop – create etmek de gerekebilir.


Kamil TÜRKYILMAZ 

Database Seviyesinde SUSPEND ve RESUME Operasyonları


Suspend komutu instance' a özgü bir komut değildir. RAC kullanılan bir sistemde node' lardan birinden çalıştırılacak olan suspend komutu tüm node' ları etkileyecektir. Alter system resume komutu ile sistem normal işleyişine geri dönecektir. Resume ve Suspend komutları farklı instance' lardan çalıştırılabilir. Sonuçda hepsi çalıştırılan komutdan etkilenecektir. Database Suspend modda iken DDL komutları dahil olmak üzere hiçbir komut response dönmeyecektir. Ne zamanki Resume komutu çalıştırılırsa database kaldığı yerden işleyişine devam edecektir.

Database’ den consistent backup almak (db kapatmadan) için veya database’ de belli bir süre için hiçbir işlem yapılmak istenmiyorsa yapılabilir.  Aynı zamanda diskler üzerinde yapılan i/o işlemlerini sıfırlamak içinde kullanılabilir. Ancak genelde çalışan sorgu hata vermeden doğabilecek fiziksel alan problemlerini ortadan kaldırmak için kullanıldığını söyleyebiliriz.
Database’ i Suspend moda almak için ;

ALTER SYSTEM SUSPEND;
System altered

Kontrol etmek için ;

SELECT DATABASE_STATUS FROM V$INSTANCE;

DATABASE_STATUS
SUSPENDED

Suspend moddan çıkartmak için ;

ALTER SYSTEM RESUME;
System altered

Kontrol etmek için ;

SELECT DATABASE_STATUS FROM V$INSTANCE;
DATABASE_STATUS
ACTIVE

Yukarıdaki şekilde manuel olarak database’ in statüsünü değiştirmenin dışında sisteme özellikle kritik yapılan bazı operasyonlarda hata dönmeden önce bizim hatayı düzeltmemiz için gereken süre kadar beklemesini, yapılan işi askıya almasını söyleyebilriz.  Örneğin yüklü yapılan bir takım insert işlemlerinde tablespace’ de yer kalmaması gibi durumlar oluşabilir. İşlem sırasında tablespace’ in doluluk durumunu izlediğimizi varsayarsak resize işlemini yapacak kadar bir süre işlem öncesinde tanımlanırsa bu bize çalışan sorguyu tekrar tekrar yeniden çalıştırmamızı engellemiş olur. Diğer türlü her hata aldığımızda (insert işlemi için özellikle hata verdiğinde sistem yapılan tüm işlemin geri alınması için rollback yapmaya başlayacakki, rollback maliyetli bir süreçtir) işlemimizi tekrar başlatmamız gerekecektir.

ALTER SYSTEM SET RESUMABLE_TIMEOUT=60;

Yukarıdaki işlem ile database seviyesinde yapılan tüm işlemler için 60 sn’ lik bir suspend zamanı tanımlanmış olur. Değişiklik spfile’ e yazılmadığı için database restart olduğu zaman işlevliğini kaybedecektir.

Resumable timeout parametresini devre dışı bırakmak yani disable yapmak için ;

ALTER SYSTEM SET RESUMABLE_TIMEOUT=0;

Komutu çalıştırmamız yeterli olacaktır.

Yukarıdaki resumable operasyonunu sesion bazında yapmakta mümkündür.

ALTER session SET RESUMABLE_TIMEOUT=60;

Session kapatıldığında yapılan değişiklikde önemini yitirecektir.

System genelinde resumable timeout süresi verildiği halde, çalışılan bir session için bu tarz bir süre kullanılmak istenmiyorsa, çalıştırılmak istenen sorgudan önce aşağıdaki komutun çalıştırılması yeterli olacaktır ;

ALTER SESSION DISABLE RESUMABLE;


Kamil TÜRKYILMAZ

16 Kasım 2010 Salı

Sequencelerle İlgili Birkaç Not …


Sequence’ ler için sayaç tabloları denilebilir. Sequence’ ler sizin belirlediğiniz bir noktadan istediğiniz oranda bir artış hızıyla, istediğiniz bir değere kadar sayı üretirler.

Create sequence komutunun full syntax’ ı ;

CREATE SEQUENCE [schema.]sequencename
[INCREMENT BY number]
[START WITH number]
[MAXVALUE number | NOMAXVALUE]
[MINVALUE number | NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE number | NOCACHE]
[ORDER | NOORDER] ;

Increment by ; Alınacak olan sıra numarasının kaçar kaçar artacağını ifade eder.

Start With ; İlk alacağı değerin ne olacağını ifade eder.

Maxvalue ; En son hangi sayıya kadar değer üretileceğini ifade eder.

Minvalue ; Max değere ulaşıldıkdan sonra başlanılacak olan değeri ifade eder (Eğer cycle create edilmiş ise). Create edilme aşamasında Start with ile başlanılır. Start with min value’ den daha az olamaz.

Cycle ; Maxvalue değerine ulaşıldıkdan sonra tekrar başa dönülüp dönülmeyeceğini ifade eder. (Maxvalue değerine ulaşıldığında, minvalue’ den başlayarak değer üretmeye devam edileceğinden duplica kayıtlar oluşacaktır.)

Cache ; Performans için önemlidir. Defaultda 20 değeri otomatik olarak cacheleyerek üretir. Değer artırılabilir. (Deneyimler gösteriyorki default değeri yeterli olmamaktadır, sizin uygulamanız saniyede 10 kere sequenceden değer select ediyor ise, bu değeri 50000 olarak set edebilirsiniz. Bunu kullanmakdan çekinmeyin)

Order ; Cluster databaseler ile ilgilidir. Order cluster içindeki bütün instance’ larda sequence’ in sırayla artması için zorlar.

Sequence’ ler sadece pozitif yönlü değil azalan bir seyirdede sayı üretebilirler, increment by kısmına -1 veya eksi herhangi bir değer girildiğinde azalan şeklinde sayı üretirler.

Sequence’ in en son hangi sayıyı ürettiğini görmek için;

SELECT seq14.currval FROM dual;

Sequence’ in üreteceği bir sonraki değeri görmek için;

SELECT seq14.nextval FROM dual;

(bu komut sequence’ den bir kaydı select ettiği için

Cache opsiyonu ile ilgili önemli bir not ; Cache değeri kaç ise sequence’ i çağırdığınız da o kadar sıra nosunu alıp cache’ e çıkartıyor ve kullanım için hazır halde bekletiyor. Bu esnada sistemde yaşanacak olan herhangi bir shutdown/startup durumu olursa cache’ lenmiş olan sıra numaralarını kaybedersiniz. Dolayısıyla aralarda olamayan sıra noları ile karşılaşırsanız sebeblerinden biri bu olacaktır. (bir diğer sebebi ilgili sequence nextval ile dual tablosu kullanılarak select edilmiş olabilir)

Sequence’i create ettikden sonra alter sequence komutu ile bazı opsiyonlarını değiştirebilirisiniz. Syntax’ ı  aşağdıaki gibidir ;

ALTER SEQUENCE sequencename
[INCREMENT BY number]
[START WITH number]
[MAXVALUE number | NOMAXVALUE]
[MINVALUE number | NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE number | NOCACHE]
[ORDER | NOORDER] ;

Bikaç örnek ;

-- increment değerini değiştirmek için ;
alter sequence seq14 increment by 5 ;

-- max value değerini değiştirmek için ;
alter sequence seq14 maxvalue 3000

-- max value değerini değiştirmek için ;
alter sequence seq14 minvalue 5

-- cycle / nocycle değerini değiştirmek için ;
alter sequence seq14 cycle

-- cache değerini değiştirmek için ;
alter sequence seq14 cache 100

-- order  - noorder değerini değiştirmek için ;
alter sequence seq14 noorder

Start with değeri değiştirilemez. Sequence’ i restart etmenin yolu drop-create etmektir.

Sequence’ leri bir alana otomatik olarak unique değer atamak için de insert scriptlerinde kullanabilirsiniz ;

INSERT INTO seq_test_table 
(id, name)
VALUES
(seq14.NEXTVAL, ‘deneme’);

Sequence’ i drop etmek için;

Drop sequence seq14 ;

Sequence’ leriniz ile ilgili tüm detay bilgileri user/dba_sequence tablosundan select edebilirsiniz.

SELECT *
FROM dba_sequences
where sequence_name = 'SEQ14'

Sequence’ ler ile ilgili alabileceğiniz hata mesajları ;

/* ora-04004 */
CREATE SEQUENCE seq10
INCREMENT BY 1
START WITH  10
MAXVALUE 100
MINVALUE 100
NOCYCLE
CACHE 20
ORDER
Error at line 1
ORA-04004: MINVALUE must be less than MAXVALUE

Bu hata min value değerinin maxvalue ye eşit veya büyük olduğunda alınır. Bu iki değerden biri düzeltilip tekrar çalıştırılmalıdır.

/* ora-04006 */

CREATE SEQUENCE seq11
INCREMENT BY 1
START WITH  10
MAXVALUE 100
MINVALUE 11
NOCYCLE
CACHE 20
ORDER
Error at line 1
ORA-04006: START WITH cannot be less than MINVALUE

Bu hata start with değerinin min value’ dan küçük olarak verildiği durumda alınır.
Start with veya min value değerini kontrol edip, start with değerini min value’ dan daha küçük olmayacak şekilde düzeltip tekrar deneyiniz.

/* ora-08002 */

select seq12.currval from dual
       *
Error at line 1
ORA-08002: sequence SEQ12.CURRVAL is not yet defined in this session

Bu hata mesajı daha önce create edilmiş olmasına rağmen henüz hiç kullanılmamış olan bir sequence’ sin current değerinin öğrenilmeye çalışılmasından kaynaklanmaktadır. Önce ;

select seq12.nextval from dual ;

sonrasında

select seq12.currval from dual ;

çalıştırıldığında hata vermeyecektir.

/* ora-08004 */
select seq13.nextval from dual
*
Error at line 0
ORA-08004: sequence seq13.NEXTVAL exceeds MAXVALUE and cannot be instantiated

Bu hata sequence create edilirken verilen maxvalue değerine ulaşıldığını göstermektedir. Bu değer aşağıdaki script ile maxvalue değerinin artırılması ile çözümlenebilir (veya sequence drop edilip kaldığı yerden başlayacak şekilde tekrar cretae edilebilir)

ALTER SEQUENCE seq13 maxvalue 20;

/* ora-02283 */
alter sequence seq14 start with 11
Error at line 1
ORA-02283: cannot alter starting sequence number

Start with değeri alter edilemez. (sonradan değiştirilemez)

Kamil TÜRKYILMAZ