Excerpt for Oracle DBA Concise Handbook by Saikat Basak, available in its entirety at Smashwords

Oracle DBA Concise Handbook






Oracle DBA Concise Handbook

Covers 9i to 11g





Saikat Basak










Published by Ensel Software

www.enselsoftware.com




© Saikat Basak




The author and publisher of this book have used their best efforts in preparing this book. These efforts include the development, research and testing of the theories and programs to determine their effectiveness. The author and publisher shall not be liable in any event for the incidental or consequential damages in connection with, or arising out of, the furnishing, performance, or use of these programs.


All rights reserved. No part of this book may be reproduced, in any form or by any means, without the permission in writing from the author.


1st Edition 2004

2nd Edition 2009 – updated for 10g & 11g


Last updated Jul 2010


Contents

Introduction 6

1 Oracle Server – an overview 7

1.1 Logical structure 7

1.2 Oracle memory structure 7

1.3 Background processes 9

1.4 Installing and managing Oracle database 12

1.5 Oracle Managed Files (OMF) 12

1.6 Creating a new database 12

1.7 Starting up database instance 15

1.8 Shutting down database instance 15

1.9 Control file 15

1.10 Redo log files 17

1.11 Table spaces 20

1.12 Segment and storage structures 23

1.13 Tables 24

1.14 Indexes 25

1.15 Constraints 27

1.16 Users and security 29

2 Backup and Recovery 32

2.1 Introduction 32

2.2 Backup and recovery in no archive log mode 32

2.3 Backup in archive log mode 32

2.4 User managed complete recovery 33

2.5 User managed incomplete recovery 34

2.6 Logical backup – export/import and Data Pump 34

2.7 SQL Loader 36

2.8 Networking fundamentals 37

2.9 Log Miner 39

2.10 Real Application Clusters (RAC) 42

2.11 Standby database (also Oracle Data Guard) 44

2.12 Replication 44

3 Performance Tuning 45

3.1 Tuning development and production systems 45

3.2 Sources of tuning information 45

3.3 Collecting statistics 46

3.4 Oracle supplied GUI tuning tools 47

3.5 SQL application tuning and design 47

3.6 Optimizer 49

3.7 Tuning shared pool 52

3.8 Tuning database buffer cache 54

3.9 Shared server 56

3.10 Large pool and Java pool 57

3.11 Tuning Redo 57

3.12 Tuning archiving operations 58

3.13 Tuning disk I/O 58

3.14 Tuning sorts 58

3.15 Tuning rollback segments 59

3.16 Locks 59

3.17 Tuning operating system 60

3.18 Automatic Workload Repository (AWR) 60

3.19 Automatic Database Diagnostic Monitor (ADDM) and SQL Tuning Advisor 60

4 SQL and PL/SQL 62

4.1 Compiling packages 62

4.2 Records and Tables 62

4.3 Cursor 62

4.4 Merge, multi – table insert and pivot insert 63

4.5 SQL Joins 64

4.6 Useful SQL functions 65

4.7 Dynamic PL/SQL 66

4.8 Nested table 67

4.9 Types of joins 68

4.10 External tables 70

5 DBMS Packages 71

5.1 DBMS_JOB 71

5.2 UTL_FILE 71

6 Useful scripts for DBAs 73

6.1 To show primary/foreign key relationships of all tables and views in a given schema 73

6.2 To see all objects in a table space file 73

6.3 Which user executing what type of command 74

6.4 Get output of a query to a text file from SQL Plus 74

6.5 To see size of your tables and indexes 74

6.6 To see free spaces in table spaces 74

7 New features of 10/11g 76

7.1 What is g in Oracle's grid computing? 79

7.2 What are Oracle Fusion Middleware (OFM) and Service Oriented Architecture (SOA)? 80

8 DBA interview questions 83

8.1 Open-ended questions 83

8.2 Technical questions 83

8.3 Questions you should ask 90

9 References 91

10 Oracle server’s diagrammatic overview 92

Introduction


There are several books available in the market for Oracle DBAs. So what is special about this book?


Well, the differences are several. First of all, this book is available in electronic format. You can carry this book wherever you want. It is written in simple Word format (PDF format is also available). So, you can open it in almost anywhere. This book is based on the commands necessary for regular DBA activities. This is a concise book. It attempts to be your first reference for DBA job. You will still require looking at Oracle manuals and other huge references for advanced commands and features. Please note that this book does not try to teach you how to be a DBA. It is assumed that you know a bit of DBA activities. It only acts as a DBA handbook.


I included a section on common DBA interview questions. Where do you find such information in other books? Some avid readers wanted the answers to be given along with. However, some questions are too easy. Some difficult answers/hints have been provided. But I don’t appreciate providing all answers because unless you have sound understanding of the concept, you can be very easy bogged down by some twists in the questions.


This is really a CONCISE handbook. That’s why I couldn’t cover every nuts and bolts of Oracle. Had I do so, this book would have consisted of more than 1000 pages and its charm would have been lost! Only the most basic aspects have been touched. So, please don’t yell that why such and such topics have been left. However, if readers strongly feel that some topics need to be added, I shall definitely honor that demand.


I shall occasionally update the book. So, please visit the website frequently to download latest version of the book.


Please note that originally I wrote this book for Oracle 9i and then updated for 11g.



1Oracle Server – an overview

1.1Logical structure





















Physical storage structures


Oracle database consists of 3 types of physical files –

  • Data files – contains all database data

  • Redo log files – record all changes made to data. Used for recovery

  • Control files – maintains information about physical structure of database


1.2Oracle memory structure


1.2.1SGA


System Global Area (SGA) is shared memory area. All users of database share information maintained in this area. The SGA and other background processes constitute an Oracle instance.


SGA size is limited by SGA_MAX_SIZE initialization parameter.


From 11g, Oracle can manage SGA and PGA completely automatically.

Shared memory





















From 11g, there are two new components in SGA viz Streams pool and Result cache.


Non-shared memory

PGA



Stack space

Session info

Sort area







The database buffer cache is the area of memory that caches database data, holding blocks from data files that have been read recently. Before a user can look at a piece of information in an Oracle database, it must first reside in the database buffer cache. Data gets into this cache based upon the Most Recently Used algorithm. Because the most recently and most frequently used data is kept in memory, less disk I/O is necessary, and overall database performance is improved.



There are 3 types of buffers – dirty, free and pinned.


Oracle uses an LRU mechanism to remove data from DB cache.


DB_CACHE_SIZE, DB_KEEP_CACHE_SIZE, DB_RECYCLE_CACHE_SIZE determines DB cache size.


DB_CACHE_ADVICE can be set to ON/OFF/READY and the result can be viewed from V$DB_CACHE_ADVICE.


Redo log buffer is a circular buffer in SGA that holds information about changes made to data.


LOG_BUFFER determines its size.


1.2.2Shared pool


Library cache contains shared SQL area, PL/SQL procedures and packages etc. It is used for maintaining recently executed SQL commands and their execution plans.


Data dictionary cache is a collection of database tables and views containing metadata about the database, its structures, its privilege and its users. Oracle accesses data dictionary frequently during parsing of SQL statements. Data dictionary cache holds most recently used data dictionary information.


SHARED_POOL_SIZE determines size of shared pool and can be dynamically altered.


PGA contains data and information for single server process. PGA_AGGREGATE_TARGET specifies total amount of memory that can be used by all server processes.


1.3Background processes


1.3.1Database Writer (DBWn)


Oracle marks buffers in memory as dirty when the data they contain is changed. DBWn writes content of dirty buffer to data file when – a server process can’t find a clean buffer after searching set threshold of buffers, a checkpoint occurs, change table space to read only/offline/backup mode, drop/truncate table etc.


1.3.2Log Writer (LGWR)


It is responsible to redo log buffer management. Almost all activities against the database are tracked in the online redo logs. As transaction are initiated and eventually committed or rolled back, a record of this activity is written to these log files.


Log writer writes to redo logs sequentially.


1.3.3Checkpoint (CKPT)


Helps to reduce time required for instance recovery. A checkpoint is an event that flushes modified data from buffer cache to disk and updates control file and data files. The CKPT process updates header of data files and control files and DBWn writes actual blocks to file. Checkpoint occurs automatically when an online redo log file fills (log switch).


1.3.4System Monitor (SMON)


At startup, SMON’s job is to ensure that all the database files are consistent and perform recovery if required. There is also an assortment of other cleanup activities that may need to be done, which are SMON’s responsibility. The SMON process by itself checks every so often to see whether there are any tasks waiting for its attention.


1.3.5Process Monitor (PMON)


Cleans up failed user processes and frees all resources used by failed process.


1.3.6Archiver (ARCn)


It automatically saves copies of redo logs in a DBA specified storage location when media recovery is enabled.


1.3.7Recover (RECO)


Is used with distributed transaction to resolve failure.


1.3.8Lock (LCKn)


It is used in RAC.


1.3.9Dispatcher (Dnnn) & Shared Server (Snnn)


These are discussed later.


1.3.10Manageability monitor (MMON)


From 10g, it makes snapshots of the database’s health (statistics) and stores this information in the automatic workload repository.


1.3.11Processing SQL


The following steps show how Oracle processes SQL


  1. Statement is passed to Oracle for processing

  2. Before it is placed in the library cache, a hash value is computed that represent s a number of characteristics of the SQL.

  3. Oracle compares the computed hash value against those values in a hash table where it maintains for SQL statements already in the cache.

  4. If a match is found, the new SQL statement is thrown away and the one sitting in the cache is executed on its behalf.

  5. In no match is found, further processing is done on the new SQL statement, an entry is made in the library cache hash table for newly arrived code, and it is placed in the library cache.

  6. There are 3 stages of SQL processing – parse, execute and fetch

    • During parsing, Oracle server checks the syntax and validates table, column names against data dictionary

    • Determines whether user has privilege to execute the statement

    • Determines optimal execution plans for statement

    • Finds a shared SQL area for the statement

    • In execution stage, for UPDATE and DELETE statement, Oracle locks the affected rows, looks for data blocks in DB buffer cache, if found, executes becomes faster, if not then Oracle has to read from physical data files to buffer cache. For SELECT and INSERT statements, locking is not necessary.

    • During fetch operation, rows are fetched to user process.


An Oracle instance consists of memory structures (SGA) and background processes (DBWn, LGWR, CKPT, SMON, PMON, MMON and optionally ARCn, Dnnn, Snnn etc.)







1.4Installing and managing Oracle database


To use operating system authentication, set REMOTE_LOGIN_PASSWORDFILE parameter to NONE (default).


OS authenticated users can connect as CONNECT / AS SYSDBA (or SYSOPER).


When using password file authentication, users connect to database by specifying username and password.


  1. Using ORAPWD utility, create a password file with SYS password.

  2. Set REMOTE_LOGIN_PASSWORDFILE parameter.

  3. Grant appropriate users SYSDBA or SYSOPER privilege.


1.5Oracle Managed Files (OMF)


Set following parameters in initialization file.


DB_CREATE_FILE_DEST – default location of new datafiles

DB_CREATE_ONLINE_LOG_DEST_n – specifies location for online log files and control files (max. 5 locations)


To create database using OMF, use


CREATE DATABASE MYDB DEFAULT TEMPORARY TABLESPACE TMP;


1.6Creating a new database


Usually when you install Oracle, it automatically creates a database for you (though you need to specify a database name for this). Otherwise, you usually use graphical Database Configuration Assistant (DBCA) to create/manage databases. So, you may not even require creating a database from command prompt. However, in case you need to, the steps are shown below.


In OS command prompt, use


ORADIM -NEW -SID sid_name -INTPWD sys_password -MAXUSERS 10


In Windows, go to Control Panel – Services

Check service named OracleServiceSID started.


In My Computer, Environment tab, define

ORACLE_SID=sid_name


Create folders where you want to keep database files eg. F:\MYDB\DATAFILES, UDUMP, BDUMP, CDUMP, LOGS, ARCHIVE etc.


Create a new initSID.ora file with relevant parameters


BACKGROUND_DUMP_DEST=F:\MYDB\BDUMP

CORE_DUMP_DEST=F:\MYDB\CDUMP

USER_DUMP_DEST=F:\MYDB\UDUMP

DB_NAME= sid_name

INSTANCE_NAME= sid_name

UNDO_MANAGEMENT=AUTO

UNDO_TABLESPACE=UNDO01


Start SQL Plus

/ AS SYSDBA


STARTUP NOMOUNT


CREATE DATABASE MYDB

MAXDATAFILES 30

MAXLOGFILES 10

MAXLOGMEMBERS 5

MAXINSTANCES 1

MAXLOGHISTORY 1

DATAFILE 'F:\MYDB\DATAFILES\SYSTEM01.DBF' SIZE 100M

LOGFILE

GROUP 1 'F:\MYDB\LOG\LOG01.DBF' SIZE 10M,

GROUP 2 'F:\MYDB\LOG\LOG02.DBF' SIZE 10M

UNDO TABLESPACE UNDO01

DATAFILE 'F:\MYDB\UNDO\UNDO01.DBF' SIZE 50M

DEFAULT TEMPORARY TABLESPACE TEMP

TEMPFILE 'F:\MYDB\TEMP\TEMP01.DBF' SIZE 10M

CHARACTER SET WE8MSWIN1252

/


CREATE SPFILE FROM PFILE;


Note: Above command was for Oracle 9i. From 10g, you need Sysaux table space as well.


Now run calalog.sql (creates data dictionary views) and catproc.sql (creates PL/SQL packages) from $ORACLE_HOME\RDBMS\ADMIN


After installing Oracle, several services are registered in the server computer. In Windows, (for Oracle 9.2) following services must be started as a minimum to run Oracle – OracleOraHome92Agent, OracleOraHome92TNSListener and OracleServiceSID (where SID is the name of database you created).


In Windows Vista running Oracle 11g, I usually start/stop my test database via following batch file (say StartOracle.bat – MYDB is name of my database)


net start OracleServiceMYDB

net start OracleOraDb11g_home1TNSListener

net start OracleVssWriterMYDB

net start OracleDBConsoleMYDB


To stop database services, you can create a similar batch file by replacing start with stop. In Vista, you need to run these batch files as administrator.


If you do not start OracleDBConsole<SID> service, then you won’t be able to start web based Enterprise Manager – which you usually start from https://localhost:1158/em (where localhost may be substituted for your computer name)


You usually log on to Oracle server from “SQL Plus” as – SYS/PASSWORD@DATABASENAME AS SYSDBA. Sometimes you can also log in as simply “/ AS SYSDBA” only when you are physically in the same computer where Oracle server is installed. Please note that Server Manager tool is no longer available from Oracle 9i onwards. You can do everything using SQL Plus!


For various day-to-day database works, you may find SQL Plus cumbersome to work with. For this, several 3rd party GUI tools are available. Two most popular tools are – PL/SQL Developers and TOAD. From 11g, Windows SQL Plus has been replaced by SQL Developer suite bundled with 11g. DOS version of SQL Plus is still available though!


1.7Starting up database instance


SQL> STARTUP NOMOUNT

This state is used for creating new database or creating new control file. At this state, Oracle allocates SGA and starts background processes.


SQL> STARTUP MOUNT

This state is used for performing specific maintenance operations like renaming data files, enabling/disabling archive log mode, adding/dropping/renaming redo log files, recovering database etc. Control file is read at this stage but the data files are not open.


SQL> STARTUP OPEN or simply SQL>STARTUP

Database is available for normal operations.


NB: Oracle 11g requires at least 1 GB of RAM and 5 GB disk space to install. For an operational production database, more RAM and disk space are required.


1.8Shutting down database instance


SQL> SHUTDOWN NORMAL or simply SQL> SHUTDOWN

Waits for all database users to disconnect then closes database.


SQL> SHUTDOWN IMMEDIATE

Terminates all user connections, rolls back uncommitted transactions, closes database.


SQL> SHUTDOWN TRANSACTIONAL

Waits for all transactions to commit or roll back, then closes database.


SQL> SHUTDOWN ABORT

Immediately closes database leaving it in inconsistent state. SMON automatically performs instance recovery during next startup.


1.9Control file


Control file contains –

  • Database name

  • Database creation timestamp

  • Data files – name, location, on/off line status

  • Redo log files – name, location

  • Redo log archive information

  • Table space names

  • Current log sequence number

  • Most recent checkpoint information

  • Begin and end of undo segments

  • RMAN backup information


Oracle backs up control file after any structural changes in database. LGWR updates control file with current log sequence number. CKPT updates control file with recent checkpoint information. ARCn updates with archiving information.


1.9.1Multiplexing control files


Using init.ora


CONTROL_FILES =

(‘/ora/oradata/mydb/control1.ctl’, ‘/ora/oradata/mydb/control1.ctl’)


Using spfile


  1. SQL> ALTER SYSTEM SET CONTROL_FILES = (‘/ora/oradata/mydb/control1.ctl’, ‘/ora/oradata/mydb/control1.ctl’) SCOPE=SPFILE


  1. SQL>SHUTDOWN NORMAL

  2. Copy control file to new location

  3. SQL>STARTUP


To create OMF control files, don’t specify CONTROL_FILES parameter in initialization file; rather specify DB_CREATE_ONLINE_LOG_DEST_n parameter n times starting with 1.


1.9.2Creating new control file


Make sure you have complete list of all data and log files.


In SQL Plus, write (the database should be in STARTUP NOMOUNT)


CREATE CONTROLFILE SET DATABASE “MYDB”

NORESTLOGS NOARCHIVELOG

MAXDATAFILES 30

MAXLOGFILES 10

MAXLOGMEMBERS 5

MAXINSTANCES 1

MAXLOGHISTORY 1

DATAFILE

'F:\MYDB\DATAFILES\SYSTEM01.DBF'

'F:\MYDB\DATAFILES\USERS01.DBF'

'F:\MYDB\DATAFILES\UNDO01.DBF'

'F:\MYDB\DATAFILES\TEMP01.DBF'

LOGFILE

GROUP 1 'F:\MYDB\LOG\LOG01.DBF' SIZE 10M,

GROUP 2 'F:\MYDB\LOG\LOG02.DBF' SIZE 10M

/


To back up control file when database is running, use


ALTER DATABASE BACKUP CONTROLFILE TO filename REUSE

Or

ALTER DATABASE BACKUP CONTROLFILE TO TRACE – it places a text copy of control file to USER_DUMP_DEST directory.


If Oracle can’t update control file, instance crashes.


1.9.3Control file related data dictionary views


V$CONTROLFILE

V$CONTROLFILE_RECORD_SECTION


1.10 Redo log files


Redo entries record data changes that can be used to reconstruct all changes made to database. Whenever you do any change to database (DML or DDL), it is recorded in redo logs.


To operate successfully, an Oracle instance requires at least 2 redo log groups. Each group must have at least 1 redo log file.


Usually in production databases, there are at least 3 redo log groups and each group has at least 2 redo log members. Note that, all member files under same group are identical. Members are multiple copies to protect against data loss in case of disk failure.
































If LGWR can write to at least 1 member of the group, database functions normally, but otherwise Oracle shuts down the instance.


1.10.1Creating new groups and members


ALTER DATABASE ADD LOGFILE GROUP 3 (‘/oracle/oradata/log/redo31.log’, ‘/oracle/oradata/log/redo32.log’) SIZE 10M


ALTER DATABASE ADD LOGFILE MEMBER

‘/oracle/oradata/log/redo31.log’ TO GROUP 3


For OMF

ALTER DATABASE ADD LOGFILE


1.10.2Renaming log members


Follow these steps

  • Shutdown database

  • Copy/rename redo log file member to new location

  • SQL> STARTUP MOUNT

  • ALTER DATABASE RENAME FILE old redo log file TO new redo log file

  • ALTER DATABASE OPEN

  • Backup control file


1.10.3Dropping redo log file


First, make the log file inactive, if necessary, issue ALTER SYSTEM SWITCH LOGFILE


ALTER DATABASE DROP LOGFILE GROUP 3


ALTER DATABASE DROP LOGFILE MEMBER ‘/oracle/oradata/log/redo31.log’


1.10.4Running database in archive log mode


Specify LOG_ARCHIVE_DEST_n parameters in initialization file.


E.g. LOG_ARCHIVE_DEST_1 = ((LOCATION = ‘/oradata/mydb/archive1’) MANDATORY REOPEN = 60)


In 11g, to enable database archive log mode, define archive location like this

ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=C:\Oracle11g\oradata\MYDB\archivelog' SCOPE=SPFILE; (in mount state)


LOG_ARCHIVE_FORMAT = ‘arch_%t_%s’


%s – log sequence number

%S – log sequence number, zero filled

%t – thread number

%T – thread number, zero filled


To enable/disable archive log mode, follow these steps


  • Shutdown database (log in via conn / as sysdba)

  • Startup and mount database

  • SQL> ALTER DATABASE ARCHIVELOG (use NOARCHIVELOG to disable)

  • SQL> ALTER DATABASE OPEN


Till 9i, in the initialization file, set LOG_ARCHIVE_START = TRUE (if it is not set, once a redo log file is full, Oracle hangs until redo log file is archived). From 10g, this parameter is deprecated.


To manually initiate automatic archiving, issue ALTER SYSTEM ARCHIVE LOG START and ALTER SYSTEM SWITCH LOGFILE commands.


To see whether database is in archive log mode, use


SQL> ARCHIVE LOG LIST


1.10.5Redo log related data dictionary views


V$LOG – shows redo log status

V$LOGFILE – shows redo log files’ location

V$THREAD

V$LOG_HISTORY

V$ARCHIVED_LOG

V$ARCHIVE_DEST

V$ARCHIVE_PROCESSES


1.11 Table spaces


The database’s data is stored logically in table spaces and physically in data files corresponding to the table spaces. One table space can have multiple data file but one data file must belong to only one table space. A single object (say a table) may span multiple data files but must reside within a single table space.


1.11.1Creating table space


CREATE TABLESPACE supermarket DATAFILE 'e:\oracle\oradata\mdb\supermarket.dbf' SIZE 30M

EXTENT MANAGEMENT LOCAL AUTOALLOCATE SEGMENT SPACE MANAGEMENT AUTO


CREATE TABLESPACE supermarket DATAFILE 'e:\oracle\oradata\mdb\supermarket.dbf' SIZE 30M

AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED


1.11.2Dropping table space


DROP TABLESPACE supermarket INCLUDING CONTENTS AND DATAFILES


1.11.3Renaming table space


From Oracle 10g onwards, you can rename a table space (except System and Sysaux)


ALTER TABLESPACE old_name RENAME TO new_name


When you rename a table space, all corresponding data dictionary entries are updated.


1.11.4Availability of table space


ALTER TABLESPACE supermarket OFFLINE NORMAL/TEMORARY/IMMEDIATE/FOR RECOVER


You can’t place System table space in offline mode.


To make a table space read only,

ALTER TABLESPACE supermarket READ ONLY


To change it to read write mode,

ALTER TABLESPACE supermarket READ WRITE


1.11.5Adding space to table space


ALTER TABLESPACE supermarket_DATA ADD DATAFILE 'c:\oracle\oradata\mydb\supermarket_data2.dbf' SIZE 30M


ALTER DATABASE DATAFILE 'c:\oracle\oradata\mydb\supermarket_data2.dbf' RESIZE 300M


1.11.6Table space related data dictionary views


DBA_TABLESPACES – all table space information

V$_TABLESPACE

DBA_FREE_SPACE

V$SORT_USAGE

DBA_SEGMENTS

DBA_USERS – shows default and temporary table space for users


1.11.7Renaming and relocating file


Follow these steps to rename data file (for single table space except System table space)



  • ALTER TABLESPACE supermarket OFFLINE

  • Copy or move the file to new location with OS commands

  • ALTER DATABASE RENAME FILE 'c:\oracle\oradata\mydb\supermarket_data2.dbf' TO

'c:\oracle\oradata\mydb\supermarket_new.dbf'

or

ALTER TABLESPACE supermarket RENAME DATAFILE 'c:\oracle\oradata\mydb\supermarket_data2.dbf' TO

'c:\oracle\oradata\mydb\supermarket_new.dbf'

  • ALTER TABLESPACE supermarket ONLINE


In case of System table space or table spaces with multiple data files


  • Shutdown database

  • Copy or move the file to new location with OS commands

  • Startup database in mount state

  • ALTER DATABASE RENAME FILE 'c:\oracle\oradata\mydb\supermarket_data2.dbf' TO

'c:\oracle\oradata\mydb\supermarket_new.dbf'

  • Open database


Please note in case of Windows, the file may get locked unless database is shutdown.


1.11.8Data file related data dictionary views


V$DATAFILE

V$TEMPFILE

DBA_DATA_FILES

DBA_TEMP_FILES


1.12 Segment and storage structures



PCTFREE = specifies what percentage of block should be allocated as free space for future updates (default 10)

PCTUSED = specifies when the block can be considered for adding new rows (default 40)

PCTFREE + PCTUSED <= 100


Blocks are smallest logical unit of storage in Oracle database.

An extent is logical storage unit made of contiguous data blocks.

Segment is logical storage unit made up of one or more extents.


Types of segments are – table, table partition, cluster, nested table, index, index organized table, index partition, temporary, LOB, undo, bootstrap.


1.12.1Undo segment


When a user performs an update or deletes operation, the earlier data is saved to undo segments and then actual data is modified to new value. In case of insert operation, rowid of new rows are stored in undo segments.


Undo data is not deleted immediately after commit or rollback. How long it will stay in undo segment depends on UNDO_RETENTION parameter in initialization file.


When a transaction is rolled back, Oracle restores the earlier data from undo segments.


From Oracle 9i, undo management can be automatically controlled.


To use automatic undo management, set following parameters in initialization file.


UNDO_MANAGEMENT=AUTO

UNDO_TABLESPACE=table space name


1.12.2Creating undo segment


CREATE UNDO TABLESPACE undo DATAFILE ‘/oradata/mydb/undo01.dbf’ SIZE 20M


To specify different table space as undo table space dynamically – issue

ALTER SYSTEM SET UNDO_TABLESPACE=undo02


1.12.3Extent or segment related data dictionary views


DBA_EXTENTS

DBA_FREE_SPACE

DBA_SEGMENTS

V$SORT_SEGMENT


DBA_ROLLBACK_SEGS

V$ROLLNAME

V$ROLLSTAT

V$UNDOSTAT


1.13 Tables

1.13.1Creating tables


Create table MANUFACTURER

(

MFDNO NUMBER not null,

MFDNAME VARCHAR2(200) not null,

ADDRESS VARCHAR2(200),

CITY VARCHAR2(50),

STATE CHAR(2),

COUNTRY VARCHAR2(100),

POSTCODE VARCHAR2(10),

PHONE VARCHAR2(50),

EMAIL VARCHAR2(100),

USERNAME VARCHAR2(20) default USER,

DATESTAMP DATE default SYSDATE

) tablespace SUPERMARKET_DATA


CREATE TABLE MANUFACTURER

NOLOGGING PARALLEL

AS

SELECT * FROM COMPANY


1.13.2Reorganizing tables


To move a table to a different table space


ALTER TABLE product MOVE TABLESPACE supermarket


1.13.3Dropping a table


DROP TABLE schema.table_name (CASCADE CONSTRAINTS)


TRUNCATE TABLE table_name


Truncate resets HWM where delete does not.

Truncate is not logged but delete is logged.


1.13.4Modifying columns


ALTER TABLE schema.table_name DROP COLUMN column_name (CASCADE CONSTRAINTS)


ALTER TABLE schema.table_name SET UNUSED COLUMN column1_name, column2_name (CASCADE CONSTRAINTS)


ALTER TABLE product ADD Mfd VARCHAR2(30) DEFAULT ‘abc’


1.13.5Table related data dictionary views


DBA_TABLES

DBA_TAB_COLUMNS – all columns of all tables


1.14 Indexes


Oracle has mainly 2 types of indexes, B+ Tree and Bitmap.


1.14.1Creating index


Normal B tree index


CREATE INDEX index_name ON table_name (column_names)

TABLESPACE app_indx


Bitmap index


CREATE BITMAP INDEX emp_gender_idx ON employee (sex) TABLESPACE app_indx


Reverse key index


CREATE INDEX index_name ON table_name (column_names)

REVERSE


Function based index


CREATE INDEX index_name ON UPPER(product (prodname))


To use function based index, set following parameters in initialization file

QUERY_REWRITE_ENABLED=TRUE

QUERY_REWRITE_INTEGRITY=TRUSTED


Cost based optimizer must be used.


1.14.2Index Oraganized Table (IOT)


Create the table normally, with ORGANIZATION INDEX keyword. It is suitable when data access is mostly thru primary key. In IOT, rows are physically stored in sorted order of the primary key.


Create table MANUFACTURER

(

MFDNO NUMBER not null,

MFDNAME VARCHAR2(200) not null,

ADDRESS VARCHAR2(200),

CITY VARCHAR2(50),

STATE CHAR(2),

COUNTRY VARCHAR2(100),

POSTCODE VARCHAR2(10),

PHONE VARCHAR2(50),

EMAIL VARCHAR2(100),

USERNAME VARCHAR2(20) default USER,

DATESTAMP DATE default SYSDATE

) tablespace SUPERMARKET_DATA

ORAGANIZATION INDEX

OVERFLOW TABLESPACE ovfl_tblsp

INCLUDING address

PCTTHRESHOLD 25

MAPPING TABLE


1.14.3Rebuilding index


ALTER INDEX pk_customer REBUILD ONLINE


DROP INDEX pk_customer


You can also move index to a different table space using ALTER INDEX index_name TABLESPACE new_table_space command.


1.14.4Monitoring index usage


ALTER INDEX index MONITORING USAGE


The V$OBJECT_USAGE view populated with index usage information.


ALTER INDEX index NOMONITORING USAGE

1.14.5Index related data dictionary views


DBA_INDEXES

DBA_IND_COLUMNS


1.15 Constraints


Types of constraints – not null, check, unique, primary key, foreign key


ALTER TABLE table MODIFY column NOT NULL

ALTER TABLE table MODIFY column NULL


ALTER/CREATE TABLE table (….)

CONSTRAINT ck_bonus check ( bonus > 0 )


ALTER TABLE table ADD CONSTRAINT ck_bonus check ( bonus > 0 )


CREATE TABLE product (….)

CONSTRAINT pk_prodcode PRIMARY KEY (prodcode)


ALTER TABLE product ADD CONSTRAINT pk_prodcode PRIMARY KEY (prodcode)


ALTER TABLE product ADD CONSTRAINT fk_mfd FOREIGN KEY (mfdby) REFERENCES manufacturer(mfdno) ON DELETE CASCADE


Constraints created are enabled by default. You can create it as disabled by using DISABLED keyword at end of command.


ALTER TABLE table DROP CONSTRAINT constraint

ALTER TABLE table DROP PRIMARY KEY CASCADE


1.15.1Enabling/disabling constraints


ALTER TABLE table DISABLE CONSTRAINT constraint

ALTER TABLE table ENABLE CONSTRAINT constraint


ALTER TABLE table MODIFY CONSTRAINT constraint ENABLE

ALTER TABLE table MODIFY CONSTRAINT constraint DISABLE


1.15.2Validated constraints


Enable validate – default, existing rows and future rows are checked

Enable novalidate – existing rows not checked but future rows are checked

Disable validate – existing rows checked but future rows are not checked (no DML is allowed on table)

Disable novalidate – no check done on existing or future rows


ALTER TABLE table MODIFY CONSTRAINT constraint ENABLE NOVALIDATE


1.15.3Deferring constraints


If constraint is created with DEFERABLE clause, you can define whether constraint checking will be done immediately (INITIALLY IMMEDIATE, default) or later (INITIALLY DEFEREED).


ALTER TABLE name MODIFY CONSTRAINT cons_name INITALLY DEFFERED (or IMMEDIATE)


1.15.4Index related data dictionary views


DBA_CONSTRAINTS

DBA_CONS_COLUMNS


1.16 Users and security


1.16.1Profile


Profiles are used to control database resource usage. DEFAULT profile is created at creation time of database. To enforce resource limit, RESOURCE_LIMIT=TRUE should be set in initialization file.


CREATE PROFILE OFFICE_USER LIMIT

SESSIONS_PER_USER 6

CONNECT_TIME 1440

IDLE_TIME 120

FAILED_LOGIN_ATTEMTS 3

PASSWORD_LOCK_TIME UNLIMITED


ALTER USER clerk PROFILE office_user


1.16.2Users


CREATE USER MKM

IDENTIFIED BY MKM

DEFAULT TABLESPACE SUPERMARKET_DATA

TEMPORARY TABLESPACE TEMP

QUOTA UNLIMITED ON SUPERMARKET_DATA

PROFILE DEFAULT


GRANT CONNECT, RESOURCE, SELECT_CATALOG_ROLE, EXECUTE_CATALOG_ROLE TO MKM


DROP USER mkm CASCADE


1.16.3Privilege


Privileges control what users can or can’t do in database.


Object privilege – provides permission to access schema objects. Granted for specific objects.


GRANT SELECT, UPDATE ON product, price TO clerk (WITH GRANT OPTION)


System privilege – provide right to perform structural change in database level.


GRANT CREATE ANY TABLE TO john (WITH ADMIN OPTION)


REVOKE CREATE ANY TABLE FROM john


For object privileges, both grantor and grantee information is stored in data dictionary; where as for system privilege, only grantee information is stored.


1.16.4Roles


A role is named set of privileges.


CREATE ROLE CLERK

GRANT SELECT, INSERT, UPDATE ON TRANSACTION TO CLERK

ALTER USER john DEFAULT ROLE CLERK (NONE)

1.16.5User related data dictionary views


DBA_USERS

DBA_TS_QUOTA – space assigned to users

V$SESSION – users currently connected to database


DBA_TAB_PRIVS

DBA_COL_PRIVS

DBA_SYS_PRIVS

SESSION_PRIVS


DBA_ROLES

DBA_ROLES_PRIVS

ROLE_ROLE_PRIVS




2Backup and Recovery


2.1Introduction


When instances crashes for any reason (e.g. Power failure) Oracle automatically recovers when database starts next time.


The most important decision you need to take for backup is to decide whether the database will run in archive or no archive log mode. Usually production databases always run in archive log mode.


Ideally, each member of archive log groups should reside in different physical disks so that if one disk gets corrupt, identical copies can be retrieved from another disk.


Backup can be either user managed (copying files with OS commands) or server managed (RMAN – Recovery Manager based). If you use RMAN, you can have incremental backups (i.e. backing up only changed blocks since last backup). RMAN is not discussed in this book.


2.2Backup and recovery in no archive log mode


When the database is running in no archive log mode, only cold back up can be taken. The steps are –


  1. Shutdown the database

  2. Copy data files, control files, redo log files using OS commands to a backup location.

  3. Startup database


If any of the files (data/control/redo) is corrupt in no archive log mode, you need to restore all files from backup. If relocation of files is necessary, you need to open the database in mount stage and issue rename command to specify new location of the files. Then you should open database for normal use. In no archive log mode, you can only recover data, which was taken during back up period. Even if only one file is corrupt, you need to restore all files and recover entire database.


2.3Backup in archive log mode


In archive log mode, backup can be taken while database is running.


To take backup of data file, follow these steps –


  1. ALTER TABLESPACE name BEGIN BACKUP

  2. Use OS commands to copy data file

  3. ALTER TABLESPACE name END BACKUP


Data file headers don’t get updated until backup ends. Ideally, perform hot backup when there is less DML is occurring in the database.



2.4User managed complete recovery


In all the following cases, it is assumed that database is running in archive log mode and backup was already taken.

2.4.1System table space lost/corrupt


  1. STARTUP MOUNT

  2. Restore only system table space file

  3. If required, relocate file – ALTER DATABASE RENAME file TO new file

  4. RECOVER AUTOMATIC DATABASE (or DATAFILE file name)

  5. ALTER DATABASE OPEN


2.4.2Non-system table space lost/corrupt


  1. STARTUP MOUNT

  2. Make data file offline – ALTER DATABASE file name OFFLINE

  3. ALTER DATABASE OPEN

  4. Restore data file from backup to database location

  5. If required, relocate file – ALTER TABLESPACE table space name OFFLINE IMMEDIATE for issuing check point

  6. RECOVER AUTOMATIC TABLESPACE table space name

  7. ALTER TABLESPACE table space name ONLINE


2.4.3Non-system table space lost/corrupt when no backup taken


  1. STARTUP MOUNT

  2. ALTER DATABASE CREATE DATAFILE filename with path AS new filename (only if relocate)

  3. RECOVER DATABASE (DATAFILE filename)

  4. ALTER DATABASE OPEN


2.4.4Instance failed during backup


Entire database won’t start. Data file header freezes during backup, so no checkpoint information is written.


  1. STARTUP MOUNT

  2. ALTER DATABASE END BACKUP

  3. ALTER DATABASE OPEN



2.5User managed incomplete recovery


2.5.1Time/Cancel/Change (SCN) based


  1. STARTUP MOUNT

  2. Restore all data files (including system, data, index, undo but not control file or redo log files)

  3. RECOVER DATABASE UNTIL TIME ‘dd-mon-yyyy hh24:mi:ss’ (or CANCEL or CHANGE number)

  4. ALTER DATABASE OPEN RESETLOGS


Log sequence number will be re-initialized.


SHUTDOWN

Take full backup of database


2.6Logical backup – export/import and Data Pump


Export may be either through conventional path or direct path. In direct path export, the evaluating buffer is bypassed and makes it faster.


Most common export command is (from OS command prompt) –

EXP ‘sys/password@mydb as sysdba’


Most common parameters are –

FILE – output file (default expdat.dmp)

DIRECT – direct path (N)

OWNER – list of owners/users

TABLES – list of table names

PARFILE – parameter file name (in this file you can store all options)

TABLESPACES – list of table spaces to export

TRANSPORT_TABLESPACE – export transportable table space metadata (N)


Similarly, import is run as –

IMP ‘sys/password@mydb as sysdba’

FILE – input file (expdat.dmp)

IGNORE – ignore create object errors (N)

ROWS – import data rows (Y)


Example of export,

exp system/password file=F:\Database\exp_mkm.dmp owner=mkm rows=y


You can run export/import in interactive mode i.e. it will ask you about parameters during runtime.


Data pump


From 10g onward, Oracle introduces new utilities EXPDP and IMPDP (as run from OS command prompt) to fast data loading (export/import). As it uses API, it is significantly faster than export/import utility. You can even monitor data pump progress from data dictionary views.


Data pump is run as – IMPDP user/password DIRECTORY=data_pump_dir DUMPFILE=dpdump.dmp JOB_NAME=my_import


Where, DIRECTORY is an external directory name already created. EXPDP has similar syntax.


Oracle automatically creates data_pump_dir in $ORACLE_HOME/ admin/ database_name/ dpdump. However if you want you can create a directory of your own like this –


create directory data_pump_dir as 'C:\Oracle11g\admin\MYDB\dpdump';


You can view location of directory by

select * from dba_directories where DIRECTORY_NAME = 'DATA_PUMP_DIR'


Example:

expdp system/password DIRECTORY=data_pump_dir DUMPFILE=supermarket.dmp SCHEMAS=mkm


Oracle now advises use of data pump over export/import.


2.7SQL Loader


Using SQL Loader, you can load data from text file to Oracle tables.


The components you need to run SQL Loader are –

  1. Control file – specifies how to load data in Oracle

  2. Data file – the data in text file which will be loaded

  3. Discard file – data that is discarded by SQL Loader because of not matching load condition

  4. Bad file – data that SQL Loader could not load because of error

  5. Log file – synopsis of loading operation


If you specify DIRECT=Y option, SQL Loader will bypass buffer and save data directly into data blocks in the disk. It makes data loading very fast however, this option does not enforce constraints, does not fire insert triggers, does not allow SQL functions in control file and locks entire table during loading.


You can run SQL Loader from OS command prompt as –

SQLLDR user/password@db CONTROL=myfile.ctl


A sample control file is shown below (assuming input data file is | delimited).


LOAD DATA

INFILE 'F:\DUMP\CUSTOMER.TXT'

BADFILE 'F:\DUMP\CUSTOMER.BAD'

DISCARDFILE 'F:\DUMP\CUSTOMER.DSC'

APPEND

INTO TABLE CUSTOMER

FIELDS TERMINATED BY "|"

TRAILING NULLCOLS

(

CUSTNO DECIMAL EXTERNAL "sq_cust_no.nextval",

CUSTNAME CHAR,

SEX CHAR,

ADDRESS CHAR,

CITY CHAR,

STATE CHAR,

COUNTRY CHAR,

POSTCODE CHAR,

PHONE CHAR,

EMAIL CHAR,

NOTE CHAR,

DATESTAMP DATE "YYYY-MM-DD HH24:MI:SS”

)


Note for NUMBER columns you specify DECIMAL EXTERNAL and for VARCHAR2 columns you specify CHAR in SQL Loader control file.


2.8Networking fundamentals


Oracle Net is an internal layer which manages communication between client and server. It is configured on server, client, web server etc.


2.8.1Configuring Oracle Net on server


Listener is a server-side networking component, which listens for requests from client on server. To communicate with Oracle server, Listener service must be started on server. Listener is configured in server using listener.ora file.


Following is a sample listener.ora file.


# LISTENER.ORA Network Configuration File: E:\oracle\ora92\network\admin\listener.ora

# Generated by Oracle configuration tools.


LISTENER =

(DESCRIPTION_LIST =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))

)

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = ensel)(PORT = 1521))

)

)

)


SID_LIST_LISTENER =

(SID_LIST =

(SID_DESC =

(GLOBAL_DBNAME = MDB)

(ORACLE_HOME = E:\oracle\ora92)

(SID_NAME = MDB)

)

)


You can manage listener from OS command prompt using LSNRCTL utility.


Oracle Net Manager is a tool using which you can manage most client/server configuration files.


2.8.2Configuring Oracle Net on client


Usually you connect to Oracle server from client as USER/PASSWORD@DB (this is known as connect descriptor).


How the database name you specified in connection is resolved to exact database in the server is known as name resolution method.


Most popular name resolution methods are – host naming, local naming (most common using tnsnames.ora) and Oracle Internet Directory naming.


In tnsnames.ora file (usually in client machine it resides in $ORACLE_HOME /network/admin folder). A sample tnsnames.ora file is shown below.


# TNSNAMES.ORA Network Configuration File: E:\oracle\ora92\network\admin\tnsnames.ora

# Generated by Oracle configuration tools.


MDB =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = ensel)(PORT = 1521))

)

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = MDB)

)

)


MARKET =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 109.125.257.250)(PORT = 1521))

)

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = MARKET)

)

)


Most common connection problem is “ORA-12154 TNS could not resolve service name”. When this occurs, check the client is looking at correct tnsnames.ora file (there may be multiple version in computer). You can verify this by checking TNS_ADMIN environment variable. Also check whether client computer can talk to server computer by running “TNSPING server ip address” command. Or you can use PING SID command as well.


Check sqlnet.ora file and see whether it specifies local naming first. This file resides in both client and server.


Sample of what an sqlnet.ora file will contain.

NAMES.DIRECTORY_PATH= (TNSNAMES, ONAMES, HOSTNAME)


2.9Log Miner


Using log miner, you can examine redo log files!


2.9.1Running log miner


Specify a directory by UTL_FILE_DIR=E:\ORACLE\ORADATA\UNLOAD parameter and bounce database.


Create a dictionary file


EXECUTE DBMS_LOGMNR_D.BUILD ('dictionary.ora','E:\ORACLE\ORADATA\UNLOAD', OPTIONS => DBMS_LOGMNR_D.STORE_IN_FLAT_FILE);


Add log files


exec dbms_logmnr.add_logfile ('E:\oracle\oradata\MDB\Archive1\ARC00026.001', dbms_logmnr.new);

exec dbms_logmnr.add_logfile ('E:\oracle\oradata\MDB\Archive1\ARC00027.001', dbms_logmnr.addfile);

exec dbms_logmnr.add_logfile ('E:\oracle\oradata\MDB\Archive1\ARC00028.001', dbms_logmnr.addfile);

exec dbms_logmnr.add_logfile ('E:\oracle\oradata\MDB\Archive1\ARC00029.001', dbms_logmnr.addfile);


Start log miner session


exec dbms_logmnr.start_logmnr (dictfilename=> 'E:\ORACLE\ORADATA\UNLOAD\dictionary.ora');


Once the redo logs were analyzed, all the DDL (and some DML) statements applied in the source database will be found in the V$LOGMNR_CONTENTS view. Important columns of this view are - SQL_UNDO, SQL_REDO, USERNAME, SCN, TIMESTAMP, COMMIT_TIMESTAMP, TABLESPACE, SEG_NAME, SEG_TYPE, and OPERATION.


The Log Miner session is closed by executing following command in the same session.

EXEC DBMS_LOGMNR.END_LOGMNR


After the session is complete, all data in the v$logmnr_contents table are deleted. Be sure to execute CREATE TABLE my_logmnr AS SELECT ... to copy the data before analyzing the contents.


2.9.2Filtering data that is returned


Log Miner can potentially be dealing with large amounts of information. There are several methods you can use to limit the information that is returned to the V$LOGMNR_CONTENTS view, as well as the speed at which it is returned. These options are specified when you start LogMiner.


Showing Only Committed Transactions


At the time of starting


EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.COMMITTED_DATA_ONLY);


Filtering Data By Time


EXECUTE DBMS_LOGMNR.START_LOGMNR(DICTFILENAME => '/oracle/dictionary.ora', STARTTIME => TO_DATE('01-Jan-2004 08:30:00', 'DD-MON-YYYY HH:MI:SS'), ENDTIME => TO_DATE('01-Jan-2004 08:45:00', 'DD-MON-YYYY HH:MI:SS'));


Filtering Data By SCN


EXECUTE DBMS_LOGMNR.START_LOGMNR(DICTFILENAME => '/oracle/dictionary.ora', STARTSCN => 100, ENDSCN => 150);


2.9.3Querying on log miner


Some examples are shown below.


SELECT USERNAME, SQL_REDO FROM V$LOGMNR_CONTENTS

WHERE USERNAME <> 'SYS';


SELECT OPERATION, SQL_REDO, SQL_UNDO FROM V$LOGMNR_CONTENTS WHERE SEG_OWNER = 'MKM' AND SEG_NAME = 'PRODUCT' AND OPERATION = 'INSERT' AND USERNAME = 'MKM';


2.9.4Log miner related data dictionary views


V$LOGMNR_CONTENTS - Shows changes made to user and table information.


V$LOGMNR_DICTIONARY - Shows information about the Log Miner dictionary file, provided the dictionary was created using the STORE_IN_FLAT_FILE option.


V$LOGMNR_LOGS - Shows information about specified redo logs. There is one row for each redo log.


V$LOGMNR_PARAMETERS - Shows information about optional Log Miner parameters, including starting and ending system change numbers (SCNs) and starting and ending times.



2.10 Real Application Clusters (RAC)


An RAC database is a clustered database. In RAC environment, multiple Oracle instances (which are connected via interconnect) operate on same database files on disk. Different servers must access set of shared disks and should communicate through high-speed interconnection. Changed database blocks and log information on one instance can be moved to another instance through memory interconnection without writing on disk. This is known as cache fusion (see later). The main advantage of RAC is scalability and high availability. Several servers with Oracle instances can be added to system. If one of them fails, others continue to work without affecting operations. For this reason RAC is also known as High Availability. When work load grows, you can simply add another server to the grid (RAC is a type of grid computing after all).


The data files are stored in several disk drives which are connected by cluster aware storage. By adding multiple instances, we can add and remove and single Oracle instance without bringing the database down. So, database always remains available. That is the essence of RAC - high availability.


An RAC database is managed by Oracle Clusterware. RAC operates in shared everything architecture mode.


Any storage (eg. SAN, SCSI etc.) can be used with RAC. However, good I/O speed is required for scalability of data volume.


RAC supports up to 100 clusters which may be different at hardware level but must run same operating system.


Oracle recommends using ASM (Automatic Storage Management) for ease of dealing with clustered storage.


An Oracle RAC database requires three components - cluster nodes (the servers or computers running Oracle instances), shared storage (disk drives) and Oracle Clusterware (software application).


Installing RAC


The first step of working with RAC is to install "Oracle Clusterware" which is installed via Universal Installer.


Then you have to configure the clusterware.


Then install ASM (Automatic Storage Management).


Now install Oracle 11g database.


Then perform post installation tasks. This ensures that clusterware and database are installed properly and they are aware of each other.


It is possible to convert your normal single instance Oracle database to an RAC database. You can achieve this via Enterprise Manager or rconfig utility.


Administering Clusterware


Oracle Clusterware includes two important components: the voting disk and the OCR. The voting disk is a file that manages information about node membership, and the OCR is a file that manages cluster and Oracle RAC database configuration information.


RAC can be administered via Oracle Enterprise manager. On EM's web console mode, click on Availability tab to see details of Clusterware. You can click on Topology tab to see a visual representation of your nodes. The Interconnect tab shows you info on interfaces. You can also add new instance to clusterware via EM (under Server tab).


Oracle Clusterware posts alert messages in alert log – which is under $CRS_home. RAC data dictionary views are created by catclust.sql.


Cache Fusion


Oracle RAC uses Cache Fusion to synchronize the data stored in the buffer cache of each database instance – i.e. to keep track of which nodes are writing to which blocks and to ensure that two nodes do not update duplicate copies of the same block. Since all computers/instances in an RAC access the same database, the overall system must guarantee the coordination of data changes on different computers such that whenever a computer queries data it receives the current version – even if another computer recently modified that data. Oracle RAC refers to this functionality as Cache Fusion. It involves the ability of RAC to fuse in-memory data cached physically separately on each computer into a single global cache. This saves a lot of resource time.



2.11 Standby database (also Oracle Data Guard)


Stand by database is used as a protection against failure of main production database.

2.11.1Physical stand by


This may be created from last back up taken for the production database and there after applying archived redo log files on it. This is similar to recovering a database. However, for stand by database, this recovery is like a continuous process, because, archived logs (from production database) are continuously being applied on it to make it sync with production database. However, stand by database won’t be available for use until recovery is completed.

2.11.2Logical stand by


Instead of applying archived redo log files, SQL statement is constructed from log files are being applied to stand by database (similar to Log Miner method). The database is available for use during application of SQLs.


2.12 Replication


It allows you to have multiple copies of same database at different locations. At most basic level, replication is implemented using materialized views. In case of synchronous replication, transactions are either successfully propagated to all sites or it is rolled back. It ensures no conflict will occur between sites. It requires stable network environment and mostly used for read only materialized views. In asynchronous replication, changes to each site is stored locally and forwarded to other sites. In this case, conflict resolution processes are required.


Replication generally improves performance across network. For example, if you use a database for online transactions as well as reporting, you can replicate the database and run transactions and reporting on different versions.


3Performance Tuning


3.1Tuning development and production systems


Oracle’s top down approach for development systems


  1. Tune data design

  2. Tune application design

  3. Tune memory allocation

  4. Tune I/O and physical structures

  5. Tune resource contention

  6. Tune for underlying platform (OS)


Oracle’s production performance tuning principles


  1. Define problem clearly and formulate a tuning goal

  2. Examine host system and gather statistics

  3. Compare common problems with Oracle’s documentation

  4. Get a conceptual picture of what went wrong from gathers statistics

  5. Identify changes to be done and implement those changes

  6. Check whether tuning objective has been met or not, repeat steps until tuning is complete.


3.2Sources of tuning information


3.2.1Alert log file


This file records information and error messages for various database activities. This file is located at BACKGROUND_DUMP_DEST folder. The name format is alert_SID.log.


3.2.2Trace files


Background process trace files contains session information for process that created them. These files are available in BACKGROUND_DUMP_DEST folder. Name format for the trace file is usually SID_PROCESS_nnnn.trc e.g. mdb_lgwr_1598.trc.


User trace files are found in USER_DUMP_DEST folder. These are created when error occurs in user’s server process. User tracing can be enabled using ALTER SESSION SET SQL_TRACE = TRUE command or by executing package as

EXEC

SYS.DBMS_SYSTEM.SET_SQL_TRACT_IN_SESSION

(sid, serial#, TRUE)


3.2.3Views commonly used in tuning


V$SGASTAT

V$EVENT_NAME

V$SYSTEM_EVENT

V$SESSION_EVENT

V$SESSION_WAIT

V$STATNAME

V$SYSSTAT

V$SESSTAT

V$SESSION

V$WAITSTAT


DBA_TABLES

DBA_INDEXES

DBA_STATS

DBA_DATA_FILES

DBA_SEGMENTS

DBA_HISTOGRAMS


3.3Collecting statistics


Run UTLBSTAT and UTLESTAT to collect all database activities in the given time period in a single file.


Run from $ORACLE_HOME/rdbms/admin/utlbstat.sql and utlestat.sql

The resulting file is named as REPORT.TXT


3.3.1Statspack


  • Run spcreate.sql script from $ORACLE_HOME/rdbms/admin folder.

  • It will create PERFSTAT schema with all required objects.

  • To collect statistics, use EXECUTE STATSPACK.SNAP procedure (as PERFSTAT user). A snapshot of statistics will be collected and stored in PERFSTAT schema tables.

  • Use $ORACLE_HOME/rdbms/admin/spauto.sql to run automatic statistics collection at specific intervals.

  • Once you gathered enough statistics, you can generate a report using $ORACLE_HOME/rdbms/admin/spreport.sql script.


3.4Oracle supplied GUI tuning tools


Capacity Planner

Performance Manager – observe database performance.

Top Sessions – see which users are consuming most resource

Trace Data Viewer

Lock Monitor

Top SQL – most resource consuming SQLs

Performance Overview – see current performance of database

Oracle Expert – gathers statistics and gives recommendations for tuning

Index Tuning Wizard – identify unused indexes


3.5SQL application tuning and design


3.5.1TKPROF


It is used to format user trace files. Usage example is (from OS command prompt) – TKPROF ORA_1234.TRC TRACE.TXT

Some of its parameters are –

EXPLAIN – generates explain plan for each statement in trace file

SYS – output file includes recursive SQL statements (i.e. those involving data dictionary queries)

RECORD – specifies a file where SQL statements of trace file are written


Example usage

TKPROF ORA_1234.TRC TRACE.TXT SYS=NO EXPLAIN=MKM/MKM@MDB RECORD=SQL.TXT


To identify SQL statements, which may require tuning, look for statements –

  • Consuming excess CPU resource

  • Taking long time to parse, execute and fetch

  • Reading too many data blocks from disk and too few from SGA

  • Access many data blocks but return only few rows


3.5.2Explain plan


  • Create plan table using $ORACLE_HOME/rdbms/admin/utlxplan.sql

  • Populate PLAN_TABLE using EXPLAIN PLAN FOR… command. For example,

EXPLAIN PLAN
SET STATEMENT_ID = 'PRICE'
FOR
SELECT P.PRODCODE, P.PRODNAME, J.SELLPRICE, M.MFDNAME,
NVL(SUM(I.QTYAVAILABLE),0) "ALL STORES QTY"
FROM PRODUCT P
JOIN PRICE J ON (P.PRODCODE = J.PRODCODE)
LEFT JOIN MANUFACTURER M ON (P.MFDBY = M.MFDNO)
LEFT JOIN INVENTORY I ON (P.PRODCODE = I.PRODCODE)
WHERE SYSDATE BETWEEN J.STARTDATE AND J.ENDDATE
AND P.HASSERIALNO=0
GROUP BY P.PRODCODE, P.PRODNAME, J.SELLPRICE, M.MFDNAME


  • To view the plan, you may issue following statement


SELECT LPAD(' ',4*(LEVEL-2)) || OPERATION || ' ' || OPTIONS || ' ' ||
OBJECT_NAME "EXECUTION_PLAN", IO_COST, CPU_COST,TEMP_SPACE
FROM PLAN_TABLE
START WITH ID = 0 CONNECT BY PRIOR ID = PARENT_ID


  • Remember that, if you run the above query, you will see the plan in an indented view. The innermost operations are executed first. If two operations appear at same level (with same inner level), the top one is executed first.


3.5.3Auto trace


Unlike explain plan, auto trace executes the actual SQL statement before generating the plan.


You need to create PLUSTRACE role by running plustrce.sql as SYS user.

Then you need to assign PLUSTRACE role to users who will use auto trace. They also need PLAN_TABLE in their schemas.


To use auto trace, issue following command from SQL Plus.

SET AUTOTRACE ON

Then issue any SQL statement and you will always see statistics after result is displayed.


3.6Optimizer


Earlier versions of Oracle used Rule Base Optimizer (RBO). But latest versions use Cost Based Optimizer (CBO) by default.


Statistics must be gathered to benefit from CBO.


3.6.1Gathering statistics


ALTER INDEX index_name COMPUTE STATISTICS

ALTER TABLE table_name COMPUTE STATISTICS


ALTER TABLE table_name ESTIMATE STATISTICS FOR TABLES/COLUMNS col1, col2/ALL COLUMNS/ALL INDEXES


EXECUTE DBMS_UTILITY.ANALYZE_SCHEMA('MKM','COMPUTE')


Oracle now recommends that you use DBMS_STATS package instead of Analyze.


EXEC DBMS_STATS.gather_schema_stats (ownname => ‘MKM’, cascade =>true, estimate_percent => dbms_stats.auto_sample_size)


3.6.2Optimizer modes


In initialization file, you can set optimizer mode as shown below OPTIMIZER_MODE=CHOOSE (this is default) or FIRST_ROWS or ALL_ROWS or RULE or FIRST_ROWS_n where n = 1/10/100/1000.


You can also change optimizer mode at session level.


ALTER SYSTEM SET OPTIMIZER_MODE=CHOOSE


To change optimizer mode at statement level, you should use hints using /*+ … */.


SELECT /*+ RULE */ …

Commonly used hints are – FULL, INDEX, REWRITE, and PARALLEL etc.


If statistics exists for any one table or index involved in SQL statement, CBO is used, otherwise RBO is used.


To reuse a saved execution plan, you can use “plan stability” (in the form of stored outline) feature or “materialized view”.


3.6.3Materialized view


Unlike in normal view, materialized view actually stores the data in tables.


To create materialized view, issue


CREATE MATERIALIZED VIEW schema.mview_name

BUILD IMMEDIATE

REFRESH ON DEMAND (or REFRESH COMPLETE ON COMMIT)

ENABLE QUERY REWRITE

AS

SELECT query;


EXEC DBMS_MVIEW.REFRESH('schema.mview_name','C');

EXEC DBMS_MVIEW.REFRESH_ALL_DEPENDENT('table_name');

EXEC DBMS_MVIEW.REFERSH_ALL_MVIEWS;


3.6.4Partitioned tables


3.6.4.1Range partition


It uses range of column values to determine where the record will be inserted.


CREATE TABLE student (…) PARTITION BY RANGE (graduation_year)

(PARTITION p_2000 VALUES LESS THAN 2000 TABLESPACE student_1,

PARTITION p_2002 VALUES LESS THAN 2002 TABLESPACE student_2,

PARTITION p_2004 VALUES LESS THAN 2004 TABLESPACE student_3,

PARTITION p_error VALUES LESS THAN (MAXVALUE) TABLESPACE student_4);


3.6.4.2List partition


It is based on set of specified value instead of range of values.


CREATE TABLE student (…) PARTITION BY LIST (degree)

(PARTITION p_engg VALUES (‘BTech’,’MTech’) TABLESPACE stu_engg,

PARTITION p_comm VALUES (‘Mcom’,’Bcom’) TABLESPACE stu_comm,

PARTITION p_arts VALUES (‘MA’,’BA’) TABLESPACE stu_arts);


3.6.4.3Hash partition


It uses a hashing algorithm to assign records in particular partition. It usually keeps almost equal number of records in each partition.

CREATE TABLE student (…) PARTITION BY HASH (roll_no) PARTITIONS 3 STORE IN (stu_1, stu_2, stu_3);


3.6.4.4Composite partition


It uses range partition and inside it uses hash sub-partitions. Data is physically stored in sub-partition level.


CREATE TABLE student (…)

PARTITION BY RANGE (graduation_year)

SUBPARTITION BY HASH (roll_no) SUBPARTITIONS 3

STORE IN (stu_1, stu_2, stu_3)

(PARTITION p_2000 VALUES LESS THAN 2000,

PARTITION p_2002 VALUES LESS THAN 2002,

PARTITION p_2004 VALUES LESS THAN 2004,

PARTITION p_error VALUES LESS THAN (MAXVALUE));


Note: Any bitmap indexes created on partitioned table must be local (to the partition).


3.6.4.5Cluster


A cluster is a group of one or more tables whose data is stored at same place (physically). This helps faster access of data columns, which are often queried as joins because Oracle server needs to read less number of physical data blocks.


CREATE CLUSTER dept_emp

(dno NUMBER) SIZE 1000 TABLESPACE clst


CREATE INDEX dept_emp_idx

ON CLUSTER dept_emp TABLESPACE idx


CREATE TABLE dept (dno NUMBER, dname VARCHAR2(100))

CLUSTER dept_emp(dno);


CREATE TABLE emp (eno NUMBER, ename VARCHAR2(100), dno NUMBER) CLUSTER dept_emp(dno);


Oracle 11g allows reference partition and interval partition.


Take an example of Transaction and Transaction Detail tables. These two are linked by foreign key TransId. Now, master table has transaction date but detail table do not. We want both tables be partitioned by transaction date. In 11g, we can specify details tables be partitioned based on foreign key reference TransId.


Interval partition is useful when we do not know how many partitions we need beforehand. In above example, we can specify the table such a way whenever new month begins, a new partition will be created automatically.


3.7Tuning shared pool


Shared pool consists of library cache and data dictionary cache. Library cache caches most recently used SQL and PL/SQL statements. Data dictionary cache caches data dictionary information. Shared pool is managed by a Least Recently Used algorithm.


Finding a matching SQL statement in shared pool is known as cache hit. For cache hit to occur, two SQL statements must be exactly same i.e. their ASCII value equivalent should be same. The aim of tuning shared pool is to maximize cache hit ratio.


3.7.1Measuring shared pool performance


High cache hit ratio indicates that your application users are getting results of SQL and PL/SQL mostly from memory rather than reading from disk.


SELECT * FROM V$LIBRARYCACHE


The value in GETHITRATIO column for SQL AREA, TABLE/PROCEDURE, BODY and TRIGGER rows should be very close to 1 i.e. 100%.


Similarly PINHITRATIO should also be very close to 1.


GET is referred to parse lock, while PIN is referred to execution time locks.


A well-tuned OLTP system should have GETHITRATIO and PINHITRATIO 90% or higher for SQL AREA.


Data dictionary performance is measured by


SELECT 1-(SUM(GETMISSES)/SUM(GETS)) “Data dictionary hit ratio” FROM V$ROWCACHE


This value should be over 0.85 for OLTP systems.


3.7.2Improving shared pool performance


3.7.2.1Add more memory to shared pool


The size of shared pool is determined by SHARED_POOL_SIZE initialization parameter.


SELECT POOL, SUM(BYTES) "SIZE" FROM V$SGASTAT WHERE POOL = 'shared pool' GROUP BY POOL


Use following command to change shared pool size


ALTER SYSTEM SET SHARED_POOL_SIZE=200M


3.7.2.2Make space for large PL/SQL statements


You can set aside a reserved area in SGA for large PL/SQL packages. This area is controlled by SHARED_POOL_RESERVED_SIZE parameter.


Determine which packages are loaded into memory from following command


SELECT * FROM V$DB_OBJECT_CACHE WHERE TYPE IN ('PACKAGE', 'PACKAGE BODY')


3.7.2.3Keep important PL/SQL code in memory


You can “pin” most frequently used PL/SQL code in memory. To do this –


  1. Build DBMS_SHARED_POOL package by running $ORACLE_HOME /rdbms/admin/dbmspool.sql script.

  2. Load a package using EXECUTE DBMS_SHARED_POOL.KEEP(‘PACKAGE_NAME’)


You can see which packages are pinned by issuing


SELECT OWNER, NAME, TYPE FROM V$DB_OBJECT_CACHE WHERE KEPT = ‘YES’


You must have very good knowledge of application to determine which objects to pin right after instance startup. You can audit PL/SQL packages, triggers, sequences etc. and find out which objects are most frequently accessed.


3.7.2.4Code reuse


Use bind variables like SELECT * FROM CUSTOMER WHERE CUST_ID = :cust_id


Implement strict coding standard (i.e. capitalization, indentation etc.) so that chances of finding identical statement in memory will increase.


3.7.2.5Tune cache specific initialization parameters


OPEN_CURSORS (default 50, increase if necessary)

CURSOR_SPACE_FOR_TIME (set to FALSE for Forms based applications)

SESSION_CACHED_CURSORS

CURSOR_SHARING (use FORCE, SIMILAR or default EXACT)


3.8Tuning database buffer cache


It caches most recently accessed data blocks into memory. If data is not found from cache, it is fetched from disk. It is operated on LRU mechanism (except, only for full table scan, it is placed on MRU end.)


Buffer may be free, pinned, clean or dirty.


DBWn writes dirty (changed) buffer to disk.


3.8.1Measuring buffer cache hit ratio


SELECT 1-(physical.VALUE - direct.VALUE - lobs.VALUE) /(logical.VALUE) "Buffer cache hit ratio"
FROM v$sysstat physical, v$sysstat direct, v$sysstat lobs, v$sysstat logical
WHERE physical.NAME = 'physical reads'
AND direct.NAME = 'physical reads direct'
AND lobs.NAME = 'physical reads direct (lob)'
AND logical.NAME = 'session logical reads'



The ratio should be more than 0.90 for OLTP systems.


3.8.2Improving buffer cache hit ratio


3.8.2.1Add more space


ALTER SYSTEM SET DB_CACHE_SIZE = 100M


Set DB_nK_CACHE_SIZE parameters in initialization file to access multi-block database.


To get an idea how much you should increase buffer cache size

  • Set DB_CACHE_ADVICE = ON initialization parameter.

  • Query V$DB_CACHE_ADVICE view.


3.8.2.2Use multiple buffer pools


Use keep, recycle and default pool by setting DB_KEEP_CACHE_SIZE, DB_RECYCLE_CACHE_SIZE and DB_CACHE_SIZE (default) initialization parameters.


Determining which segments to cache in keep and recycle pools, you must have in depth knowledge of the application.


SELECT username "owner", NAME "seg name", kind "seg type", COUNT(DISTINCT BLOCK#) "No. buffers"
FROM v$cache v, dba_users d
WHERE v.owner# = d.user_id
GROUP BY NAME, username, kind
HAVING COUNT(DISTINCT BLOCK#)>10
ORDER BY 3 DESC


Oracle recommends you consider caching of segments in keep pool whose total size is less than 10% of default pool size.


To assign segments to pool, use


ALTER TABLE schema.package STORAGE (BUFFER_POOL KEEP);


ALTER TABLE schema.package STORAGE (BUFFER_POOL RECYCLE);


Monitor buffer pool statistics


SELECT NAME "Buffer pool",
1-(physical_reads/(db_block_gets+consistent_gets)) "Buffer pool hit ratio"
FROM v$buffer_pool_statistics
ORDER BY NAME


3.8.2.3Cache tables in memory


CREATE TABLE (…) CACHE


ALTER TABLE name CACHE


3.8.2.4Use proper indexes


Build indexes on foreign key columns of tables that reference a primary key column in another table.



3.9Shared server


By default, Oracle runs on dedicated server mode where for each user session connection, a server process is created on server and a user process is created on client machine. When number of concurrent users becomes very high, shared server (known as Multi Threaded Server in earlier versions) is used.


In shared server, several (up to 5) dispatcher background processes are run in server, which accept user requests. They then put the request in a queue. Thereafter, shared server processes pick the request from queue and process the SQL (i.e. parsing the statement, reading segments from disk and placing them in buffer cache etc.). After processing, they put the result in response queue. The corresponding dispatcher sends back the result to user process.


Shared server is useful for these scenarios – many application users, short application transactions (e.g. railway reservation system, order entry system), non-continuous transactions etc.


Shared server is a scalability improvement feature not performance improvement feature. You will always have same or better performance by using dedicated server feature.


3.9.1Configuring shared servers


Set following parameters in initialization file


DISPATCHERS = n (0 to 5)

SHARED_SERVERS = n (1 to OS dependent max. value)


Other optional parameters are – MAX_DISPATCHERS, CIRCUITS, MAX_SHARED_SERVERS, and PROCESSES


3.9.2Measuring shared server performance


Query on V$SHARED_SERVER_MONITOR view.


The following query shows shared server busy ratio


SELECT NAME, decode(busy+idle,0,0,round((busy/(busy+idle))*100,4)) "busy rate" FROM v$shared_server WHERE status != 'QUIT'


The next query shows dispatcher busy ratio


SELECT NAME "dispatcher", NETWORK, (round(SUM(busy)/(SUM(busy)/SUM(idle)),4))*100 "busy rate"
FROM v$dispather GROUP BY NAME, NETWORK


Additional dispatcher is necessary is busy ratio found from above query is more than 50%.


Please note that DBA must connect through dedicated server to perform various DBA activities (e.g. startup/shutdown database).


3.10 Large pool and Java pool


Large pool in SGA is used for Recovery Manager (RMAN) operations and parallel query.


It is defined by LARGE_POOL_SIZE (usual values from 600K to 2GB) parameter in initialization file and cannot be changed dynamically.


Java pool is used to keep session specific Java application code and variables. Its size is determined by JAVA_POOL_SIZE (default 20M) initialization parameter and cannot be changed dynamically.


3.11Tuning Redo


Its performance is measured by the amount of time server process waits to access redo log files. The following queries can be used to measure redo log waits.


SELECT r.VALUE/e.VALUE "Redo log buffer retry ratio"
FROM v$sysstat r, v$sysstat e
WHERE r.NAME = 'redo buffer allocation retries'
AND e.NAME = 'redo entries'


Its value should be less than 1%.


SELECT NAME,VALUE FROM v$sysstat WHERE NAME = 'redo log space requests'


Constantly increase value indicates too small redo log files.


3.11.1Improving redo log performance


Make it bigger. Redo log space is specified by LOG_BUFFER initialization parameter.


Reduce redo log generation by using UNRECOVERABLE and NOLOGGING keywords in SQL statements.


3.12 Tuning archiving operations


Common problems are –

  • Archive location getting full – you can temporarily change archive log location by ALTER SYSTEM ARCHIVE LOG ALL TO ‘/oradata/archive’.

  • ARCn process can’t keep up with redo log generations – create more ARCn process.


3.13 Tuning disk I/O


Keep separate table spaces for different functional segments.


Continue reading this ebook at Smashwords.
Download this book for your ebook reader.
(Pages 1-55 show above.)