Oracle DBA Code Examples
Oracle DBA Code Examples
List Dat abase failure possible reasons or scenarios and t he t ime required t o recover for each
reason.
Pl anni ng a Back up St r at egy Gui del i nes
I f possible, have your required backup files on disks (fast er t han t apes) .
Aut omat ically delet e obsolet e backups.
I f DML load makes it feasible, use increment al backups.
Page 236 Oracle DBA Code Examples
Ex ampl es of Back up Schedul es f or a Dat abase
/* Example 1 */
# you'll have: image copy of the database (L0),
# incremental backup L1
# Archived redo logs between current time and L0
RUN {
# apply L1 to the specified datafile images
RECOVER COPY OF DATABASE WITH TAG 'incr_update';
# create L0 datafile images (first time) then L1
BACKUP INCREMENTAL LEVEL 1 FOR RECOVER OF COPY WITH TAG 'incr_update'
DATABASE;
}
/* Example 2 */
# you'll have image copy of db L0, 3 L1s,
# archived log between current time and L0
# assumption: Size the flash recovery area so it holds three days worth of
incremental backups.
RUN
{
RECOVER COPY OF DATABASE TAG "whole_db_copy" UNTIL TIME 'SYSDATE-3';
BACKUP INCREMENTAL LEVEL 1
FOR RECOVER OF COPY WITH TAG "whole_db_copy" DATABASE;
}
Page 237 Oracle DBA Code Examples
User - Managed Back ups
Obt ai ni ng Dat abase Fi l e I nf or mat i on
SELECT name, status FROM v$datafile;
SELECT t.name tablespace, f.name datafile
FROM v$tablespace t, v$datafile f
WHERE t.ts# = f.ts#
ORDER BY t.name;
SELECT name FROM v$controlfile;
select member from V$LOGFILE
Mak i ng Whol e Cl osed Dat abase Back ups
# 1) shutdown the db
# 2) copy all db physical files: datafiles, control files, redo log files,
parameter file, password file, wallet file (if there's a one).
Ensure that the complete pathnames of the files are noted
#!/bin/ksh
ORACLE_SID=$1
export ORACLE_SID
export ORAENV_ASK=NO
BACKUP_DIR=/u02/app/oracle
. oraenv
sqlplus -s system/mypsswrd << EOF
SET HEAD OFF FEED OFF ECHO OFF TRIMSPOOL ON LINESIZE 200
SPOOL /u01/app/oracle/dba/cold_backup.ksh
SELECT 'cp ' ||file_name|| ' ${BACKUP_DIR}' from sys.dba_data_files;
SELECT 'cp ' ||name || ' ${BACKUP_DIR}' from V$controlfile;
SELECT 'cp ' ||member|| ' ${BACKUP_DIR}' from V$logfile;
SPOOL OFF;
EXIT;
EOF
# 3) open the db
Mak i ng a Whol e Open Back up
#!/bin/ksh
ORACLE_SID=$1
export ORACLE_SID
export ORACLE_ASK=NO
BACKUP_DIR=/u01/app/oracle/backup
export BACKUP_DIR
sqlplus -s "sys/sys_password as sysdba" << EOF
set linesize 200
set head off
set feed off
SPOOL /u01/app/oracle/dba/hot_backup.ksh
BEGIN
dbms_output.put_line ('alter database begin backup;');
for f1 in (select file_name fn from sys.dba_data_files)
Page 238 Oracle DBA Code Examples
loop
dbms_output.put_line( 'host cp '||f1.fn|| ' $BACKUP_DIR');
end loop;
dbms_output.put_line ('alter database end backup;');
dbms_output.put_line('alter database backup controlfile to '|| '
$BACKUP_DIR/control'|| ';');
dbms_output.put_line('alter system switch logfile;');
END;
/
SPOOL OFF;
EXIT
EOF
Mak i ng Tabl espace Back ups
# offline
ALTER TABLESPACE users OFFLINE;
copy datafiles
ALTER TABLESPACE users ONLINE;
# online
ALTER TABLESPACE sysaux BEGIN BACKUP;
copy datafiles
ALTER TABLESPACE sysaux END BACKUP;
Obt ai ni ng Backup St at us I nf or mat i on
SELECT * FROM v$backup;
Check i ng Dat af i l es Tak en as Back up
The ut ilit y checks only for logical corrupt ion below t he HWM.
dbv file=D:\ORACLE\ORADATA\ORA10G\USERS01.DBF blocksize=4096
dbv file=D:\ORACLE\ORADATA\ORA10G\USERS01.DBF blocksize=8192
Handl i ng Cr ash Bef or e User - Manged Backup Ends
#1) make sure that one or more datafiles left in online backup mode:
SELECT * FROM v$backup;
#2)
ALTER DATABASE END BACKUP;
#3)
SELECT * FROM v$backup;
#4)
ALTER DATABASE OPEN;
Page 239 Oracle DBA Code Examples
Back i ng up Cont r ol Fi l e
# create a text trace file:
ALTER DATABASE BACKUP CONTROLFILE TO TRACE
# binary copy of the control file
ALTER DATABASE BACKUP CONTROLFILE to 'c:\temp\controlfile.ctl'
Back i ng Up I ni t i al i zat i on Fi l es
# create pfile
CREATE SPFILE='/u01/oracle/dbs/test_spfile.ora' FROM
PFILE='/u01/oracle/dbs/test_init.ora'
# In Oracle 11g, write current values of instance parameters
CREATE PFILE FROM MEMORY;
CREATE SPFILE FROM MEMORY;
Page 240 Oracle DBA Code Examples
User - Managed Compl et e Recov er y
User - Managed Recover y i n NOARCHI VELOG Mode
#(1
SHUTDOWN ABORT
#(2
copy datafiles, control files and redo log files from backup location into the
original destinations
#(3
STARTUP
User - Managed Recover y i n NOARCHI VELOG Mode Wi t hout Redo Log Fi l e
#(1
SHUTDOWN IMMEDIATE
#(2
Restore the most recent whole database backup with operating system commands.
#(3 mimic incomplete recovery:
SQL>RECOVER DATABASE UNTIL CANCEL USING BACKUP CONTROLFILE;
SQL>CANCEL
#4)
SQL> ALTER DATABASE OPEN RESETLOGS;
User - Managed Compl et e Recover y i n ARCHI VELOG Mode
I f t he lost file is t he SYSTEM, UNDO or SYSAUX, t he dat abse will be most ly closed.
# Checking steps:
#Identifying datafiles that need recovery
SELECT * FROM v$recover_file;
SELECT file_id f#, file_name,
tablespace_name tablespace, status
FROM dba_data_files;
# Locating Archived Log Files to Apply
SELECT * FROM v$recovery_log;
#1) if the database is closed, open mount
STARTUP MOUNT
#2) make sure the datafile is offline
select file#, name , status from v$datafile;
ALTER DATABASE datafile '/disk2/data/df2.dbf' offline;
#3) restore the damaged or lost datafile using os commands
if it should be resotred in a new location:
Page 241 Oracle DBA Code Examples
ALTER DATABASE RENAME FILE '/ORADATA/u03/users01.dbf'
TO '/ORADATA/u04/users01.dbf';
#4) if archive redo log file are stored in location different from
log_archive_dest_n:
#4.1) Specifying the location and name at the recover prompt:
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
#4.2)Using the ALTER SYSTEM ARCHIVE command:
SQL> ALTER SYSTEM ARCHIVE LOG START TO <new location>;
#4.3)Using the RECOVER FROM <LOCATION> command:
SQL> RECOVER FROM '<new location>' DATABASE
#4.4)
SQL>SET LOGSOURCE /new_directory
#4.5)
ALTER DATABASE RECOVER FROM '/new_directory';
#5) recover the datafile(s)
RECOVER [AUTOMATIC] DATABASE
RECOVER [AUTOMATIC] TABLESPACE <NUMBER> | <NAME>
RECOVER [AUTOMATIC] DATAFILE <'filename'> | <NAME>
#6) if db is open, take the datafile online:
ALTER DATABASE DATAFILE '/disk2/data/df2.dbf' ONLINE;
ALTER TABLESPACE user_data ONLINE;
#7) if required:
ALTER DATABASE OPEN;
Re- Cr eat i ng Lost Dat af i l es Wi t hout Back up
# if the database open:
ALTER TABLESPACE table_data OFFLINE IMMEDIATE;
# if the database is closed, open mount
STARTUP MOUNT
ALTER DATABASE DATAFILE 4 OFFLINE;
# re-create the datafile with the same name:
ALTER DATABASE CREATE DATAFILE '/ORADATA/u03/users01.dbf';
#or
#re-create the datafile but with a new filename or location:
ALTER DATABASE CREATE DATAFILE '/ORADATA/u03/users01.dbf' AS
'/ORADATA/u04/users01.dbf';
RECOVER TABLESPACE table_data;
RECOVER DATAFILE '/ORADATA/u03/users01.dbf ';
ALTER TABLESPACE table_data ONLINE;
ALTER DATABASE DATAFILE '/ORADATA/u03/users01.dbf' ONLINE;
Page 242 Oracle DBA Code Examples
User - Managed I ncompl et e Recov er y
Common Si t uat i ons Requi r i ng I ncompl et e Recover y
Missing archive
Loss of redo logs
User error
Loss of cont rol files: but you have a backup of an old binary copy
User - Managed I ncompl et e Recover y St eps
You must have t he following t o recover:
A valid offline or online backup cont aining all dat afiles.
All archived redo logs, from t he rest ored backup t o before t he t ime of failure.
1. Perform a full closed backup of the existing database.
2. Restore all datafiles. You may need to restore archived logs.
If archive log changed to different destination:
SET LOGSOURCE <LOCATION>
STARTUP MOUNT
3. Place the database in mount mode and insure that the datafiles are online.
SELECT file_id f#, file_name,
tablespace_name tablespace, status
FROM dba_data_files;
4. Recover the database.
RECOVER [AUTOMATIC] DATABASE until ..
until time 'YYYY-MM-DD:HH:MI:SS'
until cancel
until scn <integer>
using backup control file
recover database until time '2002-03-09:11:44:00'
5. Open the database by using the RESETLOGS option and verify the recovery.
alter database open resetlogs;
Note: If log files need to be re-created on another disk due to media failure,
use the ALTER DATABASE DROP LOG GROUP and ALTER DATABASE ADD LOG GROUP
commands to create the log files manually.
6. Perform a whole closed backup of the database.
Recover i ng f r om Lost Cont r ol Fi l e by Re- Cr eat i ng t he Cont r ol Fi l e
ALTER DATABASE BACKUP CONTROLFILE TO TRACE;
the command generates file in
<ORACLE_ADR>\rdbms\<GSID>\<SID>\trace\<SID>_ora_nnn.trc
The exact file name will also be found in
<ORACLE_ADR>\rdbms\<GSID>\<SID>\trace\alert_<SID>.log
Page 243 Oracle DBA Code Examples
-- The following are current System-scope REDO Log Archival related
-- parameters and can be included in the database initialization file.
--
-- LOG_ARCHIVE_DEST=''
-- LOG_ARCHIVE_DUPLEX_DEST=''
--
-- LOG_ARCHIVE_FORMAT=ARC%S_%R.%T
--
-- DB_UNIQUE_NAME="ora11g"
--
-- LOG_ARCHIVE_CONFIG='SEND, RECEIVE, NODG_CONFIG'
-- LOG_ARCHIVE_MAX_PROCESSES=4
-- STANDBY_FILE_MANAGEMENT=MANUAL
-- STANDBY_ARCHIVE_DEST=%ORACLE_HOME%\RDBMS
-- FAL_CLIENT=''
-- FAL_SERVER=''
--
-- LOG_ARCHIVE_DEST_10='LOCATION=USE_DB_RECOVERY_FILE_DEST'
-- LOG_ARCHIVE_DEST_10='OPTIONAL REOPEN=300 NODELAY'
-- LOG_ARCHIVE_DEST_10='ARCH NOAFFIRM NOEXPEDITE NOVERIFY SYNC'
-- LOG_ARCHIVE_DEST_10='REGISTER NOALTERNATE NODEPENDENCY'
-- LOG_ARCHIVE_DEST_10='NOMAX_FAILURE NOQUOTA_SIZE NOQUOTA_USED
NODB_UNIQUE_NAME'
-- LOG_ARCHIVE_DEST_10='VALID_FOR=(PRIMARY_ROLE,ONLINE_LOGFILES)'
-- LOG_ARCHIVE_DEST_STATE_10=ENABLE
--
-- LOG_ARCHIVE_DEST_1='LOCATION=C:\oracle\oracledb11g\RDBMS'
-- LOG_ARCHIVE_DEST_1='MANDATORY NOREOPEN NODELAY'
-- LOG_ARCHIVE_DEST_1='ARCH NOAFFIRM EXPEDITE NOVERIFY SYNC'
-- LOG_ARCHIVE_DEST_1='NOREGISTER NOALTERNATE NODEPENDENCY'
-- LOG_ARCHIVE_DEST_1='NOMAX_FAILURE NOQUOTA_SIZE NOQUOTA_USED
NODB_UNIQUE_NAME'
-- LOG_ARCHIVE_DEST_1='VALID_FOR=(PRIMARY_ROLE,ONLINE_LOGFILES)'
-- LOG_ARCHIVE_DEST_STATE_1=ENABLE
--
-- Below are two sets of SQL statements, each of which creates a new
-- control file and uses it to open the database. The first set opens
-- the database with the NORESETLOGS option and should be used only if
-- the current versions of all online logs are available. The second
-- set opens the database with the RESETLOGS option and should be used
-- if online logs are unavailable.
-- The appropriate set of statements can be copied from the trace into
-- a script file, edited as necessary, and executed when there is a
-- need to re-create the control file.
--
-- Set #1. NORESETLOGS case
--
-- The following commands will create a new control file and use it
-- to open the database.
-- Data used by Recovery Manager will be lost.
-- Additional logs may be required for media recovery of offline
-- Use this only if the current versions of all online logs are
-- available.
-- After mounting the created controlfile, the following SQL
-- statement will place the database in the appropriate
-- protection mode:
-- ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE
Page 244 Oracle DBA Code Examples
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORA11G" NORESETLOGS NOARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 'C:\ORACLE\ORADATA\ORA11G\REDO01.LOG' SIZE 50M,
GROUP 2 'C:\ORACLE\ORADATA\ORA11G\REDO02.LOG' SIZE 50M,
GROUP 3 'C:\ORACLE\ORADATA\ORA11G\REDO03.LOG' SIZE 50M
-- STANDBY LOGFILE
DATAFILE
'C:\ORACLE\ORADATA\ORA11G\SYSTEM01.DBF',
'C:\ORACLE\ORADATA\ORA11G\SYSAUX01.DBF',
'C:\ORACLE\ORADATA\ORA11G\UNDOTBS01.DBF',
'C:\ORACLE\ORADATA\ORA11G\USERS01.DBF',
'C:\ORACLE\ORADATA\ORA11G\FDA_TBS.DBF'
CHARACTER SET AR8MSWIN1256
;
-- Commands to re-create incarnation table
-- Below log names MUST be changed to existing filenames on
-- disk. Any one log file from each branch can be used to
-- re-create incarnation records.
-- ALTER DATABASE REGISTER LOGFILE
'C:\ORACLE\FLASH_RECOVERY_AREA\ORA11G\ARCHIVELOG\2010_03_19\O1_MF_1_1_%U_.ARC'
;
-- Recovery is required if any of the datafiles are restored backups,
-- or if the last shutdown was not normal or immediate.
RECOVER DATABASE
-- Database can now be opened normally.
ALTER DATABASE OPEN;
-- Commands to add tempfiles to temporary tablespaces.
-- Online tempfiles have complete space information.
-- Other tempfiles may require adjustment.
ALTER TABLESPACE TEMP ADD TEMPFILE 'C:\ORACLE\ORADATA\ORA11G\TEMP01.DBF'
SIZE 20971520 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;
-- End of tempfile additions.
--
-- Set #2. RESETLOGS case
--
-- The following commands will create a new control file and use it
-- to open the database.
-- Data used by Recovery Manager will be lost.
-- The contents of online logs will be lost and all backups will
-- be invalidated. Use this only if online logs are damaged.
-- After mounting the created controlfile, the following SQL
-- statement will place the database in the appropriate
-- protection mode:
-- ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORA11G" RESETLOGS NOARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
Page 245 Oracle DBA Code Examples
LOGFILE
GROUP 1 'C:\ORACLE\ORADATA\ORA11G\REDO01.LOG' SIZE 50M,
GROUP 2 'C:\ORACLE\ORADATA\ORA11G\REDO02.LOG' SIZE 50M,
GROUP 3 'C:\ORACLE\ORADATA\ORA11G\REDO03.LOG' SIZE 50M
-- STANDBY LOGFILE
DATAFILE
'C:\ORACLE\ORADATA\ORA11G\SYSTEM01.DBF',
'C:\ORACLE\ORADATA\ORA11G\SYSAUX01.DBF',
'C:\ORACLE\ORADATA\ORA11G\UNDOTBS01.DBF',
'C:\ORACLE\ORADATA\ORA11G\USERS01.DBF',
'C:\ORACLE\ORADATA\ORA11G\FDA_TBS.DBF'
CHARACTER SET AR8MSWIN1256
;
-- Commands to re-create incarnation table
-- Below log names MUST be changed to existing filenames on
-- disk. Any one log file from each branch can be used to
-- re-create incarnation records.
-- ALTER DATABASE REGISTER LOGFILE
'C:\ORACLE\FLASH_RECOVERY_AREA\ORA11G\ARCHIVELOG\2010_03_19\O1_MF_1_1_%U_.ARC'
;
-- Recovery is required if any of the datafiles are restored backups,
-- or if the last shutdown was not normal or immediate.
RECOVER DATABASE USING BACKUP CONTROLFILE
-- Database can now be opened zeroing the online logs.
ALTER DATABASE OPEN RESETLOGS;
-- Commands to add tempfiles to temporary tablespaces.
-- Online tempfiles have complete space information.
-- Other tempfiles may require adjustment.
ALTER TABLESPACE TEMP ADD TEMPFILE 'C:\ORACLE\ORADATA\ORA11G\TEMP01.DBF'
SIZE 20971520 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;
-- End of tempfile additions.
--
Page 246 Oracle DBA Code Examples
Fl ash Recov er y Ar ea
Obt ai ni ng I nf or mat i on on Fl ash Recover y Ar ea
-- FRA Configuration
show parameter DB_RECOVERY_FILE_DEST_SIZE
show parameter DB_RECOVERY_FILE_DEST
-- related parameters
show parameter DB_CREATE_FILE_DEST
show parameter LOG_ARCHIVE_DEST_1
show parameter LOG_ARCHIVE_DEST_2
-- space usage
select NAME, round(SPACE_LIMIT/1024/1024/1024,4) SPACE_LIMIT_GB,
round(SPACE_USED/1024/1024/1024,4) SPACE_USED_GB,
round(SPACE_RECLAIMABLE/1024/1024/1024,4) SPACE_RECLAIMABLE_GB,
NUMBER_OF_FILES
from V$RECOVERY_FILE_DEST;
select FILE_TYPE, PERCENT_SPACE_USED, PERCENT_SPACE_RECLAIMABLE,
NUMBER_OF_FILES
from V$FLASH_RECOVERY_AREA_USAGE
order by PERCENT_SPACE_USED desc
Conf i gur i ng Fl ash Recover y Ar ea
I f configured, LOG_ARCHI VE_DEST and LOG_ARCHI VE_DUPLEX_DEST paramet ers cannot
be used.
-- configuring FRA
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE = 4G SCOPE=BOTH;
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST = 'C:\ORACLE\RECOVERY_AREA' SCOPE=BOTH
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST = '+dskgrp1'
-- related parameters
DB_CREATE_FILE_DEST = /u02/test/oradata/dbfiles/
LOG_ARCHIVE_DEST_1 = 'LOCATION=/u03/test/arc_dest1'
LOG_ARCHIVE_DEST_2 = 'LOCATION=USE_DB_RECOVERY_FILE_DEST'
-- disable FRA
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST = ''
-- 85% warning and 79% critical threshold are by default configured
Back i ng Up t he Fl ash Recover y Ar ea
I n order t o back up t he flash recovery area it self using RMAN, you must set CONFI GURE
BACKUP OPTI MI ZATI ON t o ON.
Neit her of t he t wo commands, BACKUP RECOVERY AREA nor BACKUP RECOVERY FI LES,
will back up any permanent files or t he flashback logs in t he flash recovery area
You can back up t he flash recovery area only t o a t ape device using t he following backup
commands:
BACKUP RECOVERY AREA
Page 247 Oracle DBA Code Examples
o This command backs up all flash recovery files in t he current or previous flash recovery
area dest inat ions.
o I t backs up only t hose files t hat have never been backed up t o t ape before.
o The files t hat t he command will back up include full backups, increment al backups, cont rol
file aut obackups, archive logs, and dat afile copies.
BACKUP RECOVERY FILES
This command backs up all t he files t hat t he BACKUP RECOVERY AREA command does, but
from all areas on your file syst em, not j ust from t he flash recovery area.
BACKUP RECOVERY FILE DESTINATION
Use t his command t o move disk backups creat ed in t he flash recovery area t o t ape.
Movi ng t he Fl ash Recover y Ar ea
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='/u01/app/oracle/new_area' SCOPE=BOTH
Event ually, Oracle will delet e all t he t ransient files from t he previous flash recovery area
locat ion, when each of t hem becomes eligible for delet ion. However, if you want t o move
your current permanent files, t ransient files, or flashback logs t o t he new flash recovery
area, you can do so by using t he st andard file- moving procedures.
I f t he dat abase flashback logs are enabled and you moved t he flash recovery area, t he
flashback opt ion should be swit ched off and on.
Page 248 Oracle DBA Code Examples
Recov er y Manager ( RMAN)
Usi ng A Medi a Management Layer ( MML) w i t h RMAN
Oracle maint ains t he Oracle Backup Solut ions Program ( BSP). The part ners are list ed in
ht t p: / / ot n.oracle.com/ deploy/ availabilit y/ ht docs/ bsp.ht m# MMV
Some of t he import ant one are Legat o Syst ems ( Net Worker) and VERI TAS ( Net Backup) .
Obt ai ni ng I nf or mat i on about and r el at ed t o RMAN usi ng Di ct i onar y Vi ew s
/* archives log files */
-- created, backed up, and cleared in the database
select
RECID,
NAME,
DEST_ID,
THREAD#,
SEQUENCE#,
RESETLOGS_CHANGE#,
RESETLOGS_TIME,
RESETLOGS_ID,
FIRST_CHANGE#,
FIRST_TIME,
NEXT_CHANGE#,
NEXT_TIME,
round(BLOCKS * BLOCK_SIZE/1024/1024,2) MB ,
CREATOR,
ARCHIVED,
DELETED,
STATUS,
COMPLETION_TIME,
END_OF_REDO,
BACKUP_COUNT,
ARCHIVAL_THREAD#,
IS_RECOVERY_DEST_FILE,
COMPRESSED,
FAL,
BACKED_BY_VSS
from V$ARCHIVED_LOG ;
/* Backup Sets */
select
RECID,
STAMP,
SET_STAMP,
SET_COUNT,
BACKUP_TYPE,
CONTROLFILE_INCLUDED,
INCREMENTAL_LEVEL,
PIECES,
START_TIME,
COMPLETION_TIME,
ELAPSED_SECONDS,
Page 249 Oracle DBA Code Examples
BLOCK_SIZE,
INPUT_FILE_SCAN_ONLY,
KEEP,
KEEP_UNTIL,
KEEP_OPTIONS,
MULTI_SECTION
from V$BACKUP_SET
order by RECID;
/* Backup Pieces*/
SELECT RECID,
STAMP,
SET_STAMP, -- link to V$BACKUP_SET
SET_COUNT,
PIECE#,
COPY#,
DEVICE_TYPE,
HANDLE,
COMMENTS,
MEDIA,
MEDIA_POOL,
CONCUR,
TAG,
STATUS,
START_TIME,
COMPLETION_TIME,
ELAPSED_SECONDS,
DELETED,
BYTES,
IS_RECOVERY_DEST_FILE,
RMAN_STATUS_RECID,
RMAN_STATUS_STAMP,
COMPRESSED,
BACKED_BY_VSS,
ENCRYPTED,
BACKED_BY_OSB,
FROM V$BACKUP_PIECE
ORDER BY SET_STAMP;
/* Files in Backup Sets */
-- control files and datafiles in backup sets from the control file
select
RECID,
STAMP,
SET_STAMP,
SET_COUNT BACKUPSET_COUNT,
B.FILE#,
d.NAME DATAFILE_NAME,
B.CREATION_CHANGE#,
B.CREATION_TIME,
RESETLOGS_CHANGE#,
RESETLOGS_TIME,
INCREMENTAL_LEVEL,
INCREMENTAL_CHANGE#,
B.CHECKPOINT_CHANGE#,
Page 250 Oracle DBA Code Examples
B.CHECKPOINT_TIME,
ABSOLUTE_FUZZY_CHANGE#,
MARKED_CORRUPT,
MEDIA_CORRUPT,
LOGICALLY_CORRUPT,
DATAFILE_BLOCKS,
B.BLOCKS,
B.BLOCK_SIZE,
OLDEST_OFFLINE_RANGE,
COMPLETION_TIME,
CONTROLFILE_TYPE,
USED_CHANGE_TRACKING,
BLOCKS_READ,
USED_OPTIMIZATION,
B.FOREIGN_DBID,
B.PLUGGED_READONLY,
B.PLUGIN_CHANGE#,
B.PLUGIN_RESETLOGS_CHANGE#,
B.PLUGIN_RESETLOGS_TIME,
SECTION_SIZE,
UNDO_OPTIMIZED
from V$BACKUP_DATAFILE b, V$DATAFILE d
where B.FILE# (+)= D.FILE#
ORDER BY b.CREATION_TIME DESC;
/* Archive Log files in the Backup Sets */
SELECT
RECID,
STAMP,
SET_STAMP,
SET_COUNT,
THREAD#,
SEQUENCE#,
RESETLOGS_CHANGE#,
RESETLOGS_TIME,
FIRST_CHANGE#,
FIRST_TIME,
NEXT_CHANGE#,
NEXT_TIME,
round(BLOCKS * BLOCK_SIZE/1024/1024,2) MB ,
TERMINAL
FROM V$BACKUP_REDOLOG
ORDER BY RECID DESC;
/* Corruption */
-- blocks have been found corrupt during a backup of a backup set
select * from V$BACKUP_CORRUPTION;
-- database blocks that were corrupted after the last backup
select * from V$DATABASE_BLOCK_CORRUPTION
St ar t i ng RMAN
export ORACLE_SID=mydb
rman target /
Page 251 Oracle DBA Code Examples
rman target sys/psw cmdfile D:\..\dblevel0.ora log D:\..\dblevel0.log append
rman target / @myrmanscript.ora
rman target orcl catalog rman/rman@nick
# log parameter doesnt display output to you. To work around:
rman | tee /u01/app/oracle/rman.log
# using dynamic script: passing parameters to command file
# command file may contain:
BACKUP DATABASE TAG &1
FORMAT '/u02/oracle/bck/&2%U.bck'
# the script running rman may contain:
export format=$2
export mytag=$3
rman @'/u01/app/oracle/scripts/my_backup.cmd' USING $format $mytag
# you may run the script as:
myscript.sh db01012010 HR01012010
Usi ng r l w r ap Ut i l i t y w i t h RMAN i n Uni x - Based Syst ems
/* Install */
# Option 1: for rpm version:
# can be downloaded from:
# http://rpm.pbone.net
# http://ivan.kartik.sk
rpm -ivh rlwrap*.rpm
# Option 2: for tar version
# download rlwrap-0.30.tar.gz (search the net or from
http://www.ahmedbaraka.com/download/oracle/rlwrap-0.30.tar.gz )
# unzip the file and install
su -
gunzip rlwrap-0.30.tar.gz
tar -xvf rlwrap-0.30.tar
cd rlwrap-0.30
./configure
make
make install
#
echo "alias rman2='rlwrap rman'" >> /home/oracle/.bashrc
Conf i gur i ng t he RMAN Envi r onment
/* Handling Configuration in General */
# To list current configuration
SHOW ALL
# To set value for a configuration setting
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/?/%U';
CONFIGURE CONTROL FILE AUTOBAKCUP ON
# To reset the setting value
CONFIGURE CONTROL FILE AUTOBAKCUP CLEAR
Page 252 Oracle DBA Code Examples
/* Backup Retention Policy */
CONFIGURE RETENTION POLICY TO REDUNDANCY 2;
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 14 DAYS;
/* Default Device Type */
CONFIGURE DEFAULT DEVICE TYPE TO sbt;
/* Encryption */
-- Transparent or Dual mode
CONFIGURE ENCRYPTION FOR DATABASE ON
/* Compression */
CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO COMPRESSED BACKUPSET
/* Defining Parallelism */
CONFIGURE DEVICE TYPE DISK PARALLELISM 4;
/* Configuring Default Channels */
-- number of channels to use depends on DISK PARALLELISM
CONFIGURE CHANNEL 1 DEVICE TYPE DISK FORMAT
'/u01/oracle/oradata/backup/%U';
CONFIGURE CHANNEL 2 DEVICE TYPE DISK FORMAT
'/u02/oracle/oradata/backup/%U';
/* Backup Optimization */
-- datafile of a version identical to its backup won't be backuped up
CONFIGURE BACKUP OPTIMIZATION ON;
/* Control File Auto-Backup */
CONFIGURE CONTROLFILE AUTOBACKUP ON;
-- Control File Backup Location and Format
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO
'/u01/oracle/oradta/backup/cf_%F';
/* Archivelog Deletion Policy */
-- all destinations are affected including flash recovery area
CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 2 TIMES TO SBT;
RMAN Channel Commands
# Manual Channel Allocation
RUN {
ALLOCATE CHANNEL c1 TYPE disk
FORMAT = '/db01/BACKUP/usr0520.bak';
BACKUP DATAFILE '/db01/ORADATA/users01.dbf';}
# Automatic Channel Allocation
CONFIGURE DEFAULT DEVICE TO DISK | SBT ;
Page 253 Oracle DBA Code Examples
CONFIGUE DEVICE TYPE DISK PARALLELISM n ;
# Automatic Channel Options
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT = '/BACKUP/RMAN/%U' ;
CONFIGURE CHANNEL DEVICE TYPE DISK MAXPIECESIZE 2G ;
Dur at i on i n days of RMAN i nf or mat i on i n Cont r ol Fi l e
--in days
select value from v$parameter where
upper(name)='CONTROL_FILE_RECORD_KEEP_TIME';
alter system set CONTROL_FILE_RECORD_KEEP_TIME=30 ;
Moni t or i ng RMAN Jobs
SELECT operation, status from V$RMAN_STATUS;
# to view message generated by the RMAN operation
select * from V$RMAN_OUTPUT;
Usi ng RMAN BACKUP Command
BACKUP command opt ions
FULL
I NCREMENTAL LEVEL n
I NCLUDE CURRENT CONTROLFI LE
FI LESPERSET n # maximum number of input files in each backup set
SKI P OFFLI NE | READONLY | I NACCESSI BLE
MAXSETSI ZE n K| M| G
DELETE I NPUT # applicable on archived logs, dat afile copies or backup set s.
FORMAT :
%c copy number
%p backup piece number
%s backup set number
%d dat abase name
%n dat abase name padded wit h 8 charact ers
%t backup set t ime st amp
%u compressed version of %s and %t
%U ( default ) equivalent t %u_%p_%c
/* Backup Piece Size */
ALLOCATE CHANNEL MAXPIECESIZE = integer
CONFIGURE CHANNEL MAXPIECESIZE = integer
/* Backup examples */
-- make a whole database backup
BACKUP DATABASE FORMAT '/tmp/%U' TAG='weekly_bak'
SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';
Page 254 Oracle DBA Code Examples
-- Backing Up Tablespaces
BACKUP TABLESPACE system, users, tools;
-- Backing up Datafiles and Datafile Copies
BACKUP DATAFILE 1,2,3,4, DATAFILECOPY '/tmp/system01.dbf'
-- Backing Up Backup Sets (from disk to tape or from disk tdisk)
BACKUP DEVICE TYPE sbt BACKUPSET ALL;
Back i ng Up Cont r ol Fi l e and SPFi l e
/* Control File Autobackup */
CONFIGURE CONTROLFILE AUTOBACKUP enable ;
/* Control File Backup Format */
SET CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE disk TO 'controlfile_%F';
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT '..' ;
/* Backing Up the Control File Manually */
BACKUP CURRENT CONTROLFILE TAG='mondaypmbackup' ;
/* Including the Control File in a Backup Set */
BACKUP TABLESPACE users INCLUDE CURRENT CONTROLFILE;
/* Backing Up the Server Parameter File */
-- Automatically backed up when CONFIGURE CONTROLFILE
AUTOBACKUP = ON
-- Explicitly
BACKUP SPFILE
Back i ng Up Ar chi ved RedLogs
/* Using BACKUP ARCHIVELOG command */
BACKUP ARCHIVELOG ALL ;
BACKUP ARCHIVELOG NOT BACKED UP 2 TIMES;
-- To delete backed up copy of the archived log file
BACKUP ARCHIVELOG ALL DELETE INPUT ;
-- To delete logs from all enabled archiving destinations.
BACKUP ARCHIVELOG ALL DELETE ALL INPUT ;
-- To specify a range of archived redlogs by time
BACKUP ARCHIVELOG UNTIL TIME 'SYSDATE-7';
BACKUP ARCHIVELOG FROM TIME 'SYSDATE-30' UNTIL TIME 'SYSDATE-7';
-- To specify a range of archived redlogs by SCN
BACKUP ARCHIVELOG UNTIL SCN = 320 ;
BACKUP ARCHIVELOG SCN BETWEEN 205 AND 320 ;
-- To specify a range of archived redlogs by log sequence number
BACKUP ARCHIVELOG UNTIL SEQUENCE = 501
BACKUP ARCHIVELOG FROM SEQUENCE integer
Page 255 Oracle DBA Code Examples
/* Using BACKUP ... PLUS ARCHIVELOG: */
BACKUP DATABASE PLUS ARCHIVELOG;
Back up i n NOARCHI VELOG Mode
1. Shut down cleanly
2. Mount the database.
3. Allocate multiple channels, if not using automatic.
4. Run the BACKUP command.
Encr ypt i ng RMAN Backups
Three possible encrypt ion modes for your backups:
o Transparent mode: I t requires Oracle Wallet . I t is t he default encrypt ion mode.
CONFIGURE ENCRYPTION FOR DATABASE ON
o Password mode: I t requires you t o provide a password. I t is best suit ed for backups
rest ored at remot e locat ions.
SET ENCRYPTION ON IDENTIFIED BY password ONLY
o Dual mode: I t can use eit her Oracle Wallet s or passwords.
Aft er making sure t he wallet is open:
SET ENCRYPTION ON IDENTIFIED BY password
I f t here is no wallet or t he wallet is closed:
SET DECRYPTION IDENTIFIED BY password1 {, password2,, passwordn}
Usi ng Compr essi on i n RMAN Back ups
Only Backupset s can be compressed:
RMAN> CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO COMPRESSED BACKUPSET
RMAN> BACKUP AS COMPRESSED BACKUPSET DATABASE
Usi ng Mul t i pl ex ed Back up Set s
RMAN can read from t wo dat afiles simult aneously, and t hen combine t he blocks from t hese
dat afiles int o a single backup piece.
Mult iplexing can be cont rolled by t he following:
o The FI LESPERSET paramet er on t he BACKUP command
o The MAXOPENFI LES paramet er of t he ALLOCATE CHANNEL and CONFI GURE CHANNEL
commands ( default is 8)
Usi ng Par al l el i zat i on of Back up Set s
Parallelizat ion of backup set s is achieved by:
o Configuring PARALLELI SM t great er t han 1
o allocat ing mult iple channels
o Specifying many files in t he BACKUP command
BACKUP
(DATAFILE 1,2,3
Page 256 Oracle DBA Code Examples
FILESPERSET = 1
CHANNEL ORA_DISK_1)
(DATAFILECOPY '/tmp/system01.dbf',
'/tmp/tools01.dbf'
FILESPERSET = 2
CHANNEL ORA_DISK_2);
RUN
{
ALLOCATE CHANNEL c1 DEVICE TYPE sbt PARMS="ENV=
(BACKUP_SERVER=tape_server1)";
ALLOCATE CHANNEL c2 DEVICE TYPE sbt PARMS="ENV=
(BACKUP_SERVER=tape_server2)";
BACKUP
(DATAFILE 1,2,3 CHANNEL c1)
(DATAFILECOPY '/tmp/system01.dbf',
'/tmp/tools01.dbf' FILESPERSET = 2 CHANNEL c2)
}
Usi ng Dupl ex ed Back up Set s ( Back upset Copi es)
CONFI GURE . . . BACKUP COPI ES opt ion ( maximum 4)
SET BACKUP COPI ES in a RUN block.
The COPI ES opt ion in t he BACKUP command.
-- BACKUP COPIES
BACKUP DEVICE TYPE DISK COPIES 2 DATAFILE 1 FORMAT '/disk1/df1_%U',
'/disk2/df1_%U';
BACKUP COPIES 2 DATAFILE 1, DATAFILE 2 FORMAT '/BACKUP1/%U','/BACKUP2/%U';
BACKUP COPIES 3 INCREMENTAL LEVEL = 0 DATABASE;
-- CONFIGURE BACKUP COPIES
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/save1/%U', '/save2/%U';
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE sbt T2;
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE sbt T2;
Mak i ng I mage Copi es
BACKUP AS COPY. .
BACKUP AS COPY DATABASE;
BACKUP AS COPY TABLESPACE SYSAUX;
BACKUP AS COPY DATAFILE 2;
BACKUP AS COPY COPY OF DATABASE;
BACKUP AS BACKUPSET COPY OF TABLESPACE SYSAUX;
BACKUP AS COPY COPY OF DATAFILE 2;
-- to check
list backupset of tablespace tbs1;
I n 9i, (DEPRICATED IN 10G )
COPY DATAFILE { 'filename'| integer }
Page 257 Oracle DBA Code Examples
| DATAFILECOPY {'filename' |TAG='tag_name'}
| ARCHIVELOG 'filename'
| CURRENT CONTROLFILE
| CONTROLFILECOPY {'filename'|TAG='tag_name'}
TO AUXNAME | 'filename'
COPY DATAFILE '/ORADATA/users_01_db01.dbf' to '/BACKUP/users01.dbf' tag=DF3 ;
Val i dat i ng Back up
When you run BACKUP VALI DATE, RMAN checks dat afiles for physical and logical block
corrupt ion but it does not act ually produce any backup set s or image copies.
# only database level
BACKUP VALIDATE DATABASE ARCHIVELOG ALL;
# db, tablespace, datafile, block levels
VALIDATE BACKUPSET 1;
I ncr ement al Back up
Level 0 or Level 1.
Different ial: since last 1 or 0, Cumulat ive: since last 0 ( fast er recovery) .
BACKUP INCREMENTAL LEVEL N [CUMULATIVE]
backup of: DATAFILE, DATAFILECOPY, TABLESPACE, or DATABASE.
BACKUP INCREMENTAL LEVEL 0 ...
Tags f or Back ups and I mage Copi es
BACKUP .. TAG='tag_name'
Cr eat i ng Ar chi val Back ups
The BACKUP .. . KEEP command can be used t o creat e a backup t hat is bot h all- inclusive
( every file needed including archived redo logs) and exempt from t he backup ret ent ion
policy.
I n Oracle 11g, some modificat ions made on t he RMAN BACKUP .. . KEEP command. I n t he
new version of t he command, t he KEEP, NOKEEP, FOREVER, and UNTI L TI ME opt ions are
ret ained. However, t he LOGS and NOLOGS opt ions are not t here any longer. I nst ead, you
have a new opt ion, RESTORE POI NT. The RESTORE POI NT opt ion let s RMAN aut omat ically
creat e a normal rest ore point .
Not e: You cant use t he KEEP clause for backup files in t he flash recovery area. Also, you
cannot use t he CHANGE .. . KEEP command for backup files st ored in t he flash recovery area.
RUN
{
ALLOCATE CHANNEL c1 DEVICE TYPE sbt PARMS
'ENV=(OB_MEDIA_FAMILY=archival_backup)';
-- with forever option (recovery catalog is required)
BACKUP DATABASE TAG BAKQ108 KEEP FOREVER RESTORE POINT FY08Q1;
Page 258 Oracle DBA Code Examples
-- backup will be kept for 365 days (long-term)
BACKUP DATABASE TAG BAKQ108 KEEP UNTIL TIME 'SYSDATE+365' RESTORE POINT
FY08Q1;
-- After one day, the backup becomes obsolete,
-- regardless the configured retention policy
BACKUP DATABASE FORMAT '/u01/oraclebck/%U.bck'
TAG TESTDB KEEP UNTIL 'SYSDATE+1' RESTORE POINT TESTDB08;
}
I f you want t o change t he st at us of a regular backup t o an archival backup, use t he CHANGE command
as f ollows:
CHANGE BACKUP TAG 'weekly_bkp' KEEP FOREVER;
-- make it follow back the retention policy
CHANGE BACKUP TAG 'weekly_bkp' NOKEEP;
Moni t or i ng RMAN Backups
To correlate a process with a channel during a backup:
1. I n each session, set t he COMMAND ID t o a dif f erent value
RUN
{
ALLOCATE CHANNEL c1 TYPE sbt;
SET COMMAND ID TO 'sess1';
BACKUP DATABASE;
}
2. Query t he j oined V$SESSION and V$PROCESS views
SELECT SID, SPID, CLIENT_INFO
FROM V$PROCESS p, V$SESSION s
WHERE p.ADDR = s.PADDR
AND s.CLIENT_INFO LIKE '%id=sess%';
The CLIENT_INFO column displays in t he f ollowing f ormat :
id=command_id,rman channel=channel_id
3. Query t he V$SESSION_LONGOPS view t o get t he st at us of t he backup or copy
SELECT s.SID, S.SERIAL#, CLIENT_INFO, round(L.ELAPSED_SECONDS/60,2)
ELAPSED_TIME_MIN ,L.SOFAR, L.TIME_REMAINING/60 TIME_REMAINING_MIN
FROM V$PROCESS p, V$SESSION s, V$SESSION_LONGOPS l
WHERE p.ADDR = s.PADDR and L.SID = s.SID and L.SERIAL# = s.SERIAL#
AND s.CLIENT_INFO LIKE '%rman%'
AND NVL(L.TIME_REMAINING,0)<>0;
RMAN Compl et e Recover y
Val i dat i ng Back up Fi l es
You can use VALIDATE Validat e backup set s before you use t hem from a recovery.
You can run RESTORE . .. VALI DATE t o t est whet her RMAN can rest ore a specific file or set
of files from a backup. RMAN chooses which backups t o use.
LIST COPY;
LIST BACKUP;
LIST BACKUP RECOVERABLE;
VALIDATE BACKUPSET 1;
Page 259 Oracle DBA Code Examples
-- no restore is actually done
-- lack of errors: validation found no problem
RESTORE DATABASE VALIDATE;
RESTORE ARCHIVELOG ALL VALIDATE;
Pr ev i ew i ng Back up Fi l es Requi r ed by a Rest or e
The RESTORE . . . PREVI EW command provides a det ailed report of all backups t hat are
necessary for t hat RESTORE command t o succeed.
RESTORE DATABASE PREVIEW;
RESTORE DATABASE PREVIEW SUMMARY;
RESTORE TABLESPACE users PREVIEW;
RESTORE DATAFILE 3 PREVIEW;
I dent i f y i ng Dat af i l es Requi r i ng Recov er y
SELECT r.FILE# AS df#, d.NAME AS df_name, t.NAME AS tbsp_name,
d.STATUS, r.ERROR, r.CHANGE#, r.TIME
FROM V$RECOVER_FILE r, V$DATAFILE d, V$TABLESPACE t
WHERE t.TS# = d.TS# AND d.FILE# = r.FILE#;
Per f or mi ng Compl et e Recov er y
-- Recover a Database in ARCHIVELOG Mode
STARTUP MOUNT;
RESTORE DATABASE;
RECOVER DATABASE;
-- Restore Datafiles to a New Location
run{
set newname for datafile 1 to '/newdir/system01.dbf';
restore database;
switch datafile all; # record in control file
recover database;}
-- alternatively:
run {
sql "alter tablespace tbs1 offline immediate" ;
set newname for datafile 6 to 'C:\APP\ADMINISTRATOR\ORADATA\ORA11G\tbs1.dbf';
restore tablespace tbs1;
switch datafile 6;
recover tablespace tbs1; }
sql "alter tablespace tbs1 online" ;
-- Recover a Tablespace
run{
sql "alter tablespace users offline immediate";
restore tablespace users;
recover tablespace users;
sql "alter tablespace users online"; }
-- Relocate a Tablespace
RUN{
SQL "alter tablespace users offline immediate";
SET NEWNAME FOR DATAFILE '/ORADATA/u03/users01.dbf'
Page 260 Oracle DBA Code Examples
TO '/ORADATA/u04/users01.dbf';
RESTORE TABLESPACE users;
SWITCH datafile 3; # Update the control file and recovery catalog
RECOVER TABLESPACE users; #Recover the tablespace
SQL "alter tablespace tbs1 online";}
RMAN I ncompl et e Recover y
1. Mount t he dat abase.
2. The f ollowing st eps should be f ollowed:
RUN { # multiple channels for parallelization
ALLOCATE CHANNEL c1 TYPE DISK;
ALLOCATE CHANNEL c2 TYPE DISK; # recover until time, SCN or sequence
SET UNTIL TIME = '2001-12-09:11:44:00'; SET UNTIL TIME "to_date('09-05-2004
00:00:20', 'dd-mm-yyyy hh24:mi:ss')" ; SET UNTIL SEQUENCE 120 THREAD 1;#120 not
included
# ALL datafiles must be restored
RESTORE DATABASE;
RECOVER DATABASE;
ALTER DATABASE OPEN RESETLOGS; }
3. I f using a recovery cat alog, regist er t he new incarnat ion of t he dat abase using t he command: RESET
DATABASE
4. Perf or m a whole dat abase backup.
Not e: I nsure t hat NLS_LANG and NLS_DATE_FORMAT environment variables are set appropriat ely.
Not e: check t he alert.log f or any errors during recovery.
Not e: I f you need t o rest ore archived redo log f iles t o a new locat ion use t he SE SET ARCHIVELOG
DESTINATION TO <location> command.
Si mpl i f i ed Recover y Thr ough Reset l ogs
Target : t o recovery t hrough current and ancest or dat abase incarnat ions.
You must reset t he current incarnat ion of t he dat abase back t o t he incarnat ion t o which
your t arget SCN belongs.
You must use t he cont rol file from t he older incarnat ion t hat cont ains t he t arget SCN.
Find out the incarnation key for the incarnation that was current at the time
you want to recover your database to.
RMAN>LIST INCARNATION
Start the database in the following way:
RMAN> STARTUP FORCE NOMOUNT;
Reset the current incarnation:
RMAN> RESET DATABASE TO INCARNATION 2;
Restore the old control file from a backup:
RMAN> RESTORE CONTROLFILE FROM AUTOBACKUP;
RMAN> ALTER DATABASE MOUNT;
Restore and recover the database:
RMAN> RESTORE DATABASE;
RMAN> RECOVER DATABASE UNTIL SCN 1000;
Page 261 Oracle DBA Code Examples
Open the database:
RMAN> ALTER DATABASE OPEN RESETLOGS;
Recover i ng f r om Lost Cont r ol Fi l e usi ng RMAN
If database isn't already shutdown:
RMAN>shutdown abort
RMAN>startup nomount
RMAN>RESTORE CONTROLFILE FROM AUTOBACKUP;
ALTER DATABASE MOUNT;
RECOVER DATABASE;
ALTER DATABASE OPEN RESETLOGS;
Bl ock Medi a Recover y ( BMR)
RMANs BLOCKRECOVER command recovers blocks marked as corrupt in t he
V$BACKUP_CORRUPTI ON and V$COPY_CORRUPTI ON views.
BMR helps on t he following goals:
o Fast er recovery t ime.
o I ncreased dat abase availabilit y.
BMR can repair only physically corrupt ed blocks but not t he logically corrupt ed blocks.
-- typical scenario:
ORA_11578: ORACLE data block corrupted (file# 9, block# 21)
ORA=01110: data file 9: /u01/app/oracle/oradata/remorse/users_01.dbf'
-- the command will search flashback logs then backup files
-- specific block
RECOVER DATAFILE 9 BLOCK 21;
-- all blocks in V$DATABASE_BLOCK_CORRUPTION
RECOVER CORRUPTION LIST;
-- to query which blocks recovered:
SELECT * FROM V$DATABASE_BLOCK_CORRUPTION;
Tr i al Recover y
Target : t o est imat e size of corrupt ion in a recovery process.
I t let s you know whet her t here is corrupt ion and, if t here is, t he ext ent of t he corrupt ion.
-- You can use the TEST option for any RECOVER command
RECOVER DATABASE TEST
RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL TEST
RECOVER TABLESPACE users TEST
RECOVER DATABASE UNTIL CANCEL TEST
-- You can limit the number of data blocks trial recovery can corrupt in
Page 262 Oracle DBA Code Examples
memory:
RECOVER DATABASE TEST ALLOW 10 CORRUPTION;
SQL> RECOVER DATABASE UNTIL CANCEL TEST;
ORA-10574: Test recovery did not corrupt any data block
ORA-10573: Test recovery tested redo from change 9948095 to 9948095
ORA-10570: Test recovery complete
Handl i ng Speci f i c Er r or s Dur i ng Recover y
ORA-01194 Error:
----------------
-- this error may raise during startup a cloned database
-- resolution: provide the online redo log file to recover
SQL> startup
ORACLE instance started.
..
Database mounted.
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
SQL> alter database open noresetlogs;
alter database open noresetlogs
*
ERROR at line 1:
ORA-01588: must use RESETLOGS option for database open
SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: 'C:\ORACLE\ORADATA\MANAGER\SYSTEM01.DBF'
SQL> RECOVER DATABASE UNTIL CANCEL USING BACKUP CONTROLFILE;
ORA-00279: change 405719 generated at 06/30/2008 15:51:04 needed for thread 1
ORA-00289: suggestion : C:\ORACLE\RDBMS\ARC00019.001
ORA-00280: change 405719 for thread 1 is in sequence #19
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
C:\ORACLE\ORADATA\MANAGER\REDO03.LOG
Log applied.
Media recovery complete.
SQL> alter database open resetlogs;
Database altered.
ORA-01152 Error:
----------------
-- resolution: provide the online redo log file to recover
ORA-00289: suggestion :
/u01/app/oracle/admin/finance/arch/finance/_0000012976.arc
ORA-00280: change 962725326 for thread 1 is in sequence #12976
ORA-00278:
logfile'/u01/app/oracle/admin/finance/arch/finance/_0000012975.arc'
no longer needed for this recovery
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
Page 263 Oracle DBA Code Examples
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01152: file 1 was not restored from a sufficiently old backup
ORA-01110: data file 1: '/pase16/oradata/finance/system_01.dbf'ORA-01112:
media recovery not started
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/pase04/oradata/finance/redo01a.rdo
ORA-00279: change 962746677 generated at 07/30/2008 04:33:52 needed for thread
1
ORA-00289: suggestion :
/u01/app/oracle/admin/finance/arch/finance/_0000012978.arc
ORA-00280: change 962746677 for thread 1 is in sequence #12978
ORA-00278: log file '/pase04/oradata/finance/redo01a.rdo'
no longer needed for this recovery
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/pase04/oradata/finance/redo02a.rdo
Log applied.
Media recovery complete.
ORA-00376 Error:
----------------
reason: might be datafile or tablespace being offline
resolution: bringing the tablespace or datafile online
ORA-00376: file 10 cannot be read at this time
ORA-01110: data file 10: '/u01/app/oracle/remorse/data_01.dbf'
Conf i gur i ng I nst ance Cr ash Recover y Ti me ( MTTR)
SELECT VALUE FROM V$PARAMETER WHERE UPPER(NAME)='FAST_START_MTTR_TARGET';
-- in seconds
ALTER DATABASE SET FAST_START_MTTR_TARGET=60;
SELECT recovery_estimated_ios, estimated_mttr, target_mttr
FROM v$instance_recovery;
Wor k i ng w i t h t he Dat a Recover y Advi sor i n RMAN
list failure;
list failure critical;
LIST FAILURE HIGH;
LIST FAILURE LOW;
list failure open;
list failure closed;
list failure exclude failure 12345;
advise failure;
repair failure preview;
repair failure;
Page 264 Oracle DBA Code Examples
The V$IR_REPAIR view shows the results of the REPAIR FAILURE command:
select REPAIR_ID,ADVISE_ID,SUMMARY,RANK from V$IR_REPAIR;
RMAN Mai nt enance
Cr oss Check i ng Back ups and Copi es
Use CROSSCHECK command t o ensure t hat dat a about backup set s and image copies in
t he recovery cat alog or cont rol file is synchronized wit h corresponding files on disk or in t he
media management cat alog.
CROSSCHECK BACKUPSET OF DATABASE;
CROSSCHECK BACKUP OF TABLESPACE users DEVICE TYPE sbt COMPLETED BEFORE
'SYSDATE-31';
Page 11 Oracle Database Administration Fundamentals II (Note Sheets)
CROSSCHECK BACKUP OF ARCHIVELOG ALL SPFILE;
CROSSCHECK BACKUPSET 1338, 1339, 1340;
CROSSCHECK BACKUPPIECE TAG = 'nightly_backup';
CROSSCHECK CONTROLFILECOPY '/tmp/control01.ctl';
CROSSCHECK DATAFILECOPY 113, 114, 115;
Note: If the backup or copy is no longer available, then RMAN marks it as
EXPIRED. You can determine which files are marked EXPIRED by issuing a LIST
EXPIRED command.
Del et i ng Back ups and Copi es
/* Deleting Specified Backups and Copies */
DELETE BACKUPPIECE 101;
DELETE CONTROLFILECOPY '/tmp/control01.ctl';
DELETE NOPROMPT ARCHIVELOG UNTIL SEQUENCE = 300;
DELETE BACKUP OF TABLESPACE users DEVICE TYPE sbt;
DELETE COPY OF CONTROLFILE LIKE '/tmp/%';
DELETE NOPROMPT BACKUP OF SPFILE COMPLETED BEFORE 'SYSDATE-7';
DELETE NOPROMPT ARCHIVELOG ALL BACKED UP 3 TIMES TO sbt;
/* Deleting Expired Backups and Copies */
-- files are marked as EXPIRED when not found by CROSSCHECK
DELETE EXPIRED BACKUP; -- REPORT OBSOLETE
DELETE EXPIRED COPY;
DELETE NOPROMPT EXPIRED BACKUP OF TABLESPACE users
DEVICE TYPE sbt COMPLETED BEFORE 'SYSDATE-31';
/* Deleting Backups and Copies Rendered Obsolete by the Retention Policy */
DELETE OBSOLETE;
/* Deleting Backups and Copies Defined as Obsolete */
DELETE OBSOLETE REDUNDANCY = 3;
DELETE OBSOLETE RECOVERY WINDOW OF 7 DAYS;
/* Forcing the Deletion of Backups and Copies */
DELETE FORCE NOPROMPT BACKUPSET TAG 'weekly_bkup';
Changi ng t he Av ai l abi l i t y of RMAN Back ups and Copi es
I f a file is marked UNAVAI LABLE, RMAN will not use t he file when a RESTORE or RECOVER
command is issued.
Use t he command CHANGE . .. UNAVAI LABLE
Page 265 Oracle DBA Code Examples
CHANGE DATAFILECOPY '/DB01/BACKUP/users01.dbf' UNAVAILABLE;
CHANGE BACKUP OF CONTROLFILE UNAVAILABLE;
CHANGE BACKUP OF CONTROLFILE AVAILABLE;
CHANGE COPY OF ARCHIVELOG SEQUENCE BETWEEN 230 AND 240 UNAVAILABLE;
Ex empt i ng a Back up or Copy f r om t he Ret ent i on Pol i cy
Not e: Specify KEEP .. . LOGS t o save archived logs for a possible incomplet e recovery and
KEEP .. . NOLOGS not t o save archived logs for a possible incomplet e recovery.
Not e: The KEEP FOREVER clause requires t he use of a recovery cat alog.
Not e: Use CHANGE . . . NOKEEP t o make t he file conform t o t he ret ent ion policy.
Use t he command CHANGE . .. KEEP FOREVER| UNTI L
CHANGE BACKUPSET 123 KEEP FOREVER NOLOGS;
CHANGE DATAFILECOPY '/DB01/BACKUP/users01.dbf' KEEP UNTIL 'SYSDATE+60';
The CATALOG Command
Use CATALOG command t o make RMAN aware of t he exist ence of obj ect s t hat are not
recorded in t he reposit ory.
You need t o make RMAN aware of t he exist ence of archived redo log files t hat are not
recorded in t he reposit ory, if you manually have rest ored your cont rol file from a backup.
CATALOG DATAFILECOPY '/DB01/BACKUP/users01.dbf';
CATALOG CONTROLFILECOPY /DB01/BACKUP/db.ctl;
CATALOG ARCHIVELOG '/ORADATA/ARCHIVE1/arch_12.arc',
'/ORADATA/ARCHIVE1/arch_13.arc';
# start searching for all uncataloged files in the directory
CATALOG START WITH '/disk1/backups/';
# Catalog all files and the contents of directories which
# begin with the pattern "/backup/MYSID/arch".
CATALOG START WITH '/backup/MYSID/arch';
# Catalog all files in the current recovery area.
CATALOG RECOVERY AREA NOPROMPT;
# Catalog all files in the current recovery area.
# This is an exact synonym of the previous command.
CATALOG DB_RECOVERY_FILE_DEST NOPROMPT;
The CHANGE UNCATALOG Command
Run t he CHANGE . . . UNCATALOG command t o perform t he following act ions on RMAN
reposit ory records:
o Delet e a specific backup or copy record from t he recovery cat alog
o Updat e a backup or copy record in t he t arget cont rol file reposit ory t o st at us DELETED
RMAN does not t ouch t he specified physical files: it only alt ers t he reposit ory records for
t hese files. You can use t his command when you have delet ed a backup or copy t hrough a
means ot her t han RMAN.
CHANGE ARCHIVELOG UNCATALOG;
CHANGE DATAFILECOPY '/DB01/BACKUP/users01.dbf' UNCATALOG;
Page 266 Oracle DBA Code Examples
RMAN Cat al og
Cr eat i ng a Recov er y Cat al og
1. Creat e t ablespace
2. Creat e cat alog owner
CREATE USER RMAN IDENTIFIED BY rman
TEMPORARY TABLESPACE temp
DEFAULT TABLESPACE rman_tbs
QUOTA UNLIMITED ON rman_tbs;
3. Grant privileges
GRANT connect, resource, recovery_catalog_owner to rman;
4. Creat e cat alog
rman catalog rman_db1/rman_db1@catdb
RMAN> create catalog tablespace rman_ts;
5. Connect t o t arget dat abase as SYSDBA
RMAN TARGET SYS/SYS@TEST2 CATALOG RMAN/RMAN@TEST1
6. Regist er t arget dat abase ( mak e su r e ORACLE_SI D i s p r oper l y set ) :
REGISTER DATABASE;
RMAN Cat al og Repor t i ng
Use REPORT and LIST commands.
Alt ernat ively you can use SQL commands t o query t he RMAN dat a dict ionary views. Examples of t hose
view are t he f ollowing:
RC_DATABASE
RC_DATAFILE
RC_STORED_SCRIPT
RC_STORED_SCRIPT_LINE
RC_TABLESPACE
/* report command */
REPORT SCHEMA
REPORT OBSOLETE;
REPORT NEED BACKUP;
# datafile containing undergone a nologging data (must be backed up)
REPORT UNRECOVERABLE
/* list command */
LIST BACKUP;
LIST BACKUP RECOVERABLE;
LIST COPY;
LIST ARCHIVELOG ALL;
LIST SCRIPT NAMES;
LIST GLOBAL SCRIPT NAMES;
LIST INCARNATION;
Upgr adi ng a Recover y Cat al og
I f your RMAN client is f rom t he Oracle 11. 1 release, but t he recovery cat alog schema i s f rom an older
version, you must upgrade t he recovery cat alog.
-- to know current version of ur catalog
SELECT * FROM rcver;
-- upgrade steps
Page 267 Oracle DBA Code Examples
1) If the recovery catalog owner that you created is from a release before
10.1, execute the following
GRANT command (assuming that rman is the catalog owner):
SQL> GRANT CREATE TYPE TO rman;
2) Start RMAN and connect to the recovery catalog database.
RMAN> connect catalog rman/rman;
3) Execute the UPGRADE CATALOG command.
RMAN> UPGRADE CATALOG;
4) Confirm the command by rerunning it.
RMAN> UPGRADE CATALOG;
You can now use the recovery catalog with the RMAN client from the Oracle
Database 11g release.
I mpor t i ng Recov er y Cat al ogs
To merge t wo recovery cat alogs, one f rom t he 10. 2 release and t he ot her f rom 11g, int o a single 11g
release cat alog schema.
1. Connect to the destination recovery catalog.
$ rman
RMAN> connect catalog rman/rman@rman11
2. Issue the IMPORT CATALOG command
RMAN> import catalog rman1/rman1@rman10;
To specify which database to register:
RMAN> import catalog rman10/rman10@tenner dbid = 123456, 1234557;
RMAN> import catalog rman10/rman10@tenner db_name = testdb, mydb;
-- by default, the databases are unregistered from the source catalog:
RMAN> import catalog rman10/rman10@tenner NO UNREGISTER
Movi ng a Recov er y Cat al og
-- 1) create empty recovery catalog
-- 2) connect and import:
RMAN> connect catalog rman/rman@target_db
RMAN> import catalog rman10/rman10@source_db;
Dr oppi ng a Recov er y Cat al og
connect catalog rman/rman@target_db
DROP CATALOG;
Vi r t ual Pr i vat e Cat al ogs
I n Oracle Dat abase 11g, you can rest rict access t o t he recovery cat alog by grant ing access t o only a
subset of t he met adat a in t he recovery cat alog. The subset t hat a user has read/ writ e access t o is t ermed
as virt ual privat e cat alog, or j ust virt ual cat alog. The cent ral or source recovery cat alog is now called t he
base recovery cat alog.
Following are t he st eps t o creat e a new privat e cat alog f or t he dat abase user SCOTT:
# grant the role RECOVERY_CATALOG_OWNER to the user
SQL>GRANT RECOVERY_CATALOG_OWNER TO scott;
# in RMAN session, connect as the base catalog owner
RMAN>CONNECT CATALOG rman/rman@mydb
RMAN>GRANT CATALOG FOR DATABASE db1, db2 TO SCOTT;
# connect as the granted user (virtual catalog onwer) and create the virtual catalog
RMAN>CONNECT CATALOG scott/lion@mydb
RMAN>CREATE VIRTUAL CATALOG;
# make sure only granted dbs are seen
RMAN>LIST INCARNATION;
Page 268 Oracle DBA Code Examples
I f t he cat alog is t o be used f or releases pre- Oracle 11g client s, in t he SQL* Plus log on as t he virt ual
privat e cat alog owner and run t he f ollowing procedure, where " rman" is t he name of t he base cat alog
owner:
SQL> CONN scott/lion@mydb
SQL> EXEC rman.DBMS_RCVCAT.CREATE_VIRTUAL_CATALOG;
Not e A virt ual privat e cat alog owner can creat e a local st ored scri pt , but has only read- only access t o
global script s.
The CATALOG FOR DATABASE privileges include t he privilege t o regist er and unregist er t hose
dat abases f or which t he cat alog f or dat abase privilege was grant ed.
The set of views and synonyms t hat makes up t he virt ual pr ivat e cat alog is st ored in t he schema
of t he virt ual cat alog owner.
Man agi n g Vi r t u al Pr i vat e Cat al ogs
The base recovery cat alog owner can opt ionally grant a virt ual cat alog owner t he right t o regist er new
t arget dat abases in t he recovery cat alog by specif ying t he REGISTER dat abase clause wit h t he GRANT
command. Following is an example:
RMAN> grant register database to scott;
The virt ual cat alog owner must have t he SYSDBA and SYSOPER privileges on t he t raget dat abase, t o
perf orm most of t he RMAN operat ions on it .
Following are examples of removing t he privileges f rom a virt ual cat alog owner:
# To remove recovery catalog access to a database from a user:
RMAN>CONNECT CATALOG RMAN/RMAN@MYDB;
RMAN>REVOKE CATALOG FOR DATABASE db1 FROM scott;
# To revoke the ability to register new databases from a virtual private catalog owner:
RMAN>REVOKE REGISTER DATABASE FROM scott;
# To revoke both the catalog and register privileges from a user:
RMAN>REVOKE ALL PRIVILEGES FROM scott;
Dr oppi n g a Vi r t u al Pr i vat e Cat al og
Virt ual privat e cat alog owners can drop t he privat e recovery cat alog t hey own by issuing t he DROP
CATALOG command. Following is an example:
# Log in as the virtual catalog owner:
RMAN>CONNECT CATALOG scott/<password>@mydb;
# Issue the drop catalog command
RMAN>DROP CATALOG;
Caut i on When t he DROP CATALOG command is issued by t he virt ual cat alog owner, all t he met adat a
pert aining t o it is delet ed f rom t he base recovery cat alog.
Usi ng RMAN Scr i pt s
# create script
CREATE SCRIPT nightly_backup {
ALLOCATE CHANNEL c1 TYPE DISK;
BACKUP DATABASE FORMAT '/u01/app/oracle/%u';
SQL 'ALTER DATABASE BACKUP CONTROLFILE TO TRACE';
}
Page 269 Oracle DBA Code Examples
# run it
RUN {EXECUTE SCRIPT nightly_backup;}
# create global script: accessible by any registered db
CREATE GLOBAL SCRIPT global_full_backup
{..
# creating and using dynamic scripts:
CREATE SCRIPT myscript { ... BACKUP TAG &1 ..
RUN
{ EXECUTE SCRIPT myscript
USING arch_bkp
FY09Q4;}
# print a script on the screen ( or query RC_STORED_SCRIPT_LINE )
PRINT GLOBAL SCRIPT global_full_backup;
# listing script names
LIST SCRIPT NAMES;
# update a script
REPLACE SCRIPT full_backup { ..
# converting stored script to text file
PRINT script nightly_backup to file 'test.txt';
# delete a script
DELETE SCRIPT 'my-script';
Page 270 Oracle DBA Code Examples
Dupl i cat i ng ( Cl oni ng) a Dat abase
A duplicat e dat abase is a copy of your t arget dat abase wit h a new, unique dat abase
ident ifier ( DBI D) .
Dat abase Dupl i cat i on ( Cl oni ng) Met hods
Using RMAN DUPLI CATE command
Using t he OEM Dat abase Cont rol
Manually wit h SQL* Plus
Dat abase Dupl i cat i on Techni ques
Following are t he t echniques for dat abase duplicat ion:
o Duplicat ing an Act ive Dat abase: From an act ive dat abase, connect ed t o t he t arget and
auxiliary inst ances ( no backup is required) .
o Duplicat ing a Dat abase wit h a Target Connect ion: From backup, connect ed t o t he
t arget and auxiliary inst ances.
o Duplicat ing a Dat abase wit h Recovery Cat alog Wit hout Target Connect ion: From
backup, connect ed t o t he auxiliary inst ance, not connect ed t o t he t arget , but wit h
recovery cat alog connect ion.
o Duplicat ing a Dat abase wit hout Recovery Cat alog or Target Connect ion: From backup,
connect ed t o t he auxiliary inst ance, not connect ed t o t he t arget and t he recovery
cat alog.
Dat abase Dupl i cat i on Pr er equi si t es
Bot h t he t arget and dest inat ion dat abases must be on an ident ical operat ing syst em
plat form.
The password file must exist for t he source dat abase and bot h t he t arget and dest inat ion
dat abases must have t he same SYS password.
The t arget dat abase must be open or in mount st at e.
I f t he t arget dat abase is open, it must be in ARCHI VELOG mode.
Dupl i cat i ng an Act i ve Dat abase usi ng RMAN
-Create a password file in the destination server:
orapwd FILE=D:\oracle\product\11.1.0\db_1\database\PWDora11g2.ora
PASSWORD=ora11g ENTRIES=10 ignorecase=n
-Establish Oracle Net connectivity to the auxiliary instance in both the
source and destination servers:
ORA11G2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = moep10)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
Page 271 Oracle DBA Code Examples
(SERVICE_NAME = ora11g2)
)
)
-Add the auxiliary database service to the listener configuration file in the
source server:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ora11g)
(ORACLE_HOME = C:\app\Administrator\product\11.1.0\db_1)
(SID_NAME = ora11g)
)
(SID_DESC =
(GLOBAL_DBNAME = ora11g2)
(ORACLE_HOME = C:\app\Administrator\product\11.1.0\db_1)
(SID_NAME = ora11g2)
)
)
- create a text-based initialization parameter file for the auxiliary instance
that contains only one parameter: DB_NAME
in ORACLEHOME\database\initora11g2.ora
DB_NAME=ora11g2
- create Oracle SID service (in Windows)
oradim -new -sid ora11g2
- connect to the auxilary instance:
sqlplus /nolog
conn sys/ora11g@ora11g2 as sysoper
STARTUP NOMOUNT pfile=D:\oracle\product\11.1.0\db_1\database\InitOra11g2.ora
-- Start and Configure RMAN Before Duplication
# source database
RMAN>CONNECT TARGET SYS@ora11g
# duplicate database instance
RMAN>CONNECT AUXILIARY SYS@ora11g2
-- You may want to increase the parallelism setting of your source database
disk channels
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 ;
-- check parameters containing folder info:
col value format a35
col name format a30
select NAME, VALUE FROM v$parameter where upper(value) like '%D:\%';
Page 272 Oracle DBA Code Examples
-- Run the DUPLICATE command
-- duplicating a database with a different directory structure
-- ( CREATE REQUIRED DIRS)
DUPLICATE TARGET DATABASE TO ora11g2
FROM ACTIVE DATABASE
DB_FILE_NAME_CONVERT 'D:\oracle\oradata\ora11g','D:\oracle\oradata\ora11g2'
SPFILE
PARAMETER_VALUE_CONVERT 'D:\oracle\oradata\ora11g',
'D:\oracle\oradata\ora11g2'
SET MEMORY_TARGET '350M'
SET LOG_FILE_NAME_CONVERT 'D:\oracle\oradata\ora11g',
'D:\oracle\oradata\ora11g2'
SET audit_file_dest 'D:\oracle\admin\ora11g2\adump'
SET
CONTROL_FILES="D:\ORACLE\ORADATA\ORA11G2\CONTROL01.CTL","D:\ORACLE\ORADATA\ORA
11G2\CONTROL02.CTL";
Dupl i cat i ng a Dat abase w i t hout Recover y Cat al og or Tar get Connect i on
Oracle 11g R2
This is backup-based duplication
- Make Backups and Archived Logs Accessible to the Duplicate Instance:
- if backup files location cannot be shared:
Create a new directory in the source host that has the same name as the
directory on the destination host that will contain the backups:
in source
mkdir C:\oracle\stagingbackups
in source
RUN {
ALLOCATE CHANNEL c1 DEVICE TYPE DISK FORMAT 'C:\oracle\stagingbackups\%U';
BACKUP AS COPY DATABASE;
BACKUP AS COPY CURRENT CONTROLFILE FORMAT
'C:\oracle\stagingbackups\control01.ctl';
}
OR
RUN {
ALLOCATE CHANNEL c1 DEVICE TYPE DISK FORMAT 'C:\oracle\stagingbackups\%U';
BACKUP COPY OF DATABASE ;
BACKUP AS COPY CURRENT CONTROLFILE FORMAT
'C:\oracle\stagingbackups\control01.ctl';
}
- Manually transfer the backups in the new directory on the source host to the
identically named directory on the destination host.
- in source:
-- check parameters containing folder info:
col value format a35
col name format a30
select NAME, VALUE FROM v$parameter where upper(value) like '%C:\%';
OR
select NAME, VALUE FROM v$parameter
where name in
Page 273 Oracle DBA Code Examples
('control_files','db_recovery_file_dest','audit_file_dest','diagnostic_dest');
- in destination:
-Create a password file in the destination server:
orapwd FILE=C:\oracle\oracledb11g\database\PWDora11g2.ora PASSWORD=ora11g
ENTRIES=10 ignorecase=n
- create a text-based initialization parameter file for the auxiliary instance
that contains only one parameter: DB_NAME
in ORACLEHOME\database\initora11g2.ora
DB_NAME=ora11g2
- create Oracle SID service (in Windows)
oradim -new -sid ora11g2
-configure Net connectivity to the auxiliary instance in the destination
server:
ORA11G2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = pc02)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ora11g2.pc02)
)
)
- configure the listner, if no listener already exists
- manually register the database in the listner.ora:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ora11g2.pc02)
(ORACLE_HOME = C:\oracle\oracledb11g)
(SID_NAME = ora11g2)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = PC02)(PORT = 1521))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
- connect to the auxilary instance:
set ORACLE_SID=ORA11G2
sqlplus /nolog
Page 274 Oracle DBA Code Examples
conn sys/ora11g@ora11g2 as sysoper
STARTUP NOMOUNT pfile=C:\oracle\oracledb11g\database\initora11g2.ora
-- Start and Configure RMAN Before Duplication
# duplicate database instance
set ORACLE_SID=ORA11G2
rman
CONNECT AUXILIARY SYS@ora11g2
-- You may want to increase the parallelism setting of your source database
disk channels
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 ;
-- Run the DUPLICATE command
-- duplicating a database with a different directory structure
-- ( CREATE REQUIRED DIRS)
DUPLICATE TARGET DATABASE TO ora11g2
BACKUP LOCATION 'C:\oracle\stagingbackups'
DB_FILE_NAME_CONVERT 'C:\oracle\oradata\ora11g','C:\oracle\oradata\ora11g2'
SPFILE
PARAMETER_VALUE_CONVERT 'C:\oracle\oradata\ora11g', 'C:\oracle\oradata\ora11g'
SET MEMORY_TARGET '620M'
SET LOG_FILE_NAME_CONVERT 'C:\oracle\oradata\ora11g',
'C:\oracle\oradata\ora11g2'
SET audit_file_dest 'C:\ORACLE\ADMIN\ORA11G2\ADUMP'
SET
CONTROL_FILES="C:\ORACLE\ORADATA\ORA11G2\CONTROL01.CTL","C:\ORACLE\ORADATA\ORA
11G2\CONTROL02.CTL";
Manual l y Dupl i cat i ng a Dat abase
-- it is assumed that the duplicate database will have different name
(ora11g2) from prod (ora11g)
1. Copy the prod database files to the target location.
- in prod
SHUTDOWN IMMEDIATE
COPY THE DATABASE DATA FILES (EXCLUDE THE TEMFILES) + redo log file + spfiles
CREATE PFILE='C:\TEMP\MYPFILE.TXT' FROM MEMORY;
Edit the generated PFILE to modify directory-based parameters like:
control_files
audit_file_dest
db_recovery_file_dest
diagnostic_dest
Change DB name:
db_domain
db_name
2. Prepare a text file for the creation of a control file for the new database
as follows:
- in prod
SQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACE;
Page 275 Oracle DBA Code Examples
in ORACLE_BASE\diag\rdbms\ora11g\ora11g\trace\ folder
Modify as required the parameters below, include them in the parameter file
and create their folders:
Note: if you define diagnostic_dest, you don't have to create its sub-
directories
-- The following are current System-scope REDO Log Archival related
-- parameters and can be included in the database initialization file.
--
-- LOG_ARCHIVE_DEST=''
-- LOG_ARCHIVE_DUPLEX_DEST=''
--
-- LOG_ARCHIVE_FORMAT=ARC%S_%R.%T
--
-- DB_UNIQUE_NAME="ora11g2"
--
-- LOG_ARCHIVE_CONFIG='SEND, RECEIVE, NODG_CONFIG'
-- LOG_ARCHIVE_MAX_PROCESSES=4
-- STANDBY_FILE_MANAGEMENT=MANUAL
-- STANDBY_ARCHIVE_DEST=C:\oracle\oracledb11g\RDBMS
-- FAL_CLIENT=''
-- FAL_SERVER=''
--
-- LOG_ARCHIVE_DEST_10='LOCATION=USE_DB_RECOVERY_FILE_DEST'
-- LOG_ARCHIVE_DEST_10='OPTIONAL REOPEN=300 NODELAY'
-- LOG_ARCHIVE_DEST_10='ARCH NOAFFIRM NOEXPEDITE NOVERIFY SYNC'
-- LOG_ARCHIVE_DEST_10='REGISTER NOALTERNATE NODEPENDENCY'
-- LOG_ARCHIVE_DEST_10='NOMAX_FAILURE NOQUOTA_SIZE NOQUOTA_USED
NODB_UNIQUE_NAME'
-- LOG_ARCHIVE_DEST_10='VALID_FOR=(PRIMARY_ROLE,ONLINE_LOGFILES)'
-- LOG_ARCHIVE_DEST_STATE_10=ENABLE
--
--
-- the current versions of all online logs are available
-- Note: the generated code will use "REUSE DATABASE .. NORESETLOGS"; change
it to "SET DATABASE.. RESETLOGS " if
-- you want to use a differnt db name
CREATE CONTROLFILE SET DATABASE "ORA11G2" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 'C:\ORACLE\ORADATA\ORA11G2\REDO01.LOG' SIZE 50M,
GROUP 2 'C:\ORACLE\ORADATA\ORA11G2\REDO02.LOG' SIZE 50M,
GROUP 3 'C:\ORACLE\ORADATA\ORA11G2\REDO03.LOG' SIZE 50M
-- STANDBY LOGFILE
DATAFILE
'C:\ORACLE\ORADATA\ORA11G2\SYSTEM01.DBF',
'C:\ORACLE\ORADATA\ORA11G2\SYSAUX01.DBF',
'C:\ORACLE\ORADATA\ORA11G2\UNDOTBS01.DBF',
'C:\ORACLE\ORADATA\ORA11G2\USERS01.DBF',
'C:\ORACLE\ORADATA\ORA11G2\FDA_TBS.DBF'
CHARACTER SET AR8MSWIN1256
;
Page 276 Oracle DBA Code Examples
3. in destination: Create a password file in the destination server:
orapwd FILE=C:\oracle\oracledb11g\database\PWDora11g2.ora PASSWORD=ora11g
ENTRIES=10 ignorecase=n
4. Create Oracle SID service (in Windows)
oradim -new -sid ora11g2
5. Configure the listner, if no listener already exists
6. Connect to the instance:
set ORACLE_SID=ORA11G2
sqlplus /nolog
conn / as sysdba
# use pfile from step 1
STARTUP NOMOUNT pfile=C:\oracle\oracledb11g\database\initora11g2.ora
sample of its contetns follows:
audit_file_dest='C:\ORACLE\ADMIN\ORA11G2\ADUMP'
audit_trail='DB'
compatible='11.1.0.0.0'
control_files='C:\ORACLE\ORADATA\ORA11G2\CONTROL01.CTL'
control_files='C:\ORACLE\ORADATA\ORA11G2\CONTROL02.CTL'
control_files='C:\ORACLE\ORADATA\ORA11G2\CONTROL03.CTL'
db_block_size=8192
db_domain='pc02'
db_name='ora11g2'
db_recovery_file_dest='C:\oracle\flash_recovery_area'
db_recovery_file_dest_size=4048M
diagnostic_dest='C:\ORACLE'
dispatchers='(PROTOCOL=TCP) (SERVICE=ora11gXDB)'
log_buffer=5654016 # log buffer update
memory_target=620M
open_cursors=400
optimizer_dynamic_sampling=2
optimizer_mode='ALL_ROWS'
plsql_warnings='DISABLE:ALL' # PL/SQL warnings at init.ora
processes=400
query_rewrite_enabled='TRUE'
remote_login_passwordfile='EXCLUSIVE'
result_cache_max_size=2112K
sessions=390
skip_unusable_indexes=TRUE
undo_tablespace='UNDOTBS1'
LOG_ARCHIVE_FORMAT=ARC%S_%R.%T
DB_UNIQUE_NAME="ora11g2"
LOG_ARCHIVE_DEST_10='LOCATION=USE_DB_RECOVERY_FILE_DEST'
7. Create the control file be executing the command in step 2
8. Execute:
ALTER DATABASE OPEN RESETLOGS;
Page 277 Oracle DBA Code Examples
8. Execute:
ALTER TABLESPACE TEMP ADD TEMPFILE 'C:\ORACLE\ORADATA\ORA11G2\TEMP01.DBF' size
250m autoextend on next 10m maxsize 4g;
9. Execute:
ALTER DATABASE RENAME GLOBAL_NAME TO ora11g2.pc02;
ALTER SYSTEM REGISTER;
Page 278 Oracle DBA Code Examples
Usi ng Or acl e Fl ashback Tech nol ogy
Page 279 Oracle DBA Code Examples
Fl ashback Opt i ons
Row Level:
o Flashback Query
o Flashback Versions Query
o Flashback Transact ion Query
o Flashback Transact ion Backout
Table level:
o Flashback Table
o Flashback Drop
o Flashback Dat a Archive ( FDA)
Dat abase level:
o Flashback Dat abase
Page 280 Oracle DBA Code Examples
Pr epar i ng Your Dat abase f or Fl ashback
-- must be AUTO
show parameter UNDO_MANAGEMENT
-- set undo retension target
select value from v$parameter where upper(name)='UNDO_RETENTION';
alter system set UNDO_RETENTION = 2400;
-- get undo tbs name
show parameter UNDO_TABLESPACE
-- consider guaranteeing undo retention:
ALTER TABLESPACE UNDOTBS1 RETENTION GUARANTEE ;
Page 281 Oracle DBA Code Examples
Usi ng Row Lev el Fl ashback Opt i ons
Fl ashback Quer y
-- if the user isn't the owner
GRANT FLASHBACK ON employees TO scott;
GRANT FLASHBACK ANY TABLE TO scott;
-- what was the salary at that time
SELECT employee_id, department_id, salary FROM employees
AS OF TIMESTAMP
TO_TIMESTAMP ('2008-11-07 11:30:00', 'YYYY-MM-DD HH:MI:SS')
WHERE employee_id=101;
select employee_id , salary from employees
AS OF SCN 794532059
where employee_id=101
/* using DBMS_FLASHBACK */
-- set the specified point in time in the past
select ... -- the output will be as of current time
EXECUTE DBMS_FLASHBACK.ENABLE_AT_TIME (TO_TIMESTAMP '11-DEC-2008 10:00:00',
'DD-MON-YYYY hh24:MI:SS');
select ... -- the output will be as of the set time
EXECUTE DBMS_FLASHBACK.DISABLE ();
-- to get current SCN
SELECT current_scn from V$DATABASE;
select DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER from dual;
Fl ashback Ver si ons Quer y
The VERSI ONS clause cannot span DDL commands.
Synt ax:
SELECT [pseudocolumns] . . . /* provide details about the row history */
FROM . . . /* table name goes here */
VERSIONS BETWEEN
{SCN|TIMESTAMP {expr|MINVALUE} AND {expr|MAXVALUE}}
[AS OF{SCN|TIMESTAMP expr}]
WHERE [pseudocolumns . . . ] . . .
Pseudo- Columns:
VERSIONS_STARTSCN and VERSIONS_STARTTIME:
VERSIONS_ENDSCN and VERSIONS_ENDTIME: if null, current or deleted
VERSIONS_OPERATION: I,D,U
VERSIONS_XID: trans ID
Not e: The act ual t ime might be up t o t hree seconds earlier or lat er t han t he t ime you
specify wit h a t ime st amp.
Page 282 Oracle DBA Code Examples
Flashback Versions Query rest rict ions:
o You cant apply t he VERSI ONS clause across DDL operat ions.
o The query will ignore purely physical row changes as happen, for example, during
a segment shrink operat ion.
SELECT versions_xid AS XID,
versions_startscn AS START_SCN,
versions_endscn AS END_SCN,
versions_operation AS OPERATION,
last_name,
salary
FROM EMPLOYEES
VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE
WHERE employee_id = 101;
SET LINESIZE 100
COL START_TIME FORMAT A21
COL END_TIME FORMAT A21
SELECT versions_xid AS XID,
VERSIONS_STARTTIME AS START_TIME,
VERSIONS_ENDTIME AS END_TIME,
VERSIONS_OPERATION AS OPERATION,
last_name,
salary
FROM EMPLOYEES
VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE
WHERE employee_id = 101;
Fl ashback Tr ansact i on Quer y
I t is act ually a SELECT from FLASHBACK_TRANSACTI ON_QUERY
/* requirements */
--(1) highly recommended
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
--(2) required privs
grant SELECT ANY TRANSACTION to scott;
/* using it */
SELECT to_char(start_timestamp,'dd-Mon hh24:mi'), operation, undo_sql
FROM flashback_transaction_query
WHERE start_timestamp >= TO_TIMESTAMP ('2009-11-09 05:00:00', 'YYYY-MM-DD
HH:MI:SS')
AND table_owner='HR' AND table_name='EMPLOYEES'
order by start_timestamp desc;
/* using flashback transaction with versions query */
SELECT xid, START_SCN , commit_scn COMMIT, OPERATION, logon_user, undo_sql
FROM flashback_transaction_query
WHERE xid = HEXTORAW('0600230050010000'); -- obtained from version query
Fl ashback Tr ansact i on ( Back out )
Target : t o back- out a commit t ed t ransact ion and all dependent t ransact ions while t he
dat abase is st ill online.
Page 283 Oracle DBA Code Examples
OEM provides an easier t o manage int erface.
DBMS_FLASHBACK. TRANSACTI ON_BACKOUT paramet ers:
NUMBEROFXIDS Number of t ransact ions t o be backed out
XIDS array of t ransact ion ident ifiers
OPTIONS nocascade (default ) , cascade, nocascade_force, noconflict _only
TIMEHINT t ime at t he st art of t he t ransact ion you are backing out
SCNHINT SCN at t he beginning of t he t ransact ion you are backing out
-- Setting Up for Flashback Transaction Backout
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
-- required privs
grant EXECUTE on DBMS_FLASHBACK to hr;
grant SELECT ANY TRANSACTION to hr;
-- get the transaction ID
-- use v$ views or the flashback transaction query or log miner
-- following example from sql in cache:
select A.SQL_TEXT, B.XID
from V$OPEN_CURSOR A, V$TRANSACTION B, V$SESSION C
where A.SID=C.SID AND C.TADDR=B.ADDR
and A.SQL_TEXT LIKE '%delete%';
-- backout the trans
declare
V_XID SYS.XID_ARRAY;
begin
V_XID := SYS.XID_ARRAY('03001800BC0D0000');
DBMS_FLASHBACK.TRANSACTION_BACKOUT( NUMTXNS => 1,
XIDS=>V_XID, OPTIONS=>DBMS_FLASHBACK.CASCADE); -- children trans also
backed out
end;
/
-- to make it permanent: you must now COMMIT or ROLLBACK
-- Information about transaction Backouts done can be obtained from:
DBA_FLASHBACK_TXN_STATE: any transaction shown in this view is backed out.
DBA_FLASHBACK_TXN_REPORT: compensating status of all transactions in the
database
Page 284 Oracle DBA Code Examples
Usi ng Tabl e Lev el Fl ashback Opt i ons
Fl ashback Tabl e
ROW MOVEMENT must be enabled in advance and before flashback recovery t ime.
Generat es undo and redo dat a
Synt ax:
FLASHBACK TABLE [schema.]table [,[schema.]table] ... TO {SCN|TIMESTAMP} expr
By default , Oracle disables all relevant t riggers and reenables t hem upon complet ing t he
t able recovery.
Several rest rict ions apply:
o You cant flash back a t able t o a t ime preceding any DDL operat ion involving a change
in t able st ruct ure.
o I f t he flashback operat ion involves mult iple t ables, all of t he t ables must be flashed
back or none.
-- required privs
grant FLASHBACK ANY TABLE to hr;
grant FLASHBACK on hr.employees to hr;
-- SELECT, INSERT, DELETE, and ALTER privileges on the table to be flashed
back are required
-- required on the table
-- also enable it for the tables that reference it
ALTER TABLE emp ENABLE ROW MOVEMENT;
-- TAKE current SCN before flashback to go back to initial stat of table if
-- the flashback doesnt do good
SELECT current_scn from V$DATABASE;
select DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER from dual
FLASHBACK TABLE emp TO SCN 5759290864;
FLASHBACK TABLE emp TO TIMESTAMP TO_TIMESTAMP ('2008-01-30 07:00:00', 'YYYY-
MM-DD HH24:MI:SS');
FLASHBACK TABLE emp TO TIMESTAMP TO_TIMESTAMP ('2009-04-05 10:00:00', 'YYYY-
MM-DD HH24:MI:SS') ENABLE TRIGGERS;
Fl ashback Dr op
When t able is dropped, it s dependent s' names will also renamed by syst em generat ed
names.
I f a t able is undropped, t he crypt ic syst em-generat ed names of t he dependent s remain.
-- Necessary Privileges ****
be the owner or
have the drop privileges (DROP TABLE or DROP ANY TABLE) on a table.
You must have the SELECT privilege and the FLASHBACK privilege on an object in
order to query that object in the Recycle Bin.
Page 285 Oracle DBA Code Examples
-- list dropped tables ****
-- db level
SELECT owner, original_name, object_name,ts_name, droptime, CAN_UNDROP
FROM dba_recyclebin;
-- user level
SELECT * FROM RECYCLEBIN;
SHOW RECYCLEBIN
-- Enabling and Disabling the Recycle Bin ***
-- session level
ALTER SESSION SET recyclebin = OFF;
-- db level
-- it affects the parameter file
ALTER SYSTEM SET recyclebin = OFF;
-- retreive data from a dropped table
SELECT * FROM "BIN$xTMPjHZ6SG+1xnDIaR9E+g==$0";
-- restore table from drop
FLASHBACK TABLE table_name TO BEFORE DROP;
FLASHBACK TABLE "BIN$xTMPjHZ6SG+1xnDIaR9E+g==$0" TO BEFORE DROP;
FLASHBACK TABLE "BIN$xTMPjHZ6SG+1xnDIaR9E+g==$0" TO BEFORE DROP RENAME TO
NEW_PERSONS;
-- you can rename any dependent
SELECT INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME = 'JOB_HISTORY';
ALTER INDEX "BIN$DBo9UChtZSbgQFeMiAdCcQ==$0" RENAME TO JHIST_JOB_IX;
-- purge a table(s)
DROP TABLE table_name PURGE;
PURGE TABLE int_admin_emp;
PURGE TABLE BIN$jsleilx392mk2=293$0;
PURGE TABLESPACE users;
PURGE TABLESPACE users USER scott;
PURGE RECYCLEBIN;
-- purge all objects in the db
PURGE DBA_RECYCLEBIN;
Fl ashback Dat a Ar chi ve
FDA is part of t he "Oracle Tot al Recall" opt ion in Oracle dat abase 11g.
Page 286 Oracle DBA Code Examples
Disabling flashback archiving for a t able or dropping it s flashback archive obj ect will result
in all t he hist orical dat a for t hat t able being lost . I t also requires SYSDBA or FLASHBACK
ARCHI VE ADMI NI STER privilege.
For a t able wit h Flashback Archiving enabled, you cannot issue t he following DDL
commands: ALTER TABLE ( except adding a column) , DROP TABLE, RENAME TABLE and
TRUNCATE TABLE.
/* to obtain info about FDA */
-- information on all flashback archives contained in the database
SELECT * FROM DBA_FLASHBACK_ARCHIVE;
-- information on all tablespaces containing flashback archives
SELECT * FROM DBA_FLASHBACK_ARCHIVE_TS;
-- which flashback archive a given table is assigned to.
SELECT TABLE_NAME, OWNER_NAME, FLASHBACK_ARCHIVE_NAME FROM
DBA_FLASHBACK_ARCHIVE_TABLES;
-- history tables names created by Oracle:
select * from dba_FLASHBACK_ARCHIVE_TABLES;
/* Setting up the Data Flashback Archive */
--1) for system level FDA, FLASHBACK ARCHIVE ADMINISTER priv is required
SELECT * FROM DBA_SYS_PRIVS WHERE PRIVILEGE LIKE '%FLASHBACK ARC%'
-- for specific table:
GRANT FLASHBACK ARCHIVE ON hr_hist TO scott;
--2) Create FDA object
-- The statement in the example above may return ORA-55603: Invalid Flashback
Archive command error, if you try to create a flashback archive in a non-empty
tablespace. I figured out a workaround which is to put the tablespace name
between double quotations.
CREATE FLASHBACK ARCHIVE hr_hist -- DEFAULT keyword may be used
TABLESPACE fda_archives -- mandatory (and it must be with ASSM)
QUOTA 5G -- optional in M,G,T,P
RETENTION 24 MONTH; -- mandatory (in YEAR, MONTH, DAY)
--3) Enable Flashback Data Archiving for existing or new tables
-- Create the table, using the default archive location.
CREATE TABLE my_table(..) FLASHBACK ARCHIVE;
-- Modify a table to use the default archive location
-- Note: if there is not default flashback archive, an error will be raised
ALTER TABLE my_table FLASHBACK ARCHIVE;
-- Create a table to use a non-default archivelocation
CREATE TABLE my_table (..) FLASHBACK ARCHIVE hr_arc;
Page 287 Oracle DBA Code Examples
-- Modify a table to use a non-default archive location.
ALTER TABLE my_table FLASHBACK ARCHIVE hr_arc;
-- Modify a table to stop (disable) archiving.
ALTER TABLE my_table NO FLASHBACK ARCHIVE;
/* Altering Flashback Archives */
-- make myflash the default flashback archive (as SYSDBA)
ALTER FLASHBACK ARCHIVE myflash SET DEFAULT;
-- add space to the flashback archive
ALTER FLASHBACK ARCHIVE myflash ADD TABLESPACE mytbs;
-- remove the tablespace from use by the flashback archive
-- (assign it to another tablespace first)
ALTER FLASHBACK ARCHIVE myflash REMOVE TABLESPACE mytbs;
-- change the quota for the archive
ALTER FLASHBACK ARCHIVE myflash MODIFY TABLESPACE mytbs QUOTA 10G;
-- undefined quota (make the space unlimited)
ALTER FLASHBACK ARCHIVE myflash MODIFY TABLESPACE mytbs;
-- change the archive retention time
ALTER FLASHBACK ARCHIVE myflash MODIFY RETENTION 2 YEAR;
-- purge all archived data
ALTER FLASHBACK ARCH`IVE myflash PURGE ALL;
-- purge data older than 2 days
ALTER FLASHBACK ARCHIVE MYFLASH
PURGE BEFORE TIMESTAMP( SYSTIMESTAMP INTERVAL '2' DAY);
-- dropping FDA:
DROP FLASHBACK ARCHIVE myflash;
/* Using Oracle Flashback Data Archives */
SELECT LAST_NAME, SALARY FROM HR.EMPLOYEES
AS OF TIMESTAMP TO_TIMESTAMP ('2008-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS');
SELECT LAST_NAME, SALARY FROM HR.EMPLOYEES
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '6' MONTH);
SELECT LAST_NAME, SALARY FROM HR.EMPLOYEES
VERSIONS BETWEEN TIMESTAMP
TO_TIMESTAMP ('2008-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS') -- or MINVALUE
AND
TO_TIMESTAMP ('2008-01-01 15:00:00','YYYY-MM-DD HH24:MI:SS') -- or MAXVALUE
Page 288 Oracle DBA Code Examples
WHERE EMPLOYEE_ID = 200;
FLASHBACK TABLE employees TO TIMESTAMP (SYSTIMESTAMP INTERVAL '6' MONTH);
Page 289 Oracle DBA Code Examples
Usi ng Fl ashback Dat abase
When t o use Fl ashback Dat abase
To ret rieve a dropped schema
When a user error affect s t he ent ire dat abase
When you t runcat e a t able in error
When a bat ch j ob performs only part ial changes
Fl ashback Dat abase Consi der at i ons
You cannot use Flashback Dat abase when:
The cont rol file has been rest ored or re- creat ed.
A t ablespace has been dropped.
A dat a file has been reduced in size, for example by a shrink.
Usi ng Fl ashback Dat abase
I t is essent ial t hat you monit or t he flash recovery areas size t o ensure t hat you have
sufficient space so as not t o risk losing any of t he Flashback Dat abase logs.
/* Configuring Flashback Database */
-- Check that your database is in the archivelog mode:
ARCHIVE LOG LIST
-- in minutes ( 1440= 1 day)
ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=1440;
-- in mount level
ALTER DATABASE FLASHBACK ON;
ALTER DATABASE OPEN;
/* Exempting a tablespace form db flashback */
ALTER TABLESPACE users FLASHBACK OFF;
-- to switch it on again:
ALTER TABLESPACE users FLASHBACK ON;
/* Disabling Flashback Database */
-- in mount level
-- all Flashback Database logs will be deleted
ALTER DATABASE FLASHBACK OFF;
Page 290 Oracle DBA Code Examples
/* Obtain info about Flashback Database */
-- to find out how far you can flash back your database
SELECT oldest_flashback_scn,
to_char(oldest_flashback_time,'dd-Mon hh24:mi:ss') oldest_flashback_time
FROM v$flashback_database_log;
-- to estimate the space required by flashback db:
SELECT estimated_flashback_size/1024/1024 estimated_flashback_size,
retention_target, flashback_size/1024/1024 flashback_size
FROM v$flashback_database_log;
-- last 24-hour stats data (each row is one-hour )
SELECT begin_time, end_time, flashback_data, db_data,
redo_data, estimated_flashback_size AS EST_FB_SZE
FROM V$FLASHBACK_DATABASE_STAT
order by begin_time desc;
/* Flashback db in action */
-- flashback db to a past time
STARTUP MOUNT;
FLASHBACK DATABASE TO SCN 5964663;
FLASHBACK DATABASE TO SEQUENCE 12345;
FLASHBACK DATABASE TO TIMESTAMP(SYSDATE -1/24);
-- You can flash back to just before the last RESETLOGS operation by :
FLASHBACK DATABASE TO SCN 5964663 TO BEFORE RESETLOGS;
-- you can check the data before open resetlogs
ALTER DATABASE OPEN READ ONLY;
-- open resetlogs
ALTER DATABASE OPEN RESETLOGS;
-- to undo the results of the entire Flashback operation
RECOVER DATABASE;
/* Assissted commands */
-- current scn
SELECT current_scn FROM V$DATABASE;
Rest or e Poi nt s
Guarant eed rest ore point s use a separat e logging mechanism from t he Flashback logging
used for a Flashback Dat abase operat ion.
However, if you use a guarant eed rest ore point and Flashback Dat abase is enabled, Oracle
wont delet e any Flashback logs and t hus FRA will event ually become full.
Turning off Flashback Dat abase if youre using guarant eed rest ore point s.
Page 291 Oracle DBA Code Examples
Wit h guarant eed rest ore point s, you can only flashback t o exact ly t he rest ore point t ime.
-- obtain info about rp:
SELECT name, scn, storage_size, time, guarantee_flashback_database
FROM v$restore_point;
-- creating ordinary restore point
CREATE RESTORE POINT rp_test;
DROP RESTORE POINT rp_test;
-- creating a guaranteed restore point
CREATE RESTORE POINT test_guarantee GUARANTEE FLASHBACK DATABASE;
-- to use later the rp:
FLASHBACK DATABASE TO RESTORE POINT test_guarantee;
-- to know if flashback db status: if only guaranteed rp is enabled, it'll
return RESTORE POINT ONLY
SELECT flashback_on FROM v$database;
Page 292 Oracle DBA Code Examples
Par t 4 Or acl e Dat abase Secur i t y
Page 293 Oracle DBA Code Examples
Or acl e Dat abase Secur i t y Management
The main aspect s of Oracle dat abase securit y management :
o Aut hor i zat i on: cont rolling access t o dat a
o Aut hent i cat i on: rest rict ing access t o legit imat e users
o Audi t i ng: ensuring account abilit y on t he part of t he users
o Encr y pt i on: safeguarding key dat a in t he dat abase
o Ent er pr i se Secur i t y : managing t he securit y of t he ent ire organizat ional informat ion
st ruct ure
Page 294 Oracle DBA Code Examples
Secur i t y Gui del i nes
Apply Securit y Pat ches. ht t p: / / t echnet . oracle. com/ deploy/ securit y/ alert s. ht m
Enable "Aut omat ic Secure Configurat ion" when creat ing a new dat abase.
Lock default users. Except ions: SYS, SYSTEM, DBSNMP, SYSMAN, and MGMT_VI EW.
St rict password aging and expirat ion policies.
Do not use hard coded passwords in your script .
I f possible, avoid Operat ing Syst em Aut hent icat ion.
Enable SYSDBA operat ions by set t ing AUDI T_SYS_OPERATI ONS t o TRUE. The audit
records are writ t en t o t he operat ing syst em' s audit t rail.
Avoid grant ing ANY privileges and privileges wit h t he ADMI N opt ion.
Whenver possible, use roles rat her t han grant ing privileges direct ly t o users.
Dont grant any unnecessary roles or privileges t o PUBLI C.
select count(*) from DBA_TAB_PRIVS
where GRANTEE='PUBLIC';
Set t he UMASK variable t o 022 t o t he Oracle soft ware OS user owner.
Remove t he SETUI D on all Oracle files.
Unless needed, remove ment ions t o EXTPROC in bot h t he list ener. ora file on t he server
and t he t nsnames. ora file on t he client . Then remove all EXTPROC execut ables from your
$ORACLE_HOME/ bin direct ory ( usually ext proc and xt proc0) . I f needed, refere t o
Document I D 175429. 1 in met alink.
Set a password t o t he list ener. Secure t he linst ener. ora file.
ADMI N_RESTRI CTI ONS= ON
You may use Server- side Access Cont rols in t he sqlnet . ora file as follows:
-- only the addresses in the list are allowed to make connections
tcp.validnode_checking = yes
tcp.invited_nodes = (server1.us.mycompany.com,172.14.16.152)
-- addresses in the list are excluded
tcp.excluded_nodes = (server1.us.mycompany.com,172.14.16.152)
Disable remot e OS aut hent icat ion by set t ing t he following paramet er in t he init .ora :
REMOTE_OS_AUTHENT=FALSE
Consider t he proper set t ing of t he securit y- relat ed paramet ers:
# password case sensitivity (11g)
select value from v$parameter where upper(name)='SEC_CASE_SENSITIVE_LOGON'
alter system set SEC_CASE_SENSITIVE_LOGON = TRUE;
# maximum number of authentication attempts that can be made by a
# client on a connection to the server process. Default 10 (11g)
select value from v$parameter where
lower(name)='sec_max_failed_login_attempts'
alter system set sec_max_failed_login_attempts=10 scope=spfile;
For applicat ion users:
Page 295 Oracle DBA Code Examples
o Grant privileges t o users t hrough roles rat her t han direct access.
o Consider using applicat ion enabled roles.
o The users can make dat a changes only t hrough procedures not using direct
DML st at ement s.
o Consider prevent ing normal users from using SQL* Plus:
-- disable
INSERT INTO SYSTEM.PRODUCT_USER_PROFILE(PRODUCT,userid,attribute,char_value)
VALUES('SQL*Plus','TESTER','ROLES','TEST123');
-- enable
DELETE FROM product_user_profile WHERE userid='TESTER'
AND char_value = 'TEST123';
Page 296 Oracle DBA Code Examples
Managi ng User s
Recommendat ion: creat e default t ablespace t o every user.
For managing resources, it might be bet t er using Resource Manager.
User Profile paramet ers:
o Resource limit paramt ers:
CONNECT_TI ME: ( in minut es)
I DLE_TI ME
CPU_PER_CALL: CPU t ime used per each call
CPU_PER_SESSI ON
SESSI ONS_PER_USER
LOGI CAL_READS_PER_SESSI ON
LOGI CAL_READS_PER_CALL
PRI VATE_SGA: applicable only t o shared server archit ect ure syst ems
COMPOSI TE_LI MI T:
o Password management paramet ers ( see t he following sect ion) :
FAI LED_LOGI N_ATTEMPTS
PASSWORD_LI FE_TI ME
PASSWORD_GRACE_TI ME
PASSWORD_LOCK_TI ME
PASSWORD_REUSE_TI ME
PASSWORD_REUSE_MAX
PASSWORD_VERI FY_FUNCTI ON
-- creating user
CREATE USER user1 IDENTIFIED BY urs1754
TEMPORARY TABLESPACE TEMPTBS01
DEFAULT TABLESPACE user1ts
QUOTA 500M ON user1ts
PROFILE 'SALES_RPOF';
GRANT CREATE SESSION TO salapati;
ALTER USER user1 QUOTA 100M ON user1ts;
GRANT UNLIMITED TABLESPACE TO user1;
SELECT tablespace_name, username, bytes FROM DBA_TS_QUOTAS
WHERE username='USER1';
-- dropping user
DROP USER user1;
DROP USER user1 cascade;
REVOKE CREATE SESSION FROM user1;
Page 297 Oracle DBA Code Examples
-- Creating and Using User Profiles
CREATE PROFILE SALES_PROF
LIMIT
connect_time 120
failed_login_attempts 3
idle_time 60
sessions_per_user 2;
ALTER PROFILE test
LIMIT
sessions_per_user 4
failed_login_attempts 4;
-- to make Oracle enforce the resource limits in
-- the profile, if they are used
ALTER SYSTEM SET resource_limit=true;
ALTER USER salapati PROFILE SALES_PROF;
SELECT profile FROM dba_users
WHERE username = 'USER1';
SELECT DISTINCT resource_name, limit
FROM dba_profiles
WHERE profile='DEFAULT';
-- Password Management Function
-- utlpwdmg.sql script creates verify_function_11g
ALTER PROFILE DEFAULT
LIMIT
PASSWORD_LIFE_TIME 180
PASSWORD_GRACE_TIME 7
PASSWORD_REUSE_TIME UNLIMITED
PASSWORD_REUSE_MAX UNLIMITED
FAILED_LOGIN_ATTEMPTS 10
PASSWORD_LOCK_TIME 1
PASSWORD_VERIFY_FUNCTION verify_function_11G;
-- Dropping a User Profile
DROP PROFILE test CASCADE;
Page 298 Oracle DBA Code Examples
Dat abase Aut hen t i cat i on
Managi n Passw or ds
select value from v$parameter where name='sec_case_sensitive_logon';
-- dynamic
alter system set sec_case_sensitive_logon=false ;
SELECT username, password, password_versions
FROM dba_users
order by 1;
/* making a password expired */
ALTER USER hr IDENTIFIED BY hr PASSWORD EXPIRE;
ALTER PROFILE test_profile
LIMIT PASSWORD_LIFE_TIME 30; -- in days (refere to profile section)
ALTER USER hr PROFILE test_profile;
/* password file */
select value from v$parameter where upper(name)='REMOTE_LOGIN_PASSWORDFILE';
SELECT * FROM v$pwfile_users;
orapwd FILE=testpwd PASSWORD=remorse1 ENTRIES=20
Ex t er nal ( OS) Aut hent i cat i on
Following are t he st eps t o set t ing up OS Aut hent icat ion on UNI X/ Linux and Windows
plat forms.
# to enable external authentication over the net
REMOTE_OS_AUTHENT=TRUE
# create the OS user
useradd ahmedb
passwd ahmedb
# set the parameter OS_AUTHENT_PREFIX
SHOW PARAMETER os_authent_prefix
alter system set os_authent_prefix='ops$' scope=spfile;
alter system set OS_AUTHENT_PREFIX = '' scope=spfile;
# in DB: create the DB user with the prefix
# in Unix
CREATE USER ops$ahmedb IDENTIFIED EXTERNALLY;
GRANT CONNECT TO ops$ahmedb;
# in Windows
Page 299 Oracle DBA Code Examples
CREATE USER "OPS$MYDOMAIN.COM\AHMEDB" IDENTIFIED EXTERNALLY;
GRANT CONNECT TO "OPS$MYDOMAIN.COM\AHMEDB";
# in Windows:
# set the following in the file "%ORACLE_HOME%\network\admin\sqlnet.ora":
SQLNET.AUTHENTICATION_SERVICES= (NTS)
# test:
su - ahmedb
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
export PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_SID=ora11gr2
sqlplus /
Pr ox y Aut hent i cat i on
-- to authorize connections by a database user logging on from
-- a middle-tier node, using password authentication.
ALTER USER user1
GRANT CONNECT THROUGH appserv
AUTHENTICATED USING PASSWORD;
--
ALTER USER user1 GRANT CONNECT THROUGH appserv;
Loggi ng I n As a Di f f er ent User
I f you want t o log on as a different user and you do not know his password.
-- 1) obtain his encrypted password
SELECT 'alter user tester identified by values '||password||';'
FROM user$
WHERE username='HR';
-- 2) set a new password to him
ALTER USER hr IDENTIFIED BY newpassword;
-- 3) log on using the new password and execute your commands
-- 4) reset the user password back to the original one (note the qout)
ALTER USER tester IDENTIFIED BY VALUES '1825ACAA229030F1';
Ki l l i ng User Sessi ons f r om OS
-- on Unix
-- 1. obtain process#
SELECT process, sid, serial# FROM v$session WHERE username='&user';
-- 2. kill the process
kill -9 345678
Page 300 Oracle DBA Code Examples
-- on Windows
-- 1. obain thread #
SELECT sid, spid as thread, osuser, s.program
FROM v$process p, v$session s
WHERE p.addr = s.paddr;
-- kill the process using orakill utiliy
orakill 2948
Page 301 Oracle DBA Code Examples
Cont r ol l i ng Dat abase Access
Syst em and Obj ect Pr i vi l eges
/* system privs */
GRANT CREATE SESSION TO hr;
GRANT CREATE SESSION TO hr WITH ADMIN OPTION;
GRANT ANY OBJECT to hr;
-- only SELECT ANY DICTIONARY is NOT included
GRANT ALL PRIVILEGES TO ourdba;
REVOKE DELETE ANY TABLE FROM ourdba;
-- dictionary views become accessible
grant SELECT_CATALOG_ROLE to ourdev;
/* object privs */
GRANT DELETE ON bonuses TO hr WITH GRANT OPTION;
GRANT UPDATE (product_id) ON sales01 TO hr;
GRANT SELECT, UPDATE ON emp_view TO PUBLIC;
GRANT SELECT ON oe.customers_seq TO hr;
GRANT ALL ON EMPLOYEES TO hr;
GRANT EXECUTE ON employee_pkg TO hr;
GRANT QUERY REWRITE TO hr;
GRANT READ ON DIRECTORY bfile_dir TO hr;
-- incorrect
REVOKE UPDATE (hostname) ON ods_process FROM hr;
-- correct
REVOKE UPDATE ON ods_process FROM hr;
I nvok er Ri ght s and Def i ner Ri ght s
CREATE OR REPLACE PROCEDURE delete_emp (p_emp_id number)
AUTHID CURRENT_USER
IS
BEGIN
DELETE FROM emp WHERE
emp_id = p_emp_id;
COMMIT;
END;
/
Rol es
Predefined roles:
Page 302 Oracle DBA Code Examples
o CONNECT
o RESOURCE: CREATE CLUSTER, CREATE I NDEXTYPE, CREATE OPERATOR, CREATE
PROCEDURE, CREATE SEQUENCE, CREATE TABLE, CREATE TRI GGER, CREATE TYPE
o DBA
o EXP_FULL_DATABASE
o I MP_FULL_DATABASE
o RECOVERY_CATALOG_OWNER
-- create role
CREATE ROLE new_dba;
/* Role Authorization */
-- (1) Database authorization
CREATE ROLE clerk IDENTIFIED BY password;
-- (2) Database authorization with a PL/SQL package
-- the role is enabled by a hr.admin package:
CREATE ROLE admin_role IDENTIFIED USING hr.admin;
-- (3) Externally
CREATE ROLE accts_rec IDENTIFIED EXTERNALLY;
-- (4) Globally: enabled by an enterprise directory service
CREATE ROLE supervisor IDENTIFIED GLOBALLY;
/* Disabling and Enabling a Role */
-- disable
INSERT INTO SYSTEM.PRODUCT_USER_PROFILE(PRODUCT,userid,attribute,char_value)
VALUES('SQL*Plus','TESTER','ROLES','TEST123');
-- enable
DELETE FROM product_user_profile WHERE userid='TESTER'
AND char_value = 'TEST123';
-- Dropping a Role
DROP ROLE admin_user;
User s, Rol es, and Pr i vi l eges Vi ew s
DBA_USERS Provides informat ion about users
DBA_ROLES Shows all t he roles in t he dat abase
DBA_COL_PRIVS Shows column- level obj ect grant s
DBA_ROLE_PRIVS Shows users and t heir roles
DBA_SYS_PRIVS Shows users who have been grant ed syst em privileges
DBA_TAB_PRIVS Shows users and t heir privileges on t ables
ROLE_ROLE_PRIVS Shows roles grant ed t o roles
ROLE_SYS_PRIVS Shows syst em privileges grant ed t o roles
ROLE_TAB_PRIVS Shows t able privileges grant ed t o roles
SESSION_PRIVS Shows privileges current ly enabled for t he current session
SESSION_ROLES Shows roles current ly enabled for t he current session
Page 303 Oracle DBA Code Examples
Fi ne- Gr ai ned Dat a Access ( Vi r t ual Pr i vat e Dat abase VPD)
Fine-grained securit y wit hin t he dat abase is implement ed by DBMS_RLS
Fine-grained access cont rol policy: at t ached t o DB obj ect . I t can be applied t o SELECT,
I NSERT, UPDATE, I NDEX, and DELETE st at ement s.
SYS user is not affect ed by FGAC.
Common Predefined At t ribut es in t he USERENV
inst ance I nst ance I D
ent ryI D Audit ing ent ry ident ifier
current _user Name of t he user who st art ed t he session
session_user Dat abase username by which t he current user is aut hent icat ed
db_name Name of t he dat abase
host Name of t he machine on which t he dat abase is running
os_user Operat ing syst em account name
t erminal Client t erminal t hrough which t he dat abase is being accessed
ip_address I P address of t he client machine
ext ernal_name Ext ernal name of t he dat abase user
/* Using Application Context */
-- using pre-defined context
SELECT sys_context ('USERENV', 'OS_USER') FROM DUAL;
SELECT first_name,last_name,employee_id FROM employees
WHERE UPPER(last_name)=sys_context('USERENV', 'SESSION_USER');
-- using user-defined application context: var=val pair per session
CONNECT system/system_passwd;
GRANT CREATE ANY CONTEXT TO hr;
CONNECT hr/hr;
CREATE CONTEXT employee_info USING hr.context;
CREATE OR REPLACE PACKAGE hr_context AS
PROCEDURE select_emp_no ;
END;
/
CREATE OR REPLACE PACKAGE BODY hr_context as
PROCEDURE select_emp_no IS
empnum number;
BEGIN
SELECT employee_id INTO empnum FROM employees WHERE
UPPER(last_name) = sys_context('USERENV', 'SESSION_USER');
DBMS_SESSION.SET_CONTEXT('EMPLOYEE_INFO', 'EMP_NUM', EMPNUM);
END select_emp_no;
END;
/
-- set application context: upon login trigger
CREATE OR REPLACE TRIGGER hr.security_context
AFTER LOGON ON DATABASE
BEGIN
hr_context.select_emp_no;
END;
Page 304 Oracle DBA Code Examples
/
/* using fine-grained access control */
-- here are the steps
--(1) define the policy function: which will generate the predicates
-- the function must adhere to the following syntax:
-- FUNCTION policy_function (object_schema IN VARCHAR2, object_name VARCHAR2)
-- RETURN VARCHAR2 returning max of 2000 Bytes
CREATE OR REPLACE PACKAGE hr_security AS
FUNCTION empnum_sec (A1 VARCHAR2, A2 VARCHAR2)
RETURN varchar2;
END;
/
CREATE OR REPLACE PACKAGE BODY hr_security AS
FUNCTION empnum_sec (A1 VARCHAR2, A2 VARCHAR2)
RETURN varchar2
IS
d_predicate varchar2 (2000);
BEGIN
d_predicate:= 'employee_id =
SYS_CONTEXT("EMPLOYEE_INFO","EMP_NUM")';
RETURN d_predicate;
END empnum_sec;
END hr_security;
/
-- to make all db user being able to use it
GRANT EXECUTE ON hr_security TO public;
--(2) create security policy RLS=row-level security
-- POLICY_TYPE parameter in DBMS_RLS.ADD_POLICY takes:
-- DBMS_RLS.DYNAMIC (default)
-- DBMS_RLS.STATIC
-- DBMS_RLS.SHARED_STATIC
-- DBMS_RLS.CONTEXT_SENSITIVE
-- DBMS_RLS.SHARED_CONTEXT_SENSITIVE
BEGIN
DBMS_RLS.ADD_POLICY (OBJECT_SCHEMA=>'HR',
OBJECT_NAME=>'EMPLOYEES',
POLICY_NAME=>'MANAGER_POLICY',
FUNCTION_SCHEMA=>'HR',
POLICY_FUNCTION=>'hr_security.empnum_sec', -- func generates the predicates
STATEMENT_TYPES='SELECT' );
END;
/
SELECT object_name, policy_name, sel, ins, upd, del, enable
FROM all_policies;
-- Column-Level VPD
-- You can apply column-level VPD to a table or a view
Page 305 Oracle DBA Code Examples
BEGIN
DBMS_RLS.ADD_POLICY (OBJECT_SCHEMA=>'HR',
OBJECT_NAME=>'EMPLOYEES',
POLICY_NAME=>'MANAGER_POLICY',
FUNCTION_SCHEMA=>'HR',
POLICY_FUNCTION=>'hr_security.empnum_sec,
STATEMENT_TYPE=INSERT,UPDATE,
SEC_RELEVANT_COLS=>'salary,commission')
END;
/
/* Exempting from Access Policy */
GRANT EXEMPT ACCESS POLICY to hr;
Page 306 Oracle DBA Code Examples
Audi t i ng Dat abase
St andar d Audi t i ng
Set AUDI T_TRAI L t o: NONE ( default ), OS, DB ( SYS. AUD$) , DB_EXTENDED ( SYS. AUD$ +
t he columns SQLBI ND and SQLTEXT CLOB), XML ( in OS) , ' XML, EXTENDED'.
I f you set AUDI T_TRAI L t o DB, change t he t ablespace of SYS. AUD$ from SYSTEM.
Audit ed info:
o Operat ing syst em login
o Dat abase username
o Terminal and session ident ifiers
o Operat ion performed or at t empt ed
o Dat e and t ime st amp
o SQL t ext t hat t riggered t he audit ing
select value from v$parameter where name='audit_trail';
-- if not defined: $ORACLE_HOME/rdbms/audit/
select value from v$parameter where name='audit_file_dest';
alter system set audit_trail=db_extended scope=spfile;
ALTER SYSTEM SET audit_trail = xml,extended SCOPE=SPFILE ;
-- AUDIT focused by
-- DB/user
-- success/failure and
-- grouped by session or access
audit session ;
AUDIT SESSION BY hr;
AUDIT select table BY hr BY SESSION;
AUDIT DELETE ANY TABLE BY hr WHENEVER NOT SUCCESSFUL;
AUDIT UPDATE ANY TABLE;
AUDIT SELECT,INSERT,UPDATE,DELETE ON employees BY ACCESS WHENEVER SUCCESSFUL;
AUDIT ALL PRIVILEGES;
/* turn audit off */
NOAUDIT select table BY hr;
NOAUDIT ALL; /* turns off all statement auditing */
NOAUDIT ALL PRIVILEGES; /* turns off all privilege auditing */
NOAUDIT ALL ON DEFAULT; /* turns off all object auditing */
/* obtain info on audit */
select * from DBA_STMT_AUDIT_OPTS;
select OS_USERNAME, USERNAME, USERHOST, ACTION_NAME,
to_char(LOGOFF_TIME,'dd-mm-yy hh24:mi:ss') LOGOFF, SESSION_CPU
from DBA_AUDIT_SESSION;
select USERNAME, USERHOST, ACTION_NAME, OBJ_NAME
from DBA_AUDIT_OBJECT
Page 307 Oracle DBA Code Examples
ORDER BY USERNAME;
/* flushing db audit */
CONN / AS SYSDBA
DELETE FROM SYS.AUD$;
Cust omi zi ng Dat abase Audi t i ng w i t h Tr i gger s
/* The following procedure generate code required to write an auditing
trigger
Usage: execute the procedure and pass the table name. Then select from VW
order by I to view the code */
CREATE TABLE VW ( I NUMBER, X VARCHAR2(4000));
SEQUENCE SEQ_I ;
CREATE PROCEDURE CREATE_AUDIT2 ( P_TABLE VARCHAR2)
IS
V_NCOL_LIST VARCHAR2(4000) ;
V_OCOL_LIST VARCHAR2(4000) ;
V_NCOL_LIST2 VARCHAR2(4000) ;
V_OCOL_LIST2 VARCHAR2(4000) ;
V_OUTPUT VARCHAR2(4000);
PROCEDURE INSERT_VW( V VARCHAR2) IS
BEGIN
INSERT INTO VW VALUES(SEQ_I.NEXTVAL, V );
END;
BEGIN
-- ** generate the target Audit Table
-- create sequence
INSERT_VW('CREATE SEQUENCE SEQ_'|| P_TABLE || '_AUDIT ;');
INSERT_VW('CREATE TABLE '|| P_TABLE || '_AUDIT (');
INSERT_VW('ID NUMBER CONSTRAINT '|| P_TABLE || '_AUDIT_ID PRIMARY KEY,');
-- N Columns
FOR R IN ( SELECT
TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_LENGTH,DATA_PRECISION,DATA_SCALE FROM
USER_TAB_COLUMNS WHERE TABLE_NAME = UPPER(P_TABLE) ) LOOP
IF R.DATA_TYPE = 'NUMBER' AND R.DATA_PRECISION IS NULL THEN
INSERT_VW( 'N' || R.COLUMN_NAME || ' NUMBER ,');
V_NCOL_LIST := V_NCOL_LIST || 'N' || R.COLUMN_NAME || ',';
V_NCOL_LIST2 := V_NCOL_LIST2 || ' :NEW.' || R.COLUMN_NAME || ',';
ELSIF R.DATA_TYPE = 'NUMBER' AND R.DATA_PRECISION IS NOT NULL AND
R.DATA_SCALE = 0 THEN
INSERT_VW( 'N' || R.COLUMN_NAME || ' NUMBER('|| R.DATA_PRECISION ||'),');
V_NCOL_LIST := V_NCOL_LIST || 'N' || R.COLUMN_NAME || ',';
V_NCOL_LIST2 := V_NCOL_LIST2 || ' :NEW.' || R.COLUMN_NAME || ',';
Page 308 Oracle DBA Code Examples
ELSIF R.DATA_TYPE = 'NUMBER' AND R.DATA_PRECISION IS NOT NULL AND
R.DATA_SCALE <> 0 THEN
INSERT_VW( 'N' || R.COLUMN_NAME || ' NUMBER('|| R.DATA_PRECISION ||','||
R.DATA_SCALE ||'),');
V_NCOL_LIST := V_NCOL_LIST || 'N' || R.COLUMN_NAME || ',';
V_NCOL_LIST2 := V_NCOL_LIST2 || ' :NEW.' || R.COLUMN_NAME || ',';
ELSIF R.DATA_TYPE = 'VARCHAR2' THEN
INSERT_VW( 'N' || R.COLUMN_NAME || ' VARCHAR2('|| R.DATA_LENGTH ||'),');
V_NCOL_LIST := V_NCOL_LIST || 'N' || R.COLUMN_NAME || ',';
V_NCOL_LIST2 := V_NCOL_LIST2 || ' :NEW.' || R.COLUMN_NAME || ',';
ELSIF R.DATA_TYPE = 'DATE' THEN
INSERT_VW( 'N' || R.COLUMN_NAME || ' DATE,');
V_NCOL_LIST := V_NCOL_LIST || 'N' || R.COLUMN_NAME || ',';
V_NCOL_LIST2 := V_NCOL_LIST2 || ' :NEW.' || R.COLUMN_NAME || ',';
END IF;
END LOOP;
-- O columns
FOR R IN ( SELECT
TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_LENGTH,DATA_PRECISION,DATA_SCALE FROM
USER_TAB_COLUMNS WHERE TABLE_NAME = UPPER(P_TABLE) ) LOOP
IF R.DATA_TYPE = 'NUMBER' AND R.DATA_PRECISION IS NULL THEN
INSERT_VW( 'O' || R.COLUMN_NAME || ' NUMBER ,');
V_OCOL_LIST := V_OCOL_LIST || 'O' || R.COLUMN_NAME || ',';
V_OCOL_LIST2 := V_OCOL_LIST2 || ' :OLD.' || R.COLUMN_NAME || ',';
ELSIF R.DATA_TYPE = 'NUMBER' AND R.DATA_PRECISION IS NOT NULL AND
R.DATA_SCALE = 0 THEN
INSERT_VW( 'O' || R.COLUMN_NAME || ' NUMBER('|| R.DATA_PRECISION ||'),');
V_OCOL_LIST := V_OCOL_LIST || 'O' || R.COLUMN_NAME || ',';
V_OCOL_LIST2 := V_OCOL_LIST2 || ' :OLD.' || R.COLUMN_NAME || ',';
ELSIF R.DATA_TYPE = 'NUMBER' AND R.DATA_PRECISION IS NOT NULL AND
R.DATA_SCALE <> 0 THEN
INSERT_VW( 'O' || R.COLUMN_NAME || ' NUMBER('|| R.DATA_PRECISION ||','||
R.DATA_SCALE ||'),');
V_OCOL_LIST := V_OCOL_LIST || 'O' || R.COLUMN_NAME || ',';
V_OCOL_LIST2 := V_OCOL_LIST2 || ' :OLD.' || R.COLUMN_NAME || ',';
ELSIF R.DATA_TYPE = 'VARCHAR2' THEN
INSERT_VW( 'O' || R.COLUMN_NAME || ' VARCHAR2('|| R.DATA_LENGTH ||'),');
V_OCOL_LIST := V_OCOL_LIST || 'O' || R.COLUMN_NAME || ',';
V_OCOL_LIST2 := V_OCOL_LIST2 || ' :OLD.' || R.COLUMN_NAME || ',';
ELSIF R.DATA_TYPE = 'DATE' THEN
INSERT_VW( 'O' || R.COLUMN_NAME || ' DATE,');
V_OCOL_LIST := V_OCOL_LIST || 'O' || R.COLUMN_NAME || ',';
V_OCOL_LIST2 := V_OCOL_LIST2 || ' :OLD.' || R.COLUMN_NAME || ',';
END IF;
END LOOP;
INSERT_VW( 'ACTION VARCHAR2(6),');
INSERT_VW( 'ACTION_TIME DATE,');
INSERT_VW( 'HOST_NAME VARCHAR2(300),');
INSERT_VW( 'OS_USERNAME VARCHAR2(250));');
-- generate the Auditing Trigger
Page 309 Oracle DBA Code Examples
INSERT_VW('CREATE OR REPLACE TRIGGER TRG_' || P_TABLE || '_AUDIT');
INSERT_VW('AFTER INSERT OR UPDATE OR DELETE ON '|| P_TABLE);
INSERT_VW('FOR EACH ROW');
INSERT_VW('BEGIN');
INSERT_VW('IF INSERTING THEN');
INSERT_VW('INSERT INTO ' || P_TABLE || '_AUDIT(ID,');
INSERT_VW(V_NCOL_LIST);
INSERT_VW('ACTION,ACTION_TIME,HOST_NAME,OS_USERNAME)');
INSERT_VW('VALUES');
INSERT_VW('(SEQ_'|| P_TABLE || '_AUDIT.NEXTVAL,');
INSERT_VW( V_NCOL_LIST2);
INSERT_VW( '''INSERT'',sysdate,
SYS_CONTEXT(''USERENV'',''HOST''),SYS_CONTEXT(''USERENV'',''OS_USER''));');
INSERT_VW('END IF;');
INSERT_VW('IF DELETING THEN');
INSERT_VW('INSERT INTO ' || P_TABLE || '_AUDIT(ID,');
INSERT_VW(V_OCOL_LIST);
INSERT_VW('ACTION,ACTION_TIME,HOST_NAME,OS_USERNAME)');
INSERT_VW('VALUES');
INSERT_VW('(SEQ_'|| P_TABLE || '_AUDIT.NEXTVAL,');
INSERT_VW( V_OCOL_LIST2);
INSERT_VW( '''DELETE'',
SYSDATE,SYS_CONTEXT(''USERENV'',''HOST''),SYS_CONTEXT(''USERENV'',''OS_USER'')
);');
INSERT_VW('END IF;');
INSERT_VW('IF UPDATING THEN');
INSERT_VW('INSERT INTO ' || P_TABLE || '_AUDIT(ID,');
INSERT_VW(V_NCOL_LIST );
INSERT_VW( V_OCOL_LIST);
INSERT_VW('ACTION,ACTION_TIME,HOST_NAME,OS_USERNAME)');
INSERT_VW('VALUES');
INSERT_VW('(SEQ_'|| P_TABLE || '_AUDIT.NEXTVAL,');
INSERT_VW( V_NCOL_LIST2 );
INSERT_VW( V_OCOL_LIST2 );
INSERT_VW( '''UPDATE'',
SYSDATE,SYS_CONTEXT(''USERENV'',''HOST''),SYS_CONTEXT(''USERENV'',''OS_USER'')
);');
INSERT_VW('END IF;');
INSERT_VW('END;');
COMMIT;
END CREATE_AUDIT2;
Audi t i ng t he Dat abase Usi ng Syst em Tr i gger
Syst em- Level t rigger t ypes:
o Dat abase st art up
o Logon and Logoff
o DDL
o Server error
Page 310 Oracle DBA Code Examples
/* Required privs */
grant ADMINISTER DATABASE TRIGGER to user1;
/* Obtain Info about DB triggers */
-- list the db triggers
SELECT a.obj#, a.sys_evts, b.name
FROM trigger$ a,obj$ b
WHERE a.sys_evts > 0
AND a.obj#=b.obj#
AND baseobject = 0;
/* Examples */
/* If db cannot start because of an error in the AFTER STARTUP trigger */
set linesize 150
col NAME format a30
col VALUE format a20
col DESCRIPTION format a60
SELECT x.ksppinm NAME, y.ksppstvl VALUE, ksppdesc DESCRIPTION
FROM x$ksppi x, x$ksppcv y
WHERE x.inst_id = userenv('Instance')
AND y.inst_id = userenv('Instance')
AND x.indx = y.indx
AND x.ksppinm = '_system_trig_enabled';
-- enable or disable db triggers
ALTER SYSTEM SET "_system_trig_enabled" = TRUE SCOPE=BOTH;
-- Log On Log Off trigger
CREATE OR REPLACE TRIGGER logon_audit
AFTER LOGON ON DATABASE
BEGIN
INSERT INTO connection_audit
(login_date, user_name)
VALUES
(SYSDATE, USER);
END logon_audit;
/
CREATE OR REPLACE TRIGGER logoff_audit_trig
AFTER LOGOFF
ON DATABASE
BEGIN
INSERT INTO logon_audit
VALUES
(user,
sys_context('userenv', 'sessionid'),
null,
sysdate,
sys_context('userenv', 'host'));
END;
/
-- trigger to trap unsuccessful logons
/*
other errors that could be trapped include:
ORA-01004 - default username feature not supported
ORA-01005 - null password given
ORA-01035 - Oracle only available to users with restricted session priv
ORA-01045 - create session privilege not granted
*/
CREATE OR REPLACE TRIGGER logon_failures
AFTER SERVERERROR
ON DATABASE
BEGIN
Page 311 Oracle DBA Code Examples
IF (IS_SERVERERROR(1017)) THEN
INSERT INTO connection_audit
(login_date, user_name)
VALUES
(SYSDATE, 'ORA-1017');
END IF;
END logon_failures;
/
-- DDL triggers
/* BEFORE / AFTER ALTER
BEFORE / AFTER ANALYZE
BEFORE / AFTER ASSOCIATE STATISTICS
BEFORE / AFTER AUDIT
BEFORE / AFTER COMMENT
BEFORE / AFTER CREATE
BEFORE / AFTER DDL
BEFORE / AFTER DISASSOCIATE STATISTICS
BEFORE / AFTER DROP
BEFORE / AFTER GRANT
BEFORE / AFTER NOAUDIT
BEFORE / AFTER RENAME
BEFORE / AFTER REVOKE
BEFORE / AFTER TRUNCATE
AFTER SUSPEND */
CREATE OR REPLACE TRIGGER ddl_log_trig
AFTER DDL ON DATABASE
BEGIN
INSERT INTO ddl_log
(username, change_date, object_type, object_owner, database, event_name )
VALUES
(ORA_LOGIN_USER, sysdate, ora_dict_obj_type, ora_dict_obj_owner,
ora_database_name, ora_sysevent)
END;
/
-- Disable granting privileges to PUBLIC
CREATE OR REPLACE TRIGGER ddl_trig
BEFORE GRANT
ON DATABASE
DECLARE
g_list DBMS_STANDARD.ORA_NAME_LIST_T;
n PLS_INTEGER;
BEGIN
n := ORA_GRANTEE(g_list);
FOR i IN 1..n LOOP
IF g_list(i) = 'PUBLIC' THEN
RAISE_APPLICATION_ERROR(-20997,'Public Grants Not Allowed');
END IF;
END LOOP;
END;
/
-- System Errors
CREATE TABLE servererror_log (
error_datetime TIMESTAMP,
error_user VARCHAR2(30),
db_name VARCHAR2(9),
error_stack VARCHAR2(2000),
captured_sql VARCHAR2(1000));
CREATE OR REPLACE TRIGGER log_server_errors
AFTER SERVERERROR
ON DATABASE
Page 312 Oracle DBA Code Examples
DECLARE
captured_sql VARCHAR2(1000);
BEGIN
SELECT q.sql_text
INTO captured_sql
FROM gv$sql q, gv$sql_cursor c, gv$session s
WHERE s.audsid = audsid
AND s.prev_sql_addr = q.address
AND q.address = c.parent_handle;
INSERT INTO servererror_log
(error_datetime, error_user, db_name,
error_stack, captured_sql)
VALUES
(systimestamp, sys.login_user, sys.database_name,
dbms_utility.format_error_stack, captured_sql);
END log_server_errors;
/
Usi ng Fi ne Gr ai ned Audi t i ng
-----
-- Show all currently active FGA Policies in the database
-----
COL object_schema FORMAT A10 HEADING 'Object|Schema'
COL object_name FORMAT A20 HEADING 'Object Name' WRAP
COL policy_name FORMAT A16 HEADING 'Policy Name' WRAP
COL policy_text FORMAT A24 HEADING 'Policy Text' WRAP
COL policy_column FORMAT A16 HEADING 'Policy Column' WRAP
COL enabled FORMAT A05 HEADING 'On?'
COL siud_options FORMAT A04 HEADING 'SIUD|Set'
SELECT
policy_name
,policy_text
,policy_column
,enabled
,object_schema
,object_name
,DECODE(sel,'YES','Y','N') || DECODE(ins,'YES','Y','N')||
DECODE(upd,'YES','Y','N') || DECODE(del,'YES','Y','N') siud_options
FROM dba_audit_policies;
-- required priv
grant execute on DBMS_FGA to hr;
-----
-- Show Fine-Grained Auditing results so far
-- the view is based on SYS.FGA_LOG$
-----
TTITLE 'Current Fine-Grained Auditing (FGA) Results'
COL audit_date FORMAT A10 HEADING 'Audit|Date'
COL policy_name FORMAT A16 HEADING 'Policy Name' WRAP
COL object_schema FORMAT A10 HEADING 'Object|Schema'
COL object_name FORMAT A20 HEADING 'Object Name' WRAP
COL db_user FORMAT A10 HEADING 'DBUser'
COL sql_text FORMAT A36 HEADING 'SQL Text' WRAP
SELECT
TO_CHAR(timestamp,'dd/mm/yyyy hh24:mi:ss') audit_date
,db_user
,object_schema
,object_name
Page 313 Oracle DBA Code Examples
,policy_name
,sql_text
FROM dba_fga_audit_trail
ORDER BY timestamp;
-----
-- Use the new combined audit trail view (DBA_COMMON_AUDIT_TRAIL)
-- to see results of both Standard (i.e. AUDIT) and Fine-Grained
-- Auditing (i.e. via DBMS_FGA)
-----
COL audtype FORMAT A03 HEADING 'Aud|Typ'
COL db_user FORMAT A10 HEADING 'DBUser'
COL object_schema FORMAT A06 HEADING 'Object|Schema'
COL object_name FORMAT A20 HEADING 'Object Name' WRAP
COL policy_name FORMAT A16 HEADING 'Policy Name' WRAP
COL audit_date FORMAT A10 HEADING 'Audit|Date'
COL sql_text FORMAT A32 HEADING 'SQL Text' WRAP
SELECT
DECODE(audit_type,
'Fine Grained Audit', 'FGA'
,'Standard Audit', 'STD'
,'UNK') audtype
,db_user
,object_schema
,object_name
,policy_name
,TO_CHAR(extended_timestamp,'mm/dd/yyyy hh24:mi:ss') audit_date
,sql_text
FROM dba_common_audit_trail
WHERE db_user NOT IN ('SYS','SYSTEM','DBSNMP','SYSMAN')
ORDER BY extended_timestamp, db_user, object_schema, object_name;
-----
BEGIN
DBMS_FGA.ADD_POLICY(
object_schema => 'AP' -- if null, logon user schema
,object_name => 'VENDORS'
,policy_name => 'VENDORS_LO'
,audit_condition => 'ACTIVE_IND <> ''Y''' -- if NULL=TRUE
,audit_column => 'ACTIVE_IND,CREDIT_CARD,CREDIT_LIMIT'
,handler_schema => NULL
,handler_module => NULL -- the procedure will fire on audit
,enable => TRUE -- default is TRUE
,statement_types => 'SELECT'
,audit_trail => DBMS_FGA.DB_EXTENDED
,audit_column_opts => DBMS_FGA.ANY_COLUMNS -- or DBMS_FGA.ALL_COLUMNS
);
END;
/
BEGIN
DBMS_FGA.ADD_POLICY(
object_schema => 'AP'
,object_name => 'RV_INVOICE_DETAILS'
,policy_name => 'RV_INVOICE_LO'
,audit_condition => NULL
,audit_column =>
'VENDOR_NAME,INVOICE_ID,EXTENDED_AMT,VENDOR_CREDIT_LIMIT'
,handler_schema => NULL
,handler_module => NULL
,enable => FALSE
,statement_types => 'SELECT'
Page 314 Oracle DBA Code Examples
,audit_trail => DBMS_FGA.DB_EXTENDED
,audit_column_opts => DBMS_FGA.ALL_COLUMNS
);
END;
/
/*
|| Listing 1.5: FGA Policy Maintenance
*/
BEGIN
-----
-- Disabling an enabled, existing FGA policY
-----
DBMS_FGA.DISABLE_POLICY(
object_schema => 'AP'
,object_name => 'INVOICES'
,policy_name => 'INVOICES_HI'
);
-----
-- Dropping an enabled, existing FGA policY
-----
DBMS_FGA.DROP_POLICY(
,policy_name => 'RV_INVOICE_LOW'
,object_name => ' RV_INVOICE_DETAILS'
,policy_name => 'RV_INVOICE_LO'
);
END;
/
Page 315 Oracle DBA Code Examples
Usi ng Dat a En cr y pt i on
Or acl e Tr anspar ent Dat a Encr ypt i on ( TDE)
Caut i on: Wallet file must be included in your backup.
Column lengt h changes on disk. Act ual lengt hs not report ed by DUMP or VSI ZE.
The Wallet must be opened aft er inst ance rest art .
/* Setting up TDE */
-- 1. Create the Wallet file:
-- add the following to the sqlnet.ora
ENCRYPTION_WALLET_LOCATION =
(SOURCE=
(METHOD=file)
(METHOD_DATA=
(DIRECTORY=C:\oracle\OraDb10g\admin\ora10g\wallet)))
-- 2. Set the master key: this is done only once:
ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY <password>;
-- 3. Create tables that contain encrypted columns
-- possible algorithms are AES128, (AES192), AES256, or 3DES168
-- the salt increases the protection but prevents indexing on the column.
CREATE TABLE emp (
first_name VARCHAR2(128),
...
empID NUMBER ENCRYPT NO SALT,
salary NUMBER(6) ENCRYPT USING '3DES168',
comm NUMBER(6) ENCRYPT);
ALTER TABLE EMP MODIFY ( SAL ENCRYPT NO SALT );
DESC EMP
/* Existing Tables and TDE */
--Add encrypted columns:
ALTER TABLE emp ADD (ssn VARCHAR2(11) ENCRYPT);
Encrypt unencrypted columns:
ALTER TABLE emp MODIFY (first_name ENCRYPT);
Disable column encryption:
ALTER TABLE emp MODIFY (first_name DECRYPT);
--Add or remove salt:
ALTER TABLE emp MODIFY (first_name ENCRYPT [NO] SALT);
--Change keys and the encryption algorithm:
ALTER TABLE emp REKEY USING '3DES168';
-- To Test TDE
SELECT
DBMS_ROWID.ROWID_TO_ABSOLUTE_FNO (ROWID,USER,'EMP'),
DBMS_ROWID.ROWID_BLOCK_NUMBER (ROWID)
Page 316 Oracle DBA Code Examples
FROM EMP;
File Nu Block Number
------- ------------
4 63
ALTER SESSION SET EVENTS '10389 trace name context forever, level 1';
ALTER SYSTEM DUMP DATAFILE 4 BLOCK 63;
/* Opening and Closing the Wallet */
-- The Wallet must be opened after instance restart.
ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY password>
ALTER SYSTEM SET ENCRYPTION WALLET CLOSE
-- To verify that a wallet is open, you can query the V$ENCRYPTION_WALLET:
select WRL_PARAMETER, STATUS
from V$ENCRYPTION_WALLET
Tabl espace Encr ypt i on
I n Oracle Dat abase 11g, you can encrypt an ent ire t ablespace.
Encr y pt ed Tabl espace Li mi t at i ons
You cannot encrypt an exist ing t ablespace.
exp and imp ut ilit ies are not support ed wit h obj ect s in t he encrypt ed t ablespaces.
Whereas expdp and impdp ut ilit ies are support ed.
You cannot re- creat e t he t ablespace encrypt ion key.
The NO SALT opt ion is not support ed.
Temporary and undo t ablespaces cannot be encrypt ed.
You cannot t ransport an encrypt ed t ablespace t o a dat abase t hat already has an Oracle
wallet for TDE. I n t his case, use Oracle Dat a Pump t o export t he obj ect s in t he t ablespace
using t he expdp wit h ENCRYPTION_MODE= password and t hen import t hem t o t he
dest inat ion dat abase.
BFI LES and ext ernal t ables are not encrypt ed.
Logically, encrypt ed t ablespace is less efficient t han normal un- encrypt ed t ablespace.
Caut i on
Losing t he mast er key or t he wallet file will lead t o losing t he dat a in t he encrypt ed
t ablespace.
Encr y pt i ng a Tabl espace
Creat e and open a wallet file, as explained in t he previous sect ion.
The t ablespace creat ion st at ement for an encrypt ed t ablespace has t he following synt ax:
CREATE TABLESPACE <tbsp_name> ...
[ENCRYPTION [USING <ALGORITHM>]] -- specify encryption algorithm
DEFAULT STORAGE(ENCRYPT) -- encrypt objects in the tablespace
CREATE TABLESPACE tbsp1
DATAFILE '/u01/app/oracle/test/tbsp1_01.dbf' SIZE 500m
ENCRYPTION
Page 317 Oracle DBA Code Examples
DEFAULT STORAGE (ENCRYPT);
CREATE TABLESPACE mytbsp2
DATAFILE '/u01/app/oracle/test/mytbsp2_01.dbf' size 500m
ENCRYPTION USING '3DES168'
DEFAULT STORAGE (ENCRYPT);
The ALGORITHM clause accept s one of t he following values:
o AES192 Advanced Encrypt ion St andard ( t he default ) .
o 3DES168 Triple Dat a Encrypt ion St andard 168- bit encrypt ion
o AES128 Advanced Encrypt ion St andard 128-bit encrypt ion
o AES256 Advanced Encrypt ion St andard 256-bit encrypt ion
To know whet her an exist ing t ablespace is encrypt ed or not , issue t he following query:
select vt.NAME, vet.ENCRYPTIONALG, vet.ENCRYPTEDTS
from V$ENCRYPTED_TABLESPACES vet, V$TABLESPACE vt
where vet.TS#=vt.TS#
SELECT tablespace_name, encrypted
2 FROM dba_tablespaces;
Page 318 Oracle DBA Code Examples
Fi ne- Gr ai ned Access Cont r ol f or UTL_* Pack ages
Oracle Dat abase 11g provides a mechanism t o refine t he level of access t o t he net work
access packages UTL_TCP, UTL_SMTP, UTL_MAIL, UTL_HTTP, and UTL_INADDR.
Cr eat i ng ACL
You can use t he DBMS_NETWORK_ACL_ADMIN package t o facilit at e management of t he UTL_*
net work access packages as in t he following st eps:
1) Creat e an Access Cont rol List ( ACL) : All ACL definit ions are st ored in XML DB in t he form of
XML document s. The ACL XML files reside in t he /sys/acls direct ory of t he XML DB
reposit ory. Following is an example of using t he CREATE_ACL procedure t o creat e an XML
file called dba.xml:
begin
DBMS_NETWORK_ACL_ADMIN.CREATE_ACL (
ACL => 'dba.xml', -- case sensitive
DESCRIPTION=> 'Network Access Control for the DBAs',
PRINCIPAL => 'SCOTT', -- user or role the privilege is granted or denied
(upper case)
IS_GRANT => TRUE, -- privilege is granted or denied
PRIVILEGE => 'connect', -- or 'resolve' (case sensitive)
START_DATE => null, -- when the access control entity ACE will be valid
END_DATE => null); -- ACE expiration date (TIMESTAMP WITH TIMEZONE format)
end;
Regarding t he PRIVILEGE paramet er, t he dat abase user needs t he connect privilege t o an
ext ernal net work host comput er if he or she is connect ing using t he UTL_TCP, UTL_HTTP,
UTL_SMTP, and UTL_MAIL ut ilit y packages. To resolve a host name t hat was given as a host I P
address, or t he I P address t hat was given as a host name, wit h t he UTL_INADDR package,
grant t he dat abase user t he resolve privilege.
You can t hen query t he RESOURCE_VIEW view t o find t he dba.xml ACL in t he /sys/acls
direct ory:
select ANY_PATH
from RESOURCE_VIEW
where ANY_PATH LIKE '/sys/acls/dba%'
Too may ent ries in t he ACL may lead t o significant XML DB performance drop because ACL
are checked for each access t o Oracle XML DB reposit ory. As general rule of t humb, ACL
check operat ions perform best when t he number of ACEs in t he ACL is at 16 ent ries or less.
2) Add Access Cont rol Ent ries: Once you creat e t he init ial ACL, you can cont inue t o add more
privileges t o t he XML file. The following example will add t he user RAMI t o t he dba.xml file
and grant him net work access:
begin
DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE (
ACL => 'dba.xml',
PRINCIPAL => 'RAMI',
IS_GRANT => TRUE,
Page 319 Oracle DBA Code Examples
PRIVILEGE => 'connect',
START_DATE => null, -- if the time interval is defined,
END_DATE => null); -- the ACE will expire after the specified date range
end;
/
COMMIT;
I n ACL, t he securit y ent ries are evaluat ing in order precedence. I f you have t wo cont radict ing
ent ries in t he list , t he first one in t he order will t ake effect . You can cont rol t he order number
of an added ent ry as follows:
begin
DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE (
POSITION => 1, -- on the top
ACL => 'dba.xml', PRINCIPAL => 'SAMI',
IS_GRANT => FALSE, PRIVILEGE => 'connect',
START_DATE => null, END_DATE => null);
end;
3) Assign Host s: The ASSIGN_ACL procedure is used t o aut horize access t o one or more
net work host s as follows:
begin
DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL (
ACL => 'dba.xml', HOST => 'dbaexpert.com',
LOWER_PORT => 80, UPPER_PORT => 443);
end;
COMMIT;
The lower port and t he upper port define t he lower and t he upper boundaries of t he allowable
port range. They should be set for connect privileges not resolve privileges.
4) Validat e t hat t he ACL permissions worked accordingly. Following is an example t o t est t he
code in t he previous st ep.
select UTL_HTTP.REQUEST('http://www.ahmedbaraka.com') from dual;
I f t he sufficient ACL privileges or ACL assignment s are not provided, you will receive t he ORA-
24247 error.
Access Cont r ol Li st s Mai nt enance
Use DELETE_PRIVILEGE t o remove an access cont rol ent ry from t he XML file.
exec DBMS_NETWORK_ACL_ADMIN.DELETE_PRIVILEGE( ACL=>'dba.xml', PRINCIPAL=> 'RAMI');
Use t he DROP_ACL procedure t o remove t he XML file from t he /sys/acls direct ory as follows:
exec DBMS_NETWORK_ACL_ADMIN.DROP_ACL ( ACL=>'dba.xml' );
Page 320 Oracle DBA Code Examples
Quer y Your Access Cont r ol Li st
To display list of t he ACLs creat ed in t he dat abase, use t he following query:
select HOST, LOWER_PORT, UPPER_PORT, ACL from DBA_NETWORK_ACLS
You can query t he DBA_NETWORK_ACL_PRIVILEGES view t o query net work privileges grant ed or
denied for t he access cont rol list as follows:
select PRINCIPAL, PRIVILEGE, IS_GRANT
from DBA_NETWORK_ACL_PRIVILEGES
where ACL like '%dba.xml'
Logged on users can use t he following query t o see t heir access ent ries in t he dba.xml file:
select HOST, LOWER_PORT, UPPER_PORT, STATUS privilege
from USER_NETWORK_ACL_PRIVILEGES
where HOST in
(select * from
table(DBMS_NETWORK_ACL_UTILITY.DOMAINS('dbaexpert.com')))
and PRIVILEGE = 'connect'
order by DBMS_NETWORK_ACL_UTILITY.DOMAIN_LEVEL(host) desc, LOWER_PORT;
Page 321 Oracle DBA Code Examples
Par t 5 Or acl e Dat abase Per f or mance
Tuni ng
Page 322 Oracle DBA Code Examples
Managi ng Per f or mance St at i st i cs
Managi ng OS St at i st i cs
CPU St at ist ics:
o doesn' t exceed 95% in t ot al.
o check DB share on CPU
Virt ual Memory St at ist ics:
o validat e t hat memory usage does not increase aft er t he syst em has reached a
st eady st at e aft er st art up.
Disk I / O St at ist ics:
o current response t ime should be bet ween 5 t o 20 ms for a single block I O
o t he lengt h of t he disk queues shouldn' t exceed t wo.
Net work St at ist ics:
o Look at t he net work round- t rip ping t ime and t he number of collisions. I nvest igat e
it , if t he net work is causing large delays in response t ime.
Reducing Disk Cont ent ion:
o I ncrease t he number of disks in t he st orage syst em
o Separat e t he dat abase and t he redo log files
o For a large t able, use part it ions t o reduce I / O
o St ripe t he dat a eit her manually or by using a RAI D disk- st riping syst em
o I nvest in cut t ing-edge t echnology, such as file caching, t o avoid I / O bot t lenecks
o Consider using ASM
You can use OS Wat cher t o gat her det ailed OS st at ist ics.
/* from the database */
-- to gather system stats
see Gathering System Statistics
-- all stats
select STAT_NAME, VALUE, OSSTAT_ID, COMMENTS, CUMULATIVE
from V$OSSTAT;
/* CPU */
-- one-hour history of the Host CPU Utilization
select BEGIN_TIME, END_TIME, GROUP_ID, METRIC_ID, METRIC_NAME, VALUE, METRIC_UNIT
from V$SYSMETRIC_HISTORY
where METRIC_NAME LIKE '%Host CPU%'
-- top session CPU-comsumers
SELECT
n.username,
s.sid,
s.value
FROM v$sesstat s,v$statname t, v$session n
WHERE s.statistic# = t.statistic#
AND n.sid = s.sid
Page 323 Oracle DBA Code Examples
AND t.name='CPU used by this session'
AND s.value <> 0
ORDER BY s.value desc;
-- Decomposition of Total CPU Usage
-- if the parsing or recursive CPU usage PCT is high, then tuning is required
-- Recursive CPU Usage is for data dict lookups and executing PL/SQL programs
SELECT name, value,
round(value/(select sum(value) from v$sysstat WHERE NAME IN ('CPU used by this
session', 'recursive cpu usage','parse time cpu'))*100,2) PCT
FROM V$SYSSTAT
WHERE NAME IN ('CPU used by this session', 'recursive cpu usage','parse time
cpu')
order by value DESC
/* io tuning */
-- IO related waits
select
EVENT,
TOTAL_WAITS_FG,
TOTAL_TIMEOUTS_FG,
TIME_WAITED_FG,
AVERAGE_WAIT_FG,
WAIT_CLASS,
TOTAL_WAITS,
TOTAL_TIMEOUTS,
TIME_WAITED,
AVERAGE_WAIT
from
V$SYSTEM_EVENT
WHERE WAIT_CLASS = 'User I/O'
order by WAIT_CLASS;
-- io stats
select
FILE_NO,
FILETYPE_NAME,
SMALL_READ_MEGABYTES "Single-block MegaBytes Reads",
SMALL_WRITE_MEGABYTES "Single-block MegaBytes Writes",
SMALL_READ_REQS "Single-block Read Requests",
SMALL_WRITE_REQS "Single-block Write Requests",
SMALL_READ_SERVICETIME "Total S-Block Read Time",
SMALL_WRITE_SERVICETIME "Total S-Block Write Time",
-- decode(SMALL_READ_REQS,0,0,SMALL_READ_SERVICETIME/SMALL_READ_REQS) "Per S-
Block Read Response T",
SMALL_SYNC_READ_REQS,
SMALL_SYNC_READ_LATENCY "S-Block Sync Read Latency (ms)",
LARGE_READ_MEGABYTES "Multi-block MegaBytes Reads",
LARGE_WRITE_MEGABYTES "Multi-block MegaBytes Writes",
LARGE_READ_REQS "Multi-block Read Requests",
LARGE_WRITE_REQS "Multi-block Write Requests",
LARGE_READ_SERVICETIME "Total M-Block Read Time",
LARGE_WRITE_SERVICETIME "Total M-Block Write Time",
ASYNCH_IO,
RETRIES_ON_ERROR
from V$IOSTAT_FILE
order by FILE_NO
Page 324 Oracle DBA Code Examples
/
-- Datafiles IO since instance startup
SELECT d.name,
f.phyrds reads,
f.phywrts wrts,
(f.readtim / decode(f.phyrds,0,-1,f.phyrds))/10 ReadRespoinseTime_ms,
(f.writetim / decode(f.phywrts,0,-1,phywrts))/10 WriteRespoinseTime_ms,
SINGLEBLKRDTIM/10 Single_Block_ReadTime_ms
FROM
v$datafile d, v$filestat f
WHERE d.file# = f.file#
ORDER BY d.name;
-- Datafiles IO History
SELECT
f.snap_id,
f.filename,
f.phyrds reads,
f.phywrts wrts,
(f.readtim / decode(f.phyrds,0,-1,f.phyrds))/10 ReadRespoinseTime_ms,
(f.writetim / decode(f.phywrts,0,-1,phywrts))/10 WriteRespoinseTime_ms,
SINGLEBLKRDTIM/10 Single_Block_ReadTime_ms,
wait_count, time waittime
FROM DBA_HIST_FILESTATXS f
ORDER BY f.snap_id desc, filename
/* on Windows */
--Performance Monitor tool.
For Windows Server 2003, can be downloaded from:
http://www.microsoft.com/downloads/details.aspx?familyid=09115420-8c9d-46b9-a9a5-
9bffcd237da2&displaylang=en
-- see using OS Watcher
-- see also Optimizing Windows Server
/* on Unix */
/* CPU */
# process per second
sar -c 2 10 -- for all CPUs without interval, since last reboot
sar -c P 0 -- for first CPU
# CPU% utilization
sar -u 4 5
# from vmstat output
# us: user CPU Time %
sy: system CPU Time %
id: idle CPU Time %
wa: Waiting for IO CPU Time %
# alternatively
vmstat -s | grep "cpu ticks"
# CPU% utilization
iostat c
Page 325 Oracle DBA Code Examples
iostat 4 5 c -- 5 times every 4 seconds
/* Virtual Memory Statistics */
-- Obtain info about memory
cat /proc/meminfo
-- Page ins and page outs
vmstat -s | grep "pages paged"
sar -B 2 50 -- every 2 seconds for 50 times
-- Swap ins and swap outs
# from vmstat output: swpd (so (swapped out) or si) should ideally be 0
# alternatively:
vmstat s -S M | grep "swap"
sar r
sar -W
-- Active and inactive pages: you shouldn't have too few inactive memory pages:
vmstat -S M
# alternatively:
vmstat -s -S M | grep "memory"
sar r
sar R
/* Disk I/O Statistics */
# disk usage
df h
# from vmstat output: bi (blocks in) bo (blocks out)
# alternatively:
#vmstat -s -S M | grep "pages"
# reports disk statistics
vmstat -d | grep d
# tps: transfer per second
iostat d
iostat 4 5 d -- 5 times every 4 seconds
iostat -d k -- display output in kilobytes instead of blocks
iostat -d x -- extended report
# rtps wtps read/write requests per second issued to the physical disk
# bread/s bwrtn/s data read/write from the drive in blocks per second
sar b 5 10
# bloc device usage
# number of sectors (512 byte) read/written per second
# if avque is greater larger than 1, disk contention is there
sar -d
/* Network Statistics */
# ping and check the latency
Page 326 Oracle DBA Code Examples
ping ...
# sar -n DEV | EDEV | SOCK | FULL
# DEV= network devices
rxpck/s packets received per second
txpck/s packets transmitted per second
rxbyt/s bytes received per second
txbyt/s bytes transmitted per second
# EDEV = failures from the network devices
rxerr/s bad packets received per second.
txerr/s errors that happened per second while transmitting packets
coll/s collisions that happened per second while transmitting packets
rxdrop/s received packets dropped per second because of a lack of space in linux
buffers
txdrop/s transmitted packets dropped per second because of a lack of space in
linux buffers
txcarr/s carrier-errors that happened per second while transmitting packets
rxfram/s frame alignment errors that happened per second on received packets.
rxfifo/s FIFO overrun errors that happened per second on received packets.
txfifo/s FIFO overrun errors that happened per second on transmitted packets.
# SOCK = sockets
totsck Total number of used sockets.
tcpsck Number of TCP sockets currently in use.
udpsck Number of UDP sockets currently in use.
rawsck Number of RAW sockets currently in use.
ip-frag Number of IP fragments currently in use.
# display network interfaces
netstat i
# summary stats on each protocol
netstat s | less
Managi ng Dat abase St at i st i cs
Syst em and Session St at ist ics (and t heir execut ed st at ement s)
Time Model St at ist ics
Wait Event s
Act ive Session Hist ory
Syst em and Sessi on St at i st i cs
/* System stats */
select
NAME,
decode(CLASS,
'1','User','2','Redo','4','Enqueue','8','Cache','16','OS','32','RAC','64','SQL','1
28','Debug', CLASS) STAT_CLASS,
VALUE
from V$SYSSTAT
order by NAME;
/* Session stats */
select
T.SID,S.USERNAME, S.MACHINE, S.MODULE, S.ACTION,
Page 327 Oracle DBA Code Examples
N.NAME,
decode(N.CLASS,
'1','User','2','Redo','4','Enqueue','8','Cache','16','OS','32','RAC','64','SQL','1
28','Debug', N.CLASS) STAT_CLASS,
VALUE
from V$SESSTAT T, V$STATNAME N, V$SESSION S
WHERE T.STATISTIC#=N.STATISTIC# and T.SID=S.SID
and S.USERNAME NOT IN ('SYSTEM','SYS','DBSNMP','SYSMAN')
order by S.SID , N.NAME;
/* SQL Stats */
high buffer gets = using the wrong index, the wrong driving table in a join, or a
similar SQL-related error
buffer gets and disk reads are at identical levels = a missing index
-- top io consumers
SELECT executions, buffer_gets, disk_reads, rows_processed,SORTS, sql_text
FROM V$SQL
WHERE buffer_gets > 100000 OR disk_reads > 100000
ORDER BY buffer_gets + 100*disk_reads DESC;
-- top CPU consumers
SELECT executions,
ROUND(elapsed_time/1000000, 2) elapsed_seconds,
ROUND(cpu_time/1000000, 2) cpu_secs ,
sql_text
from (select * from v$sql order by elapsed_time desc)
WHERE rownum <6
Ti me Model St at i st i cs
DB Time is an indicat or inst ance workload.
DB Time = CPU t ime + non- idle Wait t ime ( of all t he sessions accumulat ively)
-- how long since the instance started
select STARTUP_TIME , ROUND((SYSDATE-STARTUP_TIME)*24,2) HOURS
from v$instance;
-- system-wide time-based stat
SELECT STAT_NAME "Stat. Name",
round(VALUE/1000000) "Value (s)" ,
round(VALUE/1000000/60) "Value (min)"
FROM V$SYS_TIME_MODEL;
-- SESSION-wide time-based stats
SELECT
E.SID, S.USERNAME, S.MACHINE, S.MODULE, S.ACTION,
STAT_NAME "Stat. Name",
round(VALUE/1000000) "Value (s)" ,
round(VALUE/1000000/60) "Value (min)"
FROM V$SESS_TIME_MODEL E, V$SESSION S
WHERE E.SID = S.SID
and S.USERNAME NOT IN ('SYSTEM','SYS','DBSNMP','SYSMAN')
order by E.SID;
Page 328 Oracle DBA Code Examples
Wai t Ev ent s
The wait event s are only t he sympt oms of problems, most likely wit hin t he applicat ion
code.
Aft er defining t he t roubled wait ing event , you can get furt her info by t racing t he suspect ed
session.
-- TIMED_STATISTICS must be true (default)
show parameter TIMED_STATISTICS
/* Wait time for the whole instance */
-- System metrics captured in recent 60-sec or 15-sec
-- If 'Database Wait Time Ratio' is higher than 'Database CPU Time Ratio',
-- consider looking for bottlenecks
select
GROUP_ID,
METRIC_NAME,
VALUE,
METRIC_UNIT,
INTSIZE_CSEC/100 Interval_Duration,
TO_CHAR(BEGIN_TIME,'HH24:MI:SS') BEGIN_TIME,
TO_CHAR(END_TIME,'HH24:MI:SS') END_TIME
from V$SYSMETRIC
-- where METRIC_NAME IN ('Database Wait Time Ratio','Database CPU Time Ratio')
order BY END_TIME DESC
-- in the recent hour
SELECT
GROUP_ID,
METRIC_NAME,
VALUE,
METRIC_UNIT,
ROUND(INTSIZE_CSEC/100) Interval_Duration,
TO_CHAR(BEGIN_TIME,'HH24:MI:SS') BEGIN_TIME,
TO_CHAR(END_TIME,'HH24:MI:SS') END_TIME
FROM V$SYSMETRIC_HISTORY
WHERE METRIC_NAME IN ('Database Wait Time Ratio','Database CPU Time Ratio')
ORDER BY END_TIME DESC
/* WAIT EVENTS */
-- waite events in the instance:
-- Top Wait Classes By Instance Total
-- AWR reports could also assist you
select
WAIT_CLASS,
TIME_WAITED, round(TIME_WAITED/TOT_WAIT*100,2) TIME_WAITED_PCT, TIME_WAITED_FG,
round(TIME_WAITED_FG/TOT_WAIT*100,2) TIME_WAITED_FG_PCT
from V$SYSTEM_WAIT_CLASS, (select sum(TIME_WAITED) TOT_WAIT from
V$SYSTEM_WAIT_CLASS where WAIT_CLASS <>'Idle'),
(select sum(TIME_WAITED_FG) TOT_WAIT_FG from V$SYSTEM_WAIT_CLASS where WAIT_CLASS
<>'Idle')
where WAIT_CLASS <>'Idle'
order by TIME_WAITED_FG_PCT DESC
-- Wait Classes by Instance Wide in the Last Hour
select
Page 329 Oracle DBA Code Examples
TO_CHAR(BEGIN_TIME,'HH24:MI') BEGIN_TIME,
TO_CHAR(END_TIME,'HH24:MI') END_TIME,
INTSIZE_CSEC/100 Interval_sec,
WAIT_CLASS#,
(SELECT DISTINCT WAIT_CLASS FROM V$EVENT_NAME X WHERE
X.WAIT_CLASS#=W.WAIT_CLASS#) WAIT_CLASS_NAME,
TIME_WAITED, DBTIME_IN_WAIT "Pct of DB Time spent", WAIT_COUNT
from V$WAITCLASSMETRIC_HISTORY W
where WAIT_CLASS#<>6 -- Idle
order by BEGIN_TIME DESC, TIME_WAITED DESC;
-- Wait Events by Instance Total
-- typically waits by foreground processes are what we care about
select
EVENT,
TIME_WAITED_FG,
ROUND(TIME_WAITED_FG/TOT_WAIT_FG*100,2) TIME_WAITED_PCT,
TOTAL_WAITS_FG,
TOTAL_TIMEOUTS_FG,
AVERAGE_WAIT_FG,
WAIT_CLASS,
TOTAL_WAITS,
TOTAL_TIMEOUTS,
TIME_WAITED,
AVERAGE_WAIT
from V$SYSTEM_EVENT, (SELECT SUM(TIME_WAITED_FG) TOT_WAIT_FG FROM V$SYSTEM_EVENT
where WAIT_CLASS <> 'Idle')
where WAIT_CLASS <> 'Idle'
order by TIME_WAITED_FG DESC;
-- if buffer busy was on the top waits, get more info about
-- block contention statistics
select CLASS, TIME, COUNT
from V$WAITSTAT
order by TIME desc
-- Wait Events by Sessions
-- detailed information on V$SESSION ( or V$SESSION_WAIT )
-- cols in V$SESSION_WAIT already contained in V$SESSION
select
E.SID, S.USERNAME, S.MACHINE, S.MODULE, S.ACTION,
S.STATUS,
E.WAIT_CLASS,
E.EVENT,
S.STATE,
WAIT_TIME,
TIME_WAITED,
SECONDS_IN_WAIT,
AVERAGE_WAIT,
P1TEXT,
P1,
P2TEXT,
P2,
P3TEXT,
P3,
Page 330 Oracle DBA Code Examples
TOTAL_WAITS,
MAX_WAIT,
TOTAL_TIMEOUTS,
ROW_WAIT_OBJ# WAITED_OBJECT,
TO_CHAR(S.LOGON_TIME,'HH24:MI') LOGON_TIME,
S.BLOCKING_SESSION
from V$SESSION_EVENT E, V$SESSION S
where E.SID = S.SID
and S.USERNAME NOT IN ('SYSTEM','SYS','DBSNMP','SYSMAN')
and E.WAIT_CLASS <> 'Idle'
order by E.TIME_WAITED desc
/
-- if the problem in the latch, further details can be obtained:
SELECT
ADDR Latch_Object_Address,
LATCH#,
LEVEL#,
NAME,
HASH,
GETS,
MISSES,
case misses when 0 then 0 else misses/(misses+GETS+SLEEPS) end MISSES_RATIO,
SLEEPS,
IMMEDIATE_GETS,
IMMEDIATE_MISSES,
SPIN_GETS,
WAIT_TIME WAIT_TIME_US
FROM V$LATCH
order by MISSES desc
Act i v e Sessi on Hi st or y ( ASH)
Used when you want t o analyze for a previous period not t aken yet by AWR ( let 's say last
10 minut es).
V$ACTI VE_SESSI ON_HI STORY is flushed int o DBA_HI ST_ACTI VE_SESS_HI STORY when
AWR is t aken (every hour by default ) .
-- ASH list
SELECT SAMPLE_ID, SAMPLE_TIME, SESSION_ID, SESSION_SERIAL#, SESSION_TYPE,
FLAGS, USER_ID, SQL_ID, SQL_CHILD_NUMBER, SQL_OPCODE, FORCE_MATCHING_SIGNATURE,
TOP_LEVEL_SQL_ID, TOP_LEVEL_SQL_OPCODE, SQL_PLAN_HASH_VALUE, SQL_PLAN_LINE_ID,
SQL_PLAN_OPERATION, SQL_PLAN_OPTIONS, SQL_EXEC_ID, SQL_EXEC_START,
PLSQL_ENTRY_OBJECT_ID, PLSQL_ENTRY_SUBPROGRAM_ID, PLSQL_OBJECT_ID,
PLSQL_SUBPROGRAM_ID, QC_INSTANCE_ID, QC_SESSION_ID, QC_SESSION_SERIAL#,
EVENT, EVENT_ID, EVENT#, SEQ#, P1TEXT, P1, P2TEXT, P2, P3TEXT, P3, WAIT_CLASS,
WAIT_CLASS_ID, WAIT_TIME, SESSION_STATE, TIME_WAITED, BLOCKING_SESSION_STATUS,
BLOCKING_SESSION, BLOCKING_SESSION_SERIAL#, CURRENT_OBJ#, CURRENT_FILE#,
CURRENT_BLOCK#, CURRENT_ROW#, CONSUMER_GROUP_ID, XID, REMOTE_INSTANCE#,
IN_CONNECTION_MGMT, IN_PARSE, IN_HARD_PARSE, IN_SQL_EXECUTION,
IN_PLSQL_EXECUTION, IN_PLSQL_RPC, IN_PLSQL_COMPILATION, IN_JAVA_EXECUTION,
IN_BIND, IN_CURSOR_CLOSE, SERVICE_HASH, PROGRAM, MODULE, ACTION, CLIENT_ID
FROM V$ACTIVE_SESSION_HISTORY
Where SESSION_TYPE <> 'BACKGROUND'
and USER_ID not in ( select u.user_id from dba_users u where username IN
('SYS','SYSTEM','DBSNMP','SYSMAN') )
order by Sample_Time desc
Page 331 Oracle DBA Code Examples
-- ASH report
-- info about the SQL that ran during the time you specify
$ORACLE_HOME/rdbms/admin/ashrpt.sql
The ashrpti.sql lets you specify the db instance
-- Top Waited-for Objects
SELECT (SELECT o.object_name
FROM dba_objects o
WHERE o.object_id = current_obj#) object_name,
(SELECT o.object_type
FROM dba_objects o
WHERE o.object_id = current_obj#) object_type,
a.event,
SUM (a.wait_time + a.time_waited) total_wait_time
FROM v$active_session_history a
WHERE ( a.wait_time + a.time_waited ) > 0
AND a.current_obj# IS NOT NULL
AND a.sample_time BETWEEN SYSDATE - 15 / 1440 AND SYSDATE
GROUP BY a.event,
current_obj#
ORDER BY total_wait_time DESC;
-- Top Waits
SELECT a.event,
SUM(a.wait_time + a.time_waited) total_wait_time
FROM v$active_session_history a
WHERE a.sample_time between
sysdate - 30/2880 and sysdate
GROUP BY a.event
ORDER BY total_wait_time DESC;
-- Top Waiting Users
SELECT s.sid, s.username,
SUM(a.wait_time +
a.time_waited) total_wait_time
FROM v$active_session_history a,
v$session s
WHERE a.sample_time between sysdate - 30/2880 and sysdate
AND a.session_id=s.sid
GROUP BY s.sid, s.username
ORDER BY total_wait_time DESC;
-- Top Waiting SQL Statements
SELECT a.user_id,d.username,s.sql_text,
SUM(a.wait_time + a.time_waited) total_wait_time
FROM v$active_session_history a,
v$sqlarea s,
dba_users d
WHERE a.sample_time between sysdate - 30/2880 and sysdate
AND a.sql_id = s.sql_id
AND a.user_id = d.user_id
Page 332 Oracle DBA Code Examples
GROUP BY a.user_id,s.sql_text, d.username;
-- Top Resource Consuming SQL
SELECT hash_value, executions,
ROUND (elapsed_time/1000000, 2) total_time,
ROUND (cpu_time/1000000, 2) cpu_seconds
FROM (SELECT * FROM V$SQL
ORDER BY elapsed_time desc);
-- ASH history
SELECT *
FROM DBA_HIST_ACTIVE_SESS_HISTORY
Where SESSION_TYPE <> 'BACKGROUND'
order by SNAP_ID desc
Segment St at i st i cs
You drill down int o segment st at s from t he inst ance, sessions or ASM wait st at s.
select OWNER, OBJECT_TYPE, OBJECT_NAME, TABLESPACE_NAME, STATISTIC_NAME, VALUE
from V$SEGMENT_STATISTICS
-- WHERE statistic_name='buffer busy waits'
order by value desc;
Handl i ng I mpor t ant Or acl e Wai t Event s
Buffer Busy Wait s Check t ype of block is causing t he wait .
Use locally managed t ablespaces wit h ASSM.
Consider using global hash- part it ioned indexes.
Tune SQL st at ement s as necessary t o fix t hese wait s.
Check t hat t he sar - d ut ilit y might indicat e high request queues and
service t imes.
Check your core dump direct ory is not t oo big.
db file scat t ered
read
Reduce t he demand for physical I / Os: Raising t he buffer cache
component , add missing indexes on key t ables, Opt imize SQL
st at ement s. I ncrease t he capacit y of t he syst em t o handle more I / Os.
Db File Sequent ial
Read
I ndicat e index usage.
I ncrease PGA_AGGREGATE_TARGET.
I f t he obj ect s arent t oo large, you can use t he DEFAULT and KEEP
buffer pools t o ret ain t hem in memory.
Direct Pat h Read
and Direct Pat h
Writ e
I t occurs while performing a direct read or writ e int o t he PGA,
bypassing t he SGA buffer cache.
Enable PGA aut o t uning.
I ncrease t he number of disks.
Free Buffer Wait s The number of dirt y buffers in cache t oo high for t he db writ er.
I ncrease Db Buffer Cache
I ncrease DB_WRI TER_PROCESSES ( one per CPU)
Check t he I O
Enqueue Wait s
Sessions are wait ing for locks held by ot her sessions.
Query V$ENQUEUE_STAT
Page 333 Oracle DBA Code Examples
select * from V$ENQUEUE_STAT
where CUM_WAIT_TIME<>0 OR FAILED_REQ#<>0
May caused by infrequent commit s and dict ionary managed t bs.
Lat ch Free
SELECT a.name "Latch Name",
a.gets "Gets (Wait)",
a.misses "Misses (Wait)",
(1 - (misses / gets)) * 100 "Latch Hit Ratio %"
FROM V$LATCH a
WHERE a.gets != 0
UNION
SELECT a.name "Latch Name",
a.gets "Gets (Wait)",
a.misses "Misses (Wait)",
100 "Latch Hit Ratio"
FROM V$LATCH a
WHERE a.gets = 0
ORDER BY 4;
shared pool latch (and the library cache latches) reasons:
An undersized shared pool
Failure t o use bind variables
Using dissimilar SQL st at ement s and failing t o reuse st at ement s
Users frequent ly logging off and logging back int o t he applicat ion
Failure t o keep cursors open aft er each execut ion
Using a shared pool size t hat s t oo large
cache buffers LRU chain and cache buffer chain may be caused
by t able full scan or unselect ive indexes.
Log Buffer Space
Check I / O t o t he redo log disk
Consider increasing LOG_BUFFER
Log File Swit ch Check t he archive dest inat ion isn' t full.
I ncrease sizes of redo log files.
I ncrease t he number of archiver ( ARCn) processes. Small values lead t o
"redo log space request s" in V$SYSSTAT
Log File Sync
Too- frequent commit s
Redo Log I / O bot t leneck
Usi ng OS Wat cher
OS Wat cher for Unix and Linux, see Using OS Wat cher for Linux.
OS Wat cher for Windows ( OSWFW) is several bat ch files t hat run t he Windows ut ilit y
logman and scht asks.
I f OSWFW is inst alled on RAC, when it is first run, it will read t he Clust er Regist ry and
copy it self t o t he ot her nodes in a direct ory t hat is t he same name as t he direct ory it was
first unzipped in.
I t s reference is Not e 433472. 1
Page 334 Oracle DBA Code Examples
/* Removing OSWFW */
oswatcher remove
/* Initially configure OSWFW */
OSWatcher {ARG1} {ARG2} {ARG3}
ARG1 = Snapshot interval in seconds
ARG2 = Runtime Interval - hours OSWatcher will run
ARG3 = RAC - detect Real Application Cluster
OSWatcher 30 48
/* OSWatcher stop */
OSWatcher stop {node name}
/* Getting the Status of OSWFW */
OSWatcher status
/* Querying details of a specific counter or task */
OSWatcher query {node name} {counter / OSWCleanup / OSWPrivNet}
OSWatcher query all
oswatcher query OSWThread
/* Extracting the Names of the Counters in a Capture File */
relog {trace_file_name} -q
# to sort the output:
relog {trace_file_name} -q | sort /+1
Page 335 Oracle DBA Code Examples
Opt i mi zi ng Per f or mance i n Wi ndow s Ser v er
Opt i mi zi ng Per f or mance i n Wi ndow s Ser ver 2003
/* disable un-required services */
Usually, the following services are not required in a database server and can be
disabled:
Alerter
ClipBook
Computer Browser
DHCP Client
DHCP Server
Fax Service
File Replication
INfrared Monitor
Internet Connection Sharing
Messenger
NetMeeting Remote Desktop Sharing
Network DDE
Network DDE DSDM
NWLink NetBIOS
NWLink IPX/SPX
Print Spooler
TCP/IP NetBIOS Helper Service: unless member of a domain
Telephony
Telnet
Uninterruptible Power Supply
/* Optimize Performance for Background Services */
Oracle database runs as a background service.
To increase performance for background services, follow these steps:
1. Click Start, click Control Panel, and then click System.
2. Click the Advanced tab, and then click Settings under Performance.
3. Click the Advanced tab, click Background services, and then click OK
/* Optimize Data Throughput for Network Applications */
1. In Windows Explorer, right-click My Network Places, and then click Properties.
2. Right-click the Local Area Connection that you want to optimize, then click
Properties.
3. In the This connection uses the following items list, click (but do not clear
its check box) File and Printer Sharing for Microsoft Networks, and then click
Properties.
4. Click Maximum data throughput for network applications, click OK, then Close.
Page 336 Oracle DBA Code Examples
Tuni ng t he Dat abase I n st ance
Tuni ng t he Shar ed Pool
/* Data Dictionary Hit Ratio */
-- around 90
SELECT (sum(gets - getmisses - fixed)) / SUM(gets) "data dictionary hit ratio"
from v$rowcache;
/* Pinning Objects in the Shared Pool (LC)*/
SELECT type, COUNT(*) OBJECTS,
SUM(DECODE(KEPT,'YES',1,0)) KEPT,
SUM(loads) - count(*) reloads
FROM V$DB_OBJECT_CACHE
GROUP BY type
ORDER BY objects DESC;
select *
FROM V$DB_OBJECT_CACHE
order by loads desc;
-- pin objects with high loads:
-- un-retained after db restart
-- you can make script to load then when db starts
EXECUTE SYS.DBMS_SHARED_POOL.KEEP(NEW_EMP.PKG, PACKAGE);
EXECUTE SYS.DBMS_SHARED_POOL.UNKEEP(NEW_EMP.PKG,PACKAGE);
/* Measuring Library Cache Efficiency */
-- lib cache hit ratio
SELECT SUM(pinhits)/sum(pins) Library_cache_hit_ratio
FROM V$LIBRARYCACHE;
-- statement reloads
SELECT namespace, pins, pinhits, reloads
FROM V$LIBRARYCACHE
ORDER BY namespace;
-- lib cache memory usage
select LC_NAMESPACE, LC_INUSE_MEMORY_OBJECTS, LC_INUSE_MEMORY_SIZE,
LC_FREEABLE_MEMORY_OBJECTS, LC_FREEABLE_MEMORY_SIZE
from V$LIBRARY_CACHE_MEMORY
order by LC_INUSE_MEMORY_OBJECTS desc, LC_INUSE_MEMORY_SIZE desc,
LC_FREEABLE_MEMORY_OBJECTS desc, LC_FREEABLE_MEMORY_SIZE desc;
-- to estimate the optimal shared pool size
-- you can just set the MEMORY_TARGET
select SHARED_POOL_SIZE_FOR_ESTIMATE, SHARED_POOL_SIZE_FACTOR, ESTD_LC_SIZE,
ESTD_LC_MEMORY_OBJECTS, ESTD_LC_TIME_SAVED, ESTD_LC_TIME_SAVED_FACTOR,
ESTD_LC_LOAD_TIME, ESTD_LC_LOAD_TIME_FACTOR, ESTD_LC_MEMORY_OBJECT_HITS
from V$SHARED_POOL_ADVICE
Page 337 Oracle DBA Code Examples
order by SHARED_POOL_SIZE_FOR_ESTIMATE desc;
-- if literal values rather than bind values are used
-- by the applications (high hard parse):
CURSOR_SHARING=FORCE (recommended) or SIMILAR (not EXACT)
/* Setting CURSOR_SPACE_FOR_TIME */
If CURSOR_SPACE_FOR_TIME=TRUE, you ensure that the cursors for the application
cannot be deallocated while the application cursors are still open. It will then
eliminate the Oracles overhead to check whether the cursor is flushed from the
library cache.
It will result in increase in the shared pool memory.
/* Setting SESSION_CACHED_CURSORS */
It ensures that for any cursor for which more than three parse requests are made,
the parse requests are automatically cached in the session cursor cache. It avoids
high soft parse.
Good to use in Forms-based apps.
ALTER SESSION SET SESSION_CACHED_CURSORS = value;
If the value of session cursor cache hits is low compared to the total parse count
for a session, then the SESSION_CACHED_CURSORS parameter value should be increased
(also good to make it larger than OPEN_CURSORS):
select NAME, VALUE
from v$sysstat
where name = 'session cursor cache hits'
select SID, NAME, VALUE
from v$sesstat, V$STATNAME
where V$SESSTAT.STATISTIC# = V$STATNAME.STATISTIC#
and NAME LIKE 'parse count (total)'
order by VALUE desc
alter system set SESSION_CACHED_CURSORS=300 scope=spfile ;
Tuni ng t he Buf f er Cache
/* Sizing the Buffer Cache */
-- use MEMORY_TARGET
-- size assigned to it
select current_size/1024/1024
from V$SGA_DYNAMIC_COMPONENTS
where component = 'DEFAULT buffer cache'
-- different areas in the buffer cache
select count(*) blocks, State
from (
select decode (state,
0, 'Free',
1, decode (lrba_seq,0, 'Available','Being Used'),
3, 'Being Used',
Page 338 Oracle DBA Code Examples
state) State
from x$bh )
group by rollup(state)
order by count(*) desc;
-- to get the buffer cache hit ratio
SELECT NAME, PHYSICAL_READS, DB_BLOCK_GETS, CONSISTENT_GETS,
round( 1 - (PHYSICAL_READS/(DB_BLOCK_GETS + CONSISTENT_GETS)),4)*100 "HitRatio"
FROM V$BUFFER_POOL_STATISTICS;
/* Using Multiple Pools for the Buffer Cache */
-- x$bh: contains a record (the buffer header) for each block in the buffer
select count(*), State from (
select decode (state,
0, 'Free',
1, decode (lrba_seq,0, 'Available','Being Used'),
3, 'Being Used',
state) State
from x$bh )
group by state
/* Sizing the Buffer Cache */
-- use MEMORY_TARGET
-- to get the buffer cache hit ratio
SELECT NAME, PHYSICAL_READS, DB_BLOCK_GETS, CONSISTENT_GETS,
round( 1 - (PHYSICAL_READS/(DB_BLOCK_GETS + CONSISTENT_GETS)),4)*100 "HitRatio"
FROM V$BUFFER_POOL_STATISTICS;
/* Using Multiple Pools for the Buffer Cache */
-- To determine objects that are candidates for the recycle buffer pool
-- x$bh: contains a record (the buffer header) for each block in the buffer
select
obj object,
o.object_name,
count(*) buffers,
round((count(*)/totsize) * 100,2) percent_cache
FROM x$bh, (select count(*) totsize FROM x$bh ), DBA_OBJECTS o
WHERE ( tch=1 -- touch count
OR (tch = 0 and lru_flag <10))
and obj=o.object_id(+)
GROUP BY obj, o.object_name, totsize
having round((count(*)/totsize) * 100,2) > 1
order by percent_cache desc;
-- objects candidate for keep pool
-- objects of at least 25 buffers and have an average touch count of more than 5
SELECT obj object, o.object_name,
count(*) buffers,
AVG(tch) average_touch_count
FROM x$bh, dba_objects o
WHERE obj=o.object_id(+) and
lru_flag = 8
GROUP BY obj, o.object_name
HAVING avg(tch) > 5 AND count(*) > 25
Page 339 Oracle DBA Code Examples
order by avg(tch) desc
-- define the areas
DB_KEEP_CACHE_SIZE=16MB
DB_RECYCLE_CACHE_SIZE=16MB
-- change the table's pool
ALTER TABLE test1 STORAGE (buffer_pool keep);
ALTER TABLE test2 STORAGE (buffer_pool recycle);
Tuni ng PGA
-- PGA stats
SELECT NAME, VALUE, UNIT FROM V$PGASTAT
-- PGA used by each session
SELECT
s.sid,a.username, round(s.value/1024,2) KB
FROM
V$SESSTAT S, V$STATNAME N, V$SESSION A
WHERE
n.STATISTIC# = s.STATISTIC# and
name = 'session pga memory'
AND s.sid=a.sid
ORDER BY s.value desc;
-- PGA used by sessions
select PID, SERIAL#, CATEGORY, round(ALLOCATED/1024,2) ALLOCATED_KB1,
USED, round(MAX_ALLOCATED/1024,2) MAX_ALLOCATED_KB
from V$PROCESS_MEMORY
-- PGA used by processes
SELECT
program,
pga_used_mem,
pga_alloc_mem,
pga_freeable_mem,
pga_max_mem
from V$PROCESS;
Usi ng Ser ver Resul t Cache
For SQL Result Cache, if an underlying t able is updat ed, t he result cache will be invalidat e
and t he st at ement will be re- execut ed.
Caut i on When a session reads from a PL/ SQL funct ion result cache, t he funct ion body
is not execut ed. This means, if t he funct ion includes any I O or audit ing code, t his code will not
act ually be execut ed.
SQL Result Cache Rest rict ions:
Queries against dat a dict ionary obj ect s and t emporary t ables are not support ed.
Page 340 Oracle DBA Code Examples
Queries t hat use t he following SQL funct ions: CURRENT_DATE, CURRENT_TI MESTAMP,
LOCAL_TI MESTAMP, USERENV/ SYS_CONTEXT, SYS_GUI D, SYSDATE and SYS_TI MESTAMP
are not support ed.
Queries wit h bind variables can reuse a cached result only for ident ical variable values.
Result s of t he queries ret rieving non current version of dat a are not cached in t he result
cache.
Result s of t he flashback queries are not cached.
Rest rict ions on PL/ SQL Funct ion Result Cache include:
The funct ion cannot be defined in a module using invokers right s.
The funct ion cannot be used in an anonymous block.
The funct ion cannot have any OUT or I N OUT paramet ers.
The funct ion cannot have I N paramet ers t hat are BLOB, CLOB, NCLOB, REF CURSOR,
collect ions, obj ect s, or records.
The funct ion cannot ret urn a BLOB, CLOB, NCLOB, REF CURSOR, OBJECTS, or records. I t
can ret urn a collect ion as long as t he collect ion does not cont ain one of t hese t ypes.
/* Configuring Result Cache */
RESULT_CACHE_MAX_SIZE maximum amount of SGA memory (in bytes) that can be used by
the Result Cache (taken from shared pool).
If the value of this parameter is 0, then the feature is disabled.
show parameter RESULT_CACHE_MAX_SIZE
ALTER SYSTEM SET RESULT_CACHE_MAX_SIZE =8M;
The parameter RESULT_CACHE_MAX_RESULT specifies the percentage of
RESULT_CACHE_MAX_SIZE that any single result can use.
Its default value is five.
ALTER SYSTEM SET RESULT_CACHE_MAX_RESULT =25;
The parameter RESULT_CACHE_REMOTE_EXPIRATION specifies the number of minutes that
a result using a remote object is allowed to remain valid. Setting this parameter
to 0 (the default) implies that results using remote objects should not be cached.
/* Controlling Result Cache Behavior */
The RESULT_CACHE_MODE initialization parameter:
MANUAL The ResultCache operator is added, only if you use the RESULT_CACHE
hint in the SQL query.
FORCE The ResultCache operator is added to the root of all SELECT statements, if
that is possible. However, if the statement contains a NO_RESULT_CACHE hint, then
the hint takes precedence over the parameter setting.
ALTER SYSTEM SET RESULT_CACHE_MODE =FORCE;
ALTER SESSION SET RESULT_CACHE_MODE =FORCE;
SELECT /*+ result_cache */
AVG(SALARY), E.DEPARTMENT_ID
FROM HR.EMPLOYEES E, HR.DEPARTMENTS D
WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID GROUP BY E.DEPARTMENT_ID;
Page 341 Oracle DBA Code Examples
/* PL/SQL Function Result Cache */
CREATE OR REPLACE FUNCTION get_name (id NUMBER) RETURN VARCHAR2
RESULT_CACHE RELIES_ON(emp) IS ...
-- Package specification
CREATE OR REPLACE PACKAGE department_pks IS
-- Function declaration
FUNCTION get_dept_info (dept_id NUMBER) RETURN dept_info_record RESULT_CACHE;
END department_pks;
CREATE OR REPLACE PACKAGE BODY department_pks AS
-- Function definition
FUNCTION get_dept_info (dept_id NUMBER) RETURN dept_info_record
RESULT_CACHE RELIES_ON (EMPLOYEES)
IS
BEGIN ...
/* Bypass Result Cache */
begin
DBMS_RESULT_CACHE.BYPASS(TRUE);
DBMS_RESULT_CACHE.FLUSH;
end;
exec DBMS_RESULT_CACHE.BYPASS(FALSE);
/* Monitoring Result Cache */
-- Memory taken for Result Cache
SELECT NAME, ROUND(BYTES/1024,2) KB
FROM V$SGAstat
WHERE upper(name) like '%RESULT%';
-- objects in the result cache
select ID, TYPE, STATUS, BUCKET_NO, HASH, NAME, NAMESPACE, CREATOR_UID,
DEPEND_COUNT, BLOCK_COUNT, SCN, COLUMN_COUNT, PIN_COUNT, SCAN_COUNT, ROW_COUNT,
ROW_SIZE_MAX, ROW_SIZE_MIN, ROW_SIZE_AVG, BUILD_TIME, LRU_NUMBER, OBJECT_NO,
INVALIDATIONS, SPACE_OVERHEAD, SPACE_UNUSED, CACHE_ID, CACHE_KEY,
to_char(CREATION_TIMESTAMP,'HH12:MI AM') CREATE_TIME
from V$RESULT_CACHE_OBJECTS
order by type desc;
-- result cache stats
select ID, NAME, VALUE
from V$RESULT_CACHE_STATISTICS;
-- using DBMS_RESULT_CACHE
-- check the status of the Result Cache
-- Note: this is the reliable method to know whether result cache is enabled or
not
SQL>select DBMS_RESULT_CACHE.STATUS from dual;
-- display report on result cache memory
SQL>set serveroutput on
Page 342 Oracle DBA Code Examples
SQL>exec DBMS_RESULT_CACHE.MEMORY_REPORT
-- turn bypass mode on and off
SQL>exec DBMS_RESULT_CACHE.BYPASS (TRUE);
-- to flush the result cache
SQL>exec DBMS_RESULT_CACHE.FLUSH
Obt ai ni ng I nf or mat i on about Obj ect Lock s
-- DML locks by transactions on objects
SELECT l.object_id,
l.session_id,
l.oracle_username,
DECODE(l.locked_mode,
1, 'No Lock',
2, 'Row Share',
3, 'Row Exclusive',
4, 'Shared Table',
5, 'Shared Row Exclusive',
6, 'Exclusive') locked_mode,
(select o.object_name from DBA_OBJECTS o WHERE o.object_id=l.object_id)
object_name
FROM V$LOCKED_OBJECT l
order by ORACLE_USERNAME;
SELECT dbl.lock_type, dbl.mode_held, dbl.blocking_others,
dbo.object_name object_locked, dbo.object_type
FROM dba_locks dbl, v$session v, dba_objects dbo
WHERE v.username not in
('SYS','SYSTEM','DBSNMP','SYSMAN','OUTLN','TSMSYS','WMSYS','EXFSYS','CTXSYS','XDB'
,'ORDSYS','MDSYS','OLAPSYS','WKSYS','WK_TEST','IX')
AND dbl.session_id = v.sid AND dbo.object_id = dbl.lock_id1;
-- blocking session
select ADDR, KADDR, l.SID, s.USERNAME, S.MACHINE, S.TERMINAL, S.PROGRAM,
decode(l.TYPE, 'TM','DML enqueue','TX','Transaction enqueue','UL','User supplied')
Block_Type,
ID1, ID2, LMODE, REQUEST, CTIME, BLOCK
from v$lock l, v$session s
where s.sid = l.sid
and l.block=1;
-- blocking and blocked sessions
SELECT SUBSTR(TO_CHAR(w.session_id),1,5) WSID, p1.spid WPID,
SUBSTR(s1.username,1,12) "WAITING User",
SUBSTR(s1.osuser,1,8) "OS User",
SUBSTR(s1.program,1,20) "WAITING Program",
s1.client_info "WAITING Client",
SUBSTR(TO_CHAR(h.session_id),1,5) HSID, p2.spid HPID,
SUBSTR(s2.username,1,12) "HOLDING User",
SUBSTR(s2.osuser,1,8) "OS User",
SUBSTR(s2.program,1,20) "HOLDING Program",
s2.client_info "HOLDING Client",
Page 343 Oracle DBA Code Examples
o.object_name "HOLDING Object"
FROM gv$process p1, gv$process p2, gv$session s1,
gv$session s2, dba_locks w, dba_locks h, dba_objects o
WHERE -- w.last_convert > 120 AND (Objects locked for 2 mins)
h.mode_held != 'None'
AND h.mode_held != 'Null'
AND w.mode_requested != 'None'
AND s1.row_wait_obj# = o.object_id
AND w.lock_type(+) = h.lock_type
AND w.lock_id1(+) = h.lock_id1
AND w.lock_id2 (+) = h.lock_id2
AND w.session_id = s1.sid (+)
AND h.session_id = s2.sid (+)
AND s1.paddr = p1.addr (+)
AND s2.paddr = p2.addr (+)
ORDER BY w.last_convert desc;
Handl i ng a Hangi ng Dat abase
Archiver Process St uck. I n t he alert log file, you' ll see: ORA- 00257: archiver error.
Connect int ernal only, unt il freed.
o Redirect archiving t o a different direct ory.
o Clear t he archive log dest inat ion by removing some archive logs.
Sys Audit is full. Check and delet e $ORACLE_HOME/ rdbms/ audit
Make sure t he OS isn' t swapping.
Accur at el y Measur i ng Pr ocess Si ze
Some t ools like ps and t op give you a misleading idea as t o t he process size, because t hey
include t he common shared TEXT sizes in individual processes.
-- memory occupied by every session
SELECT sid, n.name|| ' ('||s.statistic#||')', to_char(round(value/1024),'999,999')
|| ' KB' KB
FROM v$sesstat s, v$statname n
WHERE s.statistic# = n.statistic#
AND n.name like '%ga memory%'
ORDER BY SID, value DESC;
-- total memory allocated to the PGA and UGA memory
SELECT 'Total PGA', round(SUM(value)/1024/1024,2) MB
FROM V$SESSTAT s, V$STATNAME n
WHERE s.statistic# = n.statistic#
AND n.name in ('session pga memory')
group by n.name
union
SELECT 'Total UGA', round(SUM(value)/1024/1024,2) MB
FROM V$SESSTAT s, V$STATNAME n
WHERE s.statistic# = n.statistic#
AND n.name in ('session uga memory')
group by n.name;
Page 344 Oracle DBA Code Examples
-- another way to know PGA used size
select round(value/1024/1024,2) MB from V$PGASTAT where name='total PGA inuse';
Page 345 Oracle DBA Code Examples
Managi ng Aut omat i c Wor k l oad Reposi t or y ( AWR)
The AWR and ADDM are Oracle product s t hat need special licensing t hrough t he purchase
of t he Diagnost ic Pack.
-- To manually creating a snapshot:
dbms_workload_repository.create_snapshot()
-- To drop a range of snapshots:
dbms_workload_repository.drop_snapshot_range (low_snap_id => 40,high_snap_id =>
60, dbid => 2210828132)
-- To modify a AWR setting:
begin
DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(
retention => 43200, -- in mins
interval => 30, -- between snaps in mins
dbid => 3310949047 -- If NULL, the local dbid will be used
)
end;
/
select DBID, SNAP_INTERVAL, RETENTION, TOPNSQL
from DBA_HIST_WR_CONTROL;
/* Creating and Deleting AWR Snapshot Baselines */
begin
dbms_workload_repository.create_baseline
(start_snap_id => 125,
end_snap_id => 185,
baseline_name => 'peak_time baseline',
dbid => 2210828132 );
end;
/
-- To drop a snapshot baseline:
-- if cascade is true, the snaps will also be deleted
exec dbms_workload_repository.drop_baseline (baseline_name => 'peak_time
baseline', cascade => FALSE)
/* Creating AWR Reports */
<ORACLE_HOME>\RDBMS\ADMIN\awrrpt.sql
Page 346 Oracle DBA Code Examples
Managi ng Aut omat ed Mai nt enance Task s
Aut omat ic Opt imizer St at ist ics Collect ion
Aut omat ic Segment Advisor
Aut omat ic SQL Tuning Advisor
/* Obtain Info about AMTs */
select *
from DBA_AUTOTASK_TASK
/* Monitoring AMT */
SELECT client_name, status,
attributes, window_group,service_name
FROM dba_autotask_client;
/* Enabling and Disableing a Maintenance Task */
begin
DBMS_AUTO_TASK_ADMIN.ENABLE
(client_name => 'sql tuning advisor',
operation => 'automatic sql tuning task',
window_name => 'monday_window');
end;
/
begin
dbms_auto_task_admin.disable
(client_name => 'sql tuning advisor',
operation => 'automatic sql tuning task',
window_name => 'monday_window');
end;
/
Usi ng Aut omat i c Dat abase Di agnost i c Moni t or ( ADDM)
The AWR and ADDM are Oracle product s t hat need special licensing t hrough t he purchase
of t he Diagnost ic Pack.
/* Obtain info about ADDM */
-- list of all advisors tasks
select * from DBA_ADVISOR_TASKS;
-- findings (all advisors)
select * from DBA_ADVISOR_FINDINGS where task_name='ADDM 01012009';
-- findings only add ADDM
select * from DBA_ADDM_FINDINGS where task_name='ADDM 01012009';
-- recommendations
select * from DBA_ADVISOR_RECOMMENDATIONS where task_name='ADDM 01012009';
Page 347 Oracle DBA Code Examples
/* Setting Up ADDM */
-- CONTROL_MANAGEMENT_PACK_ACCESS should be DIAGNOSTIC or DIAGNOSTIC+TUNING
-- STATISTICS_LEVEL should be TYPICAL or ALL (not BASIC)
select name, value
from v$parameter where upper(name) in
('CONTROL_MANAGEMENT_PACK_ACCESS','STATISTICS_LEVEL');
alter system set control_management_pack_access='DIAGNOSTIC+TUNING'
/* Determining Optimal I/O Performance */
Oracle assumes the value of the parameter (not intialization parameter)
DBIO_EXPECTED is 10 milliseconds.
SELECT PARAMETER_VALUE
FROM DBA_ADVISOR_DEF_PARAMETERS
WHERE ADVISOR_NAME='ADDM'
AND PARAMETER_NAME='DBIO_EXPECTED'
If your hardware is significantly different, you can set the parameter value one
time for all subsequent ADDM executions:
DBMS_ADVISOR.SET_DEFAULT_TASK_PARAMETER('ADDM','DBIO_EXPECTED', 8000);
/* Retreiving AWR snapshots */
SELECT SNAP_ID , INSTANCE_NUMBER ,
TO_CHAR(BEGIN_INTERVAL_TIME,'DD-MON-RR HH24:MI') BEGIN_TIME,
TO_CHAR(END_INTERVAL_TIME,'DD-MON-RR HH24:MI') END_TIME
FROM DBA_HIST_SNAPSHOT
order by SNAP_ID desc;
/* Running ADDM in Database Mode */
DECLARE
-- task name shouldn't exists in db
TNAME VARCHAR2(50) :='ADDM DB 01012009';
BEGIN
DBMS_ADDM.ANALYZE_DB (
task_name =>TNAME, -- it is IN OUT para
begin_snapshot =>43,
end_snapshot =>44);
END;
/
-- also the report will then be generated
@C:\oracle\oracledb11g\RDBMS\ADMIN\addmrpt.sql
/* Running ADDM in Instance Mode */
-- used in RAC
DECLARE
TNAME VARCHAR2(50) :='ADDM INST 01012009';
BEGIN
DBMS_ADDM.ANALYZE_INST (
task_name =>TNAME, -- it is IN OUT para
begin_snapshot =>43,
end_snapshot =>44,
instance_number=>1);
Page 348 Oracle DBA Code Examples
END;
/
/* Running ADDM in Partial Mode */
-- subset of all database instances (in RAC)
DECLARE
-- task name shouldn't exists in db
TNAME VARCHAR2(50) :='ADDM PART 01012009';
BEGIN
DBMS_ADDM.ANALYZE_PARTIAL (
task_name =>TNAME,
begin_snapshot =>43,
end_snapshot =>44,
instance_numbers=>'1,2,3');
END;
/
/* Displaying an ADDM Report */
SET LONG 1000000 PAGESIZE 0;
SELECT DBMS_ADDM.GET_REPORT('ADDM DB 01012009') FROM DUAL;
/* Deleting already created tasks */
exec DBMS_ADDM.DELETE(task_name=>'ADDM INST 01012009');
Usi ng Aut omat i c SQL Tuni ng Advi sor
When SQL Tunining Advisor is running as an aut omat ic t ask, it avoids analysing t he following:
Parallel queries
Ad hoc queries
Recursive st at ement s
SQL st at ement s t hat use t he I NSERT and DELETE st at ement s
SQL st at ement s t hat use DDL st at ement s such as CREATE TABLE AS SELECT
/* Obtain Info about Automatic SQL Tuning Advisor */
select OWNER, TASK_ID, TASK_NAME, EXECUTION_NAME, DESCRIPTION,
EXECUTION_TYPE, EXECUTION_TYPE#, EXECUTION_START, EXECUTION_END,
ADVISOR_NAME, STATUS, STATUS_MESSAGE, ERROR_MESSAGE
from DBA_ADVISOR_EXECUTIONS
order by task_id desc
-- all SQL compilation and execution statistics
DBA_ADVISOR_SQLSTATS
DBA_ADVISOR_SQLPLANS
Page 349 Oracle DBA Code Examples
/* Configuring Automatic SQL Tuning */
-- Automatic SQL Tuning Advisor job runs for a maximum of one hour by default
-- in seconds
exec dbms_sqltune.set_tuning_task_parameter ('SYS_AUTO _SQL_TUNING_TASK',
'TIME_LIMIT', 14400)
-- other parameters to set
ACCEPT_SQL_PROFILES: TRUE/FALSE whether the database must automatically accept a
SQL profile
MAX_AUTO_SQL_PROFILES: maximum number of automatic SQL profiles allowed on the
system, in sum
MAX_SQL_PROFILES_PER_EXEC: maximum number of SQL profiles that can be
automatically implemented per execution of the task.
-- to view current parameter values:
COLUMN parameter_value FORMAT A30
SELECT parameter_name, parameter_value
FROM dba_advisor_parameters
WHERE task_name = 'SYS_AUTO_SQL_TUNING_TASK'
AND parameter_name IN ('ACCEPT_SQL_PROFILES',
'MAX_SQL_PROFILES_PER_EXEC',
'MAX_AUTO_SQL_PROFILES');
/* Enabling and Disable the automatic advisor */
-- enable it in all maintenance windows
begin
dbms_auto_task_admin.enable (
client_name => 'sql tuning advisor',
operation => 'NULL',
window_name='NULL');
end;
/
-- in a specific window
begin
dbms_auto_task_admin.enable (
client_name => 'sql tuning advisor',
operation => 'NULL',
window_name='monday_night_window');
end;
/
/* View the Report */
-- display report of most recent execution:
VARIABLE l_report CLOB;
BEGIN
:l_report := DBMS_SQLTUNE.report_auto_tuning_task(
begin_exec => NULL,
end_exec => NULL,
type => DBMS_SQLTUNE.type_text, -- 'TEXT'
level => DBMS_SQLTUNE.level_typical, -- 'TYPICAL'
section => DBMS_SQLTUNE.section_all, -- 'ALL'
object_id => NULL,
result_limit => NULL);
Page 350 Oracle DBA Code Examples
END;
/
print :l_report
Page 351 Oracle DBA Code Examples
I mpl emen t i ng Aut omat i c Memor y Managemen t
When you configure t he dat abase t o use MEMORY_TARGET, you should t ake int o considerat ion
t he following:
The paramet er STATI STI CS_LEVEL must be set t o TYPI CAL
I f you set t he paramet ers SGA_TARGET and PGA_TARGET, Oracle will consider t he values
as t he minimum values for SGA and PGA.
I f you do not set t he paramet ers SGA_TARGET and PGA_TARGET ( or set t hem t o zero) , no
minimum value is considered by Oracle for t he SGA and PGA. When t he inst ance st art s, it
assigns 60 percent t o SGA and 40 percent t o t he PGA.
When MEMORY_TARGET is configured, t he following component s are aut o t uned: DB
BUFFER CACHE, SHARED POOL, JAVA POOL, LARGE POOL and STREAMS POOL.
Not e On Linux syst ems, if you receive t he f ollowing error af t er set t ing t he MEMORY_TARGET paramet er,
most likely t he reason is t hat t he / dev/ shm is allocat ed a size ( can be known by issuing t he
command df -k) less t han SGA_MAX_SIZE:
ORA-00845: MEMORY_TARGET not supported on this system.
Resolving t he issue can be done by t he f ollowing OS commands:
#umount /dev/shm
#mount -t tmpfs shmfs -o *size=><xx>m* /dev/shm
show parameter MEMORY_TARGET
show parameter MEMORY_MAX_SIZE
-- dynamic parameter
ALTER SYSTEM SET MEMORY_TARGET = 410M ;
-- To set a proper value to the parameter MEMORY_TARGET, query the view
V$MEMORY_TARGET_ADVICE.
SELECT * FROM V$MEMORY_TARGET_ADVICE order by MEMORY_SIZE desc;
-- To display current status of the memory components, use the following
query:
col COMPONENT format a30
SELECT COMPONENT, ROUND(CURRENT_SIZE/1024/1024) CURRENT_SIZE ,
ROUND(MIN_SIZE/1024/1024) MIN, ROUND(MAX_SIZE/1024/1024) MAX
FROM V$MEMORY_DYNAMIC_COMPONENTS
order by CURRENT_SIZE desc;
-- To know how Oracle has modified the memory area sizes by time, issue the
following query:
select START_TIME, END_TIME, STATUS, COMPONENT, OPER_TYPE, OPER_MODE,
PARAMETER, INITIAL_SIZE/1024/1024 INITIAL_SIZE_MB,
TARGET_SIZE/1024/1024 TARGET_SIZE_MB, FINAL_SIZE/1024/1024 FINAL_SIZE_MB
from V$MEMORY_RESIZE_OPS
order by START_TIME, END_TIME
Page 352 Oracle DBA Code Examples
Conf i g ur i ng DB_ nK_CACHE_SI ZE
ALTER SYSTEM SET DB_16K_CACHE_SIZE =1024M;
CREATE TABLESPACE big_block_tbs
DATAFILE '/test01/app/oracle/big_block_01.dbf' SIZE 1000M
BLOCKSIZE 16K;
ALTER TABLE names2 MOVE TABLESPACE big_block_tbs;
Page 353 Oracle DBA Code Examples
Managi ng Op t i mi zer Oper at i on s
Set t i ng t he Opt i mi zer Mode
OPTIMIZER_MODE:
ALL_ROWS maximum throughput (good for patch processing)
FIRST_ROWS_n where n 1,10,100,1000 maximum response time (good for interactive
apps)
FIRST_ROWS (deprecated) same as above
SHOW PARAMETER OPTIMIZER_MODE
select value from v$parameter where upper(name)='OPTIMIZER_MODE' ;
-- instance level:
ALTER SYSTEM SET optimizer_mode = first_rows_10;
-- session level (PL/SQL blocks won't be affected)
ALTER SESSION SET optimizer_mode = first_rows_10;
-- statement level
select /*+ first_rows(10) */ ..
SELECT /*+ ALL_ROWS */ ...
Def i ni ng Access Pat hs and Joi ns f or t he Quer y Opt i mi zer
Access Pat hs:
Full Table Scans ( FULL)
Rowid Scans
I ndex Scans:
o I ndex Unique Scans ( I NDEX) : using UNI QUE or PRI MARY KEY indexes
o I ndex Range Scans ( I NDEX, I NDEX_ASC, I NDEX_DESC, NO_I NDEX_RS) : < ,> , = , Like
on index key
o I ndex Range Scans Descending ( I NDEX_DESC) : when an order by descending clause
can be sat isfied by an index
o I ndex Skip Scans ( I NDEX_SS, I NDEX_SS_ASC, I NDEX_SS_DESC) : when t here are few
dist inct values in t he leading column of t he composit e index and many dist inct
values in t he nonleading key of t he index. For example: I NDEX(sex, emp_id) and
select .. . where emp_id= 100
o Full Scans: it is available if a predicat e references one of t he columns in t he index or
all of t he columns in t he t able referenced in t he query are included in t he index. I t
read single blocks.
o Fast Full I ndex Scans ( I NDEX_FFS, I NDEX_FFS_ASC, I NDEX_FFS_DESC,
NO_I NDEX_FFS) : when t he index cont ains all t he columns t hat are needed for t he
query, and at least one column in t he index key has t he NOT NULL const raint . I t
reads t he ent ire index using mult iblock reads, unlike a full index scan, and can be
parallelized.
Page 354 Oracle DBA Code Examples
o I ndex Joins ( I NDEX_JOI N) : it is a hash j oin of several indexes t hat t oget her cont ain all
t he t able columns t hat are referenced in t he query.
o Bit map I ndexes ( I NDEX_COMBI NE or I NDEX) : t he opt imizer uses a bit map index t o
get t he rowids. I t requires EE license.
Clust er Access ( CLUSTER) : when a t able is st ored in an indexed clust er.
Hash Access ( HASH) : is used t o locat e rows in a hash clust er, based on a hash value.
Sample Table Scans: when using SAMPLE [ BLOCK] keyword in t he select st at ement .
Joi ns:
Nest ed Loop Join ( USE_NL, No_USE_NL) : for every row in t he out er t able, Oracle accesses
all t he rows in t he inner t able.
Hash Join ( USE_HASH, NO_USE_HASH) : used when j oining one large t able wit h a small
one. The smaller dat a source is built int o memory as hash t able. I t t hen scans t he larger
t able, probing t he hash t able t o find t he j oined rows. Eualit y condit ion is a must .
Sort Merge ( USER_MERGE, NO_USE_MERGE) : I t performs well when no order is required
on t he dat a source ( or already sort ed) and t he j oin condit ion is NOT equalit y.
Out er Joins: ext ends t he result of a simple j oin:
o Nest ed Loop Out er Joins: The out er t able will be t he one wit h rows t hat are
being preserved.
o Hash Join Out er Joins
o Sot Merge Out er Joins
o Full Out er Join
Cart esian: t wo or more t ables wit h no j oins.
/* Access Path Hinst */
-- Full Table Scans
select /* FULL(table_alias) */
-- "order by" might be served by the index
select /*+ index_DESC(n names3i2) */
*
from names3 n
where name like '%JZ'
order by NAME DESC
-- you can indicate whether to save the block in buffer cache
select /* CACHE .
select /* NOCACHE .
-- Index Unique Scan Hints
-- Index Unique Scan as access path is auto used by the optimizer
-- you can define the hint to use the index though:
select /* INDEX(table_alias index_name) */ ...
select /*+ INDEX(e1 emp_emp_id_pk) .. */ from employees e1, ..
SELECT /*+ index(t1 t1_abc) index(t2 t2_abc) */ COUNT(*)
FROM t1, t2
WHERE t1.col1 = t2.col1;
Page 355 Oracle DBA Code Examples
-- Index Range Scan Hints
-- to instruct the optimizer to use a specific index (to avoid fts):
select /* INDEX(table_alias index_name) */ ...
select /*+ INDEX(e1 emp_emp_id_pk) .. */ from employees e1, ..
-- Index Range Scan Descending Hints
-- use it when an order by descending clause can be satisfied by an index
select /*+ INDEX_DESC(t indexC) */
* from try t where C < sysdate order by C desc
-- exclude the index range scan access path
SELECT /*+ NO_INDEX_RS(e emp_name_ix) */ last_name
FROM employees e
WHERE first_name BETWEEN 'A' AND 'B';
-- Fast Full Index Scan Hints
select /*+ INDEX_FFS(t indexb) */
b
from try t
where t.b='b'
select /*+ index_ffs_asc(n i1) */
name
from names2 n
order by name
SELECT /*+ NO_INDEX_FFS(i pk_serv_inst) NO_INDEX_FFS(i ix_serv_inst) */
latitude
FROM servers s, serv_inst i
WHERE s.srvr_id = i.srvr_id;
-- Index Join Hints
SELECT /*+ INDEX_JOIN(e emp_manager_ix emp_department_ix) */ department_id
FROM employees e
WHERE manager_id < 110
AND department_id < 50;
-- Bitmap Index
-- bitmap indexes should be there
SELECT /*+ INDEX_COMBINE(e emp_manager_ix emp_department_ix) */ *
FROM employees e
WHERE (manager_id = 108) OR (department_id = 110);
-- Cluster
CREATE CLUSTER sc_srvr_id (
srvr_id NUMBER(10)) SIZE 1024;
Page 356 Oracle DBA Code Examples
CREATE INDEX idx_sc_srvr_id ON CLUSTER sc_srvr_id;
CREATE TABLE cservers
CLUSTER sc_srvr_id (srvr_id) AS SELECT * FROM servers;
CREATE TABLE cserv_inst
CLUSTER sc_srvr_id (srvr_id) AS SELECT * FROM serv_inst;
SELECT /*+ CLUSTER(cservers) */ srvr_id
FROM cservers
WHERE srvr_id = 503
GROUP BY srvr_id;
-- Hash
CREATE CLUSTER sthc_si (srvr_id NUMBER(10))
SIZE 1024 SINGLE TABLE HASHKEYS 11
TABLESPACE uwdata;
CREATE TABLE si_hash
CLUSTER sthc_si (srvr_id) AS
SELECT *
FROM serv_inst;
SELECT /*+ HASH(si_hash) */ srvr_id
FROM si_hash
WHERE srvr_id = 503
GROUP BY srvr_id;
-- Sample data
-- SAMPLE (1) : read 1% of rows
-- SAMPLE BLOCK (1) : read 1% of blocks
SELECT * FROM employees SAMPLE BLOCK (1);
/* Join Operations Hints */
-- Nested Loops
select /*+ use_nl(e d) use_nl(e j) */ -- or No_use_nl
employee_id , department_name, salary, j.job_title
from employees e , departments d, jobs j
where e.department_id = d.department_id
and e.job_id = j.job_id
and d.department_id>10
/
-- Hash Join
SELECT /*+ USE_HASH(o l) */
o.customer_id, l.unit_price * l.quantity
FROM orders o ,order_items l
WHERE l.order_id = o.order_id;
Page 357 Oracle DBA Code Examples
-- Sort Merge
select /*+ use_merge(e g) */
employee_id , last_name, grade
from employees e, grades g
where e.salary between g.ssal and g.esal;
-- Full Outer Join
SELECT d.department_id, e.employee_id
FROM employees e
FULL OUTER JOIN departments d
ON e.department_id = d.department_id
ORDER BY d.department_id;
Gat her i ng Opt i mi zer St at i st i cs
Gat her i ng Obj ect St at i st i cs
See Collect ing Obj ect St at ist ics. Preferences can be set . See next sect ion.
Collect ing Dict ionary Obj ect St at s, see below. Recommended every week in off beak
t imes. I t may t ake considerable t ime ( hours) .
/* Retreive Gathered Stats */
-- table stats
select OWNER, TABLE_NAME, PARTITION_NAME, PARTITION_POSITION,
SUBPARTITION_NAME, SUBPARTITION_POSITION, OBJECT_TYPE, NUM_ROWS, BLOCKS,
EMPTY_BLOCKS, AVG_SPACE, CHAIN_CNT, AVG_ROW_LEN, AVG_SPACE_FREELIST_BLOCKS,
NUM_FREELIST_BLOCKS, AVG_CACHED_BLOCKS, AVG_CACHE_HIT_RATIO, SAMPLE_SIZE,
LAST_ANALYZED, GLOBAL_STATS, USER_STATS, STATTYPE_LOCKED, STALE_STATS
from DBA_TAB_STATISTICS
where owner not in
('SYS','SYSTEM','DBSNMP','SYSMAN','OUTLN','TSMSYS','WMSYS','EXFSYS','CTXSYS','
XDB','ORDSYS','MDSYS','OLAPSYS','WKSYS','WK_TEST','IX')
and owner NOT LIKE 'FLOWS_%'
order by OWNER, LAST_ANALYZED DESC;
-- col stats
select OWNER, TABLE_NAME, COLUMN_NAME, NUM_DISTINCT, LOW_VALUE, HIGH_VALUE,
DENSITY, NUM_NULLS, NUM_BUCKETS, LAST_ANALYZED, SAMPLE_SIZE, GLOBAL_STATS,
USER_STATS, AVG_COL_LEN, HISTOGRAM
from DBA_TAB_COL_STATISTICS
where owner not in
('SYS','SYSTEM','DBSNMP','SYSMAN','OUTLN','TSMSYS','WMSYS','EXFSYS','CTXSYS','
XDB','ORDSYS','MDSYS','OLAPSYS','WKSYS','WK_TEST','IX')
and owner NOT LIKE 'FLOWS_%'
order by OWNER, LAST_ANALYZED DESC;
/* Collecting data dicionary stats */
-- for fixed tables
conn / as sysdba
EXECUTE DBMS_STATS.GATHER_FIXED_OBJECTS_STATS
-- for real dictionary tables:
-- SYS and SYSTEM users as well as the owners of all database components
Page 358 Oracle DBA Code Examples
conn / as sysdba
-- it may take hours to finish
EXECUTE DBMS_STATS.GATHER_DICTIONARY_STATS
Gat her i ng Sy st em St at i st i cs
Gat hering mode cont rolled by GATHERI NG_MODE paramet er:
o No- Workload Mode: implement ed by passed NOWORKLOAD. I t gat hers general I / O
st at s.
o Workload Mode: START will manually st art t he gat hering. STOP will manually st ops it .
I NTERVAL gat hering is cont rolled by I NTERVAL paramet er.
See Managing OS st at ist ics.
-- start gathering
EXECUTE dbms_stats.gather_system_stats('start');
-- stop gathering and save the stats
EXECUTE dbms_stats.gather_system_stats('stop');
-- for three minutes interval
EXECUTE dbms_stats.gather_system_stats('INTERVAL',3);
-- view gathered stats
SELECT
SNAME,
PNAME,
decode(PNAME,
'IOTFRSPEED','I/O transfer Speed (B/ms)',
'IOSEEKTIM','Seek+Latency+OS Overhead Time (ms)',
'SREADTIM','Single-Block Read Average Time (ms)',
'MREADTIM','MBRC Block Sequential Average Read Time (ms)',
'CPUSPEED','Average Number of CPU Cycles Captured for the Workload',
'CPUSPEEDNW','Average Number of CPU Cycles Captured for the Non-Workload',
'MBR','Average Multiblock Read Count for Sequential read (in Blocks)',
'MAXTHR','Maximum I/O System Throughput (B/s)',
'SLAVETHR','Average Slave I/O Throughput (B/s)',
PNAME) Description,
PVAL1,
PVAL2
FROM sys.aux_stats$;
Changi ng St at i st i cs Pr ef er ences
The f unct ion DBMS_STATS. GET_PARAM is used t o in Oracle 10g t o ret urn t he def ault values of paramet ers of
t he DBMS_STATS package. This f unct ion is now obsolet e in Oracle 11g and replaced wit h GET_PREFS
procedure. Following is an example:
SET SERVEROUTPUT ON
declare
v_value varchar2(100);
begin
v_value := DBMS_STATS.GET_PREFS (
PNAME =>'STALE_PERCENT',
Page 359 Oracle DBA Code Examples
OWNNAME =>'HR',
TABNAME =>'EMPLOYEES');
DBMS_OUPTPUT.PUT_LINE(v_value);
end;
Regarding t he GET_PREFS f unct ion, consider t he f ollowing:
PNAME paramet er indi cat es t he pref erence name and can t ake one of t he f ollowing values:
CASCADE, DEGREE, ESTIMATE_PERCENT, METHOD_OPT, NO_INVALIDATE, GRANULARITY, PUBLISH,
INCREMENTAL and STALE_PERCENT.
I f t he OWNNAME and TABNAME are provided and a pref erence has been ent ered f or t he t able, t he
f unct ion ret urns t he pref erence as specif ied f or t he t able. I n all ot her cases it ret urns t he global
pref erence if it has been specif ied, ot herwise t he def ault value is ret urned.
SET_GLOBAL_PREFS, SET_DATABASE_PREFS, SET_SCHEMA_PREFS, SET_TABLE_PREFS procedures are used
t o set t he st at ist ics pref erences f or t he global, dat abase, schema or t able levels respect ively. Following i s
an example:
begin
DBMS_STATS.SET_GLOBAL_PREFS ( PNAME =>'ESTIMATE_PERCENT', PVALUE =>'75');
end;
Similarly, t he procedures DELETE_*_PREFS are used t o delet e current st at ist ics pref erences.
EXPORT_*_PREFS and IMPORT_*_PREFS procedures are used t o export and import st at ist i cs pref erences.
Following is an example:
begin
DBMS_STATS.EXPORT_DATABASE_PREFS(
STATTAB =>'mytable', -- table name to where statistics should be exported
STATID =>'prod_prefs', -- identifier to associate with these statistics
STATOWN =>'HR'); -- Schema containing stattab (if other than ownname)
end;
Managi ng Pendi ng and Publ i shed St at i st i cs
St art ing wit h Oracle 11g, when gat hering st at ist ics, you have t he opt ion t o aut omat ically publish t he
st at ist ics at t he end of t he gat her operat ion ( def ault behavior) , or t o have t he new st at ist ics saved as
pending. Saving t he new st at ist ics as pending allows you t o validat e t he new st at ist ics and publish t hem
only if t hey are sat isf act ory.
You can check whet her or not t he st at ist ics will be aut omat ically published checking t he value of t he
PUBLISH at t ribut e using t he DBMS_STATS package as in t he f ollowing example:
SELECT DBMS_STATS.GET_PREFS('PUBLISH') PUBLISH FROM DUAL;
You can change t he PUBLISH set t ing at eit her t he schema or t able level. Following are examples t o do so:
-- setting PUBLISH at schema level
exec DBMS_STATS.SET_SCHEMA_PREFS('HR', 'PUBLISH', 'FALSE');
-- setting PUBLISH at table level
exec DBMS_STATS.SET_TABLE_PREFS('HR','EMPLOYEES', 'PUBLISH', 'FALSE');
Published st at ist ics are st ored in dat a dict ionary views, such as DBA_TAB_STATISTICS and USER_IND_
STATISTICS. Pending st at ist ics are st ored in views such as DBA_TAB_PENDING_STATISTICS and
DBA_IND_PENDING_STATISTICS.
select NUM_ROWS, BLOCKS, AVG_ROW_LEN, SAMPLE_SIZE, LAST_ANALYZED
from DBA_TAB_PENDING_STATISTICS where OWNER='HR' AND TABLE_NAME ='EMPLOYEES';
By def ault , t he opt imizer uses t he published st at ist ics st ored in t he dat a dict ionary views. I f you want t he
opt imizer t o use t he newly collect ed pending st at ist ics, set t he init ializat i on paramet er
Page 360 Oracle DBA Code Examples
OPTIMIZER_PENDING_STATISTICS t o TRUE ( t he def ault value is FALSE) , and t hen run a workload against
t he t able or schema or j ust gat her it s st at i st ics:
ALTER SESSION SET OPTIMIZER_PENDING_STATISTICS = TRUE;
The opt imizer will use t he pending st at ist ics ( if available) inst ead of t he published st at ist ics when
compiling SQL st at ement s. I f t he pending st at ist ics are valid, t hey can be made public by execut ing t he
f ollowing st at ement :
-- for the whole database
exec DBMS_STATS.PUBLISH_PENDING_STATS(null, null);
-- publishing specific database object pending statistics
exec DBMS_STATS.PUBLISH_PENDING_STATS('HR','EMPLOYEES');
I f you do not want t o publish t he pending st at ist ics, delet e t hem by execut ing t he f ollowing st at ement :
exec DBMS_STATS.DELETE_PENDING_STATS('HR','EMPLOYEES');
Managi ng Ex t ended St at i st i cs
Mul t i Col umn St at i st i cs
When mult iple columns f rom a single t able are used t oget her in t he where clause of a query ( mult iple
single column predicat es) , Oracle opt imizer in previous versions ( bef ore 11g) does not underst and t he
relat ionship bet ween t he columns. I n Oracle 11g, st at ist ics on t hese columns as a group ( column group)
can be gat hered and t hus result ing in high enhancement in CBO cardinalit y est imat ion.
You can also creat e column groups manually by using t he CREATE_EXTENDED_STATS f unct ion in t he
DBMS_STATS package. This f unct ion creat es a column st at ist ics ent ry in t he syst em f or a user specif ied
column group or an expression in a t able. This f unct ion ret urns a syst em- generat ed name of t his newly
creat ed ent ry f or t he ext ension.
Not e: The opt imizer will only use Mult iColumn st at ist ics wit h equalit y predicat es.
Following is an example:
declare
V_NAME VARCHAR2(30);
begin
-- stats of the combined columns will be collected next time the stats is gathered
V_NAME := DBMS_STATS.CREATE_EXTENDED_STATS(
OWNNAME => NULL,
TABNAME => 'EMPLOYEES',
EXTENSION => '(STATE_ID,COUNTRY_ID)');
-- you can then issue the gathering process
DBMS_STATS.GATHER_TABLE_STATS (NULL, 'EMPLOYEES', METHOD_OPT='for all columns size
skewonly' );
end;
The DBMS_STATS.GATHER_TABLE_STATS procedure can also be used t o creat e column group and gat her it s
st at ist ics all in one st ep. The keyword FOR COLUMNS is used in t his case as shown in t he f ollowing
example:
begin
DBMS_STATS.GATHER_TABLE_STATS ('HR', 'EMPLOYEES',
METHOD_OPT=>'for all columns size skewonly for columns (STATE_ID,COUNTRY_ID)' );
end;
Page 361 Oracle DBA Code Examples
Not e The def ault value of METHOD_OPT is ' FOR ALL COLUMNS SIZE AUTO' which makes Oracle creat e
column groups f or a t able, based on t he workload analysis, similar t o how it is done f or
hist ograms.
You can use t he met hods in t he f ollowing code examples t o ret rieve inf ormat ion on column groups t hat
have been creat ed:
-- you can query the data dictionary USER_STAT_EXTENSIONS
select EXTENSION_NAME, EXTENSION from USER_STAT_EXTENSIONS where TABLE_NAME='EMPLOYEES';
-- you can query USER_TAB_COL_STATISTICS (extension name appears as COLUMN_NAME)
select COLUMN_NAME, NUM_DISTINCT, HISTOGRAM
from USER_TAB_COL_STATISTICS where TABLE_NAME = 'EMPLOYEES';
-- you can use DBMS_STATS.SHOW_EXTENDED_STATS_NAME function
select DBMS_STATS.SHOW_EXTENDED_STATS_NAME(OWNNAME => 'HR',
TABNAME => 'EMPLOYEES',
EXTENSION => 'STATE_ID,COUNTRY_ID') AS E_NAME
from dual;
Af t er gat hering t he mult i- column st at ist ics as show in t he example, when you check t he explain plan f or a
query of a where condit ion like "STATE_ID = 'CA' AND COUNTRY_ID = 'US'", you will not ice t hat t he
opt imizer has ret rieved t he correct number of expect ed ret rieved rows. Pract ically, t his will lead t o a
signif icant improvement in t he st at ement execut ion.
Following is how t o drop a column group t hat you have previously def ined:
exec DBMS_STATS.DROP_EXTENDED_STATS('HR', 'EMPLOYEES', '(STATE_ID,COUNTRY_ID)');
Ex pr essi on St at i st i cs
I n Oracle 11g, you can creat e st at ist ics on an expression. Following are examples t o do t hat :
declare
V_NAME VARCHAR2(30);
begin
-- to create expression extended stats (not statistics are yet gathered)
V_NAME := DBMS_STATS.CREATE_EXTENDED_STATS(
OWNNAME => NULL,
TABNAME => 'EMPLOYEES',
EXTENSION => '(lower(last_name))');
end;
begin
-- to create expression extended stats and gather the statistics in one step
DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=>NULL,TABLE_NAME=>'EMPLOYEES',
METHOD_OPT=>'for all columns size skewonly for columns (lower(last_name))');
end;
Af t er execut ing t he code above, if you issue a query f rom EMPLOYEES t able wit h a condit ion like
LOWER(LAST_NAME)='ABC', t he opt imizer has st at ist ics about t he ret rieved rows and t hus will be able t o
est imat e t he correct number of ret urned rows. Consequent ly, t he opt imizer will most likely creat e a more
ef f icient plan t han if t hose st at ist ics were not present .
Use t he DBA_STAT_EXTENSIONS dat a dict ionary view t o ret rieve inf ormat ion on expression st at ist ics t hat
have been creat ed in t he dat abase.
select EXTENSION_NAME, EXTENSION from USER_STAT_EXTENSIONS where TABLE_NAME='EMPLOYEES';
Following is an example of t he removal of an ext ended expression st at ist ic:
exec DBMS_STATS.DROP_EXTENDED_STATS(null, 'EMPLOYEES', '(lower(lat_name))' );
Not e t hat you will not be able t o drop an ext ended expression st at ist ics, if a f unct ion- based index is
dependent on t hat st at ist ic ( ORA- 20000 error will be ret urned) .
Page 362 Oracle DBA Code Examples
A Si mpl e Appr oach t o Tu ni ng SQL St at emen t s
I dent ify Problem St at ement s
o Using V$SQL or SQL Tracing
o AWR report and t he ADDM analysis
Locat e t he Source of t he I nefficiency
o Show t he EXPLAI N PLAN of t he st at ement
o Use t he SQL Access Advisor and SQL Tunining Advisor
Page 363 Oracle DBA Code Examples
Usi ng Appl i cat i on Tr aci ng Tool s
Usi ng t he SQL Tr ace Faci l i t y and TKPROF
1. Set init parameters for trace file management.
They are all system and session level
STATISTICS_LEVEL = Typical or ALL
Even if STATISTICS_LEVEL is set to TYPICAL or ALL, you can keep the database
from tracing by
using:
ALTER SESSION statement to set TIMED_STATISTICS to FALSE.
show parameter USER_DUMP_DEST
show parameter MAX_DUMP_FILE_SIZE
2. Enable the SQL Trace facility for the desired session.
-- current session
ALTER SESSION SET sql_trace=true;
begin
sys.dbms_session.set_sql_trace(true);
end;
/
-- specific session
exec DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(SID=>123, SERIAL#=>567, SQL_TRACE=>
true);
exec DBMS_MONITOR.SESSION_TRACE_ENABLE(session_id => 27, serial_num => 60,
waits => TRUE, binds => FALSE);
3. Run TKPROF to translate the trace file into a readable output file and
optionally create a SQL script that can be used to store the statistics in a
database.
tkprof finance_ora_16340.trc test.txt sys=no explain=y AGGREGATE =yes|no WAITS
=yes|no
4. Interpret the output file.
Row Source Operations
cr specifies consistent reads performed by the row source
specifies physical reads performed by the row source
w specifies physical writes performed by the row source
time specifies time in microseconds
Usi ng t he Event 10046 t o Tr ace SQL Code
This met hod is more advanced t han t he SQL Trace ut ilit y.
ALTER SESSION SET EVENT '10046 trace name context forever level 12';
ALTER SESSION SET EVENT=10046 trace name context off;
-- not recommended
Page 364 Oracle DBA Code Examples
ALTER SYSTEM SET EVENT=10046 trace name context forever, level 4
SCOPE=spfile;
ALTER SYSTEM SET EVENT= SCOPE=spfile;
-- Setting the 10046 Event For a Session Other than Your Own
-- Method 1
-- SPID known (OR next)
oradebug setospid 1864;
-- PID known
oradebug setpid 21;
-- then
oradebug event 10046 trace name context forever, level 12
oradebug event 10046 trace name context off
-- Method 2
Dbms_system.set_ev (
si binary_integer, -- SID
se binary_integer, -- Serial#
ev binary_integer, -- Event code or number to set.
le binary_integer, -- Usually level to trace
cm binary_integer -- When to trigger (NULL = context forever.)
Tr aci ng End t o End Appl i cat i on
/* To specify module and action names */
exec
DBMS_APPLICATION_INFO.SET_MODULE(MODULE_NAME=>'FINANCIAL',ACTION_NAME=>'PAYROL
L');
exec DBMS_APPLICATION_INFO.SET_ACTION(ACTION_NAME=>'PAY SLIP');
/* To add your own marker to the trace file names */
-- so you can more easily find the generated files.
ALTER SESSION SET TRACEFILE_IDENTIFIER ="fin_payrol";
/* Enabling Collection of Client and Service Statistics */
For client-Level Statistics use:
DBMS_MONITOR.CLIENT_ID_STAT_ENABLE(<client_id>)
For Service-Level Statistics:
SELECT NAME FROM V$ACTIVE_SERVICES ;
select service_name from v$session where username='HR';
-- service name case sensitive
DBMS_MONITOR.SERV_MOD_ACT_TRACE_ENABLE(<service_name>,<module_name>,
<action_name>)
For example:
DBMS_MONITOR.SERV_MOD_ACT_TRACE_ENABLE( service_name=>'APPS1',module_name
=>'PAYROLL')
To enable tracing for a Service named APPS1:
Page 365 Oracle DBA Code Examples
DBMS_MONITOR.SERV_MOD_ACT_TRACE_ENABLE('APPS1',DBMS_MONITOR.ALL_MODULES,
DBMS_MONITOR.ALL_ACTIONS,TRUE,FALSE,NULL)
To enable tracing for a session:
DBMS_MONITOR.SESSION_TRACE_ENABLE (SESSION_ID=>139, SERIAL_NUM=>53,
WAITS=>TRUE, BINDS=>FALSE);
To enable trace in the whole database
DBMS_MONITOR.DATABASE_TRACE_ENABLE
To enable trace in the instance level
DBMS_MONITOR.DATABASE_TRACE_ENABLE (INSTANCE_NAME=>'RAC1')
To disable tracing:
DBMS_MONITOR.CLIENT_ID_STAT_DISABLE(<Client_id>)
DBMS_MONITOR.SERV_MOD_ACT_TRACE_DISABLE('APPS1')
DBMS_MONITOR.DATABASE_TRACE_DISABLE(INSTANCE_NAME=>'RAC1')
/* Using the TRCSESS Tool to Analyze Trace Files */
show parameter USER_DUMP_DEST
trcsess output="hr_report.trc" service="APPS1" module="PAYROLL" action="bulk
load"
You can then run TKPROF against the consolidated trace file to generate a
report:
tkprof hr_report.trc output=hr_trc_report sys=np SORT=(EXEELA, PRSELA, FCHELA)
Enabl i ng and Di sabl i ng St at i st i c Gat her i ng f or End t o End Tr aci ng
-- first make sure the trcing is enabled, see sections above.
-- Statistic Gathering for Client Identifier
select CLIENT_IDENTIFIER from V$SESSION where username='SA';
EXECUTE DBMS_MONITOR.CLIENT_ID_STAT_ENABLE(client_id => 'OE.OE');
EXECUTE DBMS_MONITOR.CLIENT_ID_STAT_DISABLE(client_id => 'OE.OE');
-- Statistic Gathering for Service, Module, and Action
EXECUTE DBMS_MONITOR.SERV_MOD_ACT_STAT_ENABLE(service_name => 'ACCTG',
module_name => 'PAYROLL');
EXECUTE DBMS_MONITOR.SERV_MOD_ACT_STAT_ENABLE(service_name => 'ACCTG',
module_name => 'GLEDGER', action_name => 'INSERT ITEM');
EXECUTE DBMS_MONITOR.SERV_MOD_ACT_STAT_DISABLE(service_name => 'ACCTG',
module_name => 'GLEDGER', action_name => 'INSERT ITEM');
/* Viewing the New Statistics */
DBA_ENABLED_AGGREGATIONS enabled statistics aggregation
DBA_ENABLED_TRACES enabled traces in the system
V$CLIENT_STATS statistics on a client level (CLIENT_IDENTIFIER based)
V$SERVICE_STATS Displays basic performance statistics
V$SERV_MOD_ACT_STATS statistics for a combination of serve /module/action
Page 366 Oracle DBA Code Examples
names.
Page 367 Oracle DBA Code Examples
Wr i t i ng Ef f i ci en t SQL
Efficient WHERE Clauses
o Select wit h high select ivit y get s advant age from index. FTS performs bet t er wit h low
select ivit y queries.
o Whe using SQL funct ions, consider using funct ion-based indexes.
Using t he Right Joins
o Performing filt ering operat ions early reduces t he number of rows t o be j oined in lat er
st eps.
o Always consider usinj g t he equi j oin.
o Join in t he order t hat will produce t he least number of rows as out put t o t he parent st ep.
Combine Mult iples Scans wit h CASE St at ement s
o When you need t o calculat e mult iple aggregat es from t he same t able, avoid writ ing a
separat e query for each aggregat e. Use CASE st at ement inst ead.
-- the following selects:
SELECT COUNT (*)
FROM employees
WHERE salary < 2000;
SELECT COUNT (*)
FROM employees
WHERE salary BETWEEN 2000 AND 4000;
SELECT COUNT (*)
FROM employees
WHERE salary>4000;
-- can be re written as:
SELECT COUNT (CASE WHEN salary < 2000 THEN 1 ELSE null END) count1,
COUNT (CASE WHEN salary BETWEEN 2001 AND 4000 THEN 1 ELSE null END) count2,
COUNT (CASE WHEN salary > 4000 THEN 1 ELSE null END) count3
FROM employees;
Efficient Subquery Execut ion
o Oracle recommends using t he I N clause if t he subquery has t he select ive WHERE clause.
o I f t he parent query cont ains t he select ive WHERE clause, use t he EXI STS clause rat her
t han t he I N clause.
-- the follwoing (selective predicate in the sub query)
WHERE EXISTS (SELECT 1 FROM orders o
WHERE e.employee_id = o.sales_rep_id
AND o.customer_id = 144);
-- can be converted into:
WHERE e.employee_id IN (SELECT o.sales_rep_id
FROM orders o
WHERE o.customer_id = 144);
-- in the following (selective predicate in the parent query):
WHERE e.department_id = 80
AND e.job_id = 'SA_REP'
AND e.employee_id IN (SELECT o.sales_rep_id FROM orders o);
-- can be rewritten as:
WHERE e.department_id = 80
Page 368 Oracle DBA Code Examples
AND e.job_id = 'SA_REP'
AND EXISTS (SELECT 1 FROM orders o WHERE e.employee_id = o.sales_rep_id)
Avoid Transformed Columns in t he WHERE Clause such as: charcol = numexpr, col1 = NVL
( : b1,col1) , NVL (col1, - 999) = . , TO_DATE( ), TO_NUMBER( ) , and so on.
Add t he predicat e versus using NVL( ) t echnique.
SELECT employee_num, full_name Name, employee_id
FROM mtl_employees_current_view
WHERE (employee_num = NVL (:b1,employee_num)) AND (organization_id=:1)
ORDER BY employee_num;
Writ e Separat e SQL St at ement s for Specific Tasks: make a very complex st at ement slight ly
less complex by using t he UNI ON ALL operat or or use PL/ SQL blocks, if possible.
-- this code won't use the index bcz somecol in both sides
..
WHERE ...
AND somecolumn BETWEEN DECODE(:loval, 'ALL', somecolumn, :loval)
AND DECODE(:hival, 'ALL', somecolumn, :hival);
-- it can be rewritten as
..
WHERE ...
AND somecolumn BETWEEN :loval AND :hival
AND (:hival != 'ALL' AND :loval != 'ALL')
UNION ALL
..
WHERE ...
AND (:hival = 'ALL' OR :loval = 'ALL');
I f possible, define t he Join Order using ORDERED or STAR hint s. Table wit h t he lowest
percent age of ret ireved compared t o it s t olad it candidat e t o be t he driving t able.
-- in this example, a is the driving table.
SELECT info
FROM taba a, tabb b, tabc c
WHERE a.acol BETWEEN 100 AND 200
AND b.bcol BETWEEN 10000 AND 20000
AND c.ccol BETWEEN 10000 AND 20000
AND a.key1 = b.key1
AND a.key2 = c.key2;
SELECT /*+ LEADING(e2 e1) USE_NL(e1) INDEX(e1 emp_emp_id_pk)
USE_MERGE(j) FULL(j) */
e1.first_name, e1.last_name, j.job_id, sum(e2.salary) total_sal
FROM employees e1, employees e2, job_history j
WHERE e1.employee_id = e2.manager_id
AND e1.employee_id = j.employee_id
AND e1.hire_date = j.start_date
GROUP BY e1.first_name, e1.last_name, j.job_id
ORDER BY total_sal;
Modifying or Disabling Triggers and Const raint s
Rest ruct uring t he Dat a: like using vit ual columns, adding new columns or using part it ions.
Maint aining Execut ion Plans Over Time: by using st ored st at ist ics or SQL plan baselines.
Use DML wit h RETURNI NG Clause: I NSERT, UPDATE, or DELETE.. . RETURNI NG modify and
t hen ret urn t he dat a in one call.
Page 369 Oracle DBA Code Examples
var bnd1 NUMBER
var bnd2 VARCHAR2(30)
var bnd3 NUMBER
UPDATE employees
SET job_id ='SA_MAN', salary = salary + 1000,
department_id = 140
WHERE last_name = 'Jones'
RETURNING salary*0.25, last_name, department_id
INTO :bnd1, :bnd2, :bnd3;
Consider using Test Case Builder.
Consider using Bit map Join I ndexes on a st ar model query.
Select ing t he Best Join Order: I f youre j oining t hree t ables, t he one wit h t he more
rest rict ive filt er ( driving t able) should be j oined first (aft er t he FROM keyword) t o one of t he
ot her t wo t ables.
-- this statement is less efficient than the following one
select /*+ ordered */
order_date, order_total, line_item_id id, product_name ,quantity,
quantity*unit_price item_tprice
from order_items i, PRODUCT_INFORMATION p, orders o
where
order_date between to_date('01-01-2010','dd-mm-yyyy') and to_date('31-03-
2010','dd-mm-yyyy') and
o.order_id=i.order_id and
i.product_id=p.product_id;
-- more efficient
select /*+ ordered */
order_date, order_total, line_item_id id, product_name ,quantity,
quantity*unit_price item_tprice
from orders o, order_items i, PRODUCT_INFORMATION p
where
order_date between to_date('01-01-2010','dd-mm-yyyy') and to_date('31-03-
2010','dd-mm-yyyy') and
o.order_id=i.order_id and
i.product_id=p.product_id;
Page 370 Oracle DBA Code Examples
I mpr ov i ng SQL Pr ocessi ng Techni ques
Following are t he t ips t o improve SQL processing, even if you cannot change t he code:
Using Part it ioned Tables
Using Compression Techniques
CREATE INDEX item_product_x
ON order_items(product_id)
TABLESPACE order_items_indx_01
COMPRESS;
CREATE INDEX item_product_x
ON order_items(product_id)
TABLESPACE order_items_indx_01 COMPRESS;
Using Mat erialized Views
Using St ored Out lines t o St abilize t he CBO ( and SQL Plan Management in Oracle 11g) .
Using Parallel Execut ion
Page 371 Oracle DBA Code Examples
Usi ng SQL Tuni ng Adv i sor
The advisor possible input s are:
a single st at ement
SQL t uning set or STS
a SQL ident ifier from t he AWR
a SQL ident ifier from t he cursor cache
To manage t he Aut omat ic SQL Tuning Advisor, see Using Aut omat ic SQL Tuning Advisor.
-- required priv
grant advisor to youruser;
/* A single SQL Statement */
DECLARE
my_task_name VARCHAR2(30);
my_sqltext CLOB;
BEGIN
my_sqltext := 'SELECT /*+ ORDERED */ *
FROM employees e, locations l, departments d
WHERE e.department_id = d.department_id AND
l.location_id = d.location_id AND
e.employee_id < :bnd';
my_task_name := DBMS_SQLTUNE.CREATE_TUNING_TASK(
sql_text => my_sqltext,
bind_list => sql_binds(anydata.ConvertNumber(90)),
user_name => 'HR',
scope => 'COMPREHENSIVE',
time_limit => 60,
task_name => 'my_sql_tuning_task',
description => 'Task to tune a query on a specified employee');
END;
/
BEGIN
DBMS_SQLTUNE.EXECUTE_TUNING_TASK( task_name => 'my_sql_tuning_task' );
END;
/
SET LONG 1000
SET LONGCHUNKSIZE 1000
SET LINESIZE 100
SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK( 'my_sql_tuning_task') FROM DUAL;
-- you can query:
DBA_ADVISOR_TASKS
DBA_ADVISOR_FINDINGS
DBA_ADVISOR_RECOMMENDATIONS
DBA_ADVISOR_RATIONALE
DBA_SQLTUNE_STATISTICS
DBA_SQLTUNE_PLANS
Page 372 Oracle DBA Code Examples
Page 373 Oracle DBA Code Examples
Par t 6 Or acl e Aut omat i c St or age
Management ( ASM)
Page 374 Oracle DBA Code Examples
Managi ng Or acl e ASM
Obt ai ni ng I nf or mat i on about ASM I nst ance
-- asm: all diskgroups mounted db: diskgroups mounted in asm and connected
to by db
select * from V$ASM_DISKGROUP;
-- asm: dbs connected to the asm db: asms connected by db
select * from V$ASM_CLIENT;
-- asm: discovered disks db: disks used by db
select * from V$ASM_DISK;
-- asm files
select * from V$ASM_FILE;
-- info about asm templates
select * from V$ASM_TEMPLATE;
Cr eat i ng an ASM I nst ance
-- required services
<orahome>\bin\localconfig add
-- Creating the ASM Instance Manually (on Windows XP)
1. Building the ASM Candidate "disks": for testing or development purpose
mkdir c:\asmdisks
ASMTOOL -create c:\asmdisks\asmdiska1 150
-- you can use DBCA and avoid 2,3,4
2. Create a pfile with the name "init+ASM.ora" in the folder
<ORACLE_HOME>\database.
Insert the following parameters in the file:
INSTANCE_TYPE=ASM
_ASM_ALLOW_ONLY_RAW_DISKS = FALSE
DB_UNIQUE_NAME = +ASM
ASM_DISKSTRING ='C:\asmdisks\*'
LARGE_POOL_SIZE = 16M
3. Create the ASM instance service:
ORADIM -NEW -ASMSID +ASM -STARTMODE auto
4. Startup the instance
SET ORACLE_SID=+ASM
SQLPLUS / AS SYSDBA
SQL> STARTUP FORCE
SQL> SELECT PATH, MOUNT_STATUS FROM V$ASM_DISK;
SELECT instance_name FROM v$instance;
LSNRCTL STATUS
Page 375 Oracle DBA Code Examples
-- starting ASM in restricted mode: DB cannot access it (11g)
-- in the ASM instance level
SQL>STARTUP RESTRICT;
-- in the diskgroup level
SQL>ALTER DISKGROUP DATA MOUNT RESTRICTED;
-- check status of diskgroups
SQL>SELECT NAME,STATE FROM V$ASM_DISKGROUP;
Managi ng Di sk Gr oups and Di sk s i n ASM
Fundement al s of Managi ng Di sk Gr oups and Di sk s
/* Basics */
SELECT PATH, MOUNT_STATUS FROM V$ASM_DISK;
SQL> STARTUP NOMOUNT
SQL>
CREATE DISKGROUP dgroup1 NORMAL REDUNDANCY
FAILGROUP controller1 DISK
'c:\asmdisks\asmdiska1' name firsta size 150M,
'c:\asmdisks\asmdiska2'
FAILGROUP controller2 DISK
'c:\asmdisks\asmdiskb1',
'c:\asmdisks\asmdiskb2'
/
in the pfile:
ASM_DISKGROUPS=dgroup1
SQL> select NAME, SECTOR_SIZE, BLOCK_SIZE, ALLOCATION_UNIT_SIZE,
STATE, TYPE, TOTAL_MB
from V$ASM_DISKGROUP
restart
-- rebalancing speed
show parameter ASM_POWER_LIMIT
ALTER DISKGROUP dgroup1 REBALANCE POWER 5;
-- adding extra disks
ASMTOOL -create c:\asmdisks\asmdiska3 150
ASMTOOL -create c:\asmdisks\asmdiskb3 150
SQL>
ALTER DISKGROUP dgroup1 ADD
FAILGROUP controller1 DISK 'c:\asmdisks\asmdiska3'
FAILGROUP controller2 DISK 'c:\asmdisks\asmdiskb3'
/
ALTER DISKGROUP dgroup1 REBALANCE POWER 10
/
Page 376 Oracle DBA Code Examples
/* Dropping a disk */
ALTER DISKGROUP group1 DROP DISK disk5;
-- to cancel a pending drop:
ALTER DISKGROUP group1 UNDROP DISKS;
/* Dropping a Diskgroup */
in Oracle 10g:
# the group must be mounted on exactly one node
# non-empty dgroup
DROP DISKGROUP DATA INCLUDING CONTENTS;
# empty dgroup
DROP DISKGROUP DATA;
# If the diskgroup could not be mounted and the disks
# were to be repurposed for non-ASM uses
use dd command in unix
# If the disks were to be repurposed as an ASM disk for a new diskgroup,
# then use the FORCE option in the CREATE DISKGROUP
in Oracle 11g:
# use FORCE if the group is not mounted (try mount it first)
DROP DISKGROUP DATA FORCE INCLUDING CONTENTS FORCE;
/* Checking Diskgroup */
-- 11g: you can validate the internal consistency of ASM diskgroup metadata.
Summary of errors is logged in the ASM alert log file.
-- check specific diskgroup with automatic repair
SQL>ALTER DISKGROUP data CHECK;
-- disable automatic repair
SQL>ALTER DISKGROUP data CHECK NOREPAIR;
SQL>ALTER DISKGROUP data CHECK REPAIR;
Managi ng Di sk Gr oups At t r i but es
Oracle Dat abase 11g int roduces a new concept called ASM at t ribut es at t he diskgroup level. The
at t ribut es f or t he diskgroup can be est ablished at creat e diskgroup t ime or can be modif ied using t he
ALTER DISKGROUP command lat er.
Following are t he at t ribut es you can set :
Allocat ion unit ( AU) sizes.
The compatible.rdbms at t ribut e.
The compatible.asm at t ribut e.
disk_repair_time in unit s of minut e ( M) or hour ( H) and is set by t he ALTER DISKGROUP command
The redundancy at t ribut e f or a specif ic t emplat e.
The st ripping at t ribut e f or a specif ic t emplat e.
All of t he diskgroup at t ribut es can be queried f rom t he V$ASM_ATTRIBUTE view.
Consider t he f ollowing examples:
CREATE DISKGROUP data
disk '/dev/raw/raw1',
...
attribute 'au_size' = '16M', 'compatible.asm' = '11.1';
ALTER DISKGROUP data SET ATTRIBUTE 'compatible.asm' = '11.1.0.0.0';
Page 377 Oracle DBA Code Examples
select NAME, VALUE from V$ASM_ATTRIBUTE where GROUP_NUMBER=1;
Var i abl e AU Si zes
The def ault size of Allocat ion Unit ( AU) is 1 MB which is suf f icient f or most regular dat abases. However,
when you have dat abases wit h TB sizes, you will have enormous number of AUs. Wit h Oracle 11g, AU
size can be specif ied at diskgroup creat ion t ime t o 1, 2, 4, 8, 16, 32, or 64MB in size. You can check t he
AU size t hrough t he f ollowing query:
select NAME, ALLOCATION_UNIT_SIZE from V$ASM_DISKGROUP;
Compat i bi l i t y Set t i n gs
Compat ibilit y in ASM is cont rolled in t hree ways, as shown below:
COMPATIBLE
init ializat ion
paramet er
The compat ible init ializat ion paramet er can be set f or eit her ASM or t he dat abase
inst ance. I t t akes one of t he f ollowing values: 10. 1, 10. 2, or 11. 1.
Set t ing t he init ializat ion paramet er t o a lesser value t han t he sof t ware release will
exclude availabilit y of t he new f eat ures int roduced in t he new release.
RDBMS
Compat ibilit y
This is a diskgroup- level compat ibilit y and is specif ied by set t ing t he
COMPATIBLE.RDBMS at t ribut e. This at t ribut e det ermines t he minimum COMPATIBLE
dat abase init ializat ion paramet er set t ing f or any dat abase inst ance t hat uses t he disk
group. I t s def ault value is 10. 1.
ASM
Compat ibilit y
This is a diskgroup- level compat ibilit y and is specif ied by set t ing t he COMPATIBLE.ASM
at t ribut e. I t det ermines t he minimum sof t ware version f or an ASM inst ance t hat uses
t he disk group.
I f you assign any of t he compat ibilit y set t ing t o a higher value, you cannot lat er reverse it t o a lower
value.
Following are some queries t o obt ain inf ormat ion about t he compat ibilit y set t ings:
-- diskgroup compatibility setting
select NAME, BLOCK_SIZE, ALLOCATION_UNIT_SIZE AU_SIZE, STATE,
COMPATIBILITY ASM_COMP, DATABASE_COMPATIBILITY DB_COMP
from V$ASM_DISKGROUP;
-- Compatibility of the database clients that use the ASM
select DB_NAME, STATUS,SOFTWARE_VERSION,COMPATIBLE_VERSION from V$ASM_CLIENT;
ASM Fast Mi r r or Resyn c
Any problems t hat make a f ailure group t emporarily unavailable are considered t ransient f ailures t hat can
be recovered by t he ASM f ast mirror resync f eat ure. Disk pat h malf unct ions; such as cable f ailures, host
bus adapt er f ailures, cont roller f ailures, or disk power supply int errupt ions; can cause t ransient f ailures.
ASM f ast resync keeps t rack of pending changes t o ext ent s on an OFFLINE disk during an out age. The
ext ent s are resynced when t he disk is brought back online.
Following are t he st eps t o enable and handle t his f eat ure:
-- diskgroup compatibility must be set to 11.1
ALTER DISKGROUP dg1 SET ATTRIBUTE 'compatible.asm' = '11.1';
ALTER DISKGROUP dg1 SET ATTRIBUTE 'compatible.rdbms'='11.1';
-- specify the duration of the disk_repair_time (default is 3.6 hour)
ALTER DISKGROUP dg1 SET ATTRIBUTE 'disk_repair_time' = '5H'; -- in hours
ALTER DISKGROUP dg1 SET ATTRIBUTE 'disk_repair_time' = '40M'; -- minutes
-- verify the attribute settings
select NAME, VALUE from V$ASM_ATTRIBUTE;
-- if you get an offline disk because of a transient failure, you can see the
-- remaining time left in SECONDS before ASM drops an offline disk
select NAME, HEADER_STATUS, MOUNT_STATUS, MODE_STATUS, STATE, REPAIR_TIMER/60 from
V$ASM_DISK WHERE GROUP_NUMBER=1;
-- while the fix is in progress, if you want to reset the elapsed time, just take
Page 378 Oracle DBA Code Examples
-- the disk(s) offline
ALTER DISKGROUP dg1 OFFLINE DISK d3_0001;
ALTER DISKGROUP dg1 OFFLINE DISKS IN FAILGROUP f2;
-- you can also make a disk offline with a repair time different from its
-- disk_repair_time attribute
ALTER DISKGROUP dg1 OFFLINE DISK d3_0001 DROP AFTER 50m;
-- disks in a failure group (f2) can also be taken offline
ALTER DISKGROUP dg1 OFFLINE DISKS IN FAILGROUP f2 DROP AFTER 5m;
-- if the disk needs to be dropped immediately and before the repair time has expired
-- Note: ALTER DISKGROUP DROP DISK will not work
ALTER DISKGROUP dg1 OFFLINE DISK D3_0001 DROP AFTER 0m;
-- after the disk(s) are fixed, you can bring them online
ALTER DISKGROUP dg1 ONLINE ALL;
ALTER DISKGROUP dg1 ONLINE DISK d3_0001;
Moni t or i ng Long- Runni ng Oper at i ons
The ALTER DISKGROUP DROP, RESIZE, and REBALANCE commands ret urn bef ore t he operat ion is
complet e. To monit or progress of t hese long- runni ng operat ions, you can query t he V$ASM_OPERATION
f ixed view.
GROUP_NUMBER
Disk group
OPERATION
Type of operat ion: REBAL
STATE
St at e of operat ion: QUEUED or RUNNING
POWER
Power request ed f or t his operat ion
ACTUAL
Power allocat ed t o t hi s operat ion
SOFAR
Number of allocat ion unit s moved so f ar
EST_WORK
Est imat ed number of remaining allocat ion uni t s
EST_RATE
Est imat ed number of allocat ion unit s moved per minut e
EST_MINUTES
Est imat ed amount of t ime ( in minut es) f or operat ion t erminat ion
Page 379 Oracle DBA Code Examples
Mi gr at i ng a Dat abase t o ASM
You can use OEM or RMAN as follows:
1. Shut down t he dat abase in a consist ent mode by using t he SHUTDOWN I MMEDI ATE
command.
2. Add t he DB_CREATE_FI LE_DEST and DB_CREATE_ONLI NE_LOG_DEST_n paramet ers, as
well as t he new flash recovery area init ializat ion paramet ers, DB_RECOVERY_FI LE_DEST and
DB_ RECOVERY_FI LE_DEST_SI ZE, t o your dat abase paramet er file so you can use an OMF-
based file syst em. Make sure t hat t he t wo OMF paramet ers refer t o t he disk groups t hat you
want t o use in your ASM syst em.
DB_CREATE_FI LE_DEST = ' + dgroup1'
DB_RECOVERY_FI LE_DEST = ' + dgroup2'
3. Delet e t he cont rol file paramet er from t he SPFI LE, since Oracle will creat e new cont rol files
in t he OMF file dest inat ions by rest oring t hem from t he non- ASM dat abase cont rol files.
4. St art t he dat abase wit h t he STARTUP NOMOUNT command:
RMAN> CONNECT TARGET;
RMAN> STARTUP NOMOUNT;
5. Rest ore t he old cont rol file in t he new locat ion, as shown here:
RMAN> RESTORE CONTROLFI LE from ' / u01/ orcl/ oradat a/ cont rol1. ct l' ;
6. Mount t he dat abase:
RMAN> ALTER DATABASE MOUNT;
7. Use t he following command t o copy your dat abase files int o an ASM disk group:
RMAN> BACKUP AS COPY DATABASE FORMAT + dgroup1;
8. Use t he SWI TCH command t o swit ch all dat afiles int o t he ASM disk group:
RMAN> SWI TCH DATABASE TO COPY;
At t his point , all dat afiles will be convert ed t o t he ASM t ype. You st ill have your original
dat afile copies on disk, which you can use t o rest ore your dat abase if necessary.
9. Open t he dat abase wit h t he following command:
RMAN> ALTER DATABASE OPEN;
10. For each redo log member, use t he following command t o move it t o t he ASM syst em:
RMAN> SQL "alt er dat abase rename ' / u01/ t est / log1' t o ' + dgroup1' ";
11. Archive t he current online redo logs, and delet e t he old non- ASM redo logs. Since RMAN
doesnt migrat e t emp files, you must manually creat e a t emporary t ablespace using t he
CREATE TEMPORARY TABLESPACE st at ement or:
ALTER TABLESPACE TEMP ADD TEMPFI LE
ALTER DATABASE TEMPFI LE ' / u1/ t emp1' DROP
Movi ng a Tabl espace t o ASM
SQL>select name from v$datafile where ts# = (select x.ts# from v$tablespace x
where x.name='HRSTBS');
set oracle_sid=ora11g
Page 380 Oracle DBA Code Examples
rman target /
sql'alter tablespace hrstbs offline';
BACKUP AS COPY TABLESPACE hrstbs FORMAT '+dgroup1';
SWITCH TABLESPACE hrstbs TO COPY;
sql'alter tablespace hrstbs online';
Accessi ng an ASM i nst ance f r om DB Consol e
/* Method 1 */
drop and recreate the em repository:
emca -deconfig dbcontrol db -repos drop
emca -config dbcontrol db -repos create
/* Method 2 */
- Edit your listener.ora and add an entry for the ASM instance in the SID_LIST
(SID_DESC =
(GLOBAL_DBNAME = My_DB_SID)
(ORACLE_HOME=d:\oracle\product\10.2.0\db_2)
(SID_NAME = +ASM)
)
- Restart your listener
- Access DBConsole (e.g. with SYS as SYSDBA)
- In the "Administration" or "Server" tab, click on the link called "Migrate
to ASM"
- Fill in the required fields and press continue (it wont do anything yet.
Its just the first step, to get ASM listen as a new OEM target).
- If it ever complains about ORA-1017, you need to recreate the ASM instance
paswordfile. Take a backup of it first if you feel better so.
The syntax for recreating the passwordfile can be, for example:
orapwd file=D:\oracle\product\10.2.0\db_2\database\PWD+ASM.ora
password=my_password force=y
(of course, you must replace the password and the path with the one that
serves your needs)
The ASM target should have been created.
Now, you only need to: click on the "Database" link on the right top of the DB
Console window, or access the DB Console page again. You should see the ASM
target link below the listener target. You only need to click the link and
youll get the ASM home administration page, from DBConsole.
If ASM hyperlink is not directly shown in the main DBconsole page, you can
still click on the Host name link in the left of the DBConsole main page (just
over the listener name link), and once there, again click in the "Targets"
Page 381 Oracle DBA Code Examples
link, and lastly in the "+ASM_your_DB_hostname" link, which then will take you
to the ASM Administration main page.
You also have the option of directly typing the following URL, after the ASM
target is created:
http://your_DB_hostname:your_DBConsole_port/em/console/database/osm/osmSitemap
?type=osm_instance&target=%2BASM_your_DB_hostname&event=doLoad
Managi ng ASM Fi l es
Types of ASM Fi l enames
1. Ful l y Qual i f i ed ASM Fi l enames ( Syst em Al i as)
You use t his fully qualified name for referencing exist ing ASM files. Heres t he synt ax of an
ASM file using a fully qualified filename:
+group/dbname/file_type/tag.file.incarnation
2. Numer i c ASM Fi l enames
ASM derives numeric filenames from fully qualified ASM filenames and uses t hem t o refer t o
exist ing files.
+group.file.incarnation
3. Al i as ASM Fi l enames
You can use ASM alias files bot h when creat ing new ASM files and when referring t o exist ing
files. Alias ASM filenames mean t hat t he files are not OMF-managed files. Thus, Oracle wont
aut omat ically remove t hese files when it does not have any furt her need for t hem.
+dgroup1/myfiles/control_file1
+dgroup2/mydir/second.dbf
4. I ncompl et e ASM Fi l enames
You can use an incomplet e ASM filename only when creat ing files.
+dgroup1
+dgroup1(datafile)
Al i as Fi l ename Management
Cr eat i ng Di sk Gr oup Di r ect or i es f or Al i as Fi l enames
You must creat e a direct ory st ruct ure t o support your alias filenaming convent ions.
ALTER DISKGROUP dgroup1 ADD DIRECTORY '+dgroup1/mydir';
Usi ng Templ at es w i t h Al i ases
dgroup(template_name)/alias
+dgroup1(spfile)/config1
Addi ng Al i ases
You can add a filename alias or rename an exist ing alias name, using t he ADD ALIAS or
RENAME ALIAS clause of t he ALTER DISKGROUP st at ement .
ALTER DISKGROUP dgroup1 ADD ALIAS '+dgroup1/mydir/second.dbf' FOR
'+dgroupA/sample/datafile/mytable.342.3'
You can ret rieve creat ed aliases using v$ASM_ALIAS. The REFERENCE_INDEX column is usable
only for ent ries t hat are direct ory ent ries in t he alias direct ory. For non-direct ory ent ries, it
equals t o zero.
Dr oppi ng Fi l es and Al i ases f r om a Di sk Gr oup
ALTER DISKGROUP dgroup1 DROP FILE '+dgroup1/payroll/compensation.dbf'
Page 382 Oracle DBA Code Examples
Usi ng ASMCMD Ut i l i t y
set oracle_home=c:\oracle\oradb11g
set oracle_sid=+ASM
asmcmd
help
Oracle 11g int roduces new commands in t he asmcmd ut ilit y and it also provides backward compat ibilit y
wit h Oracle Dat abase 10g ASM inst ances. Following are summary of some of t hem:
Comman d Sy n t ax Descr i pt i on an d Ex ampl es
lsct [-gH] [group]
List s inf ormat i on about current ASM client s.
>lsct dgroup1
lsdg [-gcH] [group] list s all diskgroups and t heir at t ribut es.
>lsdg dgroup2
lsdsk [-ksptagcHI] [-d
diskg_roup_name] [pattern]
list s t he disks t hat are visible t o ASM by scanning t he disk
headers of t he disks seen by t he value of t he ASM_DISKSTRING
>lsdsk -k -d DATA *_001
>lsdsk -s -d DATA *_001
>lsdsk -t -d DATA *_001
>lsdsk -c -t -d DATA *_001
>lsdsk -g -t -d DATA *_001
cp [-ifr] [connect_string:]src_fname
[connect_string:]tgt_fname
cp [-ifr]
[connect_string:]src_fnameN,
src_fnameN+1 ...
[connect_string:]tgt_directory
The connect_string is in t he f orm of :
user_name@host_name[.port_number].SID
- i int eract ive
- f f orce overwrit e ( aliases cannot be
overwrit t en)
- r recursive
Enables you t o copy f iles bet ween ASM disk groups on local
inst ances t o and f rom remot e inst ances.
>cp +dg1/vdb.ctf1 /backups/vdb.ctf1
>cp /home/oracle/encrypted.dmp +dg1
>cp vdb.ctf1 /tmp
# the target ASM instance must be registered with the
LISTENER
>cp +DATA/DBA11g/DATAFILE/DOCS_D1.289.631914611
sys@rac1.+ASM:+DATA/DBA11g1/datafile/xxx
remap
Repairs a range of physical blocks on disk ( only blocks exhibit ing
read disk I / O error s are repaired) excluding t hose wit h corrupt ed
cont ent s.
I nt ernally, it reads t he blocks f rom a good copy of an ASM mirror
and rewrit es t hem t o an alt ernat e locat ion on disk, if t he blocks
on t he original locat i on cannot be properly read.
remap <disk group name> <disk name> <block range>
> remap DISK_GRP1 DATA_0001 5000-5999
Back i n g u p an d Rest or i n g Di sk gr ou p Met adat a
The md_backup command capt ures inf ormat ion about ASM disks, diskgroup and f ailure group
conf igurat ions, and t emplat e and alias direct ory st ruct ures, and st ores t hem in a user- designat ed backup
t ext f ile. Following is t he basic synt ax of t he command:
md_backup [-b <backup_file_path> ] [-g diskgroup_name [-g diskgroup_name ]]
Following is an example of using t he command:
md_backup b /tmp/asm_backup.mdb -g dg1 g dg2
I f t he backup f ile already exist s, you should remove it bef ore issuing t he command.
I f you issue t he md_backup command wit hout any opt ion, it creat es a f ile named as
ambr_backup_intermediate_file which cont ains t he met adat a inf ormat ion of all t he mount ed
diskgroups.
Page 383 Oracle DBA Code Examples
The md_restore command reads t he backup f ile and rest ores a disk group. You can set it s opt ions t o
build a script f ile t hat cont ains t he SQL st at ement s required t o rebuild t he ASM component s f rom t he
backup f ile. Following is t he synt ax of t he command and descript ion of it s swit ches:
md_restore -b <backup_file> [-li]
[-t (full)|nodg|newdg] [-f <sql_script_file>]
[-g '<diskgroup_name>,<diskgroup_name>,...']
[-o '<old_diskgroup_name>:<new_diskgroup_name>,...']
-t
t ype of rest ore.
full t ag specif ies t hat all t he diskgroups should be re- creat ed using t he same conf igurat ion f rom
t he MDB backup f ile.
nodg rest ore met adat a only and skip t he diskgroup creat ion.
newdg creat e disk group wit h a dif f erent name and rest ore met adat a; -o is required. This t ag is
used t o allow t he user t o change diskgroup name.
-f
writ e SQL commands t o <sql_script_file> inst ead of execut ing t hem.
-o
override opt ion is used only wit h t he newdg opt ion t o remap t he diskgroup name, disk name,
pat hs, and f ailure groups.
-i
ignore errors. By def ault , t he command abort s when it encount ers an error.
-l
log all messages t o a log f ile.
Following are examples of using t he command:
/* General Examples */
# To perform a restore of the dg1 diskgroup from the MDB backup file, use this:
md_restore b /tmp/backupfile t full g dg1 -i
# To just restore the metadata for the dg1 diskgroup (the diskgroup already
exists).
md_restore b /tmp/backupfile t nodg g dg1 i
# To create a different diskgroup name:
md_restore b /tmp/backupfile t newdg -o "DGNAME=dg1:dg3" i
# To apply the override options as specified in the dg_over.txt file and restore
# from the backup file:
md_restore b /tmp/backupfile t newdg of /tmp/dg_override.txt i
/* Scenario Example */
1. Back up a tablespace exising in a disk group:
RMAN> BACKUP TABLESPACE users;
2. Create a directory named test in the disk group DGROUPA. Also create an alias
called
+DGROUPA/test/users.f that points to the ASM datafile that contains the users
tablespace:
ASMCMD> mkdir +DGROUPA/test
ASMCMD> mkalias TBSSRA.123.123456789 +DGROUPA/test/users.f
3. Back up the metadata for the disk group DGROUPA using the md_backup command:
ASMCMD> md_backup g dgroupA
The md_backup command stores the backup metadata in the text file named
ambr_backup_
intermediate in the current directory.
4. Simulate a disk failure by dropping the disk group DGROUPA:
SQL> ALTER DISKGROUP dgroup1 DISMOUNT FORCE;
SQL> DROP DIKSGROUP dgroup1 FORCE INCLUDING CONTENTS;
Page 384 Oracle DBA Code Examples
The DISMOUNT FORCE clause in the ALTER DISKGROUP command dismounts the disk group
and
force drops it.
5. Execute the md_restore command to restore the ASM metadata for the dropped disk
group:
ASMCMD> md_restore b ambr_backup_intermediate_file
t full g data
6. Using the backup of the users tablespace from step 1, restore the users
tablespace:
RMAN>RESTORE TABLESAPCE users;
7. Exit from RMAN once the restore is completed.
Not e t hat md_backup is a backup of t he met adat a of t he ASM inst ance. The dat a is being backed up by
RMAN. Af t er t he diskgroup is creat ed, along wit h all t he direct ories, you can rest ore t he RMAN backup t o
t he diskgroup.
Bad Bl ock Recover y
I f ASM cannot read a physical block f rom a disk, it considers t hat t he block has I O error. I n t his case,
ASM will aut omat ically read a mirrored block and writ e a relocat ed copy t o produce successf ul copy.
However, you can manually repair blocks t hat have read disk I / O errors using t he remap command.
Following is t he synt ax of t he command:
remap <diskgroup name> <disk name> <block range>
Usi ng SYSASM Pr i vi l ege and OSASM Gr oup
This f eat ure int roduces a new SYSASM privilege t hat is specif ically int ended f or perf orming ASM
administ rat ion t asks. Using t he SYSASM privilege inst ead of t he SYSDBA privilege provides a clearer division
of responsibilit y bet ween ASM administ rat ion and dat abase administ rat ion.
Following are code examples illust rat ing how t o use t his privilege:
-- grant the privilege
GRANT SYSASM TO firas;
-- check the granted privilege
SELECT * FROM V$PWFILE_USERS;
-- ASM management commands are available to Adam
CONNECT firas/his_password
ALTER DISKGROUP dg1 DISMOUNT;
ALTER DISKGROUP dg2 MOUNT;
.. and so on.
Be aware t hat users wit h SYSOPER privilege have some ASM privileges. Following t able shows available
and rest rict ed ASM privilege f or users wit h SYSOPER privilege:
Av ai abl e ASM Pr i v i l ege Rest r i ct ed ASM Pr i v i l ege
STARTUP AND SHUTDOWN
ALTER DISKGROUP MOUNT
ALTER DISKGROUP DISMOUNT
ALTER DISKGROUP ONLINE DISK
ALTER DISKGROUP OFFLINE DISK
ALTER DISKGROUP REBALANCE
ALTER DISKGROUP CHECK
CREATE DISKGROUP / DISK
DROP DISKGROUPS / DISKS
ALTER DISKGROUP / DISK RESIZE
OSASM is a new operat ing syst em group t hat is used exclusively f or ASM. Members of t he OSASM group
can connect as SYSASM using operat ing syst em aut hent icat ion and have f ull access t o ASM.
Page 385 Oracle DBA Code Examples
Manual l y Upgr adi ng Or acl e AS f r om 10g t o 11g
Following are t he st eps you f ollow t o upgrade an exist ing Oracle 10g ASM t o 11g:
1. I nst all t he Oracle Dat abase 11g sof t ware t o a new ORACLE_HOME direct ory.
2. Updat e t he /etc/oratab or /var/opt/oracle/oratab f ile wit h t he new ASM ORACLE_HOME
locat ion.
3. Copy t he ASM init ializat ion f ile f rom t he old ORACLE_HOME t o t he new one.
4. Edit any direct ory- based paramet ers ( such as diag and dump) in t he ASM init ializat ion f ile as
required.
5. I f you are upgrading a non- RAC ASM inst ance, you should reconf igure t he Oracle CSS using t he new
ORACLE_HOME. You can do t his by execut ing t he localconfig command f rom t he new home. Once
t he CSS conf igurat ion is complet e, you need t o change your ORACLE_HOME t o t he new Oracle
version 11. 1 ORACLE_HOME and st art t he ASM inst ance.
cd $ORACLE_HOME/bin
# ./localconfig reset
6. I f you are upgrading a ASM inst ance in a RAC environment s, you can modif y t he new ASM home
wit hin t he OCR using t he srvctl ut ilit y as f ollows:
srvctl modify asm -n racnode1 -i +ASM1 -o /apps/oracle/product/11.1.0/asm -p
init+ASM1.ora
7. Grant t he SYSASM role t o t he SYS
GRANT SYSASM to sys;
8. I f you have obsolet e init ializat ion paramet ers, you can address t hem now. To get a list ing of all t he
obsolet e init ializat ion paramet ers, ref er t o t he ASM alert log f ile.
Page 386 Oracle DBA Code Examples
Par t 7 Or acl e Real Appl i cat i on Cl ust er
Page 387 Oracle DBA Code Examples
Or acl e RAC Possi bl e I n st al l at i on Con f i gur at i on s
For Oracle Soft ware homes, Vot ing and OCR, db files:
NTFS_RAW_ASM
NTFS_RAW_RAW
NTFS_OCFS_OCFS
OCFS_OCFS_OCFS
Page 388 Oracle DBA Code Examples
I nst al l i ng Or acl e 10g R2 RAC on Ent er pr i se Li nux 4
Not e: The met alink document RAC St art er Kit and Best Pract ices ( Linux) [ I D 811306. 1] is a
good source reference for t his t ask.
I nst al l at i on Envi r onment
Emulat ion soft ware: VMWare Workst at ion ACE Edit ion 6. 0. 5 or VMWare Server 2.
RAC Nodes: 2 nodes wit h 2 GB RAM each , 2 et hernet cards.
OS: Oracle Linux Ent erprise 4. 5 for x86: kernel 2. 6.9
Requi r ed Sof t w ar e
Oracle 10g R2 Clust erware for Linux x86 32-bit
Oracle Dat abase 10g Release 2 for Linux x86 32-bit
Used Har dw ar e
I n t he VMWare: creat e one virt ual machine ( rac1) wit h t he following specs:
o 2 GB RAM
o Two et hernet cards: bot h can be configured as bridged or host - only in VMware.
o One local hardisk wit h 20 GB
o CPU Count : 2
o Creat e a folder in t he same direct ory st ruct ure level as t he parent folder cont aining t he
creat ed virt ual machine. Give it a meaningful name like ' shared_disks' . Creat e in t hat
folder t hree disks of 10 GB and t wo of 512 MB. All of t hem are of LSI Logic t ype and
SCI SI Persist ent . Make sure t hey are on SCI SI cont roller different from t he SCSI
cont roller of t he local hardisk. For example, if t he SCSI cont roller of local hardisk is
SCI SI 0, make t hose disks on cont roller SCSI 1.
I nst al l at i on Pl an
1. Preinst allat ion t asks:
o Hardware requirement s
o Soft ware requirement s
o Environment configurat ion
2. Oracle Clust erware inst allat ion
3. Oracle Dat abase 10g Soft ware I nst allat ion
4. Apply Pat chset 3 ( 10. 2. 0. 4) for Clust erware and Dat abase Soft ware
5. I nst all EM Agent in clust er nodes ( if required)
6. Configure List eners
7. Perform ASM inst allat ion
Page 389 Oracle DBA Code Examples
8. Perform clust er dat abase creat ion
9. Complet e post inst allat ion t asks
10. Useful post inst allat ion t asks
1. Pr ei nst al l at i on t ask s
I nst all Oracle Ent erprise Linux in t he first local hardisk. I nst all not hing in t he remaining
disks.
Not e: for a product ion syst em, consider becoming an Oracle Unbreakable Linux cust omer
and regist er your server on t he Unbreakable Linux Net work.
o Give t he first et hernet card I P 192.168. 4. 11 and t he second 192. 168. 0. 11 and t he
host name rac1.mydomain.com. Define a gat eway. I f it does not exist , make it same as
t he host I P address.
o I nsall t he following packages:
Deskt op Environment s
o GNOME Deskt op Environment
Deskt op
o X Window Syst em
o Gnome
Page 390 Oracle DBA Code Examples
Applicat ions
o Graphical I nt ernet ( opt ional)
Servers
o Do not select anyt hing in t his group.
Development
o Development Tools
Syst em
o Administ rat ion Tools
o Syst em Tools
Add t he package 'sysst at ' by clicking on t he Det ails link
and select ing "sysst at - The sar an iost at syst em
monit oring commands. " from t he Opt ional Packages list .
Miscellaneous
o Do not select anyt hing in t his group.
Complet e t he inst allat ion
I nst all furt her packages:
# to know distribution and version of Linux
cat /etc/issue
# to know kernel version (and its errata level)
uname -r
# from CD 3
rpm -Uvh libaio*
rpm -Uvh openmotif21-2.1.30-11.RHEL4.6.i386.rpm
rpm -Uvh openmotif-2.2.3-10.1.el4.i386.rpm
# those packages downloaded from http://rpm.pbone.net
rpm -e compat-libstdc++-296-2.96-132.7.2
rpm -Uvh compat-libstdc++-7.3-2.96.128.i386.rpm
rpm -Uvh compat-libstdc++-devel-7.3-2.96.128.i386.rpm
rpm -Uvh compat-gcc-7.3-2.96.128.i386.rpm
rpm -Uvh compat-gcc-c++-7.3-2.96.128.i386.rpm
# confirm the required packages are installed:
rpm -qa|grep gcc-
rpm -qa|grep glibc-
rpm -qa|grep compat-db-
rpm -qa|grep compat-gcc-
rpm -qa|grep compat-gcc-c++-
rpm -qa|grep compat-libstdc++-
rpm -qa|grep compat-libstdc++-devel-
rpm -qa|grep control-center-2.8.0
rpm -qa|grep openmotif21-
rpm -qa|grep setarch-
# SELINUX must be disabled
cat /etc/selinux/config | grep SELINUX=
vi /etc/selinux/config
SELINUX=disabled
shutdown -h now -r
Page 391 Oracle DBA Code Examples
# Install ASMLib 2.0 packages
# install the library for your kernel and CPU type
# oracleasm-*-version.cpu_type.rpm
# check installed packages
rpm -qa|grep asm
# install the packages from CD3
rpm -Uhv oracleasm-support-2.0.3-2.i386.rpm
rpm -Uhv oracleasm-2.6.9-55.0.0.0.2.EL-2.0.3-2.i686.rpm
rpm -Uhv oracleasm-2.6.9-55.0.0.0.2.ELsmp-2.0.3-2.i686.rpm
# download the package Userspace Library
# from
http://otn.oracle.com/software/tech/linux/asmlib/files/RPMS/rhel4/x86/2.0.4/or
acleasmlib-2.0.4-1.el4.i386.rpm
rpm -Uvh oracleasmlib-2.0.4-1.el4.i386.rpm
Check t he hardware requirement s
# Hardware Requirements (in cluster nodes)
# At least 1 GB of physical memory
grep MemTotal /proc/meminfo
# swap space: twice the amount of physical memory
grep SwapTotal /proc/meminfo
# if you don't have enought swap,
# you can add swap space by creating a temporary swap file.
# let's say about 500MB:
dd if=/dev/zero of=tempswap bs=1k count=500000
chmod 600 tempswap
mke2fs tempswap
mkswap tempswap
swapon tempswap
# 400 MB disk space in /tmp
df -k /tmp
# 4 GB of disk space for Oracle software
df
The size of the shared memory should be at least the greater of
MEMORY_MAX_TARGET and MEMORY_TARGET for each Oracle instance on the computer.
To determine the amount of shared memory available, enter the following
command:
# df -h /dev/shm/
Creat e t he required net work configurat ion ( rac2 will be creat ed lat er) :
# Network names Resolution
# configure /etc/hosts if no domain server is used (both nodes)
vi /etc/hosts
127.0.0.1 localhost.localdomain localhost
#Public
192.168.4.11 rac1.mydomain.com rac1
192.168.4.12 rac2.mydomain.com rac2
#VIP
192.168.4.13 rac1-vip.mydomain.com rac1-vip
192.168.4.14 rac2-vip.mydomain.com rac2-vip
#Inter-connect
192.168.0.11 rac1-priv.mydomain.com rac1-priv
192.168.0.12 rac2-priv.mydomain.com rac2-priv
Page 392 Oracle DBA Code Examples
Not e: To prevent net work hangs wit h failovers from public t o virt ual I P addresses wit h
RAC dat abases using NAS devices or NFS mount s, ent er t he following command as root t o
enable t he Name Service Cache Daemon: /sbin/service nscd start
Creat e and configure t he required OS users and groups
Not e: userid and groupid must be t he same in all nodes. You can check t hem by id
oracle command.
# all group and user ids on all the nodes must have identical id
# inventory and OSDBA groups (if needed, use -g <number> to specify the id)
# inventory group
groupadd -g 501 oinstall
groupadd -g 502 dba
# oracle software owner user (take note of userid)
/usr/sbin/useradd -u 200 -g oinstall -G dba oracle
passwd oracle
# make sure nobody user exists (if not there, create it useradd nobody)
id nobody
# The oracle User Environment
# in /home/oracle/.bash_profile
# export DISPLAY if required
export ORACLE_BASE=/u01/app/oracle
if [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
umask 022
fi
export EDITOR=vi
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1
export ORA_CRS_HOME=/u01/crs
export ORACLE_PATH=$ORACLE_BASE/common/oracle/sql:.:$ORACLE_HOME/rdbms/admin
export ORACLE_SID=rac1
export NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
export NLS_DATE_FORMAT="mm/dd/yyyy hh24:mi:ss"
export PATH=.:${PATH}:$HOME/bin:$ORACLE_HOME/bin:$ORA_CRS_HOME/bin
export PATH=${PATH}:/usr/bin:/bin:/usr/bin/X11:/usr/local/bin
export PATH=${PATH}:$ORACLE_BASE/common/oracle/bin
export ORACLE_TERM=xterm
export TNS_ADMIN=$ORACLE_HOME/network/admin
export ORA_NLS10=$ORACLE_HOME/nls/data
export TNS_ADMIN=$ORACLE_HOME/network/admin
export ORA_NLS10=$ORACLE_HOME/nls/data
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$ORACLE_HOME/oracm/lib
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/lib:/usr/lib:/usr/local/lib
export CLASSPATH=$ORACLE_HOME/JRE
export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/jlib
export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/rdbms/jlib
export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/network/jlib
export THREADS_FLAG=native
# should NOT be on a shared disk
export TEMP=/tmp
export TMPDIR=/tmp
Page 393 Oracle DBA Code Examples
Configure kernel paramet ers and shell limit s
Not e: I f you make a mist ake wit h a paramet er set t ing and your syst em does not st art , t hen
you must st art Linux in t he single- user runlevel ( runlevel 1) . At t his runlevel, t he
/ et c/ sysct l. conf file is not run.
# Configuring kernel parameters and shell limits
# User Shell Limits
# memlock is used to increase the per-process max locked memory
vi /etc/security/limits.conf
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft memlock 3145728
oracle hard memlock 3145728
vi /etc/pam.d/login
session required /lib/security/pam_limits.so
# they can be tuned for a production db
# Append the following to the /etc/sysctl.conf file as the root user:
vi /etc/sysctl.conf
kernel.sem = 250 32000 100 128
# It should be equal to or larger than the largest SGA (max 4 GB)
kernel.shmmax = 536870912
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default = 4194304
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 262144
# to take immediate effect
/sbin/sysctl -p
Configure hangcheck- t imer kernel module:
# check hangcheck-timer Module Configuration
# with this module, if the kernel hangs, the machine will reboot
# verify the module is loaded
/sbin/lsmod | grep -i hang
# if not loaded, load it
vi /etc/modprobe.conf
options hangcheck-timer hangcheck_tick=30 hangcheck_margin=180
# execute and add in the file
vi /etc/rc.local
/sbin/modprobe hangcheck-timer
Part it ion t he disks and prepare t he raw disks
# Partition the devices
# for the disks /dev/sdb .. /dev/sdf
fdisk /dev/sdb
# answers: "n", "p", "1", "Return", "Return", "p" and "w"
Note: if the following message appears after the "w" command:
WARNING: Re-reading the partition table failed with error 16: Device or
resource busy.
then, you can avoid restarting the machine by the following command:
partprobe
Page 394 Oracle DBA Code Examples
# to make sure partions are created
ls -lX /dev/sd*
brw-r----- 1 root disk 8, 0 Dec 1 20:35 /dev/sda
brw-r----- 1 root disk 8, 1 Dec 1 20:36 /dev/sda1
brw-r----- 1 root disk 8, 2 Dec 1 20:35 /dev/sda2
brw-r----- 1 root disk 8, 16 Dec 1 21:55 /dev/sdb
brw-r----- 1 root disk 8, 17 Dec 1 21:55 /dev/sdb1
brw-r----- 1 root disk 8, 32 Dec 1 21:57 /dev/sdc
brw-r----- 1 root disk 8, 33 Dec 1 21:57 /dev/sdc1
brw-r----- 1 root disk 8, 48 Dec 1 21:57 /dev/sdd
brw-r----- 1 root disk 8, 49 Dec 1 21:57 /dev/sdd1
brw-r----- 1 root disk 8, 64 Dec 1 21:58 /dev/sde
brw-r----- 1 root disk 8, 65 Dec 1 21:58 /dev/sde1
brw-r----- 1 root disk 8, 80 Dec 1 21:58 /dev/sdf
brw-r----- 1 root disk 8, 81 Dec 1 21:58 /dev/sdf1
# binding sdisks to raw devices
raw /dev/raw/raw1 /dev/sdb1
raw /dev/raw/raw2 /dev/sdc1
# list the raw devices
raw -qa
# add to the file
vi /etc/sysconfig/rawdevices
/dev/raw/raw1 /dev/sdb1
/dev/raw/raw2 /dev/sdc1
# Adjust the raw devices permission settings:
# Run the following commands AND add them the /etc/rc.local file:
# will be used by OCR
chown root:oinstall /dev/raw/raw1
chmod 660 /dev/raw/raw1
# will be used by voting disk
chown oracle:oinstall /dev/raw/raw2
chmod 644 /dev/raw/raw2
# will be used by ASM, if it is using raw device (NOT IN THIS CONFIGURATION)
# chown oracle:oinstall /dev/raw/raw3
# chmod 660 /dev/raw/raw3
# start the service
service rawdevices restart
Creat e t he required direct ories for t he Oracle clust erware and dat abase soft ware
# to know if there is an existing oracle inventory
# from its output, ORACLE_BASE will be parent of oraInventory
more /etc/oraInst.loc
# to identify existing Oracle home directories
more /etc/oratab
# in the example above, /u01 should be owned by the root user
# and writable by group oinstall
# directories must be same in all nodes:
mkdir -p /u01/app/oracle/product/10.2.0/db_1
mkdir /u01/stage10g
# clusterware must NOT be subdirectory of the ORACLE_BASE
mkdir /u01/crs
chown -R oracle:oinstall /u01/app/oracle
Page 395 Oracle DBA Code Examples
chmod -R 775 /u01/app/oracle
chown oracle:oinstall /u01/stage10g
chown -R oracle:oinstall /u01/crs
chmod -R 775 /u01/crs
Disable screensavers on host & guest machines.
o I n Oracle Linux: Applicat ions- > Preferences- > Screen Saver- > Mode: Disable Screen
Saver
o Do t he same aft er logging off and logging on again as oracle user.
Shut down rac1
Edit t he VMware file ( wit h vmx ext ensions) and add t he following ent ry t o allow sharing
t he disks ( make sure t he scsi cont roller number is t he one you used) :
disk.locking = "FALSE"
diskLib.dataCacheMaxSize = "0"
diskLib.dataCacheMaxReadAheadSize = "0"
diskLib.dataCacheMinReadAheadSize = "0"
diskLib.dataCachePageSize = "4096"
scsi1.sharedBus = "virtual"
scsi1:0.deviceType = "disk"
scsi1:1.deviceType = "disk"
scsi1:2.deviceType = "disk"
scsi1:3.deviceType = "disk"
scsi1:4.deviceType = "disk"
scsi1:5.deviceType = "disk"
Copy t he folder cont aining rac1 int o a new folder in t he same direct ory st ruct ure level.
Let ' s name it "rac2". This will be t he second node in t he clust er.
Edit t he VMware file of rac1 and edit t he following: displayName = "rac2"
Open rac2 t hen probe it s net work cards, change it ' s I P addresses: I P 192. 168. 4. 12 and
192. 168. 0. 12. I t 's host name t o rac2.mydomain. com. You can use syst em- config- net work-
gui. Act ivat e t he net work and reboot t he vm.
I n rac2, perform:
# change the variable in the file
vi /home/oracle/.bash_profile
export ORACLE_SID=rac2
St art rac1
Configure ASM drivers:
# as root ( on ALL NODES )
service oracleasm configure
Default user to own the driver interface []: oracle
Default group to own the driver interface []: dba
Start Oracle ASM library driver on boot (y/n) [n]: y
Fix permissions of Oracle ASM disks on boot (y/n) [y]: y
Writing Oracle ASM library driver configuration: [ OK ]
Creating /dev/oracleasm mount point: [ OK ]
Loading module "oracleasm": [ OK ]
Mounting ASMlib driver filesystem: [ OK ]
Scanning system for ASM disks: [ OK ]
# As the root user on node node1 (ONLY ONE NODE)
service oracleasm createdisk DISK1 /dev/sdd1
Page 396 Oracle DBA Code Examples
service oracleasm createdisk DISK2 /dev/sde1
service oracleasm createdisk DISK3 /dev/sdf1
# if any of the commands above fails, you can delete the disk
service oracleasm deletedisk DISK1
# in ALL NODES
service oracleasm scandisks
service oracleasm listdisks
Configure SSH in all t he nodes:
Not e: scp and ssh must be locat ed in t he pat h / usr/ local/ bin. I f not , t hen creat e a symbolic
link in / usr/ local/ bin t o t he locat ion where scp and ssh are found.
# Configuring SSH for Remote Installation
# make sure the ssh is running
# the following command shoudl return ssh process id
pgrep sshd
vi /etc/hosts.equiv
# add node names to /etc/hosts.equiv (all nodes)
rac1
rac2
# as oracle in node1
# whenever prompted for a passphrase leave it empty and press return
mkdir ~/.ssh
chmod 700 ~/.ssh
/usr/bin/ssh-keygen -t rsa
# as oracle in node2
mkdir ~/.ssh
chmod 700 ~/.ssh
/usr/bin/ssh-keygen -t rsa
# as oracle on node1
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
ssh rac2 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
scp ~/.ssh/authorized_keys rac2:/home/oracle/.ssh/
# Perform the following as the oracle user on node1 and then node2
# copy paste the following command in both nodes twice:
ssh rac1 date;ssh rac2 date;ssh rac1.mydomain.com date;ssh rac2.mydomain.com
date;ssh rac1-priv date;ssh rac2-priv date;ssh rac1-priv.mydomain.com date;ssh
rac2-priv.mydomain.com date;ssh localhost.localdomain date;ssh localhost date
# Note: the keys are session dependent. it's gone from memory on log off
# Execute (to load the keys in the memory):
exec /usr/bin/ssh-agent $SHELL
/usr/bin/ssh-add
2. Or acl e Cl ust er w ar e i nst al l at i on
# make sure system time of rac2 should be behind the system time of rac1
date; ssh rac2 date
# Identify the shared disks to use
# /dev/sdb & /dev/sdc will be used for OCR & Voting by the Cluster software
/sbin/fdisk l
# unzip the Oracle 10g R2 Clusterware for Linux in the stage folder (rac1)
# If you plan to use Oracle Clusterware on x86 (64-bit) (but not on
# Linux Itanium 64-bit), then you must run the rootpre.sh on all nodes
Page 397 Oracle DBA Code Examples
su -
cd /u01/stage10g/clusterware/rootpre
./rootpre.sh
# install cluvfy (in all nodes)
# in node1
su -
cd /u01/stage10g/clusterware/rpm
rpm -q cvuqdisk-1.0.1
export CVUQDISK_GRP=dba
rpm -ivh cvuqdisk-1.0.1-1.rpm
# in node2
su -
export CVUQDISK_GRP=dba
rpm -ivh cvuqdisk-1.0.1-1.rpm
# Verify Cluster Setup with cluvfy
# as oracle
# if the user equivalency is not loaded
exec /usr/bin/ssh-agent $SHELL
/usr/bin/ssh-add
# then proceed:
cd /u01/stage10g/clusterware/cluvfy
export CV_NODE_ALL=rac1,rac2
./runcluvfy.sh stage -pre crsinst -n rac1,rac2 -verbose
# If only the VIP was the problem, then you're going in the right way!
# lunch OUI from the clusterware ( as oracle from node1)
# if logged in in Genome using another user, log out and log in as oracle
# to reload the user equivalency, if logged off: (as oracle)
exec /usr/bin/ssh-agent $SHELL
/usr/bin/ssh-add
# if not turned off, turn off the screensaver IN ALL NODES
# then process:
cd /u01/stage10g/clusterware
./runInstaller
>Inventory Directory (displayed only in first time)
/u01/app/oracle/oraInventory
oinstall
>Home Details
/u01/crs
>Product-Specific Prerequisite Checks
They all should succeed
>Specify Cluster Configuration
Select 'Add' and add the details for node rac2. Enter all details. 'OK' to
continue.
rac2.mydomain.com
rac2-priv.mydomain.com
rac2-vip.mydomain.com
Click 'Next'
Page 398 Oracle DBA Code Examples
>Specify Network Interface Usage
Change the eth0 Interface Type to Public.
'Ok' to continue
>Specify Oracle Cluster Registry (OCR) Location
Select External Redundancy and
specify the first raw device /dev/raw/raw1 as the OCR location
'Next' to continue.
>Specify Voting Disk Location
Select External Redundancy and
specify the first raw device /dev/raw/raw2 as the voting disk location
'Next' to continue.
>Summary
Review the summary and select 'Install' to start the installation
>Configuration Scripts
as the root user on each node, run the scripts. Do not run the scripts
simultaneously on both nodes.
if there is an error in scripts execution, it's reported in /u01/
/crs/log/<hostname>
output of running the script in node1:
Checking to see if Oracle CRS stack is already configured
/etc/oracle does not exist. Creating it now.
Setting the permissions on OCR backup directory
Setting up NS directories
Oracle Cluster Registry configuration upgraded successfully
assigning default hostname rac1 for node 1.
assigning default hostname rac2 for node 2.
Successfully accumulated necessary OCR keys.
Using ports: CSS=49895 CRS=49896 EVMC=49898 and EVMR=49897.
node <nodenumber>: <nodename> <private interconnect name> <hostname>
node 1: rac1 rac1-priv rac1
node 2: rac2 rac2-priv rac2
Creating OCR keys for user 'root', privgrp 'root'..
Operation successful.
Now formatting voting device: /dev/raw/raw2
Format of 1 voting devices complete.
Startup will be queued to init within 90 seconds.
Adding daemons to inittab
Expecting the CRS daemons to be up within 600 seconds.
CSS is active on these nodes.
rac1
CSS is inactive on these nodes.
rac2
Local node checking complete.
Run root.sh on remaining nodes to start CRS daemons.
output of running the script in node2:
Checking to see if Oracle CRS stack is already configured
/etc/oracle does not exist. Creating it now.
Setting the permissions on OCR backup directory
Setting up NS directories
Page 399 Oracle DBA Code Examples
Oracle Cluster Registry configuration upgraded successfully
clscfg: EXISTING configuration version 3 detected.
clscfg: version 3 is 10G Release 2.
assigning default hostname rac1 for node 1.
assigning default hostname rac2 for node 2.
Successfully accumulated necessary OCR keys.
Using ports: CSS=49895 CRS=49896 EVMC=49898 and EVMR=49897.
node <nodenumber>: <nodename> <private interconnect name> <hostname>
node 1: rac1 rac1-priv rac1
node 2: rac2 rac2-priv rac2
clscfg: Arguments check out successfully.
NO KEYS WERE WRITTEN. Supply -force parameter to override.
-force is destructive and will destroy any previous cluster
configuration.
Oracle Cluster Registry for cluster has already been initialized
Startup will be queued to init within 90 seconds.
Adding daemons to inittab
Expecting the CRS daemons to be up within 600 seconds.
CSS is active on these nodes.
rac1
rac2
CSS is active on all nodes.
Waiting for the Oracle CRSD and EVMD to start
Waiting for the Oracle CRSD and EVMD to start
Waiting for the Oracle CRSD and EVMD to start
Waiting for the Oracle CRSD and EVMD to start
Waiting for the Oracle CRSD and EVMD to start
Waiting for the Oracle CRSD and EVMD to start
Waiting for the Oracle CRSD and EVMD to start
Oracle CRS stack installed and running under init(1M)
Running vipca(silent) for configuring nodeapps
The given interface(s), "eth0" is not public. Public interfaces should be used
to configure virtual IPs.
# you MUST run vipca in the LAST NODE (NODE2) before clicking OK in OUI
# from $ORA_CRS_HOME/bin
cd /u01/crs/bin
./vipca
# in vipca, click on vip address to auto fill
rac1 rac1-vip.mydomain.com 192.168.4.13
rac2 rac2-vip.mydomain.com 192.168.4.14
When the configuration is complete, the final result report will be:
Configuration ResultsThe VIP Configuration Assistant has successfully created
resource aplications for each cluster node
Click 'Exit'
Click 'OK' in the OUI.
All the checks should succeed.
Click 'Exit'
# To verify the installation:
-- 1
cd /u01/stage10g/clusterware/cluvfy
./runcluvfy.sh stage -post crsinst -n rac1,rac2 -verbose
Page 400 Oracle DBA Code Examples
-- 2
ping rac1-vip
ping rac2-vip
-- 3
/u01/crs/bin/crsctl check crs
# To Avoid Node Eviction
# In ALL NODES as root: (IMPORTANT)
vi /u01/crs/install/rootconfig
At line 356, change
CLSCFG_MISCNT="-misscount 60"
to
CLSCFG_MISCNT="-misscount 300"
# and then by the command
crsctl set css misscount 300
# check status of crs daemon processes (ALL NODES)
./crs_stat -t
Name Type Target State Host
------------------------------------------------------------
ora.rac1.gsd application ONLINE ONLINE rac1
ora.rac1.ons application ONLINE ONLINE rac1
ora.rac1.vip application ONLINE ONLINE rac1
ora.rac2.gsd application ONLINE ONLINE rac2
ora.rac2.ons application ONLINE ONLINE rac2
ora.rac2.vip application ONLINE ONLINE rac2
# if State of any of them is UNKNOWN, try restarting the deamons
./crsctl stop crs
# then start again
./crsctl start crs
# to check their status (keep checking till all damons are up)
./crsctl check crs
# when they are all up, the output should be:
CSS appears healthy
CRS appears healthy
EVM appears healthy
3. Or acl e Dat abase 10g Sof t w ar e I nst al l at i on
# make sure all clusterware processes are running
/u01/crs/bin/crs_stat -t
# you can restart them
/u01/crs/bin/crsctl stop crs
/u01/crs/bin/crsctl start crs
# If not loaded, to load the keys in the memory:
exec /usr/bin/ssh-agent $SHELL
/usr/bin/ssh-add
-- extract DB software in /u01/stage10g/database in node1
-- as oracle
mkdir /u01/stage10g/database
-- start OUI
cd /u01/stage10g/database
./runInstaller
Welcome 'Next' to skip the Welcome screen
Page 401 Oracle DBA Code Examples
Select Installation Type
'Next' to continue.
Install Location
Keep the default Oracle Base location /u01/app/oracle and
default Oracle Home location /u01/app/oracle/product/10.2.0/db_1
'Next' to continue.
Specify Hardware Cluster Installation Mode
Keep the default 'Cluster Installation' selection
and select both nodes.
'Next' to continue.
Product-Specific Prerequisite Checks
The OUI will now verify that the environment meets all the requirements. All
pre-requisite steps should complete successfully.
Select 'Next' to continue.
Select Configuration Option
Select 'Install Software Only'.
'Next' to continue.
Privileged Operating System Groups
Keep the default options dba, oinstall.
'Next' to continue
Summary
Review the summary and select 'Install' to start the installation.
Configuration Script
Once the installation is complete you will be prompted to run a script as the
root user. Open a
terminal window and execute the script as the root user on each node.
Select 'Ok' to continue after the script has been run successfully on both
nodes.
End of Installation
Once the installation is complete select 'Exit' to complete the installation
and exit the OUI.
4. Appl y Pat chset 3 ( 10.2. 0. 4) f or Cl ust er w ar e and Dat abase Sof t w ar e
Not e: This is t he pat chset applied for t his environment . Generally speaking, if t here is a newer
version, use it inst ead of t his version.
Not e: This pat ch includes t he Oracle Clust erware Process Monit or Daemon ( oprocd) which
when it det ect s a syst em hang, it rest art s t he hung node. This may rest art a node under
heavy workload. Check Oracle Clust eware I nst allat ion documenat ion for more informat ion.
# extract 10g Release 2 (10.2.0.4) Patch Set 3 for Linux x86 to
/u01/stage10g/patch10.2.0.4/Disk1
mkdir /u01/stage10g/patch10.2.0.4
# If not loaded, to load the keys in the memory:
exec /usr/bin/ssh-agent $SHELL
/usr/bin/ssh-add
# you apply the patch on (1) clusterware then on (2) database software
Page 402 Oracle DBA Code Examples
# (1) Apply the patch on clusterware
# as oracle in rac1
cd /u01/stage10g/Patch10.2.0.4
./runInstaller
Select CRS Home then ->Next
Cluster Info displayed -> Next
Checks -> Next
->Install
After Installation is complete it will ask to apply a script on the nodes one-
by-one.
Following is a sample of the message that appears:
To complete the installation of this patchset, you must perform the following
tasks on each node:
1. Log in as the root user.
2. As the root user, perform the following tasks:
a. Shutdown the CRS daemons by issuing the following command:
/u01/crs/bin/crsctl stop crs
b. Run the shell script located at:
/u01/crs/install/root102.sh
This script will automatically start the CRS daemons on the patched node
upon completion.
3. After completing this procedure, proceed to the next node and repeat.
# following is the implementation of the above
su -
cd /u01/crs/bin
./crsctl stop crs
cd /u01/crs/install
./root102.sh
cd /u01/crs/bin
./crsctl query crs softwareversion
# REPEAT IN NODE2
# then check status of deamons
./crs_stat -t
# (2) Apply the patch on DB software
# as oracle in node1
cd /u01/stage10g/patch10.2.0.4/Disk1
./runInstaller
Select path of ORACLE_HOME ->Next
After Installation is complete it will ask to apply a script on both the nodes
one-by-one.
5. I nst al l EM Agent i n cl ust er nodes ( i f r equi r ed)
6. Conf i gur e Li st ener s
# Run netca (not netmanager which is not clusteraware) from any node.
# as oracle
cd $ORACLE_HOME/bin
./netca &
Select Cluster configuration and select both nodes.
Configure Listener
Then Configure Naming Methods: Local and Easy Connect
Page 403 Oracle DBA Code Examples
After installing listener check with below commands whether listener working
properly.
# as root
/u01/crs/bin/crs_stat -t
7. Per f or m ASM i nst al l at i on
# as oracle (in node1)
cd /u01/app/oracle/product/10.2.0/db_1/bin
dbca &
Welcome
Keep the default selection Oracle RAC database. 'Next' to continue.
Operations Select
Configure ASM. 'Next' to continue.
Node Selection
Select ALL the nodes and 'Next' to continue.
Create ASM Instance
Select a SYS password for the ASM instance.
Select IFILE parameter file to create. 'Next' to continue.
Select OK to confirm creation of the ASM instances.
ASM Disk Groups
Select Create New to create new ASM disk groups.
Enter dg1 as the first disk group name.
Keep the default redundancy settings (Normal) and select the 2 data disks
DISK1 and DISK2.
'Ok' to continue
Select Create New again to add another disk group.
Enter dg2 as the disk group name.
This time select External for redundancy and select the remaining disk DISK3.
This group will be used as the recovery arae
'OK' to continue.
All the disk groups are now created. Finish to complete.
# An ASM instance will be created in every node named as ASMn
export ORACLE_SID=ASM1
sqlplus /nolog
SQL>conn / as sysdba
select name from v$asm_diskgroup ;
...
# after checking, return ORACLE_SID to its original value
export ORACLE_SID=rac1
8. Per f or m cl ust er dat abase cr eat i on
# If not loaded, to load the keys in the memory:
exec /usr/bin/ssh-agent $SHELL
/usr/bin/ssh-add
# as oracle (in node1)
cd /u01/app/oracle/product/10.2.0/db_1/bin
dbca &
Page 404 Oracle DBA Code Examples
Create Oracle RAC Database
'Next' to continue
Operations
Select Create a Database.
'Next' to continue.
Node
Select all the nodes
'Next' to continue.
Database Templates
Select the required template
'Next' to continue.
Database Identification
Enter rac as the global database name.
'Next' to continue.
Management Options
Keep the default settings Configure Enterprise Manager and Configure Database
Control for local management selected,
but Enable Alert Notifications and Enable Daily Disk Backup to Recovery Area
deselected.
'Next' to continue.
Database Credentials
Select Use the same Administrative Password for All Accounts and enter a
password.
'Next' to continue.
Storage Options
Select ASM for storage.
'Next' to continue.
ASM Disk Groups
Select both disk groups dg1 and dg2.
'Next' to continue.
Database File Locations
Keep the default Use Oracle-Managed Files.
Make sure +DG1 is entered as the Database Area.
'Next' to continue
Recovery Configuration:
Select Specify Flash Recovery Area and enter +DG2 as the Flash Recovery Area.
Set its size.
Select Enable archiving and click on the Edit Archive Mode Parameters button
and make sure the Flash Recovery area is pointing to +DG2.
'OK' and then
'Next' to continue.
Database Content
Select Sample Schemas if you want to install them.
Click 'Next'
Page 405 Oracle DBA Code Examples
Database Services:
Click Add button and enter Service Name such as: hrserv then click 'OK'
Make sure it's set to 'Preferred' in both nodes and select Basic for TAF.
Click 'Next'
Initialization Parameters:
Memory Size to 70%. You can leave all other settings as is.
'Next' to continue
Creation Options
Select Generate database creation scripts if you want to review these at a
later stage.
'Finish' to review the installation.
Summary
Select Ok to close the review page and
'Finish' to start the installation.
Once database creation is done a summary screen will be displayed.
'Exit' to exit the OUI.
# check Oracle processes:
ps -eo pid -o command | grep ora_ | grep -v grep
9. Post i nst al l at i on t ask s
As the oracle user edit the /etc/oratab file on both nodes.
Replace the database name with the instance name for the rac database
i.e. replace the rac keyword with rac1 or rac2 depending on the node.
Furthermore add details for your clusterware home to this file.
This will enable you to set the Clusterware home using the oraenv script.
Once edited the /etc/oratab file should contain the following:
vi /etc/oratab
On node RAC1:
+ASM1:/u01/app/oracle/products/10.2.0/db_1:N
rac1:/u01/app/oracle/products/10.2.0/db_1:N
crs:/u01/crs:N
On node RAC2
+ASM2:/u01/app/oracle/products/10.2.0/db_1:N
rac2:/u01/app/oracle/products/10.2.0/db_1:N
crs:/u01/crs:N
# verify the Cluster Registry configuration
srvctl config database -d rac
# backup the root.sh script
cp /u01/app/oracle/product/10.2.0/db_1/root.sh ~/root.sh.bak
# Back up the voting disk
dd if=/dev/raw/raw2 of=~/vdisk.bak
# verify that OEM is working
https://rac1.mydomain.com:1158/em
# restart the dbconsole if required
emctl status dbconsole
emctl stop dbconsole
Page 406 Oracle DBA Code Examples
emctl start dbconsole
10. Usef ul Post i nst al l at i on Task s
Following are t ips t o consider aft er t he successful inst allat ion t o make managing RAC
easier.
Consider using rlwrap ut ilit y wit h SQL* Plus and RMAN:
o Using rlwrap Ut ilit y wit h RMAN in Unix- Based Syst ems
o Using rlwrap Ut ilit y wit h SQL* Plus in Unix- Based Syst em s
/* Make crs_stat -t more readable */
/* copy the following script into ~/scripts/crstat.sh */
#!/usr/bin/ksh
#
# Sample 10g CRS resource status query script
#
# Description:
# - Returns formatted version of crs_stat -t, in tabular
# format, with the complete rsc names and filtering keywords
# - The argument, $RSC_KEY, is optional and if passed to the script, will
# limit the output to HA resources whose names match $RSC_KEY.
# Requirements:
# - $ORA_CRS_HOME should be set in your environment
# suggested scrip name: crstat.sh
RSC_KEY=$1
QSTAT=-u
AWK=/usr/bin/awk # if not available use /usr/bin/awk
# Table header:echo ""
$AWK \
'BEGIN {printf "%-45s %-10s %-18s\n", "HA Resource", "Target", "State";
printf "%-45s %-10s %-18s\n", "-----------", "------", "-----";}'
# Table body:
$ORA_CRS_HOME/bin/crs_stat $QSTAT | $AWK \
'BEGIN { FS="="; state = 0; }
$1~/NAME/ && $2~/'$RSC_KEY'/ {appname = $2; state=1};
state == 0 {next;}
$1~/TARGET/ && state == 1 {apptarget = $2; state=2;}
$1~/STATE/ && state == 2 {appstate = $2; state=3;}
state == 3 {printf "%-45s %-10s %-18s\n", appname, apptarget, appstate;
state=0;}'
# then add the following in the .bashrc of oracle user
# if the file was saved in ~/scripts/crstat.sh
alias crstat='~/scripts/crstat.sh'
/* Easy Acces to crs and db homes */
# it is common to access bin directories in clusterware and db homes
# add the following to .bashrc of oracle user
alias db='cd $ORACLE_HOME/bin'
alias crs='cd $ORA_CRS_HOME/bin'
Page 407 Oracle DBA Code Examples
I nst al l i ng Or acl e 11g R2 RAC on Ent er pr i se Li nux 5
Not e: The met alink document RAC St art er Kit and Best Pract ices ( Linux) [ I D 811306. 1] is a
good source reference for t his t ask.
Mai n Changes i n Or acl e 11g Rel ease 2 RAC
SCAN: single client access name ( SCAN) is a domain name used by all client s connect ing
t o t he clust er. I t is regist ered t o t hree I P addresses, eit her in t he domain name service
( DNS) or t he Grid Naming Service ( GNS).
GNS: enables using DHCP, which must be configured in t he subdomain in which t he clust er
resides.
OCR and Vot ing can now be configured on an ASM diskgroup.
Passwordless aut omat ic SSH connect ivit y: t he inst aller can configure SSH for you.
I nt elligent Plat form Management int erface ( I PMI ) : provides a set of common int erfaces t o
comput er hardware and firmware t hat administ rat ors can use t o monit or syst em healt h
and manage t he syst em.
Time sync: The new Oracle Clust er Time Synchronizat ion Service is designed for
organizat ions whose Oracle RAC dat abases are unable t o access NTP services.
Grid I nfrast ruct ure home: Clust erware and ASM share t he same Oracle Home.
Hangcheckt imer replaced by t he clust er synchronizat ion service daemon Agent and
Monit or t o provide more accurat e recognit ion of hangs and t o avoid false t erminat ion.
I nst al l at i on Envi r onment
Emulat ion soft ware: VMWare Workst at ion 7
RAC Nodes: 2 nodes wit h 2. 5 GB RAM each , 2 et hernet cards.
OS: Oracle Linux Ent erprise 5 for x86
Requi r ed Sof t w ar e
Oracle Dat abase 11g Release 2 for Linux x86 32-bit
Oracle Dat abase 11g Release 2 Grid I nfrast ruct ure ( 11. 2. 0. 1. 0) for Linux x86 32-bit
Used Har dw ar e
I n t he VMWare: creat e one virt ual machine ( rac1) wit h t he following specs:
o 2. 5 GB RAM
o Two et hernet cards: bot h can be configured as bridged or host - only in VMware.
o One local hardisk wit h 24 GB on SCSI 0: 0.
o CPU Count : 2
Page 408 Oracle DBA Code Examples
o Creat e a folder in t he same direct ory st ruct ure level as t he parent folder cont aining t he
creat ed virt ual machine. Give it a meaningful name like ' shared_disks' . Creat e in t hat
folder t he following disks:
Disk1: of 3 GB. Allocat e it s disk space. I t will be used for OCR and
Vot ing disk. Set it on cont roller SCSI 1: 1.
Disk2: of 4 GB. Allocat e it s disk space. I t will be used for + Dat a. Set it
on cont roller SCSI 1: 2.
Disk3: of 2 GB. Allocat e it s disk space. I t will be used for + Flash. Set it
on cont roller SCSI 1: 3.
I nst al l at i on Pl an
11. Preinst allat ion t asks
Hardware requirement s
Soft ware requirement s
Environment configurat ion
12. Oracle Grid I nfrast ruct ure inst allat ion
13. Oracle Grid I nfrast ruct ure Pat ching
14. Oracle Dat abase 11g R2 Soft ware I nst allat ion
15. Oracle Dat abase 11g R2 Soft ware Pat ching
16. I nst all EM Agent in clust er nodes ( if required)
Page 409 Oracle DBA Code Examples
17. ASM Diskgroups Creat ion
18. RAC Dat abase Creat ion
19. Complet e post inst allat ion t asks
20. Useful post inst allat ion t asks
Not e: The inst allat ion is explained wit hout GNS and I PMI
Not e: For t his inst allat ion we will be using ASM for Clust erware and Dat abase st orage
1. Pr ei nst al l at i on t ask s
I nst all Oracle Ent erprise Linux in t he first local hardisk. I nst all not hing in t he remaining
disks.
Not e: for a product ion syst em, consider becoming an Oracle Unbreakable Linux cust omer
and regist er your server on t he Unbreakable Linux Net work.
o Configure t he swap area in t he local hardisk t o have 3 GB disk space.
o Give t he first et hernet card I P 192.0. 2.100 and t he second 172. 0. 2.100 and t he
host name rac1.mydomain.com. Define a gat eway. I f it does not exist , make it same as
t he host I P address.
o I nsall t he following packages:
Deskt op Environment s
o GNOME Deskt op Environment
Applicat ions
o Graphical I nt ernet ( opt ional)
o Edit ors ( opt ional)
Development
o Development Libraries
o Development Tools
Servers
o Do not select anyt hing in t his group.
Base Syst em
o Administ rat ion Tools
o Syst em Tools
Add t he package 'sysst at ' by clicking on t he Det ails link
and select ing "sysst at - The sar an iost at syst em
monit oring commands. " from t he Opt ional Packages list .
X Window Syst em
Complet e t he inst allat ion.
Aft er t he I nst allat ion compelet s, RHEL 5. 2 and below will hang on boot ing when it reaches
t o "st art ing udev" line. To solve t his problem, shut down t he Vmware machine and change
t he CPU count and Core Count t o only one. I mplement t he changes below, t hen shut down
t he machine, set CPU count back t o 2 and st art up t he machine.
put t he kernel command line paramet ers at t he end of t he "kernel" line:
vi /boot/grub/grub.conf
add divider=10 clocksource=acpi_pm
Page 410 Oracle DBA Code Examples
For example: kernel /vmlinuz-2.6.18 .. clock=acpi_pm divider=10
For Vmware machines, inst all VMWare t ools and set it t o synchronize it s t ime wit h t he
guest : vmwaretoolbox. Alt ernat vily, you can use Oracle Clust er Time Synchronizat ion
Service ( ct ssd) ( met alink document 551704. 1)
I nst all furt her packages:
# to know distribution and version of Linux (Red Hat Ent. 5.2 used)
cat /etc/issue
# to know kernel version (and its errata level) (2.6.18-92 or newer)
uname -r
# to list missed packages:
rpm -q --qf '%{NAME}-%{VERSION}-%{RELEASE} (%{ARCH})\n' binutils \
compat-libstdc++-33 \
elfutils-libelf \
elfutils-libelf-devel \
gcc \
gcc-c++ \
glibc \
glibc-common \
glibc-devel \
glibc-headers \
ksh \
libaio \
libaio-devel \
libgcc \
libstdc++ \
libstdc++-devel \
make \
sysstat \
unixODBC \
unixODBC-devel
# for missed packages, install them:
rpm -Uvh libaio-devel-0.3.106-3.2.i386.rpm
rpm -Uvh unixODBC*
# Download the appropriate ASMLib RPMs from OTN.
# to know the kernel verion: uname -rm
# In this case we need:
oracleasm-2.6.18-92.el5-2.0.5-1.el5.i686.rpm
oracleasmlib-2.0.4-1.el5.i386.rpm
oracleasm-support-2.1.3-1.el5.i386.rpm
rpm -Uvh oracleasm*.rpm
# SELINUX must be disabled
cat /etc/selinux/config | grep SELINUX=
vi /etc/selinux/config
SELINUX=disabled
shutdown -h now -r
Check t he hardware requirement s
# Hardware Requirements (in cluster nodes)
# At least 1.5 GB of physical memory but practically 1.5 is not fine
grep MemTotal /proc/meminfo
Page 411 Oracle DBA Code Examples
# swap space: same as the amount of physical memory
grep SwapTotal /proc/meminfo
# to display swap and memory in one command:
free
# if you don't have enought swap,
# you can add swap space by creating a temporary swap file.
# let's say about 500MB:
dd if=/dev/zero of=tempswap bs=1k count=500000
chmod 600 tempswap
mke2fs tempswap
mkswap tempswap
swapon tempswap
# 1 GB disk space in /tmp
df -h /tmp
# 8 GB of disk space for Oracle software
df
The size of the shared memory should be at least the greater of
MEMORY_MAX_TARGET and MEMORY_TARGET for each Oracle instance on the computer.
To determine the amount of shared memory available, enter the following
command:
# df -h /dev/shm/
Creat e t he required net work configurat ion ( rac2 will be creat ed lat er) :
o Public and Privat e int erface names must be t he same for all nodes.
o This privat e host name does not need t o be resolvable t hrough DNS and should be
ent ered in t he / et c/ host s file.
o SCAN VI Ps must NOT be in t he / et c/ host s file, it must be resolved by DNS. But here
I ' ve defined it as a single I P address in t he "/ et c/ host s" file, which is wrong and will
cause t he clust er verificat ion t o fail, but it allows me t o complet e t he inst all wit hout t he
presence of a DNS.
o I f you are using a DNS, Oracle recommends t hat you add lines t o t he / et c/ host s file on
each node, specifying t he public I P, VI P and privat e addresses.
o I f you configured t he I P addresses in a DNS server, t hen, as t he root user, change t he
host s search order in / et c/ nsswit ch. conf on all nodes as shown:
Old: hosts: files nis dns
New: hosts: dns files nis
o Then rest art nscd daemon on each node: /sbin/service nscd restart
# Network names Resolution
# configure /etc/hosts if no domain server is used (both nodes)
vi /etc/hosts
127.0.0.1 localhost.localdomain localhost
#eth0 - PUBLIC
192.0.2.100 rac1.mydomain.com rac1
192.0.2.101 rac2.mydomain.com rac2
#VIP
192.0.2.102 rac1-vip.mydomain.com rac1-vip
192.0.2.103 rac2-vip.mydomain.com rac2-vip
#eth1 - PRIVATE
Page 412 Oracle DBA Code Examples
172.0.2.100 rac1-priv
172.0.2.101 rac2-priv
# in real production: the follwing should not be there at all
# SCAN: cluster_name-scan.GNS_subdomain_name
192.0.2.104 rac-scan.mydomain.com rac-scan
Creat e and configure t he required OS users and groups
Not e: userid and groupid must be t he same in all nodes. You can check t hem by id
oracle command.
# all group and user ids on all the nodes must have identical id
# Grid Infrastructure (GI) and the Oracle RDBMS home will
# be installed using different users:
/usr/sbin/groupadd -g 501 oinstall
/usr/sbin/groupadd -g 502 dba
/usr/sbin/groupadd -g 504 asmadmin
/usr/sbin/groupadd -g 506 asmdba
/usr/sbin/groupadd -g 507 asmoper
/usr/sbin/useradd -u 501 -g oinstall -G asmadmin,asmdba,asmoper grid
/usr/sbin/useradd -u 502 -g oinstall -G dba,asmdba oracle
# set passwords
passwd oracle
passwd grid
# make sure nobody user exists (if not there, create it useradd nobody)
id nobody
# define the env variables for oracle user
vi /home/oracle/.bash_profile
# Oracle Settings
export EDITOR=vi
TMP=/tmp; export TMP
TMPDIR=$TMP; export TMPDIR
ORACLE_HOSTNAME=rac1.mydomain.com; export ORACLE_HOSTNAME
ORACLE_UNQNAME=RAC; export ORACLE_UNQNAME
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1; export ORACLE_HOME
ORACLE_SID=RAC1; export ORACLE_SID
ORACLE_TERM=xterm; export ORACLE_TERM
PATH=/usr/sbin:$PATH; export PATH
PATH=$ORACLE_HOME/bin:$PATH; export PATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib; export LD_LIBRARY_PATH
CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib; export
CLASSPATH
# shell startup file
vi /etc/profile
if [ $USER = "oracle" ] || [ $USER = "grid" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
umask 022
Page 413 Oracle DBA Code Examples
fi
# for C shell
vi /etc/csh.login
if ( $USER = "oracle" || $USER = "grid" ) then
limit maxproc 16384
limit descriptors 65536
endif
Configure kernel paramet ers and shell limit s
Not e: I f you make a mist ake wit h a paramet er set t ing and your syst em does not st art ,
t hen you must st art Linux in t he single- user runlevel ( runlevel 1) . At t his runlevel, t he
/ et c/ sysct l. conf file is not run.
# Kernel Parameters
# to tune thme, refer to metalink document 169706.1
# Append the following to the /etc/sysctl.conf file as the root user:
vi /etc/sysctl.conf
# kernel.shmmax not stated in 11g R2 (max: 4G) (169706.1)
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.aio-max-nr = 1048576
fs.file-max = 6815744
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
# to take immediate effect
/sbin/sysctl -p
# User Shell Limits
# memlock is used to increase the per-process max locked memory
vi /etc/security/limits.conf
grid soft nproc 2047
grid hard nproc 16384
grid soft nofile 1024
grid hard nofile 65536
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
vi /etc/pam.d/login
session required pam_limits.so
Creat e t he required direct ories for t he Oracle soft ware:
# to know if there is an existing oracle inventory
# from its output, ORACLE_BASE will be parent of oraInventory
more /etc/oraInst.loc
# to identify existing Oracle home directories
more /etc/oratab
# Oracle Inventory Directory
# as a root
Page 414 Oracle DBA Code Examples
mkdir -p /u01/app/oraInventory
chown -R grid:oinstall /u01/app/oraInventory
chmod -R 775 /u01/app/oraInventory
# Grid Infrastructure Home Directory
mkdir -p /u01/11.2.0/grid
chown -R grid:oinstall /u01/11.2.0/grid
chmod -R 775 /u01/11.2.0/grid
# Oracle Base Directory
mkdir -p /u01/app/oracle
#needed to ensure that dbca is able to run after the rdbms installation
mkdir /u01/app/oracle/cfgtoollogs
chown -R oracle:oinstall /u01/app/oracle
chmod -R 775 /u01/app/oracle
# Oracle RDBMS Home Directory
mkdir -p /u01/app/oracle/product/11.2.0/db_1
chown -R oracle:oinstall /u01/app/oracle/product/11.2.0/db_1
chmod -R 775 /u01/app/oracle/product/11.2.0/db_1
Shut down t he Vmware machine t hen edit t he VMware file ( wit h vmx ext ensions) and add
t he following ent ry t o allow sharing t he disks ( make sure t he scsi cont roller number is t he
one you used) :
disk.locking = "FALSE"
diskLib.dataCacheMaxSize = "0"
diskLib.dataCacheMaxReadAheadSize = "0"
diskLib.dataCacheMinReadAheadSize = "0"
diskLib.dataCachePageSize = "4096"
scsi1.sharedBus = "virtual"
scsi1:1.deviceType = "disk"
scsi1:2.deviceType = "disk"
scsi1:3.deviceType = "disk"
St art up t he machine t hen part it ion t he disks:
Not e: On a real life st orage, you would creat e a single whole- disk part it ion wit h exact ly 1 MB
offset on each LUN t o be used as ASM Disk. I n fdisk: u ( t o change unit s from cylinder t o
sect ors) , n, p, 1, 2048, w.
# as a root, for the disks /dev/sdb .. /dev/sdd
# confirm they are seen:
ls /dev/sd*
#partition the disks:
fdisk /dev/sdb
# answers: "n", "p", "1", "Return", "Return", "p" and "w"
Note: if the following message appears after the "w" command:
WARNING: Re-reading the partition table failed with error 16: Device or
resource busy, then you can avoid restarting the machine by the following
command: partprobe
# to make sure partions are created
ls -lX /dev/sd*
Configure ASM drivers:
Not e: I f you see t hat t he shared disks are not synced bet ween rac1 and rac2, one of t he
t hings you can examine is t o see if t here is any "debug" command in any of t he nodes'
Page 415 Oracle DBA Code Examples
vmx files. I f you find one, shut down t he node, remove t he command from t he vmx file and
rest art .
# as root (to be done in all nodes)
oracleasm configure -i
Default user to own the driver interface []: grid
Default group to own the driver interface []: asmdba
Start Oracle ASM library driver on boot (y/n) [n]: y
Fix permissions of Oracle ASM disks on boot (y/n) [y]: y
Writing Oracle ASM library driver configuration: [ OK ]
Creating /dev/oracleasm mount point: [ OK ]
Loading module "oracleasm": [ OK ]
Mounting ASMlib driver filesystem: [ OK ]
Scanning system for ASM disks: [ OK ]
# Load the kernel module using the following command:
/usr/sbin/oracleasm init
# If you have any problems, make sure you have the correct
# version of the driver:
/usr/sbin/oracleasm update-driver
# mark the shared disks: (one node)
/usr/sbin/oracleasm createdisk DISK1 /dev/sdb1
/usr/sbin/oracleasm createdisk DISK2 /dev/sdc1
/usr/sbin/oracleasm createdisk DISK3 /dev/sdd1
# check the disks are marked and seen:
/usr/sbin/oracleasm listdisks
# in other nodes:
/usr/sbin/oracleasm scandisks
/usr/sbin/oracleasm listdisks
#If you need to unmark a disk that was used in a createdisk command:
/usr/sbin/oracleasm deletedisk DISK1
/usr/sbin/oracleasm deletedisk DISK2
/usr/sbin/oracleasm deletedisk DISK3
Disable screensavers on host & guest machines.
o I n Oracle Linux: Applicat ions- > Preferences- > Screen Saver
o Do t he same aft er logging off and logging on again as oracle and grid user.
Shut down rac1
Copy t he folder cont aining rac1 int o a new folder in t he same direct ory st ruct ure level.
Let ' s name it "rac2". This will be t he second node in t he clust er.
Edit t he VMware file of rac1 and edit t he following: displayName = "rac2"
Open rac2, t hen perform:
o in a t erminal issue: syst em- config- net work- gui.
o Remove t he devices wit h t he "%.bak" nicknames. To do t his, highlight a device,
deact ivat e, t hen delet e it .
o Highlight t he "et h0" int erface and click t he "Edit " but t on. Change it s I P addresses and
gat e way: I P 192. 0. 2. 101. Click on t he "Hardware Device" t ab and click t he "Probe"
but t on.
Page 416 Oracle DBA Code Examples
o For et h1 set it s ip address t o 172. 0. 2. 101. Do not define a gat eway.
o I n DNS t ab, change host name t o rac2.mydomain. com.
o Act ivat e t he net work cards.
I n rac2, perform:
# change the variable in the file
vi /home/oracle/.bash_profile
ORACLE_SID=RAC2; export ORACLE_SID
ORACLE_HOSTNAME=rac2.localdomain; export ORACLE_HOSTNAME
St art rac1. Make sure t he machines can see each ot her:
ping -c 3 rac1
ping -c 3 rac1-priv
ping -c 3 rac2
ping -c 3 rac2-priv
2. Or acl e Gr i d I nf r ast r uct ur e i nst al l at i on
# in rac1: copy the software in a staging folder
mkdir -p /u01/app/stage/ora11gr2gridinfra
chown -R grid:oinstall /u01/app/stage/ora11gr2gridinfra
chmod -R 775 /u01/app/stage/ora11gr2gridinfra
mkdir -p /u01/app/stage/ora11gr2db
chown -R oracle:oinstall /u01/app/stage/ora11gr2db
chmod -R 775 /u01/app/stage/ora11gr2db
# in all nodes, make sure the asm disks are accessible:
/usr/sbin/oracleasm scandisks
/usr/sbin/oracleasm listdisks
# do not use cluvfy because SSH was not configured.
# lunch OUI from the clusterware ( as grid from rac1)
# if logged in in Genome using another user, log out and log in as grid
cd /u01/app/stage/ora11gr2gridinfra
./runInstaller
Installation Option
>Select radio button 'Install and Configure Grid Infrastructure for a Cluster'
>Next
Installation Type
>Select 'Advanced Installation'
>Next
Product Language
>Accept 'English' as language'
>Next
Grid Plug and Play
>cluster name: rac
>SCAN name:rac-scan.mydomain.com
>Make sure 'Configure GNS' is NOT selected
>Next
Page 417 Oracle DBA Code Examples
Cluster Node Information
>Add button
>Hostname:rac2.mydomain.com
>Virtual IP Name: rac2-vip.mydomain.com
>OK
>"SSH Connectivity" button
>Enter the password
>Setup button
>Test button
Network Interface Usage
>check the public and private networks are specified correctly
>Next
Storage Option
>Select 'Automatic Storage Management (ASM)'
>Next
Creat ASM Disk Group
>Disk Group Name: DGOCRVOTE (3GB disk: Disk1)
>Redundancy: external
>Next
NOTE: If you see an empty screen for you candidate disks it is likely that
ASMLib has not been properly configured. Try reconfigure them.
If you are sure that ASMLib has been properly configured click on 'Change
Discovery Path' and provide the correct destination.
ASM Password
>Specify and conform the password you want to use
>Next
Failure Isolation Support
>Select NOT to use IPMI
>Next
Privileged OS Groups
>Assign the correct OS groups for OS authentication (mostly default is OK)
>Next
Installation Location
>ORACLE_BASE: /u01/app/oracle
Software location: /u01/11.2.0/grid
>Next
Create Inventory
>Specify the locations: /u01/app/oraInventory
>Next
Perform Prerequisite Checks
>OUI performs certain checks
>Check that status of all checks is Succeeded
Note: in this example, NPS error can be ignored
>Next
Summary
>Finish
Page 418 Oracle DBA Code Examples
Execute Configuration Scripts
>Run the scripts as instructed in the screen
Note: The scripts must be run on one node at a time.
>OK
We expect the verification phase to fail with an error relating to the SCAN,
assuming you are not using DNS.
INFO: Checking Single Client Access Name (SCAN)...
INFO: Checking name resolution setup for "rac-scan.localdomain"...
INFO: ERROR:
INFO: PRVF-4664 : Found inconsistent name resolution entries for SCAN name
"rac-scan.localdomain"
INFO: ERROR:
INFO: PRVF-4657 : Name resolution setup check for "rac-scan.localdomain"
(IP address: 192.168.2.201) failed
INFO: ERROR:
INFO: PRVF-4664 : Found inconsistent name resolution entries for SCAN name
"rac-scan.localdomain"
INFO: Verification of SCAN VIP and Listener setup failed
Provided this is the only error, it is safe to ignore this
>Next
Message: The installation of the Grid Infrastructure was successfull.
>Close
Note: If your OS is SUSE Linux, shutting down on node will result in shutting
the other nodes. To workaround:
#cd /etc/rc3.d
#ln -s /etc/init.d/ohasd K07ohasd
3. Or acl e Gr i d I nf r ast r uct ur e Pat chi ng
Apply patch set, if there is any.
4. Or acl e Dat abase 11g R2 Sof t w ar e I nst al l at i on
# make sure all clusterware processes are running
/u01/crs/bin/crs_stat -t
# as oracle
./runInstaller
Configure Security Updates
>Provide your e-mail address, if you want
>Next
Installation Options
>Select 'Install Database software only'
>Next>
Install Type
>Select 'Real Application Clusters database installation', and select all
nodes.
>Use the 'SSH Connectivity' button to configure/test the passwordless SSH
connectivity.
>Next
Page 419 Oracle DBA Code Examples
Product Languages
>Confirm 'English'
>Next
Database Edition
>'Enterprise Edition' is ticked
>Next
Installation Location
>Oracle Base: /u01/app/oracle
Software Location: /u01/app/oracle/product/11.2.0/db_1
>Next
Privileged OS Groups
>OSDBA: dba
>OSOPER: oinstall
>Next
Prerequisite Checks
..OUI performs prerequisite checks
>Check that status of all checks is Succeeded
>If you are sure the unsuccessfull checks can be ignored tick the box 'Ignore
All'
>Next
Summary
>Check summary info
>Finish
Install Product
..OUI installs the db software
>as a root, run the root.sh script on the first node then the other nodes (One
at a time)
>OK
Finish
>Close
5. Or acl e Dat abase 11g R2 Sof t w ar e Pat chi ng
6. I nst al l EM Agent i n cl ust er nodes ( i f r equi r ed)
7. ASM Di sk gr oups Cr eat i on
Not e: I t is Oracle's Best Pract ise t o have an OCR mirror st ored in a second disk group. To
follow t his recommendat ion add an OCR mirror. Mind t hat you can only have one OCR in a
diskgroup. To add OCR mirror t o an Oracle ASM disk group, ensure t hat t he Oracle
Clust erware st ack is running and
ocrconfig -add +ORADATA
ocrcheck
# as grid user: start the ASM Configuration Assistant (ASMCA)
#su - grid
cd /u01/11.2.0/grid/bin
Page 420 Oracle DBA Code Examples
./asmca
>Disk Groups tab
>Create button
>Disk Group Name: DGDATA
>Redundancy: External
>Disk2
>OK
>Create button
>Disk Group Name: DGFLASH
>Redundancy: External
>Disk3
>OK
>Exit
>Yes
8. RAC Dat abase Cr eat i on
# as oracle
cd /u01/app/oracle/product/11.2.0/db_1/bin
./dbca
Welcome
Select 'Oracle Real Application Clusters database'
>Next
Operations
> choose option 'Create a Database'
>Next
Database Template
>Select General Purpose or any template
>Next
Database Identification
>Configuration Type: Admin
>Globale Database Name: rac
>SID: rac
>Select All button
>Next
Management Options
>Select the option you want
>Next
Database Credentials
>Set the password(s)
>Next
Database File Locations
>Database Area: +DGDATA
>Practically (but not in this case), you should define 'Multiplex Redo Logs
and Control Files'.
>Next
ASM Credentials
Page 421 Oracle DBA Code Examples
..If you chose to set up EM, you will be asked about ASMSNMP password
>Enter the password
>Ok button
Recovery Configuration
>Flash recovery area: +DGFLASH
>define the size: 2000 MB
If the size is smaller than recommended a warning will popup.
>Enable Archiving
>Next
Database Content
>Select if you want to have sample schemas created in your database
>Next
Initialization Parameters
>Review and change the settings for memory allocation, characterset etc.
>Next
Database Storage
>Review the database storage settings and change as required
>Next
Creation Options
>Make sure the tickbox 'Create Database' is ticked
>Finish
Summary
>OK
.. Database creation proceeding
>after completion Exit
# Confirmation
# to show the current configuration and status of the RAC database
srvctl config database -d rac
# check OEM (if configured):
https://rac1.mydomain.com:1158/em/
# if not started, you can start it:
su - oracle
cd /u01/app/oracle/product/11.2.0/db_1/bin
export ORACLE_UNQNAME=rac
./emctl status dbconsole
# check Oracle processes:
ps -eo pid -o command | grep ora_ | grep -v grep
9. Post i nst al l at i on t ask s
# backup the root.sh script (on all nodes)
cp /u01/app/oracle/product/11.2.0/db_1/root.sh ~/root.sh.bak
10. Gener al Usef ul Post i nst al l at i on Task s i n Li nux
Following are t ips t o consider aft er t he successful inst allat ion t o make managing RAC
easier.
Page 422 Oracle DBA Code Examples
Consider using rlwrap ut ilit y wit h SQL* Plus and RMAN:
o Using rlwrap Ut ilit y wit h RMAN in Unix- Based Syst ems
o Using rlwrap Ut ilit y wit h SQL* Plus in Unix- Based Syst ems
/* Make crs_stat -t more readable */
/* copy the following script into ~/scripts/crstat.sh */
#!/usr/bin/ksh
#
# Sample 10g CRS resource status query script
#
# Description:
# - Returns formatted version of crs_stat -t, in tabular
# format, with the complete rsc names and filtering keywords
# - The argument, $RSC_KEY, is optional and if passed to the script, will
# limit the output to HA resources whose names match $RSC_KEY.
# Requirements:
# - $ORA_CRS_HOME should be set in your environment
# suggested scrip name: crstat.sh
RSC_KEY=$1
QSTAT=-u
AWK=/usr/bin/awk # if not available use /usr/bin/awk
# Table header:echo ""
$AWK \
'BEGIN {printf "%-45s %-10s %-18s\n", "HA Resource", "Target", "State";
printf "%-45s %-10s %-18s\n", "-----------", "------", "-----";}'
# Table body:
$ORA_CRS_HOME/bin/crs_stat $QSTAT | $AWK \
'BEGIN { FS="="; state = 0; }
$1~/NAME/ && $2~/'$RSC_KEY'/ {appname = $2; state=1};
state == 0 {next;}
$1~/TARGET/ && state == 1 {apptarget = $2; state=2;}
$1~/STATE/ && state == 2 {appstate = $2; state=3;}
state == 3 {printf "%-45s %-10s %-18s\n", appname, apptarget, appstate;
state=0;}'
# then add the following in the .bashrc of oracle user
# if the file was saved in ~/scripts/crstat.sh
alias crstat='~/scripts/crstat.sh'
/* Easy Acces to crs and db homes */
# it is common to access bin directories in clusterware and db homes
# add the following to .bashrc of oracle user
alias db='cd /u01/app/oracle/product/11.2.0/db_1/bin'
# add the following to .bashrc of grid user
alias crs='cd /u01/app/oracle/crs/bin'
Page 423 Oracle DBA Code Examples
I nst al l i ng Or acl e 10g R2 RAC on Wi ndow s
Not e: The met alink document RAC St art er Kit and Best Pract ices (Windows) [ I D 811271. 1] is
a good source reference for t his t ask.
I nst al l at i on Met hods
NTFS_RAW_ASM (shown in t his document )
NTFS_RAW_RAM
NTFS_OCFS_OCFS
I nst al l at i on Envi r onment
Emulat ion soft ware: VMWare Server 2 for Windows.
RAC Nodes: 2 nodes
OS: Windows 2003 Server St andard Edit ion 32-bit SP2
Requi r ed Sof t w ar e
Oracle 10g R2 Clust erware for Windows 32-bit
Oracle Dat abase 10g Release 2 for Windows 32- bit
Used Vi r t ual Har dw ar e
I n t he VMWare: creat e one virt ual machine ( rac1) wit h t he following specs:
o 2 GB RAM
o t wo et hernet cards: bot h can be configured as bridged or host - only in VMware.
o one local hardisk wit h 20 GB on cont roller SCI SI 0: 0.
o CPU Count : 2
o creat e a folder in t he same direct ory st ruct ure level as t he parent folder cont aining t he
creat ed virt ual machine. Give it a meaningful name like ' shared_disks' . Creat e in t hat
folder t wo disks of 10 GB and t wo of 512 MB each. All of t hem are of LSI Logic t ype and
SCI SI Persist ent . Make sure t hey are on SCI SI cont roller different from t he SCSI 0. For
example, set t hem on SCSI 1.
Page 424 Oracle DBA Code Examples
I nst al l at i on Pl an
1. Preinst allat ion t asks
2. Oracle Clust erware inst allat ion
3. Apply Pat ch Set 3 ( 10.2. 0.4) on Clust erware soft ware
4. Oracle ASM 10g Soft ware I nst allat ion
5. Apply Pat chset 3 ( 10. 2. 0. 4) on ASM soft ware
6. I nst all EM Agent in clust er nodes ( if required)
7. Configure List eners
8. Creat e ASM I nst ance
9. I nst all Oracle RAC Dat abase Home Soft ware
10. Apply Pat chset 3 ( 10. 2. 0. 4) on Oracle RAC Soft ware Home
11. Perform clust er dat abase creat ion
12. Useful post inst allat ion st eps
1. Pr ei nst al l at i on t ask s
The local admin username and password must be t he same on bot h nodes.
Give t he first et hernet card I P 192.168. 4. 11 and t he second 192. 168. 0. 11. Define a
gat eway. I f it does not exist , make it same as t he host I P address.
Not e: Gat eway must be defined and it s I P must be alive.
Set t he host name t o rac1.mydomain.com ( Deskt op-> right click My Comput er- >
Propert ies- > Comput er Name- > Change-> t ype comput er name: rac1 - > More- > t ype
Primary DNS Suffix: mydomain.com
Page 425 Oracle DBA Code Examples
/* Prepare the raw disks */
# enable raw disk auto mounting
diskpart
AUTOMOUNT ENABLE
exit
# then reboot
# start disk management
start-> run-> type: diskmgmt.msc-> Disk Initialization Wizard pops up->
Next->
mark all disks (1-4) to initialize->
make sure all disks are unmarked Next-> Finish
# all disks must be in Basic mode (not dynamic)
right click Disk1-> New Partition-> Next->
select the Extended partition radio button-> Next->
select the partition size to fill the disk-> Next-> Finish
right click on the partition and select the "New Logical Drive" -> Next->
Accept the default partition size Next->
select the "Do not assign a drive letter or drive path" option->
Next->
select the "Do not format this partition" option-> Next-> Finish
Repeat the previous partitioning steps for the remaining disks.
/* Time Sync */
-- make sure the time is synched in Vmwaretools
-- in Windows, in Date and Time Settings, there is an option "Automatically
syn with Internet Server" which can be configured, if connected to Web
Creat e t he required net work configurat ion ( rac2 will be creat ed lat er) :
# Network names Resolution
# if no domain server is used (both nodes)
notepad C:\WINDOWS\system32\drivers\etc\hosts
127.0.0.1 localhost
#Public
192.168.4.11 rac1.mydomain.com rac1
192.168.4.12 rac2.mydomain.com rac2
#VIP
192.168.4.13 rac1-vip.mydomain.com rac1-vip
192.168.4.14 rac2-vip.mydomain.com rac2-vip
#Inter-connect
192.168.0.11 rac1-priv.mydomain.com rac1-priv
192.168.0.12 rac2-priv.mydomain.com rac2-priv
Disable Windows Media Sensing, which allows Windows t o uncouple an I P address from a
card when t he link t o t he local swit ch is lost :
in the registry:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters
Add the following registry entry to the Parameters subkey:
Name: DisableDHCPMediaSense
Data type: REG_DWORD (Boolean)
Value: 1
Open t he "Net work Connect ions" screen (St art > All Programs > Accessories >
Communicat ions > Net work Connect ions) . Rename t he t wo connect ions t o "public" and
"privat e" respect ively, making sure you apply t he names t o t he appropriat e connect ions.
Page 426 Oracle DBA Code Examples
Ensure t he public int erface is first in t he bind order:
o Open t he "Net work Connect ions" dialog by right -clicking on t he "My Net work Places"
icon and select ing t he "Propert ies" menu opt ion.
o Select t he "Advanced > Advanced Set t ings. .. " menu opt ion.
o On t he "Adapt ers and Bindings" t ab, make sure t he public int erface is t he first
int erface list ed. Ot herwise, promot e it .
Disable screensavers
Shut down rac1
Edit t he VMware file ( wit h vmx ext ensions) and add t he following ent ry t o allow sharing
t he disks:
disk.locking = "FALSE"
diskLib.dataCacheMaxSize = "0"
diskLib.dataCacheMaxReadAheadSize = "0"
diskLib.dataCacheMinReadAheadSize = "0"
diskLib.dataCachePageSize = "4096"
diskLib.maxUnsyncedWrites = "0"
scsi1.sharedBus = "virtual"
scsi1:1.deviceType = "disk"
scsi1:2.deviceType = "disk"
scsi1:3.deviceType = "disk"
scsi1:4.deviceType = "disk"
scsi1:5.deviceType = "disk"
Copy t he folder cont aining rac1 int o a new folder in t he same direct ory st ruct ure level.
Let ' s name it "rac2". This will be t he second node in t he clust er.
Edit t he VMware file of rac1 and edit t he following: displayName = "rac2"
St art rac2 t hen change it ' s I P addresses: I P 192. 168.4. 12 and 192. 168. 0. 12. I t ' s
host name t o rac2. mydomain.com. Modify t heir default gat eway accordingly.
Change host name t o rac2 and rest art t he virt ual machine.
St art rac1 and make sure it can ping rac2.
Perform Net Use t est , t o make sure files can be t ransfered:
# on rac1
net use \\rac2\c$
# on rac2
net use \\rac1\c$
Not e: The environment variables TMP & TEMP must point t o t he same direct ory in all RAC
nodes, which is t he case here.
St age Oracle soft ware (Clust erware, DB and pat ch set ) in rac1.
Run t he CVU t o check t he st at e of t he clust er prior t o t he inst all of t he Oracle Soft ware.
The messages ' The syst em cannot find t he file specified' and 'Could not find a suit able set
of int erfaces for VI Ps' can be ignored.
C:\temp\OracleClusterware\cluvfy>runcluvfy stage -post hwos -n rac1,rac2
C:\..\cluvfy>runcluvfy stage -pre crsinst -n rac1,rac2 -verbose
2. Or acl e Cl ust er w ar e i nst al l at i on
if you are using t erminal services t o perform t he inst allat ion, be sure t o invoke t he
t erminal services in ' console' mode:
mstsc -v:servername /F /console
Page 427 Oracle DBA Code Examples
OR, for some ( newer) versions of Windows:
mstsc -v:servername /F /admin
/* Stop Interrupting Services on both nodes */
# the MSDTC service may interrupt installation process
# it can be started after installation
stop the service: Distributed Transaction Coordinator
# lunch OUI from the clusterware software (on rac1)
cd C:\temp\OracleClusterware\
./setup.exe
>Welcome messge
>Next
>enter Home Details
OraCr10g
C:\oracle\product\10.2.0\crs
>Product-Specific Prerequisite Checks
They all should succeed
>Specify Cluster Configuration
Select 'Add' and add the details for node rac2. Enter all details
>OK
rac2.mydomain.com
rac2-priv.mydomain.com
rac2-vip.mydomain.com
>Next
>Specify Network Interface Usage
set the Public interface (subet net 192.168.4.*)
>Ok
>Specify Oracle Cluster Registry (OCR) Location
>Highlight disk 1 and click the "Edit"
>select the "Place OCR(Primary) on this Partition" option >OK
>Highlight disk 2 and click the "Edit"
>Select the "Place Voting Disk on this Partition" option >OK
>Next and ignore the redundancy warnings
>OK
>Summary
>Install
>Wait while the configuration assistants run
If the Configuration Assistant fails, there is a problem that must be fixed
before proceeding. Metalink documents might help: 356535.1, 310791.1
VIPCA should fails, just click the "OK" button on the resulting error screen
>Next button and accept the subsequent warning
>Exit
On the RAC1 virtual machine, run the VIPCA manually:
cd c:\oracle\product\10.2.0\crs\bin
vipca.bat
Page 428 Oracle DBA Code Examples
>Welcome
>Next
>Highlight the "public" interface
>Next
>Enter the virtual IP alias and address for each node: rac1-vip.mydomain.com
Once you enter the first alias, the remaining values should default
automatically
>Next
>Summary
>Finish
# To verify the installation:
cd C:\oracle\product\10.2.0\crs\BIN
-- 1
cluvfy stage -post crsinst -n rac1,rac2
-- 2
ping rac1-vip
ping rac2-vip
-- 3
crsctl check crs
-- 4
# check status of crs daemon processes (ALL NODES)
crs_stat -t
Name Type Target State Host
------------------------------------------------------
ora.rac1.gsd application ONLINE ONLINE rac1
ora.rac1.ons application ONLINE ONLINE rac1
ora.rac1.vip application ONLINE ONLINE rac1
ora.rac2.gsd application ONLINE ONLINE rac2
ora.rac2.ons application ONLINE ONLINE rac2
ora.rac2.vip application ONLINE ONLINE rac2
# if State of any of them is UNKNOWN, try restarting the deamons
crsctl stop crs
# then start again
crsctl start crs
3. Appl y Pat ch Set 3 ( 10. 2. 0. 4) on Cl ust er w ar e sof t w ar e
There is a bug in Oracle Clust erware 10. 2. 0. 1 in which somet ime CRSS service is unable t o
access OCR disk. This issue is addressed by Pat ch Set 3. Therefore, t o avoid any possible
problem by t his issue, you should apply t he Pat ch Set at t his st age.
# (1) Apply the patch on clusterware
# in ALL NODES
# Stop the following services and make their startup type Manual (if
running):
Oracle Object Service
OracleClusterVolumeService
OracleCRService
OracleCSService
OracleEVMService
Page 429 Oracle DBA Code Examples
Open task manager and kill ons processes, if there is any.
# if any of the services is hang, you can change the startup type from regedit
then reboot (don't forget to stop the Distributed Transaction service after
reboot) :
HKEY_LOCAL_MACHINE -> SYSTEM -> CurrentControlSet -> Services ->
OracleCSService -> Select (Start) -> Edit -> Specify 3 in Value
# in RAC1: start oui
cd C:\temp\Patchset_10204\Disk1>
setup.exe
Welcome
>Next
>select Oracle Clusterware home
>Next
>Confirm nodes >Next
>Checking should pass >Next
>Summary
>Install
>Exit
# update the nodes
# make sure all related Oracle services are stopped, otherwise stop them
# apply the batch in node1 then node2:
C:\oracle\product\10.2.0\crs\install\patch102.bat
# it should end with the following message:
Successful upgrade of this node to Oracle Cluster Ready Services
# Oracle Process Manager service will automatically be installed
# check the updated verion
crsctl query crs activeversion
# then check status of deamons
crs_stat -t
# change the startup mode of the serives to AUTOMATIC
# startup Distributed Service, if it was stopped.
4. Or acl e ASM 10g Sof t w ar e I nst al l at i on
# make sure all clusterware processes are up and running
cd C:\oracle\product\10.2.0\crs\BIN
crs_stat -t
-- in rac1: start OUI
cd C:\temp\OracleDB10gR2
setup.exe
Welcome
>Next
Select Installation Type
>Next
Page 430 Oracle DBA Code Examples
Install Location
>Oracle Home name: OraDb10g
>Oracle Home location: C:\oracle\product\10.2.0\db_1
>Next
Specify Hardware Cluster Installation Mode
>select both nodes
>Next
Product-Specific Prerequisite Checks
All pre-requisite steps should complete successfully.
>Next
Select Configuration Option
>Install Software Only
>Next
Summary
>Finish
End of Installation
>Exit
Optionally, check and modify, if you wish, NLS_LANG in regedit.
5. Appl y Pat chset 3 ( 10.2. 0. 4) on ASM Sof t w ar e
Not e: This is t he pat chset applied for t his environment . Generally speaking, if t here is a newer
version, use it inst ead of t his version. I n all cases, same pat ch set applied t o Oracle soft ware
must also be applied t o Clust erware first .
#Apply the patch on DB software
# in RAC1: start oui
cd C:\temp\Patchset_10204\Disk1>
setup.exe
Welcome
>Next
>select Oracle Database home
>Next
>Confirm nodes >Next
>Checking should pass >Next
>Summary
>Install
>Exit
# not required, but recommended:
restart the nodes
6. I nst al l EM Agent i n cl ust er nodes ( i f r equi r ed)
7. Conf i gur e Li st ener s
# Run netca (not netmanager which is not clusteraware) from any node
cd C:\oracle\product\10.2.0\db_1\bin
netca.bat
Page 431 Oracle DBA Code Examples
>Select Cluster configuration and select both nodes.
>Configure Listener
>Configure Naming Methods: Local and Easy Connect
After installing listener check with below commands whether listener working
properly
C:\oracle\product\10.2.0\crs\bin\crs_stat -t
8. Cr eat e ASM I nst ance
# in rac1
cd C:\oracle\product\10.2.0\db_1\bin
dbca.bat
Welcome
Keep the default selection Oracle RAC database
>Next
Operations Select
>Configure ASM >Next
Node Selection
>Select ALL the nodes >Next
Create ASM Instance
Select a SYS password for the ASM instance.
Select IFILE parameter file to create
>Next
>OK (asm instances will be created)
# here's an issue faced in a case after creating the ASM instances:
# check that the Administrator (or the OS you're using) belong to ora_dba
# group in ALL the Nodes. If not there, add the user to the group.
# Stamp the disks for ASM
>Create New
>Stamp Disks
>Select the "Add or change label" option
>Next
>select the first Disk of size 10G
>type DATA in the prefix text field (don't type ASM)
>Next >Next >Finish
>stamp the second 10g disk: repeat above for the second disk
rac2 should see the changes:
asmtool -list
Note: if you want to clean the disk to redo the procedure above, you can:
(1) in rac1: DISKPART, select <DISK NAMe>, clean all, create part ext, create
part log
(2) in rac2: remove letter drive assigned to the partition
# create ASM Disk Groups
>Enter dgdata1 as the first disk group name.
>Set redundancy settings to External
Page 432 Oracle DBA Code Examples
>select the disk ORCLDISKDATA0
>Ok
Select Create New again to add another disk group named as dgfra. This group
will be used as the recovery arae
>OK
>Finish to complete.
Note: in an environment, I kept receiving ORA-15063 error. After making sure
that all the pre-requisits were applied, the issue was resolved by allocating
all the disk space at disk creation time.
# An ASM instance will be created in every node named as ASMn
set ORACLE_SID=ASM1
sqlplus /nolog
SQL>conn / as sysdba
select name from v$asm_diskgroup ;
...
9. I nst al l Or acl e RAC Dat abase Home Sof t w ar e
# make sure all clusterware processes are up and running
cd C:\oracle\product\10.2.0\crs\BIN
crs_stat -t
-- in rac1: start OUI
cd C:\temp\OracleDB10gR2
setup.exe
Welcome
>Next
Select Installation Type:
Enterprise Edition
>Next
Install Location
>Oracle Home name: OraDb10g2
>Oracle Home location: C:\oracle\product\10.2.0\db_2
>Next
Specify Hardware Cluster Installation Mode
>select both nodes
>Next
Product-Specific Prerequisite Checks
All pre-requisite steps should complete successfully
>Next
Upgrade an Existing Database
>select No
>Next
Select Configuration Option
>Install Software Only
>Next
Page 433 Oracle DBA Code Examples
Summary
>Finish
End of Installation
>Exit
Optionally, check and modify, if you wish, NLS_LANG in regedit.
10. Appl y Pat chset 3 ( 10. 2.0.4) on Or acl e RAC Sof t w ar e Home
#Apply the patch on DB software
# in RAC1: start oui
cd C:\temp\Patchset_10204\Disk1>
setup.exe
Welcome
>Next
>select Oracle RAC Database home
>Next
>Confirm nodes >Next
Oracle Configuration Manager
you can setup the Oracle Configuration Manager
>Checking should pass >Next
>Summary
>Install
>Exit
11. Per f or m cl ust er dat abase cr eat i on
# in rac1: from Oracle Database home (not ASM)
c:\oracle/product/10.2.0/db_2/bin\dbca
Create Oracle RAC Database
'Next' to continue
Operations
Select Create a Database.
'Next' to continue.
Node
Select all the nodes
'Next' to continue.
Database Templates
Select the required template: like "General Purpose"
'Next' to continue.
Database Identification
Enter rac as the global database name.
'Next' to continue.
Management Options
Keep the default settings "Configure Database Control for Configure Enterprise
Manager" selected,
Keep "Enable Alert Notifications" and "Enable Daily Disk Backup to Recovery
Area" deselected.
'Next' to continue
Page 434 Oracle DBA Code Examples
Database Credentials
Select Use the same Administrative Password for All Accounts and enter a
password.
'Next' to continue
Storage Options
Select ASM for storage
'Next' to continue
ASM Disk Groups
Select the disk groups dgdata1
'Next' to continue
Database File Locations
Keep the default Use Oracle-Managed Files.
Make sure +DGDATA1 is entered as the Database Area.
'Next' to continue
Recovery Configuration:
Select Specify Flash Recovery Area and enter +DGFRA as the Flash Recovery
Area. Set its size.
Select Enable archiving and click on the Edit Archive Mode Parameters button
and make sure the Flash Recovery area is pointing to +DGFRA
'OK' and then
'Next' to continue.
Database Content
Select Sample Schemas if you want to install them.
Click 'Next'
Database Services:
Click Add button and enter Service Name such as: hrserv then click 'OK'
Make sure it's set to 'Preferred' in both nodes and select Basic for TAF.
Click 'Next'
Initialization Parameters:
Memory Size to 70%. You can leave all other settings as is.
'Next' to continue
Database Storage
Here you can review the placement of various database files
'Next' to continue
Creation Options
Select Generate database creation scripts if you want to review these at a
later stage.
'Finish' to review the installation.
Summary
Select Ok to close the review page and
'OK' to start the installation.
Once database creation is done a summary screen will be displayed.
Copy the OEM URL into clipboard. Save it in a file or the Internet Browser
'Exit' to exit the OUI.
Page 435 Oracle DBA Code Examples
12. Usef ul Post i nst al l at i on St eps
Following are t ips t o consider aft er t he successful inst allat ion t o make managing RAC
easier.
# Create links to Oracle crs and database homes.
notepad C:\WINDOWS\system32\crs.bat
cd /d C:\oracle\product\10.2.0\crs\BIN
notepad C:\WINDOWS\system32\db.bat
cd /d C:\oracle\product\10.2.0\db_2\BIN
notepad C:\WINDOWS\system32\asm.bat
cd /d C:\oracle\product\10.2.0\db_1\BIN
Page 436 Oracle DBA Code Examples
Cl eani ng Up Cl u st er w ar e I nst al l at i on on Wi ndow s
I f clust erware inst allat ion fails, somet imes you need t o clean up t he inst allat ion and redo
t he inst allat ion again. Following procedure j ust does t hat . The procedure applies on Oracle
10g R1, R2 and Oracle 11g R1.
1. Stop the following services on each node and set them to Manual:
OracleCSService
OracleCRService
OracleEVMService
2. To see the link names that have been assigned to, invoke the Oracle tool
<CRS_HOME>\bin\GuiOracleObjManager.exe
If you already remove the CRS_Home, you can download the tools from:
- metalink ID: 341214.1
- http://www.ahmedbaraka.com/oracle/cleanup.zip
3. If you're using RAW disks, invoke the Oracle tool logpatformat.exe to
reinitialize the headers of the disks:
run logpartformat /q <link name as shown in guioracleobjmanager tool>
For example: logpartformat /q \\.\ocrcfg
Repeat this step for all link names listed in guioracleobjmanager)
4. If you're using OCFS:
navigate to CRS_HOME\bin\
run logpartformat /q <DRIVELETTER>:
For example: logpartformat /q P:
5. Remove all the assigned link names using the GUIOracleobjmanager.exe tool
by clicking:
Placing a check mark in the check box for the given partition, then
choosing 'Commit' from the 'Options' menu.
6. Remove and recreate your logical drives on top of extended partitions from
Windows Disk Management.
7. Use the OUI to remove the software from the CRS home
8. Remove Oracle binaries using Windows explorer, both the CRS home and the
files located in: c:\program files\oracle
9. Check the registry on each node and ensure that the following services have
been removed from (remove them, if not):
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
and
HKEY_LOCAL_MACHINE\SYSTEM\ControlSetXXX\Services
Services to be removed include:
ocfs
OracleCSService
Page 437 Oracle DBA Code Examples
OracleEVMService
OracleCRService
OracleObjectService
OracleClusterVolumeService
OraFenceService
10. Using Windows explorer, remove the following driver files from:
%systemroot%\windows\system32\drivers:
ocfs.sys
orafencedrv.sys
orafenceservice.sys
11. Reboot all servers in your RAC configuration
Page 438 Oracle DBA Code Examples
Si ngl e I nst an ce t o RAC Conv er si on
The Tool s t o Conver t a Si ngl e I nst ance DB t o RAC
DBCA: enables moving from host t hat will not be part of t he RAC
rconfig ut ilit y: t he single inst ance db host will be part of t he RAC
Ent erprise Manager
Conver si on Pr er equi si t es f or Or acl e 10g R2
Oracle Clust erware 10g Release 2 ( 10. 2) is inst alled, configured, and running.
Oracle Real Applicat ion Clust ers 10g Release 2 ( 10. 2) soft ware is inst alled.
The Oracle binary is enabled for RAC.
Shared st orage is available and accessible from all nodes.
User equivalence exist s for t he oracle user.
Usi ng r conf i g Ut i t l i t y
The example below applies on Oracle 10g R2.
Test rconfig before converting to RAC
#make copy of $ORACLE_HOME/assistants/rconfig/sampleXMLs/ConvertToRAC.xml
su - oracle
cd $ORACLE_HOME/assistants/rconfig/sampleXMLs/
cp ConvertToRAC.xml Ora10gToRac.xml
#edit the file: make changes as instructed in the comments
# make sure to set Convert verify = "ONLY"
# below is an example file:
xsi:schemaLocation="http://www.oracle.com/rconfig">
<n:ConvertToRAC>
<!-- Verify does a precheck to ensure all pre-requisites are met, before the
conversion is attempted. Allowable values are: YES|NO|ONLY -->
<n:Convert verify="ONLY">
<!--Specify current OracleHome of non-rac database for SourceDBHome -->
<n:SourceDBHome>/u01/app/oracle/product/10.2.0/db_1</n:SourceDBHome>
<!--Specify OracleHome where the rac database should be configured. It can be
same as SourceDBHome -->
<n:TargetDBHome>/u01/app/oracle/product/10.2.0/db_1</n:TargetDBHome>
<!--Specify SID of non-rac database and credential. User with sysdba role is
required to perform conversion -->
<n:SourceDBInfo SID="ora10g">
<n:Credentials>
<n:User>sys</n:User>
<n:Password>ora10g</n:Password>
<n:Role>sysdba</n:Role>
</n:Credentials>
Page 439 Oracle DBA Code Examples
</n:SourceDBInfo>
<!--ASMInfo element is required only if the current non-rac database uses ASM
Storage -->
<n:ASMInfo SID="+ASM1">
<n:Credentials>
<n:User>sys</n:User>
<n:Password>welcome</n:Password>
<n:Role>sysdba</n:Role>
</n:Credentials>
</n:ASMInfo>
<!--Specify the list of nodes that should have rac instances running.
LocalNode should be the first node in this nodelist. -->
<n:NodeList>
<n:Node name="rac1"/>
<n:Node name="rac2"/>
</n:NodeList>
<!--Specify prefix for rac instances. It can be same as the instance name for
non-rac database or different. The instance number will be attached to this
prefix. -->
<n:InstancePrefix>rac</n:InstancePrefix>
<!--Specify port for the listener to be configured for rac database.If
port="", alistener existing on localhost will be used for rac database.The
listener will be extended to all nodes in the nodelist -->
<n:Listener port=""/>
<!--Specify the type of storage to be used by rac database. Allowable values
are CFS|ASM. The non-rac database should have same storage type. -->
<n:SharedStorage type="ASM">
<!--Specify Database Area Location to be configured for rac database.If this
field is left empty, current storage will be used for rac database. For CFS,
this field will have directory path. -->
<n:TargetDatabaseArea>+DG1</n:TargetDatabaseArea>
<!--Specify Flash Recovery Area to be configured for rac database. If this
field is left empty, current recovery area of non-rac database will be
configured for rac database. If current database is not using recovery Area,
the resulting rac database will not have a recovery area. -->
<n:TargetFlashRecoveryArea>+DG2</n:TargetFlashRecoveryArea>
</n:SharedStorage>
</n:Convert>
</n:ConvertToRAC>
</n:RConfig>
# run the tool for testing
rconfig Ora10gToRac.xml
Usi ng DBCA
The example below t est ed on an Oracle 10g R2 for Ent erprise Linux x86 ( version 4. 5) .
The DBCA:
o Aut omat es t he configurat ion of t he cont rol file at t ribut es
o Creat es t he undo t ablespaces and t he redo logs
o Makes t he init ializat ion paramet er file ent ries for clust er- enabled environment s
o Configures Oracle Net Services, Oracle Clust erware resources, and t he configurat ion for
RAC dat abase management for use by Oracle Ent erprise Manager or t he SRVCTL ut ilit y.
Page 440 Oracle DBA Code Examples
# (1) Create a preconfigured image of your single-instance database
$ORACLE_HOME\bin\DBCA
Welcome screen
>Next
Operations screen
>Manage Templates
>Next
Template Management screen
>select "Create a database" template
>"From an existing database (structure as well as data),"
>Next
Source Database screen,
>Select the database name
>Next
On the Template Properties screen
>enter a template name in the Name field.
>enter a description of the file in the Description field
>change the template file location in the Template data file field if you want
>Next
Location of Database Related Files screen
>"Maintain the file locations," so that you can restore the database to the
current directory structure
>Finish
The DBCA generates two files: a database structure file (template_name.dbc)
and a database preconfigured image file (template_name.dfb).
#(2) Copy the preconfigured database image to node1
on rac1 as oracle
scp
oracle@192.168.4.21:/u01/app/oracle/product/10.2.0/db_1/assistants/dbca/templa
tes/Ora10gDB.* /u01/app/oracle/product/10.2.0/db_1/assistants/dbca/templates
#(3) Create the RAC DB from the supplied template
In rac1, run DBCA to create a new database.
On the DBCA Template Selection screen, use the template that you copied.
Complete the installation.
Note: When I tested this procedure, DBCA returns unclear TNS error. I let the
DBCA generate the scritp but unfortunately I then realized that the generated
script will create a singl instance database!
Page 441 Oracle DBA Code Examples
Admi ni st er i ng RAC Dat abase
Page 442 Oracle DBA Code Examples
Admi ni st er i ng Or acl e Cl u st er w ar e Componen t s
Managi ng Cl user w ar e Daemons and Pr ocesses
Di spl ayi ng Cl ust er w ar e Pr ocesses
ps -ef | grep d.bin
ps -ef | grep -E "opro|racgimon|evmd|crsd|ocssd" | grep -v grep
St ar t i ng, St oppi ng, Enabl i ng and Di sabl i ng cr s St ack
# as root
# prevent CRS from starting on a reboot
crsctl disable crs
# start crs
crsctl start crs
# enable CRS on reboot:
crsctl enable crs
# disable CRS on reboot (not stopping current stack):
crsctl disable crs
# start crs
crsctl stop crs
CSS Par amet er s
MI SSCOUNT: Represent s net work heart beat t imeout s ( 600 s)
DI SKTI MEOUT: Represent s disk I / O t imeout s out side reconfigurat ion ( 200 s) . Should
always be less t han I / O lat ency ot herwise crs may t rigger node evict ion.
# to set disktimeout:
1. Shut down Oracle Clusterware on all nodes but one.
2. As root on available node, use (where M is the I/O latency):
crsctl get css disktimeout
crsctl set css disktimeout M+1
3. Reboot available node.
4. Restart all other nodes.
# to set misscount
# same as above except:
crsctl set css misscount 300
Admi ni st er i ng Vot i ng Di sk s i n RAC
Mul t i pl ex i ng Vot i ng Di sk s
Use one vot ing disk if it is st ored on a reliable disk.
Mult iplexed copies should be st ored on independent devices.
Page 443 Oracle DBA Code Examples
Use at least t hree mult iplexed copies.
A t ypical vot ing disk configurat ion comprises bet ween t hree and five disks.
Dynami cal l y Addi ng and Removi ng Vot i ng Di sk s af t er I nst al l i ng RAC
Recommendat ion is t o use symbolic links
# if you have multiple voting disks, you can add and remove voting disks
su -
crsctl delete css votedisk /dev/raw/raw2
crsctl add css votedisk /dev/raw/raw3
# if the command doesn't work online:
su -
# in all nodes
crsctl stop crs
crsctl add css votedisk /dev/raw/raw3 -force
# in all nodes
crsctl start crs
Back i ng up Vot i ng Di sk s
Do it when you add or remove a node.
Perform it on every vot ing disk.
# Back up the voting disk (can be online)
# usually 4K block size is OK
su -
# to list voting disks currently used
crsctl query css votedisk
# backup
dd if=/dev/raw/raw2 of=~/vdisk.bak bs=4k
# on Windows use ocopy
Recov er i ng Vot i ng Di sk s
# recoverying voting disk
dd if=~/vdisk.bak of=/dev/raw/raw2
# if you have multiple voting disks,
# you can add (multiplex) and remove voting disks
su -
crsctl delete css votedisk /dev/raw/raw2
crsctl add css votedisk /dev/raw/raw2
Admi ni st er i ng t he Or acl e Cl ust er Regi st r y ( OCR)
RAC environment s do not support more t han t wo OCRs ( OCR and it s mirror)
Using mirrored OCR is opt ional but recommended when not st ored on RAI D st orage.
Not e: The ocrconfig command cannot modify OCR configurat ion informat ion for nodes t hat
are shut down or for nodes on which t he Oracle Clust erware is not running.
Page 444 Oracle DBA Code Examples
Repl aci ng t he OCR
I f you receive from ocrcheck t he message: "Device/File needs to be synchronized
with the other device", it means OCR mirror is out of sync wit h t he primary OCR. I n
t his case, replace or relocat e your failing OCR wit h a copy of t he ot her healt hy OCR.
I f it is t he primary OCR file t hat is failing, and if your OCR mirror is st ill in good healt h, you
can use t he ocrconfig replace ocr < ocrfilename>
Execut ing ocrconfig replace ocr| ocrmirror filename adds t he primary or mirror OCR file t o
your environment if it does not already exist .
Execut ing ocr conf i g r epl ace ocr | ocr mi r r or removes t he primary or t he mirror OCR.
I f you remove a primary OCR file, t he mirror OCR file becomes primary.
# 1) verify the other OCR is online
# 2) verify crs is running in the node you are using to replace OCR
crsctl check crs
crs_stat -t
# 3) run one of the following
ocrconfig -replace ocr /dev/raw/raw5
ocrconfig -replace ocrmirror /dev/raw/raw6
# 4) In any node that is stopped in your RAC
ocrconfig -repair ocrmirror /dev/raw/raw2
Addi ng and Remov i ng t he OCR
# Adding an Oracle Cluster Registry
ocrconfig -replace ocr /dev/raw/raw5
ocrconfig -replace ocrmirror /dev/raw/raw6
# Removing an Oracle Cluster Registry
# If you remove a primary OCR, then the mirrored OCR becomes the primary OCR
# to remove the ocr
ocrconfig -replace ocr
# to remove the mirrored
ocrconfig -replace ocrmirror
Repai r i ng t he OCR
You may need t o repair an OCR configurat ion on a part icular node if your OCR
configurat ion changes while t hat node is st opped.
The OCR configurat ion informat ion is st ored in:
/ et c/ oracle/ ocr. loc on Linux and AI X
/ var/ opt / oracle/ ocr. loc on Solaris and HP- UX
Regist ry key HKEY_LOCAL_MACHI NE\ SOFTWARE\ Oracle\ ocr on Windows
# Reparing an OCR (repairs only the ocr configuration info, not its itegrity)
# 1. the crs must be stopped
su -
crsctl stop crs
# 2. repair
ocrconfig -repair ocrmirror /dev/raw/raw2
# 3. start crs
crsctl start crs
Mak i ng Physi cal Back ups of t he OCR
Creat e manually copies of t he aut omat ically generat ed physical backups on daily basis.
Export t he OCR cont ent s before and aft er making significant configurat ion changes such as
adding or delet ing nodes from your environment , modifying Oracle Clust erware resources,
or creat ing a dat abase.
Page 445 Oracle DBA Code Examples
Do not perform an OCR rest ore as a correct ion t o revert t o previous configurat ions if some
of t hese configurat ion changes fail.
# backup OCR
# backup the backups that are automatically generated in ( every 4 hrs )
$CRS_HOME/cdata/CLUSTER_NAME
# the default directory can be obtained:
ocrconfig -showbackup
# it is a good idea to set the auto-backup directory to a shared storage:
ocrconfig backuploc /shared/bak
Recov er i ng t he OCR usi ng t he Physi cal Back ups
# make recovery only when you are sure there is an error in the
# ocr. use ocrcheck to check the ocr
# in unix:
# 1. Identify the OCR backups then review the contents of the backup
# backups done timings
ocrconfig -showbackup
ls -lt /u01/crs/cdata/crs/
./ocrdump -backupfile /u01/crs/cdata/crs/backup00.ocr
less OCRDUMPFILE
# 2. Stop the Oracle Clusterware software on ALL Nodes
su -
crsctl stop crs
# 3. Make sure that the OCR devices that you specify in the OCR configuration
file (/etc/oracle/ocr.loc) exist. Restore from an OCR backup file from Step 1:
ocrconfig -restore /u01/crs/cdata/crs/backup00.ocr
# 4. Restart the Oracle Clusterware on all of the nodes
su -
crsctl start crs
# 5. Verify the OCR integrity
cluvfy comp ocr -n all [-verbose]
# in Windows
# 1. Identify the OCR backups using the
ocrconfig -showbackup
ocrdump -backupfile <file_name>
# 2. On all of the remaining nodes, disable the following OCR clients:
OracleClusterVolumeService, OracleCSService, OracleCRService, and the
OracleEVMService
# 3. Apply the OCR backup file from Step 1
ocrconfig -restore c:\oracle\crs\cdata\crs\backup00.ocr
# 4. Start all of the services that were stopped in step 2. Restart all of the
nodes and resume operations in cluster mode.
# 5. Verify the OCR integrity where the -n all
cluvfy comp ocr -n all [-verbose]
Mak i ng Logi cal Back ups of t he OCR ( Expor t i ng)
Export t he OCR cont ent s before and aft er making significant configurat ion changes, such
as adding or delet ing nodes from your environment , modifying OracleClust erware
resources, or creat ing a dat abase.
# to export OCR contents (output file is a binary not-to-edit file)
ocrconfig export /u01/ocrbackup/ocr.bak
Mak i ng Logi cal Back ups of t he OCR ( I mpor t i ng)
# in Unix
# 1. Identify the OCR export file that you want to import
# 2. Stop Oracle Clusterware on all the nodes in your RAC database
Page 446 Oracle DBA Code Examples
su -
crsctl stop crs
# 3. Import the file
ocrconfig -import file_name
# 4. Restart Oracle Clusterware on all the nodes
su -
crsctl start crs
# 5. verify OCR integrity
cluvfy comp ocr -n all
# Import in Windows
1. Identify the OCR export file
2. Stop the following OCR clients on each node:
OracleClusterVolumeService, OracleCMService, OracleEVMService,
OracleCSService, and the OracleCRService.
3. Import the OCR export file
ocrconfig -import ocrexport.dat
4. Restart all of the affected services on all nodes.
5. Verify the OCR integrity where node_list is a list of all of the nodes:
cluvfy comp ocr -n all [-verbose]
Di agnosi ng OCR Pr obl ems w i t h t he OCRDUMP and OCRCHECK Ut i l i t i es
OCRDUMP view OCR cont ent s in a readable format .
ls -lt /u01/crs/cdata/crs/
./ocrdump -backupfile /u01/crs/cdata/crs/backup00.ocr
less OCRDUMPFILE
./ocrdump dumpoutput -backupfile /u01/crs/cdata/crs/backup00.ocr
./ocrdump -stdout -backupfile /u01/crs/cdata/crs/backup00.ocr -xml
# checks logs are reported in CRS_Home/log/hostname/client
./ocrcheck
Page 447 Oracle DBA Code Examples
Admi ni st er i ng St or age
Dat af i l e Access i n Real Appl i cat i on Cl ust er s
Redo Log Fi l e St or age i n Real Appl i cat i on Cl ust er s
Each inst ance has it s own online redo log groups which are referred t o as an inst ance' s
t hread of online redo.
/* instance Thread */
-- thread is unique to every node
select value from v$parameter where name='thread';
-- If you change the thread of an instance, it won't
-- take effect till you enable it (otherwise db restart will fail):
ALTER DATABASE ENABLE THREAD 3;
-- following commands remove thread 3 and replace it with thread 2
ALTER SYSTEM SET thread = 2 SCOPE=SPFILE SID='rac2';
/u01/crs11g/bin/srvctl stop instance -d rac -i rac2
/u01/crs11g/bin/srvctl start instance -d rac -i rac2
connect / as sysdba
alter database disable thread 3;
-- every thread has at least two groups
select thread#, group#, members, bytes/1024/1024 MB, status from v$log order
by thread#, group#;
select group#, member, status from v$logfile order by group#;
/* to add a redo log group */
-- if OMF or ASM is used
ALTER DATABASE ADD LOGFILE THREAD 1 GROUP 5 SIZE 50M;
ALTER DATABASE ADD LOGFILE THREAD 2 GROUP 6 SIZE 50M;
-- or
alter database add logfile thread 2
group 5 ('/../_g5_m1.dbf', '/../_g5_m2.dbf') SIZE 128M REUSE,
group 6 ('/../_g6_m1.dbf', '/../_g6_m2.dbf') SIZE 128M REUSE,
group 7 ('/../_g7_m1.dbf', '/../_g7_m2.dbf') SIZE 128M REUSE,
group 8 ('/../_g8_m1.dbf', '/../_g8_m2.dbf') SIZE 128M REUSE;
/* to drop a group */
-- make sure its inactive
select thread#, group#, members, bytes/1024/1024 MB, status from v$log order
by thread#, group#;
-- switch log if required
alter system switch loglife;
-- start archiving, if required: specific instance
alter system archive log instance 'rac1' next ;
-- drop the group
ALTER DATABASE DROP LOGFILE GROUP 5;
ALTER DATABASE DROP LOGFILE GROUP 6;
Aut omat i c Undo Management i n Real Appl i cat i on Cl ust er s
# display undo tablespace used by the SID
SELECT VALUE FROM V$PARAMETER WHERE UPPER(NAME) in
Page 448 Oracle DBA Code Examples
('UNDO_TABLESPACE','INSTANCE_NAME');
# change undo tablespace for an instance
ALTER SYSTEM SET UNDO_TABLESPACE ='UNDORAC2' SID='rac2';
Admi ni st er i ng ASM I nst ances w i t h SRVCTL i n RAC
# to start, stop, and obtain the status of an ASM instance
srvctl start asm -n node_name [-i asm_instnace_name] [-o start_options] [-c
<connect_str> | -q]
srvctl stop asm -n node_name [-i asm_instance_name] [-o stop_options] [-c
<connect_str> | -q]
srvctl config asm -n node_name
srvctl status asm -n node_name
# to add configuration information about an existing ASM instance:
srvctl add asm -n node_name -i asm_instance_name -o oracle_home
# to remove an ASM instance:
srvctl remove asm -n node_name [-i asm_instance_name]
# to enable an ASM instance:
srvctl enable asm -n node_name [-i ] asm_instance_name
# to disable an ASM instance:
srvctl disable asm -n node_name [-i asm_instance_name]
Page 449 Oracle DBA Code Examples
Admi ni st er i ng Cl u st er Dat abases
Di spl ayi ng Cur r ent I nst ance i n SQL* Pl us Pr ompt
# in login.sql file (usually in $ORACLE_HOME/bin) add:
SET SQLPROMPT '_USER@ _CONNECT_IDENTIFIER> '
St ar t i ng and St oppi ng I nst ances and RAC Dat abases
St ar t i ng Up and Shut t i ng Dow n w i t h SQL* Pl us
-- on an instance on your local node
echo $ORACLE_SID
CONNECT / AS SYSDBA
SELECT VALUE FROM V$PARAMETER WHERE UPPER(NAME) ='INSTANCE_NAME';
-- the following command will wait for all trans in the db
SHUTDOWN TRANSACTIONAL
-- the following command will wait for the trans in the connected node only
SHUTDOWN TRANSACTIONAL LOCAL
-- connected instance will shutdown
STARTUP MOUNT
-- or
CONNECT /@db1 AS SYSDBA
..
I nt er mi t t ent Wi ndow s Shut dow n I ssue i n RAC Env i r onment s
Normal Windows shut down may hange, if t he inst ance was shut down using SQL* Plus. To
avoid it , shut down t he following using SRVCTL:
All services on t he node.
All dat abase inst ances on t he node.
All ASM inst ances on t he node.
All node applicat ions on t he node.
St ar t i ng Up and Shut t i ng Dow n w i t h SRVCTL
Shut t ing down a dat abase means shut t ing down all it s inst ances.
# specific instance(s)
# preferred and available services will also be started alongside
srvctl start instance -d db_name -i "inst_name_list" [-o start_options]
srvctl stop instance -d name -i "inst_name_list" [-o stop_options]
srvctl stop instance -d rac -i "rac1,rac2" -o immediate
# entire cluster database
# when you start, only non-running instances will be started
srvctl start database -d name [-o start_options]
srvctl start database -d rac -o mount
srvctl stop database -d name [-o stop_options]
Page 450 Oracle DBA Code Examples
Cust omi zi ng How Or acl e Cl ust er w ar e Manages RAC Dat abases
You may want t o:
prevent t he Oracle Clust erware from rest art ing your RAC dat abase when you rest art t he
syst em
avoid rest art ing failed inst ances more t han once
# when you make a service unavailable, it won't run under the Oracle crs
# for automatic startup, failover, or restart
srvctl disable database -d rac
srvctl disable instance -d rac -i "rac1,rac2"
srvctl disable service -d rac -s hrserv,marketing
# -n node name
srvctl disable asm -n crmnode1 -i asm1
Sw i t chi ng Bet w een t he Dat abase Aut omat i c and Manual Pol i ci es
When AUTO_START at t ribut e is set t o 2 ( MANUAL) for a resource, crs will not aut omat ically
st art it on reboot .
# to display the current policy
srvctl config database -d rac -a
..
POLICY: AUTOMATIC
# change the current policy to another one
srvctl modify database d database_name -y AUTOMATIC|MANUAL
Cust omi zi ng Resour ce Par amet er s ( l i k e AUTO_START)
You can cust omize t he following resource paramet ers for dat abase or ASM inst ances,
dat abases, services, and service members:
# when 1 ( 0) , it at uo- rest art s on syst em reboot
AUTO_START as
# rest art at t empt s before relocat e ( 1)
RESTART_ATTEMPTS ra
# applicat ion up-t ime t o be considered st able by crs
UPTI ME_THRESHOLD ut
# 1. retreive resource name
crs_stat t
# 2. update the OCR with the right attribute values for your resources
crs_register ora..inst -update -o as=2,ra=1,ut=7d
crs_register ora..asm -update -o as=2,ra=1,ut=7d
crs_register ora..db -update -o as=2,ra=1,ut=7d
crs_register ora..cs -update -o as=2,ra=0
crs_register ora..svr -update -o as=2,ra=0
Page 451 Oracle DBA Code Examples
Handl i ng I ni t i al i zat i on Par amet er Fi l es i n RAC
Set t i ng Ser v er Par amet er Fi l e Par amet er Val ues f or Real Appl i cat i on Cl ust er s
Pract ically, each inst ance uses it s own PFI LE file t hat cont ains only one paramet er called
SPFI LE. The SPFI LE paramet er point s t o t he shared SPFI LE on your shared st orage.
/* about the parameters in spfile in RAC */
# to know wheather spfile or pfile was used when startup
SELECT DECODE(value, NULL, 'PFILE', 'SPFILE:'|| value) "Init File Type"
FROM sys.v_$parameter WHERE name = 'spfile';
-- spfile is shared by all instances
cat $ORACLE_HOME/dbs/initrac1.ora
SPFILE='+DG1/rac/spfilerac.ora'
-- example
ALTER SYSTEM SET OPEN_CURSORS=500
COMMENT='Changed by Ahmed for testing on 16-dec-09'
SCOPE=BOTH
SID='*';
ALTER SYSTEM SET OPEN_CURSORS=1000 SPFILE=BOTH SID='rac1';
-- to remove a paramter from spifle
ALTER SYSTEM RESET timed_statistics SCOPE=SPFILE SID='*';
ALTER SYSTEM SET timed_statistics = '' SCOPE=SPFILE;
Par amet er s Used i n RAC Dat abases
CLUSTER_DATABASE must be TRUE
CLUSTER_DATABASE_INSTANCES
CLUSTER_INTERCONNECTS
DB_NAME
DISPATCHERS
INSTANCE_NAME
SERVICE_NAMES
SESSIONS_PER_USER I f SESSI ONS_PER_USER is set t o 1 for a user, t he user can log on t o t he
dat abase more t han once as long as each connect ion is from a different inst ance.
THREAD
SPFILE
MAX_COMMIT_PROPAGATION_DELAY deprecat ed in 10g R2
Par amet er s t hat Must Hav e I dent i cal Set t i ngs on Al l I nst ances
ACTIVE_INSTANCE_COUNT
ARCHIVE_LAG_TARGET
CLUSTER_DATABASE
CLUSTER_DATABASE_INSTANCES number of inst ances in t he RAC
CONTROL_FILES
DB_BLOCK_SIZE
DB_DOMAIN
DB_FILES
DB_NAME
DB_RECOVERY_FILE_DEST
DB_RECOVERY_FILE_DEST_SIZE
Page 452 Oracle DBA Code Examples
DB_UNIQUE_NAME
UNDO_MANAGEMENT
Par amet er s That Must Hav e Uni que Set t i ngs on Al l I nst ances
THREAD
ROLLBACK_SEGMENTS
UNDO_TABLESPACE if aut omat ic is used
Par amet er s t hat Shoul d Hav e I dent i cal Set t i ngs on Al l I nst ances
I t is highly recommended t o set same value for paramet ers in t he following list in all t he
inst ances:
ARCHIVE_LAG_TARGET
LICENSE_MAX_USERS
LOG_ARCHIVE_FORMAT
SPFILE
TRACE_ENABLED
UNDO_RETENTION
ASM I nst ance I ni t i al i zat i on Par amet er s and RAC
CLUSTER_DATABASE must be TRUE
ASM_DISKSTRING Mult iple inst ances can have different values ( not recommended)
ASM_POWER_LI MI T Mult iple inst ances can have different values
export ORACLE_SID=+ASM1
sqlplus /nolog
conn / as sysdba
select name, value
from v$parameter
where upper(name) in ('CLUSTER_DATABASE','ASM_DISKSTRING','ASM_POWER_LIMIT');
Dr oppi ng a RAC Dat abase
Opt ion 1: Aft er making sure t he crs and t he dat abase are up and running, issue dbca and
delet e t he dat abase.
Opt ion 2: issue t he commands below:
startup mount exclusive restrict;
drop database;
# to delete archived log and the backups as well
drop database including backups;
srvctl remove instance -d rac -i rac1
srvctl remove database -d rac
Page 453 Oracle DBA Code Examples
Wor k l oad Management i n RAC
Types of Wor k l oad Di st r i but i on
Connect ion load balancing:
o Client -side connect - t ime load balancing
o Client -side connect - t ime failover
o Server- side connect -t ime load balancing
Run- t ime connect ion load balancing can be implement ed by using connect ion pools in
middle t ier.
Connect i on Load Bal anci ng
Cl i ent - Si de Load Bal anci ng and Fai l ov er
I f you use connect - t ime failover, do not set GLOBAL_DBNAME in t he list ener. ora
# to enable Client-Side Load Balancing ONLY (i.e., no failover): send request
# randomly to one listener from the list.
CSLB_ONLY =
(DESCRIPTION =
(LOAD_BALANCE = ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = racdb)
)
)
# use this settings for RAC database
# to enable failover (using TCP/IP time-out, the client make sure the host is
# alive before sending connection requrest) (in RAC, you use vip addresses)
CSLB_ONLY =
(DESCRIPTION =
(LOAD_BALANCE = ON)
(FAILOVER = ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = racdb)
)
)
Ser ver - Si de Load Bal anci ng
Target : which list ener should t ake t he connect ion.
-- Configuring Server-side connection load balancing
-- 1) define the service which will be used for the connection load balancing
-- 2) Add entries in every client's TNSNAMES.ORA file for the new alias
Page 454 Oracle DBA Code Examples
HRSERV =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip.mydomain.com)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip.mydomain.com)(PORT = 1521))
)
(LOAD_BALANCE = ON) -- not related to server-side load balancing
(FAILOVER = ON) -- not related to server-side load balancing
(CONNECT_DATA =
(SERVICE_NAME = hrserv)
)
)
-- 3) Add entries in the TNSNAMES.ORA file of every node to
-- include the REMOTE_LISTENER setting
LISTENERS_RAC =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip.mydomain.com)(PORT =
1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip.mydomain.com)(PORT =
1521))
)
-- 4) set the parameter to make PMON automatically register the database
-- with all the listeners in the nodes
ALTER SYSTEM SET REMOTE_LISTENER =LISTENERS_RAC SID='*' SCOPE=BOTH;
-- setting the default connection load balancing goal for the service hrserv
-- to LONG (long-lived apps like forms)(default), SHORT (short-lived apps)
execute dbms_service.modify_service (service_name => 'hrserv' , clb_goal =>
dbms_service.clb_goal_long);
execute dbms_service.modify_service (service_name => 'hrserv' , clb_goal =>
dbms_service.clb_goal_short);
-- view it (name is case sensitive)
SELECT CLB_GOAL FROM DBA_SERVICES WHERE NAME='hrserv';
Fast Appl i cat i on Not i f i cat i on ( FAN)
FAN publishing load balancing advisory event s and UP and DOWN info about services,
inst ances and nodes t o client applicait ons.
You can t ake advant age of FAN event s in t he following t hree ways:
1. Applicat ion can t ake advant age of FAN wit hout any programmat ic changes by ut ilizing
an int egrat ed Oracle Client like: Oracle Dat abase 10g JDBC, ODP. NET, and OCI .
2. Applicat ions can t ake advant age of FAN programmat ically by using t he Oracle
Not ificat ion Service ( ONS) Applicat ion Programming I nt erface ( API ) t o subscribe t o
FAN event s and execut e event handling act ions upon t he receipt of an event .
3. You can implement FAN wit h server side callout s on your dat abase t ier.
Usi ng Fast Appl i cat i on Not i f i cat i on Cal l out s
FAN callout s are server side execut ables t hat RAC execut es immediat ely when high
availabilit y event s occur.
Page 455 Oracle DBA Code Examples
# place an executable in the directory CRS_home/racg/usrco in all nodes
vi /u01/crs/racg/usrco/callout.sh
#! /bin/ksh
FAN_LOGFILE=/home/oracle/log/rac_`hostname`.log
echo $* "reported="`date` >> $FAN_LOGFILE &
# place an executable in the directory CRS_home/racg/usrco in all nodes
# example source is Oracle Documentation 10g R1
vi /u01/crs/racg/usrco/callout.sh
#!/usr/bin/sh#
# Description: wrapper script to enable RAC event logging and notification
# to generic third-party systems. The script showcases two possible
# methods to enable local or remote logging/notification of RAC-
# detected events.#
AWK=/usr/bin/awk
MY_CRS_HOME=/private/oracle/crs
# Scan and parse arglist:#
for ARGS in $*; do
PROPERTY=`echo $ARGS | $AWK -F"=" '{print $1}'`
VALUE=`echo $ARGS | $AWK -F"=" '{print $2}'`
#> map EVTTYPE to EVENT_TYP, NODE to HOST:
case $PROPERTY in
#> EVENT_TYP is one of: NODE, DATABASE, INSTANCE, SERVICE, SERVICEMEMBER
EVENT_TYP | event_typ) NOTIFY_EVENT_TYP=$VALUE ;;
VERSION | version) NOTIFY_VERSION=$VALUE ;;
SERVICE | service) NOTIFY_SERVICE=$VALUE ;;
DATABASE | database) NOTIFY_DBNAME=$VALUE ;;
INSTANCE | instance) NOTIFY_INSTANCE=$VALUE ;;
HOST | host) NOTIFY_HOST=$VALUE ;;
STATUS | status) NOTIFY_STATUS=$VALUE ;;
TIMESTAMP | timestamp) NOTIFY_SVRLOGDATE=$VALUE ;;
esac
done
# ###################################################
# [1] Notification Method 1: On-cluster file logging
# ###################################################
# This section simply writes one-line entries for each event published by RAC,
# and the log is written to standard RAC log directory. It will blindly
# record all RAC events, regardless of state (UP, DOWN or NOT_RESTARTING):
RACEVT_LOGFILE=$MY_CRS_HOME/racg/log/rac_${NOTIFY_SERVICE}_uptime.log
echo RAC\(v$NOTIFY_VERSION\): $NOTIFY_STATUS event, type "$NOTIFY_EVENT_TYP",
\
`if [ -n "$NOTIFY_SERVICE" ]; then \
echo "for service $NOTIFY_SERVICE"
fi` \
\[`if [ -n "$NOTIFY_INSTANCE" ]; then \
echo "inst: $NOTIFY_INSTANCE"
fi` \
`if [ -n "$NOTIFY_DATABASE" ]; then \
echo "db: $NOTIFY_DATABASE"
fi` \
`if [ -n "$NOTIFY_HOST" ]; then \
echo "db: $NOTIFY_HOST"
fi` \
Page 456 Oracle DBA Code Examples
\] received on $NOTIFY_SVRLOGDATE >> $RACEVT_LOGFILE
# ########################################################
# [2] Notification Method 2: On-cluster program execution
# ########################################################
# Let's assume you have a custom client program in /tmp (say logTicket)
# to which you can pass certain arguments. This program connects to a
# customer-service application that processes incident tickets for your
# IT department:
# % /tmp/logTicket {serverside_timestamp} \
# {databasename} {servicename} \
# {instancename} {hostname}#
# Let us also assume that a ticket would be logged only for NOT_RESTARTING
# events, as they are the ones that exceeded RAC-monitored timeouts and
# seriously need human intervention for full resolution.#
# -------------------
# ONE SOLUTION TO [2]:
# -------------------
if [ $NOTIFY_STATUS = "NOT_RESTARTING" -o $NOTIFY_STATUS = "not_restarting"
]; then
/tmp/logTicket $NOTIFY_SVRLOGDATE $NOTIFY_DBNAME \
$NOTIFY_SERVICE \
$NOTIFY_INSTANCE $NOTIFY_HOST >> $RACEVT_LOGFILE
fi
Conf i gur i ng t he Ser ver - Si de ONS
When useocr= on in ons. config, racgons add_config command st ore t his dat a in OCR.
# target: to add rac3 node in the RAC ONS
# (1) obtain the remote nodes from rac1,rac2
# and set useocr=on
cat $CRS_HOME/opmn/conf/ons.config
# (2) in rac3:
racgons add_config rac1:6200 rac2:6200
racgons add_config rac3:6200
# (3) in rac1, rac2:
onsctl reconfig
Admi ni st er i ng Load Bal anci ng Advi sor y
The load balancing advisory has t he t ask of advising t he direct ion of incoming work t o t he
RAC inst ances t hat provide opt imal qualit y of service for t hat work.
To t est t he load balancing, you can use t he script s in t he appendix t o apply load and t he
following sect ion for monit oring.
-- view load balancing gaol of a current service
-- NONE means load balancing advisory is disabled
SELECT NAME, GOAL, CLB_GOAL FROM DBA_SERVICES;
-- SERVICE TIME: response-time based, like online shopping
Page 457 Oracle DBA Code Examples
execute dbms_service.modify_service (service_name => 'hrserv' -
, goal => dbms_service.goal_service_time -
, clb_goal => dbms_service.clb_goal_short);
-- THROUGHPUT: rat at which jobs are completed, like batch processing
execute dbms_service.modify_service (service_name => 'hrserv' -
, goal => dbms_service.goal_throughput -
, clb_goal => dbms_service.clb_goal_long);
-- NONE: LBA disabled
execute dbms_service.modify_service (service_name => 'hrserv' -
, goal => dbms_service.goal_none -
, clb_goal => dbms_service.clb_goal_long);
Moni t or i ng Load Bal anci ng Advi sor y
V$SERVI CEMETRI C : service met rics on t he most 5- second and 1-minut e int ervals
V$SERVI CEMETRI C_HI STORY : recent hi st or y of t he met ric values
SELECT
service_name
,TO_CHAR(begin_time,'hh24:mi:ss') beg_hist
,TO_CHAR(end_time,'hh24:mi:ss') end_hist
,inst_id
,goodness
,delta
,flags
,cpupercall
,dbtimepercall
,callspersec
,dbtimepersec
FROM gv$servicemetric
WHERE service_name ='hrserv'
ORDER BY service_name, begin_time DESC, inst_id;
SELECT SERVICE_NAME,
to_char(BEGIN_TIME,'hh24:mi:ss') BEGIN_TIME,
to_char(END_TIME,'hh24:mi:ss') END_TIME,
INTSIZE_CSEC, GROUP_ID "Service Metric Group",
CPUPERCALL "CPU time per call",
DBTIMEPERCALL "Elapsed time per call",
CALLSPERSEC "User Calls/s",
DBTIMEPERSEC "DB Time/s"
from V$SERVICEMETRIC_HISTORY
order by SERVICE_NAME, BEGIN_TIME desc;
-- aggregated
SELECT
SERVICE_NAME,
GROUP_ID "Service Metric Group",
round(sum(CPUPERCALL),2) "CPU time per call",
round(sum(DBTIMEPERCALL),2) "Elapsed time per call",
round(sum(CALLSPERSEC),2) "User Calls/s",
round(sum(DBTIMEPERSEC),2) "DB Time/s"
from V$SERVICEMETRIC_HISTORY
group by SERVICE_NAME, GROUP_ID
order by SERVICE_NAME;
Page 458 Oracle DBA Code Examples
Tr anspar ent Appl i cat i on Fai l over ( TAF)
TAF Basi c Conf i gur at i on w i t hout FAN ( Fr om Cl i ent Si de)
FAI LOVER_MODE must be configured in t nsnames. ora
I f using TAF, do not set t he GLOBAL_DBNAME paramet er in t he list ener. ora
# when you create the service
srvctl add service -d rac -s hrserv -r rac1,rac2 -P BASIC
srvctl start service -d rac -s hrserv
# in the client tnsnames.ora
# TYPE: SELECT, SESSION
hrserv =
(DESCRIPTION =(FAILOVER=ON)(LOAD_BALANCE=ON)
(ADDRESS=(PROTOCOL=TCP)(HOST=rac1-VIP)(PORT=1521))
(ADDRESS=(PROTOCOL=TCP)(HOST=rac2-VIP)(PORT=1521))
(CONNECT_DATA =
(SERVICE_NAME = hrserv)
(FAILOVER_MODE =
(TYPE=SESSION)
(METHOD=BASIC)
(RETRIES=100)
(DELAY=5))))
TAF Basi c Conf i gur at i on w i t h FAN ( Ser ver - Si de)
You not need t o specify TAF paramet ers in t he t nsnames. ora
srvctl add service -d rac -s hrserv -r rac1,rac2
srvctl start service -d RACDB -s AP
exec dbms_service.modify_service ( ,-
service_name => 'hrserv' ,-
aq_ha_notifications => true ,-
failover_method => dbms_service.failover_method_basic ,-
failover_type => dbms_service.failover_type_session ,-
failover_retries => 100, failover_delay => 5 ,-
clb_goal => dbms_service.clb_goal_long);
hrserv =
(DESCRIPTION =(FAILOVER=ON)(LOAD_BALANCE=ON)
(ADDRESS=(PROTOCOL=TCP)(HOST=rac1-VIP)(PORT=1521))
(ADDRESS=(PROTOCOL=TCP)(HOST=rac2-VIP)(PORT=1521))
(CONNECT_DATA = (SERVICE_NAME = hrserv)))
TAF Pr econnect Conf i gur at i on
Fast failover but more resources.
The shadow service is always named using t he format < service_name> _PRECONNECT.
# configure the preferred and available nodes
srvctl add service -d rac -s hrserv -r rac1 -a rac2 -P PRECONNECT
srvctl start service -d rac -s hrserv
HRSERV =
(DESCRIPTION =(FAILOVER=ON)(LOAD_BALANCE=ON)
Page 459 Oracle DBA Code Examples
(ADDRESS=(PROTOCOL=TCP)(HOST=rac1-vip)(PORT=1521))
(ADDRESS=(PROTOCOL=TCP)(HOST=rac2-vip)(PORT=1521))
(CONNECT_DATA = (SERVICE_NAME = hrserv)
(FAILOVER_MODE = (BACKUP=HRSERV_PRECONNECT)
(TYPE=SESSION)(METHOD=PRECONNECT))))
HRSERV_PRECONNECT =
(DESCRIPTION =(FAILOVER=ON)(LOAD_BALANCE=ON)
(ADDRESS=(PROTOCOL=TCP)(HOST=rac1-vip)(PORT=1521))
(ADDRESS=(PROTOCOL=TCP)(HOST=rac2-vip)(PORT=1521))
(CONNECT_DATA = (SERVICE_NAME = HRSERV_PRECONNECT)))
Ver i f y i ng TAF Conf i gur at i on
SELECT machine, failover_method, failover_type,
failed_over, service_name, COUNT(*)
FROM v$session
GROUP BY machine, failover_method, failover_type,
failed_over, service_name;
select instance_name from v$instance;
Enabl i ng Di st r i but ed Tr ansact i on Pr ocessi ng f or Ser vi ces
# For services that you are going to use for distributed transaction
processing,
# define only one instance as the preferred instance
srvctl add service -d crm -s xa_01.service.us.oracle.com -r RAC01 -a RAC02,
RAC03
# mark the service for distributed trans processing by setting DTP to TRUE:
execute dbms_service.modify_service(service_name
=>'xa_01.mydomain.com',DTP=>TRUE);
Page 460 Oracle DBA Code Examples
Admi ni st er i ng Ser v i ces
Ser vi ce At t r i but es
Global unique name
Net work name
Load Balancing Advisory goal: best service qualit y ( service response t ime) , or best
t hroughput ( how much work is complet ed in a unit of t ime) .
Dist ribut ed t ransact ions flag
Advance queuing not ificat ion charact erist ics for OCI and ODP. NET client s
Failover charact erist ics
Connect ion load-balancing algorit hm: SHORT: Use Load Balancing Advisory, LONG: Using
session count by service
Threshold: for response t ime and CPU consumpt ion
Priorit y: services t o consumer groups mapping
High-availabilit y configurat ion: how t he service is dist ribut ed across inst ances when t he
syst em first st art s
Admi ni st er i ng Ser vi ces w i t h DBCA
1. On the DBCA Welcome page, select the Oracle Real Application Clusters
option ->Next
2. On the DBCA Operations: select Services Management ->Next
3. On the DBCA List of Databases: select the cluster database ->Next
-- confirm
select value from v$parameter where upper(name)='SERVICE_NAMES'
Admi ni st er i ng Ser vi ces w i t h PL/ SQL
/* Create a Service (not a recommended method in RAC)*/
-- some attributes can only be modified using PL/SQL
-- service_name and network_name are mandatory
-- others are optional will NULL defaults
begin
DBMS_SERVICE.CREATE_SERVICE(
service_name =>'olapserv',
network_name =>'olapserv', -- TNS name for connections to the service
goal =>DBMS_SERVICE.GOAL_SERVICE_TIME, -- or GOAL_THROUGHPUT, GOAL_NONE
dtp =>FALSE, -- is it for distributed transaction
aq_ha_notifications =>TRUE, -- should HA events sent to AQ
failover_method =>DBMS_SERVICE.FAILOVER_METHOD_BASIC, -- or _NONE
failover_type =>DBMS_SERVICE.FAILOVER_TYPE_SESSION, -- or _NONE _SELECT
failover_retries =>10,
failover_delay=>1 , -- in seconds
clb_goal=>DBMS_SERVICE.CLB_GOAL_SHORT -- or CLB_GOAL_LONG
);
end;
Page 461 Oracle DBA Code Examples
/
select name from dba_services ;
/* Modify a Service Charactaristic */
-- some attributes can only be modified using PL/SQL
-- if stopped, start it before modify
begin
DBMS_SERVICE.MODIFY_SERVICE(
service_name =>'olapserv',
goal =>DBMS_SERVICE.GOAL_SERVICE_TIME, -- or GOAL_THROUGHPUT, GOAL_NONE
dtp =>FALSE, -- is it for distributed transaction
aq_ha_notifications =>TRUE, -- should HA events sent to AQ
failover_method =>DBMS_SERVICE.FAILOVER_METHOD_BASIC, -- or _NONE
failover_type =>DBMS_SERVICE.FAILOVER_TYPE_SESSION, -- or _NONE _SELECT
failover_retries =>10,
failover_delay=>1 , -- in seconds
clb_goal=>DBMS_SERVICE.CLB_GOAL_SHORT -- or CLB_GOAL_LONG
);
end;
/
/* Delete Service */
begin
DBMS_SERVICE.DELETE_SERVICE( service_name =>'olapserv');
end;
/
/* Start a service */
begin
DBMS_SERVICE.START_SERVICE(service_name=>'hrserv',
instance_name => DBMS_SERVICE.ALL_INSTANCES, -- if NULL current inst
);
end;
/
/* Stop Service */
begin
DBMS_SERVICE.STOP_SERVICE(service_name=>'hrserv',
instance_name => DBMS_SERVICE.ALL_INSTANCES, -- if NULL current inst
);
end;
/
/* Disconnect Sessions */
-- sessions connected to the service are terminated
begin
-- CAUTION: control doesn't return till all sessions are terminated
DBMS_SERVICE.DISCONNECT_SESSION('hrserv');
end;
/
Page 462 Oracle DBA Code Examples
Admi ni st er i ng Ser vi ces w i t h SRVCTL
Creat ing a Service
srvctl add service -d dbname -s service_name -r preferred_list [-a
available_list] [-P TAF_policy]
taf policy: NONE, BASIC, or PRECONNECT
/* Creating Services */
# it does NOT add the required tnsnames.ora settings
srvctl add service d rac s GL -r RAC02 -a RAC01
srvctl add service d rac s ERP r RAC01,RAC02 -a RAC03,RAC04
/* Starting and Stopping Services */
srvctl start service -d dbname [-s service_name_list] [-i inst_name] [-o
start_options]
srvctl stop service -d dbname [-s service_name_list [-i inst_name]] [-c
connect_str]
/* Enabling and Disabling Services */
srvctl enable service -d dbname -s service_name_list [-i inst_name]
srvctl disable service -d dbname -s service_name_list [-i inst_name]
/* Relocating Services */
srvctl relocate service -d rac -s hrserv -i rac2 -t rac3
/* upgrading an available instance as a preferred instance for a Service*/
-- see also next section
srvctl modify service d rac s hrserv -i rac3 r
/* Obtaining the Statuses of Services */
srvctl status service -d rac -s hrserv
/* Obtaining the Configuration of Services */
srvctl config service -d rac -s hrserv -a
/* Removing Services */
rvctl stop service -d rac -s hrserv
rvctl remove service -d rac -s hrserv
Cont r ol l i ng t he Pr ef er r ed and Avai l abl e I nst ances
/* Upgrading an Available instance as a Preferred instance for a Service */
-- -r upgrade instance to preferred
srvctl modify service d rac s hrserv -i rac3 r
/* the scenario below makes:
- i1-i4 preferred, i5-i6 available for dwserv
- i5-i6 preferred, i1-i4 available for hrserv
*/
-- changes take effect on next services restart
-- if used, -f Disconnect all sessions during stop
srvctl modify service d PROD s dwserv n i I1,I2,I3,I4 a I5,I6
srvctl modify service d PROD s hrserv n i I5,I6 a I1,I2,I3,I4
-- f stops the services globally on your cluster
Page 463 Oracle DBA Code Examples
srvctl stop service d rac s dwserv,hrserv -f
srvctl start service d rac s dwserv,hrserv
Usi ng Ser vi ces w i t h Cl i ent Appl i cat i ons
/* TNS connection descriptor */
-- LOAD_BALANCE=on only enables a client-side connection load balancing
ERP=(DESCRIPTION=
(LOAD_BALANCE=on)
(ADDRESS=(PROTOCOL=TCP)(HOST=node-1vip)(PORT=1521))
(ADDRESS=(PROTOCOL=TCP)(HOST=node-2vip)(PORT=1521))
(ADDRESS=(PROTOCOL=TCP)(HOST=node-3vip)(PORT=1521))
(ADDRESS=(PROTOCOL=TCP)(HOST=node-4vip)(PORT=1521))
(CONNECT_DATA=(SERVICE_NAME=ERP)))
/* JDBC connection description (1) */
url="jdbc:oracle:oci:@ERP"
/* JDBC connection description (2) */
url="jdbc:oracle:thin:@(DESCRIPTION=
(LOAD_BALANCE=on)
(ADDRESS=(PROTOCOL=TCP)(HOST=node-1vip)(PORT=1521))
(ADDRESS=(PROTOCOL=TCP)(HOST=node-2vip)(PORT=1521))
(ADDRESS=(PROTOCOL=TCP)(HOST=node-3vip)(PORT=1521))
(ADDRESS=(PROTOCOL=TCP)(HOST=node-4vip)(PORT=1521))
(CONNECT_DATA=(SERVICE_NAME=ERP)))"
Ser vi ces and t he Schedul er
BEGIN
DBMS_SCHEDULER.CREATE_JOB_CLASS (
job_class_name => 'my_jobs_class',
SERVICE => 'hrserv');
END;
/
BEGIN
dbms_scheduler.set_attribute(
name => 'my_jobs_class',
attribute => 'service',
value => 'hrserv');
END;
/
begin
dbms_scheduler.create_job (
job_name => 'My_Job',
job_type => 'plsql_block', -- stored_procedure, plsql_block, executable,
chain
job_action => 'begin null; end;',
job_class => 'my_jobs_class',
start_date => SYSDATE+1,
repeat_interval => 'FREQ=MINUTELY; INTERVAL=2');
end;
Page 464 Oracle DBA Code Examples
/
BEGIN
dbms_scheduler.set_attribute(
name => 'My_Job',
attribute => 'INSTANCE_STICKINESS',
value => TRUE);
END;
/
BEGIN
DBMS_SCHEDULER.DROP_JOB('My_Job');
END;
/
BEGIN
DBMS_SCHEDULER.DROP_JOB_CLASS('my_jobs_class');
END;
/
DBMS_SCHEDULER.CREATE_JOB_CLASS(
JOB_CLASS_NAME => 'HOT_BATCH_CLASS',
RESOURCE_CONSUMER_GROUP => NULL ,
SERVICE => 'HOT_BATCH_SERV' ,
LOGGING_LEVEL => DBMS_SCHEDULER.LOGGING_RUNS,
LOG_HISTORY => 30, COMMENTS => 'P1 batch');
DBMS_SCHEDULER.CREATE_JOB(
JOB_NAME => 'my_report_job',
JOB_TYPE => 'stored_procedure',
JOB_ACTION => 'my_name.my_proc();',
NUMBER_OF_ARGUMENTS => 4, START_DATE => SYSDATE+1,
REPEAT_INTERVAL => 5, END_DATE => SYSDATE+30,
JOB_CLASS => 'HOT_BATCH_CLASS',
ENABLED => TRUE,
AUTO_DROP => false, COMMENTS => 'daily status');
Measur i ng Per f or mance by Ser vi ce Usi ng t he AWR
/* Enabling Gather statiscitc on Service-Module-Action combination */
-- to display currently connected services, modules and actions
select SID, USERNAME, SERVICE_NAME, MODULE, ACTION from V$SESSION
where SERVICE_NAME in ('hrserv','oeserv')
-- service name and module name are mandatory
begin
DBMS_MONITOR.SERV_MOD_ACT_STAT_ENABLE(SERVICE_NAME => 'hrserv',
MODULE_NAME=>'PAYROLL',
ACTION_NAME => 'EXCEPTIONS PAY');
end;
/
-- gather stats for PAYROLL module and ACTION whose name is null
begin
DBMS_MONITOR.SERV_MOD_ACT_STAT_ENABLE(SERVICE_NAME => 'hrserv',
Page 465 Oracle DBA Code Examples
MODULE_NAME=>'PAYROLL',
ACTION_NAME => NULL);
end;
/
-- gather stats for PAYROLL module and All its ACTIONs
begin
DBMS_MONITOR.SERV_MOD_ACT_STAT_ENABLE(SERVICE_NAME => 'hrserv',
MODULE_NAME=>'PAYROLL',
ACTION_NAME => '###ALL_ACTIONS');
end;
/
-- to view enabled monitorings
-- types: SERVICE, SERVICE_MODULE, SERVICE_MODULE_ACTION
select A.AGGREGATION_TYPE, A.PRIMARY_ID , A.QUALIFIER_ID1 , A.QUALIFIER_ID2
from DBA_ENABLED_AGGREGATIONS a
-- to view gathered stats
select S.AGGREGATION_TYPE, S.SERVICE_NAME, S.MODULE, S.ACTION, N.CLASS,
decode(n.CLASS,
'1','User','2','Redo','4','Enqueue','8','Cache','16','OS','32','RAC','64','SQL
','128','Debug', N.CLASS) STAT_CLASS,
S.STAT_NAME, S.VALUE
from V$SERV_MOD_ACT_STATS s, V$STATNAME n
where S.STAT_ID = N.STAT_ID
order by N.CLASS, S.STAT_ID
-- call times and performance statistics views:
V$SERVICE_STATS
V$SERVICE_EVENTS
V$SERVICE_WAIT_CLASSES
V$SERVICEMETRIC
V$SERVICEMETRIC_HISTORY
/* To Disable Cumulative Stats */
-- stats will be removed from V$SERV_MOD_ACT_STATS
begin
DBMS_MONITOR.SERV_MOD_ACT_STAT_DISABLE(SERVICE_NAME => 'hrserv',
MODULE_NAME=>'PAYROLL',
ACTION_NAME => 'EXCEPTIONS PAY');
end;
/
/* Service Quality Statistics */
-- script from Oracle documentation
-- provides service quality statistics every five seconds
SET PAGESIZE 60 COLSEP '|' NUMWIDTH 8 LINESIZE 132 VERIFY OFF FEEDBACK OFF
COLUMN service_name FORMAT A20 TRUNCATED HEADING 'Service'
COLUMN begin_time HEADING 'Begin Time' FORMAT A10
COLUMN end_time HEADING 'End Time' FORMAT A10
COLUMN instance_name HEADING 'Instance' FORMAT A10
COLUMN service_time HEADING 'Service Time|mSec/Call' FORMAT 999999999
COLUMN throughput HEADING 'Calls/sec'FORMAT 99.99
BREAK ON service_name SKIP 1
SELECT
Page 466 Oracle DBA Code Examples
service_name
, TO_CHAR(begin_time, 'HH:MI:SS') begin_time
, TO_CHAR(end_time, 'HH:MI:SS') end_time
, instance_name
, elapsedpercall service_time
, callspersec throughput
FROM gv$instance i
, gv$active_services s
, gv$servicemetric m
WHERE s.inst_id = m.inst_id
AND s.name_hash = m.service_name_hash
AND i.inst_id = m.inst_id
AND m.group_id = 10
ORDER BY service_name , i.inst_id , begin_time ;
Ser vi ce Thr eshol ds and Al er t s
For t he services, you can set alert s for:
o ELAPSED_TI ME_PER_CALL Elapsed t ime for each user call for each service (micro s)
o CPU_TI ME_PER_CALL CPU t ime for each user call for each service (micro s)
Thresholds must be set on each inst ance support ing t he service
-- thresholds must be set on each instance supporting the service
begin
DBMS_SERVER_ALERT.SET_THRESHOLD(
METRICS_ID => DBMS_SERVER_ALERT.ELAPSED_TIME_PER_CALL
, WARNING_OPERATOR => dbms_server_alert.operator_ge
, WARNING_VALUE => '500000' -- = 0.5 seconds
, CRITICAL_OPERATOR => dbms_server_alert.operator_ge
, CRITICAL_VALUE => '750000' = 0.75 seconds
, OBSERVATION_PERIOD => 30 -- in mins
, CONSECUTIVE_OCCURRENCES => 5 -- tolerance occurance before alerts
, INSTANCE_NAME => NULL -- must be NULL in this case
, OBJECT_TYPE => dbms_server_alert.object_type_service
, OBJECT_NAME => 'hrserv');
end;
/
-- Verify the threshold configuration
SELECT METRICS_NAME, INSTANCE_NAME, WARNING_VALUE, CRITICAL_VALUE,
OBSERVATION_PERIOD
from dba_thresholds
where OBJECT_NAME => 'hrserv' ;
-- most recent 60 s
SELECT service_name, elapsedpercall, cpupercall
FROM V$SERVICEMETRIC;
-- last hour
SELECT service_name, elapsedpercall, cpupercall
FROM V$SERVICEMETRIC_HISTORY;
Page 467 Oracle DBA Code Examples
Ser vi ce Per f or mance Vi ew s
There are more t han 300 performance- relat ed st at ist ics t hat are t racked and visible in
V$SYSSTAT. Of t hese, 28 st at ist ics are t racked for services. To see t he st at ist ics measured
for services, run t he following query: SELECT DI STI NCT st at _name FROM v$service_st at s.
For service met rics, see Monit oring Load Balancing Advisory
-- general stats per service
-- DB time (response time)= DB CPU + wait time
select V.SERVICE_NAME,
decode(n.CLASS,
'1','User','2','Redo','4','Enqueue','8','Cache','16','OS','32','RAC','64','SQL
','128','Debug', N.CLASS) STAT_CLASS
, V.STAT_NAME , VALUE
from V$SERVICE_STATS V , V$STATNAME N
where V.STAT_ID = N.STAT_ID
order by 1,2;
-- aggregated waits (by wait class)
SELECT *
FROM V$SERVICE_WAIT_CLASS
WHERE SERVICE_NAME NOT LIKE 'SYS$%'
ORDER BY SERVICE_NAME, TIME_WAITED DESC
-- aggregated waits (by wait event)
SELECT *
FROM V$SERVICE_EVENT
WHERE SERVICE_NAME NOT LIKE 'SYS$%'
AND EVENT NOT IN ('SQL*Net message from client')
ORDER BY SERVICE_NAME, TIME_WAITED DESC;
-- stats for a specific combination of service/module/action
-- When statistics collection for specific modules and actions is enabled
select *
from V$SERV_MOD_ACT_STATS
ORDER BY 1,2,3,4
-- information about enabled on-demand statistic aggregation
select *
from DBA_ENABLED_AGGREGATIONS;
-- information about enabled SQL traces
selct *
from DBA_ENABLED_TRACES;
Rest r i ct ed Sessi on and Ser vi ces
I f t he rest rict ed inst ance is manually regist ered in t he list ener, t he incoming connect ion
requrest s may be rout ed t o t he inst ance, refused by t he inst ance and ret urns error.
I f t he rest rict ed inst ance is dynamically regist ered in t he list ener, t he incoming connect ion
requrest s will not be rout ed t o t he inst ance, even for users wit h RESTRI CTED SESSI ON
privilege.
Page 468 Oracle DBA Code Examples
Conf i g ur i ng Recov er y Manager and Ar chi v i ng
Back up Possi bl e Di st r i but i ons i n RAC
Net w or k back up ser v er : dedicat ed backup server manages backups for t he whole RAC.
One l ocal dr i v e: one node has access t o a local backup appliance.
/* Multiple Drives CFS Backup Scheme */
-- cfs = all nodes have their archived log in shared storage
-- one time setup
CONFIGURE DEVICE TYPE sbt PARALLELISM 3;
CONFIGURE DEFAULT DEVICE TYPE TO sbt;
CONFIGURE CHANNEL 1 DEVICE TYPE sbt CONNECT 'user1/passwd1@node1';
CONFIGURE CHANNEL 2 DEVICE TYPE sbt CONNECT 'user2/passwd2@node2';
CONFIGURE CHANNEL 3 DEVICE TYPE sbt CONNECT 'user3/passwd3@node3';
-- backup is then distributed in all backup tapes in the cluster
BACKUP DATABASE PLUS ARCHIVELOG DELETE INPUT;
Mul t i pl e dr i v es: each node has access t o a local backup appliance.
RMAN Rest or e Scenar i os f or Real Appl i cat i on Cl ust er s
Cl ust er Fi l e Syst em Rest or e Scheme
1. Make t he Backup media and all t he Archived Log files available t o t he available node.
2. Then Rest ore using RESOTRE DATABASE and RECOVER DATABASE commands.
Non- Cl ust er Fi l e Sy st em Rest or e Scheme
1. You must configure a net work file syst em file so t hat t he recovery node can read t he
archiving direct ories on t he remaining nodes.
2. Then Rest ore using RESOTRE DATABASE and RECOVER DATABASE commands.
RMAN and Or acl e Net i n Real Appl i cat i on Cl ust er s
Connect ion server must be dedicat ed.
Each net service name must specify only one inst ance.
Connect i ng t o Speci f i c Node
rman TARGET=SYS/ORACLE@RAC1 CATALOG=RMAN/RMAN@RMAN
Page 469 Oracle DBA Code Examples
I nst ance Recover y i n Real Appl i cat i on Cl ust er s
Si ngl e Node Fai l ur e i n Real Appl i cat i on Cl ust er s
When one inst ance performs recovery for anot her inst ance, t he surviving inst ance reads
online redo logs generat ed by t he failed inst ance and uses t hat informat ion t o ensure t hat
commit t ed t ransact ions are recorded in t he dat abase.
Mul t i pl e- Node Fai l ur es i n Real Appl i cat i on Cl ust er s
I f all inst ances of an Oracle RAC dat abase fail, t hen Oracle aut omat ically recovers t he
inst ances t he next t ime one inst ance opens t he dat abase.
Conf i gur i ng t he RMAN Snapshot Cont r ol Fi l e Locat i on
The snapshot cont rol file is a t emporary snapshot cont rol file t hat RMAN creat es t o re-
synchronize from a read- consist ent version of t he cont rol file.
-- configured location of the snapshot control file
SHOW SNAPSHOT CONTROLFILE NAME;
-- to change it (globally in all nodes)
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '$ORACLE_HOME/dbs/scf/snap_prod.cf';
Conf i gur i ng t he RMAN Cont r ol Fi l e and SPFI LE Aut oback up Feat ur e
# switch it on
CONFIGURE CONTROLFILE AUTOBACKUP ON;
# Auto control file and spfile backup must be configured in a shared location.
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT = '/u02/oradata/RAC/cf_%F';
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '+FRA';
# in the recovery destination
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F';
Conf i gur i ng Channel s f or RMAN i n Real Appl i cat i on Cl ust er s
Conf i gur i ng Channel s t o use Aut omat i c Wor k l oad Bal anci ng
CONFIGURE DEVICE TYPE [disk | sbt] PARALLELISM number of channels;
# configure the SQL Net service name with load balancing turned on
CONFIGURE CHANNEL DEVICE TYPE SBT CONNECT 'sys/pwd1@<service_name>'
Conf i gur i ng Channel s t o Use a Speci f i c I nst ance
# manual instance assignment
# To configure channels to use a specific instance, use the following syntax:
CONFIGURE DEVICE TYPE sbt PARALLELISM 2;
CONFIGURE CHANNEL 1 DEVICE TYPE sbt CONNECT 'SYS/pss@rac1'
CONFIGURE CHANNEL 2 DEVICE TYPE sbt CONNECT 'SYS/pss@rac2'
# Automatic instance assignment
Page 470 Oracle DBA Code Examples
# you can configure special service for rman jobs
# service workload will be used
CONFIGURE DEFAULT DEVICE TYPE TO sbt;
CONFIGURE DEVICE TYPE sbt PARALLELISM 3;
CONFIGURE CHANNEL DEVICE TYPE sbt CONNECT='sys/rac@rmanserv';
# also, parallel configuration will distribute the job on multiple instances
CONFIGURE DEVICE TYPE sbt PARALLELISM 3;
# configuring channels manually
RUN
{
ALLOCATE CHANNEL CH1 CONNECT 'user1/pwd1@node1';
ALLOCATE CHANNEL CH2 CONNECT 'user2/pwd2@node2';
ALLOCATE CHANNEL CH3 CONNECT 'user3/pwd3@node3';
BACKUP DATABASE PLUS ARCHIVED LOG;
}
Node Af f i ni t y Aw ar eness of Fast Connect i ons
When deciding which channel t o use t o back up a part icular dat afile, RMAN gives
preference t o t he nodes wit h fast er access t o t he dat afiles t hat you want t o back up.
Ar chi ved Redo Log Fi l e Convent i ons i n RAC
show parameter LOG_ARCHIVE_FORMAT
alter system set LOG_ARCHIVE_FORMAT='log_%t_%s_%r.arc' scope=spfile sid='*';
Ar chi ve Redo Log Conf i gur at i on Scenar i os
Aut omat i c St or age Management and CFS Ar chi v i ng Scheme
The preferred configurat ion for RAC is t o use Aut omat ic St orage Management ( ASM) for a
recovery area wit h a different disk group for your recovery set t han for your dat afiles.
show parameter archive_dest
show parameter recovery
# each node archives to a directory with the same name on all instances
sid1.LOG_ARCHIVE_DEST_1="LOCATION=/arc_dest"
sid2.LOG_ARCHIVE_DEST_1="LOCATION=/arc_dest"
sid3.LOG_ARCHIVE_DEST_1="LOCATION=/arc_dest"
Non- Cl ust er Fi l e Sy st em Local Ar chi v i ng Scheme
I n t he non-clust er file syst em local archiving scheme, each node archives t o a uniquely
named local direct ory. The direct ory in each node can be read only mount ed from t he
ot her nodes.
# archived log stored locally and the other locations can be read by the node
# (for recovery)
sid1.LOG_ARCHIVE_DEST_1="LOCATION=/arc_dest_1"
sid2.LOG_ARCHIVE_DEST_1="LOCATION=/arc_dest_2"
sid3.LOG_ARCHIVE_DEST_1="LOCATION=/arc_dest_3"
Page 471 Oracle DBA Code Examples
Changi ng t he Ar chi vi ng Mode i n Real Appl i cat i on Cl ust er s
select log_mode from v$database;
srvctl stop database -d rac
Back up the database
set LOG_ARCHIVE_DEST_n
show parameter LOG_ARCHIVE_DEST
-- no instance in OPEN mode
STARTUP MOUNT
ALTER DATABASE ARCHIVELOG;
SHUTDOWN IMMEDIATE
Back up the database
srvctl start database -d rac
Del et i ng Ar chi ved Redo Logs af t er a Successf ul Back up
# if automatic channels are configured
DELETE ARCHIVELOG ALL BACKED UP n TIMES TO DEVICE TYPE device_type;
# configuring the channels manually
ALLOCATE CHANNEL FOR MAINTENANCE DEVICE TYPE DISK CONNECT 'SYS/oracle@node1';
ALLOCATE CHANNEL FOR MAINTENANCE DEVICE TYPE DISK CONNECT 'SYS/oracle@node2';
ALLOCATE CHANNEL FOR MAINTENANCE DEVICE TYPE DISK CONNECT 'SYS/oracle@node3';
DELETE ARCHIVELOG ALL BACKED UP n TIMES TO DEVICE TYPE device_type;
Moni t or i ng t he Ar chi ver Pr ocesses
SELECT A.INST_ID, A.PROCESS, A.STATUS, A.LOG_SEQUENCE, A.STATE
FROM GV$ARCHIVE_PROCESSES A
WHERE STATUS<>'STOPPED'
ORDER BY A.INST_ID
# archived log files
SELECT INST_ID , THREAD#, NAME FROM GV$ARCHIVED_LOG;
Log_Ar chi ve_Dest _1 Set To Def aul t Even When DB_Recover y_Fi l e_Dest I s
Set ( Bug 6373164)
You should t ake t his bug int o considerat ion on Oracle 11. 1. 0. 6. I f you j ust leave DEST_10
point ing t o t he flash recovery areas ( as t he default case) , DEST_1 will also point t o t he default
locat ion: ORACLE_HOME\ RDBMS
Here are t he st eps t o reproduce t he bug:
When I disable LOG_ARCHI VE_DEST_1, t he v$paramet er and V$ARCHI VE_DEST are
correct ly updat ed. But aft er I rest art t he db, t he LOG_ARCHI VE_DEST_1 is NULL in
v$paramet er but it point s t o C: \ app\ Administ rat or\ product \ 11. 1. 0\ db_1\ RDBMS in
V$ARCHI VE_DEST.
DEST_10 is point ing t o t he recovery area but it ' s shown by V$ARCHI VE_DEST and not by
v$paramet er. I also not iced Oracle writ es archive log files in t he bot h dest inat ions:
DB_RECOVERY_FI LE_DEST and t he default one.
Page 472 Oracle DBA Code Examples
Wor k ar ound: Explicit ly set LOG_ARCHI VE_DEST_1 t o
LOCATI ON= USE_DB_RECOVERY_FI LE_DEST
SQL> select schedule, destination
2 from V$ARCHIVE_DEST
3 where dest_name='LOG_ARCHIVE_DEST_1';
SCHEDULE DESTINATION
-------- ----------------------------------------------
ACTIVE C:\app\Administrator\product\11.1.0\db_1\RDBMS
SQL> select name, value
2 from v$parameter
3 where upper(name) like 'LOG_ARCHIVE_DEST_1';
NAME VALUE
------------------------------ ------------------
log_archive_dest_1
SQL> alter system set LOG_ARCHIVE_DEST_1='' scope=both;
System altered.
SQL> select schedule, destination
2 from V$ARCHIVE_DEST
3 where dest_name='LOG_ARCHIVE_DEST_1';
SCHEDULE DESTINATION
-------- ---------------------------------
INACTIVE
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 431038464 bytes
Fixed Size 1333676 bytes
Variable Size 343934548 bytes
Database Buffers 79691776 bytes
Redo Buffers 6078464 bytes
Database mounted.
Database opened.
SQL> select name, value
2 from v$parameter
3 where upper(name) like 'LOG_ARCHIVE_DEST_1';
NAME VALUE
------------------------------ ------------------
Page 473 Oracle DBA Code Examples
log_archive_dest_1
SQL> select schedule, destination
2 from V$ARCHIVE_DEST
3 where dest_name='LOG_ARCHIVE_DEST_1';
SCHEDULE DESTINATION
-------- ----------------------------------------------
ACTIVE C:\app\Administrator\product\11.1.0\db_1\RDBMS
SQL> select schedule, destination
2 from V$ARCHIVE_DEST
3 where dest_name='LOG_ARCHIVE_DEST_10';
SCHEDULE DESTINATION
-------- ----------------------------------
ACTIVE USE_DB_RECOVERY_FILE_DEST
SQL> select name, value
2 from v$parameter
3 where upper(name) like 'LOG_ARCHIVE_DEST_10';
NAME VALUE
------------------------------ -------------------
log_archive_dest_10
Medi a Recover y i n Real Appl i cat i on Cl ust er s
Same as st andalone dat abase.
Par al l el Recover y i n Real Appl i cat i on Cl ust er s
When parallelism is configured, Oracle aut omat ically use t he opt imum degree of
parallelism for recovery.
# Disabling Instance and Crash Recovery Parallelism
configure RECOVERY_PARALLELISM to 0
# Disabling Media Recovery Parallelism
RMAN> RECOVER DATABASE NOPARALLEL
SQL>ALTER DATABASE RECOVER NOPARALLEL
Usi ng a Fl ash Recover y Ar ea i n RAC
Set t he paramet er DB_RECOVERY_FI LE_DEST t o a shared locat ion and must be t he same
value on all inst ances.
Page 474 Oracle DBA Code Examples
Managi ng Back up and Recov er y
Page 475 Oracle DBA Code Examples
Admi ni st r at i v e Opt i ons
Usi ng Ent er pr i se Manager Gr i d Cont r ol t o Di scover Nodes and I nst ances
To discover t arget s if a dat abase is creat ed aft er agent s are inst alled or if a dat abase is not
aut omat ically discovered at agent inst all t ime:
1. Log in t o Ent erprise Manager and click t he Tar get s t ab.
2. Click t he Dat abase t ab t o view all of t he available t arget s. The column labeled Ty pes
shows t he Oracle RAC dat abases using t he ent ry "Cl ust er Dat abase".
3. Select t he t ar get name, t hen clicking Add. The Add Dat abase Target : Specify Host page
appears, which enables you t o add dat abases, List eners, and Aut omat ic St orage
Management ( ASM) as monit ored t arget s.
4. Click t he f l ashl i ght i con t o display t he available host names, select a host , t hen click
Cont i nue. The Add Dat abase: Specify Source page appears.
5. Eit her request Ent erprise Manager t o discover only single- inst ance dat abases and
List eners, or t o discover all clust er dat abases, single- inst ance dat abases, and List eners on
t he clust er, t hen click Cont i nue.
6. Ent erprise Manager performs discovery t o locat e and display t he clust er dat abase and it s
associat ed inst ances. The Target s Discovered on Clust er page appears. I f t his procedure
did not discover your reconfigured clust er dat abase and all of it s inst ances, you can use
t his page t o manually configure your clust er dat abases and single- inst ance dat abases.
Addi t i onal I nf or mat i on About SQL* Pl us i n RAC
How SQL* Pl us Commands Af f ect I nst ances
Most SQL st at ement s affect t he current inst ance.
ALTER SYSTEM SWI TCH LOGFI LE affect s only t he current inst ance.
o To force a global log swit ch, use t he ALTER SYSTEM ARCHI VE LOG CURRENT
st at ement .
o The I NSTANCE opt ion of ALTER SYSTEM ARCHI VE LOG enables you t o archive each
online redo log file for a specific inst ance.
Di spl ayi ng Runni ng I nst ances
SHOW INSTANCE
SELECT * FROM V$ACTIVE_INSTANCES;
Di spl ayi ng Connect I dent i f i er
use SQLPROMPT Command _CONNECT_IDENTIFIER
SET SQLPROMPT "_CONNECT_IDENTIFIER _USER > "
Page 476 Oracle DBA Code Examples
Qui esci ng RAC Dat abases
The ALTER SYSTEM QUI ESCE RESTRI CTED and ALTER SYSTEM UNQUI ESCE st at ement s
affect all inst ances in an Oracle RAC environment .
ALTER SYSTEM QUIESCE RESTRICTED;
To set t he dat abase in t he QUI ESCE st at e, t he Dat abase Resource Manager must be
act ivat ed in all t he inst ances.
-- to make sure the resource manager is active (not null)
select value from v$parameter where upper(name)='RESOURCE_MANAGER_PLAN';
Qui esced St at e and Col d Back ups
You cannot use t he quiesced st at e t o t ake a cold backup.
Tr anspar ent Dat a Encr ypt i on and Wal l et s i n RAC
One wallet shared by all inst ances on shared st orage.
One copy of t he wallet on each local st orage: Local copies need t o be synchronized each
t ime mast er key is changed.
The wallet must reside in the directory specified by the setting for the
WALLET_LOCATION or ENCRYPTION_WALLET_LOCATION parameter in sqlnet.ora.
Admi ni st er i ng Syst em and Net w or k I nt er f aces w i t h oi f cf g
Def i ni ng Net w or k I nt er f aces w i t h oi f cf g
Sy nt ax and Commands f or t he oi f cf g Command- Li ne Tool
Oracle Interface Configuration
oifcfg -help
oifcfg iflist
oifcfg getif [ [-global | -node nodename] [-if if_name[/subnet]] [-type
if_type] ]
# store the interface hme0, with the subnet 139.185.141.0, as a global
# interface (to be used as an interconnect for all of the RAC instances in
your cluster)
oifcfg setif -global hme0/139.185.141.0:cluster_interconnect
# create the cms0 interface in rac1 and rac2
oifcfg setif -node rac1 cms0/139.185.142.1:cluster_interconnect
oifcfg setif -node rac2 cms0/139.185.142.2:cluster_interconnect
# deleting an interface
# CAUTION: when no option provided, all interfaces will be deleted:
oifcfg delif -global qfe0/204.152.65.16
# all global interfaces will be deleted
oifcfg delif -global
Page 477 Oracle DBA Code Examples
Changi ng Publ i c or I nt er connect I P Subnet Conf i gur at i on
A net work int erface can be st ored as a global int erface or as a node-specific int erface. An
int erface is st ored as a global int erface when all t he nodes of a RAC clust er have t he same
int erface connect ed t o t he same subnet ( recommended). I t is st ored as a node- specific
int erface only when t here are some nodes in t he clust er t hat have a different set of
int erfaces and subnet s.
su -
$CRS_HOME/bin/oifcfg getif
oifcfg delif -global eth0
oifcfg setif global eth0/139.2.166.0:public
oifcfg delif global eth1
oifcfg setif global eth1/192.168.1.0:cluster_interconnect
oifcfg getif
Changi ng VI P Addr esses
I f only t he I P address is changed, it is not necessary t o make changes t o t he list ener. ora,
t nsnames. ora and init ializat ion paramet er files, provided t hey are using t he virt ual host
names. I f changing bot h t he virt ual host name and t he VI P address for a node, it will be
necessary t o modify t hose files wit h t he new virt ual host name. For t he list ener.ora
file, you can use net ca t o remove t he old list ener and creat e a new list ener. I n addit ion,
changes will need t o be made t o t he t nsnames. ora file of any client s connect ing t o t he old
virt ual host name.
1. Confirm the current IP address for the VIP by running the ifconfig a
command. On Windows, run the ipconfig /all command.
ifconfig a
2. Stop First, the database instance, and then the ASM instance. When done,
stop nodeapps.
srvctl stop instance ..
srvctl stop asm ..
srvctl stop nodeapps
3. Verify that the VIP is no longer running by executing the ifconfig -a
command again:
ifconfig a
If the interface still online, this is an indication that a resource which is
dependent on the VIP is still running. The crs_stat -t command can help to
show resources that are still online:
crs_stat -t
4. Make any changes necessary to all nodes' /etc/hosts files (on UNIX), or
\WINNT\System32\drivers\etc\hosts files on Windows, and make the necessary DNS
changes, to associate the new IP address with the old host name.
5. Modify nodeapps and provide the new virtual IP address:
su -
srvctl modify nodeapps -n rac1 -A 192.168.2.125/255.255.255.0/eth0
6. Start nodeapps again.
srvctl start nodeapps -n rac1
Page 478 Oracle DBA Code Examples
7. Repeat the same steps for all the nodes in the cluster. You can stay
connected from the first node.
8. verifies the connectivity between all of the nodes.
cluvfy comp nodecon -n all [-verbose]
9. Restart all of the instances and node applications
Page 479 Oracle DBA Code Examples
Addi ng Nodes and I n st ances on UNI X- Based Sy st ems
Addi ng Nodes t o a RAC Envi r onment
I n adding nodes t o a clust er, t here are t hree procedures t hat can be used:
Cloning: copy images of Oracle Clust erware and RAC soft ware ont o t he ot her nodes t hat
have ident ical hardware and soft ware.
OEM: GUI of cloning.
I nt eract ive or silent procedures using script s and DBCA.
Cl oni ng Or acl e Cl ust er w ar e and RAC Sof t w ar e i n Gr i d Envi r onment s
Pr er equi si t es
Make t he required prerequisit es changes on OS t o prepare t he node for t he soft ware
cloning. The st eps st at ed in t he Preinst allat ion Tasks illust rat es t he st eps required for
Oracle 10g R2 for Oracle Linux Ent erprise 4. 5 for x86.
Met alink document I D 169706. 1 is quick reference of OS I nst allat ion and Configurat ion
Requirement s.
The DB Console should be inst alled so t hat t he required Perl files are inst alled in
$ORACLE_HOME/ clone/ bin
I f t he server has more t han one Perl version inst alled, it may be necessary t o specify
t he PERL5LI B environment variable so t hat t he versions of t he Perl modules mat ch
wit h t he Perl version used.
Cl oni ng Pr ocedur e St eps
Cl oni ng Or acl e10g Rel ease 2 on Or acl e Li nux Ent er pr i se 4. 5 f or x 86 Usi ng OUI :
1. To ensure t he int egrit y of t he copy, shut down any dat abases, list eners, agent s et c. t hat
are running from t he source home.
2. Clone t he Oracle Clust erware home t hen Oracle Dat abase home
cd /u01/crs
tar -cvf /tmp/sourcecrs.tar
cd /u01/app/oracle/product/10.2.0
tar -cvf /tmp/sourcedb.tar
3. Make sure t he required users and groups are t here on t he new node
id oracle
id oinstall
4. Ext ract t he t ar file
cd /u01/crs
tar -xvf /tmp/sourcecrs.tar
cd /u01/app/oracle/product/10.2.0
tar -xvf /tmp/sourcedb.tar
5. Run t he Oracle Universal I nst aller ( OUI ) in clone mode
/* Method 1 */
cd $ORACLE_HOME/clone/bin
perl clone.pl ORACLE_HOME="<target_home>" ORACLE_HOME_NAME="<unique_home_name>"
/* Method 2 */
cd $ORACLE_HOME/oui/bin
./runInstaller -clone -silent -ignorePreReq ORACLE_HOME="<target_home>"
ORACLE_HOME_NAME="<unique_home_name>"
I f necessary, add "- invPt rLoc < pat h> / oraI nst . loc" or "- ignoreSysPrereqs" t o t he command
line.
Page 480 Oracle DBA Code Examples
6. Run t he inst allat ion script s
$ORACLE_HOME/root.sh
7. Repeat st eps 1 t o 5 on Oracle home wit h RAC soft ware
8. Run t he Oracle Net Configurat ion Assist ant ( NETCA) on t he new node t o creat e a List ener.
9. Make if necessary, any modificat ion in t he t nsnames.ora file.
10. To st art t he dbconsole on t he new server, refer t o Met alink Not e 467598. 1 and Not e
278100.1 for
Qui ck - St ar t Node and I nst ance Addi t i on Pr ocedur es
Pr er equi si t es
Make t he required prerequisit es changes on OS t o prepare t he node for t he soft ware
cloning.
o The st eps st at ed in Preinst allat ion Tasks illust rat es t he st eps required for Oracle
10g R2 for Oracle Linux Ent erprise 4.5 for x86. Be careful about t he following
changes in t he st eps:
The examples in t his sect ions assumes t he node t o add has t he ip
addresses public: 192. 168.4. 15, vip: 192.168. 4. 17, priv: 192. 168.0. 15
wit h host name of rac3.
ORACLE_SI D= rac3 in t he .bash_profile file
Be careful NOT t o part it ion t he disks as t hey are already part it ioned
and used by t he ot her node(s) . However, raw disks must be binded.
Domain name resolut ion ( / et c/ host s) must apply in all nodes
Remot e inst allat ion procedure must be redone t o all nodes.
Met alink document I D 169706. 1 is quick reference of OS I nst allat ion and Configurat ion
Requirement s for t he support ed Operat ing Syst ems.
Addi ng an Or acl e Cl ust er w ar e Home t o a New Node
Pract ically, I not iced t he procedure does not work unless all t he exist ing nodes in t he RAC
are alive.
# (1) run add node in rac1
# as oracle
export CRS_HOME=/u01/crs
cd $CRS_HOME/oui/bin
./addNode.sh
# Specify the New Nodes then Next
# Verify the new node names in the Summary page then Finish (copy size:80 MB)
# run the scripts as indicated by OUI. They must be:
# /u01/app/oracle/oraInventory/orainstRoot.sh in rac3
# /u01/crs/install/rootaddnode.sh in rac1
# in rac3: EDIT root.sh and fix the node list in its header BEFORE running it
# /u01/crs/root.sh in rac3
# exit the OUI
## if root.sh failed, you can cancel its effect by running:
# $CRS_HOME/install/rootdelete.sh
# (2) rac1 as oracle: run the Oracle Notification Service (RACGONS)
# obtain remote port number
cat $CRS_HOME/opmn/conf/ons.config
$CRS_HOME/bin/racgons add_config rac3:6200
#to verify
ping rac3-vip
crs_stat -t
Page 481 Oracle DBA Code Examples
# if you're using vmware, make backup of the environment now.
Addi ng an Or acl e Home w i t h RAC t o a New Node
OUI can be used int eract ively or in silent mode. This example shows t he int eract ive mode
st eps.
# (1) copy Oracle home
# in rac1 as oracle
cd $ORACLE_HOME/oui/bin
./addNode.sh
# select node then Next
# verify info in the Summary page then Next
# about 1.5 GB will be copied to rac3
# run the required script
# (2) add Listener
# rac3 as oracle: run netca to add a listener in rac3 node (select rac3 ONLY)
$ORACLE_HOME/bin/netca
# (3) create db instance as descried in "Adding Database Instances to New
Nodes"
# (4) Perform Postinstallation Steps. Be aware to check the ASM instance name
before editing /etc/oractab file: ps -ef | grep asm
# (5) Review $ORACLE_HOME/network/admin/tnsnames.ora file and fix node
# names errors, if any.
# (6) preferably perform General Useful Postinstallation Tasks.
Det ai l ed Node and I nst ance Addi t i on Pr ocedur e
St ep 1: Connect i ng New Nodes t o t he Cl ust er
Making Physical Connect ions
I nst alling t he Operat ing Syst em
Creat ing Oracle Users
Verifying t he I nst allat ion wit h t he Clust er Verificat ion Ut ilit y
Checking t he I nst allat ion
St ep 2: Ex t endi ng Cl ust er w ar e and Or acl e Sof t w ar e t o New Nodes
Adding Nodes at t he Vendor Clust erware Layer
Adding Nodes at t he Oracle Clust erware Layer
St ep 3: Pr epar i ng St or age on New Nodes
Raw Device St orage Preparat ion for New Nodes
Page 482 Oracle DBA Code Examples
St ep 4: Addi ng Nodes at t he Or acl e RAC Dat abase Layer
St ep 5: Addi ng Dat abase I nst ances t o New Nodes
Using Ent erprise Manager t o Add Dat abase I nst ances t o New Nodes
Using DBCA in I nt eract ive Mode t o Add Dat abase I nst ances t o New Nodes
1. St art dbca in rac1:
$ORACLE_HOME/bin/dbca &
2. Follow: Real Applicat ion Clust er- > I nst ance Management - > Add I nst anc- > Select RAC
dat abase- > Next - > Ent er t he I nst ance Name, select node- > Ent er service info- >
$CRS_HOME/bin/crs_stat -t
srvctl start service -d rac -s "hrserv" -i rac3
srvctl start service -d rac -s "oeserv" -i rac3
Using DBCA in Silent Mode t o Add Dat abase I nst ances t o New Nodes
Page 483 Oracle DBA Code Examples
Del et i ng Nodes and I nst an ces on UNI X- Based Sy st ems
Opt i on 1: Qui ck - St ar t Node and I nst ance Del et i on Pr ocedur es
Oracle Dat abase home is always delet ed first , t hen t he Clust erware home is delet ed.
Quick- St art node and inst ance delet eion procedure could be t he convenient opt ion when
you want t o delet e one or t wo nodes.
Del et i ng an Or acl e Home w i t h RAC f r om an Ex i st i ng Node
The t arget here is t o delet e t he Oracle dat abase home. OUI can be used in int eract ive or
silent mode t o acheive t his t arget . I nt eract ive met hod is shown here.
The example below assumes t hat you remove Oracle Dat abase home from a node named
rac2:
1. Remove rac2 from t he available or preferred list of all t he services:
# list the services
srvctl status service -d rac
# stop the services in rac2
srvctl stop service -d rac -s hrserv -i rac2
srvctl stop service -d rac -s oeserv -i rac2
# check rac2 is used by any service
srvctl config service -d rac
# my services available only in the remaining nodes
srvctl modify service -d rac -s hrserv -n -i rac1
srvctl modify service -d rac -s oeserv -n -i rac1
# confirm
srvctl config service -d rac
2. From rac1, remove DB inst ance in rac2 using DBCA (OEM can also be used) . Follow t he
st eps as in t he sub-sect ion "Using DBCA in I nt eract ive Mode t o Delet e Dat abase
I nst ances from Exist ing Node ". To confirm: s
crs_stat -t
3. Delet e ASM inst ance as described in t he sub- sect ion "ASM I nst ance Clean- Up Procedures
for Node Delet ion".
4. Use NETCA t o remove t he list ener. To confirm:
crs_stat -t
5. St op nodeapps from rac2 t hen remove t hem.
su -
cd /u01/crs/bin
./srvctl stop nodeapps -n rac2
./crs_stat -t
./srvctl remove nodeapps -n rac2
6. On rac2, t o make t he OUI remove t he soft ware home only from rac2:
su - oracle
echo $ORACLE_HOME
export ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1
Page 484 Oracle DBA Code Examples
cd $ORACLE_HOME/oui/bin
./runInstaller -updateNodeList ORACLE_HOME=$ORACLE_HOME "CLUSTER_NODES={rac2}"
local
7. Run OUI from t he home and deinst all t his home. Make sure t hat you choose t he home t o
be removed and not j ust t he product s under t hat home.
./runInstaller &
8. On rac1, run t he following command where "CLUSTER_NODES= { remaining_list } ":
echo $ORACLE_HOME
export ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1
cd $ORACLE_HOME/oui/bin
./runInstaller -updateNodeList ORACLE_HOME=$ORACLE_HOME "CLUSTER_NODES={rac1}"
Del et i ng an Or acl e Cl ust er w ar e Home f r om an Ex i st i ng Node
The t arget here is t o delet e t he Oracle Clust erware home from a node. OUI can be used in
int eract ive or silent mode t o acheive t his t arget . I nt eract ive met hod is shown here.
The example below assumes t hat you remove Oracle Clust erware home from a node named
as rac2:
1. Makre sure Oracle Dat abase home was removed before going on t he clust erware home
delet ion procedure.
2. I f you ran t he Oracle I nt erface Configurat ion Tool ( OI FCFG) wit h t he - global flag during
t he inst allat ion, t hen skip t his st ep. Ot herwise, from a node t hat is going t o remain in
your clust er, from t he CRS_home/ bin direct ory, run t he following command:
./oifcfg delif node rac2
3. Obt ain t he remot e port number, which you will use in t he next st ep, using t he following
command from t he CRS_HOME/ opmn/ conf direct ory:
echo $CRS_HOME
export CRS_HOME=/u01/crs
cd $CRS_HOME/opmn/conf
cat ons.config
4. I n rac1: run t he Oracle Not ificat ion Service ( RACGONS)
cd $CRS_HOME/bin
./racgons remove_config rac2:remote_port
5. On rac2 as root :
su -
export CRS_HOME=/u01/crs
$CRS_HOME/install/rootdelete.sh
6. On rac1 as root : run ./rootdeletenode.sh node2,node2-number
su -
export CRS_HOME=/u01/crs
# if you want to identify the node number
$CRS_HOME/bin/olsnodes -n
$CRS_HOME/install/rootdeletenode.sh rac2,2
$CRS_HOME/bin/olsnodes -n
Page 485 Oracle DBA Code Examples
7. On rac2:
su - oracle
export CRS_HOME=/u01/crs
cd $CRS_HOME/oui/bin
./runInstaller -updateNodeList ORACLE_HOME=$CRS_HOME "CLUSTER_NODES={rac2}"
CRS=TRUE -local
8. On rac2, de- inst all t he Oracle Clust erware using t he OUI :
cd $CRS_HOME/oui/bin
./runInstaller &
9. On rac1, where "CLUSTER_NODES= { remaining_nodes_list } ":
su - oracle
cd $CRS_HOME/oui/bin
./runInstaller -updateNodeList ORACLE_HOME=$CRS_HOME "CLUSTER_NODES={rac1}"
CRS=TRUE
crs_stat -t
olsnodes -n
Opt i on 2: Det ai l ed Node and I nst ance Del et i on Pr ocedur e
Det ailed node and inst ance delet eion procedure could be more convenient when you want
t o delet e high number of nodes.
St ep 1: Del et i ng DB I nst ances f r om Real Appl i cat i on Cl ust er s Dat abases
Usi ng Ent er pr i se Manager t o Del et e Dat abase I nst ances f r om Ex i st i ng Nodes
Follow t he links: Clust er Dat abase Home page- > Maint enance- > Deployment s sect ion->
Delet e I nst ance- > Delet ion Wizard st art s
Usi ng DBCA i n I nt er act i v e Mode t o Del et e Dat abase I nst ances f r om Exi st i ng Nodes
1. On rac1, open DBCA from Oracle home.
2. On t he DBCA Welcome page select Oracle Real Applicat ion Clust ers Dat abase, click
Next
3. On t he DBCA Operat ions page, select I nst ance Management , click Next
4. On t he I nst ance Management page, Select Delet e I nst ance, click Next
5. On t he List of Clust er Dat abases page, select t he Oracle RAC dat abase. Ent er a
SYSDBA user name and password. Click Next
6. On t he List of Clust er Dat abase I nst ances page, select an inst ance t o delet e and click
Finish.
7. I f you have services assigned t o t his inst ance, t hen t he DBCA Services Management
page appears. Use t his feat ure t o reassign services from t his inst ance t o ot her
inst ances in t he clust er dat abase.
8. On t he Summary page and click OK.
9. DBCA removes t he inst ance and t he inst ance' s Oracle Net configurat ion.
10. Aft er complet ion, exit DBCA
Page 486 Oracle DBA Code Examples
Usi ng DBCA i n Si l ent Mode t o Del et e I nst ance f r om Ex i st i ng Nodes
1. General Synt ax:
dbca -silent -deleteInstance [-nodeList node] -gdbName gdbname instanceName
instname -sysDBAUserName sysdba -sysDBAPassword password
-- if running form rac2:
dbca -silent -deleteInstance -gdbName rac -instanceName rac2 -sysDBAUserName
sys -sysDBAPassword syspassword
-- if running from rac1:
dbca -silent -deleteInstance -nodeList rac2 -gdbName rac -instanceName rac2 -
sysDBAUserName sys -sysDBAPassword syspassword
St ep 2: Del et i ng Nodes f r om Real Appl i cat i on Cl ust er s Dat abases
The example assumes rac2 is t he node t o delet e and t hat Oracle home is local ( not shared) .
1. I f t here are inst ances on t he node t hat you want t o delet e, t hen perform one of t he
procedures in t he previous sect ion Set p1 .
2. Perform ASM clean up procedure as described in t he sub- sect ion "ASM I nst ance Clean-
Up Procedures for Node Delet ion".
3. Use NETCA t o remove t he list ener from rac2.
4. On rac2:
cd $ORACLE_HOME/oui/bin
runInstaller -updateNodeList ORACLE_HOME=$ORACLE_HOME CLUSTER_NODES="" local
5. Run OUI from t he home and deinst all t his home. Make sure t hat you choose t he home t o
be removed and not j ust t he product s under t hat home.
./runInstaller &
6. On rac1, where "CLUSTER_NODES= { node_list } ":
runInstaller -updateNodeList ORACLE_HOME=Oracle_home "CLUSTER_NODES={rac1}"
7. Remove node-specific int erface configurat ions:
# to obtain port number
echo $CRS_HOME
export CRS_HOME=/u01/crs
cd $CRS_HOME/opmn/conf
cat ons.config
racgons remove_config rac2:<remote_port>
oifcfg delif -node rac2
8. On rac2, disable t he Oracle Clust erware applicat ions t hat are on t he node:
echo $CRS_HOME
export CRS_HOME=/u01/crs
cd $CRS_HOME/install
# If the ocr.loc file is on a local file system
rootdelete.sh remote nosharedvar
# If the ocr.loc file is on a shared file system
rootdelete.sh remote sharedvar
Page 487 Oracle DBA Code Examples
9. On any remaining node in t he clust er ( rac1), t o delet e t he nodes from t he Oracle clust er
and t o updat e t he Oracle Clust er Regist ry (OCR) :
su -
echo $CRS_HOME
export CRS_HOME=/u01/crs
# to display node numbers
$CRS_HOME/bin/olsnodes -n.
# to delete the node
# general syntax: rootdeletenode.sh node1,node1-number,node2,node2-number,...
$CRS_HOME/install/rootdeletenode.sh rac2,2
10. On rac2:
$CRS_HOME/oui/bin/runInstaller -updateNodeList ORACLE_HOME=$CRS_HOME
CLUSTER_NODES="" local CRS=true
11. Run OUI from t he home and deinst all t his home. Make sure t hat you choose t he home t o
be removed and not j ust t he product s under t hat home.
$CRS_HOME/oui/bin/runInstaller &
12. On rac1, where "CLUSTER_NODES= { ramining_nodelist } ":
runInstaller -updateNodeList ORACLE_HOME=CRS_home "CLUSTER_NODES=rac1"
13. Verify node removal:
cluvfy comp crs -n all [-verbose]
ASM I nst ance Cl ean- Up Pr ocedur es f or Node Del et i on
The t arget here is t o remove ASM inst ance from a node.
1. St op, if any, all of t he dat abases t hat use t he ASM inst ance. I f you follow t his procedure
as part of a node delet ion, t he Db inst ance must have been removed by t his st ep.
2. On rac2:
srvctl stop asm -n rac2
srvctl remove asm -n rac2
srvctl config asm -n rac2
srvctl config asm -n rac1
crs_stat -t
3. On rac2:
rm -r $ORACLE_BASE/admin/+ASM
rm -f $ORACLE_HOME/dbs/*ASM*
Page 488 Oracle DBA Code Examples
Addi ng and Del et i ng Nodes an d I nst ances on
Wi ndow s- Based Sy st ems
Page 489 Oracle DBA Code Examples
Cl oni ng Or acl e Cl ust er w ar e and RAC Sof t w ar e i n Gr i d Envi r onment s
Qui ck - St ar t Node and Dat abase I nst ance Addi t i on and Del et i on Pr ocedur es
Addi ng an Or acl e Cl ust er w ar e Home t o a New Node
Addi ng an Or acl e Home w i t h RAC t o a New Node
Del et i ng an Or acl e Home w i t h RAC f r om an Ex i st i ng Node
Del et i ng an Or acl e Cl ust er w ar e Home f r om an Ex i st i ng Node
Det ai l ed Node and Dat abase I nst ance Addi t i on and Del et i on Pr ocedur es
Over vi ew of Node Addi t i on Pr ocedur es
St ep 1: Connect i ng New Nodes t o t he Cl ust er
Mak i ng Physi cal Connect i ons
I nst al l i ng t he Oper at i ng Syst em
Ver i f y i ng t he I nst al l at i on w i t h t he Cl ust er Ver i f i cat i on Ut i l i t y
Check i ng t he I nst al l at i on
St ep 2: Ex t endi ng Or acl e Sof t w ar e t o New Nodes at t he Or acl e Cl ust er w ar e
St ep 3: Pr epar i ng St or age on New Nodes
Raw Dev i ce St or age Pr epar at i on f or New Nodes
St ep 4: Addi ng Nodes at t he Or acl e RAC Dat abase Layer
St ep 5: Addi ng Dat abase I nst ances t o New Nodes
Usi ng Ent er pr i se Manager t o Add Dat abase I nst ances t o New Nodes
Usi ng DBCA i n I nt er act i v e Mode t o Add Dat abase I nst ances t o New Nodes
Usi ng DBCA i n Si l ent Mode t o Add Dat abase I nst ances t o New Nodes
Connect i ng t o i SQL* Pl us af t er Addi ng a Node
Page 490 Oracle DBA Code Examples
Addi ng Nodes t hat Al r eady Have Cl ust er w ar e and Or acl e Sof t w ar e t o a
Cl ust er
Over vi ew of Node Del et i on Pr ocedur es
St ep 1: Del et i ng I nst ances f r om Real Appl i cat i on Cl ust er s Dat abases
Usi ng Ent er pr i se Manager t o Del et e Dat abase I nst ances f r om Ex i st i ng Nodes
Usi ng DBCA i n I nt er act i v e Mode t o Del et e Dat abase I nst ances f r om Exi st i ng Nodes
Usi ng DBCA i n Si l ent Mode t o Del et e I nst ance f r om Ex i st i ng Nodes
St ep 2: Del et i ng Nodes f r om Real Appl i cat i on Cl ust er s Dat abases
St ep 3: ASM I nst ance Cl ean- Up Pr ocedur es f or Node Del et i on
Page 491 Oracle DBA Code Examples
Moni t or i ng Per f or mance
RAC Common Tuni ng Ti ps
Applicat ion t uning is oft en t he most beneficial
Resizing and t uning t he buffer cache
I ncreasing sequence caches t o a high value: t o avoid index leaf cont ent ion caused by high
or bat ch insert s.
Reducing long full- t able scans in OLTP syst ems: t o reduce GCS request s.
Using Aut omat ic Segment Space Management
Using part it ioning t o reduce int erinst ance t raffic
Avoiding unnecessary parsing
Minimizing locking usage
Removing unselect ive indexes
Configuring int erconnect properly
I nst ance Recover y and RAC
_FAST_START_I NSTANCE_RECOVERY_TARGET init ializat ion paramet ers cont rols t he t ime in
seconds from t he st art of inst ance recovery t o t he t ime when GCD is open for lock
request s.
I f FAST_START_MTTR_TARGET is also configured, t he more aggressive will be used.
Pract ically, using eit her of t hem is useless because one of t he surviving inst ances is doing
t he recovery. You can however consider t he following:
o I ncrease PARALLEL_EXECUTI ON_MESSAGE_SI ZE (message size for parallelism and it s
buffer t aken from shared pool) from it s default of 2,148 byt es t o 4 KB or 8 KB.
o Set PARALLEL_MI N_SERVERS t o CPU_COUNT- 1. This will prespawn recovery slaves at
st art up t ime.
o Using asynchronous I / O is one of t he most crucial fact ors in recovery t ime. The first -
pass log read uses asynchronous I / O.
o I nst ance recovery uses 50 percent of t he default buffer cache for recovery buffers. I f
t his is not enough, you will see it in t he alert . log. I n t hat case, increase t he size of
your default buffer cache.
Gl obal Cache Wai t Event s
gc current / cr request
gc [ current / cr] [ 2/ 3] -way
gc [ current / cr] block busy
gc [ current / cr] grant 2- way: grant occurs before I / O
gc current grant busy
gc [ current / cr] [ block/ grant ] congest ed: congest ed means it is int ernally > 1ms
gc [ current / cr] [ failure/ ret ry]
gc buffer busy
Page 492 Oracle DBA Code Examples
Moni t or i ng Per f or mance i n Ent er pr i se Manager
Usi ng t he Cl ust er Dat abase Per f or mance Page
Chart : Clust er Host Load Average
Desc. : load on CPU in all clust er nodes
Vert ical: No of CPUs in all t he clust er
Not ice : I f t he load average is higher t han t he average of t he t ot al number of CPUs across all
of t he host s in t he clust er, t hen t oo many processes are wait ing for CPU resources.
Chart : Global Cache Block Access Lat ency
Desc. : end-t o-end elapsed t ime or lat ency for a block request
Vert ical: lat ency in ms
Not ice : - int erconnect delay - unopt imized SQL plans t o acheive local cache hit rat ion. - t o
resolve: drill down t o t he Clust er Cache Coherency page
Chart : Global Cache Block Transfer Rat e
Desc. : number of dat a blocks received by all inst ances
Not ice: drid down t ill segment t ype
Chart : Average Act ive Sessions
Desc. : average number of act ive sessions per wait class.
Not ice: Consider t uning t he dat abase, if t he Average Act ive Sessions chart displays a large
number of sessions wait ing, indicat ing int ernal cont ent ion, and t hroughput t he Dat abase
Throughput chart s is low.
Chart : Dat abase Throughput Chart s
Desc. : summarize any cont ent ions t hat appear in t he Average Act ive Sessions chart
Not es : drill down t o inst ance level t hen t op consumers
Chart : Top Segment s Page
Desc. : t o ident ify hot t ables or indexes in a dat abase
Not es : t racks t he number of CR and current blocks received by an obj ect .
Chart : Dat abase Locks Page
Desc. : t o det ermine whet her mult iple inst ances are holding locks for t he same obj ect .
Usi ng t he Cl ust er Dat abase I nst ance Per f or mance Page
To access it , Performance t ab- > inst ance name in t he bot t om.
I nst ance- level st at ist ics including generat ing ADDM and ASH report s.
AWR: gat her st at ist ics about each individual inst ance in t he RAC and not t he ent ire dat abase.
ADDM Repor t : creat e a new AWR snapshot and run ADDM on t his and t he previous snapshot .
exec dbms_advisor.set_default_task_parameter('ADDM','DB_ACTIVITY_MIN',30)
exec dbms_workload_repository.modify_snapshot_settings(interval=>600)
exec dbms_workload_repository.create_snapshot
Page 493 Oracle DBA Code Examples
ASH Repor t : creat e a performance dat a report of t he dat abase based on session- sampling
dat a over a specified period of t ime. This report is very useful for diagnosing small ( five- t o
t en-minut e) performance spikes t hat might be averaged out and consequent ly hidden or
minimized by ot her issues in t he 1- hour AWR report .
Usi ng t he Cl ust er Per f or mance Page
Wit h t his informat ion, you can det ermine whet her resources need t o be added, suspended, or
redist ribut ed.
Usi ng t he Cl ust er I nt er connect s Page
Home page- > I nt erconnect Findings
Home page- > Performance- > Clust er Cache Coherency- > I nt erconnect s
This page helps det ermine t he load added by individual inst ances and dat abases on t he
int erconnect . Somet imes you can immediat ely ident ify int erconnect delays t hat are due t o
applicat ions t hat are out side Oracle Dat abase.
Page 494 Oracle DBA Code Examples
Mak i ng Appl i cat i ons Hi ghl y Av ai l abl e Usi ng Or acl e
Cl ust er w ar e
Not e: You can inst all t he Oracle Clust erware high availabilit y Applicat ion Programming
I nt erface ( API ) from t he Oracle Dat abase 10g release 10. 2 client inst allat ion media.
Not e: Your List ener. ora file should cont ain one ent ry for t he virt ual int ernet prot ocol ( VI P)
address, using t he VI P' s name, and anot her ent ry for t he physical host , by I P address not
name.
Mak i ng an Appl i cat i on Hi ghl y Avai l abl e Ex ampl es
Ex ampl e1: Mak i ng an Appl i cat i on Hi ghl y Av ai l abl e
I f t he applicat ion is accessed by net work, define a VI P per applicat ion.
VI P is failed over t o anot her node t oget her wit h t he applicat ion(s) .
From t here, client s can st ill connect t hrough t he VI P.
1. Creat e an applicat ion profile by edit ing an ASCI I file or by running t he crs_profile command.
# file name format resource_name. cap
save file in
$CRS_HOME\ crs\ profile for root user
$CRS_HOME\ crs\ public for non- root user
# Required Ones
# resource- specific script ( st art , st op or check will be passed by crs)
ACTI ON_SCRI PT
# applicat ion name
NAME
# resource t ype ( must be APPLI CATI ON)
TYPE
# ordered list of clust er nodes ( use names as list ed by olsnodes)
HOSTI NG_MEMBERS
# Opt ional Ones
# descript ion of t he resource
DESCRI PTI ON= ' myapplicat ion'
# list of required resources ( must be regist ered)
REQUI RED_RESOURCES
# placement policy: (balanced), favored, or rest rict ed
PLACEMENT
# when 1 ( 0) , crs re-evaluat es t he placement of a resource
# during addit ion or rest art of a clust er node
ACTI VE_PLACEMENT= 0
# when 1 ( 0) , it at uo- rest art s on syst em reboot
AUTO_START= 1
# check int ervals in seconds ( 60)
Page 495 Oracle DBA Code Examples
CHECK_I NTERVAL
# failover int erval ( 0)
FAI LOVER_DELAY
# int erval ( s) during which crs applies t he failure t hreshold
FAI LURE_I NTERVAL
# ( max 20) number of failures wit hin FAI LURE_I NTERVAL aft er which
# t he resource is marked offline
FAI LURE_THRESHOLD
# space- delimit ed list e of resource used during placement decisions
OPTI ONAL_RESOURCES
# rest art at t empt s before relocat e ( 1)
RESTART_ATTEMPTS
# maint ained by crs
RESTART_COUNT
# t imeout in seconds t he script needs before ret urning an error ( 60)
SCRI PT_TI MEOUT
START_TI MEOUT
STOP_TI MEOUT
# applicat ion up-t ime t o be considered st able by crs
UPTI ME_THRESHOLD
# example 1
oracle$crs_profile -create postman -t application -B
/opt/email/bin/crs_postman \
-d "Email Application" -r network1 -l application2 \
-a postman.scr -o ci=5,ft=2,fi=12,ra=2
# in $CRS_HOME/crs/public
# will generate file postman.cap containing:
NAME=postman
TYPE=application
ACTION_SCRIPT=/oracle/crs/script/postman.scr
ACTIVE_PLACEMENT=0
AUTO_START=0
CHECK_INTERVAL=5
DESCRIPTION=email app
FAILOVER_DELAY=0
FAILURE_INTERVAL=12
FAILURE_THRESHOLD=2
HOSTING_MEMBERS=
OPTIONAL_RESOURCES=application2
PLACEMENT=balanced
REQUIRED_RESOURCES=network1
RESTART_ATTEMPTS=2
SCRIPT_TIMEOUT=60
...
# and script file postman.scr
# Create Application VIP
# create network1 VIP address application
# where eth0 is the public network nic
# 138.3.83.78 is the vip address
crs_profile create network1 -t application \
Page 496 Oracle DBA Code Examples
-a $CRS_HOME/bin/usrvip \
-o oi=eth0,ov=138.3.83.78,on=255.255.240.0
# as oracle, register network1
oracle$crs_register network1
# change the owner of the resource
crs_setperm network1 o root
# enable oracle user to run the script
crs_setperm network1 u user:oracle:r-x
# as oracle starts the vip
crs_start network1
2. Regist er t he applicat ion profile using t he crs_regist er command.
crs_register postman
# If you modify postman profile, then update the OCR:
crs_register -u postman
3. Run t he crs_st art command t o init iat e t he applicat ion profile and t hen t he Oracle
Clust erware runs t he act ion program command t hat you have included in t he profile t o st art
your applicat ion.
crs_start postman
# to start an application resource, even if one of the required resources
# is offline:
crs_start -f postman
4. The Oracle Clust erware periodically runs t he act ion program command t o check an
applicat ions st at us.
5. I n t he event of a check or node failure, t he Oracle Clust erware recovers t he applicat ions
eit her by rest art ing it on t he current node or by relocat ing t he applicat ion t o anot her node. To
manually relocat e t he applicat ion and it s resources t o anot her node:
# the application and its required resources must be offline
crs_relocate postman -c rac2
6. I f you run t he crs_st op command t o st op t he applicat ion, t hen t he Oracle Clust erware runs
t he act ion program command t o st op it .
crs_stop postman
# to stop an application that is required by an online resource
crs_stop -f postman
Ex ampl e2: Mak i ng an Appl i cat i on Hi ghl y Av ai l abl e
/* Making xclock program highly available */
#
# 1) create the action script file
# create following script in both nodes (in $CRS_HOME/crs/script)
# make the file executable
# you can then test it by passing start stop and check
Page 497 Oracle DBA Code Examples
su -
export CRS_HOME=/u01/crs
vi $CRS_HOME/crs/script/crsclock_action.scr
chmod 777 $CRS_HOME/crs/script/crsclock_action.scr
#!/bin/bash
# start/stop/check script for xclock example
# the script assumes xclock is there
# and DISPLAY variable is set
APP=/usr/X11R6/bin/xclock
BIN_NAME=xclock
LOG_DIR=/tmp
export DISPLAY=:0.0
echo `date +"%M:%S"` $0 $* $$>>/tmp/mylog.log
PID1=`ps -ef | grep $BIN_NAME | grep -v grep | grep -v xclock_app | awk '{
print $2 }'`
case $1 in
'start')
if [ "$PID1" != "" ]
then
status_p1="running"
else
if [ -x $APP ]
then
#umask 002
${APP} &
PID1=`ps -ef | grep $BIN_NAME | grep -v grep | grep -v xclock_app | awk
'{ print $2 }'`
echo `date +"%M:%S"` $* $PID1 $USER>>/tmp/mylog.log
status_p1="started"
else
echo `basename $0`": $APP: Executable not found"
fi
fi
echo "$APP: $status_p1"
;;
'stop')
if [ "${PID1}" != "" ]
then
kill -9 ${PID1} && echo "$APP killed"
else
echo "$BIN_NAME: no running Process!"
fi
;;
'check')
if [ "$PID1" != "" ]
then
echo "running"
exit 0
else
echo "not running"
echo `date +"%M:%S"` $0 $* "ERR">>/tmp/mylog.log
exit 1
Page 498 Oracle DBA Code Examples
fi
;;
*)
echo "Usage: "`basename $0`" {start|stop|check}"
;;
esac
#
# 2) create application resource profile named myClock
# if you copy paste, fix the hyphen issue
su -
$CRS_HOME/bin/crs_profile -create myClock -t application -a
crsclock_action.scr -p favored -h "rac1-vip rac2-vip" -o ci=5,ra=2
# check the generated file
cat $CRS_HOME/crs/profile/myClock.cap
#
# 3) Register the resource (in ONE node only)
# must be done as root and then permission is granted to oracle
su -
$CRS_HOME/bin/crs_register myClock
$CRS_HOME/bin/crs_setperm myClock -u user:oracle:r-x
$CRS_HOME/bin/crs_stat myClock
$CRS_HOME/bin/crs_stat -t
#
# 4) Start the resource
# as oracle
su - oracle
$CRS_HOME/bin/crs_start myClock
$CRS_HOME/bin/crs_stat -t
Managi ng Aut omat i c Or acl e Cl ust er w ar e Resour ce Oper at i ons f or Act i on Scr i pt s
/* Preventing Automatic Database Instance Restarts */
In the application profile, set AUTO_START to (lowercase only):
always, restore, never
/* Automatically Manage Restart Attempts Counter for Resources */
This is controlled by the attributes RESTART_ATTEMPTS and RESTART_COUNT.
Di spl ayi ng Cl ust er w ar e Appl i cat i on and Appl i cat i on Resour ce St at us I nf or mat i on
# application status
crs_stat postman
# all resources status
crs_stat -t
# specific resource status
crs_stat -t ora.rac1.ASM1.asm
# stats about the resources ( R=Restart, F=Fail)
crs_stat -v
# application profile
Page 499 Oracle DBA Code Examples
crs_stat -p
crs_stat -p ora.rac1.ASM1.asm
Unr egi st er i ng Appl i cat i ons and Appl i cat i on Resour ces
su -
$CRS_HOME/bin/crs_unregister postman
$CRS_HOME/bin/crs_stat -t
Page 500 Oracle DBA Code Examples
RAC Tr oubl eshoot i ng
Di agnosi ng t he Or acl e Cl ust er w ar e Hi gh Avai l abi l i t y Component s
Debuggi ng Recommnedat i on
Always make sure t hat your nodes have exact ly t he same syst em t ime. Use NTP.
Cl ust er w ar e Log Fi l es and t he Uni f i ed Log Di r ect or y St r uct ur e
# Cluster Ready Services Daemon (crsd)
# It is archived every 10 MB (crsd.l01, crsd.l02, )
$CRS_HOME/log/hostname/crsd
# Oracle Cluster Registry (OCR)
$CRS_HOME/log/hostname/client
# Cluster Synchronization Services (CSS)
# is archived every 20 MB (cssd.l01, cssd.l02, )
$CRS_HOME/log/hostname/cssd
# Event Manager (EVM)
$CRS_HOME/log/hostname/evmd
# RACG Log Files
$CRS_HOME/log/hostname/racg
$ORACLE_HOME/log/hostname/racg
# SRVM (srvctl) and OCR (ocrdump, ocrconfig, ocrcheck) logs
$ORA_CRS_HOME/log/<hostname>/client
# crs alerts
$ORA_CRS_HOME/log/<hostname>/alert<nodename>.log
Dynami c Debuggi ng
/* to Enable Debugging */
# as root
# for the Oracle Clusterware
crsctl debug log crs "CRSRTI:1,CRSCOMM:2"
# for EVM
crsctl debug log evm "EVMCOMM:1"
# for resources (1 is the debugging level)
crsctl debug log res "resname:1"
# example:
crsctl debug log res "ora.rac1.vip:1"
Component Lev el Debuggi ng
# to enable debugging for all of the modules
# where level 1 (least) to 5 (max)
set ORA_CRSDEBUG_ALL <level>
# to enable tracing for a specific sub-module
Page 501 Oracle DBA Code Examples
set ORA_CRSDEBUG_modulename
# to list the sub-modules
# where module is crs, evm, or css
crsctl lsmodules <module>
Or acl e Cl ust er w ar e Shut dow n and St ar t up
su -
crsctl stop crs
crsctl start crs
Enabl i ng and Di sabl i ng Or acl e Cl ust er w ar e Daemons
su -
crsctl enable crs
crsctl disable crs
Di agnost i cs Col l ect i on Scr i pt
Generat es t he following files in t he local direct ory:
basData_<hostname>.tar.gz
crsData _<hostname>. tar.gz
ocrData _<hostname>. tar.gz
oraData _<hostname>. tar.gz
# when asked by Oracle support
su -
export ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1
export ORA_CRS_HOME=/u01/crs1020
export ORACLE_BASE= =/u01/app/oracle
cd $ORA_CRS_HOME/bin
$CRS_HOME/bin/diagcollection.pl -collect
The Or acl e Cl ust er w ar e Al er t s
# can be found in:
$CRS_Home/log/hostname/alerthostname.log
Resour ce Debuggi ng
# method 1: where 1 in the following example is the debugging level
crsctl debug log res "ora.node1.vip:1"
# method 2:
export USER_ORA_DEBUG=1
# .. then issue crsctl start, stop, or check
Check i ng t he Heal t h of t he Cl ust er w ar e
crsctl check crs
Tr oubl eshoot i ng t he Or acl e Cl ust er Regi st r y
Tr oubl eshoot i ng Host name Changes and CSS
I f you change t he host name for ASM, t hen t he Oracle CSS daemon will not st art . I n order t o
count er t his problem, please use t he following st eps:
Page 502 Oracle DBA Code Examples
Login as t he root user
Run localconfig delet e t o deconfigure CSS. This will remove any configurat ion relat ed files
on t he syst em t hat referenced t he old host name.
Run localconfig add t o reconfigure CSS using t he new host name.
Enabl i ng Addi t i onal Tr aci ng f or Real Appl i cat i on Cl ust er s Hi gh Av ai l abi l i t y
Di agnosi ng Or acl e Real Appl i cat i on Cl ust er s Component s
Wher e t o Fi nd Fi l es f or Anal yzi ng Er r or s
Usi ng I nst ance- Speci f i c Al er t Fi l es i n Real Appl i cat i on Cl ust er s
Enabl i ng Tr aci ng f or Jav a- Based Tool s and Ut i l i t i es i n Real Appl i cat i on Cl ust er s
Resol v i ng Pendi ng Shut dow n I ssues
Usi ng t he Cl ust er Ver i f i cat i on Ut i l i t y
Cl ust er Ver i f y Locat i ons
Download it from OTN
Oracle soft ware DVD:
./cluvfy/runcluvfy.sh
Oracle Clust erware home:
$ORA_CRS_HOME/bin/cluvfy
Oracle Home:
$ORACLE_HOME/bin/cluvfy
Cl ust er Ver i f y St ages
You can list verifiable st ages wit h t he cluvfy stage -list
Valid st age opt ions and st age names are ( ordered) :
-post hwos: Postcheck for hardware and operating system
-pre cfs: Precheck for OCFS setup
-post cfs: Postcheck for OCFS setup
-pre crsinst: Precheck for CRS installation
-post crsinst: Postcheck for CRS installation
-pre dbinst: Precheck for database installation
-pre dbcfg: Precheck for database configuration
Page 503 Oracle DBA Code Examples
Cl ust er Ver i f y Component s
You can list verifiable CVU component s wit h t he cluvfy comp - list
Verifiable CVU component s:
nodereach: Checks reachability between nodes
nodecon: Checks node connectivity
cfs: Checks Oracle Cluster File System integrity
ssa: Checks shared storage accessibility
space: Checks space availability
sys: Checks minimum system requirements
clu: Checks cluster integrity
clumgr: Checks cluster manager integrity
ocr: Checks OCR integrity
crs: Checks CRS integrity
nodeapp: Checks node applications existence
admprv: Checks administrative privileges
peer: Compares properties with peers
CVU Component Ver i f i cat i on Ex ampl es
#verify the minimal system requirements on the nodes before installing
Clusterware
cluvfy comp sys -n node1,node2 -p crs -verbose
#check the system requirements before installing RAC:
cluvfy comp sys -n node1,node2 -p database -verbose
#verify whether storage is shared among the nodes in your cluster database or
to identify all of the storage that is available on the system and can be
shared across the cluster nodes:
cluvfy comp ssa -n all -s /dev/sda1
#check there is 5 GB free in all nodes:
cluvfy comp space -n all -l /home/product -z 5G
#can node1 reach node2:
cluvfy comp nodereach -n node2 -srcnode node1
#checks whether node1 and node2 can communicate through the eth0 network
interface (without i, all interfaces are checked):
cluvfy comp nodecon -n node1,node2 i eth0 -verbose
#verify user equivalence for all the nodes:
cluvfy comp admprv -n all -o user_equiv -verbose
#verify existence of node applications, namely VIP, ONS, and GSD, on all
the nodes:
cluvfy comp nodeapp -n all -verbose
Page 504 Oracle DBA Code Examples
#compares all the nodes and determines whether any differences exist between
the values of preselected properties
cluvfy comp peer -n all verbose | more
Under st andi ng CVU Commands, Hel p, Out put , and Nodel i st Shor t cut s
Per f or mi ng Var i ous CVU Test s
Know n I ssues f or t he Cl ust er Ver i f i cat i on Ut i l i t y
Page 505 Oracle DBA Code Examples
Par t 8 Or acl e War ehousi ng
Page 506 Oracle DBA Code Examples
Or acl e War eh ou se Bui l der ( OWB)
Or acl e War ehouse Bui l der Ar chi t ect ur e
St ar t i ng and St opi ng t he Ser vi ce
Starting and Stopping OWB Service
-- stop service
sqlplus OWBSYS/<password> @<ORACLE_HOME>\stop_service.sql
-- start service
sqlplus OWBSYS/<password> @<ORACLE_HOME>\start_service.sql
-- if start fails, check the problem using the following script:
sqlplus OWBSYS/<password> @<ORACLE_HOME>\service_doctor.sql
-- if OWBSYS user is locked or its password was modified, the start
-- will fail. Store the changed password in the repository using:
sqlplus OWBSYS/<password> @<ORACLE_HOME>\set_repository_password.sql
Conf i gur i ng t he Reposi t or y and Wor k spaces
Got o St art > Oracle Home> Warehouse Builder> Administ rat ion> Reposit ory Assist ant
on UNI X, locat e OWB_ORACLE_HOME/ owb/ bin/ and run reposinst .sh
Select Manage Workspaces> Creat e a New Workspace> Workspace Owner> . . .
The user must have OWB_USER role.
Select a base language for t he reposit ory ( cannot be changed lat er)
Select Workspace users
Page 507 Oracle DBA Code Examples
St eps of Usi ng War ehouse Bui l der
Design t he t arget st ruct ure
o Design a dimensional model and implement it in a dat abase as:
Relat ional implement at ion ( st ar schema)
Mult idimensional implement at ion ( OLAP)
Creat e a proj ect
Ti p: t o delet e a proj ect , expand anot her proj ect t hen right click on t he proj ect you want
t o delet e.
Creat e source module( s) :
o Oracle module: specify host name: port rat her t han using SQL* Net Connect ion.
o Non- Oracle module: creat e ODBC connect ion t o t he dat abase t hen configure Oracle t o
connect t o t he ODBC connect ion:
Copy t he file ORACLE_HOME\ hs\ admin\ init dg4odbc. ora t o init < odbc
connect ion> . ora
HS_FDS_CONNECT_INFO = <odbc data_source_name>
HS_FDS_TRACE_LEVEL = <trace_level>
For example:
HS_FDS_CONNECT_INFO = MYSQLSERVER
HS_FDS_TRACE_LEVEL = 0
Edit t he list ener. ora t hen rest art t he list ener:
# PROGRAM=dg4odbc in Oracle 11g
# PROGRAM=hsodbc in 10g
SID_LIST_LISTENER=
(SID_LIST=
(S Global Explorer> Secutiryt>Users >NewID_DESC=
(SID_NAME=mysqlserver)
(ORACLE_HOME=D:\app\bob\product\11.1.0\db_1)
(PROGRAM=dg4odbc)
)
)
Right - click on t he ODBC node in t he Design Cent er and select New
Edit t he connect ion. Make sure t hat bot h username and password are enclosed in
double quot es. Ent er t he Host where t he Oracle dat abase resides.
Ti p: t o del et e a connect ion, unregist er it first from Cont rol Manager t hen delet e it from
Design Cent er.
Not e: The t ransparent gat eway agent s must be purchased and inst alled separat ely from
t he Oracle Dat abase, and t hen configured t o support t he communicat ion wit h t he
ext ernal dat abase. The generic connect ivit y agent is included wit h t he Oracle Dat abase.
o I mport source met adat a from files:
Files> New> define pat h ( not file)
On t he creat ed obj ect > I mport .. > Sample> . . > Finish
Page 508 Oracle DBA Code Examples
I mport source met adat a: by using t he I mport Met adat a Wizard or manually. Manual
met hod: under Tables node, New> Dat a Obj ect Edit or.
Creat e t he t arget user
Global Explorer> Secut iryt > Users > New (always creat ed in t he db reposit ory)
Creat e t he t arget module
Creat e t arget dimensions in OWB:
o Dimension: Dimension At t ribut es, Levels, Level At t ribut es and Hierarchies
o Time dimension: Proj ect Explorer> Dat abases> Ourproj ect > Dimensions> New> Using
Time Wizard. A mapping and a sequence will be as a result creat ed.
Creat e t arget cubes in OWB
Design st aging area t able(s)
Creat e a mapping from source t o st aging t able: add source t ables, add t he st aging t arget
t able t hen link from source t o st aging t arget . Linking may include:
o Joiner: edit it t o add more I nput Groups, link source t ables t o it , define j oin condit ion.
Not e: Oracle 10. 2. 0. 4 ret urns "Bad expression ret urn t ype" error ( bug I D 7417869) .
o Aggregat or: link out put of Joiner t o it s input . Set it s Group By Clause set t ing. Add
required aggregat ion funct ions ( usually SUM) by right clicking on OUTGRP1> Open
det ails> Out put At t ribut es> Add but t on t o add somet hing like AMOUNT> OK> click on
AMOUNT in t he aggregat or> Propert ies Window> Expression> set t he funct ion> OK
o Transformat ion
Validat e t he mapping
Generat e t he mapping
Deploy t he mapping
Execut e t he mapping
Mappi ng Oper at or s
Sour ce and Tar get Oper at or s: Cube, Dimension, Ext ernal Table, Table, Const ant , View,
Sequence, Const ruct ( ret urns SYS_REFCURSOR)
Dat a Fl ow Oper at or s: Aggregat or, Deduplicat or (dist inct SQL funct ion) , Expression, Filt er,
Joiner, Key Lookup, Pivot , Set Operat ion, Split t er, Transformat ion, Table Funct ion
Pr e/ Post Pr ocessi ng Oper at or s: Mapping I nput Paramet er, Mapping Out put Paramet er,
Post -Mapping Process, Pre- Mapping Process
Pl uggabl e Mappi ngs: group of operat ors act as single operat or
Page 509 Oracle DBA Code Examples
Page 510 Oracle DBA Code Examples
Par t 9 Or acl e Dat abase Ut i l i t i es
Page 511 Oracle DBA Code Examples
Usi ng SQL* Pl u s
Usi ng SQL* Pl us Command- Li ne Opt i ons
sqlplus [ [<option>] [<logon>] [<start>] ]
<start> is: @<URL>|<filename>[.<ext>] [<parameter> ...]
The silent opt ion ( - S) : no out put on screen
The no-prompt logon opt ion ( - L) : no username/ password quest ion aft er login fail
The markup opt ion ( - M) : HTML generat ion
sqlplus help
St ar t i ng SQL* Pl us Sessi on
$export ORACLE_HOME= /u01/app/oracle/product/11.1.0/db_1
$ORACLE_SID=orcl
$export ORACLE_SID
NLS_LANG and ORA_NLS11
sqlplus oe/oe@//myserver.mydomain:1521/testdb
sqlplus username/passwd
sqlplus username/passwd AS SYSDBA
sqlplus username/passwd@(DESCRIPTION =(ADDRESS=(PROTOCOL=tcp)(HOST=sales-
server)(PORT=1521)(CONNECT_DATA= (SERVICE_NAME=orcl.mycompany.com)))
Cont r ol l i ng User Pr i vi l eges i n SQL* Pl us
Product _user_profile t able cont rols what commands a user can issue in SQL* Plus session.
The following commands can be prevent ed by using t his feat ure.
SQL: ALTER, AUDI T, ANALYZE, CREATE, DELETE, DROP, I NSERT, LOCK, NOAUDI T, RENAME,
SELECT, UPDATE, VALI DATE, TRUNCATE, GRANT, REVOKE, SET ROLE, SET TRANSACTI ON
PL/ SQL: DECLARE, BEGI N
SQL* PLUS: COPY, HOST, SET, EDI T, PASSWORD, SPOOL, EXECUTE, QUI T, START, EXI T,
RUN, GET, SAVE
You can use t he RESTRI CT command t o prevent users from using cert ain operat ing syst em
commands. I t disables t he commands even where t here are no connect ions t o t he server.
Command Level 1 Level 2 Level 3
EDI T Disabled Disabled Disabled
GET Disabled
HOST Disabled Disabled Disabled
SAVE Disabled Disabled
SPOOL Disabled Disabled
START Disabled
STORE Disabled Disabled
Page 512 Oracle DBA Code Examples
SQL> DESC product_user_profile
Name Null? Type
------------------------------
PRODUCT NOT NULL VARCHAR2(30)
USERID VARCHAR2(30)
ATTRIBUTE VARCHAR2(240) -- command to disable in upper case
SCOPE VARCHAR2(240)
NUMERIC_VALUE NUMBER(15,2)
CHAR_VALUE VARCHAR2(240) -- role name to disable
DATE_VALUE DATE
LONG_VALUE LONG
-- no insert
INSERT INTO product_user_profile VALUES
('SQL*PLUS','OE','INSERT',NULL,NULL,NULL,NULL,NULL);
-- no OS command
INSERT INTO product_user_profile (product,userid,attribute) VALUES
('SQL*Plus','myuser','HOST');
-- no set Role to DBA
insert into product_user_profile(product, userid, attribute, char_value)
values('SQL*Plus', 'APPS', 'ROLES', 'DBA');
-- Preventing access using PL/SQL
insert into system.product_profile (product, userid, attribute, char_value)
values ('SQL*Plus', 'AMAR', 'DECLARE', 'DISABLED');
insert into system.product_profile (product, userid, attribute, char_value)
values ('SQL*Plus', 'AMAR', 'BEGIN', 'DISABLED');
sqlplus -RESTRICT 1
Set t i ng t he SQL* Pl us Envi r onment w i t h t he SET Command
help index list of available commands by t yping
help set variable possible values
AUTO[ COMMI T] Specifies whet her commit s of t ransact ions are aut omat ic or manual.
DEF[ I NE] { &/ C/ ON/ OFF} Set s t he prefix charact er used during variable subst it ut ions.
ECHO { OFF/ ON} when ON, each command will be displayed before it s out put onscreen.
FEED[ BACK] { OFF/ ON} whet her t o show t he number of records ret urned by your query.
LONG { 80/ n} maximum widt h of t he LONG, CLOB, NCLOB, and XMLType values
NEWP[ AGE] { 1/ n/ none} Specifies t he number of blank lines at t he t op of each new page.
PAGES[ I ZE] { 24/ n} Specifies t he number of lines in each page
TI [ ME] { OFF/ ON} Displays t ime if set t o on.
TI MI [ NG] { OFF/ ON} Cont rols t he display of t iming for SQL commands.
VER[ I FY] { OFF/ ON} Specifies whet her SQL t ext is displayed aft er variable subst it ut ion.
Set t i ng SQL* Pl us Pr ef er ances
Globally glogin. sql
User level login. sql: in Oracle 11g, execut ed even aft er connect command
Page 513 Oracle DBA Code Examples
Loggi ng SQL* Pl us Er r or s
I n Oracle 11g, SET ERRORLOGGI NG ON command writ es all subsequent errors int o a t able
called sperrorlog.
SET ERRORLOGGING ON
SHOW ERRORLOGGING
Key SQL* Pl us " Wor k i ng" Commands
Setting SQLPROMPT Command
_USER
_CONNECT_IDENTIFIER
_PRIVILEGE as sysdba
_DATE
SET SQLPROMPT "_USER > "
host
HOST cp /u01/app/oracle/new.sql /tmp
SPOOL { file_name[.ext] [CRE[ATE]|REP[LACE]|APP[END]]| OFF}
SPOOL /u01/app/oracle/data/employees.txt;
SELECT * FROM hr.employees;
SPOOL OFF;
-- ACCEPT and PROMPT Commands
ACCEPT MYTITLE PROMPT 'Title: '
-- using PAUSE to check long listing output
SQL> SHOW PAUSE
PAUSE is OFF
SQL> SET PAUSE ON
SQL> very long list is displayed
Cr eat i ng Command Fi l es i n SQL* Pl us
SAVE status.sql
-- set the search directory using env var ORACLE_PATH
@myscriptfile.sql
-- Creating a Windows Batch Script
sqlplus username/password@connect_identifier @C:\temp\testscript.sql
-- substitution vars
DEFINE owner = '&1'
SELECT segment_name,segment_type,extents
FROM dba_segments
WHERE owner = upper ('&owner');
Copyi ng Tabl es w i t h t he COPY Command
commit s while dat a are moved
slower t han CREATE TABLE . . AS SELECT
SQL> COPY
usage: COPY FROM <db> TO <db> <opt> <table> { (<cols>) } USING <sel>
<db> : database string, e.g., hr/your_password@d:chicago-mktg
<opt> : ONE of the keywords: APPEND, CREATE, INSERT or REPLACE
Page 514 Oracle DBA Code Examples
<table>: name of the destination table
<cols> : a comma-separated list of destination column aliases
<sel> : any valid SQL SELECT statement
set ARRAYSIZE 100
SQL> COPY FROM sysadm/sysadm1@finance1-
> CREATE test01 -
> USING SELECT * FROM employee;
Cr eat i ng Web Pages Usi ng SQL* Pl us
SQLPLUS -MARKUP "HTML ON"
SQL> SET MARKUP HTML ON SPOOL ON
SQL> commands here . . .
SQL> SET MARKUP HTML OFF SPOOL OFF
Usi ng SQL t o Gener at e SQL
SET ECHO OFF HEADING OFF FEEDBACK OFF
SPOOL test.txt
SELECT 'grant connect, resource to '||username||';' FROM dba_users;
@test.txt
Enabl i ng AUTOTRACE f or a User
-- create plan_table (if not there)
desc plan_table
conn / as sysdba
@E:\oracle\OraDB11g\RDBMS\ADMIN\utlxplan.sql
-- create plustrace role
@E:\oracle\OraDB11g\sqlplus\admin\plustrce.sql
grant plustrace to scott;
SET AUTOTRACE
ON
ON STATISTICS
ON EXPLAIN
TRACEONLY
TRACEONLY STATISTICS
OFF
Usi ng r l w r ap Ut i l i t y w i t h SQL* Pl us i n Uni x - Based Syst ems
rlwrap ut ilit y allows you t o navigat e hist ory of commands in SQL* Plus and edit t hem.
/* Install */
# Option 1: for rpm version:
# can be downloaded from:
# http://rpm.pbone.net
# http://ivan.kartik.sk
Page 515 Oracle DBA Code Examples
rpm -ivh rlwrap*.rpm
# Option 2: for tar version
# download rlwrap-0.30.tar.gz (search the net or from
http://www.ahmedbaraka.com/download/oracle/rlwrap-0.30.tar.gz )
# unzip the file and install
su -
gunzip rlwrap-0.30.tar.gz
tar -xvf rlwrap-0.30.tar
cd rlwrap-0.30
./configure
make
make install
/* Recommended */
vi /home/oracle/.bashrc
alias sqlpus='rlwrap sqlplus /nolog'
# or
echo "alias sqlpus='rlwrap sqlplus /nolog'" >> /home/oracle/.bashrc
Page 516 Oracle DBA Code Examples
Usi ng SQL* Loader Ut i l i t y
I nvok i ng SQL* Loader
SQLLDR keyword=value [,keyword=value,. . .]
Paramet ers can be specified in a paramet er file:
sqlldr PARFILE=c:\...\myparfile.txt
You specify t he command- line paramet ers ( which also could be specified in t he cont rol file) :
USERID = usrname/passwored
CONTROL = '/../mycontrol.ctl'
DATA = '/../mydata.dat'
LOG = '/.../mylog.log'
BAD = '/.../mybadfile.bad' if not specified, Oracle will creat e one
DISCARD='/../mydiscard.dat' discarded dat a do not meet t he crit eria
DISCARDMAX=100
SKIP = 235550
in convent ional pat h mode, bind size in byt es OR number of rows
BINDSIZE = 512000
ROWS = 64000
DIRECT=true
UNRECOVERABLE=Y ( see direct load opt ions in t he following sect ions)
ERRORS = 0 no errors t olerat ed
LOAD = 10000 maximum number of logical records t o be loaded int o t he t able
SILENT = ALL all generat ed message are NOT displayed
PARALLEL=true only when DI RECT= t rue
RESUMABLE=true default is false
RESUMABLE_NAME = finance1_load
RESUMABLE_TIMEOUT = 3660 in seconds
Usi ng SQL* Loader Cont r ol Fi l e
Dat afile:
o I nput File
Ext ernal I nput file: INFILE='/a01/app/oracle/oradata/load/consumer.dat'
I nline Dat a: INFILE = * then BEGINDATA ...
o Physical and Logical Records
CONCATENATE n RECLEN m every n rows of dat a is considered one logical row,
and t he row lengt h is m charact ers
CONTINUEIF THIS (1:4) = 'next' if SQL* Loader finds t he four let t ers next at
t he beginning of a line, it should t reat t he dat a t hat follows as a cont inuat ion of
t he previous line
CONTINUEIF LAST = '&' cont inue if last charact er is &
o Record Format
specific record t erminat or: by default new line. To change it t o somet hing else
like t he pipe for example:
infile "test.dat" "str '|\n'"
Page 517 Oracle DBA Code Examples
in t his case, t he following dat a are t wo records ( mult i- line fields):
one line;hello dear world;|
two lines;Dear world,
hello!;|
Fixed record format : INFILE '..' "fix 12" ( 12-byt e- size records)
ahmed,1234, johnso,1234= "ahmed,1234, " and "12johnson,1234"
Variable record format : INFILE '..' "var 2"
05ahmed12johnson,1234 = "ahmed" and "12johnson,1234"
Loading:
o defining dest inat ion t able( s): INTO TABLE .. INSERT | REPLACE | APPEND
o defining rej ect ion condit ion: WHEN <condition>
WHEN(activity_type <>'H') and (activity_type <>'T')
Not e: OR operat or cannot be used in t he WHEN condit ion. To workaraound, load int o mult iple
t ables. Check t he examples.
Table- and Field- Mapping
o Fields posit ion ( eit her you use t his or t he delimit ers)
Relat ive: employee_name t o st art in posit ion 7 and cont inue for 30 charact ers
employee_id POSITION(*) NUMBER EXTERNAL 6
employee_name POSITION(*) CHAR 30
Absolut e
employee_id POSITION(1:6) INTEGER EXTERNAL
employee_name POSITION(7:36) CHAR
Not e: a field can be skipped using FI LLER keyword.
o Dat a Types:
I NTEGER( n) binary int eger, where n can be 1, 2, 4, or 8
SMALLI NT
CHAR
I NTEGER EXTERNAL
FLOAT EXTERNAL
DECI MAL EXTERNAL
LOBFI LE
o Delimit ers: using POSI TI ON is fast er t han delimit ers
TERMINATED BY WHITESPACE
TERMINATED BY ","
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
o Dat a Transformat ion Paramet ers: SQL funct ion(s) is specified aft er t he dat a t ype and
should be enclosed in double quot at ion marks
field_name CHAR TERMINATED BY "," "SUBSTR(:field_name, 1, 10)"
employee_name POSITION 32-62 CHAR "UPPER(:ename)"
salary position 75 CHAR "TO_NUMBER(:sal,'$99,999.99')"
commission INTEGER EXTERNAL "":commission * 100"
Command- Line Paramet ers in t he Cont rol File
USERID = usrname/passwored
CONTROL = '/../mycontrol.ctl'
DATA = '/../mydata.dat'
LOG = '/.../mylog.log'
BAD = '/.../mybadfile.bad' if not specified, Oracle will creat e one
DISCARD='/../mydiscard.dat' discarded dat a do not meet t he crit eria
DISCARDMAX=100
Page 518 Oracle DBA Code Examples
SKIP = 235550
in convent ional pat h mode, bind size in byt es OR number of rows
BINDSIZE = 512000
ROWS = 64000
DIRECT=true ( see direct load opt ions in t he following sect ions)
ERRORS = 0 no errors t olerat ed
LOAD = 10000 maximum number of logical records t o be loaded int o t he t able
SILENT = ALL all generat ed message are NOT displayed
PARALLEL=true only when DI RECT= t rue
RESUMABLE=true default is false
RESUMABLE_NAME = finance1_load
RESUMABLE_TIMEOUT = 3660 in seconds
Generat ing Dat a
o Const ant
loaded_by CONSTANT "sysadm"
o Expression: SQL or PL/ SQL funct ion ( doesnt work in direct loading)
column_name EXPRESSION "SQL string"
o Record Number in t he dat afile
record_num RECNUM
o Syst em Dat e
loaded_date sysdate
o Sequence
loadseq SEQUENCE(max,1)
/* Example 1 */
-- tabe separated with nulls in the data
Data to Import:
1 Ahmed Baraka 1000 1.87 1-1-2000
2 John Rice 5000 2.4 10-5-1998
3 Emme Rak 2500 2.34
4 King Size 2700
5 Small Size 3000 31-3-2001
Table Structure
PERSONS
(ID NUMBER,
PNAME VARCHAR2(100),
BALANCE NUMBER,
RATE NUMBER,
JOIN_DATE DATE );
Control File:
OPTIONS ( ERRORS=0)
LOAD DATA
INFILE 'C:\temp\data\persons.dat'
BADFILE 'C:\temp\data\persons.bad'
DISCARDFILE 'C:\temp\data\persons.dsc'
INTO TABLE "HR"."PERSONS" REPLACE
FIELDS TERMINATED BY X'9' TRAILING NULLCOLS
Page 519 Oracle DBA Code Examples
(ID INTEGER EXTERNAL,
PNAME CHAR,
BALANCE INTEGER EXTERNAL,
RATE FLOAT EXTERNAL,
JOIN_DATE date 'dd-mm-yyyy')
/* Example 2 */
-- positional columns
load data
infile *
replace
into table departments
( dept position (02:05) char(4),
deptname position (08:27) char(20)
)
begindata
COSC COMPUTER SCIENCE
ENGL ENGLISH LITERATURE
MATH MATHEMATICS
POLY POLITICAL SCIENCE
/* Example 3 */
-- data transformation
LOAD DATA
INFILE *
INTO TABLE modified_data
( rec_no "my_db_sequence.nextval",
region CONSTANT '31',
time_loaded "to_char(SYSDATE, 'HH24:MI')",
data1 POSITION(1:5) ":data1/100",
data2 POSITION(6:15) "upper(:data2)",
data3 POSITION(16:22)"to_date(:data3, 'YYMMDD')"
)
BEGINDATA
11111AAAAAAAAAA991201
22222BBBBBBBBBB990112
LOAD DATA
INFILE 'mail_orders.txt'
BADFILE 'bad_orders.txt'
APPEND
INTO TABLE mailing_list
FIELDS TERMINATED BY ","
( addr,
city,
state,
zipcode,
mailing_addr "decode(:mailing_addr, null, :addr, :mailing_addr)",
mailing_city "decode(:mailing_city, null, :city, :mailing_city)",
mailing_state,
move_date "substr(:move_date, 3, 2) || substr(:move_date, 7, 2)"
)
/* Example 4 */
Page 520 Oracle DBA Code Examples
-- loading from multiple input files
LOAD DATA
INFILE file1.dat
INFILE file2.dat
INFILE file3.dat
APPEND
INTO TABLE emp
( empno POSITION(1:4) INTEGER EXTERNAL,
ename POSITION(6:15) CHAR,
deptno POSITION(17:18) CHAR,
mgr POSITION(20:23) INTEGER EXTERNAL
)
/* Example 5 */
-- loading into multiple tables
-- skipping columns (FILLER)
-- POSITION(1:4) in the example is a must to resent the pointer back
-- to the beginning of the row
-- In delimited formats, use "POSITION(1)" after the first
-- column to reset the pointer
LOAD DATA
INFILE *
INTO TABLE tab1 WHEN tab = 'tab1'
( tab FILLER CHAR(4),
col1 INTEGER
)
INTO TABLE tab2 WHEN tab = 'tab2'
( tab FILLER POSITION(1:4),
col1 INTEGER
)
BEGINDATA
tab1|1
tab1|2
tab2|2
tab3|3
-- another example
LOAD DATA
INFILE 'mydata.dat'
REPLACE
INTO TABLE emp
WHEN empno != ' '
( empno POSITION(1:4) INTEGER EXTERNAL,
ename POSITION(6:15) CHAR,
deptno POSITION(17:18) CHAR,
mgr POSITION(20:23) INTEGER EXTERNAL
)
INTO TABLE proj
WHEN projno != ' '
( projno POSITION(25:27) INTEGER EXTERNAL,
empno POSITION(1:4) INTEGER EXTERNAL
)
/* Example 6 */
-- work around on being unable to use OR in the WHEN condition
LOAD DATA
INFILE 'mydata.dat' BADFILE 'mydata.bad' DISCARDFILE 'mydata.dis'
Page 521 Oracle DBA Code Examples
APPEND
INTO TABLE my_selective_table
WHEN (01) <> 'H' and (01) <> 'T'
(
region CONSTANT '31',
service_key POSITION(01:11) INTEGER EXTERNAL,
call_b_no POSITION(12:29) CHAR
)
INTO TABLE my_selective_table
WHEN (30:37) = '20031217'
(
region CONSTANT '31',
service_key POSITION(01:11) INTEGER EXTERNAL,
call_b_no POSITION(12:29) CHAR
)
/* Example 7 */
-- load records with multi-line fields
-- doesn't work with inline data
load data
infile "test.dat" "str '|\n'"
into test_table
fields terminated by ';' TRAILING NULLCOLS
(
desc, txt
)
test.dat:
one line;hello dear world;|
two lines;Dear world,
hello!;|
/* Example 8 */
-- loading binary files (word, images, video... etc)
CREATE TABLE image_table (
image_id NUMBER(5),
file_name VARCHAR2(30),
image_data BLOB);
Control File:
LOAD DATA
INFILE *
INTO TABLE image_table
REPLACE
FIELDS TERMINATED BY ','
(
image_id INTEGER(5),
file_name CHAR(30),
image_data LOBFILE (file_name) TERMINATED BY EOF
)
BEGINDATA
001,image1.gif
002,image2.jpg
Page 522 Oracle DBA Code Examples
003,image3.jpg
/* Example 9 */
-- using specified characterset
LOAD DATA
CHARACTERSET WE8EBCDIC500
INFILE data.ebc "fix 86 buffers 1024"
BADFILE data.bad'
DISCARDFILE data.dsc'
REPLACE
INTO TABLE temp_data
(
...
/* Example 10 */
-- Loading a Sequence Number
LOAD DATA
INFILE '/u01/app/oracle/oradata/load/testload.txt'
INSERT INTO TABLE test123
(test_seq.nextval,. . .)
Loadi ng Excel Fi l e i nt o a Tabl e usi ng SQL* Loader
1. I f any cell dat a has newline charact ers ( Alt + ENTER) , remove t hem using t he following
Excel script :
' Removing tabs and carriage returns from worksheet cells
Sub CleanUp()
Dim TheCell As Range
On Error Resume Next
For Each TheCell In ActiveSheet.UsedRange
With TheCell
If .HasFormula = False Then
.Value = Application.WorksheetFunction.Clean(.Value)
End If
End With
Next TheCell
End Sub
2. Save Excel file as CSV
3. Use SQL* Loader t o load from CSV.
Loadi ng Lar ge Fi el ds i nt o a Tabl e
I f you t ry t o load any field larger t han 255 byt es int o a t able, even if t he t able column is
defined as VARCHAR2( 2000) or a CLOB, "Field in dat afile exceeds maximum lengt h" error will
be ret urned. You need t o specify t he size of t he t able column in t he cont rol file:
LOAD DATA
INFILE '/u01/app/oracle/oradata/load/testload.txt'
INSERT INTO TABLE test123
Page 523 Oracle DBA Code Examples
FIELDS TERMINATED BY ','
(text CHAR(2000))
Usi ng Di r ect Load Opt i ons
DIRECT = t rue
DATA_CACHE: ( default 1000) used if you have duplicat e dat a and t imest amp values in your
dat a.
ROWS: save dat a every number of ROWS
UNRECOVERABLE=Y ( default N) used wit h direct = t rue and disables redo log generat ion
SKIP_INDEX_MAINTENANCE=true (default false) do not bot her maint aining t he indexes during
t he load.
COLUMNARRAYROWS: number of rows loaded before t he building of t he st ream buffer
STREAMSIZE: t he size of t he st ream buffer
MULTITHREADING: ( default t rue) parallel conversion of column arrays t o st ream buffers and
st ream buffer
Page 524 Oracle DBA Code Examples
Dat a Pu mp Ex por t and I mpor t
Dat a Pump Component s
Th e DBMS_DATAPUMP pack age: t hi s is t he main engine of t he Dat a Pump ut ilit ies. I t cont ains
procedures t hat do t he export and import act ions.
Th e DBMS_METADATA pack ag e: t his package is used t o ext ract and modif y dat a dict ionary met adat a.
Th e comman d- l i n e cl i en t s, expdp an d impdp.
Dat a Pump Ex por t I nt er f aces
Using t he Command Line
expdp system/manager directory=dpump_dir1 dumpfile=expdat1.dmp
Using a Paramet er File
expdp parfile=myfile.txt
paramerer f ile may cont ain:
SCHEMAS=HR
DIRECTORY=dpump_dir1
DUMPFILE=system1.dmp
SCHEMAS=hr ...
Using I nt eract ive-command Dat a Pump Export
This mode is enabled by pressing [ Ct rl] + [ C] during an export operat ion st art ed wit h t he command-
line int erf ace or t he paramet er f ile int erf ace.
Using EM Dat abase Cont rol
St art t he Dat abase Cont r ol and go t o t he Maint enance | Ut ili t ies page.
Ex por t Modes Par amet er s
FULL (requires EXPORT_FULL_DATABASE role), SCHEMAS, TABLES, TABLESPACES,
TRANSPORT_TABLESPACES, and TRANSPORT_FULL_CHECK
I nvok i ng Ex por t Dat a Pump Ex ampl es
CREATE DIRECTORY dpump_dir1 AS '/u01/mydir';
GRANT READ, WRITE ON DIRECTORY dpump_dir1 TO baraka;
# schema mode is the default
expdp baraka/password DIRECTORY=dpump_dir1 dumpfile=testexp01.dmp
LOGFILE=dpump_dir2:mylog.log
# tables mode
expdp baraka/password tables=employees DIRECTORY=dpump_dir1
dumpfile=testexp01.dmp
expdp system/password tables=hr.employees ..
# nolog file (by default export.log is generated)
expdp nologfile=y
Page 525 Oracle DBA Code Examples
# overwrite existing dumpfiles
expdp REUSE_DUMPFILES=y
# compression: ALL, DATA_ONLY, METADATA_ONLY, NONE
expdp COMPRESSION=NONE
Ex por t Fi l t er i ng Par amet er s
/* EXCLUDE & INCLUDE */
EXCLUDE=INDEX
EXCLUDE=PROCEDURE
EXCLUDE=TABLE:"LIKE 'EMP%'"
EXCLUDE=SCHEMA:"='HR'"
INCLUDE=TABLE:"IN ('EMP', 'DEPT')"
# When used in command line, use slashes to escape double quotation:
expdp .. schemas=SCOTT EXCLUDE=TABLE:\"='EMP'\"
/* QUERY */
QUERY=OE.ORDERS: "WHERE order_id > 100000 ORDER BY order_date desc"
Ex por t Remappi ng Par amet er s
/* REMAP_DATA (11g) */
-- the remapping function shouldnt have commit or rollback
REMAP_DATA=[schema.]tablename.column_name:[schema.]pkg.function
expdp hr/passwd DIRECTORY=dp_dir DUMPFILE=remap.dmp
TABLES=hr.employees REMAP_DATA=hr.employees.last_name:hr.remap_pckg.modifychar
Sampl i ng Ex por t Dat a
SAMPLE=[[schema_name.]table_name:]sample_pct
SAMPLE=10
SAMPLE="HR"."EMPLOYEES":50
Ex por t Encr ypt i on Par amet er s
( 11g) : To secure t he export ed dump f ile, t he f ollowing new paramet ers are present ed in Oracle 11g
Dat a pump: ENCRYPTI ON, ENCRYPTI ON_PASSWORD and ENCRYPTI ON_ALGORI THM. To enable
encrypt ion, you must specif y eit her t he ENCRYPTI ON or ENCRYPTI ON_PASSWORD paramet er , or
bot h.
ENCRYPTION = {all | data_only | encrypted_columns_only | metadata_only | none}
ENCRYPTION_ALGORITHM = { AES128 | AES192 | AES256 }
ENCRYPTION_MODE = { DUAL | PASSWORD | TRANSPARENT }
expdp hr DUMPFILE=dp_dir.hr_enc.dmp JOB_NAME=enc ENCRYPTION=data_only
ENCRYPTION_PASSWORD=mypassword
expdp hr DIRECTORY=dp_dir DUMPFILE=hr_enc.dmp
ENCRYPTION=all ENCRYPTION_PASSWORD=mypassword
ENCRYPTION_ALGORITHM=AES256 ENCRYPTION_MODE=dual
Page 526 Oracle DBA Code Examples
Ex por t Est i mat i ng Par amet er s
ESTIMATE={BLOCKS | STATISTICS}
ESTIMATE_ONLY=y
expdp system/pswd estimate_only=y
Ex por t Net w or k Li nk Par amet er
Get dat a f rom a remot e dat abase t hrough db link.
Read Only DB can st ill be loaded f rom.
expdp hr/hr DIRECTORY=dpump_dir1 NETWORK_LINK=source_database_link
DUMPFILE=network_export.dmp
I mpor t Modes Par amet er s
You can perf orm a Dat a Pump import in various modes, usi ng t he TABLE, SCHEMAS, TABLESPACES,
and FULL
Fi l e- and Di r ect or y- Rel at ed Par amet er s
The Dat a Pump import ut ilit y uses t he PARFILE, DIRECTORY, DUMPFILE, LOGFILE, and NOLOGFILE
commands in t he same way as t he Dat a Pump export ut ilit y.
SQLFILE
This paramet er enables you t o ext ract t he DDL f rom t he export dump f ile, wit hout import ing any dat a.
impdp salapati/sammyy1 DIRECTORY=dpump_dir1 DUMPFILE=finance.dmp
SQLFILE=dpump_dir2:finance.sql
REUSE_DATAFILES
This paramet er t ell s Dat a Pump whet her it should use exist i ng dat af iles f or creat ing t ablespaces during an
import .
Usi ng TABLE_EXI STS_ACTI ON Par amet er
TABLE_EXISTS_ACTION=SKIP,APPEND,TRINCATE,REPLACE
I mpor t Fi l t er i ng Par amet er s
Same as export f ilt ering paramet ers
I mpor t Remappi ng Par amet er s
/* REMAP_TABLE (11g) */
-- rename table during export or import
-- it wont work if table already exists
impdp dumpfile=dp_dir:docs.dmp REMAP_TABLE=hr.docs:docs2 userid=hr/password
impdp dumpfile=dp_dir:docs.dmp REMAP_TABLE=hr.docs.part1:docs3
userid=hr/password
REMAP_SCHEMA
Page 527 Oracle DBA Code Examples
impdp system/manager dumpfile=newdump.dmp REMAP_SCHEMA=hr:oe
REMAP_DATAFILE
Changes t he name of t he source dat afile t o t he t arget dat afile name in all SQL st at ement s
where t he source dat afile is referenced: CREATE TABLESPACE, CREATE LIBRARY, and CREATE
DIRECTORY.
Remapping dat afiles is useful when you move dat abases bet ween plat forms t hat have
different file naming convent ions.
impdp hr/hr FULL=y DIRECTORY=dpump_dir1 DUMPFILE=db_full.dmp
REMAP_DATAFILE='DB1$:[HRDATA.PAYROLL]tbs6.f':'/db1/hrdata/payroll/tbs6.f'
REMAP_TABLESPACE
This paramet er enables you t o move obj ect s from one t ablespace int o a different t ablespace
during an import .
impdp hr/hr REMAP_TABLESPACE='example_tbs':'new_tbs' DIRECTORY=dpump_dir1
PARALLEL=2 JOB_NAME=cf1n02 DUMPFILE=employees.dmp NOLOGFILE=Y
I gnor i ng Nondef er r ed Const r ai nt s
( 11g) : set t ing t he DATA_OPTI ONS paramet er t o SKI P_CONSTRAI NT_ERRORS will cause t he import
program t o skip errors generat ed by t he nondef erred dat abase const rai nt s. I n t he case of def erred
const raint s, i mport s wi ll always be rolled back.
impdp Robert/robert DIRECTORY=data_pump_dir DUMPFILE=remap.dmp
tables=ROBERT.NAMES data_options=SKIP_CONSTRAINT_ERRORS
I mpor t Net w or k Li nk Par amet er
Get dat a f rom a remot e dat abase t hrough db link.
Read Only DB can st ill be loaded f rom.
expdp hr/hr DIRECTORY=dpump_dir1 NETWORK_LINK=source_database_link
DUMPFILE=network_export.dmp
I mpor t Fl ashback Par amet er s
FLASHBACK_TI ME and FLASHBACK_SCN enable you t o import dat a consist ent as of t he f lashback
t ime you specif y in your import j ob.
impdp system/manager FLASHBACK_TIME="TO_TIMESTAMP('01-06-2009 07:00:00;','DD-
MM-YYYY HH24:MI:SS')"
Moni t or i ng a Dat a Pump Jobs
# data pump jobs
SELECT * FROM dba_datapump_jobs;
# data pump sessoins
SELECT sid, serial#
FROM v$session s, dba_datapump_sessions d
WHERE s.saddr = d.saddr;
Page 528 Oracle DBA Code Examples
# viewing job progress
SELECT opname, target_desc, sofar, totalwork
FROM v$session_longops;
Page 529 Oracle DBA Code Examples
LogMi ner
Types of Suppl ement al Loggi ng
Uncondit ional supplement al log group: column values are always logged.
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (UNIQUE) COLUMNS;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (FOREIGN KEY) COLUMNS;
Condit ional supplement al log group: column values are logged if changed.
Level s of Suppl ement al Loggi ng
Dat abase Level: more resourse consuming, least required level is:
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (UNIQUE) COLUMNS;
Table Level:
ALTER TABLE HR.EMPLOYEES ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
ALTER TABLE HR.EMPLOYEES ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
ALTER TABLE HR.EMPLOYEES ADD SUPPLEMENTAL LOG DATA (UNIQUE) COLUMNS;
Table- Level User- Defined Supplement al Log Groups
o User- defined uncondit ional log groups
ALTER TABLE HR.EMPLOYEES ADD SUPPLEMENTAL LOG GROUP emp_parttime
(EMPLOYEE_ID, LAST_NAME, DEPARTMENT_ID) ALWAYS;
o User- defined condit ional supplement al log groups
-- always keyword isn't used:
ALTER TABLE HR.EMPLOYEES ADD SUPPLEMENTAL LOG GROUP emp_fulltime
(EMPLOYEE_ID, LAST_NAME, DEPARTMENT_ID);
ALTER TABLE HR.EMPLOYEES ADD SUPPLEMENTAL LOG GROUP emp_parttime(
DEPARTMENT_ID NO LOG, EMPLOYEE_ID);
Not e: you must enable at least minimal supplement al logging prior t o generat ing log files
which will be analyzed by LogMiner.
Di sabl i ng Dat abase- Level Suppl ement al Loggi ng
ALTER DATABASE DROP SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
ALTER DATABASE DROP SUPPLEMENTAL LOG DATA (UNIQUE) COLUMNS;
ALTER DATABASE DROP SUPPLEMENTAL LOG DATA;
Page 530 Oracle DBA Code Examples
LogMi ner Di ct i onar y Opt i ons
Using t he Online Cat alog: use it , if you believe no DDL is performed during Analysis.
Ext ract ing a LogMiner Dict ionary t o t he Redo Log Files: good if DDL might be t here during
analysis
Ext ract ing t he LogMiner Dict ionary t o a Flat File: forget t his opt ion!
Redo Log Fi l e Opt i ons
Aut omat ically: required redo log is aut omait cally det ect ed and used by t he ut ilit y.
Manually: you provide list of t he redo files t o analyse.
OPTI ONS possi bl e val ues i n DBMS_LOGMNR.START_LOGMNR:
DI CT_FROM_ONLI NE_CATALOG : Using t he Online Cat alog
DI CT_FROM_REDO_LOGS : St art LogMiner
CONTI NUOUS_MI NE : Redo Log File Opt ions
COMMI TTED_DATA_ONLY : Showing Only Commit t ed Transact ions
SKI P_CORRUPTI ON : Skipping Redo Corrupt ions
NO_SQL_DELI MI TER : Format t ing Reconst ruct ed SQL St at ement s for Reexecut ion
PRI NT_PRETTY_SQL : Format t ing t he Appearance of Ret urned Dat a for Readabilit y
NO_ROWI D_I N_STMT : Format t ing Reconst ruct ed SQL St at ement s for Reexecut ion
DDL_DI CT_TRACKI NG : Tracking DDL St at ement s in t he LogMiner Dict ionary ( not wit h
DI CT_FROM_ONLI NE_CATALOG)
Obt ai ni ng LogMi ner Oper at i onal I nf or mat i on
-- specified redo log files
-- STATUS: 0: the log file will be processed
1: the file will be the first redo log file to be processed
2: the file will not be processed by LogMiner (pruned)
4: the file is missing
select * from V$LOGMNR_LOGS;
-- optional LogMiner parameters
select * from V$LOGMNR_PARAMETERS;
-- current settings for supplemental logging
select SUPPLEMENTAL_LOG_DATA_FK, SUPPLEMENTAL_LOG_DATA_ALL,
SUPPLEMENTAL_LOG_DATA_UI, SUPPLEMENTAL_LOG_DATA_MIN
from V$DATABASE;
select * from DBA_LOG_GROUPS;
select * from ALL_LOG_GROUPS;
select * from USER_LOG_GROUPS;
Page 531 Oracle DBA Code Examples
select * from DBA_LOG_GROUP_COLUMNS;
select * from ALL_LOG_GROUP_COLUMNS;
select * from USER_LOG_GROUP_COLUMNS;
Ex ampl es of Usi ng LogMi ner
Wi t hout Sepeci f y i ng t he Redo Fi l es
Example:
LogMiner Dictionary: Online Catalog,
Redo Log File Options: Automatically
-- check Supplemental Logging is enabled
(see the examples above)
-- start LogMiner
ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';
begin
DBMS_LOGMNR.START_LOGMNR(
STARTTIME => '01-Jan-2003 08:30:00',
ENDTIME => '01-Jan-2003 08:45:00', -- future value can be set SYSDATE+5/24
OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG +
DBMS_LOGMNR.CONTINUOUS_MINE +
DBMS_LOGMNR.COMMITTED_DATA_ONLY +
DBMS_LOGMNR.PRINT_PRETTY_SQL );
end;
/
-- query V$LOGMNR_CONTENTS
SELECT USERNAME AS usr,(XIDUSN || '.' || XIDSLT || '.' || XIDSQN) as XID,
SQL_REDO FROM V$LOGMNR_CONTENTS
WHERE SEG_OWNER IS NULL OR SEG_OWNER NOT IN ('SYS', 'SYSTEM') AND
TIMESTAMP > '10-jan-2003 15:59:53';
SELECT OPERATION, SQL_REDO, SQL_UNDO
FROM V$LOGMNR_CONTENTS
WHERE SEG_OWNER = 'OE' AND SEG_NAME = 'ORDERS' AND
OPERATION = 'DELETE' AND USERNAME = 'RON';
-- Querying Based on Column Values
SELECT SQL_REDO FROM V$LOGMNR_CONTENTS
WHERE
SEG_NAME = 'EMPLOYEES' AND
SEG_OWNER = 'HR' AND
OPERATION = 'UPDATE' AND
DBMS_LOGMNR.MINE_VALUE(REDO_VALUE, 'HR.EMPLOYEES.SALARY')
DBMS_LOGMNR.MINE_VALUE(UNDO_VALUE, 'HR.EMPLOYEES.SALARY');
-- end the Miner session
EXECUTE DBMS_LOGMNR.END_LOGMNR;
Page 532 Oracle DBA Code Examples
Wi t Sepeci f y i ng t he Redo Fi l es
Example:
LogMiner Dictionary: Using the LogMiner Dictionary in the Redo Log Files,
Redo Log File Options: list of files provided
Redo log file that contains the end of the dictionary extract must have been
created before the redo log file that you want to analyze, but should be as
recent as possible.
Assume: you want to analyze file no 210
-- check Supplemental Logging is enabled
(see the examples above)
- TO extract the data dictionary to the redo logs (must be done before the
redo to analyze)
EXECUTE sys.DBMS_LOGMNR_D.build( OPTIONS =>
sys.DBMS_LOGMNR_D.store_in_redo_logs);
- Find a redo log file that contains the end of the dictionary extract
SELECT NAME, SEQUENCE#, DICTIONARY_BEGIN d_beg, DICTIONARY_END d_end
FROM V$ARCHIVED_LOG
WHERE SEQUENCE# = (SELECT MAX (SEQUENCE#) FROM V$ARCHIVED_LOG
WHERE DICTIONARY_END = 'YES' and SEQUENCE# <= 210);
- Find the redo log file that contains the start of the data dictionary
extract that matches the end of the dictionary found in the previous step:
SELECT NAME, SEQUENCE#, DICTIONARY_BEGIN d_beg, DICTIONARY_END d_end
FROM V$ARCHIVED_LOG
WHERE SEQUENCE# = (SELECT MAX (SEQUENCE#) FROM V$ARCHIVED_LOG
WHERE DICTIONARY_BEGIN = 'YES' and SEQUENCE# <= 208);
- Specify the list of the redo log files of interest. Order doesn't matter:
EXECUTE DBMS_LOGMNR.ADD_LOGFILE(-
LOGFILENAME => '/usr/oracle/data/db1arch_1_210_482701534.dbf', -
OPTIONS => DBMS_LOGMNR.NEW);
EXECUTE DBMS_LOGMNR.ADD_LOGFILE(-
LOGFILENAME => '/usr/oracle/data/db1arch_1_208_482701534.dbf');
EXECUTE DBMS_LOGMNR.ADD_LOGFILE(-
LOGFILENAME => '/usr/oracle/data/db1arch_1_207_482701534.dbf');
- Query the V$LOGMNR_LOGS :
SELECT FILENAME AS name, LOW_TIME, HIGH_TIME FROM V$LOGMNR_LOGS;
- Start LogMiner:
EXECUTE DBMS_LOGMNR.START_LOGMNR(-
OPTIONS => DBMS_LOGMNR.DICT_FROM_REDO_LOGS + -
DBMS_LOGMNR.COMMITTED_DATA_ONLY + -
DBMS_LOGMNR.PRINT_PRETTY_SQL);
- Query the V$LOGMNR_CONTENTS:
SELECT USERNAME AS usr, SQL_REDO FROM V$LOGMNR_CONTENTS
WHERE SEG_OWNER IS NULL OR SEG_OWNER NOT IN ('SYS', 'SYSTEM') AND
TIMESTAMP > '10-jan-2003 15:59:53';
- to display all the DML statements that were executed as part of the CREATE
Page 533 Oracle DBA Code Examples
TABLE DDL statement:
SELECT SQL_REDO FROM V$LOGMNR_CONTENTS
WHERE XIDUSN = 1 and XIDSLT = 2 and XIDSQN = 1594;
-- end the Miner session
EXECUTE DBMS_LOGMNR.END_LOGMNR;
Page 534 Oracle DBA Code Examples
Par t 10 Mi scel l aneous Or acl e Dat abase Topi cs
Page 535 Oracle DBA Code Examples
Managi ng Or acl e Dat abase Con t r ol
Conf i gur i ng and Usi ng t he Dat abase Cont r ol
-- manually configuring db control
emca -config dbcontrol db
emctl status dbconsole
emctl start dbconsole
emctl stop dbconsole
http://localhost:5500/em
$ORACLE_HOME/install/portlist.ini
isqlplusctl start
I mpl ement i ng EM Dat abase Cont r ol Aut o St ar t up
# (1) as root create oraemctl file
su -
vi /etc/init.d/oraemctl
#!/bin/bash
#
# oraemctl Starting and stopping Oracle Enterprise Manager Database Control.
# Script is valid for 10g and 11g versions.
#
# chkconfig: 35 80 30
# description: Enterprise Manager DB Control startup script
# Source function library.
. /etc/rc.d/init.d/functions
ORACLE_OWNER="oracle"
ORA_HOME="/u01/app/oracle/product/10.2.0/db_1"
case "$1" in
start)
echo -n $"Starting Oracle EM DB Console:"
su - $ORACLE_OWNER -c "$ORA_HOME/bin/emctl start dbconsole"
echo "OK"
;;
stop)
echo -n $"Stopping Oracle EM DB Console:"
su - $ORACLE_OWNER -c "$ORA_HOME/bin/emctl stop dbconsole"
echo "OK"
;;
*)
echo $"Usage: $0 {start|stop}"
esac
Page 536 Oracle DBA Code Examples
# (2) change permissions and runlevels
chmod 750 /etc/init.d/oraemctl
chkconfig --add oraemctl --level 0356
Page 537 Oracle DBA Code Examples
I nst al l i ng Or acl e 10g R5 ( 10. 2 ) Ent er pr i se Manager
Gr i d Cont r ol f or Li n ux x 8 6
Following are t he basic inst allat ion st eps t o inst all Oracle 10.2. 0.5 Ent erprise Manager Grid
Cont rol on Linux on a new dat abase.
Not e: for any inst allat ion, you should check t he Release Not es documenat ion before t aking
any pract ical st ep.
Not e: Since Ent erprise Manager 10g Grid Cont rol Release 4 or higher are pat ch set s, you need
t o use t he ' I nst alling Soft ware-Only and Configuring Lat er' inst allat ion met hod as indicat ed
below. This met hod is not support ed by t he int eract ive OUI .
I nst al l at i on Envi r onment
Emulat ion soft ware: VMWare Workst at ion 7 for Windows
OS: Redhat Ent erprise Linux 5. 2 for x86 32-bit
Requi r ed Sof t w ar e
Oracle Ent erprise Manager Grid Cont rol 10. 2. 0. 1 for Linux x86 32- bit
Oracle Ent erprise Manager Grid Cont rol 10. 2. 0. 5 for Linux x86 32- bit
The int erim RDBMS pat ch# 4329444
Oracle Dat abase Pat ch Set Not es 10g Release 1 ( 10. 1. 0. 5) Pat ch Set for Linux x86
Used Har dw ar e
I n t he VMWare: creat e one virt ual machine wit h t he following specs:
o 2 GB RAM
o One et hernet card configured as bridged or host - only in VMware
o CPU Count : 2
o Disk1: 40 GB on SCSI 0: 0 used t o inst all t he OS and soft ware
I nst al l at i on St eps
1. Har dw ar e ans Sof t w ar e Requi r ement s
Not e: A reference t o t he requirement s is Not e I D 419646. 1.
# At least 2 GB of physical memory
grep MemTotal /proc/meminfo
# OS and Kernel version
Oracle Enterprise Manager Grid Control Certification Checker [ID 412431.1]
For OEM 10.2.0.1 in Linux 5.2, only software will be installed (no config)
# swap space: if RAM=2G, swap=4GB
grep SwapTotal /proc/meminfo
Page 538 Oracle DBA Code Examples
# to display swap and memory in one command:
free
# if you don't have enought swap,
# you can add swap space by creating a temporary swap file.
# let's say about 500MB:
dd if=/dev/zero of=tempswap bs=1k count=500000
chmod 600 tempswap
mke2fs tempswap
mkswap tempswap
swapon tempswap
# required packs
rpm -q --qf '%{NAME}-%{VERSION}-%{RELEASE} (%{ARCH})\n' binutils \
glibc- \
make- \
gcc- \
libaio- \
glibc-common- \
setarch- \
pdksh- \
openmotif22 \
sysstat- \
libstdc++- \
libstdc++-devel- \
compat-libstdc++- \
compat-db- \
control-center- \
# install missed packages
rpm -Uvh libXp-1.0.0-8.1.el5.i386.rpm
rpm -Uvh openmotif22-2.2.3-18.i386.rpm
rpm -Uvh compat-db-4.2.52-5.1.i386.rpm
rpm -Uvh compat-gcc-34-3.4.6-4.i386.rpm
rpm -Uvh compat-gcc-34-c++-3.4.6-4.i386.rpm
Note: for pdksh-5.2.14-36.el5.i386.rpm, it isn't used in EL 5.2
2. Conf i gur e k er nel par amet er s and shel l l i mi t s
vi /etc/sysctl.conf
# mark existing ones
kernel.shmall = 2097152
kernel.shmmax = 536870912
kernel.shmmni = 4096
# semaphores: semmsl, semmns, semopm, semmni
kernel.sem = 250 32000 100 128
# the following setting is removed because default value is higher
# fs.file-max = 65536
# old values (1024 65000) not recommended
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 4194304
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
Page 539 Oracle DBA Code Examples
net.core.wmem_max = 262144
net.ipv4.tcp_wmem = 262144 262144 262144
net.ipv4.tcp_rmem = 4194304 4194304 4194304
# then run:
/sbin/sysctl -p
vi /etc/security/limits.conf
* soft nproc 2047
* hard nproc 16384
* soft nofile 1024
* hard nofile 65536
vi /etc/pam.d/login
session required pam_limits.so
# in Linux 5.X run:
ln -s /usr/lib/libgdbm.so.2.0.0 /usr/lib/libdb.so.2
# SELINUX must be disabled
cat /etc/selinux/config | grep SELINUX=
vi /etc/selinux/config
SELINUX=disabled
shutdown -h now -r
3. Cr eat e t he r equi r ed net w or k conf i gur at i on:
# /etc/hosts file must contain a fully qualified name:
# <IP-address> <fully-qualified-machine-name> <machine-name>
vi /etc/hosts
127.0.0.1 localhost.localdomain localhost
192.168.4.107 srv107.localdomain srv107
ping srv07
4. Cr eat e and conf i gur e t he r equi r ed OS user s, gr oups and di r ect or i es
groupadd -g 501 oinstall
groupadd -g 502 dba
# oracle software owner user
/usr/sbin/useradd -u 200 -g oinstall -G dba oracle
passwd oracle
# oracle parent direcotry
# Oracle homes will be created as subdirectories under this parent directory
mkdir -p /u01/app
mkdir /u01/stage
chown -R oracle:oinstall /u01
chmod 775 /u01/app
chmod 775 /u01/stage
# will be used instead of /tmp by oracle
mkdir /home/oracle/oratemp
chown -R oracle:oinstall /home/oracle/oratemp
Page 540 Oracle DBA Code Examples
vi /home/oracle/.bash_profile
TMP=/home/oracle/oratemp; export TMP
TMPDIR=$TMP; export TMPDIR
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_HOME=/u01/app/oracle/product/10.2.0/db10g; export ORACLE_HOME
AGENT_HOME=/u01/app/oracle/product/10.2.0/agent10g; export AGENT_HOME
OMS_HOME=/u01/app/oracle/product/10.2.0/oms10g; export OMS_HOME
ORACLE_HOSTNAME=srv107.localdomain; export ORACLE_HOSTNAME
ORACLE_SID=oemdb; export ORACLE_SID
ORACLE_TERM=xterm; export ORACLE_TERM
PATH=/usr/sbin:$PATH; export PATH
PATH=$ORACLE_HOME/bin:$PATH; export PATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib; export LD_LIBRARY_PATH
CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib; export
CLASSPATH
vi /etc/profile
if [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi
5. I nst al l t he Sof t w ar e
# edit the response file
vi /u01/stage/gc10.0.2.1/Disk1/response/em_with_new_db.rsp
FROM_LOCATION="../rdbms/Disk1/stage/products.xml"
BASEDIR="/u01/app/oracle/product/10.2.0"
INSTALLATION_NAME="OEMGC 10.2.0.5"
s_gdbName="oemdb"
s_mountPoint="/u01/app/oracle/product/10.2.0/oradata"
s_operGroup="dba"
s_adminGroup="dba"
s_securePassword="qwer5"
s_securePasswordConfirm="qwer5"
b_lockedSelected=false
b_passwordsDifferent=false
b_passwordsSame=true
s_reposPwd="qwer5"
s_reposPwdConfirm="qwer5"
UNIX_GROUP_NAME="dba"
# invoke the installer:
# Note: if the folder exists and not empty, add -force switch
cd /u01/stage/gc10.0.2.1/Disk1
./runInstaller -noconfig -silent -responseFile
/u01/stage/gc10.0.2.1/Disk1/response/em_with_new_db.rsp | tee output.txt
# as a root user in a new terminal:
# (if this is the first Oracle product you just installed on the host):
Page 541 Oracle DBA Code Examples
/u01/app/oraInventory/orainstRoot.sh
# execute (answer n to y/n questions):
/u01/app/oracle/product/10.2.0/db10g/allroot.sh
# stop all the OPMN processes:
/u01/app/oracle/product/10.2.0/oms10g/opmn/bin/opmnctl stopall
# verify the processes were stopped:
ps -ef | grep opmn
6. Appl y t he pat ches on t he r eposi t or y dat abase home
# Apply the interim RDBMS patch# 4329444 to the Oracle home of the database
export ORACLE_HOME=/u01/app/oracle/product/10.2.0/db10g
cd /u01/stage/4329444
export OBJECT_MODE=32_64
export PATH=$PATH:/u01/app/oracle/product/10.2.0/db10g/OPatch
opatch apply
# Apply 10.1.0.5 Patch Set
cd /u01/stage/db10.1.0.5/Disk1
./runInstaller -ignoreSysPrereqs
>select db10g home
>next, next till you finish applying the patch set
7. Appl y t he pat ch set 10. 2. 0. 5 on OMS and Agent homes
# as root: run the following command:
ln -s /usr/lib/libgdbm.so.2.0.0 /usr/lib/libdb.so.2
/* Apply the patch on oms */
# edit the response file:
vi /u01/stage/gc10.0.2.5/3731593/Disk1/response/patchset.rsp
UNIX_GROUP_NAME="dba"
b_softwareonly=true
s_sysPassword="qwer5"
sl_pwdInfo={ "qwer5" }
ORACLE_HOME="/u01/app/oracle/product/10.2.0/oms10g"
oracle.iappserver.st_midtier:szl_InstanceInformation={"ias_password"}
SHOW_SPLASH_SCREEN=false
SHOW_SUMMARY_PAGE=false
SHOW_INSTALL_PROGRESS_PAGE=false
SHOW_REQUIRED_CONFIG_TOOL_PAGE=false
SHOW_CONFIG_TOOL_PAGE=false
SHOW_XML_PREREQ_PAGE=false
HOW_END_OF_INSTALL_MSGS=false
SHOW_ROOTSH_CONFIRMATION=false
SHOW_END_SESSION_PAGE=false
# apply the patch set
cd /u01/stage/gc10.0.2.5/3731593/Disk1
./runInstaller -noconfig -silent -responseFile
/u01/stage/gc10.0.2.5/3731593/Disk1/response/patchset.rsp -force | tee
outputoms.txt
# open terminal as root and run (no output expected):
Page 542 Oracle DBA Code Examples
/u01/app/oracle/product/10.2.0/oms10g/root.sh
/* Apply the patch on agent */
# change only the following parameters in the file:
vi /u01/stage/gc10.0.2.5/3731593/Disk1/response/patchset.rsp
ORACLE_HOME="/u01/app/oracle/product/10.2.0/agent10g"
# apply the patch on agent:
cd /u01/stage/gc10.0.2.5/3731593/Disk1
./runInstaller -noconfig -silent -responseFile
/u01/stage/gc10.0.2.5/3731593/Disk1/response/patchset.rsp -force | tee
outputagent.txt
# as root run:
/u01/app/oracle/product/10.2.0/agent10g/root.sh
8. Conf i gur e t he Ent er pr i se Manager Gr i d Cont r ol
export PERL5LIB=/u01/app/oracle/product/10.2.0/oms10g/perl/lib/5.6.1
/u01/app/oracle/product/10.2.0/oms10g/perl/bin/perl
/u01/app/oracle/product/10.2.0/oms10g/sysman/install/ConfigureGC.pl
/u01/app/oracle/product/10.2.0
# to verify the configured OEM release:
/u01/app/oracle/product/10.2.0/oms10g/bin/emctl status oms
/u01/app/oracle/product/10.2.0/agent10g/bin/emctl status agent
9. Runni ng Ent er pr i se Manager Gr i d Cont r ol 10.2. 0. 5
#find the EM port:
cat /u01/app/oracle/product/10.2.0/oms10g/install/portlist.ini | grep
"Enterprise Manager Central Console Port"
# access the URL:
http://srv107.localdomain:4889/em/
# login as sysman
Page 543 Oracle DBA Code Examples
Remot e Di agnost i c Agent ( RDA)
Usi ng Remot e Di agnost i c Agent ( RDA)
Ref er t o not e 314422. 1
Page 544 Oracle DBA Code Examples
Par t 11 PL/ SQL Sampl es
Page 545 Oracle DBA Code Examples
PL/ SQL Basi cs
PL/ SQL Dat a Types
/* character */
-- max length in 11g: 32767
DECLARE
v_string VARCHAR2(10);
DECLARE
v_string VARCHAR2(10 CHAR);
...
/* number */
BINARY_DOUBLE
BINARY_FLOAT
BINARY_INTEGER
NUMBER
PLS_INTEGER 2147483647 to +2147483647
/* data time */
-- TIMESTAMP
select SYSTIMESTAMP from dual;
-- TIMESTAMP WITH TIME ZONE
SET SERVEROUTPUT ON
DECLARE
v_datetime TIMESTAMP (3) WITH TIME ZONE := SYSTIMESTAMP;
BEGIN
DBMS_OUTPUT.PUT_LINE(v_datetime);
END;
/
-- TIMESTAMP WITH LOCAL TIME ZONE
SET SERVEROUTPUT ON
DECLARE
v_datetime TIMESTAMP (0) WITH LOCAL TIME ZONE := SYSTIMESTAMP;
BEGIN
DBMS_OUTPUT.PUT_LINE(v_datetime);
END;
/
/* inerval */
INTERVAL YEAR TO MONTH
INTERVAL DAY TO SECOND
DECLARE
v_college_deadline TIMESTAMP;
BEGIN
Page 546 Oracle DBA Code Examples
v_college_deadline := TO_TIMESTAMP('06/06/2004', 'DD/MM/YYYY')
+ INTERVAL '12-3' YEAR TO MONTH + INTERVAL '19 9:0:0.0' DAY TO SECOND;
DBMS_OUTPUT.PUT_LINE('My daughter leaves for college in ' ||
v_college_deadline);
END;
/
/* REF CURSOR */
-- a pointer to a result set
CREATE OR REPLACE PROCEDURE cust_sel
( cv_results IN OUT SYS_REFCURSOR)
IS
BEGIN
OPEN cv_results FOR
SELECT customer_id, cust_last_name from customers;
END;
/
VARIABLE x REFCURSOR
EXEC cust_sel(:x)
PRINT x
/* REF */
REF value simply as a pointer to an object instance in an object table or
object view.
Cont r ol l i ng Compi l e- Ti me Di spl ayed War ni ngs
PLSQL_WARNINGS is a system and session levels.
={ ENABLE | DISABLE | ERROR }:
{ ALL | SEVERE | INFORMATIONAL | PERFORMANCE | { integer | (integer [, integer
] ...) }}
SHOW PARAMETER PLSQL_WARNINGS
-- it can take one value
PLSQL_WARNINGS='ENABLE:PERFORMANCE'
-- it can take multiple values
PLSQL_WARNINGS='ENABLE:PERFORMANCE', 'ENABLE:SEVERE'
-- more examples:
PLSQL_WARNINGS = 'ENABLE:SEVERE', 'DISABLE:INFORMATIONAL';
PLSQL_WARNINGS = 'DISABLE:ALL';
PLSQL_WARNINGS = 'DISABLE:5000', 'ENABLE:5001',
'ERROR:5002';
PLSQL_WARNINGS = 'ENABLE:(5000,5001,5002)',
'DISABLE:(6000,6001)';
-- setting the parameter using DBMS_WARNING
SELECT DBMS_WARNING.GET_WARNING_SETTING_STRING() WARNING_LEVEL FROM dual;
CALL DBMS_WARNING.SET_WARNING_SETTING_STRING('ENABLE:ALL', 'SESSION');
CALL DBMS_WARNING.SET_WARNING_SETTING_STRING('DISABLE:ALL', 'SESSION');
Page 547 Oracle DBA Code Examples
Cat chi ng Ret ur ned Er r or s
..
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Exception: '||sqlerrm);
..
Hi di ng Code
wrap iname=input_file.sql oname=output_file.plb
Cont r ol l i ng Pr ogr am Fl ow
/* IF */
IF condition THEN
action
ELSIF condition THEN
action
ELSE
action
END IF;
/* CASE */
CASE expression
WHEN test1 THEN action;
WHEN test2 THEN action;
...
ELSE
...
END CASE;
CASE v_category
WHEN 'Oracle Basics'
THEN v_discount := .15;
WHEN 'Oracle Server'
THEN v_discount := .10;
ELSE v_discount := .5;
END CASE;
/* Searched CASE */
CASE
WHEN <exp> THEN
actions;
WHEN <exp> THEN
actions;
ELSE
actions;
END CASE;
/* Case Expressions */
Page 548 Oracle DBA Code Examples
appraisal :=
CASE grade
WHEN 'A' THEN 'Excellent'
WHEN 'B' THEN 'Very Good'
WHEN 'C' THEN 'Good'
ELSE 'No such grade'
END;
appraisal :=
CASE
WHEN grade = 'A' THEN 'Excellent'
WHEN grade IN ('B','C') THEN 'Good'
ELSE 'No such grade'
END;
/* Loop */
LOOP
..
EXIT [WHEN condition]
END LOOP;
-- loops and lablels
BEGIN
<<Outer_loop>>
LOOP
counter := counter+1;
EXIT WHEN counter>10;
<<Inner_loop>>
LOOP
...
EXIT Outer_loop WHEN total_done = 'YES';
-- Leave both loops
EXIT WHEN inner_done = 'YES';
-- Leave inner loop only
...
END LOOP Inner_loop;
...
END LOOP Outer_loop;
END;
/
/* Numeric FOR Loop */
FOR counter IN [reverse] low_number .. high_number LOOP
action;
END LOOP;
begin
for i in reverse 1..10 loop
dbms_output.put_line(i);
end loop;
end;
/
Page 549 Oracle DBA Code Examples
/* WHILE Loop */
WHILE condition LOOP
..
END LOOP;
/* Goto and Labels */
BEGIN
DBMS_OUTPUT.PUT_LINE('BEGINNING OF BLOCK');
GOTO l_Last_Line;
DBMS_OUTPUT.PUT_LINE('GOTO didn''t work!');
RETURN;
<<l_Last_Line>>
DBMS_OUTPUT.PUT_LINE('Last Line');
END;
/
Page 550 Oracle DBA Code Examples
Usi ng Cur sor s
CURSOR cursor_name [parameter_list]
[RETURN return_type]
IS query [FOR UPDATE [OF (column_list)][NOWAIT]];
OPEN cur1;
OPEN cur1(50);
FETCH cursor_name INTO variable_name(s) | PL/SQL_record;
CLOSE cursor_name;
Cursor Attributes:
%BULK_ROWCOUNT number of rows changed during the operation
%ROWCOUNT number of rows fetched from the cursor at any given time
%FOUND
%ISOPEN
%NOTFOUND
-- example 1
SET SERVEROUTPUT ON
DECLARE
v_first_name AUTHORS.FIRST_NAME%TYPE;
v_last_name AUTHORS.LAST_NAME%TYPE;
v_row_count PLS_INTEGER := 0;
v_book_count PLS_INTEGER := 0;
CURSOR auth_cur IS
SELECT a.first_name, a.last_name, count(b.title)
FROM authors a, books b
WHERE a.id = b.author1
OR a.id = b.author2
OR a.id = b.author3
GROUP BY a.first_name, a.last_name
HAVING count(b.title) > 0
ORDER BY a.last_name;
BEGIN
DBMS_OUTPUT.ENABLE(1000000);
OPEN auth_cur;
LOOP
FETCH auth_cur INTO v_first_name, v_last_name, v_book_count;
EXIT WHEN auth_cur%NOTFOUND;
v_row_count := auth_cur%ROWCOUNT;
DBMS_OUTPUT.PUT_LINE(v_row_count||' rows processed so far');
DBMS_OUTPUT.PUT_LINE(v_last_name ||', ' ||v_first_name ||' wrote '
||v_book_count ||' book(s).');
END LOOP;
CLOSE auth_cur;
IF auth_cur%ISOPEN = FALSE THEN
DBMS_OUTPUT.PUT_LINE('Cursor closed');
ELSE
DBMS_OUTPUT.PUT_LINE('The cursor is still open');
END IF;
EXCEPTION
Page 551 Oracle DBA Code Examples
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/
-- example 2
..
WHILE auth_cur%FOUND LOOP
DBMS_OUTPUT.PUT_LINE(v_author.last_name);
FETCH auth_cur INTO v_author;
END LOOP;
..
-- example 3
SET SERVEROUTPUT ON
DECLARE
CURSOR auth_cur IS
SELECT * FROM authors;
BEGIN
FOR v_author IN auth_cur LOOP
DBMS_OUTPUT.PUT_LINE(v_author.last_name);
END LOOP;
END;
/
/* Cursor Variables */
SET SERVEROUTPUT ON
DECLARE
TYPE book_typ IS REF CURSOR RETURN BOOKS%ROWTYPE;
cv_books book_typ;
v_books BOOKS%ROWTYPE;
BEGIN
DBMS_OUTPUT.ENABLE(1000000);
OPEN cv_books FOR
SELECT * FROM books WHERE isbn = '78824389';
FETCH cv_books INTO v_books;
DBMS_OUTPUT.PUT_LINE(v_books.title||' is '||v_books.price);
CLOSE cv_books;
END;
/
CREATE OR REPLACE PROCEDURE authors_sel
( cv_results IN OUT SYS_REFCURSOR)
IS
BEGIN
OPEN cv_results FOR SELECT id, first_name, last_name
FROM authors;
END;
/
VARIABLE x REFCURSOR
EXEC authors_sel(:x)
PRINT x
Page 552 Oracle DBA Code Examples
/* Handling Implicit Cursors */
SET SERVEROUTPUT ON
BEGIN
DBMS_OUTPUT.ENABLE(1000000);
UPDATE books
SET price = price * .90
WHERE isbn = '78824389';
DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT||' rows updated');
IF SQL%NOTFOUND THEN
DBMS_OUTPUT.PUT_LINE('Unable to update isbn 78824389');
END IF;
COMMIT;
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/
/* Cursor Subqueries */
SET SERVEROUTPUT ON
DECLARE
cv_author SYS_REFCURSOR;
v_title BOOKS.TITLE%TYPE;
v_author AUTHORS%ROWTYPE;
v_counter PLS_INTEGER := 0;
CURSOR book_cur IS
SELECT b.title,
CURSOR (SELECT *
FROM authors a
WHERE a.id = b.author1
OR a.id = b.author2
OR a.id = b.author3)
FROM books b WHERE isbn = '78824389';
BEGIN
OPEN book_cur;
LOOP
FETCH book_cur INTO v_title, cv_author;
EXIT WHEN book_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Title from the main cursor: '||v_title);
LOOP
FETCH cv_author INTO v_author;
EXIT WHEN cv_author%NOTFOUND;
v_counter := v_counter + 1;
DBMS_OUTPUT.PUT_LINE('Author'||v_counter||': '
||v_author.first_name||' '||v_author.last_name);
END LOOP;
END LOOP;
CLOSE book_cur;
END;
/
Page 553 Oracle DBA Code Examples
/* Using Where Current of */
SET SERVEROUTPUT ON
DECLARE
v_isbn INVENTORY.ISBN%TYPE;
v_amount INVENTORY.AMOUNT%TYPE;
CURSOR inventory_cur
IS
SELECT isbn, amount
FROM inventory
WHERE status = IN STOCK
AND isbn IN (SELECT isbn
FROM books
WHERE price > 40)
FOR UPDATE OF amount;
BEGIN
FOR y IN inventory_cur
LOOP
FETCH inventory_cur INTO v_isbn, v_amount;
EXIT WHEN inventory_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_isbn||Amount IN STOCK before: ||v_amount);
v_amount := v_amount + 250;
UPDATE inventory
SET amount = v_amount
WHERE CURRENT OF inventory_cur;
DBMS_OUTPUT.PUT_LINE(v_isbn||Amount IN STOCK after: ||v_amount);
END LOOP;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
ROLLBACK;
END;
/
Page 554 Oracle DBA Code Examples
Usi ng Recor ds
DECLARE
TYPE individual_record IS RECORD
(individual_id INTEGER
,first_name VARCHAR2(30 CHAR)
,middle_initial individuals.middle_initial%TYPE
,last_name VARCHAR2(30 CHAR));
-- Define a variable of the record type.
individual INDIVIDUAL_RECORD;
BEGIN
-- Initialize the field values for the record.
individual.individual_id := 2;
individual.first_name := 'John';
individual.middle_initial := 'P';
individual.last_name := 'Morgan';
-- Insert into the table.
INSERT
INTO individuals
VALUES
(individual.individual_id
,individual.first_name
,individual.middle_initial
,individual.last_name);
-- Commit the work.
COMMIT;
END;
/
-- nested records
DECLARE
-- Define a record type.
TYPE individual_record IS RECORD
(individual_id INTEGER
,first_name VARCHAR2(30 CHAR)
,middle_initial VARCHAR2(1 CHAR)
,last_name VARCHAR2(30 CHAR));
-- Define a record type.
TYPE address_record IS RECORD
(address_id INTEGER
,individual_id INTEGER
,street_address1 VARCHAR2(30 CHAR)
,street_address2 VARCHAR2(30 CHAR)
Page 555 Oracle DBA Code Examples
,street_address3 VARCHAR2(30 CHAR));
-- Define a record type of two user-defined record types.
TYPE individual_address_record IS RECORD
(individual INDIVIDUAL_RECORD
,address ADDRESS_RECORD);
-- Define a user-defined compound record type.
individual_address INDIVIDUAL_ADDRESS_RECORD;
BEGIN
-- Initialize the field values for the record.
individual_address.individual.individual_id := 3;
individual_address.individual.first_name := 'Ulysses';
...
-- Record Types can be explicitly defined as Object Type as well
-- Defining and Using Record Types as Return Values
DECLARE
-- Define a record type.
FUNCTION get_row (individual_id_in INTEGER)
RETURN INDIVIDUAL_RECORD IS
-- Define a cursor to return a row of individuals.
CURSOR c (individual_id_cursor INTEGER) IS
SELECT *
FROM individuals
WHERE individual_id = individual_id_cursor;
BEGIN
-- Loop through the cursor for a single row.
FOR i IN c(individual_id_in) LOOP
-- Return a %ROWTYPE from the INDIVIDUALS table.
RETURN i;
END LOOP;
END get_row;
Page 556 Oracle DBA Code Examples
Usi ng Tabl e Fun ct i ons
/* Table Function (not pipelined) */
-- not pipelined: row set will be returned when all rows are fetched
/* */
CREATE TYPE BookType AS OBJECT (
isbn CHAR(10),
title VARCHAR2(100)
)
/
CREATE TYPE BookTypes AS TABLE OF BookType;
/
CREATE OR REPLACE FUNCTION SomeBooks(p_Category IN books.category%TYPE)
RETURN BookTypes AS
v_ResultSet BookTypes := BookTypes();
CURSOR c_SomeBooks IS
SELECT isbn, title
FROM books
WHERE category = p_Category;
BEGIN
FOR v_Rec IN c_SomeBooks LOOP
v_ResultSet.EXTEND;
v_ResultSet(v_ResultSet.LAST) := BookType(v_Rec.isbn, v_Rec.title);
END LOOP;
RETURN v_ResultSet;
END SomeBooks;
/
SELECT SomeBooks('Oracle Basics') FROM dual;
COLUMN title FORMAT a60
SELECT *
FROM TABLE (SomeBooks('Oracle Basics'));
-- Since SomeBooks will always return the same output given the same
-- input, we can use the DETERMINISTIC keyword.
-- its supposed positive impact is not proved though
CREATE OR REPLACE FUNCTION SomeBooks(p_Category IN books.category%TYPE)
RETURN BookTypes DETERMINISTIC AS
/* Example of using pipelined table functions in data transformation */
-- with pipelined table functions, each row will be returned as soon
--- as it is created
-- sample destination table
CREATE TABLE yearly_store_sales
(store_name VARCHAR2(25),
sales_year NUMBER,
total_sales NUMBER);
-- (1) create type
CREATE TYPE yearly_store_sales_row AS
OBJECT(
Page 557 Oracle DBA Code Examples
store_name varchar2(25),
sales_year number,
total_sales number);
-- (2) create PL/SQL table of the type
CREATE TYPE yearly_store_sales_table
AS
TABLE OF yearly_store_sales_row;
-- (3) create package, or function
CREATE OR REPLACE PACKAGE sales_package
AS
TYPE sales_cursor_type IS REF CURSOR RETURN sales_data%ROWTYPE;
FUNCTION modify_sales_data (INPUTDATA IN sales_cursor_type)
RETURN yearly_store_sales_table PIPELINED;
END;
/
CREATE OR REPLACE PACKAGE BODY sales_package
AS
FUNCTION modify_sales_data(inputdata IN sales_cursor_type)
RETURN yearly_store_sales_table PIPELINED
IS
inputrec sales_data%ROWTYPE;
outputrow_2001 yearly_store_sales_row :=
yearly_store_sales_row(NULL,NULL,NULL);
outputrow_2002 yearly_store_sales_row :=
yearly_store_sales_row(NULL,NULL,NULL);
BEGIN
LOOP
FETCH inputdata INTO inputrec;
EXIT WHEN inputdata%NOTFOUND;
IF INPUTREC.SALES_2001 IS NOT NULL THEN
outputrow_2001.store_name := inputrec.store_name;
outputrow_2001.sales_year := 2001;
outputrow_2001.total_sales:= inputrec.sales_2001;
pipe row (outputrow_2001);
END IF;
IF INPUTREC.SALES_2002 IS NOT NULL THEN
outputrow_2002.store_name := inputrec.store_name;
outputrow_2002.sales_year := 2002;
outputrow_2002.total_sales:= inputrec.sales_2002;
pipe row (outputrow_2002);
END IF;
END LOOP;
RETURN;
END;
END sales_package;
/
-- (4) usage
SELECT *
FROM
TABLE(sales_package.modify_sales_data( CURSOR(select
store_name,sales_2001,sales_2002 FROM sales_data)));
Page 558 Oracle DBA Code Examples
Usi ng Col l ect i on s
Varrays Fixed: may not be used in t ables
Nest ed t ables Fixed: may be used in t ables
Associat ive arrays ( index- by PL/ SQL t ables) Dynamic
Mult iset Operat or I t s Equivalent in SQL
MULTISET EXCEPT MINUS
MULTISET INTERSECT INTERSECT
MULTISET UNION UNION ALL
SET DISTINCT
Usi ng VARRAYS
Alt hough VARRAYS can be st ored as part of a t able, it is best suit ed for PL/ SQL
proccessing.
TYPE type_name IS {VARRAY | VARYING ARRAY} (size_limit)
OF element_type [ NOT NULL ];
-- initialized in the declaration section
DECLARE
TYPE integer_varray IS VARRAY(3) OF INTEGER;
Declare and initialize a varray that allows nulls.
varray_integer INTEGER_VARRAY := integer_varray(NULL,NULL,NULL);
BEGIN
Assign values to subscripted members of the varray.
varray_integer(1) := 11;
varray_integer(2) := 12;
varray_integer(3) := 13;
FOR i IN 1..3 LOOP
dbms_output.put_line('Integer Varray ['||i||'] '||
'['||varray_integer(i)||']');
END LOOP;
END;
/
-- initialized with zero rows in the declaration
-- then dynamic initialization in the execution
DECLARE
Define a varray of integer with 3 rows.
TYPE integer_varray IS VARRAY(3) OF INTEGER;
Declare and initialize a null set of rows.
varray_integer INTEGER_VARRAY := integer_varray();
BEGIN
Loop through the three records.
Page 559 Oracle DBA Code Examples
FOR i IN 1..3 LOOP
Initialize row.
varray_integer.EXTEND;
Assign values to subscripted members of the varray.
varray_integer(i) := 10 + i;
END LOOP;
Loop through the records to print the varrays.
FOR i IN 1..3 LOOP
Print the contents.
dbms_output.put ('Integer Varray ['||i||'] ');
dbms_output.put_line('['||varray_integer(i)||']');
END LOOP;
END;
/
-- Varrays as Object Types
CREATE OR REPLACE TYPE integer_varray
AS VARRAY(3) OF INTEGER;
-- initializing by Collection API
CREATE OR REPLACE TYPE integer_varray
AS VARRAY(100) OF INTEGER NOT NULL;
/
DECLARE
Declare and initialize a null set of rows.
varray_integer INTEGER_VARRAY := integer_varray();
BEGIN
Loop through all records.
FOR i IN 1..varray_integer.LIMIT LOOP
Initialize row.
varray_integer.EXTEND;
END LOOP;
dbms_output.put ('Integer Varray Initialized ');
dbms_output.put_line('['||varray_integer.COUNT||']');
END;
/
-- Using Varrays as Column Data Types in Tables
-- it doesn't produce meaningful output
CREATE OR REPLACE TYPE address_varray
AS VARRAY(3) OF VARCHAR2(30 CHAR);
/
CREATE TABLE addresses
(address_id INTEGER NOT NULL
..
Page 560 Oracle DBA Code Examples
,street_address ADDRESS_VARRAY NOT NULL
..
);
INSERT INTO addresses
VALUES
(..,address_varray('MyAddress','450 West Paseo Redondo','Suite 200'),..);
-- you can insert only one element of the varray
INSERT
INTO addresses
VALUES (12 ,12 ,address_varray('Office of Senator Kennedy') ,..);
-- it gives though unmeaningful output
SELECT street_address FROM addresses;
STREET_ADDRESS
-
ADDRESS_VARRAY('MyAddress','450 West Paseo ...
UPDATE addresses
SET street_address =
address_varray('Your Address' ,'2400 E. Arizona Biltmore Cir.'
,'Suite 1150')
WHERE address_id = 11;
-- to update a portion of a varray column, you must use pl/sql
DECLARE
Define a record type for a row of the addresses table.
TYPE address_type IS RECORD .. ;
Define a variable of the addresses table record type.
address ADDRESS_TYPE;
Define a cursor to return the %ROWTYPE value.
CURSOR get_street_address
(address_id_in INTEGER) IS
SELECT *
FROM addresses
WHERE address_id = address_id_in;
BEGIN
Open the cursor.
OPEN get_street_address(11);
Fetch a into the record type variable.
FETCH get_street_address
INTO address;
Close the cursor.
CLOSE get_street_address;
Reset the first element of the varray type variable.
address.street_address(1) :=
'Office of Senator John McCain';
Update the varray column value.
Page 561 Oracle DBA Code Examples
UPDATE addresses
SET street_address = address.street_address
WHERE address_id = 11;
END;
Usi ng Nest ed Tabl es
Nest ed t ables may be used in t able, record, and obj ect definit ions. They may be accessed
in SQL and PL/ SQL.
CREATE OR REPLACE TYPE type_name
AS TABLE OF element_type [ NOT NULL ];
-- basic example
DECLARE
-- Define a nested table of variable length strings.
TYPE card_table IS TABLE OF VARCHAR2(5 CHAR);
-- Declare and initialize a nested table with three rows.
cards CARD_TABLE := card_table(NULL,NULL,NULL);
BEGIN
-- Assign values to subscripted members of the varray.
cards(1) := 'Ace';
cards(2) := 'Two';
cards(3) := 'Three';
END;
/
-- dynamic initialization and assignment in the execution section
DECLARE
-- Define a nested table of variable length strings.
TYPE card_suit IS TABLE OF VARCHAR2(5 CHAR);
-- Declare and initialize a null set of rows.
cards CARD_SUIT := card_suit();
BEGIN
-- Loop through the three records.
FOR i IN 1..3 LOOP
-- Initialize row.
cards.EXTEND;
-- Assign values to subscripted members of the varray.
IF i = 1 THEN
cards(i) := 'Ace';
ELSIF i = 2 THEN
cards(i) := 'Two';
ELSIF i = 3 THEN
cards(i) := 'Three';
END IF;
END LOOP;
END;
/
-- Nested Tables as Column Data Types in Tables
Page 562 Oracle DBA Code Examples
CREATE OR REPLACE TYPE address_table
AS TABLE OF VARCHAR2(30 CHAR) NOT NULL;
/
CREATE TABLE addresses
( ..
,street_address ADDRESS_TABLE
...)
NESTED TABLE street_address
STORE AS nested_street_address;
-- any number of elements can be inserted
INSERT INTO addresses
VALUES
( .. ,address_table('Office of Senator McCain'
,'450 West Paseo Redondo','Suite 200'),...);
-- arrange generated output
-- the normal output:
SELECT street_address FROM addresses;
ADDRESS_TABLE('Office of Senator McCain', '450 West Paseo ...
-- to arrange it:
SELECT column_value
FROM THE (SELECT street_address FROM addresses WHERE id = 1);
-- updating a nested-table using pl/sql
CREATE OR REPLACE FUNCTION many_to_one
(street_address_in ADDRESS_TABLE) RETURN VARCHAR2 IS
Define a return variable and initial it.
retval VARCHAR2(4000) := '';
BEGIN
Loop from the beginning to end of the nested table.
FOR i IN 1..street_address_in.COUNT LOOP
Append the next value and a line break.
retval := retval || street_address_in(i) || CHR(10);
END LOOP;
RETURN retval;
END many_to_one;
/
-- You can update a portion of a nested table column directly in SQL:
UPDATE THE (SELECT street_address
FROM addresses
WHERE address_id = 21)
SET column_value = 'Office of Senator John McCain'
WHERE column_value = 'Office of Senator McCain';
Usi ng Associ at i ve Ar r ays
Associat ive arrays cannot be used in t ables. They are t he key t o using t he FORALL
st at ement or BULK COLLECT clause.
CREATE OR REPLACE TYPE type_name
Page 563 Oracle DBA Code Examples
AS TABLE OF element_type [ NOT NULL ] INDEX BY [ PLS_INTEGER | BINARY_INTEGER |
VARCHAR2(size) ]
-- index by integer
DECLARE
-- Define an associative array of strings.
TYPE card_table IS TABLE OF VARCHAR2(5 CHAR) INDEX BY BINARY_INTEGER;
cards CARD_TABLE;
BEGIN
cards(2) := 'test';
cards(10) := 'test';
cards(1) := 'test';
DBMS_OUTPUT.PUT_LINE(cards.first);
DBMS_OUTPUT.PUT_LINE(cards.last);
DBMS_OUTPUT.PUT_LINE(cards.count);
END;
/
-- index by string
..
-- Loop through all the associative array elements.
FOR i IN 1..calendar.COUNT LOOP
-- Check if the first element in the loop.
IF i = 1 THEN
-- Assign the first character index to a variable.
current := calendar.FIRST;
-- Use the derived index to find the next index.
element := calendar(current);
ELSE
-- Check if next index value exists.
IF calendar.NEXT(current) IS NOT NULL THEN
-- Assign the character index to a variable.
current := calendar.NEXT(current);
-- Use the derived index to find the next index.
element := calendar(current);
ELSE
-- Exit loop since last index value is read.
EXIT;
END IF;
END IF;
END LOOP;
..
-- Using Associative Arrays with BULK COLLECT and FORALL
-- BULK COLLECT to retrieve a record set into associative arrays or nested
tables
-- FORALL to send DML statements in batches
-- using FORALL
CREATE TABLE bulk_numbers
(number_id NUMBER
,CONSTRAINT number_id_pk PRIMARY KEY (number_id));
DECLARE
Page 564 Oracle DBA Code Examples
TYPE number_table IS TABLE OF bulk_numbers.number_id%TYPE
INDEX BY BINARY_INTEGER;
number_list NUMBER_TABLE;
BEGIN
FOR i IN 1..10000 LOOP
-- Assign number value.
number_list(i) := i;
END LOOP;
-- Loop through all to do a bulk insert.
FORALL i IN 1..number_list.COUNT
INSERT
INTO bulk_numbers
VALUES (number_list(i));
COMMIT;
END;
/
-- Using a BULK COLLECT
DECLARE
TYPE number_table IS TABLE OF bulk_numbers.number_id%TYPE
INDEX BY BINARY_INTEGER;
number_list NUMBER_TABLE;
BEGIN
-- Check if calendar has no elements.
SELECT number_id
BULK COLLECT
INTO number_list
FROM bulk_numbers
ORDER BY 1;
FOR i IN number_list.FIRST..number_list.LAST LOOP
-- print only the first and last two
IF i <= 2 OR i >= 9999 THEN
DBMS_OUTPUT.PUT_LINE('Number ['||number_list(i)||']');
END IF;
END LOOP;
END;
/
Usi ng Col l ect i on API
API Fu n ct i on
or Pr ocedu r e
Not es Ret u r n Ty pe
COUNT
PLS_I NTEGER
DELETE(n)
NONE
DELETE(n,m)
n= minimum m= maximum NONE
EXISTS(n)
TRUE or FALSE
EXTEND
not in Associat ive Tables NONE
EXTEND(n)
n = number of element s t o add NONE
Page 565 Oracle DBA Code Examples
EXTEND(n,i)
i= number of replicat ed element s NONE
FIRST
t he lowest
subscript
I NTEGER or VARCHAR2
LAST
t he highest
subscript
I NTEGER or VARCHAR2
LIMIT
I NTEGER
NEXT(n)
I f t here is no next element , it will ret urn null.
I NTEGER or VARCHAR2
PRIOR(n)
I f t here is no previous element , it will ret urn
null.
I NTEGER or VARCHAR2
TRIM
removes t he highest
subscript ed value from a collect ion
NONE
TRIM(n)
removes t he
number or element s passed
NONE
Er r or s r et ur ned by Col l ect i ons:
COLLECTION_IS_NULL An attempt to use a null collection.
NO_DATA_FOUND An attempt to use a subscript that has
been deleted or is a nonexistent
unique string index value in an
associative array.
SUBSCRIPT_BEYOND_COUNT This error applies only to varrays and
nested tables.
SUBSCRIPT_OUTSIDE_LIMIT
-- using DELETE method
DECLARE
-- Define a nested table type of INTEGER.
TYPE number_table IS TABLE OF INTEGER;
-- Define a variable of the nested table type.
number_list NUMBER_TABLE;
-- Define a local procedure to check and print elements.
PROCEDURE print_list
(list_in NUMBER_TABLE) IS
BEGIN
-- Loop through the possible index values of the list.
FOR i IN list_in.FIRST..list_in.LAST LOOP
-- Check if the subscripted element is there.
IF list_in.EXISTS(i) THEN
-- Print the element.
DBMS_OUTPUT.PUT_LINE('List ['||list_in(i)||']');
END IF;
END LOOP;
END print_list;
BEGIN
-- Check if a subscript element of one does not exists.
IF NOT number_list.EXISTS(1) THEN
-- Construct the collection.
number_list := number_table(1,2,3,4,5);
END IF;
-- Print a title.
DBMS_OUTPUT.PUT_LINE('Nested table before a deletion');
DBMS_OUTPUT.PUT_LINE('------------------------------');
Page 566 Oracle DBA Code Examples
-- Print the list.
print_list(number_list);
-- Delete an element.
number_list.DELETE(2,4);
-- Print a title.
DBMS_OUTPUT.PUT_LINE(CHR(10)||
'Nested table after a deletion');
DBMS_OUTPUT.PUT_LINE('-----------------------------');
-- Print the list.
print_list(number_list);
END;
/
-- using EXTEND
SET SERVEROUTPUT ON SIZE 1000000
DECLARE
-- Define a nested table type of INTEGER.
TYPE number_table IS TABLE OF INTEGER;
-- Define a variable of the nested table type.
number_list NUMBER_TABLE := number_table(1,2);
-- Define a local procedure to check and print elements.
PROCEDURE print_list
(list_in NUMBER_TABLE) IS
BEGIN
-- Loop through the possible index values of the list.
FOR i IN list_in.FIRST..list_in.LAST LOOP
-- Check if the subscripted element is there.
IF list_in.EXISTS(i) THEN
-- Print the element.
DBMS_OUTPUT.PUT_LINE('List ['||list_in(i)||']');
END IF;
END LOOP;
END print_list;
BEGIN
-- Print a title.
DBMS_OUTPUT.PUT_LINE('Nested table before extension');
DBMS_OUTPUT.PUT_LINE('-----------------------------');
-- Print the list.
print_list(number_list);
-- Allocate two null elements.
number_list.EXTEND(2);
-- Allocate three elements and copy element two
number_list.EXTEND(3,2);
-- Print a title.
DBMS_OUTPUT.PUT_LINE(CHR(10)||
'Nested table after extension');
DBMS_OUTPUT.PUT_LINE('----------------------------');
-- Print the list.
print_list(number_list);
END;
/
-- using LIMIT Method (function)
DECLARE
-- Define a varray type of INTEGER.
Page 567 Oracle DBA Code Examples
TYPE number_varray IS VARRAY(5) OF INTEGER;
-- Define a variable of the varray type.
number_list NUMBER_VARRAY := number_varray(1,2,3);
-- Define a local procedure to check and print elements.
PROCEDURE print_list
(list_in NUMBER_VARRAY) IS
BEGIN
-- Loop through the possible index values of the list.
FOR i IN list_in.FIRST..list_in.COUNT LOOP
-- Print the element.
DBMS_OUTPUT.PUT_LINE(
'List Index ['||i||'] '||
'List Value ['||list_in(i)||']');
END LOOP;
END print_list;
BEGIN
-- Print a title.
DBMS_OUTPUT.PUT_LINE('Varray after initialization');
DBMS_OUTPUT.PUT_LINE('---------------------------');
-- Print the list.
print_list(number_list);
-- Extend null element to maximum limit.
number_list.EXTEND(number_list.LIMIT - number_list.LAST);
-- Print a title.
DBMS_OUTPUT.PUT(CHR(10));
DBMS_OUTPUT.PUT_LINE('Varray after extension');
DBMS_OUTPUT.PUT_LINE('----------------------');
-- Print the list.
print_list(number_list);
END;
/
-- using TRIM Method
DECLARE
-- Define a varray type of INTEGER.
TYPE number_varray IS VARRAY(5) OF INTEGER;
-- Define a variable of the varray type.
number_list NUMBER_VARRAY := number_varray(1,2,3,4,5);
-- Define a local procedure to check and print elements.
PROCEDURE print_list
(list_in NUMBER_VARRAY) IS
BEGIN
-- Loop through the possible index values of the list.
FOR i IN list_in.FIRST..list_in.COUNT LOOP
-- Print the element.
DBMS_OUTPUT.PUT_LINE(
'List Index ['||i||'] '||
'List Value ['||list_in(i)||']');
END LOOP;
END print_list;
BEGIN
-- Print a title.
DBMS_OUTPUT.PUT_LINE('Varray after initialization');
DBMS_OUTPUT.PUT_LINE('---------------------------');
-- Print the list.
Page 568 Oracle DBA Code Examples
print_list(number_list);
-- Extend null element to maximum limit.
number_list.TRIM;
-- Print a title.
DBMS_OUTPUT.PUT(CHR(10));
DBMS_OUTPUT.PUT_LINE('Varray after a single element trim');
DBMS_OUTPUT.PUT_LINE('----------------------------------');
-- Print the list.
print_list(number_list);
-- Extend null element to maximum limit.
number_list.TRIM(3);
-- Print a title.
DBMS_OUTPUT.PUT(CHR(10));
DBMS_OUTPUT.PUT_LINE('Varray after a three element trim');
DBMS_OUTPUT.PUT_LINE('---------------------------------');
-- Print the list.
print_list(number_list);
END;
/
Page 569 Oracle DBA Code Examples
Handl i ng Er r or s
Pr edef i ned Except i ons
Oracle Error Equivalent Except ion Descript ion
ORA-0001 DUP_VAL_ON_INDEX
Unique const raint violat ed.
ORA-0051 TIMEOUT_ON_RESOURCE
Time- out occurred while wait ing for resource.
ORA-1001 INVALID_CURSOR
I llegal cursor operat ion.
ORA-1012 NOT_LOGGED_ON
Not connect ed t o Oracle.
ORA-1017 LOGIN_DENIED
I nvalid user name/ password.
ORA-1403 NO_DATA_FOUND
No dat a found.
ORA-1410 SYS_INVALID_ROWID
Conversion t o a universal rowid failed.
ORA-1422 TOO_MANY_ROWS
A SELECT.I NTO st at ement mat ches more t han
one row.
ORA-1476 ZERO_DIVIDE
Division by zero.
ORA-1722 INVALID_NUMBER
Conversion t o a number failed; for example,
' 1A' is not valid.
ORA-1725 USERENV_COMMITSCN_ERROR
1
I ncorrect usage of t he USERENV( 'COMMI TSCN' )
funct ion.
ORA-6500 STORAGE_ERROR
I nt ernal PL/ SQL error raised if PL/ SQL runs out
of memory.
ORA-6501 PROGRAM_ERROR
I nt ernal PL/ SQL error.
ORA-6502 VALUE_ERROR
Truncat ion, arit hmet ic, or conversion error.
ORA-6504 ROWTYPE_MISMATCH
Host cursor variable and PL/ SQL cursor variable
have incompat ible row t ypes.
ORA-6511 CURSOR_ALREADY_OPEN
At t empt t o open a cursor t hat is already open.
ORA-6530 ACCESS_INTO_NULL
At t empt t o assign values t o t he at t ribut es of a
NULL obj ect .
ORA-6531 COLLECTION_IS_NULL
At t empt t o apply collect ion met hods ot her t han
EXI STS t o a NULL PL/ SQL t able or varray.
ORA-6532 SUBSCRIPT_OUTSIDE_LIMIT
Reference t o a nest ed t able or varray index
out side t he declared range ( such as 1).
ORA-6533 SUBSCRIPT_BEYOND_COUNT
Reference t o a nest ed t able or varray index
higher t han t he number of element s in t he
collect ion.
ORA-6548 NO_DATA_NEEDED1
Caller of a pipelined funct ion does not need
more rows.
ORA-6592 CASE_NOT_FOUND2
No mat ching WHEN clause in a CASE st at ement
is found.
ORA-30625 SELF_IS_NULL
At t empt t o call a met hod on a null obj ect
inst ance.
Usi ng User - Def i ned Except i ons
I t is impossible for an except ion handler t o be defined for more t han one except ion
simult aneously; i. e. : WHEN exception1 AND exception2 will raise a compilat ion error.
Examining t he Error St ack: Use SQLCODE and SQLERRM OR:
DBMS_UTI LI TY. FORMAT_ERROR_STACK provides a funct ion FORMAT_ERROR_STACK t hat
ret urns t he same informat ion as SQLERRM, also limit ed t o 2000 byt es.
Page 570 Oracle DBA Code Examples
DECLARE
-- Exception to indicate an error condition
e_DuplicateAuthors EXCEPTION;
-- IDs for three authors
v_Author1 books.author1%TYPE;
v_Author2 books.author2%TYPE;
v_Author3 books.author3%TYPE;
BEGIN
/* Find the IDs for the 3 authors of 'Oracle9i DBA 101' */
SELECT author1, author2, author3
INTO v_Author1, v_Author2, v_Author3
FROM books
WHERE title = 'Oracle9i DBA 101';
/* Ensure that there are no duplicates */
IF (v_Author1 = v_Author2) OR (v_Author1 = v_Author3) OR
(v_Author2 = v_Author3) THEN
RAISE e_DuplicateAuthors;
END IF;
EXCEPTION
WHEN e_DuplicateAuthors THEN
INSERT INTO log_table (info)
VALUES ('Oracle9i DBA 101 has duplicate authors');
WHEN OTHERS THEN
INSERT INTO log_table (code, message, info) VALUES
(NULL, SUBSTR(DBMS_UTILITY.FORMAT_ERROR_STACK, 1, 200),'Oracle error
occurred');
END;
/
/* The EXCEPTION_INIT Pragma */
DECLARE
e_MissingNull EXCEPTION;
PRAGMA EXCEPTION_INIT(e_MissingNull, -1400);
BEGIN
INSERT INTO authors (id) VALUES (NULL);
EXCEPTION
WHEN e_MissingNull then
INSERT INTO log_table (info) VALUES ('ORA-1400 occurred');
END;
/
Usi ng RAI SE_APPLI CATI ON_ERROR
RAISE_APPLICATION_ERROR(error_number, error_message, [keep_errors]);
error_number is a value bet ween 20,000 and 20, 999
The error_message must be fewer t han 512 charact ers
I f keep_errors is TRUE, t he new error is added t o t he list of errors already raised ( if one
exist s). I f it is FALSE, which is t he default , t he new error will replace t he current list of
errors.
..
Page 571 Oracle DBA Code Examples
IF v_AuthorCount = 0 THEN
RAISE_APPLICATION_ERROR(-20001,
'Author1 ' || p_Author1 || ' does not exist');
..
Page 572 Oracle DBA Code Examples
Aut onomou s Tr an sact i on s
Aut onomous t ransact ions are st art ed by a parent , or main, t ransact ion but operat e
independent ly of t he parent for t ransact ion cont rol. I f a commit or rollback is used in t he
aut onomous or main t ransact ion, or if a failure occurs for any reason, it does not impact
t he ot her t ransact ion.
CREATE OR REPLACE PROCEDURE logging_ins (
i_username IN VARCHAR2, i_datetime IN TIMESTAMP)
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO logging (username, datetime)
VALUES (i_username, i_datetime);
commit; -- commit is a must here in Autonomous proc othewise ORA-06519
returned
END;
/
Page 573 Oracle DBA Code Examples
Some St or ed Subpr obr ams Con cept s
Ser i al l y Reusabl e Pack ages
Serially Reusable Packages NonSerially Reusable Packages
Run-time state is kept in shared memory and is
freed after every database call.
Run-time state is kept in process memory and lasts
for the life of the database session.
The maximum memory used is proportional to the
number of concurrent users of the package.
The maximum memory used is proportional to the
number of concurrently logged-on users, which is
typically much higher.
CREATE OR REPLACE PACKAGE TEST_PCK
IS
-- display number of rows passed
PROCEDURE DISPLAY_ROWS(P_N IN NUMBER);
END;
/
CREATE OR REPLACE PACKAGE BODY TEST_PCK
IS
-- this cursor keeps opening in the session life
CURSOR CR IS SELECT CUSTOMER_ID FROM CUSTOMERS ORDER BY CUSTOMER_ID;
PROCEDURE DISPLAY_ROWS(P_N IN NUMBER)
IS
V_ID NUMBER;
I NUMBER := 0;
V_DONE BOOLEAN := FALSE;
BEGIN
IF NOT CR%ISOPEN THEN
OPEN CR;
END IF;
-- display only passed number of rows
WHILE NOT V_DONE LOOP
FETCH CR INTO V_ID;
IF CR%NOTFOUND THEN
CLOSE CR;
V_DONE := TRUE;
ELSE
I := I + 1;
DBMS_OUTPUT.PUT_LINE(V_ID);
IF I >= P_N THEN
V_DONE := TRUE;
END IF;
END IF;
END LOOP;
END DISPLAY_ROWS;
END TEST_PCK;
/
-- if you add PRAGMA SERIALLY_REUSABLE, CR will at reset every call
Page 574 Oracle DBA Code Examples
CREATE OR REPLACE PACKAGE TEST_PCK
IS
PRAGMA SERIALLY_REUSABLE;
..
CREATE OR REPLACE PACKAGE BODY TEST_PCK
IS
PRAGMA SERIALLY_REUSABLE;
..
St or ed Subpr ogr ams and Rol es
I f a st ored subprogram refers t o an obj ect in anot her schema, t hat obj ect should be
grant ed direct ly t o t he subprogram owner, not via a role.
CONN SA/s
CREATE ROLE R1;
GRANT SELECT ON CUSTOMERS TO R1;
GRANT R1 TO USER1;
CONN USER1/U
CREATE OR REPLACE PACKAGE USER1.TEST_PCK
IS
PROCEDURE DISPLAY_ROW;
END;
/
-- the following will not compile because CUSTOMERS granted
-- to USER1 via role (not directly)
CREATE OR REPLACE PACKAGE BODY USER1.TEST_PCK
IS
PROCEDURE DISPLAY_ROW
IS
N NUMBER;
BEGIN
SELECT CUSTOMER_ID INTO N
FROM SA.CUSTOMERS
WHERE CUSTOMER_ID=101;
END DISPLAY_ROW;
END TEST_PCK;
/
I nvok er s vs. Def i ner s Ri ght s
CREATE [OR REPLACE] FUNCTION function_name
[parameter_list] RETURN return_type
[AUTHID {CURRENT_USER | DEFINER}] {IS | AS}
Page 575 Oracle DBA Code Examples
Pi nni ng an Pr ogr amuni t i n t he Shar ed Pool
To pin an obj ect :
DBMS_SHARED_POOL.KEEP(name VARCHAR2, flag CHAR DEFAULT 'P')
flag Determines the type of the object:
P Package, function, or procedure
Q Sequence
R Trigger
T Object type (Oracle8 and higher)
JS Java source (Oracle8i and higher)
JC Java class (Oracle8i and higher)
JR Java resource (Oracle8i and higher)
JD Java shared data (Oracle8i and higher)
C SQL cursor
To echo t he cont ent s of t he shared pool of obj ect s great er t han minisize t o t he screen:
DBMS_SHARED_POOL.SIZES(minsize NUMBER)
Page 576 Oracle DBA Code Examples
Usi ng Tr i gger s
General Synt ax of creat ing any t rigger:
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER | INSTEAD OF} triggering_event
[referencing_clause]
[WHEN trigger_condition]
[FOR EACH ROW]
trigger_body
Rest r i ct i ons on Tr i gger s
A t rigger may not issue any t ransact ion cont rol st at ement sCOMMI T, ROLLBACK,
SAVEPOI NT, or SET TRANSACTI ON.
The t rigger body cannot declare any LONG or LONG RAW variables.
Code in a t rigger body may reference and use LOB ( Large OBj ect ) columns, but it may not
modify t he values of t he columns. This is also t rue for obj ect columns.
Usi ng DML Tr i gger s
CREATE OR REPLACE TRIGGER UpdateCategoryStats
AFTER INSERT OR DELETE OR UPDATE ON books
DECLARE
CURSOR c_Statistics IS
SELECT category,
COUNT(*) total_books,
AVG(price) average_price
FROM books
GROUP BY category;
BEGIN
DELETE FROM category_stats;
FOR v_StatsRecord in c_Statistics LOOP
INSERT INTO category_stats (category, total_books, average_price)
VALUES (v_StatsRecord.category, v_StatsRecord.total_books,
v_StatsRecord.average_price);
END LOOP;
END UpdateCategoryStats;
/
CREATE OR REPLACE TRIGGER GenerateAuthorID
BEFORE INSERT OR UPDATE ON authors
REFERENCING new AS new_author
FOR EACH ROW
BEGIN
/* Fill in the ID field of authors with the next value from
author_sequence. Since ID is a column in authors, :new.ID
is a valid reference. */
SELECT author_sequence.NEXTVAL
INTO :new_author.ID
Page 577 Oracle DBA Code Examples
FROM dual;
END GenerateAuthorID;
/
-- using WHEN keyword
CREATE OR REPLACE TRIGGER CheckPrice
BEFORE INSERT OR UPDATE OF price ON books
FOR EACH ROW
WHEN (new.price > 49.99)
BEGIN
..
END;
/
-- using Trigger Predicates
CREATE OR REPLACE TRIGGER LogInventoryChanges
BEFORE INSERT OR DELETE OR UPDATE ON inventory
FOR EACH ROW
DECLARE
v_ChangeType CHAR(1);
BEGIN
/* Use 'I' for an INSERT, 'D' for DELETE, and 'U' for UPDATE. */
IF INSERTING THEN
v_ChangeType := 'I';
ELSIF UPDATING THEN
v_ChangeType := 'U';
ELSE
v_ChangeType := 'D';
END IF;
..
END LogInventoryChanges;
/
Usi ng I nst ead- of Tr i gger s
All inst ead- of t riggers are row level, whet her or not t he FOR EACH ROW clause is present .
CREATE OR REPLACE TRIGGER InsertBooksAuthors
INSTEAD OF INSERT ON books_authors
DECLARE
v_Book books%ROWTYPE;
v_AuthorID authors.id%TYPE;
BEGIN
-- Figure out the ID of the new author
BEGIN
SELECT id
INTO v_AuthorID
FROM authors
WHERE first_name = :new.first_name
AND last_name = :new.last_name;
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- No author found, create a new one
INSERT INTO authors (id, first_name, last_name)
Page 578 Oracle DBA Code Examples
VALUES (author_sequence.NEXTVAL, :new.first_name, :new.last_name)
RETURNING ID INTO v_AuthorID;
END;
SELECT *
INTO v_Book
FROM books
WHERE isbn = :new.isbn;
-- Figure out whether the book already has 1 or 2 authors, and update
-- accordingly
IF v_Book.author2 IS NULL THEN
UPDATE books
SET author2 = v_AuthorID
WHERE isbn = :new.isbn;
ELSE
UPDATE books
SET author3 = v_AuthorID
WHERE isbn = :new.isbn;
END IF;
END InsertBooksAuthors;
/
Usi ng Syst em Tr i gger s
Syst em t rigger fires on t wo different kinds of event s: DDL or dat abase.
Because syst em t riggers are generally commit t ed anyway, declaring t hem as aut onomous
will not have any effect .
Required privilege on dat abase t riggers: ADMI NI STER DATABASE TRI GGER
CREATE [OR REPLACE] TRIGGER [schema.]trigger_name
{BEFORE | AFTER}
{ddl_event_list | database_event_list}
ON {DATABASE | [schema.]SCHEMA}
[when_clause]
trigger_body;
Dat abase Event s:
Even t Wh en Tr i gger Fi r es Con di t i on s Rest r i ct i on s Tr an sact i on
At t r i bu t e
Fu n ct i on s
STARTUP
When t he dat abase is
opened.
None
allowed
No dat abase
operat ions
allowed in t he
t rigger.
Ret urn st at us
ignored.
St art s a
separat e
t ransact i on
and commit s it
af t er f iring t he
t riggers.
ora_sysevent
ora_login_user
ora_inst ance_num
ora_dat abase_name
SHUTDOWN
Just bef ore t he server
st art s t he shut down of
an inst ance.
This let s t he car t ridge
shut down complet ely.
For abnormal inst ance
shut down, t hi s t riiger
None
allowed
No dat abase
operat ions
allowed in t he
t rigger.
Ret urn st at us
ignored.
St art s a
separat e
t ransact i on
and commit s it
af t er f iring t he
t riggers.
ora_sysevent
ora_login_user
ora_inst ance_num
ora_dat abase_name
Page 579 Oracle DBA Code Examples
Even t Wh en Tr i gger Fi r es Con di t i on s Rest r i ct i on s Tr an sact i on
At t r i bu t e
Fu n ct i on s
might not f ire.
DB_ROLE_CH
ANGE
When t he dat abase is
opened f or t he f irst t ime
af t er a role change.
None
allowed
Ret urn st at us
ignored.
St art s a
separat e
t ransact i on
and commit s it
af t er f iring t he
t riggers.
ora_sysevent
ora_login_user
ora_inst ance_num
ora_dat abase_name
SERVERERRO
R
When t he error eno
occur s. I f no condit ion is
given, t hen t his t rigger
f ires whenever an error
occur s.
The t rigger does not f ire
on ORA- 1034, ORA-
1403, ORA- 1422, ORA-
1423, and ORA- 4030
because t hey are not
t rue errors or are t oo
serious t o cont inue
processing. I t also f ails
t o f ire on ORA- 18 and
ORA- 20 because a
process is not available
t o connect t o t he
dat abase t o record t he
error.
ERRNO =
eno
Depends on
t he error.
Ret urn st at us
ignored.
St art s a
separat e
t ransact i on
and commit s it
af t er f iring t he
t riggers.
ora_sysevent
ora_login_user
ora_inst ance_num
ora_dat abase_name
ora_server_err or
ora_is_servererror
space_error_inf o
Schema or Client Event s:
Ev ent When Tr i gger Fi r es At t r i but e Funct i ons
BEFORE ALTER
AFTER ALTER
When a cat alog obj ect is alt ered. ora_sysevent
ora_login_user
ora_inst ance_num
ora_dat abase_name
ora_dict _obj _t ype
ora_dict _obj _name
ora_dict _obj _owner
ora_des_encrypt ed_password
( for ALTER USER event s)
ora_is_alt er_column
( for ALTER TABLE event s)
ora_is_drop_column
( for ALTER TABLE event s)
BEFORE DROP
AFTER DROP
When a cat alog obj ect is dropped. ora_sysevent
ora_login_user
ora_inst ance_num
ora_dat abase_name
ora_dict _obj _t ype
ora_dict _obj _name
ora_dict _obj _owner
BEFORE ANALYZE
AFTER ANALYZE
When an analyze st at ement is issued ora_sysevent
ora_login_user
ora_inst ance_num
ora_dat abase_name
Page 580 Oracle DBA Code Examples
Ev ent When Tr i gger Fi r es At t r i but e Funct i ons
ora_dict _obj _name
ora_dict _obj _t ype
ora_dict _obj _owner
BEFORE
ASSOCIATE
STATISTICS
AFTER
ASSOCIATE
STATISTICS
When an associat e st at ist ics st at ement is
issued
ora_sysevent
ora_login_user
ora_inst ance_num
ora_dat abase_name
ora_dict _obj _name
ora_dict _obj _t ype
ora_dict _obj _owner
ora_dict _obj _name_list
ora_dict _obj _owner_list
BEFORE AUDIT
AFTER AUDIT
BEFORE NOAUDIT
AFTER NOAUDIT
When an audit or noaudit st at ement is
issued
ora_sysevent
ora_login_user
ora_inst ance_num
ora_dat abase_name
BEFORE COMMENT
AFTER COMMENT
When an obj ect is comment ed ora_sysevent
ora_login_user
ora_inst ance_num
ora_dat abase_name
ora_dict _obj _name
ora_dict _obj _t ype
ora_dict _obj _owner
BEFORE CREATE
AFTER CREATE
When a cat alog obj ect is creat ed. ora_sysevent
ora_login_user
ora_inst ance_num
ora_dat abase_name
ora_dict _obj _t ype
ora_dict _obj _name
ora_dict _obj _owner
ora_is_creat ing_nest ed_t able
( for CREATE TABLE event s)
BEFORE DDL
AFTER DDL
When most SQL DDL st at ement s are issued.
Not fired for ALTER DATABASE, CREATE
CONTROLFI LE, CREATE DATABASE, and DDL
issued t hrough t he PL/ SQL subprogram
int erface, such as creat ing an advanced
queue.
ora_sysevent
ora_login_user
ora_inst ance_num
ora_dat abase_name
ora_dict _obj _name
ora_dict _obj _t ype
ora_dict _obj _owner
BEFORE
DISASSOCIATE
STATISTICS
AFTER
DISASSOCIATE
STATISTICS
When a disassociat e st at ist ics st at ement is
issued
ora_sysevent
ora_login_user
ora_inst ance_num
ora_dat abase_name
ora_dict _obj _name
ora_dict _obj _t ype
ora_dict _obj _owner
ora_dict _obj _name_list
ora_dict _obj _owner_list
BEFORE GRANT
AFTER GRANT
When a grant st at ement is issued ora_sysevent
ora_login_user
ora_inst ance_num
ora_dat abase_name
Page 581 Oracle DBA Code Examples
Ev ent When Tr i gger Fi r es At t r i but e Funct i ons
ora_dict _obj _name
ora_dict _obj _t ype
ora_dict _obj _owner
ora_grant ee
ora_wit h_grant _opt ion
ora_privileges
BEFORE LOGOFF
At t he st art of a user logoff ora_sysevent
ora_login_user
ora_inst ance_num
ora_dat abase_name
AFTER LOGON
Aft er a successful logon of a user. ora_sysevent
ora_login_user
ora_inst ance_num
ora_dat abase_name
ora_client _ip_address
BEFORE RENAME
AFTER RENAME
When a rename st at ement is issued. ora_sysevent
ora_login_user
ora_inst ance_num
ora_dat abase_name
ora_dict _obj _name
ora_dict _obj _owner
ora_dict _obj _t ype
BEFORE REVOKE
AFTER REVOKE
When a revoke st at ement is issued ora_sysevent
ora_login_user
ora_inst ance_num
ora_dat abase_name
ora_dict _obj _name
ora_dict _obj _t ype
ora_dict _obj _owner
ora_revokee
ora_privileges
AFTER SUSPEND
Aft er a SQL st at ement is suspended because
of an out - of-space condit ion. The t rigger
must correct t he condit ion so t he st at ement
can be resumed.
ora_sysevent
ora_login_user
ora_inst ance_num
ora_dat abase_name
ora_server_error
ora_is_servererror
space_error_info
BEFORE
TRUNCATE
AFTER TRUNCATE
When an obj ect is t runcat ed ora_sysevent
ora_login_user
ora_inst ance_num
ora_dat abase_name
ora_dict _obj _name
ora_dict _obj _t ype
ora_dict _obj _owner
CREATE OR REPLACE TRIGGER LogCreations
AFTER CREATE ON SCHEMA
BEGIN
INSERT INTO ddl_creations (user_id, object_type, object_name,
object_owner, creation_date)
VALUES (USER, ORA_DICT_OBJ_TYPE, ORA_DICT_OBJ_NAME,
Page 582 Oracle DBA Code Examples
ORA_DICT_OBJ_OWNER, SYSDATE);
END LogCreations;
Handl i ng Mut at i ng Tabl es i n Tr i gger s
SQL st at ement s in a t rigger body may not :
o Read from or modify any mut at ing t able of t he t riggering st at ement . This includes t he
t riggering t able it self.
o Read from or modify t he primary- , unique- , or foreign- key columns of a const raining
t able of t he t riggering t able. They may, however, modify t he ot her columns if desired.
o These rest rict ions apply t o all row- level t riggers. They apply for st at ement t riggers
only when t he st at ement t rigger would be fired as a result of a DELETE CASCADE
operat ion.
I f an I NSERT st at ement affect s only one row, t he before- and aft er- row t riggers for t hat
row do not t reat t he t riggering t able as mut at ing. This is t he only case where a row- level
t rigger may read from or modify t he t riggering t able. St at ement s such as I NSERT I NTO
t able SELECT . . . always t reat t he t riggering t able as mut at ing, even if t he subquery
ret urns only one row.
-- the following trigger will return ORA-4091
CREATE OR REPLACE TRIGGER LimitMajors
BEFORE INSERT OR UPDATE OF major ON students
FOR EACH ROW
DECLARE
v_MaxStudents CONSTANT NUMBER := 5;
v_CurrentStudents NUMBER;
BEGIN
SELECT COUNT(*)
INTO v_CurrentStudents
FROM students
WHERE major = :new.major;
-- If there isn't room, raise an error.
IF v_CurrentStudents + 1 > v_MaxStudents THEN
RAISE_APPLICATION_ERROR(-20000,
'Too many students in major ' || :new.major);
END IF;
END LimitMajors;
/
To workaround: create two triggers: one statement level and the other row
level. The statement trigger store the SELECT result into a PL/SQL table in a
package. The row-level trigger will read that data from the package.
CREATE OR REPLACE PACKAGE StudentData AS
TYPE t_Majors IS TABLE OF students.major%TYPE INDEX BY BINARY_INTEGER;
TYPE t_IDs IS TABLE OF students.ID%TYPE INDEX BY BINARY_INTEGER;
v_StudentMajors t_Majors;
v_StudentIDs t_IDs;
v_NumEntries BINARY_INTEGER := 0;
END StudentData;
/
Page 583 Oracle DBA Code Examples
CREATE OR REPLACE TRIGGER RLimitMajors
BEFORE INSERT OR UPDATE OF major ON students
FOR EACH ROW
BEGIN
StudentData.v_NumEntries := StudentData.v_NumEntries + 1;
StudentData.v_StudentMajors(StudentData.v_NumEntries) := :new.major;
StudentData.v_StudentIDs(StudentData.v_NumEntries) := :new.id;
END RLimitMajors;
/
CREATE OR REPLACE TRIGGER SLimitMajors
AFTER INSERT OR UPDATE OF major ON students
DECLARE
v_MaxStudents CONSTANT NUMBER := 2;
v_CurrentStudents NUMBER;
v_StudentID students.ID%TYPE;
v_Major students.major%TYPE;
BEGIN
/* Loop through each student inserted or updated, and verify
that we are still within the limit. */
FOR v_LoopIndex IN 1..StudentData.v_NumEntries LOOP
v_StudentID := StudentData.v_StudentIDs(v_LoopIndex);
v_Major := StudentData.v_StudentMajors(v_LoopIndex);
-- Determine the current number of students in this major.
SELECT COUNT(*)
INTO v_CurrentStudents
FROM students
WHERE major = v_Major;
-- If there isn't room, raise an error.
IF v_CurrentStudents > v_MaxStudents THEN
RAISE_APPLICATION_ERROR(-20000,
'Too many students for major ' || v_Major ||
' because of student ' || v_StudentID);
END IF;
END LOOP;
-- Reset the counter so the next execution will use new data.
StudentData.v_NumEntries := 0;
END SLimitMajors;
Dr oppi ng and Di sabl i ng Tr i gger s
DROP TRIGGER <triggername>;
ALTER TRIGGER triggername {DISABLE | ENABLE};
ALTER TABLE authors {DISABLE | ENABLE} ALL TRIGGERS;
Page 584 Oracle DBA Code Examples
Usi ng Dy nami c SQL
Wor k i ng w i t h Nat i ve Dynami c SQL
Using Dynamic SQL
Working with Native Dynamic SQL
-- DDL
statement := 'CREATE SEQUENCE '||sequence_name||CHR(10)
|| ' INCREMENT BY 1' ||CHR(10)
|| ' START WITH 1' ||CHR(10)
|| ' CACHE 20' ||CHR(10)
|| ' ORDER';
-- encapsulates a PL/SQL block SELECT-INTO.
PROCEDURE increment_sequence
( sequence_name IN VARCHAR2,
sequence_value IN OUT NUMBER ) IS
-- Define local native dynamic SQL variables.
statement VARCHAR2(2000);
BEGIN
-- Build dynamic SQL statement as anonymous block PL/SQL unit.
statement := 'BEGIN' ||CHR(10)
|| ' SELECT hr.'||sequence_name||'.nextval'||CHR(10)
|| ' INTO :retval' ||CHR(10)
|| ' FROM DUAL;' ||CHR(10)
|| 'END;';
-- Execute dynamic SQL statement.
EXECUTE IMMEDIATE statement
USING OUT sequence_value;
END increment_sequence;
-- DML without bind variables.
PROCEDURE insert_into_table
( table_name IN VARCHAR2
, table_column_value1 IN NUMBER
, table_column_value2 IN VARCHAR2
, table_column_value3 IN VARCHAR2) IS
-- Define local variables.
statement VARCHAR2(2000);
BEGIN
-- Build dynamic SQL statement.
statement := 'INSERT '
|| 'INTO '||table_name||' '
|| 'VALUES ('
|| ''''||table_column_value1||''','
|| ''''||table_column_value2||''','
|| ''''||table_column_value3||''')';
Page 585 Oracle DBA Code Examples
-- Execute the NDS statement.
EXECUTE IMMEDIATE statement;
-- Commit the records.
commit;
END insert_into_table;
-- a DML with ordered bind variables.
PROCEDURE inserts_into_table
( table_name IN VARCHAR2
, table_column_value1 IN NUMBER
, table_column_value2 IN VARCHAR2
, table_column_value3 IN VARCHAR2) IS
-- Define local variables.
statement VARCHAR2(2000);
BEGIN
-- Build dynamic SQL statement.
statement := 'INSERT '
|| 'INTO '||table_name||' '
|| 'VALUES (:col_one, :col_two, :col_three)';
-- Execute the NDS statement.
EXECUTE IMMEDIATE statement
USING table_column_value1
, table_column_value2
, table_column_value3;
-- Commit the records.
commit;
END inserts_into_table;
-- select single row , single col (DQL)
PROCEDURE single_row_return IS
-- Define local variables.
statement VARCHAR2(2000);
value_out VARCHAR2(1);
BEGIN
-- Build dynamic SQL statement.
statement := 'SELECT ''A'' FROM DUAL';
-- Use NDS to query a static string.
EXECUTE IMMEDIATE statement
INTO value_out;
END single_row_return;
-- select single row, mutiple col (DQL)
PROCEDURE single_row_return
( table_name VARCHAR2
, column_name1 VARCHAR2
, column_name2 VARCHAR2
, column_name3 VARCHAR2 ) IS
-- Define local variables.
Page 586 Oracle DBA Code Examples
statement VARCHAR2(2000);
cvalue_out1 VARCHAR2(20);
cvalue_out2 VARCHAR2(30);
nvalue_out NUMBER;
BEGIN
-- Build dynamic SQL statement.
statement := 'SELECT '
|| column_name1 ||','
|| column_name2 ||','
|| column_name3 ||' '
|| 'FROM '|| table_name;
EXECUTE IMMEDIATE statement
INTO nvalue_out, cvalue_out1, cvalue_out2;
END single_row_return;
-- SELECT multiple row of single col (DQL)
-- Create a Varray of a one character string.
CREATE OR REPLACE TYPE varchar2_table1 IS
VARRAY(100) OF VARCHAR2(1);
/
PROCEDURE multiple_row_return IS
-- Define local variables.
statement VARCHAR2(2000);
value_out VARCHAR2_TABLE1;
BEGIN
-- using an anonymous block is mandatory, otherwise ORA-03001
statement := 'BEGIN '
|| 'SELECT ''A'' '
|| 'BULK COLLECT INTO :col_val '
|| 'FROM DUAL;'
|| 'END;';
-- Use Bulk NDS to query a static string.
EXECUTE IMMEDIATE statement
USING OUT value_out;
-- Use a range loop to read the values.
FOR i IN 1..value_out.COUNT LOOP
-- Print output message.
dbms_output.put_line(value_out(i));
END LOOP;
END multiple_row_return;
-- multiple row with columns (DQL)
-- NDS can use bulk collections only from within an anonymous-block
CREATE OR REPLACE TYPE card_number_varray IS VARRAY(100) OF NUMBER;
CREATE OR REPLACE TYPE card_name_varray IS VARRAY(100) OF VARCHAR2(2000);
CREATE OR REPLACE TYPE card_suit_varray IS VARRAY(100) OF VARCHAR2(2000);
PROCEDURE multiple_row_return
( table_name VARCHAR2
Page 587 Oracle DBA Code Examples
, column_name1 VARCHAR2
, column_name2 VARCHAR2
, column_name3 VARCHAR2 ) IS
-- Define local Native Dynamic SQL variables.
statement VARCHAR2(2000);
cvalue_out1 CARD_NAME_VARRAY;
cvalue_out2 CARD_SUIT_VARRAY;
nvalue_out CARD_NUMBER_VARRAY;
BEGIN
statement := 'BEGIN '
|| 'SELECT '
|| column_name1 ||','
|| column_name2 ||','
|| column_name3 ||' '
|| 'BULK COLLECT INTO :col1, :col2, :col3 '
|| 'FROM '|| table_name ||';'
|| 'END;';
-- Execute native dynamic SQL.
EXECUTE IMMEDIATE statement
USING OUT nvalue_out, OUT cvalue_out1, OUT cvalue_out2;
FOR i IN 1..nvalue_out.COUNT LOOP
dbms_output.put_line('Value from ['||column_name1||'] '|| 'is:
['||nvalue_out(i)||']');
dbms_output.put_line('Value from ['||column_name1||'] '|| 'is:
['||SUBSTR(cvalue_out1(i),1,20)||']');
dbms_output.put_line('Value from ['||column_name1||'] '|| 'is:
['||SUBSTR(cvalue_out2(i),1,30)||']');
END LOOP;
END multiple_row_return;
Usi ng DBMS_SQL
DBMS_SQL st ill has a maj or feat ure t hat is not delivered in NDS. I t does not need t o know
beforehand t he number and t ypes of argument s it will receive and process.
To use dbms_sql:
GRANT EXECUTE ON dbms_sys_sql TO SYSTEM WITH GRANT OPTION;
GRANT EXECUTE ON dbms_sql TO SYSTEM WITH GRANT OPTION;
-- Working with DDL and DML Without Bind Variables
-- Procedure to close DBMS_SQL open cursor.
PROCEDURE close_open_cursor ( c IN OUT INTEGER) IS
BEGIN
IF dbms_sql.is_open(c) THEN
dbms_sql.close_cursor(c);
END IF;
END close_open_cursor;
PROCEDURE create_sequence
( sequence_name IN VARCHAR2) IS
c INTEGER := dbms_sql.open_cursor;
fdbk INTEGER;
statement VARCHAR2(2000);
BEGIN
Page 588 Oracle DBA Code Examples
-- Build dynamic SQL statement.
statement := 'CREATE SEQUENCE '||sequence_name||CHR(10)
|| ' INCREMENT BY 1' ||CHR(10)
|| ' START WITH 1' ||CHR(10)
|| ' CACHE 20' ||CHR(10)
|| ' ORDER';
-- Parse and execute the statement.
dbms_sql.parse(c,statement,dbms_sql.native);
fdbk := dbms_sql.execute(c);
-- Close the open cursor.
dbms_sql.close_cursor(c);
END create_sequence;
-- encapsulates a PL/SQL block SELECT-INTO.
PROCEDURE increment_sequence
( sequence_name IN VARCHAR2
, sequence_value IN OUT NUMBER ) IS
-- Define local DBMS_SQL variables.
c INTEGER := dbms_sql.open_cursor;
fdbk INTEGER;
statement VARCHAR2(2000);
BEGIN
/*
|| Debugging Tip:
|| =============
|| When you are using a SELECT-INTO-FROM within DBMS_SQL, which is a
|| reserved PLSQL syntax not directly supported by DBMS_SQL. You
|| need to encapsulate it in a PLSQL wrapper. When you use a PLSQL
|| wrapper, the semicolons must be used in the statement and the
|| PLSQL block because DBMS_SQL adds a single semicolon to execute
|| the PLSQL block. If you forget to encapsulate the SQL in a
|| PLSQL wrapper, you will raise the following error message.
|| -------------------------------------------------------------------
|| ORA-01006: bind variable does not exist
*/
-- Build dynamic SQL statement as anonymous block PL/SQL unit.
statement := 'BEGIN'||CHR(10)
|| ' SELECT PLSQL.'||sequence_name||'.nextval'||CHR(10)
|| ' INTO :retval'||CHR(10)
|| ' FROM DUAL;'||CHR(10)
|| 'END;';
-- Parse the statement.
dbms_sql.parse(c,statement,dbms_sql.native);
/*
|| Technical Note:
|| ==============
|| The BIND_VARIABLE procedure is returning a NUMBER
|| and does not require parameter four.
*/
Page 589 Oracle DBA Code Examples
-- Bind variable retval to an output sequence value.
dbms_sql.bind_variable(c,'retval',sequence_value);
-- Execute the dynamic cursor.
fdbk := dbms_sql.execute(c);
-- Copy the variable value from the bind variable.
dbms_sql.variable_value(c,'retval',sequence_value);
dbms_sql.close_cursor(c);
dbms_output.put('Sequence <'||sequence_name||'> ');
dbms_output.put_line('Value <'||sequence_value||'>');
END increment_sequence;
-- a DML with ordered bind variables
PROCEDURE insert_into_table
( table_name IN VARCHAR2
, table_column_value1 IN NUMBER
, table_column_value2 IN VARCHAR2
, table_column_value3 IN VARCHAR2) IS
-- Define local DBMS_SQL variables.
c INTEGER := dbms_sql.open_cursor;
fdbk INTEGER;
statement VARCHAR2(2000);
BEGIN
/*
|| Debugging Tip:
|| =============
|| Statement strings are terminated by a line return CHR(10) to
|| ensure that a space is not missing between concatenated segments.
|| Using a BIND variable provides efficiencies in SQL statements
|| because it avoids the reparsing of the statement. Therefore,
|| they should be used as follows for performance gains:
||
|| SQL STATEMENTS PREDICATES
|| -------------- ----------
|| SELECT WHERE
|| UPDATE SET
|| WHERE
|| DELETE WHERE
||
|| Error Explanations:
|| ------------------
|| 1. An explicit size is always required for a VARCHAR2 variable
|| and the overloaded procedure has an output size variable in the
|| fourth position that you may need to use. The output length is
|| provided below to demonstrate it.
|| 2. A bad bind variable message typically means the identifier is
|| outside of the VARCHAR2 string and treated as a session level
|| undefined bind variable.
|| 3. A "missing SELECT keyword" can occur on an insert statement
|| if you put bind variables into the INTO clause for column
Page 590 Oracle DBA Code Examples
|| names.
|| 4. If you have quote marks around VARCHAR2 bind variables, you
|| may raise the "bind variable does not exist" error. If you
|| need to use that syntax, you can encapsulate the DML in a
|| PLSQL wrapper.
|| -------------------------------------------------------------------
|| 1. ORA-06502: PL/SQL: numeric or value error
|| 2. PLS-00049: bad bind variable
|| 3. ORA-00928: missing SELECT keyword
|| 4. ORA-01006: bind variable does not exist
*/
-- Build dynamic SQL statement.
statement := 'INSERT '
|| 'INTO '||table_name||' '
|| 'VALUES '
|| '( :table_column_value1'
|| ', :table_column_value2'
|| ', :table_column_value3)';
-- Parse the statement.
dbms_sql.parse(c,statement,dbms_sql.native);
-- Bind each bind variable.
dbms_sql.bind_variable(c,'table_column_value1',table_column_value1);
dbms_sql.bind_variable(c,'table_column_value2',table_column_value2);
dbms_sql.bind_variable(c,'table_column_value3',table_column_value3);
fdbk := dbms_sql.execute(c);
dbms_sql.close_cursor(c);
commit;
dbms_output.put_line('Value inserted <'||table_column_value1||'>');
dbms_output.put_line('Value inserted <'||table_column_value2||'>');
dbms_output.put_line('Value inserted <'||table_column_value3||'>');
END insert_into_table;
-- a DML with ordered bind variables.
PROCEDURE inserts_into_table
( table_name IN VARCHAR2
, table_column_values1 IN DBMS_SQL.NUMBER_TABLE
, table_column_values2 IN DBMS_SQL.VARCHAR2_TABLE
, table_column_values3 IN DBMS_SQL.VARCHAR2_TABLE) IS
-- Define local DBMS_SQL variables.
c INTEGER := dbms_sql.open_cursor;
fdbk INTEGER;
statement VARCHAR2(2000);
BEGIN
-- Build dynamic SQL statement.
statement := 'INSERT '
|| 'INTO '||table_name||' '
|| '( card_number '
|| ', card_name '
Page 591 Oracle DBA Code Examples
|| ', card_suit)'
|| 'VALUES '
|| '( :card_number'
|| ', :card_name'
|| ', :card_suit)';
-- Parse the statement.
dbms_sql.parse(c,statement,dbms_sql.native);
-- Bind each bind variable.
dbms_sql.bind_array(c,'card_number',table_column_values1);
dbms_sql.bind_array(c,'card_name',table_column_values2);
dbms_sql.bind_array(c,'card_suit',table_column_values3);
fdbk := dbms_sql.execute(c);
dbms_sql.close_cursor(c);
commit;
-- Use a for-loop to print values.
FOR i IN 1..table_column_values1.COUNT LOOP
dbms_output.put_line(
'Value inserted <'||table_column_values1(i)||'>');
dbms_output.put_line(
'Value inserted <'||table_column_values2(i)||'>');
dbms_output.put_line(
'Value inserted <'||table_column_values3(i)||'>');
END LOOP;
END inserts_into_table;
-- multiple row DQL
PROCEDURE multiple_row_return IS
-- Define local DBMS_SQL variables.
c INTEGER := dbms_sql.open_cursor;
fdbk INTEGER;
statement VARCHAR2(2000);
value_out VARCHAR2(1);
BEGIN
statement := 'SELECT ''A'' FROM DUAL';
dbms_sql.parse(c,statement,dbms_sql.native);
-- Define the column mapping to the value_out variable.
dbms_sql.define_column(c,1,value_out,1);
fdbk := dbms_sql.execute(c);
LOOP
-- Exit when no more rows to fetch.
EXIT WHEN dbms_sql.fetch_rows(c) = 0;
-- Copy the contents of column #1 to the value_out variable.
dbms_sql.column_value(c,1,value_out);
dbms_output.put_line('Value from COLUMN_VALUE <'||value_out||'>');
END LOOP;
-- Close the open cursor.
dbms_sql.close_cursor(c);
Page 592 Oracle DBA Code Examples
END multiple_row_return;
-- multiple row with columns DQL.
PROCEDURE multiple_row_return
( table_name VARCHAR2
, column_name1 VARCHAR2
, column_name2 VARCHAR2
, column_name3 VARCHAR2 )IS
-- Define local DBMS_SQL variables.
c INTEGER := dbms_sql.open_cursor;
fdbk INTEGER;
statement VARCHAR2(2000);
cvalue_out1 VARCHAR2(2000);
cvalue_out2 VARCHAR2(2000);
nvalue_out NUMBER;
BEGIN
-- Build dynamic SQL statement.
statement := 'SELECT '
|| column_name1 ||','
|| column_name2 ||','
|| column_name3 ||' '
|| 'FROM '|| table_name;
-- Parse dynamic SQL statement.
dbms_sql.parse(c,statement,dbms_sql.native);
/*
|| Debugging Tip:
|| =============
|| Define the column values and DO NOT forget to assign a size
|| parameter for a string datatype, like VARCHAR2; however, if you
|| forget, the error message is:
|| -------------------------------------------------------------------
|| PLS-00307: too many declarations of 'DEFINE_COLUMN' match this call
*/
-- Define the column mapping to the value_out variable.
dbms_sql.define_column(c,1,nvalue_out);
dbms_sql.define_column(c,2,cvalue_out1,2000);
dbms_sql.define_column(c,3,cvalue_out2,2000);
-- Execute dynamic SQL statement.
fdbk := dbms_sql.execute(c);
-- Use a loop to read all rows.
LOOP
-- Exit when no more rows to fetch.
EXIT WHEN dbms_sql.fetch_rows(c) = 0;
-- Copy the contents of column #1 to the value_out variable.
dbms_sql.column_value(c,1,nvalue_out);
dbms_sql.column_value(c,2,cvalue_out1);
dbms_sql.column_value(c,3,cvalue_out2);
Page 593 Oracle DBA Code Examples
dbms_output.put_line(
'Value from ['||column_name1||'] '||
'is: ['||nvalue_out||']');
dbms_output.put_line(
'Value from ['||column_name1||'] '||
'is: ['||SUBSTR(cvalue_out1,1,5)||']');
dbms_output.put_line(
'Value from ['||column_name1||'] '||
'is: ['||SUBSTR(cvalue_out2,1,8)||']');
END LOOP;
dbms_sql.close_cursor(c);
END multiple_row_return;
-- single row DQL.
/*
|| Demonstrate a single row return using the DEFINE_COLUMN and COLUMN_VALUE
|| program unit, as you would in an explicit cursor.
*/
PROCEDURE single_row_return IS
-- Define local DBMS_SQL variables.
c INTEGER := dbms_sql.open_cursor;
fdbk INTEGER;
statement VARCHAR2(2000);
value_out VARCHAR2(1);
BEGIN
-- Build dynamic SQL statement.
statement := 'SELECT ''A'' FROM DUAL';
-- Parse the dynamic SQL statement.
dbms_sql.parse(c,statement,dbms_sql.native);
/*
|| Debugging Tip:
|| =============
|| Define the column values and DO NOT forget to assign a size
|| parameter for a string datatype, like VARCHAR2; however, if you
|| forget, the error message is:
|| -------------------------------------------------------------------
|| PLS-00307: too many declarations of 'DEFINE_COLUMN' match this call
||
|| This is the message returned because the DEFINE_COLUMN procedure
|| is overloaded and it doesn't know how to implicitly cast without
|| the OUT_VALUE_SIZE argument. Only CHAR, RAW and VARCHAR2 support
|| a fourth argument.
*/
-- Define the column mapping to the value_out variable.
dbms_sql.define_column(c,1,value_out,1);
fdbk := dbms_sql.execute_and_fetch(c);
-- Copy the contents of column #1 to the value_out variable.
Page 594 Oracle DBA Code Examples
dbms_sql.column_value(c,1,value_out);
dbms_output.put_line(
'Value from COLUMN_VALUE <'||value_out||'>');
-- Close the open cursor.
dbms_sql.close_cursor(c);
END single_row_return;
-- single row DQL.
PROCEDURE single_row_return
( table_name VARCHAR2
, column_name1 VARCHAR2
, column_name2 VARCHAR2
, column_name3 VARCHAR2 ) IS
-- Define local DBMS_SQL variables.
c INTEGER := dbms_sql.open_cursor;
fdbk INTEGER;
statement VARCHAR2(2000);
cvalue_out1 VARCHAR2(20);
cvalue_out2 VARCHAR2(30);
nvalue_out NUMBER;
BEGIN
-- Build dynamic SQL statement.
statement := 'SELECT '
|| column_name1 ||','
|| column_name2 ||','
|| column_name3 ||' '
|| 'FROM '|| table_name;
-- Parse the dynamic SQL statement.
dbms_sql.parse(c,statement,dbms_sql.native);
/*
|| Debugging Tip:
|| =============
|| Define the column values and DO NOT forget to assign a size
|| parameter for a string datatype, like VARCHAR2; however, if you
|| forget, the error message is:
|| -------------------------------------------------------------------
|| PLS-00307: too many declarations of 'DEFINE_COLUMN' match this call
||
|| This is the message returned because the DEFINE_COLUMN procedure
|| is overloaded and it doesn't know how to implicitly cast without
|| the OUT_VALUE_SIZE argument. Only CHAR, RAW and VARCHAR2 support
|| a fourth argument.
*/
-- Define the column mapping to the value_out variable.
dbms_sql.define_column(c,1,nvalue_out);
dbms_sql.define_column(c,2,cvalue_out1,20);
Page 595 Oracle DBA Code Examples
dbms_sql.define_column(c,3,cvalue_out2,30);
-- Execute dynamic SQL statement.
fdbk := dbms_sql.execute_and_fetch(c);
-- Copy the contents of column #1 to the value_out variable.
dbms_sql.column_value(c,1,nvalue_out);
dbms_sql.column_value(c,2,cvalue_out1);
dbms_sql.column_value(c,3,cvalue_out2);
-- Print output message.
dbms_output.put_line('Value from COLUMN_VALUE <'||nvalue_out||'>');
dbms_output.put_line('Value from COLUMN_VALUE <'||cvalue_out1||'>');
dbms_output.put_line('Value from COLUMN_VALUE <'||cvalue_out2||'>');
dbms_sql.close_cursor(c);
END single_row_return;
Page 596 Oracle DBA Code Examples
Cal l i ng Jav a f r om PL/ SQL
Pre- requisit s:
o set CLASSPATH should cont ain:
. current direct ory
Oracle 11g: %ORACLE_HOME%/ j dbc/ lib/ oj dbc5. j ar ( or 6 but not bot h)
ORACLE_HOME/ j lib/ orai18n. j ar
Oracle 10g: %ORACLE_HOME%/ j dbc/ lib/ classes12. zip
Java JDK or J2SE 5. n or 6.n
I n Oracle 11g, t he oracle. j dbc.driver.* classes, t he oj dbc4. j ar file, and t he
OracleConnect ionCacheI mpl class are no longer support ed or available.
o Make sure PATH point s t o JDK home.
/* to create a Thick Java client program to Oracle 11g */
-- JDBCExample.java
import java.sql.*;
import oracle.jdbc.pool.OracleDataSource;
public class JDBCExample {
public static void main(String args[]) throws SQLException
/* Declare the type of Oracle Driver you are using */
{ DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
/* Create a database connection for the JDBC program */
Connection conn=
DriverManager.getConnection("jdbc:oracle:thin:@srv01:1521:ora11g","HR","h");
Statement stmt = conn.createStatement();
/* Pass a query to SQL and store the results in the result set rs */
ResultSet rs = stmt.executeQuery("select employee_id, last_name from
employees");
/* Using the while loop, result set rs is accessed row by row */
while(rs.next()){
int number = rs.getInt(1);
String name= rs.getString(2);
System.out.println(number+" "+name);
}
/* Close the JDBC result set and close the database connection */
rs.close();
conn.close();
}
}
-- load that into the database :
loadjava -r -f -o -user HR/h JDBCExample.class
Page 597 Oracle DBA Code Examples
Conf i g ur i ng Or acl e Dat abase t o Use Ex t er nal Rou t i nes
o For furt her det ails refer t o t he document at ion or Oracle Dat abase 10g PL/ SQL
Programming by Ron Hardman, Michael McLaughlin and Scot t Urman, Oracle Press.
Configure one listener for the database and one for the the extproc agent
#(1) In listener.ora
# remove the IPC protocol from the standard settings
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS =
(PROTOCOL = TCP)
(HOST = srv01)
(PORT = 1521)
)
)
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = ora11g)
(ORACLE_HOME = E:\oracle\OraDB11g)
)
)
# another listener. "extproc" lowercase
CALLOUT_LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS =
(PROTOCOL = IPC)
(KEY = extproc)
)
)
)
)
# "PLSExtProc" case sensitive
# (ENV =
"EXTPROC_DLLS=ONLY:<custom_dll_directory>/<custom_shared_library>,LD_LIBRARY_P
ATH=E:\oracle\OraDB11g\LIB")
SID_LIST_CALLOUT_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = E:\oracle\OraDB11g)
(PROGRAM = extproc)
(ENV =
"EXTPROC_DLLS=ONLY:C:\myfiles\dll/C:\myfiles\lib,LD_LIBRARY_PATH=E:\oracle\Ora
Page 598 Oracle DBA Code Examples
DB11g\LIB")
)
)
# if there is an ASM instance
(SID_DESC =
(GLOBAL_DBNAME = ora11g.srv01)
(ORACLE_HOME=E:\oracle\OraDB11g\database)
(SID_NAME = +ASM)
)
#(2) Add the following in to the tnsnames.ora
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)
(KEY = extproc))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
#(3) rebuild the original listener service and create new one
# In Windows
lsnrctl stop
# use NETCA to delete the original service and then re-create it.
# build a new service for the second listener CALLOUT_LISTENER. A new
linstener.ora will
# be created so paste again the code above in the file.
# In Unix
lsnrctl stop LISTENER
# backup the original linstener.ora and tnsnames files
# copy the new ones
lsnrctl start LISTENER
lsnrctl start CALLOUT_LISTENER
# verify
ps ef | grep v grep | grep tnslsnr
#(4) verify the configuration
tnsping EXTPROC_CONNECTION_DATA
If you get a TNS-12541 error when using tnsping, the likelihood is that there
is a mismatch between the ADDRESS parameter values in the listener.ora and
tnsnames.ora files.
# the following command should return the following error:
sqlplus plsql/plsql@EXTPROC_CONNECTION_DATA
ORA-28547: connection to server failed, probable Oracle Net admin error
Working with a C Shared Library
Define a C shared library:
Page 599 Oracle DBA Code Examples
#include <stdio.h>
/* Declare a writestr function. */
void writestr1(char *path, char *message)
{
/* Declare a FILE variable. */
FILE *file_name;
/* Open the File. */
file_name = fopen(path,"w");
/* Write to file the message received. */
fprintf(file_name,"%s\n",message);
/* Close the file. */
fclose(file_name);
}
Unix C Compiler that supports the G option
cc G o writestr1.so writestr1.c
Unix C Compiler that supports the shared option
cc shared o writestr1.so writestr1.c
- OR -
gcc shared o writestr1.so writestr1.c
# Defining and Calling the PL/SQL Library Wrapper
CREATE OR REPLACE LIBRARY library_write_string AS
'<oracle_home_directory>/<custom_library>/<file_name>.<file_ext>';
/
CREATE OR REPLACE PROCEDURE write_string
(path VARCHAR2 ,message VARCHAR2) AS EXTERNAL
LIBRARY library_write_string
NAME "writestr"
PARAMETERS (path STRING ,message STRING);
/
-- Available online as part of create_library1.sql
BEGIN
-- Call the external procedure.
write_string('/tmp/file.txt','Hello World!');
END;
/
Page 600 Oracle DBA Code Examples
Usi ng Lar ge Ob j ect s ( LOBs)
Cr eat i ng LOB
To specify different st orage opt ions, use t he following synt ax in your creat e t able
st at ement :
CREATE TABLE table_name ( .. lob_column lob_datatype )
LOB (lob_column,..) STORE AS [lob_segment_name]
[(TABLESPACE tablespace
{ENABLE|DISABLE} STORAGE IN ROW
STORAGE storage_clause
CHUNK int
PCTVERSION int
CACHE
CACHE READS [[NO]LOGGING]
NOCACHE [[NO]LOGGING])
PCTVERSI ON default s t o 10
NOCACHE is t he default
ENABLE STORAGE I N ROW, which is t he default set t ing, says t hat if t he LOB value is less
t han 4K ( including cont rol informat ion) , st ore it inline.
CREATE TABLE book_samples (
book_sample_id NUMBER (10) PRIMARY KEY,
isbn CHAR(10 CHAR),
description CLOB,
nls_description NCLOB,
book_cover BLOB,
chapter_title VARCHAR2(30 CHAR),
chapter BFILE
)
LOB (book_cover)
STORE AS blob_seg ( TABLESPACE blob_ts
CHUNK 8192
PCTVERSION 0
NOCACHE
NOLOGGING
DISABLE STORAGE IN ROW)
LOB (description, nls_description)
STORE AS ( TABLESPACE clob_ts
CHUNK 8192
PCTVERSION 10
NOCACHE
LOGGING
ENABLE STORAGE IN ROW);
Usi ng SQL w i t h I nt er nal LOBs
Wit h SQL, you can insert , updat e, and delet e int ernal LOBs.
SQL does not yet support piecewise manipulat ion of LOBs.
SET LONG 64000
Page 601 Oracle DBA Code Examples
SELECT description FROM book_samples;
-- empty_clob() creates a locator
INSERT INTO book_samples (
book_sample_id,
isbn,
description,
nls_description,
book_cover,
chapter)
VALUES (
1,
'72230665',
'The ...',
EMPTY_CLOB(),
EMPTY_BLOB(),
BFILENAME('BOOK_SAMPLES_LOC', '72230665.jpg'));
UPDATE book_samples SET description = EMPTY_CLOB() WHERE description IS NOT
NULL;
Usi ng LOBs i n PL/ SQL
A opened BFI LE should be closed aft er handling it .
SESSI ON_MAX_OPEN_FI LES cont rols t he number of BFI LEs t hat can be open at any one
t ime.
/* APPEND */
CREATE OR REPLACE PROCEDURE LOBAPPEND (
io_lob_source IN OUT NCLOB,
io_lob_destination IN OUT NCLOB)
AS
BEGIN
DBMS_LOB.OPEN(io_lob_source, DBMS_LOB.LOB_READONLY);
DBMS_LOB.OPEN(io_lob_destination, DBMS_LOB.LOB_READWRITE);
DBMS_LOB.APPEND(io_lob_destination, io_lob_source);
-- always close lob after handling them
DBMS_LOB.CLOSE(io_lob_source);
DBMS_LOB.CLOSE(io_lob_destination);
END;
/
SET SERVEROUTPUT ON
DECLARE
v_source_lob_loc NCLOB;
v_destination_lob_loc NCLOB;
v_combined_lob NCLOB;
BEGIN
-- for update is a must here
SELECT nls_description
INTO v_source_lob_loc
FROM book_samples_nls
FOR UPDATE;
Page 602 Oracle DBA Code Examples
SELECT nls_description
INTO v_destination_lob_loc
FROM book_samples
FOR UPDATE;
LOBAPPEND(v_source_lob_loc, v_destination_lob_loc);
SELECT nls_description
INTO v_combined_lob
from book_samples;
DBMS_OUTPUT.PUT_LINE(SUBSTR(v_combined_lob, 1, 150));
DBMS_OUTPUT.PUT_LINE(SUBSTR(v_combined_lob, 151, 300));
END;
/
/* COMPARE */
If 0 is returned, then the LOBs are the same. If 1 is returned, then they are
different.
FUNCTION COMPARE RETURNS NUMBER(38)
Argument Name Type In/Out Default?
-
LOB_1 CLOB IN
LOB_2 CLOB IN
AMOUNT NUMBER(38) IN DEFAULT
OFFSET_1 NUMBER(38) IN DEFAULT
OFFSET_2 NUMBER(38) IN DEFAULT
CREATE OR REPLACE PROCEDURE CLOB_COMPARE (
v_lob1 IN OUT CLOB,
v_lob2 IN OUT CLOB)
AS
v_compare PLS_INTEGER := 0;
BEGIN
DBMS_LOB.OPEN(v_lob1, DBMS_LOB.LOB_READONLY);
DBMS_LOB.OPEN(v_lob2, DBMS_LOB.LOB_READONLY);
-- buffer size used 32K (the max)
v_compare := DBMS_LOB.COMPARE(v_lob1,v_lob2, 32768, 1, 1);
DBMS_OUTPUT.PUT_LINE('The value returned by COMPARE is: '||v_compare);
DBMS_LOB.CLOSE(v_lob1);
DBMS_LOB.CLOSE(v_lob2);
END;
/
DECLARE
v_lob1 CLOB;
v_lob2 CLOB;
v_lob3 CLOB;
BEGIN
SELECT description
INTO v_lob1
FROM book_samples
WHERE book_sample_id = 1;
Page 603 Oracle DBA Code Examples
SELECT description
INTO v_lob2
FROM book_samples
WHERE book_sample_id = 2;
SELECT description
INTO v_lob3
FROM book_samples
WHERE book_sample_id = 3;
CLOB_COMPARE(v_lob1, v_lob2);
CLOB_COMPARE(v_lob1, v_lob3);
END;
/
/* CONVERTTO..LOB */
PROCEDURE CONVERTTOBLOB
DEST_LOB BLOB IN/OUT
# in CONVERTTOCLOB the following is SRC_BLOB
SRC_CLOB CLOB IN
AMOUNT NUMBER(38) IN
DEST_OFFSET NUMBER(38) IN/OUT
SRC_OFFSET NUMBER(38) IN/OUT
BLOB_CSID NUMBER IN
LANG_CONTEXT NUMBER(38) IN/OUT
WARNING NUMBER(38) OUT
CREATE OR REPLACE PROCEDURE CONVERT_ME (
v_blob_or_clob IN NUMBER, -- if 0 TOBLOB, if 1 TOCLOB
v_blob IN OUT BLOB,
v_clob IN OUT CLOB,
v_amount IN OUT NUMBER,
v_blob_offset IN OUT NUMBER,
v_clob_offset IN OUT NUMBER,
v_lang_context IN OUT NUMBER,
v_warning OUT NUMBER)
AS
BEGIN
DBMS_LOB.OPEN(v_blob, DBMS_LOB.LOB_READWRITE);
DBMS_LOB.OPEN(v_clob, DBMS_LOB.LOB_READWRITE);
IF v_blob_or_clob = 0
THEN
DBMS_LOB.CONVERTTOBLOB(v_blob,
v_clob,
v_amount,
v_blob_offset,
v_clob_offset,
1,
v_lang_context,
v_warning);
ELSE
Page 604 Oracle DBA Code Examples
DBMS_LOB.CONVERTTOCLOB(v_clob,
v_blob,
v_amount,
v_clob_offset,
v_blob_offset,
1,
v_lang_context,
v_warning);
END IF;
DBMS_LOB.CLOSE(v_blob);
DBMS_LOB.CLOSE(v_clob);
END;
/
DECLARE
v_clob_or_blob NUMBER;
v_blob_locator BLOB;
v_clob_locator CLOB;
v_blob_offset NUMBER;
v_clob_offset NUMBER;
v_lang_context NUMBER := DBMS_LOB.DEFAULT_LANG_CTX;
v_warning NUMBER;
v_string_length NUMBER(10);
v_source_locator BLOB;
v_destination_locator BLOB;
v_amount PLS_INTEGER;
v_string CLOB;
BEGIN
-- CONVERT CLOB TO BLOB
SELECT description
INTO v_clob_locator
FROM book_samples
WHERE book_sample_id = 1
FOR UPDATE;
SELECT misc
INTO v_blob_locator
FROM book_samples
WHERE book_sample_id = 1
FOR UPDATE;
v_string_length := DBMS_LOB.GETLENGTH(v_blob_locator);
v_amount := DBMS_LOB.GETLENGTH(v_clob_locator);
DBMS_OUTPUT.PUT_LINE('The initial length of the BLOB is:
'||v_string_length);
v_clob_or_blob := 0; -- Convert clob to blob
v_clob_offset := 1;
v_blob_offset := 1;
CONVERT_ME(v_clob_or_blob,
Page 605 Oracle DBA Code Examples
v_blob_locator,
v_clob_locator,
v_amount,
v_blob_offset,
v_clob_offset,
v_lang_context,
v_warning);
v_string_length := DBMS_LOB.GETLENGTH(v_blob_locator);
DBMS_OUTPUT.PUT_LINE('The length of the BLOB post-conversion is:
'||v_string_length);
-- COPY BLOB FOR ONE ROW TO BLOB IN ANOTHER
v_source_locator := v_blob_locator;
SELECT misc
INTO v_destination_locator
FROM book_samples
WHERE book_sample_id = 2
FOR UPDATE;
DBMS_LOB.COPY(v_destination_locator, v_source_locator, 32768, 1, 1);
v_string_length := DBMS_LOB.GETLENGTH(v_destination_locator);
DBMS_OUTPUT.PUT_LINE('The length of the BLOB post-copy is:
'||v_string_length);
-- COPY BLOB FOR RECORD 2 BACK TO A CLOB
SELECT description
INTO v_clob_locator
FROM book_samples
WHERE book_sample_id = 2
FOR UPDATE;
SELECT misc
INTO v_blob_locator
FROM book_samples
WHERE book_sample_id = 2
FOR UPDATE;
v_string_length := DBMS_LOB.GETLENGTH(v_clob_locator);
-- v_ammount must equal to BLOB size, otherwise ORA-22993 will return
v_amount := DBMS_LOB.GETLENGTH(v_blob_locator);
DBMS_OUTPUT.PUT_LINE('The initial length of the CLOB (record 2) is:
'||v_string_length);
v_clob_or_blob := 1; -- Convert blob to clob
-- must be reset to 1 because its value changed by the
-- previous call of CONVERT_ME
v_clob_offset := 1;
v_blob_offset := 1;
CONVERT_ME(v_clob_or_blob,
v_blob_locator,
Page 606 Oracle DBA Code Examples
v_clob_locator,
v_amount,
v_clob_offset,
v_blob_offset,
v_lang_context,
v_warning);
v_string_length := DBMS_LOB.GETLENGTH(v_clob_locator);
SELECT description
INTO v_string
FROM book_samples
WHERE book_sample_id = 2;
DBMS_OUTPUT.PUT_LINE('The length of the CLOB post-conversion is:
'||v_string_length);
DBMS_OUTPUT.PUT_LINE('The converted CLOB');
DBMS_OUTPUT.PUT_LINE('==================');
DBMS_OUTPUT.PUT_LINE(SUBSTR(v_string,1,150));
DBMS_OUTPUT.PUT_LINE(SUBSTR(v_string,151,300));
END;
/
/* BFILE FILEEXISTS */
-- This function tests whether a file exists by the name specified in the
insert statement
INSERT INTO book_samples (
book_sample_id,
isbn,
description,
nls_description,
misc,
bfile_description)
VALUES (
1,
'72230665',
EMPTY_CLOB(),
EMPTY_CLOB(),
EMPTY_BLOB(),
BFILENAME('BOOK_SAMPLES_LOC', 'bfile_example.pdf'));
CREATE OR REPLACE PROCEDURE CHECK_FILE ( v_bfile IN BFILE)
AS
v_exists PLS_INTEGER := 0;
BEGIN
v_exists := DBMS_LOB.FILEEXISTS(v_bfile);
IF v_exists = 0
THEN
DBMS_OUTPUT.PUT_LINE ('The file does not exists in the directory
specified');
ELSE
DBMS_OUTPUT.PUT_LINE ('The file exists and the directory valid!');
Page 607 Oracle DBA Code Examples
END IF;
END;
/
DECLARE
v_bfile BFILE;
BEGIN
SELECT bfile_description
INTO v_bfile
FROM book_samples
WHERE book_sample_id = 1;
CHECK_FILE(v_bfile);
END;
/
/* BFILE FILEOPEN/OPEN */
-- Oracle recommends that OPEN be used instead of FILEOPEN.
PROCEDURE OPEN
Argument Name Type In/Out Default?
-
FILE_LOC BINARY FILE LOB IN/OUT
OPEN_MODE BINARY_INTEGER IN DEFAULT
OPEN_MODE: DBMS_LOB.LOB_READONLY or DBMS_LOB.LOB_READWRITE
/* BFILE FILEISOPEN/ISOPEN */
-- ISOPEN should be used in place of FILEISOPEN when possible.
CREATE OR REPLACE PROCEDURE CHECK_STATUS (
v_bfile IN BFILE)
AS
v_isopen PLS_INTEGER := 0;
BEGIN
v_isopen := DBMS_LOB.ISOPEN(v_bfile);
IF v_isopen = 0
THEN
DBMS_OUTPUT.PUT_LINE ('The file is not open. You must open the');
ELSE
DBMS_OUTPUT.PUT_LINE ('The file is open already.');
END IF;
END;
/
DECLARE
v_bfile BFILE;
BEGIN
SELECT bfile_description
INTO v_bfile
FROM book_samples
WHERE book_sample_id = 1;
CHECK_STATUS(v_bfile);
END;
/
Page 608 Oracle DBA Code Examples
/* BFILE FILECLOSE/CLOSE/FILECLOSEALL */
FILECLOSE and CLOSE both close one BFILE at a time, while FILECLOSEALL closes
all open BFILEs. It is recommended by Oracle that CLOSE be used rather than
FILECLOSE for all new development. CLOSE can be used with all LOB types, not
just BFILEs.
CREATE OR REPLACE PROCEDURE CLOSE_ALL_FILES
AS
v_isopen PLS_INTEGER := 0;
v_counter PLS_INTEGER := 0;
v_bfile BFILE;
CURSOR cur_bfile IS
SELECT bfile_description
FROM book_samples;
BEGIN
DBMS_OUTPUT.PUT_LINE('Open all BFILEs in the table');
OPEN cur_bfile;
LOOP
FETCH cur_bfile INTO v_bfile;
EXIT WHEN cur_bfile%NOTFOUND;
BEGIN
v_counter := v_counter + 1;
DBMS_LOB.OPEN(v_bfile);
v_isopen := DBMS_LOB.ISOPEN(v_bfile);
IF v_isopen = 0
THEN
DBMS_OUTPUT.PUT_LINE ('File number '||v_counter||' is closed');
ELSE
DBMS_OUTPUT.PUT_LINE ('File number '||v_counter||' is open');
END IF;
END;
END LOOP;
CLOSE cur_bfile;
DBMS_LOB.FILECLOSEALL();
DBMS_OUTPUT.PUT_LINE(' DONE ');
END;
/
/* LOADFROMFILE/LOADCLOBFROMFILE/LOADBLOBFROMFILE */
load file contents to CLOB and BLOB columns. It is
recommended that LOADCLOBFROMFILE and LOADBLOBFROMFILE be used for
their specific datatypes rather than using the generic overloaded
LOADFROMFILE.
PROCEDURE LOADBLOBFROMFILE
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
DEST_LOB BLOB IN/OUT
SRC_BFILE BINARY FILE LOB IN
AMOUNT NUMBER(38) IN
Page 609 Oracle DBA Code Examples
DEST_OFFSET NUMBER(38) IN/OUT
SRC_OFFSET NUMBER(38) IN/OUT
PROCEDURE LOADCLOBFROMFILE
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
DEST_LOB CLOB IN/OUT
SRC_BFILE BINARY FILE LOB IN
AMOUNT NUMBER(38) IN
DEST_OFFSET NUMBER(38) IN/OUT
SRC_OFFSET NUMBER(38) IN/OUT
BFILE_CSID NUMBER IN
LANG_CONTEXT NUMBER(38) IN/OUT
WARNING NUMBER(38) OUT
set serveroutput on
DECLARE
v_dest_blob BLOB;
v_dest_clob CLOB;
v_source_locator1 BFILE := BFILENAME('BOOK_SAMPLES_LOC',
'bfile_example.pdf');
v_source_locator2 BFILE := BFILENAME('BOOK_SAMPLES_LOC',
'bfile_example.txt');
v_source_offset NUMBER := 1;
v_dest_offset NUMBER := 1;
v_lang_context NUMBER := DBMS_LOB.DEFAULT_LANG_CTX;
v_warning PLS_INTEGER;
BEGIN
-- Empty the description and misc columns
UPDATE book_samples
SET description = EMPTY_CLOB(), misc = EMPTY_BLOB()
WHERE book_sample_id = 1;
-- Retrieve the locators for the two destination columns
SELECT description, misc
INTO v_dest_clob, v_dest_blob
FROM book_samples
WHERE book_sample_id = 1
FOR UPDATE;
-- Open the BFILEs and destination LOBs
DBMS_LOB.OPEN(v_source_locator1, DBMS_LOB.LOB_READONLY);
DBMS_LOB.OPEN(v_source_locator2, DBMS_LOB.LOB_READONLY);
DBMS_LOB.OPEN(v_dest_blob, DBMS_LOB.LOB_READWRITE);
DBMS_LOB.OPEN(v_dest_clob, DBMS_LOB.LOB_READWRITE);
DBMS_OUTPUT.PUT_LINE('Length of the BLOB file is:
'||DBMS_LOB.GETLENGTH(v_source_locator1));
DBMS_OUTPUT.PUT_LINE('Length of the CLOB file is:
'||DBMS_LOB.GETLENGTH(v_source_locator2));
DBMS_OUTPUT.PUT_LINE('Size of BLOB pre-load:
'||DBMS_LOB.GETLENGTH(v_dest_blob));
DBMS_OUTPUT.PUT_LINE('Size of CLOB pre-load:
'||DBMS_LOB.GETLENGTH(v_dest_clob));
-- Load the destination columns from the source
DBMS_LOB.LOADBLOBFROMFILE(v_dest_blob, v_source_locator1,
DBMS_LOB.LOBMAXSIZE, v_dest_offset, v_source_offset);
Page 610 Oracle DBA Code Examples
DBMS_OUTPUT.PUT_LINE('Size of BLOB post-load: '||(v_dest_offset -1));
v_dest_offset := 1;
v_source_offset := 1;
DBMS_LOB.LOADCLOBFROMFILE(v_dest_clob,
v_source_locator2,
DBMS_LOB.LOBMAXSIZE,
v_dest_offset,
v_source_offset,
DBMS_LOB.DEFAULT_CSID,
v_lang_context,
v_warning);
DBMS_OUTPUT.PUT_LINE('Size of CLOB post-load: '||(v_dest_offset -1));
-- Close the LOBs that we opened
DBMS_LOB.CLOSE(v_source_locator1);
DBMS_LOB.CLOSE(v_source_locator2);
DBMS_LOB.CLOSE(v_dest_blob);
DBMS_LOB.CLOSE(v_dest_clob);
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
DBMS_LOB.CLOSE(v_source_locator1);
DBMS_LOB.CLOSE(v_source_locator2);
DBMS_LOB.CLOSE(v_dest_blob);
DBMS_LOB.CLOSE(v_dest_clob);
END;
/
SET LONG 64000
SELECT description
FROM book_samples
WHERE book_sample_id = 1;
Per f or mance Consi der at i ons
Usi ng Ret ur ni ng Cl ause
RETURNI NG is a keyword added t o t he end of t he I NSERT st at ement allowing you t o work
wit h t he LOB immediat ely, wit hout any addit ional st eps.
DECLARE
v_clob CLOB;
BEGIN
INSERT INTO book_samples (
book_sample_id,
isbn,
description,
nls_description,
book_cover,
chapter)
VALUES (
Page 611 Oracle DBA Code Examples
1,
'72230665',
'The ...',
EMPTY_CLOB(),
EMPTY_BLOB(),
BFILENAME('BOOK_SAMPLES_LOC', '72230665.jpg'))
RETURNING description INTO v_clob;
COMMIT;
DBMS_OUTPUT.PUT_LINE(v_clob);
END;
/
Usi ng CONTEXT I ndex
You can apply many indexing t ypes. The examples here show how t o use CONTEXT index.
Using t he CONTEXT index, we are able t o perform t he following t ypes of queries:
o Boolean searches AND, OR, NOT.
o Exact mat ches Search for t he exact word or phrase inside t he t ext .
o I nexact mat ches Search using st emming ( a search for mice finds mouse) , wildcard,
soundex ( one word sounds like anot her).
o Proximit y A word is near anot her.
o Ranking A value is provided based on relevance t o t he keywords used in t he query.
o Theme searches Search on what a document or t ext is about .
Refer to Oracle Text documentation for further details.
/* Creating CONTEXT Index */
-- 1) create named preferences
-- If you want to index text in another language: eg JAPANESE_LEXER and
JAPANESE_VGRAM_LEXER
-- WORLD_LEXER that can detect the language of the text
BEGIN
ctx_ddl.create_preference ('lob_lexer', 'basic_lexer');
ctx_ddl.set_attribute ('lob_lexer', 'index_text', 'true');
ctx_ddl.set_attribute ('lob_lexer', 'index_themes', 'false');
END;
/
-- 2) create Wordlist
BEGIN
ctx_ddl.create_preference ('lob_wordlist', 'basic_wordlist');
ctx_ddl.set_attribute ('lob_wordlist', 'substring_index', 'true');
END;
/
-- 3) Create the index on the column
-- role ctxapp and resource must be granted first
-- STOPLIST refers to noise words. It can also take DEFAULT_STOPLIST
CREATE INDEX lob_indx ON book_samples(description)
INDEXTYPE IS CTXSYS.CONTEXT
PARAMETERS ( 'lexer lob_lexer
wordlist lob_wordlist
stoplist ctxsys.empty_stoplist' )
/
To examine the tokens:
Page 612 Oracle DBA Code Examples
set pages 9999
SELECT token_text FROM DR$LOB_INDX$I;
/* Using the Index */
SELECT SCORE(1), book_sample_id
FROM book_samples
WHERE CONTAINS(description, 'website', 1) > 0;
Mi gr at i ng f r om LONGs t o LOBs
ALTER TABLE long_to_lob MODIFY text CLOB;
Page 613 Oracle DBA Code Examples
Par t 12 Appendi x es
Page 614 Oracle DBA Code Examples
Pr ogr am Uni t s and Scr i pt s Used i n t he Docu men t
Ret ur n Par amet er Val ue f or Nor mal User
Used by normal user who do not have access on v$paramet er.
CREATE OR REPLACE FUNCTION GET_PAR ( P_PARAMETER VARCHAR2)
RETURN VARCHAR2
IS
parnam VARCHAR2(256);
intval BINARY_INTEGER;
strval VARCHAR2(256);
partype BINARY_INTEGER;
V VARCHAR2(1000);
BEGIN
partype := dbms_utility.get_parameter_value(P_PARAMETER, intval, strval);
IF partype = 1 THEN
RETURN 'TYPE:STRING - Value:' || STRVAL;
ELSE
RETURN 'TYPE:INTEGER - Value:' || TO_CHAR(intval);
END IF;
END;
/
Page 615 Oracle DBA Code Examples
Appl yi ng Random Load on Dat abase Sampl e 1
Script s t o apply loads on Oracle DB on a single t able. Applicable on Unix and Windows.
Set up
Dat abase Side
/* Create Schema cotaining target objects */
create tablespace hrstbs ;
create user hrs identified by h
default tablespace hrstbs
quota unlimited on hrstbs ;
grant create table, create view, create procedure, create session, create
sequence, plustrace to hrs;
grant execute on DBMS_LOCK to hrs;
grant execute on DBMS_RANDOM to hrs;
/* Create Schema Objects */
conn hrs/h
CREATE TABLE NAMES
( ID NUMBER , NAME VARCHAR2(50), HDATE DATE, SAL NUMBER, REGION VARCHAR2(1));
CREATE SEQUENCE S cache 1000;
/* Create Random Load Package */
-- Generates various different loads on the target database
CREATE OR REPLACE PACKAGE LOAD_GENERATOR
IS
-- insert batch rows into NAMES table
PROCEDURE INSERT_NAMES ( P_ROWS IN NUMBER);
-- high CPU calls
PROCEDURE SpinCPUs(P_ITERATION IN NUMBER);
-- high CPU+DB calls
PROCEDURE SpinCycles (P_ITERATION IN NUMBER);
-- random query: from NAMES
PROCEDURE RandomQuery(P_ITERATION IN NUMBER, P_MAX IN NUMBER);
-- random DML on NAMES
PROCEDURE RandomDML(P_ITERATION IN NUMBER, P_MAX IN NUMBER);
END load_generator;
/
-- unmark the SLEEP function, if you wish
CREATE OR REPLACE PACKAGE Body LOAD_GENERATOR
IS
-- generate random text: its lengnth between 4 and the passed value
FUNCTION G_TEXT(P_SIZE IN NUMBER) RETURN VARCHAR2
IS
V VARCHAR2(2000);
BEGIN
FOR I IN 1..DBMS_RANDOM.VALUE(4,P_SIZE) LOOP
V := V || CHR(ROUND(DBMS_RANDOM.VALUE(65,90))); -- 122
END LOOP;
RETURN V;
END;
Page 616 Oracle DBA Code Examples
PROCEDURE INSERT_NAMES ( P_ROWS IN NUMBER)
IS
V1 VARCHAR2(15);
V2 VARCHAR2(15);
BEGIN
FOR I IN 1..P_ROWS LOOP
V1 := G_TEXT(15);
V2 := G_TEXT(15);
INSERT INTO NAMES VALUES ( S.NEXTVAL, -- ID
V1 || ' ' || V2, -- NAME
TRUNC(SYSDATE-DBMS_RANDOM.VALUE(60,1800)), -- HDATE
ROUND(DBMS_RANDOM.VALUE(1000,55000)), -- SAL
DECODE( TO_CHAR(ROUND(DBMS_RANDOM.VALUE(1,4))),
'1','N','2','W','3','E','4','S') ); -- REGION
IF MOD(I,100) = 0 THEN
COMMIT;
END IF;
END LOOP;
COMMIT;
END INSERT_NAMES;
PROCEDURE SpinCPUs (P_ITERATION IN NUMBER)
IS
N NUMBER;
BEGIN
FOR I IN 1.. P_ITERATION LOOP
-- pure CPU processing (no physical or logical read)
N := SQRT(ROUND(DBMS_RANDOM.VALUE(1,1000)));
-- DBMS_LOCK.SLEEP(round(DBMS_RANDOM.VALUE(0.01,0.05),2)); -- in seconds
END LOOP;
END SpinCPUs;
PROCEDURE SpinCycles (P_ITERATION IN NUMBER)
IS
N NUMBER;
BEGIN
FOR I IN 1.. P_ITERATION LOOP
FOR X IN 1.. ROUND(DBMS_RANDOM.VALUE(1,10)) LOOP
N := SQRT(ROUND(DBMS_RANDOM.VALUE(1,1000)));
END LOOP;
SELECT COUNT(*) INTO N FROM NAMES;
-- DBMS_LOCK.SLEEP(ROUND(DBMS_RANDOM.VALUE(0.01,1),2)); -- in seconds
END LOOP;
END SpinCycles;
PROCEDURE RandomQuery(P_ITERATION IN NUMBER, P_MAX IN NUMBER)
IS
V_START NUMBER;
V_END NUMBER;
N NUMBER;
BEGIN
V_END := P_MAX;
V_START := ROUND(DBMS_RANDOM.VALUE(1,V_END));
FOR I IN 1.. P_ITERATION LOOP
SELECT COUNT(ID) INTO N FROM NAMES
WHERE ID BETWEEN V_START AND V_END;
Page 617 Oracle DBA Code Examples
-- DBMS_LOCK.SLEEP(ROUND(DBMS_RANDOM.VALUE(0.01,3),2));
END LOOP;
END RandomQuery;
PROCEDURE RandomDML(P_ITERATION IN NUMBER, P_MAX IN NUMBER)
IS
N NUMBER;
M NUMBER;
V_NEW_SAL NUMBER;
V1 VARCHAR2(15);
V2 VARCHAR2(15);
BEGIN
FOR I IN 1.. P_ITERATION LOOP
N := ROUND(DBMS_RANDOM.VALUE(1,3));
IF N=1 THEN
V1 := G_TEXT(15);
V2 := G_TEXT(15);
INSERT INTO NAMES VALUES ( S.NEXTVAL, -- ID
V1 || ' ' || V2, -- NAME
TRUNC(SYSDATE)-DBMS_RANDOM.VALUE(60,1800), -- HDATE
ROUND(DBMS_RANDOM.VALUE(1000,55000)), -- SAL
DECODE( TO_CHAR(ROUND(DBMS_RANDOM.VALUE(1,4))),
'1','N','2','W','3','E','4','S') ); -- REGION
ELSIF N=2 THEN
M := ROUND(DBMS_RANDOM.VALUE(1,P_MAX));
V_NEW_SAL := ROUND(DBMS_RANDOM.VALUE(1000,55000));
UPDATE NAMES SET SAL = V_NEW_SAL
WHERE ID = M;
ELSIF N=3 THEN
M := ROUND(DBMS_RANDOM.VALUE(1,P_MAX));
DELETE NAMES WHERE ID = M;
END IF;
-- DBMS_LOCK.SLEEP(ROUND(DBMS_RANDOM.VALUE(0.1,2),2));
COMMIT;
END LOOP;
END RandomDML;
END load_generator;
/
-- load some rows in names table
execute load_generator.insert_names(10000);
OS side: Unix
-- in a folder create the following scripts
-- (1) loadcpu1.sh
#!/bin/bash
# apply CPU load on Oracle DB
# parameters: 1 connections, 2 Iterations
users=$1
SRVC="hrserv"
UNPW="hrs/h"
SQLCMD="/home/oracle/scripts/load/loadcpu1.sql"
x=1
y=$users
ITER=$2
Page 618 Oracle DBA Code Examples
while [ $x -le $y ]
do
sqlplus -s $UNPW@$SRVC @$SQLCMD $ITER &
x=`expr $x + 1`
done
-- (2) loadcpu1.sql
begin
hrs.LOAD_GENERATOR.SpinCPUs(&1);
end;
/
exit
-- (3) loadcpu2.sh
#!/bin/bash
# apply CPU+DB Calls load on Oracle DB
# parameters: 1 connections, 2 Iterations
users=$1
SRVC="hrserv"
UNPW="hrs/h"
SQLCMD="/home/oracle/scripts/load/loadcpu2.sql"
x=1
y=$users
ITER=$2
while [ $x -le $y ]
do
sqlplus -s $UNPW@$SRVC @$SQLCMD $ITER &
x=`expr $x + 1`
done
-- (4) loadcpu2.sql
begin
hrs.LOAD_GENERATOR.SpinCycles(&1);
end;
/
exit
-- (5) loadquery.sh
#!/bin/bash
# apply random queries load on Oracle DB
# parameters: 1 connections, 2 Iterations, 3 rows in names
users=$1
SRVC="hrserv"
UNPW="hrs/h"
SQLCMD="/home/oracle/scripts/load/loadquery.sql"
x=1
y=$users
ITER=$2
MAX=$3
while [ $x -le $y ]
do
sqlplus -s $UNPW@$SRVC @$SQLCMD $ITER $MAX &
x=`expr $x + 1`
done
Page 619 Oracle DBA Code Examples
-- (6) loadquery.sql
begin
hrs.LOAD_GENERATOR.RANDOMQUERY (&1, &2);
end;
/
exit
-- (7) loaddml.sh
#!/bin/bash
# apply random DML load on Oracle DB
# parameters: 1 connections, 2 Iterations, 3 rows in names
users=$1
SRVC="hrserv"
UNPW="hrs/h"
SQLCMD="/home/oracle/scripts/load/loaddml.sql"
x=1
y=$users
ITER=$2
MAX=$3
while [ $x -le $y ]
do
sqlplus -s $UNPW@$SRVC @$SQLCMD $ITER $MAX &
x=`expr $x + 1`
done
-- (8) loaddml.sql
begin
hrs.LOAD_GENERATOR.RANDOMDML (&1, &2);
end;
/
exit
OS side: Windows
-- in a folder create the following scripts
-- (1) loadcpu1.bat
REM apply CPU load on Oracle DB
REM parameters: 1 connections, 2 Iterations
set users=%1
set SRVC=hrserv
set UNPW=hrs/h
set SQLCMD=C:\TEMP\load\loadcpu1.sql
set x=1
set y=%users%
set ITER=%2
for /L %%i in (1,1,%y%) do (start /d "E:\oracle\OraDB11g" sqlplus -S
%UNPW%@%SRVC% @%SQLCMD% %ITER%)
-- (2) loadcpu1.sql
begin
hrs.LOAD_GENERATOR.SpinCPUs(&1);
end;
/
Page 620 Oracle DBA Code Examples
exit
-- (3) loadcpu2.bat
REM apply CPU+DB Calls load on Oracle DB
REM parameters: 1 connections, 2 Iterations
set users=%1
set SRVC=hrserv
set UNPW=hrs/h
set SQLCMD=C:\TEMP\load\loadcpu2.sql
set x=1
set y=%users%
set ITER=%2
for /L %%i in (1,1,%y%) do (start /d "E:\oracle\OraDB11g" sqlplus -S
%UNPW%@%SRVC% @%SQLCMD% %ITER%)
-- (4) loadcpu2.sql
begin
hrs.LOAD_GENERATOR.SpinCycles(&1);
end;
/
exit
-- (5) loadquery.bat
REM apply random queries load on Oracle DB
REM parameters: 1 connections, 2 Iterations, 3 rows in names
set users=%1
set SRVC=hrserv
set UNPW=hrs/h
set SQLCMD=C:\TEMP\load\loadquery.sql
set x=1
set y=%users%
set ITER=%2
set MAX=%3
for /L %%i in (1,1,%y%) do (start /d "E:\oracle\OraDB11g" sqlplus -S
%UNPW%@%SRVC% @%SQLCMD% %ITER% %MAX%)
-- (6) loadquery.sql
begin
hrs.LOAD_GENERATOR.RANDOMQUERY (&1, &2);
end;
/
exit
-- (7) loaddml.bat
REM apply random DML load on Oracle DB
REM parameters: 1 connections, 2 Iterations, 3 rows in names
set users=%1
set SRVC=hrserv
Page 621 Oracle DBA Code Examples
set UNPW=hrs/h
set SQLCMD=C:\TEMP\load\loaddml.sql
set x=1
set y=%users%
set ITER=%2
set MAX=%3
for /L %%i in (1,1,%y%) do (start /d "E:\oracle\OraDB11g" sqlplus -S
%UNPW%@%SRVC% @%SQLCMD% %ITER% %MAX%)
-- (8) loaddml.sql
begin
hrs.LOAD_GENERATOR.RANDOMDML (&1, &2);
end;
/
exit
Usi ng t he Load Gener at or Scr i pt s
/* in Unix and Windows */
## Using the Load Generator #
# 5 connections 1000 iterations 100000 number of rows in NAMES table
loadcpu1 5 1000
loaddml 5 1000 100000
Page 622 Oracle DBA Code Examples
Appl yi ng Random Load on Dat abase Sampl e 2
Script s t o apply loads on Oracle DB on a schema named as SA. Tables in t his schema
t aken from t he default Oracle OE schema. Applicable on Unix and Windows. Following is
t he ERD of t he SA schema:
Set up
Dat abase Side
/* Create sa Schema (if not already there) */
create tablespace satbs
datafile 'C:\ORACLE\ORADATA\ORA11G\satbs1.dbf' size 100m
autoextend on next 12m maxsize 4g
extent management local
segment space management auto ;
create user sa identified by s
default tablespace satbs
quota unlimited on satbs ;
grant create table, create view, create procedure, create session, create
sequence to sa;
grant execute on DBMS_LOCK to sa;
grant execute on DBMS_RANDOM to sa;
grant SELECT_CATALOG_ROLE tO sa;
grant alter session to sa;
grant create role to sa;
grant plustrace to sa;
-- if role doesn't exist
@C:\oracle\product\11.1.0\db_1\RDBMS\ADMIN\utlxplan.sql
Page 623 Oracle DBA Code Examples
@C:\oracle\product\11.1.0\db_1\sqlplus\admin\plustrce.sql
# in unix:
@/u01/app/oracle/product/10.2.0/db_1/rdbms/admin/utlxplan.sql
@/u01/app/oracle/product/10.2.0/db_1/sqlplus/admin/plustrce.sql
/* Create Schema Objects */
conn sa/s
-- execute code in:
@ http://www.ahmedbaraka.com/oracle/scripts/populatesa.sql
-- the package
/* Create Random Load Package */
-- Generates various different loads on the target database
CREATE OR REPLACE PACKAGE sa.LOAD_GENERATOR
IS
-- global vars
G_MAX_ORDER_ID NUMBER;
G_MIN_ORDER_ID NUMBER;
-- initialize the package
PROCEDURE INITIALIZE;
-- insert batch rows into NAMES table
PROCEDURE INSERT_ORDERS ( P_ROWS IN NUMBER, P_DAYS IN NUMBER DEFAULT 30 );
-- high CPU calls
PROCEDURE SpinCPUs(P_ITERATION IN NUMBER);
-- random query: from ORDERS
PROCEDURE RandomQuery(P_ITERATION IN NUMBER);
-- random DML on NAMES
PROCEDURE RandomDML(P_ITERATION IN NUMBER);
END load_generator;
/
CREATE OR REPLACE PACKAGE Body sa.LOAD_GENERATOR
IS
PROCEDURE INITIALIZE
IS
BEGIN
SELECT MAX(ORDER_ID) , MIN(ORDER_ID) INTO G_MAX_ORDER_ID, G_MIN_ORDER_ID
FROM ORDERS;
END INITIALIZE;
PROCEDURE INSERT_ORDERS ( P_ROWS IN NUMBER, P_DAYS IN NUMBER DEFAULT 30 )
IS
V_ORDER_ID NUMBER;
V_ORDER_DATE DATE;
V_ORDER_MODE VARCHAR2(8);
V_CUSTOMER_ID NUMBER;
V_ORDER_STATUS NUMBER;
V_SALES_REP_ID NUMBER;
V_PRODUCT_ID NUMBER;
V_PROD_PRICE NUMBER;
Page 624 Oracle DBA Code Examples
V_CHANGE_PRICE NUMBER;
V_QUANTITY NUMBER;
V_ORDER_TOTAL NUMBER;
V_ITEMS_COUNT NUMBER;
N NUMBER;
M NUMBER;
-- 97 customers
TYPE CUST_ID_TYPE IS VARRAY(100) OF INTEGER;
V_CUST_IDS CUST_ID_TYPE := CUST_ID_TYPE
(341,342,343,344,345,346,347,348,349,350,351,352,360,361,363,378,380,447,448,4
49,450,451,452,453,454,458,463,466,467,468,470,473,474,475,476,477,478,479,480
,481,482,483,487,488,492,496,605,606,607,609,615,621,627,712,713,715,717,719,7
21,727,729,731,754,755,756,757,766,767,768,769,770,771,772,782,825,826,827,828
,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847);
-- 275 PRODUCTS
TYPE PROD_ID_TYPE IS VARRAY(275) OF INTEGER;
V_PROD_IDS PROD_ID_TYPE := PROD_ID_TYPE
(1750,1755,1761,1763,1768,1769,1770,1772,1774,1775,1778,1779,1780,1781,1782,17
87,1788,1791,1792,1794,1797,1799,1801,1803,1804,1805,1806,1808,1820,1822,1825,
1910,1912,1940,1948,2004,2005,2030,2049,2056,2058,2091,2093,2144,2152,2211,223
1,2236,2243,2245,2252,2253,2254,2255,2257,2259,2260,2261,2262,2264,2266,2268,2
270,2272,2274,2276,2278,2289,2293,2299,2302,2308,2311,2316,2319,2322,2323,2326
,2330,2334,2335,2336,2337,2339,2340,2350,2351,2359,2365,2370,2371,2373,2374,23
75,2377,2378,2380,2381,2382,2384,2387,2394,2395,2396,2400,2402,2403,2404,2406,
2408,2409,2410,2411,2412,2414,2415,2416,2417,2418,2419,2422,2423,2424,2430,243
9,2449,2452,2453,2457,2459,2462,2464,2467,2468,2470,2471,2492,2493,2494,2496,2
497,2522,2536,2537,2594,2596,2631,2638,2721,2722,2725,2751,2752,2761,2779,2782
,2783,2808,2810,2870,2878,2879,2944,2976,2982,2986,2995,2999,3000,3001,3003,30
04,3020,3051,3054,3057,3060,3061,3064,3065,3069,3071,3072,3073,3077,3082,3083,
3086,3087,3088,3090,3091,3097,3099,3101,3106,3108,3110,3112,3114,3117,3123,312
4,3127,3129,3133,3134,3139,3140,3143,3150,3155,3163,3165,3167,3170,3171,3172,3
173,3175,3176,3177,3178,3179,3182,3183,3187,3189,3191,3193,3197,3204,3208,3209
,3216,3220,3224,3225,3234,3245,3246,3247,3248,3250,3251,3252,3253,3255,3256,32
57,3258,3260,3262,3277,3290,3300,3301,3331,3334,3337,3350,3353,3354,3355,3359,
3361,3362,3391,3399,3400,3501,3502,3503,3511,3515);
BEGIN
FOR I IN 1..P_ROWS LOOP
SELECT SEQ_ORDER_ID.NEXTVAL INTO V_ORDER_ID FROM DUAL;
V_ORDER_DATE := TRUNC(SYSDATE- P_DAYS );
N := ROUND(DBMS_RANDOM.VALUE(1,2));
IF N = 1 THEN
V_ORDER_MODE := 'direct';
ELSE
V_ORDER_MODE := 'online';
END IF;
V_CUSTOMER_ID := ROUND(DBMS_RANDOM.VALUE(1,96));
V_ORDER_STATUS:= ROUND(DBMS_RANDOM.VALUE(1,10));
V_SALES_REP_ID:= ROUND(DBMS_RANDOM.VALUE(153,163));
INSERT INTO ORDERS
(ORDER_ID,ORDER_DATE,ORDER_MODE,CUSTOMER_ID,ORDER_STATUS,
ORDER_TOTAL,SALES_REP_ID)
VALUES
( V_ORDER_ID,
V_ORDER_DATE,
V_ORDER_MODE,
V_CUST_IDS(V_CUSTOMER_ID),
V_ORDER_STATUS,
0,
V_SALES_REP_ID);
Page 625 Oracle DBA Code Examples
V_ORDER_TOTAL := 0;
V_ITEMS_COUNT := ROUND(DBMS_RANDOM.VALUE(1,10));
M := 1;
FOR X IN 1..V_ITEMS_COUNT LOOP
V_PRODUCT_ID:= ROUND(DBMS_RANDOM.VALUE(1,275));
SELECT LIST_PRICE INTO V_PROD_PRICE
FROM PRODUCT_INFORMATION
WHERE PRODUCT_ID=V_PROD_IDS(V_PRODUCT_ID);
V_CHANGE_PRICE := ROUND(DBMS_RANDOM.VALUE(1,4));
-- discount (MAX 20%) may be given to 25% of entered items
IF V_CHANGE_PRICE=4 THEN
V_PROD_PRICE := ROUND(V_PROD_PRICE -
(ROUND(DBMS_RANDOM.VALUE(1,20))/100)*V_PROD_PRICE);
END IF;
V_QUANTITY:=ROUND(DBMS_RANDOM.VALUE(1,20));
V_ORDER_TOTAL := V_ORDER_TOTAL + V_QUANTITY*V_PROD_PRICE;
BEGIN
INSERT INTO
ORDER_ITEMS(ORDER_ID,LINE_ITEM_ID,PRODUCT_ID,UNIT_PRICE,QUANTITY)
VALUES(V_ORDER_ID,M,V_PROD_IDS(V_PRODUCT_ID),V_PROD_PRICE,V_QUANTITY );
M := M + 1 ;
EXCEPTION
WHEN OTHERS THEN
IF UPPER(SQLERRM) LIKE '%ORDER_ITEMS_UK%' THEN
NULL;
ELSE
RAISE;
END IF;
END ;
END LOOP; -- X loop
UPDATE ORDERS SET ORDER_TOTAL = V_ORDER_TOTAL WHERE ORDER_ID =
V_ORDER_ID;
IF MOD(I,100) = 0 THEN
COMMIT;
END IF;
END LOOP; -- I loop
COMMIT;
END INSERT_ORDERS;
PROCEDURE SpinCPUs (P_ITERATION IN NUMBER)
IS
N NUMBER;
BEGIN
FOR I IN 1.. P_ITERATION LOOP
-- pure CPU processing (no physical or logical read)
N := SQRT(ROUND(DBMS_RANDOM.VALUE(1,1000)));
-- DBMS_LOCK.SLEEP(round(DBMS_RANDOM.VALUE(0.01,0.05),2)); -- in seconds
END LOOP;
END SpinCPUs;
PROCEDURE RandomQuery(P_ITERATION IN NUMBER)
IS
V_START NUMBER;
V_END NUMBER;
N NUMBER;
BEGIN
V_END := G_MAX_ORDER_ID;
V_START := ROUND(DBMS_RANDOM.VALUE(G_MIN_ORDER_ID,G_MAX_ORDER_ID));
FOR I IN 1.. P_ITERATION LOOP
Page 626 Oracle DBA Code Examples
FOR R IN (SELECT O.ORDER_ID, O.ORDER_DATE, C.CUST_LAST_NAME,
O.ORDER_TOTAL
FROM ORDERS O , CUSTOMERS C
WHERE O.CUSTOMER_ID = C.CUSTOMER_ID
AND ORDER_ID BETWEEN V_START AND V_END) LOOP -- just retreive data
NULL;
END LOOP;
-- DBMS_LOCK.SLEEP(ROUND(DBMS_RANDOM.VALUE(0.01,3),2));
END LOOP;
END RandomQuery;
PROCEDURE RandomDML(P_ITERATION IN NUMBER)
IS
N NUMBER;
V_ORDER_ID NUMBER;
V_LINE_ITEM_ID NUMBER ;
V_MAX_ORDERI_ID NUMBER;
V_MIN_ORDERI_ID NUMBER;
V_PRICE NUMBER;
BEGIN
FOR I IN 1.. P_ITERATION LOOP
N := ROUND(DBMS_RANDOM.VALUE(1,3));
IF N=1 THEN
INSERT_ORDERS(1);
ELSIF N=2 THEN
-- pick up an item and modify its price
V_ORDER_ID := ROUND(DBMS_RANDOM.VALUE(G_MIN_ORDER_ID,G_MAX_ORDER_ID));
BEGIN
SELECT MAX(LINE_ITEM_ID), MIN(LINE_ITEM_ID)
INTO V_MAX_ORDERI_ID, V_MIN_ORDERI_ID
FROM ORDER_ITEMS WHERE ORDER_ID=V_ORDER_ID;
V_LINE_ITEM_ID :=
ROUND(DBMS_RANDOM.VALUE(V_MIN_ORDERI_ID,V_MAX_ORDERI_ID));
SELECT UNIT_PRICE INTO V_PRICE FROM ORDER_ITEMS
WHERE ORDER_ID=V_ORDER_ID AND LINE_ITEM_ID=V_LINE_ITEM_ID;
V_PRICE := V_ORDER_ID + (ROUND(DBMS_RANDOM.VALUE(-
20,20))/100)*V_ORDER_ID;
UPDATE ORDER_ITEMS SET UNIT_PRICE=V_PRICE
WHERE ORDER_ID=V_ORDER_ID AND LINE_ITEM_ID=V_LINE_ITEM_ID;
UPDATE ORDERS SET ORDER_TOTAL=ORDER_TOTAL+V_PRICE
WHERE ORDER_ID=V_ORDER_ID;
EXCEPTION
-- if order has no items
WHEN NO_DATA_FOUND THEN
NULL;
END;
ELSIF N=3 THEN
-- pick up an item to delete
V_ORDER_ID := ROUND(DBMS_RANDOM.VALUE(G_MIN_ORDER_ID,G_MAX_ORDER_ID));
SELECT MAX(LINE_ITEM_ID), MIN(LINE_ITEM_ID)
INTO V_MAX_ORDERI_ID, V_MIN_ORDERI_ID
FROM ORDER_ITEMS WHERE ORDER_ID=V_ORDER_ID;
V_LINE_ITEM_ID :=
ROUND(DBMS_RANDOM.VALUE(V_MIN_ORDERI_ID,V_MAX_ORDERI_ID));
DELETE ORDER_ITEMS WHERE ORDER_ID=V_ORDER_ID AND
LINE_ITEM_ID=V_LINE_ITEM_ID;
-- re-order the itmes in the order
DECLARE
CURSOR CR IS SELECT LINE_ITEM_ID FROM ORDER_ITEMS WHERE
Page 627 Oracle DBA Code Examples
ORDER_ID=V_ORDER_ID ORDER BY LINE_ITEM_ID FOR UPDATE;
BEGIN
N:=1;
FOR R IN CR LOOP
UPDATE ORDER_ITEMS SET LINE_ITEM_ID = N WHERE CURRENT OF CR;
N:=N+1;
END LOOP;
END ;
END IF;
-- DBMS_LOCK.SLEEP(ROUND(DBMS_RANDOM.VALUE(0.1,2),2));
COMMIT;
END LOOP;
END RandomDML;
Begin
INITIALIZE;
END load_generator;
/
-- initial data
exec load_generator.insert_orders(100000);
exec dbms_stats.gather_schema_stats('SA');
OS side: Unix
-- in a folder create the following scripts
mkdir ~/scripts
cd ~/scripts
mkdir load
cd load
-- (1) loadcpu1.sh
vi loadcpu.sh
#!/bin/bash
# apply CPU load on Oracle DB
# parameters: 1 connections, 2 Iterations
users=$1
SRVC="ora11gr2"
UNPW="sa/s"
SQLCMD="/home/oracle/scripts/load/loadcpu.sql"
x=1
y=$users
ITER=$2
while [ $x -le $y ]
do
sqlplus -s $UNPW@$SRVC @$SQLCMD $ITER &
x=`expr $x + 1`
done
-- (2) loadcpu.sql
vi loadcpu.sql
begin
sa.LOAD_GENERATOR.SpinCPUs(&1);
end;
/
exit
Page 628 Oracle DBA Code Examples
-- (3) loadquery.sh
vi loadquery.sh
#!/bin/bash
# apply random queries load on Oracle DB
# parameters: 1 connections, 2 Iterations, 3 rows in names
users=$1
SRVC="ora11gr2"
UNPW="sa/s"
SQLCMD="/home/oracle/scripts/load/loadquery.sql"
x=1
y=$users
ITER=$2
while [ $x -le $y ]
do
sqlplus -s $UNPW@$SRVC @$SQLCMD $ITER &
x=`expr $x + 1`
done
-- (4) loadquery.sql
vi loadquery.sql
begin
sa.LOAD_GENERATOR.RANDOMQUERY (&1);
end;
/
exit
-- (5) loaddml.sh
vi loaddml.sh
#!/bin/bash
# apply random DML load on Oracle DB
# parameters: 1 connections, 2 Iterations, 3 rows in names
users=$1
SRVC="ora11gr2"
UNPW="sa/s"
SQLCMD="/home/oracle/scripts/load/loaddml.sql"
x=1
y=$users
ITER=$2
while [ $x -le $y ]
do
sqlplus -s $UNPW@$SRVC @$SQLCMD $ITER &
x=`expr $x + 1`
done
-- (6) loaddml.sql
vi loaddml.sql
begin
sa.LOAD_GENERATOR.RANDOMDML(&1);
end;
/
exit
# make all sh files in current directory executables
for f in *.sh; do chmod 744 $f; done
Page 629 Oracle DBA Code Examples
OS side: Windows
-- in a folder create the following scripts
-- (1) loadcpu.bat
REM apply CPU load on Oracle DB
REM parameters: 1 connections, 2 Iterations
set users=%1
set SRVC=ora11g
set UNPW=sa/s
set SQLCMD=C:\TEMP\load\loadcpu.sql
set x=1
set y=%users%
set ITER=%2
for /L %%i in (1,1,%y%) do (start /d "E:\oracle\OraDB11g" sqlplus -S
%UNPW%@%SRVC% @%SQLCMD% %ITER%)
-- (2) loadcpu1.sql
begin
hrs.LOAD_GENERATOR.SpinCPU(&1);
end;
/
exit
-- (3) loadquery.bat
REM apply random queries load on Oracle DB
REM parameters: 1 connections, 2 Iterations
set users=%1
set SRVC=ora11g
set UNPW=sa/s
set SQLCMD=C:\TEMP\load\loadquery.sql
set x=1
set y=%users%
set ITER=%2
for /L %%i in (1,1,%y%) do (start /d "E:\oracle\OraDB11g" sqlplus -S
%UNPW%@%SRVC% @%SQLCMD% %ITER%)
-- (4) loadquery.sql
begin
hrs.LOAD_GENERATOR.RANDOMQUERY(&1);
end;
/
exit
-- (5) loaddml.bat
REM apply random DML load on Oracle DB
REM parameters: 1 connections, 2 Iterations, 3 rows in names
set users=%1
set SRVC=ora11g
set UNPW=sa/s
set SQLCMD=C:\TEMP\load\loaddml.sql
set x=1
Page 630 Oracle DBA Code Examples
set y=%users%
set ITER=%2
for /L %%i in (1,1,%y%) do (start /d "E:\oracle\OraDB11g" sqlplus -S
%UNPW%@%SRVC% @%SQLCMD% %ITER%)
-- (6) loaddml.sql
begin
sa.LOAD_GENERATOR.RANDOMDML (&1);
end;
/
exit
Usi ng t he Load Gener at or Scr i pt s
## Using the Load Generator #
# 5 connections 1000 iterations 100000 number of rows in NAMES table
# in Windows:
loadcpu 5 1000
loaddml 5 1000
# in Unix:
./loadcpu.sh 5 1000
Page 631 Oracle DBA Code Examples
SQL Usage Sampl es
Mer ge Command
/* Marge Command */
MERGE INTO products p /* Destination table
USING product_changes s /* Source table
ON (p.prod_id = s.prod_id) /* Search/join condition
WHEN MATCHED THEN UPDATE /* Update if join
SET p.prod_list_price = s.prod_new_price
WHERE p.prod_status <> 'EXPIRED' /* Conditional update
WHEN NOT MATCHED THEN
INSERT /* Insert if not join
SET p.prod_list_price = s.prod_new_price
WHERE s.prod_status <> 'EXPIRED' /* Conditional insert
-- using delete keyword with Merge command
-- only rows to update will be considered by the delete clause
MERGE INTO products p
USING product_changes s ON (p.prod_id = s.prod_id)
WHEN MATCHED THEN UPDATE
SET p.prod_list_price = s.prod_new_price,
p.prod_status = s.prod_new_status
DELETE WHERE (p.prod_status = 'OLD_ITEM') -- it part of update
WHEN NOT MATCHED THEN INSERT
(prod_id, prod_list_price, prod_status)
VALUES (s.prod_id, s.prod_new_price, s.prod_new_status);
Mul t i t abl e I nser t s
/* Multitable Inserts */
-- unconditional
INSERT ALL
INTO target1 VALUES (product_id, customer_id, sysdate, product_quantity)
INTO target2 VALUES (product_id,sysdate,product_price,product_discount)
SELECT s.product_id, s.customer_id, sysdate, s.product_quantity,
s.product_price, s.product_discount
FROM source s;
-- conditional ALL rows
-- a row can be on the two tables
INSERT ALL
WHEN product_id IN(SELECT product_id FROM primary) THEN
INTO target1 VALUES (product_id, customer_id, sysdate, product_quantity)
WHEN product_id IN (SELECT product_id FROM secondary) THEN
INTO target2 VALUES (product_id, sysdate, product_price, product_discount)
SELECT s.product_id, s.customer_id, sysdate, s.product_quantity,
s.product_price, s.product_discount
FROM source s;
-- conditional first rows
-- insert into table of first applied condition -> a row is in only one table
INSERT FIRST WHEN (sum_quantity_sold > 10 AND prod_weight_class < 5) AND
sum_quantity_sold >=1) OR (sum_quantity_sold > 5 AND prod_weight_class > 5)
Page 632 Oracle DBA Code Examples
THEN
INTO large_freight_shipping VALUES
(time_id, cust_id, prod_id, prod_weight_class, sum_quantity_sold)
WHEN sum_amount_sold > 1000 AND sum_quantity_sold >=1 THEN
INTO express_shipping VALUES
(time_id, cust_id, prod_id, prod_weight_class,
sum_amount_sold, sum_quantity_sold)
WHEN (sum_quantity_sold >=1) THEN INTO default_shipping VALUES
(time_id, cust_id, prod_id, sum_quantity_sold)
ELSE INTO incorrect_sales_order VALUES (time_id, cust_id, prod_id)
SELECT s.time_id, s.cust_id, s.prod_id, p.prod_weight_class,
SUM(amount_sold) AS sum_amount_sold,
SUM(quantity_sold) AS sum_quantity_sold
FROM sales s, products p
WHERE s.prod_id = p.prod_id AND s.time_id = TRUNC(SYSDATE)
GROUP BY s.time_id, s.cust_id, s.prod_id, p.prod_weight_class;
-- Mixed Conditional and Unconditional Insert
INSERT FIRST WHEN cust_credit_limit >= 4500 THEN
INTO customers_special VALUES (cust_id, cust_credit_limit)
ELSE INTO customers
SELECT * FROM customers_new;
Par al l el I nser t
/* Parallel loading into table */
-- must before the hint
ALTER SESSION ENABLE PARALLEL DML;
-- then use the hint
INSERT /*APPEND NOLOGGING PARALLEL */
INTO sales_data
SELECT product_id, customer_id, TRUNC(sales_date),
discount_rate, sales_quantity, sale_price
FROM sales_history;
-- if triggers are there, hint won't be used
Del et i ng Dupl i cat e Row s i n a Tabl e
-- delete duplicated rows in our_table based on col1, col2.. etc.
DELETE FROM our_table
WHERE rowid not in
(SELECT MIN(rowid)
FROM our_table
GROUP BY column1, column2, column3...) ;
Page 633 Oracle DBA Code Examples
Mor e DBA Scr i pt s
Compar e Tabl e Si zes i n Tw o Dat abases
-- compare tables in current db with same tables in other db
-- useful for checking after transferring too many tables
DECLARE
N NUMBER;
M NUMBER;
BEGIN
DBMS_OUTPUT.ENABLE(100000);
FOR S IN ( SELECT USERNAME FROM SCHEMA_NAMES WHERE USERNAME <>'MOL' ORDER BY
1) LOOP
FOR O in ( SELECT TABLE_NAME FROM DBA_TABLES@OLDORA11G WHERE OWNER =
S.USERNAME ) LOOP
BEGIN
N := 0;
M := 0;
EXECUTE IMMEDIATE 'SELECT COUNT(ROWID) FROM ' || S.USERNAME ||'."'||
O.TABLE_NAME || '"@OLDORA11G' INTO N;
EXECUTE IMMEDIATE 'SELECT COUNT(ROWID) FROM ' || S.USERNAME ||'."'||
O.TABLE_NAME || '"' INTO M;
IF M <> N THEN
DBMS_OUTPUT.PUT_LINE(S.USERNAME || CHR(9) || O.TABLE_NAME);
END IF;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(S.USERNAME || CHR(9) || O.TABLE_NAME);
RAISE;
END;
END LOOP;
END LOOP;
END;
/
Page 634 Oracle DBA Code Examples
Usi ng Li nux f or Or acl e
Ver i f yi ng t he Ker nel
# is of format: <Base>-<Errata>.<Mod><Type>
# Mod= Modifier (developer)
# Type: None: Uniprocessor, smp: SMP up to 16 GB, hugemem: SMP up to 64 GB
uname -r
2.6.9-42.0.0.0.1.ELsmp
# name of the release
cat /etc/enterprise-release
Check i ng f or a Tai nt ed Ker nel
Usually, t aint ed kernelt is not support ed by Oracle. Some except ions: OCFS ( 276450.1)
and EMC Powerpat h driver ( 284823. 1)
# 0: not tainted 1:tainted
cat /proc/sys/kernel/tainted
# to list the status of modules
lsmod
Suppor t ed Har dw ar e
Syst ems list ed in Red Hat sit e ( ht t ps: / / hardware. redhat .com) are support ed by Oracle
Linux.
Usi ng Or acl e Rel i nk Ut i l i t y
I f t he operat ing syst em or Oracle obj ect files change, t hen Oracle execut ables should be
relinked t o creat e updat ed execut ables properly int egrat ed wit h t he operat ing syst em.
I f ut ilit y ret urns not hing, t hen it means it successfully finished.
Relinking occurs aut omat ically when a pat ch set is inst alled, but must be performed
manually when:
o An OS upgrade has occurred
o A change has been made t o t he OS syst em libraries. This can occur during t he
applicat ion of an OS pat ch.
o A new inst allat ion failed during t he relinking phase.
o An individual Oracle pat ch has been applied. Explicit relink inst ruct ions are usually
eit her included in README or int egrat ed int o t he pat ch inst all script .
1. Verify whether ORACLE_HOME is correctly set.
2. Set LD_LIBRARY_PATH to include $ORACLE_HOME/lib.
3. Execute the appropriate relink command to relink the
appropriate binaries:
relink all: All Oracle executables
relink oracle Database executables
relink network: Listener, cman, names
Page 635 Oracle DBA Code Examples
relink oemagent: Intelligent Agent
relink utilities: SQL*Loader, tkprof, rman,
impdp, expdp, imp, exp
relink ctx: Oracle Text
Cer t i f i ed and Suppor t ed Fi l e Syst ems
I n Linux, Oracle cert ifies t hree file syst ems:
o ext 3
o Aut omat ic St orage Management (ASM)
o Oracle Clust er File Syst em/ Oracle Clust er File Syst em 2 ( OCFS2)
Ent er pr i se Li nux Runl evel s
Runlevel 0: Halt . I t is used t o shut down t he syst em.
Runlevel 1: Single- user ( maint enance) mode. Only root may log in.
Runlevel 2: Mult iuser mode, t ext - based console only
Runlevel 3: Mult iuser mode wit h net working
Runlevel 4: For cust om use
Runlevel 5: The default mode; mult iuser wit h net working and act ive X session
Runlevel 6: Reboot . This shut s everyt hing down and t hen st art s it back.
Booting to a Nondefault Runlevel
Enterprise Linux:
>you press [E] then scroll down to select the kernel
>press [E] again
>press the spacebar
>enter the runlevel you want to boot to
>then press [B]
# to print previous and current runlevels:
runlevel
Usi ng / et c/ or at ab Fi l e and dbst ar t Ut i l i t y
Y or N in / et c/ orat ab indicat es t o t he dbst art ut ilit y whet her t he dat abase should be brought
up at syst em boot t ime.
ASM and dat abase inst ances creat ed wit hout using DBCA will not appear in t he orat ab file.
You should manually add t hem:
+ASM:/u01/app/oracle/product/10.2.0/db_1:Y
orcl:/u01/app/oracle/product/10.2.0/db_1:Y
The dbstart script that is provided with 10.2.0.1.0 contains an error.
The Metalink note 336299.1 documents this issue. To solve this problem,
perform the following steps:
1. Edit $ORACLE_HOME/bin/dbstart
2. Go to line 78.
3. Replace the line with:
Page 636 Oracle DBA Code Examples
ORACLE_HOME_LISTNER=$ORACLE_HOME
4. Save the file and exit the editor.
5. Execute dbstart.
Aut omat i ng Jobs
Usi ng cr on
/* security */
Only users listed in the /etc/cron.allow file are allowed to use cron
Users listed in the /etc/cron.deny file cannot use cron.
If neither of these files exist, only the superuser can use cron.
/* Managing crontab files */
crontab used to install, deinstall or list the tables (crontabs).
-u user the user whose crontab is to be tweaked
-l display the current crontab file
-r remove the current crontab file
-e edit. After exit from the editor, the modified crontab will be installed
/* Using cron */
crontab format: <minute> <hour> <day> <month> <weekday> <cmd>
1.minute (from 0 to 59) or special keywords:
2.hour (from 0 to 23)
3.day of month (from 1 to 31)
4.month (from 1 to 12)
5.day of week (from 0 to 6) (0=Sunday)
Special keywords are:
@reboot Run once, at startup
@yearly Run once a year "0 0 1 1 *"
@annually (same as @yearly)
@monthly Run once a month "0 0 1 * *"
@weekly Run once a week "0 0 * * 0"
@daily Run once a day "0 0 * * *"
@midnight (same as @daily)
@hourly Run once an hour "0 * * * *"
If the administrator puts an executable script into one of the following
directories,
then cron runs the script at the appropriate interval:
/etc/cron.hourly
/etc/cron.daily
/etc/cron.weekly
/etc/cron.monthly
/* Mailing the crontab output */
By default cron saves the output in the user's mailbox on the local system.
But you can also configure crontab to forward all output to a real email
address:
crontab
MAILTO="yourname@yourdomain.com"
Page 637 Oracle DBA Code Examples
If want to receive only one cronjob's output in your mail,
make sure this package is installed:
aptitude install mailx
then change the cronjob like this:
*/10 * * * * /bin/execute/this/script.sh 2>&1 | mail -s "Cronjob ouput"
yourname@yourdomain
/* Examples */
>every Friday 1AM
0 1 * * 5 /bin/execute/this/script.sh
>14 minutes after 10 p.m. every Monday through Friday of every month
14 22 * * 1-5 su - oracle -c /usr/local/bin/backup.cmd >/dev/null 2>&1
>10 past after every hour on the 1st of every month
10 * 1 * * /bin/execute/this/script.sh
>every 10 minutes
0,10,20,30,40,50 * * * * /bin/execute/this/script.sh
*/10 * * * * /bin/execute/this/script.sh
>daily
@daily /bin/execute/this/script.sh
Usi ng anacr on
Most syst em cron j obs will run during t he night and will get done only if t he comput er is
swit ched on. The anacron mechanism on t he ot her hand assumes t hat t he comput er is not
running cont inuously. Aft er t he comput er is st art ed anacron will execut e j obs aft er a cert ain
delay.
anacron keeps t rack of t he day a given j ob has been execut ed. So t he short est period a j ob
can be execut ed is a day.
The anacron daemon is usually st art ed from an rc- script and will read an anacront ab which
has t he following format :
Period Delay Job-Identifier Command
The period is given in days, t he delay is in minut es, t he j ob- ident ifier can be any charact er
and t he command is usually of t he form run-parts /etc/cron.daily but can be any
command.
Example 9.4. Sample /etc/anacrontab
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
1 65 cron.daily run-parts /etc/cron.daily
7 70 cron.weekly run-parts /etc/cron.weekly
30 75 cron.monthly run-parts /etc/cron.monthly
Usi ng at command
The at command execut es a command once at a specified t ime.
By default at is rest rict ed t o t he root user. To override t his you must eit her have an empt y
/ et c/ at .deny or have a / et c/ at .allow wit h t he appropriat e names.
at j obs are saved in / var/ spool/ at /
Page 638 Oracle DBA Code Examples
at j obs are spooled in / var/ spool/ at /
at [time]
Where time can be expressed as:
now
now + 1 min
now + 1 hour
now + 1 day
3am + 2days
midnight
10:15 Apr 12
teatime
For complete list of valid time formats see /usr/share/doc/at-xxx/timespec
# execute the commands in the file
at -f myjobs.txt now + 1 hour
# list commands that are scheduled
at -l
atq
# remove a job
atrm <jobid>
Usi ng bat ch command
bat ch command execut es commands when syst em load average drops below 0. 8, or t he
value specified in t he invocat ion of at run.
batch [-V] [-q queue] [-f file] [-mv] [TIME]
Task Schedul er
There are GUI t ask schedulers available t hat are front ends for cron in bot h t he Gnome and
t he K( ommon) Deskt op Environment ( KDE) .
Conf i gur i ng Li nux Memor y f or Or acl e
32 bit Archit ect ure:
Wit h Linux 32-bit , Oracle is able t o use about 1. 7GB of address space for it s SGA. To
increase it , refere t o not ed 200266. 1. Be aware of t he consequenced limit at ions.
I n Red Hat Ent erprise Linux 3, 4 or 5 t he smp kernel can be used on syst ems wit h up t o 16
GB of RAM.
The hugemem kernel is required in order t o use all t he memory on syst ems t hat have more
t han 16GB of RAM up t o 64GB. However, it is recommend t o use t he hugemem kernel even
on syst ems t hat have 8GB of RAM.
I n Red Hat Ent erprise Linux 5, a 32 bit kernel is always a hugemem kernel so t here is no
need t o inst all a special kernel.
Usi ng Li nux Per f or mance Moni t or i ng Tool s
Not e: OS Wat cher uses most commonly used Linux t ools and st ore t heir out put in files. I t is a
nice frame work t o implement using t hose t ools. To learn more about using it , see Using OS
Wat cher.
Page 639 Oracle DBA Code Examples
About Li nux Tool s
top: useful for diagnosing CPU and I / O issues, t hough not as reliable for Oracle memory
issues. I ndividual process memory numbers should not be relied upon.
sar: report s syst em act ivit y including memory, I / O, and CPU usage.
sar samples t he / proc file syst em at 10-minut e int ervals and records t he dat a in / var/ log/ sa
as a sa# file where # is t he day of t he mont h. A full mont hs wort h of st at ist ics are ret ained
so t hat t he administ rat or can use sar t o view past st at ist ics as well as current . For example,
t o view t he CPU st at ist ics for t he 23rd of t he mont h:
sar u 2 4 f / var/ log/ sa/ sa29
- o [ < fnmae> ] save out put t o filename (default / var/ log/ sa/ sadd ) (cannot be used
wit h X)
- f [ < fnmae> ] read from filename ( default / var/ log/ sa/ sadd )
- X pid | SELF | ALL Report st at ist ics for t he child processes of t he process whose PI D is pid.
SELF st at ist ics of t he child processes of t he sar process it self
ALL st at ist ics of t he child processes of all t he syst em processes.
vmstat: act ivit y on processes, memory, paging, block I / O, t raps, and CPU act ivit y ( best for
memory)
iostat: disk act ivit y
Syst em Log Files: / var/ log/ message .. / syslog
free command displays t he t ot al amount of free and used physical and swap memory in
t he syst em, as well as t he shared memory and buffers used by t he kernel.
mpst at : report er on CPU st at ist ics.
Graphical Measurement Tools
Usi ng Li nux Tool s
/* CPU */
# how many CPUs
cat /proc/cpuinfo
# use top to see averae load (now, 5 minutes ago, and 10 minutes ago).
# load factor= load average/#CPUs
# if lf<1: no load on CPU,
# between 1 and 2: CPU running at capacity
# >2, CPU may be a bottleneck (use sar and vmstat to investigate)
# if you use "1" interactive command, you can see load per CPU
top
# CPU metrics
# all appended by <interval> <count>
vmstat
mpstat -P <CPU>|ALL
sar -u
# queue size: waiting for CPU
# (shouldn't be larger than CPU#)
sar -q
# display CPU stats only
iostat -c
# to know which session is consuming CPU
Page 640 Oracle DBA Code Examples
# get its PID from top
# then:
select pid, spid, pname, username, program
from v$process
where spid=20052;
select * from v$session
where paddr= ( select addr from v$process where spid=20304);
/* Memory */
# Total Memory
free -m, top, or cat /proc/meminfo
# higher "Pages In" indicate RAM shortage
top
free
cat /proc/meminfo
# paging info
sar -B
# memory metrics
sar -R
/* IO */
# storage vendors have their monitoring tools
# io activity by disk
# check avgrq-sz.await which gives the average wait time for requests
iostat -d
# by partition
iostat -p
# exetended output
iostat -d -x
# rtps/wtps requests per se
sar -d 2 10
# about overall io stats
vmstat
Check i ng Some Gener al Gui del i ne on Tr uni ng Or acl e i n Li nux
Use an appropriat ely sized dat abase block: general purpose: 8K, OLTP: 4K, DSS: 16K. Use a
larger block size if t he applicat ion has very large indexes ( 15> levels), or consider using
part it ioned indexes.
Use a larger redo log buffer t han default : for OLTP syst ems
Mult iprocessing ( SMP) machines.
Set t ing PRE_PAGE_SGA = t rue causes each server process t hat st art s t o t ouch every page
of t he SGA, t hus mapping all t he SGA pages t o physical memory. I t may slow down
connect ion t ime, t hough; so make sure you have enough free memory t o accomodat e all
SGA.
Use aut omat ic memory management .
Set t ing at ime off: I n Linux, by default , t he last t ime- read at t ribut e ( at ime) is updat ed every
t ime a file is read. For dat abase files, t his is not an import ant st at ist ic and you can t urn it
off t o reduce t he number of I / Os:
Page 641 Oracle DBA Code Examples
# This parameter can be set for a file with:
chattr +A <filename>
# for a directory with:
chattr -R +A <directory name>
# To make it persistent across reboots:
vi /etc/fstab file
/dev/hdb7 /u3/app/oracle/ ext3 rw,noatime 1 1
Tr oubl eshoot i ng Or acl e Dat abase i n Li nux
Usi ng OS Wat cher ( OSW)
OS Wat cher ( OSW) is a collect ion of UNI X shell script s int ended t o collect and archive
operat ing syst em and net work met rics t o aid support in diagnosing performance issues.
OSW operat es as a set of background processes on t he server and gat hers OS dat a on a
regular basis, invoking such Unix ut ilit ies as vmst at , net st at and iost at .
OSW will need access t o t he OS ut ilit ies: t op, vmst at , iost at , mpst at , net st at , and
t racerout e.
On RAC, you can inst all it in every node.
Aft er generat ing t he out put files, consider generat ing a profile from oswg ( next sect ion) .
Obt ain lat est version from Not e 301137. 1
/* Managing OSW */
# installing OSW (directory osw will be created):
tar xvf osw.tar
# Uninstalling OSW
rm -rf osw
# Setting up OSW for tracing private networks (RAC):
mv Exampleprivate.net private.net
# starting OSW
./startOSW.sh <interval in seconds> <hour# retention>
# to startup in background:
nohup ./startOSW.sh 30 12 &
# Stopping OSW
./stopOSW.sh
/* Diagnostic Data Output */
# archived files generated per hour with the following format:
<node_name>_<OS_utility>_YY.MM.DD.HH24.dat
# there are 3 entries for each timestamp. You should always ignore
# the first entry as this entry is always invalid. The second and
Page 642 Oracle DBA Code Examples
# third entry will be valid but the second entry will be 1 sec later
# than the timestamp and the third entry will be 2 seconds later than the
timestamp.
# oswiostat
# What to look for:
- Average service times greater than 20msec for long duration.
- High average wait times
r/s Shows the number of reads/second
w/s Shows the number of writes/second
kr/s Shows the number of kilobytes read/second
kw/s Shows the number of kilobytes written/second
wait Average number of transactions waiting for service (queue length)
actv Average number of transactions actively being serviced
wsvc_t Average service time in wait queue, in milliseconds
asvc_t Average service time of active transactions, in milliseconds
%w Percent of time there are transactions waiting for service
%b Percent of time the disk is busy
device Device name
# oswmpstat
What to look for
- Involuntary context switches (this is probably the more relevant statistic
when examining performance issues.)
- Number of times a CPU failed to obtain a mutex. Values consistently greater
than 200 per CPU causes system time to increase.
- xcal is very important, show processor migration
# oswnetstat
# the collisions should be 0.1 percent or less
Network collision rate = Output collision / Output packets
# Input Error Rate = Ierrs / Ipkts
If the input error rate is high (over 0.25 percent), the host is excessively
dropping packets.
# segment retransmission rate should be low
%segment-retrans=(tcpRetransSegs / tcpOutDataSegs) * 100
# oswprvtnet
check Interface is up and responding
# oswps
list of processes
# oswtop
# examine average load
# Large run queue
# A process which is "hogging" CPU is always suspect
# number of processes usually do not change over time
# oswvmstat
Page 643 Oracle DBA Code Examples
Usi ng OS Wat cher Gr aphs( OSWg)
Using OSWg
# to use Java shipped with Oracle
$ cd $ORACLE_HOME/jre/1.4.2/bin
export PATH=/u01/app/oracle/product/11.2.0/db_1/jdk/jre/bin:$PATH
# invoking the oswg:
java -jar oswg.jar -i /home/oracle/osw/archive
# if you see: java.lang.OutOfMemoryError,
# you may have to increase the size of the java heap:
$java -jar -Xmx512M oswg.jar -i /home/oracle/osw/archive
Note: to generate a profile, mkdir profile under osw home
# Using OSWg: Menu Option
java -jar OSWg.jar -i <fully qualified path name of an osw archive directory>
# other starting options:
java -jar OSWg.jar -i <fully qualified path name of an osw archive directory>
-P <name> -L <name> -6 -7 -8 -B <time> -E <time>
-B <start time> Same as option T from the menu. The start time will allow the
user to select a start time from within the archive of files to graph/profile.
This overrides the default start time which is the earliest time entry in the
archive directory. The format of the start time is Mon DD HH:MM:SS YYYY.
(Example :Jul 25 11:58:01 2007). An end time is required if selecting this
option.
-E <end time> Same as option T from the menu. The end time will allow the user
to select an end time from within the archive of files to graph/profile. This
overrides the default end time which is the latest time entry in the archive
directory. The format of the end time is Mon DD HH:MM:SS YYYY. (Example :Jul
25 11:58:01 2007). A start time is required if selecting this option.
Usi ng t he On- Boar d Moni t or ( LTOM)
LTOM is an embedded real- t ime dat a Collect ion and diagnost ics plat form developed by
Cent er of Expert ise in Oracle.
LTOMg is embedded in LTOM.
I t s reference is Not e 352363. 1.
Usage det ails are in README file.
Aut omat ic Hang Det ect ion
o it st art s collect ing st at isics about hanged sessions
o t o use it for RAC, inst all LTOM in a single node. ( Ot her feat ures require inst alling it in all
nodes)
o uses a rule based hang det ect ion algorit hm configured in
$TOM_HOME/ init / hangDet ect .propert ies
Syst em Profiler
o The Syst em Profiler provides t he abilit y t o cont inually collect dat a from bot h t he
operat ing syst em and oracle and provides an int egrat ed snapshot of t he overall healt h
of t he operat ing syst em t oget her wit h t he dat abase.
o Once t he dat a is collect ed, t he dat a can be parsed and analyzed t hrough LTOMg.
Page 644 Oracle DBA Code Examples
Aut omat ic Session Tracing
o Aut omat ic Session Tracing uses a set of rules t o det ermine when t o t urn on SQL t race
for individual oracle sessions, using event 10046 level 12 t race.
/* installing ltom */
# Running LTOM
# os user must be member of dba group
# db user required with full dba priv
tar -xf ltom420.tar
# the script creates "tom" user which can be dropped after installation
cd ltom/tom_base/install
# if default java cannot help, use Oracle's one (add it to .bash_profile)
export PATH=/u01/app/oracle/product/11.2.0/db_1/jdk/jre/bin:$PATH
./autoinstall.sh
# uninstall
rm -rf tom_base
/* TOOL USAGE */
# insertactive
export TOM_HOME=/home/oracle/ltom/tom_base/tom
cd /home/oracle/ltom/tom_base/tom
./startltom.sh
# in the background:
see the README file
# running ltomg
java -jar LTOMg.jar -i
/home/oracle/ltom/tom_base/tom/recordings/profile/pro1284214950770.log
java -jar -Xmx512M LTOMg.jar -i
/u02/home/ltom/recordings/profile/pro1190754096675.log
Usi ng st r ace
St race is a ut ilit y t hat int ercept s and records t he syst em calls, which are called by a
process, and t he signals, which are received by a process.
strace o /tmp/helloworld.out ./helloworld.sh
strace aef Ttt o /tmp/date.out date
strace p 1287 o /tmp/ora_pmon_orcl.out