2 Ağustos 2009 Pazar

Tablespace Monitoring

AUTOEXTEND ON Next Size
In a CREATE TABLESPACE command, the DATAFILE clause is the Physical Specification component.

In pre- 9i/10g OMF manner, the DATAFILE must be specified. A (initial) filesize must also be specified. However, Autoextend's NEXT size is not mandatory and Oracle can "default". Very unfortunately, the default AUTOEXTEND ON NEXT size is 1 Database block (based on the blocksize of the tablespace).

But if you create your Tablespace using OMF (i.e. where "db_create_file_dest" is configured), then Oracle defaults the initial size to 100MB and *also* defaults the AUTOEXTEND to ON with a of 100MB ! That is much neater.

Why is the default 1 Database block bad ? Because when the datafile is full, Oracle will extend it 1 block at-a-time, making a call to the OS to add 1 block on each occassion. Obviously, even if you are extending a table or index with an Extent of 64KB, Oracle has to make 8 calls to the OS (with a datafile block size of 8KB). That is where you will see "data file init write" waits.

In the example below, the (automatic) datafile for Tablespace AN_OMF_TBS get's created with both the initial and increment at 100MB and AutoExtend ON. However, for Tablespace REGULAR_TBS, I have to specify the initial size for the datafile. If I do not specify AutoExtend, the file is created with AutoExtend OFF. For the third tablespace, called ANOTHER_TBS, when I designate AutoExtend ON but do not specify the incremental size, Oracle defaults it to 1 Oracle Block.

SQL> select tablespace_name, file_name, bytes/1048576 File_Size_MB, autoextensible, increment_by from dba_data_files order by file_id;


SQL> alter system set db_create_file_dest='/var/tmp';
SQL> create tablespace an_omf_tbs;

SQL> select tablespace_name, file_name, bytes/1048576 File_Size_MB, autoextensible, increment_by from dba_data_files order by file_id;

SQL> create tablespace REGULAR_TBS datafile '/oracle_fs/Databases/ORT24FS/regular_tbs.dbf';
create tablespace REGULAR_TBS datafile '/oracle_fs/Databases/ORT24FS/regular_tbs.dbf'


SQL> create tablespace REGULAR_TBS datafile '/oracle_fs/Databases/ORT24FS/regular_tbs.dbf' size 100M;

SQL> select tablespace_name, file_name, bytes/1048576 File_Size_MB, autoextensible, increment_by from dba_data_files order by file_id;

SQL> create tablespace ANOTHER_TBS datafile '/oracle_fs/Databases/ORT24FS/another_tbs.dbf' size 100M autoextend on ;

SQL> select tablespace_name, file_name, bytes/1048576 File_Size_MB, autoextensible, increment_by from dba_data_files order by file_id;

You would be well-adviced to remember that when you create or add a non-OMF datafile, you should specify the Increment size with the AutoExtend ON. Else, you might suffer the overheads of Oracle having to make multiple calls to the OS whenever extending the datafile (imagine extending a datafile 1 block at each call for an extent of 64MB !)

SQL> create tablespace LAST_TBS datafile '/oracle_fs/Databases/ORT24FS/last_tbs.dbf' size 100M autoextend on next 100M;

Tablespace created.

SQL> select tablespace_name, file_name, bytes/1048576 File_Size_MB, autoextensible, increment_by from dba_data_files order by file_id;

Tablespace LAST_TBS's datafile is created with a meaningful Increment for AutoExtend.


otes on Specifying Datafiles and Tempfiles

*

For operating systems that support raw devices, the REUSE keyword of datafile_tempfile_spec has no meaning when specifying a raw device as a datafile. Such a CREATE TABLESPACE statement will succeed whether or not you specify REUSE.
*

You can create a tablespace within an Automatic Storage Management disk group by providing only the disk group name in the datafile_tempfile_spec. In this case, Automatic Storage Management creates a datafile in the specified disk group with a system-generated filename. The datafile is auto-extensible with an unlimited maximum size and a default size of 100 MB. You can use the autoextend_clause to override the default size.
*

If you use one of the reference forms of the ASM_filename, which refers to an existing file, then you must also specify REUSE.


http://www.sc.ehu.es/siwebso/KZCC/Oracle_10g_Documentacion/server.101/b10759/statements_7003.htm
---------------------------------------------------------------------------
CREATE TABLESPACE
DATAFILE SIZE sayı K|M [AUTOEXTEND OFF | {AUTIOEXTEND
ON | NEXT sayı K|M | MAXSIZE UNLIMITED | sayi K|M |}
[ONLINE | OFFLINE ]
[PERMANENT | TEMPORARY ]

Kullanılan ifadelerin açıklamaları :
Tablespace ismi : Oluşturulacak tablespace verilecek addır.
DATAFILE : Tablespace’i oluşturan veri dosyasının tanımlandığı bölümdür.
Dosya ismi : DATAFILE’ın path’ini belirtildiği bölümdür.
AUTOEXTEND OFF : Datafile otomatik artışını iptal etmekte kullanılan komuttur.

AUTOEXTEND ON : Datafile otomatik artışını sağlayan komuttur.
NEXT : Datafile’ ın genişleme miktarı.
MAXSIZE : Datafile’ın genişleyebileceği en son miktardır.
UNLIMITED : Datafile’ın sınırsız büyüyebileceğini göstermektedir. Belirtilmese dahi standart olarak seçilidir.
ONLINE : Tablespace’i oluşturduktan hemen sonra aktif olacağını belirten bölümdür. Standart olarak seçilidir.

OFFLINE : Tablespace’i oluşturduktan hemen sonra pasif olacağını belirten bölümdür.

PERMANENT : Tablespace içinde tutulacak olan nesnelerin kalıcı olarak saklanacağını belirten bölümdür. Standart olarak seçilidir.

TEMPORARY : Tablespace’te geçici nesnelerin tutulacağının belirtildiği bölümdür.

NOT : Tablespace oluşturmak ve yönetmek için STORAGE MANAGER kullanılmasını tavsiye ederiz.

31 Temmuz 2009 Cuma

RMAN Backup

1) SQL> archive log list;

komutu ile archivelog da olup olmadığını anla.

2) DOS> rman target sys/oracle@orcl

3) Yedekleri e:\vtyedek klasörüne alacağız. 1 backup saklama stratejisi ile backup alacağız. Klasörü RMAN yaratmaz

CONFIGURE DEFAULT DEVICE TYPE TO DISK;
CONFIGURE RETENTION POLICY TO REDUNDANCY 1;
CONFIGURE DEVICE TYPE DISK PARALLELISM 1;
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT
'E:\vtyedek\ora_df_%t_%s_%p';
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO 'E:\vtyedek\%F';
CONFIGURE BACKUP OPTIMIZATION ON;

------------------------------------------------------------------------------------------
redundancy 1 yerine bu satırı da verebilirsin: CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS; -- son 7 gün lük yedeği sakla demek
yedek yeri belirtilirken max dosya boyutu da verilebilir: CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT
'e:\vtyedek\ora_df_%t_%s_%p' maxpiecesize 2G; -10 gb ise 2 gb a böluyor.

show all;

tüm veritabanını yedeğini alalım:

BACKUP DATABASE PLUS ARCHIVELOG;

--crosscheck archivelog all

Veritabanı yedeğinin sağlıklı olup olmadığını, eksik backup dosyası olup olmadığını

RESTORE DATABASE VALIDATE;

komutuyla görebiliriz. Eksik dosya olursa hata mesajı verir ve eksik dosyayı söyler.



İşin ne kadarının bittiğini gösterir:

SQL> SELECT SID, SERIAL#, OPNAME,CONTEXT, SOFAR, TOTALWORK, ROUND(SOFAR/TOTALWORK*100,2) "% COMPLETE"
FROM V$SESSION_LONGOPS
WHERE OPNAME LIKE 'RMAN%'
--AND OPNAME NOT LIKE '%aggregate%'
AND TOTALWORK != 0
AND SOFAR <> TOTALWORK
/
----------------------------
create or replace function yedek_yuzde_kac return varchar2 is
yuzde varchar2(20);
begin

select '%'|| ROUND (SOFAR/TOTALWORK*100,2)
into yuzde
from v$session_longops
where opname like 'RMAN%'
and opname not like '%aggregate%'
and TOTALWORK <> 0
and SOFAR <> TOTALWORK;
return yuzde;

end;

grant execute
on yedek_yuzde_kac
to public

create public synonym yyk for yedek_yuzde_kac
---------------------


datafile ları tek tek yedekle:

REPORT SCHEMA;
--------------
report obsolete; eski yedekleri listeler

delete noprompt obsolete;

crosscheck backup;

BACKUP VALIDATE DATABASE

----
BACKUP DATAFILE 5;


tablespace düzeyinde yedekle:

BACKUP TABLESPACE EXAMPLE;


incremental backup al:

BACKUP INCREMENTAL LEVEL 0 DATABASE;

datafile düzeyinde incremental backup alabiliriz:

BACKUP INCREMENTAL LEVEL 1 DATAFILE 5;


archivelogları yedekliyoruz:

BACKUP ARCHIVELOG ALL;


backup ihtiyacı olan dosyalar:

REPORT NEED BACKUP;


eski backup dosyalarını göster:

REPORT OBSOLETE;


eski backup dosyalarını sil:

DELETE OBSOLETE;


database ve archivelog yedeklerini validate edelim:

BACKUP VALIDATE DATABASE ARCHIVELOG ALL;


recover edilemeyecek olanları gör:

REPORT UNRECOVERABLE;


bugün yedeğinin alındığından eminseniz eski archivelogları boşaltmak için:

DELETE ARCHIVELOG UNTIL TIME 'SYSDATE-1';

crosscheck yaparak backupsetlerin yerlerinde olup olmadığına bakabiliriz:

CROSSCHECK BACKUP OF DATABASE;


datafile, tablespace ve controlfile yedekleme bilgilerini görebiliriz:

LIST BACKUP OF DATAFILE 5;

LIST BACKUP OF CONTROLFILE;

Archive log Mode

exp system/oracle@orcl file=c:\exp_hr.dmp owner=hr
possible charset conversion
NLS_LANG

alter user hr identified by hr account unlock;

select * from job_history
drop table job_history purge
flashback table job_history to before drop

create table kopya_emp5 as
select * from employees

select * from kopya_emp5
as of timestamp to_timestamp('06/05/2009 10:10', 'DD/MM/YYYY HH24:MI')
minus
select * from kopya_emp5

alter table employees enable row movement

alter system switch logfile;

select * from v$log;

show parameter undo_retention;

show parameter sessions

select name, value
from v$parameter
where name like '%spfile%'

create spfile from pfile;

archive log list;

shutdown immediate; normal - transactional - abort

grant advisor to hr;

alter system set undo_retention=900 scope=both; spfile - memory

show parameter control_files;

LOG_ARCHIVE_DEST_1=’LOCATION=C:\vtyedek\archives’ - mandatory reopen=300

Archivelog formatı verelim:

LOG_ARCHIVE_FORMAT='ARC_%S_%R_%T.ARC'

Veritabanını arşiv moda geçirmek için:

SQL> shutdown immediate;

İle kapayıyoruz.

SQL> startup mount;

Komutu ile mount modunda açıyoruz.

SQL> alter database archivelog;

Komutu ile veritabanını arşiv moduna geçiriyoruz.

SQL> alter database open;

Komutu ile veritabanını açıyoruz

Şimdi archive loga geçip geçmediğini test etmek için;

SQL> alter system switch logfile;

Komutuyla archive log üretiyoruz. (C:\archives klasöründe archive dosyaları oluşmaya başlayacak. )

select name, log_mode from v$database;

29 Temmuz 2009 Çarşamba

DBA SQL AWR

DIKKAT :

Asagidaki tum SQL komutlari, ORACLE AWR raporlarindan bilgiyi alir. Bu yuzden oncelikle sistem uzerinde AWR raporlarinin calismis oldugundan emin olmalisiniz. Ayrica AWR raporlarinin calisma zamanlari en az yarimsaat olmali ki daha dogru sonuclar alinabilsin.

Oracle 10g uzerinde RAC sistemleri mevcut ise insantce degerlerinden bu gorulebilir. Eger yoksa instance_number sadece 1 olacaktir.

AWR raporlarinin baslangic tarih ve saat ile bitis tarih ve saat degerlerini istediginiz gibi girebilirsiniz. Ozellikle is saatleri arasinda alacaginiz raporlamalar size daha dogru sonuclar verecektir.

/* ###
/* ### Oracle CPU Kullanim Oranlari (CPU yogunlugunun gorulmesi)
/* ###

select smr.INSTANCE_NUMBER,

min(smr.MINVAL) min, max(smr.MAXVAL) max,

round(avg(smr.MINVAL)) minavg, round(avg(smr.MAXVAL)) maxavg,

round(avg(smr.AVERAGE)) avg

from DBA_HIST_SYSMETRIC_SUMMARY smr,

v$database d

where

smr.BEGIN_TIME >= to_date('YYYY-AA-GG S1’,'YYYY-MM-DD HH24') and

smr.END_TIME <= to_date('YYYY-AA-GG S2’,'YYYY-MM-DD HH24') and

smr.DBID=d.DBID and

smr.METRIC_NAME='Database CPU Time Ratio'

group by smr.INSTANCE_NUMBER;



INSTANCE_NUMBER MIN MAX MINAVG MAXAVG AVG

--------------- ---------- ---------- ---------- ---------- ----------

2 0 41.5811655 0 26 18

1 0 34.9719813 0 20 12

=============================================================================================

/* ###
/* ### Oracle Bekleme Oranlari (Oracle sisteminin kullanicilardan is bekleme zaman degerleri)
/* ###

select smr.INSTANCE_NUMBER,

min(smr.MINVAL) min, max(smr.MAXVAL) max,

round(avg(smr.MINVAL)) minavg, round(avg(smr.MAXVAL)) maxavg,

round(avg(smr.AVERAGE)) avg

from DBA_HIST_SYSMETRIC_SUMMARY smr,

v$database d

where

smr.BEGIN_TIME >= to_date('YYYY-AA-GG S1’,'YYYY-MM-DD HH24') and

smr.END_TIME <= to_date('YYYY-AA-GG S2','YYYY-MM-DD HH24') and

smr.DBID=d.DBID and

smr.METRIC_NAME='Database Wait Time Ratio'

group by smr.INSTANCE_NUMBER;



INSTANCE_NUMBER MIN MAX MINAVG MAXAVG AVG

--------------- ---------- ---------- ---------- ---------- ----------

2 0 98.7966488 0 92 82

1 0 99.4121159 0 95 88



=============================================================================================

/* ###
/* ### En çok CPU kullanan -yoran- ilk 10 SQL (CPU TIME Degerine göre)
/* ###

select * from

(

select sqs.INSTANCE_NUMBER, sqs.SQL_ID,

sum(EXECUTIONS_DELTA) EXECUTIONS,

round(sum(ELAPSED_TIME_DELTA/1000/1000)) ELAPSED_TIME,

round(sum(CPU_TIME_DELTA/1000/1000)) CPU_TIME,

sum(BUFFER_GETS_DELTA) BUFFER_GETS

from DBA_HIST_SQLSTAT sqs,

DBA_HIST_SNAPSHOT snp,

v$database d

where

snp.BEGIN_INTERVAL_TIME >= to_timestamp('YYYY-AA-GG S1’,'YYYY-MM-DD HH24') and

snp.END_INTERVAL_TIME <= to_timestamp('YYYY-AA-GG S2’,'YYYY-MM-DD HH24') and

sqs.DBID=d.DBID and

sqs.DBID=snp.DBID and

sqs.INSTANCE_NUMBER=snp.INSTANCE_NUMBER and

sqs.SNAP_ID=snp.SNAP_ID

group by sqs.INSTANCE_NUMBER,sqs.SQL_ID

order by CPU_TIME desc

)

where rownum<=10;





INSTANCE_NUMBER SQL_ID EXECUTIONS ELAPSED_TIME CPU_TIME BUFFER_GETS

--------------- ------------- ---------- ------------ ---------- -----------

2 b5hzmkcpbmn23 29148 14241 7619 211526710

1 6ahddxp5un7a3 7 4333 3760 79255773

1 gcfyqusdngbv4 207011 5213 3746 701526739

1 53wbuxzx13ndw 313 67766 2941 92357833

1 b5hzmkcpbmn23 9073 4675 2774 64520393

2 g5jnvm7kgtyah 1586 4345 2210 235469477

2 gxknp4j7gd8g0 6331013 2809 2040 186057685

1 829355xf7xjj4 3513 2592 1356 42605109

1 1z6rfm3gfbzmv 125 27509 1127 29389172

1 gqau08wu3zrgp 286155 13099 981 6029967

=============================================================================================

/* ###
/* ### En uzun süren ilk 10 SQL (Elepsad_time degerine gore):
/* ###

select * from

(

select sqs.INSTANCE_NUMBER, sqs.SQL_ID,

sum(EXECUTIONS_DELTA) EXECUTIONS,

round(sum(ELAPSED_TIME_DELTA/1000/1000)) ELAPSED_TIME,

round(sum(CPU_TIME_DELTA/1000/1000)) CPU_TIME,

sum(BUFFER_GETS_DELTA) BUFFER_GETS

from DBA_HIST_SQLSTAT sqs,

DBA_HIST_SNAPSHOT snp,

v$database d

where

snp.BEGIN_INTERVAL_TIME >= to_timestamp('YYYY-AA-GG S1’,'YYYY-MM-DD HH24') and

snp.END_INTERVAL_TIME <= to_timestamp('YYYY-AA-GG S2','YYYY-MM-DD HH24') and

sqs.DBID=d.DBID and

sqs.DBID=snp.DBID and

sqs.INSTANCE_NUMBER=snp.INSTANCE_NUMBER and

sqs.SNAP_ID=snp.SNAP_ID

group by sqs.INSTANCE_NUMBER,sqs.SQL_ID

order by ELAPSED_TIME desc

)

where rownum<=10;



INSTANCE_NUMBER SQL_ID EXECUTIONS ELAPSED_TIME CPU_TIME BUFFER_GETS

--------------- ------------- ---------- ------------ ---------- -----------

1 53wbuxzx13ndw 313 67766 2941 92357833

1 1z6rfm3gfbzmv 125 27509 1127 29389172

2 gt1sjbrcc75y7 26497 25423 57 1467588

2 cm273h7pxw8k9 52906 25214 127 1641933

2 af582nx1dpb7y 74522 24179 118 973147

1 17hz8amdfpkth 305 21702 406 4864716

2 4xvr2wj20qjna 5228 20716 357 16711832

1 dbcc5nqf4dyxf 104817 18855 244 6366708

1 d0k0dj5v6yc6p 287381 17005 960 5148445

1 20wbqjfrqmfdx 85300 17001 236 7369135

=============================================================================================

/* ###
/* ### En çok mantiksal okuma yapan ilk 10 SQL (Buffer Gets degerine gore)
/* ###



select * from

(

select sqs.INSTANCE_NUMBER, sqs.SQL_ID,

sum(EXECUTIONS_DELTA) EXECUTIONS,

round(sum(ELAPSED_TIME_DELTA/1000/1000)) ELAPSED_TIME,

round(sum(CPU_TIME_DELTA/1000/1000)) CPU_TIME,

sum(BUFFER_GETS_DELTA) BUFFER_GETS

from DBA_HIST_SQLSTAT sqs,

DBA_HIST_SNAPSHOT snp,

v$database d

where

snp.BEGIN_INTERVAL_TIME >= to_timestamp('YYYY-AA-GG S1’,'YYYY-MM-DD HH24') and

snp.END_INTERVAL_TIME <= to_timestamp('YYYY-AA-GG S2’,'YYYY-MM-DD HH24') and

sqs.DBID=d.DBID and

sqs.DBID=snp.DBID and

sqs.INSTANCE_NUMBER=snp.INSTANCE_NUMBER and

sqs.SNAP_ID=snp.SNAP_ID

group by sqs.INSTANCE_NUMBER,sqs.SQL_ID

order by BUFFER_GETS desc

)

where rownum<=10;



INSTANCE_NUMBER SQL_ID EXECUTIONS ELAPSED_TIME CPU_TIME BUFFER_GETS

--------------- ------------- ---------- ------------ ---------- -----------

1 gcfyqusdngbv4 207011 5213 3746 701526739

2 g5jnvm7kgtyah 1586 4345 2210 235469477

2 b5hzmkcpbmn23 29148 14241 7619 211526710

2 gxknp4j7gd8g0 6331013 2809 2040 186057685

1 53wbuxzx13ndw 313 67766 2941 92357833

2 gcc76mbkfzbrg 19962 1347 909 87347052

1 6ahddxp5un7a3 7 4333 3760 79255773

1 b5hzmkcpbmn23 9073 4675 2774 64520393

1 79aunmuktf6sf 8613 1811 956 47733280

2 a859cj7gtwggw 3909566 535 326 43179158

=============================================================================================

/* ###
/* ### En çok DISK okuma yapan ilk 10 SQL (DISK_READS degeri gore)
/* ###

select * from

(

select sqs.INSTANCE_NUMBER, sqs.SQL_ID,

sum(EXECUTIONS_DELTA) EXECUTIONS,

round(sum(ELAPSED_TIME_DELTA/1000/1000)) ELAPSED_TIME,

round(sum(CPU_TIME_DELTA/1000/1000)) CPU_TIME,

sum(BUFFER_GETS_DELTA) BUFFER_GETS,

sum(DISK_READS_DELTA) DISK_READS

from DBA_HIST_SQLSTAT sqs,

DBA_HIST_SNAPSHOT snp,

v$database d

where

snp.BEGIN_INTERVAL_TIME >= to_timestamp('YYYY-AA-GG S1','YYYY-MM-DD HH24') and

snp.END_INTERVAL_TIME <= to_timestamp('YYYY-AA-GG S2’,'YYYY-MM-DD HH24') and

sqs.DBID=d.DBID and

sqs.DBID=snp.DBID and

sqs.INSTANCE_NUMBER=snp.INSTANCE_NUMBER and

sqs.SNAP_ID=snp.SNAP_ID

group by sqs.INSTANCE_NUMBER,sqs.SQL_ID

order by DISK_READS desc

)

where rownum<=10;



INSTANCE_NUMBER SQL_ID EXECUTIONS ELAPSED_TIME CPU_TIME BUFFER_GETS DISK_READS

--------------- ------------- ---------- ------------ ---------- ----------- ----------

1 53wbuxzx13ndw 313 67766 2941 92357833 4428838

2 33ug56m93d3za 0 12325 285 7445226 3156943

2 3n4p7gcjah2tb 1 11248 228 7907331 2527719

2 fwygkuyv8csvk 1 10730 200 7075954 2191880

1 1z6rfm3gfbzmv 125 27509 1127 29389172 1637314

1 17hz8amdfpkth 305 21702 406 4864716 1245073

2 4xvr2wj20qjna 5228 20716 357 16711832 1176634

1 gdna3tyy8ntu8 379 16587 419 9084651 1144990

1 8acwusvy4jx71 102 11412 497 19688222 894536

2 c0njscvt37djh 1 2404 75 1347772 788968

=============================================================================================

DBA SQL -3 Advanced

/* ### Top 10 by Buffer Gets:#####
/* ### Buffer uzerinden 10000'den fazla bilgi alan ilk 10 sql listesi

set linesize 250
set pagesize 250
SELECT * FROM (SELECT substr(sql_text,1,40) sql, buffer_gets, executions, buffer_gets/executions "Gets/Exec", hash_value,address
FROM V$SQLAREA
WHERE buffer_gets > 10000
ORDER BY buffer_gets DESC)
WHERE rownum <= 10;
/* ### Top 10 by Physical Reads:#####
/* ### Disk uzerinden okuma sayisi 1000'den fazla olan ilk 10 sql listesi.
/* ### Disk uzerinden okuma ne kadar fazla ise performans o kadar kotudur. Bu yuzden bu sql'lerin tekrardan gozden gecirilmesi gerekir.

set linesize 100
set pagesize 100
SELECT * FROM
(SELECT substr(sql_text,1,40) sql,
disk_reads, executions,-- disk_reads/executions "Reads/Exec",
hash_value,address
FROM V$SQLAREA
WHERE disk_reads > 1000
ORDER BY disk_reads DESC)
WHERE rownum <= 10;
/* ### Top 10 by Executions:#####
/* ### sql bazinda calisan sayisi 100'den fazla olan 10 SQL cumleciginin listesi.
/* ### Bir sql ne kadar cok calisiyorsa o sql'lin yaptigi is kullanicilar tarafindan cok kullaniliyor demektir. Bu tur is kurallarini gozden gecirmek tavsiye edilir.

set linesize 100
set pagesize 100
SELECT * FROM (SELECT substr(sql_text,1,40) sql, executions, rows_processed, rows_processed/executions "Rows/Exec", hash_value, address
FROM V$SQLAREA
WHERE executions > 100
ORDER BY executions DESC)
WHERE rownum <= 10;
/* ### Top 10 by Parse Calls:#####
/* ### Degiskenlerin parametre olarak gecmedigi tipteki sql'lerin sayisinin 1000'den fazla olan 10 SQL cumleciginin listesi.

set linesize 100
set pagesize 100
SELECT * FROM
(SELECT substr(sql_text,1,40) sql, parse_calls, executions, hash_value,address
FROM V$SQLAREA
WHERE parse_calls > 1000
ORDER BY parse_calls DESC)
WHERE rownum <= 10;

/* ### Top 10 by Shareble Memory:#####
/* ### 1048576 byte'dan daha fazla bellek kullanan en ustteki 10 SQL cumleciginin listesi.
/* ### Bir sql calistigi ortamda cok daha fazla bellek tuketmemesi gerekir. Buna dikkat edilmesi tavsiye edilir.

set linesize 100
set pagesize 100
SELECT * FROM
(SELECT substr(sql_text,1,40) sql,sharable_mem, executions, hash_value,address
FROM V$SQLAREA
WHERE sharable_mem > 1048576
ORDER BY sharable_mem DESC)
WHERE rownum <= 10;
/* ### Top 10 by Version Count:#####
/* ### Degisik parametrelerle calistirilan sql'lerin version sayisi 20'den fazla olan 10 SQL cumleciginin listesi.
/* ### Bir sql degisik parametrelerle calistiriliyorsa her defasinda derlenir bu da hem performans hem de bellek acisindan olumsuz durum demektir. BIND variable degerleri kullanarak sql'lerin her defasinda degisik sekilde calistirilmamasina dikkat edilmesi tavsiye edilir.

set linesize 100
set pagesize 100
SELECT * FROM
(SELECT substr(sql_text,1,40) sql,
version_count, executions, hash_value,address
FROM V$SQLAREA
WHERE version_count > 20
ORDER BY version_count DESC)
WHERE rownum <= 10;

DBA SQL - 2

/* ### session toplam ve aktif izleme #####
/* ### oracle ait sessionlar secilmemistir (tipi background olmayanlar)
/* ### sistem uzerinde log on olan toplam kullanıcı ve o an aktif olanlari gosterir
/* ### bu sql, oracle 10g rac sisteminde 2 makina olarak var olan bir sistem icindir.

select count(*) TOPLAM,
(select count(*) from gv$session where inst_id=1 and type != 'BACKGROUND' ) TOPLAMN1,
(select count(*) from gv$session where status = 'ACTIVE' and inst_id=1 and type != 'BACKGROUND' ) AKTIFN1,
(select count(*) from gv$session where inst_id=2 and type != 'BACKGROUND') TOPLAMN2,
(select count(*) from gv$session where status = 'ACTIVE' and inst_id=2 and type != 'BACKGROUND') AKTIFN2
from gv$session group by 1,2,3;
/* ### instance bazinda calisan ACTIVE sql toplamlari ###
/* ### sql cumleciklerinin ilk 70 karakterini ve ayni SQL'lerden 3'den fazla olanlari gosterir
/* ### gv$session tablosu RAC sisteminin tumunu kapsar.

SELECT SUBSTR (sql_text, 1, 70) SQL, COUNT (1) adet, s.inst_id INSTANCE, SYSDATE tarih
FROM gv$session s, gv$sql t
WHERE s.sql_hash_value = t.hash_value
AND sql_hash_value <> 0
AND status = 'ACTIVE'
GROUP BY SUBSTR (sql_text, 1, 70), s.inst_id
HAVING COUNT (1) > 3
ORDER BY adet DESC /* ### sistemde tablolara FULL ACCESS erisim yapan sql'leri ve onu kullananlarinin listesini verir.
/* ### object_owner'da XXXXX ile tablolari yaratan schema name kullanilacaktir.

select sql_text,p.operation,p.options,p.object_name,e.machine,e.username,e.status,s.sql_id,event,sid
from v$sql_plan p , v$sqlarea s , v$session e
where operation='TABLE ACCESS' and options='FULL' and object_owner='XXXXXXXX'
and p.plan_hash_value=s.plan_hash_value
and e.sql_id=s.SQL_Id
order by p.address /* ### sistemde o an calisan ACTIVE SQL'lerin listesi */

select e.sql_id, e.sid, s.sql_text
from v$sqlarea s , v$session e
where s.sql_id = e.sql_id and e.status='ACTIVE' and e.type !='BACKGROUND'
order by 1 /* ### sistemde bugunden 2 gun once logon olmus ve hala ACTIVE olan sessionlarin listesi *
/* ### birsekilde sistemden normal sekilde cikmamis ve sistemde takili kalmis sessionlari bulup ve kill etmek icin kullanilir.
/* ### KILL etmeden once session gercekten aktif olup olmadigini kontrol ediniz !

select s.* from v$session s, v$process p
where s.schemaname='ESASLIVE' and s.status='ACTIVE'
and s.paddr=p.addr
and logon_time/* ### istenilen sessionlari UNIX uzerinden silmek icin isletim sistemindeki PID numarasi ile bulup kill -9 ile dusurmek icin
/* ### v$sql.sql_id='XXXXXXXXXXX' sql_id bilinen durumlar icindir.
/* ### v$session.sid=XXXX session SID biliniyorsa yukaridaki deger yerine kullanilir.

select 'kill -9 '||spid from v$process where addr in
(
select paddr from v$session, v$sql
where v$session.sql_id = v$sql.sql_id
and v$session.status='ACTIVE'
and v$sql.sql_id='79wkdjjz4p693'
and type != 'BACKGROUND'
) ; /* ### istenilen sessionlari ORACLE uzerinden silmek icin SID ve SERIAL# degerlerini alarak ALTER SYSTEM KILL SESSION komutu ile dusurmek icin örnekler...
/* ### bu sql calistirildiktan sonra listenen SQL'leri tekrar secip calistirmak gerekmektedir.

select 'alter system kill session '||''''||SID||','||SERIAL#||''''||';' from v$session
where sql_id='1z6rfm3gfbzmv' -- bu sql_id sahip olan sessionlarin hepsini secer

select 'alter system kill session '||''''||SID||','||SERIAL#||''''||' IMMEDIATE;' from v$session where schemaname='XXXXXX' and status='INACTIVE' order by logon_time desc; -- XXXXX schema kullanan, durumu INACTIVE olan ve baglanti zamani eski olan sessionlari listeler. daha sonra bu sessionlari toplu olarak sistemden dusurebilirsiniz. /* ### hash value sunu bildigin sql in çalışan gercek execution planı
/* ### zaman zaman sql'lerin execution planlari farkliliklar gosterebilir.

select distinct id, parent_id, lpad (' ', depth) || operation operation,options, object_name, cost
from v$sql_plan
where hash_value = 1752547357
order by id; /* ### RAC sistemlerinde makinalarda o anda hangi islemlerin oldugunun listesini almak icindir.
/* ### EVENT'lerin sayisina gore buyukten kucuge dogru sirali olarak listelenmistir.

select inst_id,SCHEMANAME,event,count(*)
from gv$session
group by inst_id,SCHEMANAME,event
order by 4 desc

DBA SQL - 1

/* ### Tablolarda alan aciklamalarinin toplu olarak girilmesi #####
/* ### Bazi alan isimleri kullanim amaclarina bagli olarak farkli tablolarda ayni isimle yer alabilir. (CRE_DATE, MOD_USER, FATURA_NO vb.) Bunlara tek seferde aciklama girmek icin asagidaki sql kullanilabilir.
/* ### owner='XXXXXX' sizin islem yapacaginiz schema adini girmeniz gerekecektir.
/* ### ZZZZZZZZZ yerine alan aciklamasini girilmelidir.
/* ### column_name='QQQQQQQQ' yerine istediginiz alan adi girilmelidir.
/* ### Bu sql calistirildiktan sonra listelenen SQL cümlecikleri secilip tekrar calistirilmalidir.

select 'COMMENT ON COLUMN XXXXXXXE.'||table_name||'.'||column_name||' IS '||''''||'ZZZZZZZZZZ'||''''||';'
from dba_col_comments where owner='XXXXXXXX' and comments is null
and column_name='QQQQQQQQ'

/* ### schema'ya ait tablolarin index kullanılip/kullanmadiginin monitor edilmesi ###
/* ### sql cumlecikleri calistikca tablolara ait indexleri kullanirsa indexin monitor degeri YES olur. Boylece o indexin kullanilmis oldugunu anlasilir.

-- scheman'in indexlerinin cikartilmasi ve toplu olarak acilmasi(schemaadi yerine sizin schema adini girmelisiniz)
select 'alter index schemaadi.'||index_name||' monitoring usage;' from dba_indexes where owner=schemaadi order by table_name;

-- monitor'Un acilmasi tek bir index icin (index.adi yerine istediginiz indexin adini giriniz)
alter index "index.adi" monitoring usage;

-- izlenmesi ((schemaadi yerine sizin schema adini girmelisiniz)
select * from v$object_usage where owner=schemaadi;

-- monitor'un kapatilmasi (index.adi yerine istediginiz indexin adini giriniz)
alter index "index.name" nomonitoring usage; /* ### table, index ve partition'larin toplam buyuklukleri
/* ### ozellikle partitionlarin buyukluklerini takip etmek icin kullanilir.

select segment_name,segment_type,bytes/1024 from dba_segments order by bytes desc /* ### Yanlis bir tablespace uzerinde acilan indexlerin dogru tablespace uzerinde rebuild edilmesi
/* ### HEDEFTS dogru tablespace adi
/* ### YANLISTS yanlis kullanilan tablespace adi.
/* ### SCMADI indexleri tasinacak scema adi.

select 'alter index '||owner||'.'||index_name||' rebuild tablespace HEDEFTS ;'
from dba_indexes
where tablespace_name='YANLISTS' and owner='SCHMADI' and index_type='NORMAL'
order by owner /* ### table ve index'lerin initrans değerinin yükseltilmesi
/* ### XXXXXX schemasina ait table ve indexlerin ini_trans degeri 250'den kucuk olanlarin secilmesi.
/* ### Asagidaki sql calistirildiktan sonra listelenen SQL cumlecikleri secilerek tekrar calistirilmalidir.

-- table's of schema
select 'alter table ' || owner || '.' ||table_name || ' initrans 255;'
from dba_tables
where owner in ('XXXXXX','') and ini_trans <250

-- index's of schema
select 'alter index ' || owner || '.' ||index_name || ' initrans 255;'
from dba_indexes
where owner in ('XXXXX','') and ini_trans <250
/* ### Index istatistik degerlerinin kontrol edilmesi.
/* ### Eger kayit sayisi fazla olan tablolarda indexli kolonlarda tekrar edilen deger 1000 den kucukse o zaman bu indexleri tekrar gozden gecirmek gerekir.
/* ### v$session.sid=XXXX session SID biliniyorsa yukaridaki deger yerine kullanilir.
/* ### XXXXXXXXX olarak schema adi girilmelidir.
/* ### burada tablolardaki kayit sayisi 1.000.000 dan fazla olanlar secilmektedir.

select c.TABLE_NAME,c.INDEX_NAME,c.column_name,s.DISTINCT_KEYS,s.NUM_ROWS
from dba_ind_columns c,dba_ind_statistics s,dba_tables t
where c.INDEX_OWNER='XXXXXXXX'
and c.index_NAME=s.index_NAME
and s.OWNER='XXXXXXXX'
and t.OWNER='XXXXXXXX'
and t.table_name=s.TABLE_NAME
and s.DISTINCT_KEYS<1000 and t.num_rows>1000000 and s.partition_name is null
order by 1,4 /* ### SQL PLUS uzerinden calisan sql'in execution plan bilgilerinin alinmasi (Bu ornek UNIX sistemler uzerinden verilmistir.)

-- 1. İzleme işlemini yapacak kullanıcının öncelikle bir PLAN_TABLE tablosuna sahip olması gerekir. Genellikle $ORACLE_HOME/rdbms/admin dizini altına yer alan utlxplan.sql script’i, izleme işlemini yapacak kullanıcı tarafından SQL*Plus’tan çalıştırılır.
SQL> @utlxplan

-- 2. İzlenecek sorgu SQL*Plus’tan aşağıdaki şekilde çalıştırılır.
SQL> explain plan
set statement_id=’MUSTERI’ for
select MUSTERI_ADI
from MUSTERI
where MUSTERI_NO=1;

-- 3. Plan, aşağıdaki sorgu ile görüntülenir.
SQL> select lpad(‘ ‘,2*(level-1)) || operation || ‘ ‘
|| options || ‘ ‘ || object_name || ‘ ‘ ||
Decode(id,0, ‘Cost = ‘ || position) “Query Plan”
from PLAN_TABLE
start with id=0 and
statement_id=’MUSTERI’
connect by prior id=parent_id
and statement_id=’MUSTERI’;
/* ### Index analiz edilmesi (SQL PLUS Uzerinden calistirilacaktir.)
/* ### XXXXXX ile schema adi ve "indexadi" ile analiz edilecek index girilmelidir.
/* ### Burada index'in %100 degeri kontrol edilecektir. istenirse bu deger %25, %50 olarak girilebilir.
/* ### Degree => 4 ile paralelizm 4 olarak set edilmistir. sistemdeki cpu sayisina bagli olarak 1,2,4,8 gibi degerler girilebilir.

BEGIN
SYS.DBMS_STATS.GATHER_INDEX_STATS (
OwnName => 'XXXXX'
,IndName => 'indexadi'
,Estimate_Percent => 100
,Degree => 4
,No_Invalidate => FALSE);
END;
/

-- ayni islemin daha basit ve default degerlerle yapiabilecek hali.
ANALYZE INDEX XXXXXX.indexadi COMPUTE STATISTICS ONLINE /