Session Cursor Cache hit vs. Soft Parses vs. Hard Parses


Jika Anda menjalankan query ini ke DataBase Oracle, Anda akan melihat perilaku sistem caching kursor yang oracle lakukan.

Jumlah dari ketiga nilai pada kolom harus 100%


select
to_char(100 * sess / calls, '999999999990.00') || '%' cursor_cache_hits,
to_char(100 * (calls - sess - hard) / calls, '999990.00') || '%' soft_parses,
to_char(100 * hard / calls, '999990.00') || '%' hard_parses
from
( select value calls from v$sysstat where name = 'parse count (total)' ),
( select value hard from v$sysstat where name = 'parse count (hard)' ),
( select value sess from v$sysstat where name = 'session cursor cache hits' )
/

Jika nilai dari kolom pertama adalah di bawah 80% maka Anda harus meningkatkan nilai parameter session_cached_cursors.

Audit Perubahan DDL pada Oracle


Audit perubahan dalam database menjadi lebih dan lebih penting, seperti halnya audit perubahan data. 
Hal ini memungkinkan DBA untuk tidak hanya mengetahui perubahan apa yang telah dibuat, tetapi juga apa yang tidak. 
Dengan melihat perubahan apa yang telah dibuat ke database dapat membuat debug lebih cepat. 
Solusi ini terdiri dari dua tabel, satu sequence dan satu trigger. 


TABLE DAN SEQUENCE

CREATE TABLE DDL_EVENTS
( EVENTID          NUMBER(10,0),
  EVENTDATE        DATE,
  ORALOGINUSER     VARCHAR2(30),
  ORADICTOBJNAME   VARCHAR2(30),
  ORADICTOBJOWNER  VARCHAR2(30),
  ORADICTOBJTYPE   VARCHAR2(30),
  ORASYSEVENT      VARCHAR2(30),
  MACHINE          VARCHAR2(64),
  PROGRAM          VARCHAR2(64),
  OSUSER           VARCHAR2(30) );
 
CREATE TABLE DDL_EVENTS_SQL
( EVENTID          NUMBER(10,0),
  SQLLINE          NUMBER(10,0),
  SQLTEXT          VARCHAR2(4000) );
 
CREATE SEQUENCE DSQ_DDLEVENTS START WITH 1000; 

Tabel DDL_EVENTS menyimpan data tentang peristiwa DDL 
• EVENTID        : Primary key yang dihasilkan oleh sequence. 
• EVENTDATE        : diisi dengan SYSDATE. 
• ORALOGINUSER    : login username diambil dari fungsi ORA_LOGIN_USER. 
• ORADICTOBJNAME    : Nama objek event diambil dari fungsi ORA_DICT_OBJ_NAME. 
• ORADICTOBJOWNER    : Pemilik dari objek event yang diambil dari fungsi ORA_DICT_OBJ_OWNER. 
• ORADICTOBJTYPE    : Jenis objek event diambil dari fungsi ORA_DICT_OBJ_TYPE. 
• ORASYSEVENT    : Jenis aktivitas, seperti Create, Alter, Drop. Diambil dari fungsi ORA_SYS_EVENT. 
• MACHINE         : Nama mesin peristiwa dikeluarkan dari. Diambil dari V_ $ sesi. 
• PROGRAM        : Nama program gunakan untuk mengeluarkan perintah. Diambil dari V_ $ sesi. 
• OSUSER        : Sistem operasi nama pengguna. Diambil dari V_ $ sesi. 

Tabel DDL_EVENTS_SQL menyimpan teks dari perintah SQL. Ini adalah tabel anak dengan EVENTID DDL_EVENTS menjadi kunci asing.
SQLLINE dan EVENTID dapat digunakan sebagai unik identifikasi sebuah record. 
• EVENTID    : Link ke ddl_events 
• SQLLINE    : Jalur jumlah perintah yang dijalankan 
• SQLTEXT    : Sebuah baris teks perintah sql. Diambil dari fungsi ORA_SQL_TXT. 

TRIGGER 

CREATE OR REPLACE TRIGGER DTR_DDLEVENTS
AFTER DDL ON DATABASE
DECLARE
  L_EVENTID    NUMBER(10,0);
  L_SQLTEXT    ORA_NAME_LIST_T;
BEGIN
IF (ORA_LOGIN_USER <> ‘SYS’ AND ORA_LOGIN_USER IS NOT NULL) THEN
BEGIN
  SELECT DSQ_DDLEVENTS.NEXTVAL INTO L_EVENTID FROM SYS.DUAL;
  INSERT INTO DDL_EVENTS
  ( SELECT L_EVENTID,
           SYSDATE,
           ORA_LOGIN_USER,
           ORA_DICT_OBJ_NAME,
           ORA_DICT_OBJ_OWNER,
           ORA_DICT_OBJ_TYPE,
           ORA_SYSEVENT,
           MACHINE,
           PROGRAM,
           OSUSER
      FROM SYS.DUAL,
           SYS.V_$SESSION
     WHERE SYS_CONTEXT(‘USERENV’,’SESSIONID’ ) = AUDSID(+) );
  FOR L IN 1..ORA_SQL_TXT(L_SQLTEXT) LOOP
    INSERT INTO DDL_EVENTS_SQL
    ( EVENTID, SQLLINE, SQLTEXT )
    VALUES
    ( L_EVENTID, L, L_SQLTEXT(L) );
  END LOOP;
END;
END IF;
END;
/
 

Audit perubahan DDL dimudahkan oleh Trigger DDL. Solusi ini menggunakan klausa AFTER DDL ON DATABASE klausa. 

Ini akan mengaudit semua perubahan yang dibuat pada database. 

Jika Anda hanya ingin mengaudit skema tertentu maka gunakan klausa AFTER DDL ON SCHEMA sebagai gantinya. 

Trigger memasukkan data ke dalam ke dalam tabel DDL_EVENTS dengan data dari built-in functions and the v_$session view. 

Outer join pada the v_$session view memungkinkan bulti-in functions untuk tetap mengisi untuk background processes.


Tabel DDL_EVENTS_SQL kemudian diisi oleh fungsi ORA_SQL_TXT. loop di tabel DDL_EVENTS_SQL untuk setiap baris pernyataan. 

VARIASI 

Jika audit database terlalu banyak, satu skema dapat diaudit dengan menggunakan AFTER DDL ON SCHEMA di tempat AFTER DDL ON DATABASE. 
Jika audit teks sql memberi terlalu banyak data, kode ini dapat dengan mudah dihapus, atau dimodifikasi sehingga 4.000 karakter pertama dimasukkan ke dalam tabel DDL_EVENTS. 
Teks sql diatas sudah termasuk audit untuk perubahan password. Sebagai password sensitif Anda mungkin ingin menyembunyikan itu dari log. Anda dapat melakukan ini dengan memodifikasi teks sql loop seperti di bawah ini. 


   FOR L IN 1..ORA_SQL_TXT(L_SQLTEXT) LOOP
    IF  ORA_DICT_OBJ_TYPE = ‘USER’
    AND INSTR(UPPER(L_SQLTEXT(L)),’IDENTIFIED BY’) != 0
    THEN
      L_SQLTEXT(L) := SUBSTR(L_SQLTEXT(L),1,INSTR(UPPER(L_SQLTEXT(L)),’IDENTIFIED BY’)+13)||’*’;
    END IF;
    INSERT INTO DDL_EVENTS_SQL
    ( EVENTID, SQLLINE, SQLTEXT )
    VALUES
    ( L_EVENTID, L, L_SQLTEXT(L) );
  END LOOP;

Pernyataan tambahan jika pengguna memeriksa pernyataan-pernyataan yang berisi klausa IDENTIFIED BY, teks di sebelah kanan klausa kemudian digantikan dengan tanda bintang. 

Rename Oracle SID


Some of my fellows ask me how to change the oracle SID. For those who never done these steps see that this is a difficult thing, but it’s quite simple though.

1. Login as sysdba
[ora9i@training01 ~]$ sqlplus “/ as sysdba”
SQL*Plus: Release 9.2.0.4.0 – Production on Mon Nov 13 16:23:56 2006
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.4.0 – Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 – Production

2. Note the user dump directory
SQL> show parameter user_dump
NAME TYPE VALUE
———————————— —————————————–
user_dump_dest string /apps/ora9i/OraHome1/admin/ora
sid/udump

3. Switch logfile several times using the following command.
SQL> alter system switch logfile;
SQL> alter system switch logfile;
SQL> alter system switch logfile;

4. Create the basic SQL script for renaming the SID.
SQL> alter database backup controlfile to trace;
Database altered.

5. Shutdown the database
SQL> shutdown
SQL> exit

6. Find the file created from step 4 in directory in step 2, and rename it to appropriate name.
[ora9i@training01 ~]$ cd /apps/ora9i/OraHome1/admin/orasid/udump
[ora9i@training01 ~]$ ls –ltr
-rw-r—– 1 ora9i dba 1617 Nov 3 16:05 oldsid_ora_7120.trc
-rw-r—– 1 ora9i dba 1617 Nov 3 16:08 oldsid_ora_7837.trc
-rw-r—– 1 ora9i dba 1617 Nov 3 16:13 oldsid_ora_3482.trc
-rw-r—– 1 ora9i dba 1616 Nov 3 16:16 oldsid_ora_4412.trc
-rw-r—– 1 ora9i dba 1617 Nov 3 17:59 oldsid_ora_1818.trc
-rw-r—– 1 ora9i dba 3284 Nov 6 11:31 oldsid_ora_1770.trc
-rw-r—– 1 ora9i dba 7095 Nov 13 21:52 oldsid_ora_32410.trc
[ora9i@training01 ~]$ mv oldsid_ora_32410.trc renameorasid.sql

7. Delete unwanted lines and update as necessary, the result appears as below. Please notify the one in bold.
[ora9i@training01 ~]$ vi renameorasid.sql
CREATE CONTROLFILE set DATABASE “orasid” RESETLOGS NOARCHIVELOG
— SET STANDBY TO MAXIMIZE PERFORMANCE
MAXLOGFILES 5
MAXLOGMEMBERS 5
MAXDATAFILES 100
MAXINSTANCES 1
MAXLOGHISTORY 453
LOGFILE
GROUP 1 (
‘/apps/ora9i/OraHome1/database/datafiles/orasid/logg1m1orasid.log’,
‘/apps/ora9i/OraHome1/database/datafiles/orasid/logg1m2 orasid.log’
) SIZE 8M,
GROUP 2 (
‘/apps/ora9i/OraHome1/database/datafiles/orasid/logg2m1orasid.log’,
‘/apps/ora9i/OraHome1/database/datafiles/orasid/logg2m2orasid.log’
) SIZE 8M,
GROUP 3 (
‘/apps/ora9i/OraHome1/database/datafiles/ orasid/logg3m1orasid.log’,
‘/apps/ora9i/OraHome1/database/datafiles/orasid/logg3m2orasid.log’
) SIZE 8M
— STANDBY LOGFILE
DATAFILE
‘/apps/ora9i/OraHome1/database/datafiles/orasid/systemorasid.dbf’,
‘/apps/ora9i/OraHome1/database/datafiles/ orasid/undoorasid.dbf’,
‘/apps/ora9i/OraHome1/database/datafiles/orasid/exampleorasid.dbf’,
‘/apps/ora9i/OraHome1/database/datafiles/ orasid/toolsorasid.dbf’,
‘/apps/ora9i/OraHome1/database/datafiles/orasid/userorasid.dbf’
CHARACTER SET US7ASCII
;

8. Create/move directories and rename the datafiles.
[ora9i@training01 ~]$ mkdir -p /apps/ora9i/OraHome1/admin/orasid
[ora9i@training01 ~]$ mkdir /apps/ora9i/OraHome1/admin/orasid /cdump
[ora9i@training01 ~]$ mkdir /apps/ora9i/OraHome1/admin/orasid/udump
[ora9i@training01 ~]$ mkdir /apps/ora9i/OraHome1/admin/orasid/bdump
[ora9i@training01 ~]$ cd /apps/ora9i/OraHome1/database/datafiles/
[ora9i@training01 ~]$ mv oldsid orasid
[ora9i@training01 ~]$ cd orasid
[ora9i@training01 ~]$ mv logg1m1oldsid.log logg1m1orasid.log
[ora9i@training01 ~]$ mv logg1m2oldsid.log logg1m2orasid.log
[ora9i@training01 ~]$ mv logg2m1oldsid.log logg2m1orasid.log
[ora9i@training01 ~]$ mv logg2m2oldsid .log logg2m2orasid.log
[ora9i@training01 ~]$ mv logg3m1oldsid.log logg3m1orasid.log
[ora9i@training01 ~]$ mv logg3m2oldsid.log logg3m2orasid .log
[ora9i@training01 ~]$ mv systemoldsid.dbf systemorasid.dbf
[ora9i@training01 ~]$ mv undooldsid.dbf undoorasid.dbf
[ora9i@training01 ~]$ mv example oldsid.dbf exampleorasid.dbf
[ora9i@training01 ~]$ mv toolsoldsid.dbf toolsorasid.dbf
[ora9i@training01 ~]$ mv useroldsid.dbf user orasid.dbf
[ora9i@training01 ~]$ mv tempoldsid.dbf temporasid.dbf

9. Update initialization parameter file
[ora9i@training01 ~]$ cd /apps/ora9i/OraHome1/dbs/
[ora9i@training01 ~]$ vi initorasid.ora
*.compatible=’9.2.0.0.0′
*.control_files=’/apps/ora9i/OraHome1/database/datafiles/orasid/control1orasid.ctl’,’/apps/ora9i/OraHome1/database/datafiles/ orasid/control2orasid.ctl’,’/apps/ora9i/OraHome1/database/datafiles/orasid/control3orasid.ctl’
*.core_dump_dest=’/apps/ora9i/OraHome1/admin/orasid /cdump’
*.user_dump_dest=’/apps/ora9i/OraHome1/admin/orasid/udump’
*.background_dump_dest=’/apps/ora9i/OraHome1/admin/orasid/bdump’
*.db_block_size=8192
*.db_cache_size=134217728
*.db_domain=”
*.db_file_multiblock_read_count=32
*.db_files=1024
*.db_name=’orasid’
*.dml_locks=500
*.fast_start_mttr_target=300
*.global_names=FALSE
*.instance_name=’ orasid’
*.java_pool_size=52428800
*.job_queue_processes=2
*.log_buffer=1048576
*.max_dump_file_size=’10240′
*.max_enabled_roles=48
*.open_cursors=400
*.os_authent_prefix=”
*.processes=150
*.remote_login_passwordfile=’NONE’
*.remote_os_authent=TRUE
*.shared_pool_size=54525952
*.sort_area_size=524288
*.undo_management=’AUTO’
*.undo_tablespace=’UNDOTBS’
*.utl_file_dir=’*’

9. Create password file
[ora9i@training01 ~]$ cd /apps/ora9i/OraHome1/dbs/
[ora9i@training01 ~]$ orapwd file=orapw password=o entries=10

10. Update the environment file in ora9i home directory, and then relogin
[ora9i@training01 ~]$ cd ~
[ora9i@training01 ~]$ vi .login
setenv ORACLE_SID orasid
setenv ORACLE_OWNER ora9i
setenv ORACLE_BASE /apps/ora9i
setenv ORACLE_HOME ${ORACLE_BASE}/OraHome1

11. Running the script.
[ora9i@training01 ~]$ sqlplus “/ as sysdba”
SQL> startup nomount
SQL> @renameorasid.sql
SQL> recover database using backup controlfile;
SQL> alter database open resetlogs;
SQL> alter database rename global_name to orasid;

12. Restart the database
[ora9i@training01 ~]$ sqlplus “/ as sysdba”
SQL> shutdown
SQL> startup

13. Setting up the client
[ora9i@training01 ~]$ cd /apps/ora9i/OraHome/network/admin
[ora9i@training01 ~]$ vi tnsadmin.ora
orasid =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orasid)
)
)

You see that the main steps are step 4 and 7, which create the script and rename.
Okay, you’re now ready with your new name of the database instance. Good luck.