ORA-01034:ORACLE not available

21 01 2009

Error berikut keluar saat kemarin coba login SQLPLUS, mungkin ada yang pernah ngalamin kaya gini :

ERROR:
ORA-01034:ORACLE not available
ORA-27101:Shared memory realm does not exist

Berikut mungkin beberapa hal yang bisa saya share soal hal ini. Penyebab dari error ORA-01034 adalah karena SGA membutuhkan space lebih daripada yang dialokasikan sekarang, juga krn variabel dari OS yang mengarah ke instance tidak sesuai. Kemudian penyebab ORA-27101 Shared memory realm does not exist adalah karena oracle tidak dapat mengalokasikan shared memory realm didatabase.

Kemungkinan yang terjadi bisa salah satu dari hal berikut :
1. Karena kita merubah parameter didatabase ( bisa ukuran SGA atau parameter lain yang berkaitan)
2. Pointer instance database belum diset (ORACLE_SID)
Jika memang penyebabnya adalah karena salah satu hal diatas maka selanjutnya kita perlu melakukan proses berikut. Apabila kita menggunakan Windows OS kita masuk command prompt lalu gunakan command berikut

set ORACLE_SID = ORCL –ubah sesuai nama SID.
set LOCAL=ORCL –ubah sesuai nama SID.

Jika kita menggunakan UNIX, gunakan command berikut

export ORACLE_SID=ORCL –ubah sesuai nama SID.
export LOCAL=ORCL –ubah sesuai nama SID.

Kemudian kita bisa coba connect kembali, semisal memang belum bisa lakukan langkah berikut.
Buka file sqlnet.ora, file ini ada di %ORA_HOME% /network/ADMIN/sqlnet.ora dan rubah pada baris berikut

SQLNET.AUTHENTICATION_SERVICES=(NTS)
ubah menjadi
SQLNET.AUTHENTICATION_SERVICES=(NONE)

Setelah itu restart database service, dan problem should be solve..





Problem to Install Oracle Business Intelligence release 10.1.3.4

7 01 2009

Kali ini saya nemuin problem setelah selesai jalanin instalasi Oracle BI EE untuk release 10.1.3.4 dalam basic mode. Semua berjalan baik2 saja sampai saat mau jalanin ‘Oracle BI Interactive Dashboards’ dimenu BI Welcome page. keluar problem seperti berikut:

oracle.jsp.provider.JspCompileException :

Erreurs de compilation

c:\OracleBI\oc4j_bi\j2ee\home\application-deployments\analytics\analytics\persistence\_pages\_default.java

Could not create the java virtual machine

.

dan diprompt OC4J, keluar seperti ini

Error occured during initialization of VM
Could not reserve enough space for object heap

Diforum sempet dapet info kalau OS yang kita pake antivirus KASPERSKY, maka harus diuninstal KASPERSKYnya , bukan cuma disable tapi uninstal. Problem ini kemungkinan menyangkut dalam proses create java virtual machine, ga tau pastinya dimana, mungkin salah satu konfigurasi yang ada aplikasi kasperskynya.

nah solusinya yang bisa kita lakukan, ada input <java-compiler> di file server.xml yang sepertinya merupakan parameter untuk melakukan kompilasi file source yang digenerate oleh appserver untuk file JSP. File ini kalau kita menggunakan Windows OS ada di ‘C:\OracleBI\oc4j_bi\j2ee\home\config’. Dalam kasus ini terdapat ‘opsi’ atribut yang berupa “-J-Xmx1024m -encoding UTF8″. Kita hanya merubah atribut ini ke “-J-Xms256m -J-Xmx256m -encoding UTF8″ dan masalah teratasi..

btw, mungkin bagi sebagian temen2 yang belum tahu apa itu Business Intelligence (BI) mungkin postingan berikutnya kita jabarin apa itu BI..





Oracle Basic [ non-partition table into partitioned table ]

12 12 2008

Oracle basic, Bagaimana cara ngerubah tabel non-partisi ke tabel berpartisi, berikut beberapa cara yang biasa digunakan: A. Metode Export/Import B. Insert dengan metode sub-query C. metode Partition exchange. Metode2 berikut akan membuat sebuah tabel partisi dari tabel yang sebelumnya belum dipartisi. Sekarang kita umpamakan tabel EMP adalah sebuah tabel non-partisi.

A. Metode Export/import

1) Export tabel EMP non-partisi:

exp username/password tables=emp file=emp_export.dmp log=emp_export.log

2) Drop table EMP:

DROP TABLE EMP CASCADE CONSTRAINTS PURGE;

3) Recreate tabel EMP dengan partisi:

create table EMP (
empo number(3),
name varchar2(15))
partition by range (qty)
(
partition p1 values less than (501),
partition p2 values less than (maxvalue)
);

4) Import tabel dengan gunakan parameter ignore=y:

imp user/password file=emp_export.dmp ignore=y

Parameter ignore=y akan membuat proses import skip pada proses create tabel dan melanjutkan meload semua data.

B. Insert dengan metode subquery

1) Create tabel partisi :

create table EMP_PART (
empo number(3),
name varchar2(15))
partition by range (qty)
(
partition p1 values less than (501),
partition p2 values less than (maxvalue)
);

2) Insert data kedalam tabel yang sudah kita create dan berpartisi dengan subquery dari tabel non-partisi:

insert into EMP_TEMP (qty, name) select * from EMP

Note: EMP adalah tabel non-partisi.

3) Selanjutnya kita ubah tabel yang sudah berpartisi sehingga mempunyai nama yang sama dengan tabel yang

original, DROP tabel original dan rename tabel baru yang sudah berpartisi:

DROP TABLE EMP CASCADE CONSTRAINTS PURGE;

alter table EMP_TEMP rename to EMP;

C. Metode Partition Exchange ALTER TABLE EXCHANGE PARTITION dapat digunakan untuk convert sebuah partisi atau

subpartisi ke tabel non-partisi dan dari tabel non-partisi ke tabel partisi atau subpartisi dari tabel partisi

dengan exchange data dan index segment.

1) “Create table dummy_temp as select …” dengan partisi yang kita perlukan

2) Kemudian lakukan alter table EXCHANGE partition with tabel dummy yang kita create ;

SQL> CREATE TABLE p_emp
2 (sal NUMBER(7,2))
3 PARTITION BY RANGE(sal)
4 (partition emp_p1 VALUES LESS THAN (2000),
5 partition emp_p2 VALUES LESS THAN (4000));

Table created.

SQL> SELECT * FROM emp;

EMPNO ENAME JOB MGR HIREDATE SAL
——— ———- ——— ——— ——— ———
7369 SMITH CLERK 7902 17-DEC-80 800 7499 ALLEN SALESMAN 7698 20-FEB-81 1600
7521 WARD SALESMAN 7698 22-FEB-81 1250 7566 JONES MANAGER 7839 02-APR-81 2975
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 7698 BLAKE MANAGER 7839 01-MAY-81 2850
7782 CLARK MANAGER 7839 09-JUN-81 2450 7788 SCOTT ANALYST 7566 19-APR-87 3000
7839 KING PRESIDENT 17-NOV-81 5000 7844 TURNER SALESMAN 7698 08-SEP-81 1500
7876 ADAMS CLERK 7788 23-MAY-87 1100 7900 JAMES CLERK 7698 03-DEC-81 950
7902 FORD ANALYST 7566 03-DEC-81 3000 7934 MILLER CLERK 7782 23-JAN-82 1300

14 rows selected.

SQL> CREATE TABLE dummy_y as SELECT sal FROM emp WHERE sal<2000;

Table created.

SQL> CREATE TABLE dummy_z as SELECT sal FROM emp WHERE sal BETWEEN 2000 AND 3999;

Table created.

SQL> alter table p_emp exchange partition emp_p1 with table dummy_y;

Table altered.

SQL> alter table p_emp exchange partition emp_p2 with table dummy_z;

Table altered





Oracle 11g [ Access Control Lists for UTL_TCP/HTTP/SMTP ]

4 12 2008

utl_tcp, utl_http dan utl smtp adalah yang menghubungkan antara server diluar lingkungan database.utl_tcp adalah berguna untuk melakukan
koneksi TCP/IP diantara 2 host, tidak lewat penghubung database. Utl_http berguna untuk request http dari sebuah webserver dan utl_smtp untuk koneksi smtp mail antar host. Tool-tool ini memiliki celah keamanan yang besar. Menggunakan utl_tcp seorang user database bisa connect ke mesin lain yang dekat dari host tsb tanpa harus melewati system prompt.

Oracle 11g mempunyai solusi baru , kita dapat memberi grant untuk mengeksekusi privilege package ke semua orang tapi bisa menentukan resource mana yang dapat mereka panggil. Mudahnya utl_tcp dapat membatasi dalam memanggil hanya untuk beberapa IP address saja. Dan Mekanisme ini disebut Access Control List (ACL). Jika host ada didaftar ACL maka user bisa menggunakan utl_tcp. Beberapa eksekusi privillege di utl_tcp tidak cukup, meskipun begitu tidak mungkin proses dari luar mengambil alih utl_tcp package dan membuat koneksi yang tidak diperkenankan.

Cara kerjanya adalah sebagai berikut, kita create dahulu sebuah Access List

begin
dbms_network_acl_admin.create_acl (
acl => ‘utlpkg.xml’,
description => ‘Normal Access’,
principal => ‘CONNECT’,
is_grant => TRUE,
privilege => ‘connect’,
start_date => null,
end_date => null
);
end;

Ini adalah parameter principal : ‘CONNECT’ berarti bahwa ACL bisa melakukan koneksi role, kita bisa mendefinisikan user atau role disini.
ACL dibuat sebagai file bernama utlpkg.xml

Setelah dibuat kita cek apakah ACL sudah ada

SELECT any_path
FROM resource_view
WHERE any_path like ‘/sys/acls/%.xml’;

Keluarannya adalah

ANY_PATH
—————————————————————————-
/sys/acls/ANONYMOUS/ANONYMOUS3553d2be53ca40e040a8c0680777c_acl.xml
/sys/acls/OLAP_XS_ADMIN/OLAP_XS_ADMIN3551b25f93feb8dde040a8c068075b7_acl.xml
/sys/acls/OLAP_XS_ADMIN/OLAP_XS_ADMIN3551b25f944b8dde040a8c068075b7_acl.xml
/sys/acls/OLAP_XS_ADMIN/OLAP_XS_ADMIN3551b25f948b8dde040a8c068075b7_acl.xml
/sys/acls/OLAP_XS_ADMIN/OLAP_XS_ADMIN3551b25f94cb8dde040a8c068075b7_acl.xml
/sys/acls/all_all_acl.xml
/sys/acls/all_owner_acl.xml
/sys/acls/bootstrap_acl.xml
/sys/acls/ro_all_acl.xml
/sys/acls/ro_anonymous_acl.xml
/sys/acls/utlpkg.xml

Ada pada baris terakhir, ACL yang tadi dibuat. Selanjutnya kita ADD sebuah privilege ke ACL ini. Sebagai contoh kita coba membatasi ACL ini ke user SCOTT
Kita juga bisa menambahkan tanggal awal dan akhir.

begin
dbms_network_acl_admin.add_privilege (
acl => ‘utlpkg.xml’,
principal => ‘SCOTT’,
is_grant => TRUE,
privilege => ‘connect’,
start_date => null,
end_date => null);
end;

Tambahkan host dan detail tambahan yang menuju ACL ini

begin
dbms_network_acl_admin.assign_acl (
acl => ‘utlpkg.xml’,
host => ‘www.pratesis.com’,
lower_port => 22,
upper_port => 55);
end;

Disini kita coba menspesifikan bahwa “user SCOTT hanya dapat memanggil host www.pratesis.com dan hanya lewat port 22 sampai 55 dan tidak diluar ini”

SQL> grant execute on utl_http to scott

Grant succeeded.

SQL> conn scott/tiger
Connected.
SQL> select utl_http.request(‘http://www.pratesis.com’) from dual;
select utl_http.request(‘http://www.pratesis.com’) from dual
*
ERROR at line 1:
ORA-29273: HTTP request failed
ORA-06512: at “SYS.UTL_HTTP”, line 1577
ORA-24247: network access denied by access control list (ACL)
ORA-06512: at line 1

Kita lihat bahwa error 24247 : network access denied by access control list (ACL)
sedangkan user memanggil http pada port 80 , dimana itu diluar port antara 22-55 . Sehingga aksi tersebut diblock
Sekarang kita buat rule agar koneksi tersebut tidak dicegah

1 begin
2 dbms_network_acl_admin.assign_acl (
3 acl => ‘utlpkg.xml’,
4 host => ‘www.pratesis.com’,
5 lower_port => 1,
6 upper_port => 10000);
7* end;
8 /

PL/SQL procedure successfully completed.

SQL> conn scott/tiger
Connected.
SQL> select utl_http.request(‘http://www.pratesis.com’) from dual;

UTL_HTTP.REQUEST(‘HTTP://WWW.PRATESIS.COM’)
—————————————————————————
</iframe><!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN”>

<HTML><HEAD><TITLE>Pratesis Home</TITLE>
<META http-equiv=Content-Language content=en-us>

Tapi ini hanya bekerja untuk www.pratesis.com , tidak dengan situs lain. Jika kita coba memanggil situs lain maka akan muncul pesan kesalahan
ORA 24247 lagi.

Untuk melihat detail dari ACL, kita query DBA_NETWORK_ACLS

select host, lower_port, upper_port, acl, aclid
from dba_network_acls
where ACL=’/sys/acls/utlpkg.xml’;

Dan ini adalah salah satu fitur security terbaru yang dari Oracle 11g yang bener2 sangat “improvement”.





Failure when initializing OCR

28 11 2008

Kemarin ada problem pas coba instal Oracle Database di tempat client, OS yang dipake adalah Windows Server 2003, Oracle Database yang diinstal adalah Oracle Database versi 10.1.0.2 Saat proses instalasi berlangsung keluar pesan error :

Failure when initializing OCR..

Kemudian, error kedua yang muncul :

install program cannot initialize service
OracleCSService..

Solusi buat ngatasi hal ini pertama kita harus pastikan saat kita melakukan instalasi kita menggunakan user administrator (Local Admin), atau jadikan user kita jadi member dari group Administrators dan ORA_DBA. Kalau untuk solusi cepat untuk menghindari problem ini kita bisa langsung lakukan instalasi gunakan Oracle Database versi 10.1.0.3 atau langsung ke 10.2.0.1 yaitu versi diatas 10.1.0.2

Oracle CS Service biasanya digunakan apabila kita menggunakan RAC atau ASM. Jika kita hanya menggunakan komputer standalone dan tidak mengunakan ASM, kita bisa seting manual service ini. Apabila kita tetap mau melakukan instalasi dengan menggunakan Oracle Database versi 10.1.0.2 maka kita harus melakukan patching saat proses instalasi berlangsung. Kalau dari Oracle metalink kita bisa search patch ini dengan code 3555863 file ini berisi orahasgen10.dll dan orahasgen10.sym

Jadi saat proses instalasi berlangsung, saat keluar pops up OCR error kita perlu untuk copy file orahasgen10.dll dari patch 3555863 yang kita download ke direktori %ORACLE_HOME%\bin. Buat backup copy file orahasgen10.dll yang lama.
Setelah ini jangan langsung continue pada error tadi. Buka command prompt dan jalankan :

“clscfg -local -o %ORACLE_HOME% -l NA”

Kemudian masih di command prompt jalankan :

“net start oraclecsservice”

Kemudian klik untuk continue pada dialog error untuk melanjutkan proses instalasi .

Hope it can help.





Oracle 11g [ Virtual Column ]

19 11 2008

Semisal sebuah tabel SALES dengan struktur sebagai berikut

SALES_ID NUMBER
CUST_ID NUMBER
SALES_AMT NUMBER

User akan menambah kolom SALE_CATEGORY, yang akan mengidentifikasi tipe penjualan : LOW, MEDIUM, HIGH dan ULTRA tergantung jumlah penjualan
kolom ini akan membantu mengidentifikasi record untuk analisa. Berikut logika untuk nilai kolomnya

If sale_amt is more than: And sale_amt is less than or equal to: Then sale_category is:

Apabila kita tidak akan merubah code dengan menambah kolom sale_category di tabel, dan membuat triger untuk membuat logika yang kita perlukan,
Di Oracle 11g kita tidak perlu membuat sebuah triger. Yang kita perlukan adalah menambah sebuah virtual column. Virtual Column menawarkan
fleksibilitas untuk menambah kolom yang memenuhi permintaan bisnis tanpa menambah kompleksitas atau mempengaruhi performance
Berikut Querynya

SQL> create table sales
2 (
3 sales_id number,
4 cust_id number,
5 sales_amt number,
6 sale_category varchar2(6)
7 generated always as
8 (
9 case
10 when sales_amt <= 10000 then ‘LOW’
11 when sales_amt > 10000 and sales_amt <= 100000 then ‘MEDIUM’
12 when sales_amt > 100000 and sales_amt <= 1000000 then ‘HIGH’
13 else ‘ULTRA’
14 end
15 ) virtual
16 );

Kita perhatikan pada baris 6-7 , kolom dispesifikasikan sebagai “generated always as”, berarti nilai kolom digenerate dalam runtime(saat diakses), tidak
sebagai bagian dari table. Klausa tsb diikuti bagaimana nilai akan dihitung dengan memakai pernyataan CASE. Dan baris 15 berarti menunjukkan bahwa
itu adalah sebuah kolom virtual. Sekarang jika kita insert sebuah data.

SQL> insert into sales (sales_id, cust_id, sales_amt) values (1,1,100);

1 row created.

SQL> insert into sales (sales_id, cust_id, sales_amt) values (2,102,1500);

1 row created.

SQL>insert into sales (sales_id, cust_id, sales_amt) values (3,102,100000);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from sales;

SALES_ID CUST_ID SALES_AMT SALE_C
———- ———- ———- ——
1 1 100 LOW
2 102 1500 LOW
3 102 100000 MEDIUM

3 rows selected.

Nilai dalam virtual column di perlakukan seperti biasa.Meskipun kolom ini tidak disimpan, kita bisa mengakses kolom ini seperti kolom lain ditabel
Kita jg dapat membuat index didalamnya

SQL> create index in_sales_cat on sales (sale_category);

Index created.

Hasilnya adalah berupa function-based index

SQL> select index_type
2 from user_indexes
3 where index_name = ‘IN_SALES_CAT’;

INDEX_TYPE
—————————
FUNCTION-BASED NORMAL

SQL> select column_expression
2 from user_ind_expressions
3 where index_name = ‘IN_SALES_CAT’;

COLUMN_EXPRESSION
——————————————————————————–
CASE WHEN “SALES_AMT”<=10000 THEN ‘LOW’ WHEN (“SALES_AMT”>10000 AND “SALES_AMT”
<=100000) THEN CASE WHEN “CUST_ID”<101 THEN ‘LOW’ WHEN (“CUST_ID”>=101 AND “CUS
T_ID”<=200) THEN ‘MEDIUM’ ELSE ‘MEDIUM’ END WHEN (“SALES_AMT”>100000 AND “SALES
_AMT”<=1000000) THEN CASE WHEN “CUST_ID”<101 THEN ‘MEDIUM’ WHEN (“CUST_ID”>=101
AND “CUST_ID”<=200) THEN ‘HIGH’ ELSE ‘ULTRA’ END ELSE ‘ULTRA’ END

Kita juga dapat melakukan partisi pada kolom ini, yang tidak dapat kita lakukan adalah memasukkan nilai ke kolom ini, semisal

insert into sales values (5,100,300,’HIGH’,'XX’)
*
ERROR at line 1:
ORA-54013: INSERT operation disallowed on virtual columns





Oracle 11g [ DDL Wait Option ]

17 11 2008

Contoh kasus, semisal tabel SALES akan ditambah kolom, TAX_CODE, dengan menggunakan pernyataan SQL sebagai berikut

SQL> alter table sales add (tax_code varchar2(10));

tapi ternyata tidak berhasil membuat table altered, keluar output sbg berikut

alter table sales add (tax_code varchar2(10))
*
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

Pesan kesalahan tsb menjelaskan bahwa tabel sedang digunakan sekarang, kemungkinan sedang terjadi transaksi, jadi tabel dikunci secara exclusive
Tentu saja row tidak akan di lock selamanya, saat sesi menjalankan commit, maka lock dirow tsb akan dilepas. Tapi sebelum periode unlock tsb terlalu lama
sesi lain mungkin update row lain dalam tabel tsb sehingga sedikit waktu untuk mendapat exclusive lock akan hilang. Dikebanyakan lingkungan bisnis,
waktu untuk lock tabel secara exclusive tidak terbuka secara periodic, dan DBA tidak bisa menjalankan perintah alter tepat diwaktu tsb.
Tentu saja dengan keadaan seperti itu , kita hanya bisa mengetik perintah yang sama berulang-ulang sampai mendapat exclusive lock.
Dalam Oracle 11g, Kita punya pilihan lebih baik, DDL Wait Option

SQL> alter session set ddl_lock_timeout = 10;

Session altered.

Sekarang saat pernyataan DDL dalam sebuah sesi tidak mendapat lock exclusive, ini tidak akan keluar error. Ini akan menunggu selama 10 detik.
Dalam waktu tsb , ini akan berulang-ulang menjalankan operasi DDL sampai sukses atau waktu habis. Saat kita jalankan perintah

SQL> alter table sales add (tax_code varchar2(10));

Pernyataan tersebut hang dan tidak keluar error sama sekali. Tapi pernyataan tsb tetap berjalan seperti sebuah program telepon yang mencoba
terus retry kenomer yang sibuk yang akan dihubungi. Fitur ini sangat membantu , kita jg bisa menjadikan ini sebagai default sehinggan kita tidak perlu
menjalankan ALTER SESSION tiap kali, jika kita menjalankan ALTER SYSTEM SET DDL_LOCK_TIMEOUT = 10 maka secara automatis sesi akan menunggu
selama periode yang kita tentukan selama proses DDL.





Oracle Basic [ Table Compression ]

17 11 2008

Oracle Basic [ Table Compression ]

Sistem yang kita develop sekarang hampir kebanyakan membutuhkan jumlah data yang sangat banyak dan pasti memerlukan beberapa tabel yang sangat besar. Ini tentu saja akan membutuhkan banyak space di disk kita. Untuk memanage kapasitas disk fitur tabel compression yang ada sejak Oracle 9i release 2 dapat menekan jumlah pemakaian disk space oleh tabel2 didatabase secara signifikan dan meningkatkan performance query di beberapa kasus.

Mekanisme kerja fitur ini adalah dengan mengeliminasi value untuk data yang terduplikasi yang ditemukan di tabel. Kompresi data bekerja di level database block. Saat tabel didefinisikan sebagai “compressed”, maka database akan memesan space dalam tiap database block untuk menyimpan single copy dari tiap data yang juga muncul di beberapa tempat selain block tersebut. Reserved space ini disebut dengan symbol table. Data yang di beri label untuk kompresi disimpan hanya di symbol table dan bukan di row databasenya sendiri. Bila data yang diberi label untuk kompresi muncul dirow database, maka row akan menyimpan sebuah pointer yang menuju ke data yang relevan di symbol table. Dan space yang akan dihemat datang dari proses eliminasi data yang sama yang ada ditabel. Efek dari kompresi tabel transparan kepada user atau developer aplikasi karena developer dapat mengakses tabel dengan cara yang sama terhadap tabel yang kita kompresi maupun tidak kita kompress. Jadi query SQL tidak perlu dirubah setelah kita putuskan untuk melakukan kompresi tabel. Kompresi tabel ini biasanya dimanage oleh DBA, dengan sedikit keterlibatan developer atau user.

Untuk membuat tabel kompresi, gunakan keyword COMPRESS di statement CREATE TABLE. berikut contohnya :

CREATE TABLE EMP (
ID NUMBER NOT NULL,
NAME VARCHAR2(50) NOT NULL,
SAL NUMBER NOT NULL,
JOIN_DATE DATE NOT NULL,
ADDRESS VARCHAR2(100)
) COMPRESS;

Sebagai alternatif kita bisa gunakan ALTER TABLE untuk merubah atribut kompresi dari tabel yang sudah ada.

ALTER TABLE EMP COMPRESS;

Untuk menentukan apakah sebuah tabel telah dibuat menggunakan COMPRESS, kita lihat diview data dictionary

USER_TABLES dan lihat dikolom COMPRESSION.

SELECT TABLE_NAME, COMPRESSION FROM USER_TABLES WHERE TABLE_NAME=’EMP’;

TABLE_NAME COMPRESSION
—————— ———–
EMP ENABLED

Atribut COMPRESS juga dapat kita definisikan pada level TABLESPACE, bisa saat kita CREATE TABLESPACE atau ALTER TABLESPACE bila kita lakukan pada tablespace yang sudah ada. Untuk menentukan apakah sebuah tablespace didefinisikan dengan COMPRESS, cek pada DBA_TABLESPACES pada kolom DEF_TAB_COMPRESSION.

SELECT TABLESPACE_NAME,DEF_TAB_COMPRESSION FROM DBA_TABLESPACES;

TABLESPACE_NAME DEF_TAB_COMPRESSION
————— ——————-
DATA_TS_01 DISABLED
INDEX_TS_01 DISABLED

Sebagai catatan bahwa saat kita menggunakan COMPRESS seperti diatas, kita tidak sebenarnya melakukan kompress data. Command diatas hanya memodifikasi seting dari data dictionary. Data tidak sebenarnya dikompres sampai kita load atau insert data ke dalam tabel. Selanjutnya untuk memastikan bahwa data sebenarnya telah dikompres, kita perlu menggunakan metode yang tepat untuk melakukan load atau insert kedalam tabel. Kompresi data hanya berperan selama proses load atau insert dengan menggunakan salah satu dari metode berikut :

1. SQL*Loader scr direct
2. INSERT dengan APPEND
3. Paralel INSERT
4. CREATE TABLE … AS SELECT

Dan jika kita tidak menggunakan metode load data atau INSERT yang tepat, maka data dalam tabel akan tetap tidak dikompres, meskipun tabel telah didefiniskan dengan atribut COMPRESS. Sebagai contoh jika kita menggunakan perintah INSERT biasa maka data tidak akan dikompress.

Pertanyaannya adalah, kapan kita gunakan Table Compression?
Seperti disebutkan diatas, data didalam tabel didefinisikan menggunakan COMPRESS hanya akan dikompres hanya jika data kita load menggunakan mode direct atau INSERT menggunakan append atau paralel mode. Data kita insert menggunakan pernyataan insert biasa akan tetap tidak dikompres. Dalam Online Transaction Processing (OLTP), data biasanya diinsert dengan insert biasa. Hasilnya, tabel ini tidak akan mendapat banyak keuntungan dengan menggunakan kompresi tabel. Table compression dapat bekerja maksimal dalam read-only table yang diload sekali tapi dibaca berkali-kali. Selain itu, update data dalam tabel yang terkompresi akan membutuhkan beberapa baris data untuk di uncompress terlebih dulu, yang mana akan menghilangkan tujuan dari kompresi.Sehingga tabel yang membutuhkan operasi update dengan frekuensi tinggi tidak cocok untuk dilakukan table compression.

Dan selanjutnya adalah mempertimbangkan efek dari delete pada baris data dalam penggunaan kompresi tabel. Saat kita melakukan delete sebuah data dalam suatu tabel yang dikompresi, database akan melepaskan space yang ditempati oleh baris data tsb diblok database. free space ini dapat digunakan kembali oleh operasi insert yang akan dilakukan kemudian.

Melakukan kompresi pada tabel yang sudah ada dan belum dikompres sebelumnya kita gunakan command berikut

ALTER TABLE EMP MOVE COMPRESS;

Kita bisa menggunakan pernyataan ALTER TABLE … MOVE untuk melakukan uncompress tabel.

ALTER TABLE EMP MOVE NOCOMPRESS;

Perhatikan bahwa operasi ALTER TABLE … MOVE mendapat lock EXCLUSIVE didalam tabel, yang mana akan mencegah semua operasi DML terhadap tabel tsb saat pernyataan dieksekusi.

Melakukan Kompresi pada tabel yang dipartisi

ALTER TABLE EMP MOVE PARTITION EMP3_03 COMPRESS;

Alasan sesungguhnya untuk menggunakan kompresi tabel adalah untuk menghemat space pada storage kita. Sebuah tabel dalam mode kompresi akan memakan lebih sedikit ruang di storage kita saat dibandingkan dengan tabel yang tidak terkompresi. Query terhadap tabel yang dikompres akan membutuhkan waktu yang lebih cepat, karena akan lebih sedikit membaca database block dalam prosesnya.





ORA-01562 dan ORA-01650

11 11 2008

Selagi kita jalanin update data yang lumayan gede error ini keluar, kebetulan kita jalanin update sekitar 8jt an data yang dipisah jadi beberapa query update, jadi tiap query paling ga jalanin update sekitar 2jt data.. berikut pesan errornya..

ORA-01562: failed to extend rollback segment
ORA-01650: unable to extend rollback segment RBS5 by 64 in tablespace RBS

ORA-01562: failed to extend rollback segment
hal ini berarti kita kehabisan space ditablespace yang berisi rollback segment. Dan ini berarti, kita mungkin mempunyai transaksi yang sangat besar yang menghabiskan semua space ditablespace. Yang bisa kita lakukan dalam kasus ini adalah cut down the size dari transaksi (dengan melakukan commit lebih banyak secara teratur) atau dengan solusi dibawah ini :

Solusi 1 :

Untuk menentukan nama dari roolback segment kita gunakan query berikut.

SELECT SEGMENT_NAME FROM DBA_ROLLBACK_SEGS WHERE SEGMENT_ID=<string> (string adalah nomor segment yang keluar di pesan error)

Kemudian gunakan command berikut untuk membuat rollback segment menjadi offline.

ALTER ROLLBACK SEGMENT <nama> OFFLINE;

Solusi 2 :

Naikkan nilai MAXEXTENTS di rollback segment dengan command berikut.

ALTER ROLLBACK SEGMENT <nama segment> STORAGE (MAXEXTENTS n);

dimana n adalah nilai integer yang buat menentukan seberapa besar kita mau menambah nilai maxextents. Kita juga bisa menggunakan MAXEXTENTS UNLIMITED disini.

Solusi 3 :

Atau jika kita mau menggunakan big rollback segment dan kita membuatnya dengan nilai yang tinggi buat INITIAL dan NEXT, dan mempunyai MAXEXTENTS yang tinggi juga kemudian menempatkannya ke dalam transaksi akan menyebabkan data rollback yang amat besar.

kita login sebagai SYS kemudian create big rollback segment terlebih dahulu

CREATE ROLLBACK SEGMENT <nama segment>
TABLESPACE <nama tablespace>
STORAGE (
INITIAL 512K
NEXT 512K
MAXEXTENTS UNLIMITED
);

Semisal rollback segment kita kita beri nama RBSBIG, sebelum kita lakukan update statement kita jalankan command

berikut ini:

SET TRANSACTION USE ROLLBACK SEGMENT RBSBIG;





ORA-01536 : space quota exceeded for tablespace

10 11 2008

Error ini terjadi saat kita melakukan insert ke dalam sebuah table dan gagal sehingga keluar pesan error sebagai berikut ORA-01536 : space quota exceeded for tablespace “<name>” tapi sebenarnya tablespace masih mempunyai space yang cukup. Kita jalankan ” grant unlimited tablespace to <username>” tapi masih keluar error yang sama.
Penyebabnya ternyata adalah karena terdapat dependency object ditabel tersebut. Melakukan Insert ditabel ini memerlukan update ke object lain yang terhubung ke table tsb, yang mana memerlukan quota yang tidak dapat dipenuhi oleh tablespace.

Solusi :

1. Cari object yang terhubung ke table tersebut.

select NAME,TYPE from dba_dependencies where REFERENCED_NAME=’table name’;

2. Apabila ketemu, kita cari owner dari object tersebut.

select OWNER,OBJECT_NAME from dba_objects where OBJECT_NAME=’dependant object name’;

3. Grant unlimited tablespace kepada user tersebut.

grant unlimited tablespace to <dependant object owner name>;

4. Sekarang kita bisa melakukan insert ke table tersebut.

That’s all..








Follow

Get every new post delivered to your Inbox.