Oracle DBA Best Practices [PDF]

  • 0 0 0
  • Gefällt Ihnen dieses papier und der download? Sie können Ihre eigene PDF-Datei in wenigen Minuten kostenlos online veröffentlichen! Anmelden
Datei wird geladen, bitte warten...
Zitiervorschau

UTOUG Training Days 2004 Advanced DBA Best Practices

Michael S. Abbey The Pythian Group [email protected]

Michael S. Abbey – Advanced DBA Best Practices

Agenda • • • • •

Preamble / raison d'être Monitoring INIT.ora Do not wait for waits Integrity of your backups

2

Michael S. Abbey – Advanced DBA Best Practices

Agenda • • • • •

Infrastructure setup Schema environments Cost-based optimizer Distributed computing Application tuning

3

Michael S. Abbey – Advanced DBA Best Practices

Agenda • Working with Oracle Support Services • Hodge podge

4

Michael S. Abbey – Advanced DBA Best Practices

5

Preamble / raison d'être Cryptic

Too many areas

• It's so hard to tune – Cryptic? – Too many areas? – Too complex?

Memory

Apps

• It’s so easy to tune – Separate components – Version compatibility – Concept carry-over

I/O

Michael S. Abbey – Advanced DBA Best Practices

Preamble / raison d'être Facts about the Oracle Server

• Terminology is • Instance parameters portable across version – v$parameter – v$instance • Same background processes • SQL statement – v$sqlarea • Method rather than – v$sqltext guesswork – Ripple affect • Memory structures – Fix this / break that

– v$librarycache

6

Michael S. Abbey – Advanced DBA Best Practices

7

Preamble / raison d'être Too complex??

• Tune Apps • Tune Memory

• Tune I/O

Turn this

Michael S. Abbey – Advanced DBA Best Practices

Preamble / raison d'être Facts about the Oracle Server

Into this!!!!!

8

Michael S. Abbey – Advanced DBA Best Practices

Monitoring

Best practices NOW will payoff down the road

9

Michael S. Abbey – Advanced DBA Best Practices

Caveat You would not believe what the guy at Training Days told me. He said that his approach to monitoring was to ignore situations that he did not deem to be necessary! One person's approach to monitoring may not be the other person's style. Suggestions? Be my guest.

10

Michael S. Abbey – Advanced DBA Best Practices

Ensure your space monitoring traps ALL space deficiency situations

11

Michael S. Abbey – Advanced DBA Best Practices

12

Monitoring The dba_free_space poltergeist select distinct a.tablespace_name from dba_tablespaces a, dba_free_space b where a.tablespace_name = b.tablespace_name;

select distinct a.tablespace_name from dba_tablespaces a, dba_free_space b where a.tablespace_name = b.tablespace_name (+);

TABLESPACE_NAME -----------------------------AD_DATA AD_INDEX RBS SYSTEM TEMP

TABLESPACE_NAME -----------------------------AD_DATA AD_INDEX BLINKY RBS SYSTEM TEMP

Michael S. Abbey – Advanced DBA Best Practices

Monitoring I'm too full set pages 100 col ts_name form a20 head 'Tablespace'

col pieces form 9990 head 'Pcs'

Environment

col ts_size form 999,990 head 'SizeMb' col largestpc form 999,990 head 'LrgMB' col totalfree form 999,990 head 'FreeMb' col pct_free form 990 head '%Free' col whatsused form 999,990 head 'Used' col pct_used form 990 head '%Used' col problem head 'Prob??' spool umcdbp1 . . . spool off

Da code goes here

13

Michael S. Abbey – Advanced DBA Best Practices

14

Monitoring I'm too full select q2.other_tname ts_name, pieces, ts_size ts_size, nvl(largest_chunk,0) largestpc, nvl(total_free,0) totalfree, nvl(round((total_free/ts_size)*100,2),0) pct_free, ts_size-total_free whatsused, nvl(100-round((total_free/ts_size)*100,2),100) pct_used, decode(nvl(100-round((total_free/ts_size)*100,0),100), 85,'+',86,'+',87,'+',88,'+',89,'++',90,'++',91,'++', 92,'++',93,'++',94,'+++',95,'+++',96,'+++',97,'++++', 98,'+++++',99,'+++++',100,'+++++','') problem from (select dfs.tablespace_name,count(*) pieces, round(max(dfs.bytes)/1024/1024,2) largest_chunk, round(sum(dfs.bytes)/1024/1024,2) total_free from dba_free_space dfs group by tablespace_name) q1, (select tablespace_name other_tname,

round(sum(ddf2.bytes)/1024/1024,2) ts_size from dba_data_files ddf2 group by tablespace_name) q2 where q2.other_tname = q1.tablespace_name(+) order by nvl(100-round((total_free/ts_size)*100,0),100) desc;

Code

Michael S. Abbey – Advanced DBA Best Practices

Monitoring Thresholds

• Percentage based on – Growth patterns – Past experiences – Archival habits

• Ignore or not ignore – Rollback segments – Temp – Non-app related

• LM tablespaces with extent management local …uniform size … • The dba_free_space poltergeist Infrastructure issues

More of a than anything else

15

Michael S. Abbey – Advanced DBA Best Practices

Ensure you trap potential object extension problems before your applications

16

Michael S. Abbey – Advanced DBA Best Practices

17

Monitoring Unable to extend

• Less free space available than potential object extension • Objects within 5 extents of their maximum col col col col col col

owner form a5 head Owner segment_type form a5 head Type segment_name form a24 head Name next_extent form 999,999,990 head NextEXT max_extents form 9,999 head MaxEXT extents form 9,999 head CurrEXT

break on owner on segment_type

Michael S. Abbey – Advanced DBA Best Practices

Monitoring Unable to extend – available extents prompt prompt Objects that cannot extend ... prompt select from where and

owner,segment_type,segment_name,next_extent sys.dba_segments ds segment_type in ('TABLE','INDEX') next_extent > (select max(bytes) from sys.dba_free_space dfs where dfs.tablespace_name = ds.tablespace_name) order by 1,2,3;

18

Michael S. Abbey – Advanced DBA Best Practices

Monitoring Unable to extend – within 5 prompt prompt Objects within 5 of max extents ... prompt select from where and

owner,segment_type,segment_name,max_extents,extents sys.dba_segments ds segment_type in ('TABLE','INDEX') max_extents - extents sysdate-inter/1440 and broken = 'Y'; Smarts to ensure you begin do not un-break what is for jobrec in jobstofix supposed to be broken loop dbms_job.run(jobrec.job); end loop; end; /

31

Michael S. Abbey – Advanced DBA Best Practices

Ensure unusable index partitions are caught by you, not your apps

32

Michael S. Abbey – Advanced DBA Best Practices

Monitoring Unusable index partitions

Automagically, index partitions are marked unusable • Aborted direct path Loader sessions • Some partition maintenance operations local • Partition maintenance operations global select 'alter index '||owner||'.'||index_name|| ' rebuild partition '||partition_name||';' from dba_ind_partitions where status= 'UNUSABLE';

33

Michael S. Abbey – Advanced DBA Best Practices

3 "L" words – locks & latches turn into lousy performance if not detected early

34

Michael S. Abbey – Advanced DBA Best Practices

Monitoring Locks

• Two sessions vying for the same resource • catblock.sql – rdbms/admin • Assortment of cryptic lock views • Narrow down sessions and convert to OS pid using v$session and v$process

v$session paddr

v$process addr spid

35

Michael S. Abbey – Advanced DBA Best Practices

Monitoring Latches

• The DBA's nightmare • Low level serializable mechanisms designed to protect global data structures in the SGA • Life expectancy sub-second • Latches are to memory as locks are to disk

36

Michael S. Abbey – Advanced DBA Best Practices

Monitoring Latches col Requests form 999,999,999,990 head 'Requests' col PctMiss form 99.90 head 'PCTMiss'

select name,gets+misses Requests, round(misses/decode(gets+misses,0,-1, gets+misses)*100,2) PctMiss

from v$latch where misses/decode(gets+misses,0,-1,gets+misses)*100 > 10 order by gets desc;

37

Michael S. Abbey – Advanced DBA Best Practices

Monitoring Latches

select count(*) from x$kglpn; Absolute  over a certain amount (static)

X:Y

Relative  compared to the norm

38

Michael S. Abbey – Advanced DBA Best Practices

Monitoring Latches

• A healthy environment returns counts well under 200 • Spinning for latches to gain access to precious resources • Tempting to increase latch counts • Low level supervisory mechanism would not allow

39

Michael S. Abbey – Advanced DBA Best Practices

Detect spikes in system load that affect performance

40

Michael S. Abbey – Advanced DBA Best Practices

41

Monitoring System load #!/bin/ksh typeset -i THRESHOLD typeset -i LOAD HOUR=$(date +%H) if (( $HOUR > 7 && $HOUR < 17 )); then THRESHOLD=$1 else THRESHOLD=$2 fi tmpuptime=`uptime` tmploads=${tmpuptime##*average:} LOAD=${tmploads%%.*} if (( $LOAD > $THRESHOLD )); then echo "Load of $LOAD exceeded threshold of $THRESHOLD" exit 1 fi exit 0

Michael S. Abbey – Advanced DBA Best Practices

Detect devices with low free space

42

Michael S. Abbey – Advanced DBA Best Practices

Monitoring Disk usage

Some locations are crucial to backups exports archived redo logs #!/bin/ksh # $1 - the filesystem to check # $2 - the byte count threshold typeset -i bytesused typeset -i pctused pctused=$(df -k |grep $1 | awk '{print $5}' | sed 's/%//') bytesused=$(df -k |grep $1 | awk '{print $4}') if (( $bytesused < $2 )) then print $1 is $pctused% full, PROBLEM. fi

43

Michael S. Abbey – Advanced DBA Best Practices

SQL statement contention is a sibling of latch contention

44

Michael S. Abbey – Advanced DBA Best Practices

Monitoring SQL statement contention

• Concurrent executions • Location of data • Clustering • Default RS locking mode

45

Michael S. Abbey – Advanced DBA Best Practices

Monitoring SQL statement contention select 'Too many sessions ( '||to_char(count(*))||' running ' substr(sql_text,1,80) query from v$session s, v$sqlarea sa where s.sql_address = sa.address

and s.sql_hash_value = sa.hash_value and s.status = 'ACTIVE' and s.audsid != 0 and sql_text not like 'select sql_text%'

group by substr(sql_text,1,80) having count(*) > 100;

46

Michael S. Abbey – Advanced DBA Best Practices

Why do you think Oracle writes that alert log anyways?

47

Michael S. Abbey – Advanced DBA Best Practices

Monitoring Alert log

• Per instance • Significant errors • Lots of meaningless gobbledygook • Establish a marker – Read on – Set new marker

• Ignore list

00600 03113 01142 01598

00604 06512 07445 01659 01146 01545

Err on the side of the client—if the pages are not necessary, add to the exclude list.

48

Michael S. Abbey – Advanced DBA Best Practices

Who discards the state of those packages anyways?

49

Michael S. Abbey – Advanced DBA Best Practices

Monitoring Invalid objects

• SYS and SYSTEM – Expect DBMS_ invalid packages – Run dbmsxxxx,sql & prvtxxxx.plb – Interdependencies cause one to invalidate other • DBA_DEPENDENCIES

oracle> grep –il dbms_job *sql a0800150.sql catjobq.sql dbmsjob.sql e0800150.sql statsauto.sql statscusr.sql statspack.sql oracle> sqlplus /nolog SQL> connect / as sysdba . . . SQL> @dbmsjob . . . . . . SQL> @prvtjob.plb

50

Michael S. Abbey – Advanced DBA Best Practices

Ensure you standby your standby

51

Michael S. Abbey – Advanced DBA Best Practices

Monitoring Standby database – is it up? But I'm still on 8, what should I do??

typeset -i LINES Replace line export log_history=\$log_history 1 with echo "connect / as sysdba internal, and desc v$log_history get rid of the exit"| sqlplus -s /nolog > recid.log /nolog! LINES=`grep RECID recid.log|wc -l` if (( $LINES = 0 )) then echo Standby down exit 1 else echo Standby OK exit 0 fi

52

Michael S. Abbey – Advanced DBA Best Practices

Monitoring Standby database – is it up-to-date? typeset -i CHECKER export log_history=\$log_history CHECKER=`echo "connect / as sysdba set echo off feed off pages 0 select (sysdate-(max(first_time)))*24 from v$log_history;" | sqlplus –s /nolog` if (( $CHECKER > 1 )) then echo Recovery older than 1 hour exit 1 else echo OK exit 0 fi

53

Michael S. Abbey – Advanced DBA Best Practices

54

Monitoring Is standby useable?

• Do an a regular basis • Weekly, bi-weekly, every 48 hours? • Script and inspect output • Significant output (dual??)

*

echo "/ as sysdba alter database open read only; describe dual; shutdown immediate startup nomount; alter database mount standby database;" | sqlplus -s > roc.log LINES=`grep DUMMY roc.log|wc -l` if [ $LINES = 1 ] then echo OK exit 0 else echo Problem @standby ... exit 1 fi

Only required for 8i

*

Michael S. Abbey – Advanced DBA Best Practices

55

Monitoring Direct inserts on master This is a problem on the standby, so ya'd better watch out!

On master, there is no undo or redo for these inserts!

alter session enable parallel dml;

All transactions propagated from master to standby via archived redo logs. Direct inserts not logged!

alter table mailer nologging; insert into mailer select /*+ parallel (mailer,2) */ * from mailer@hasek; commit;

Beware or else

Michael S. Abbey – Advanced DBA Best Practices

Monitoring Direct inserts on master

• mailer table on master row count = 12,345,781 on July 12 • 77,999,201 rows created in mailer on master on July 12 • Standby database activated due to disaster on July 13

select num_rows from user_tables where table_name = 'MAILER'; NUM_ROWS -----------13889778

Over-simplified, but the gist of the problem.

56

Michael S. Abbey – Advanced DBA Best Practices

57

Monitoring Detection of nologging activities col col col col

tablespace_name form a20 head 'Tablespace' file_name form a30 head 'File' tablespace_name form a20 head 'Tablespace' unrecoverable_time form a20 head 'Change Time'

select ddf.file_name,ddf.tablespace_name, vd.unrecoverable_time from sys.dba_data_files ddf,v$datafile vd where ddf.file_name = vd.name and nvl(vd.unrecoverable_time,trunc(sysdate+10)) > to_date('&1','DD-MON-YYYY');

Resolution  Babette

Michael S. Abbey – Advanced DBA Best Practices

Ensure statistics exist for CBO and they are current

58

Michael S. Abbey – Advanced DBA Best Practices

Monitoring Table statistics -- Not select from where and or

analyzed owner,table_name sys.dba_tables owner not in ('SYS','SYSTEM') nvl(num_rows,0) = 0 last_analyzed is null;

-- Not select from where and and

analyzed for pre-determined number of days owner,table_name sys.dba_tables owner not in ('SYS','SYSTEM') last_analyzed is not null trunc(last_analyzed) < trunc(sysdate)-5;

59

Michael S. Abbey – Advanced DBA Best Practices

Make sure YOU are not the bottleneck

60

Michael S. Abbey – Advanced DBA Best Practices

Monitoring The real story

• dba_ and user_ views are expensive • Learn your way around the x$ tables • With credit to Steve Adams (ixora) – Build x_$ views to match their corresponding x$ views – Grant select to public – Reference these views using sys.{view_name}

61

Michael S. Abbey – Advanced DBA Best Practices

Monitoring The real story set pages 0 lines 999 trimsp on echo off ver off feed off spool xdollars select 'create view x_$'||substr(table_name,3)|| ' as select * from '||table_name||';' from user_tables where table_name like 'X$%'; spool off set echo on feed on spool xdollars.log

@xdollars.lst spool off

62

Michael S. Abbey – Advanced DBA Best Practices

Monitoring Dollar signs

• Familiarize yourself with the v$ views • Available when database mounted and not open • Column names inconsistent with dba_ counterparts select table_name from dict where table_name like 'V$%' order by 1;

63

Michael S. Abbey – Advanced DBA Best Practices

64

Monitoring Roadmap to $# select ds.owner, ds.segment_name, ds.partition_name, ds.segment_type, . . . from sys.uet$ e, sys.sys_dba_segs ds, sys.file$ f . . . select /*+ ordered use_nl(e) use_nl(f) */ . . . from sys.sys_dba_segs ds, sys.x$ktfbue e, sys.file$ f DONE

Michael S. Abbey – Advanced DBA Best Practices

Monitoring sys_dba_segs select u.name, o.name, o.subname, . . . from sys.user$ u, sys.obj$ o, sys.ts$ ts, sys.sys_objects so, sys.seg$ s, sys.file$ f . . . select u.name, un.name, NULL, . . . from sys.user$ u, sys.ts$ ts, sys.undo$ un, sys.seg$ s, sys.file$ f . . . select u.name, to_char(f.file#)||'.'||to_char(s.block#), . . . from sys.user$ u, sys.ts$ ts, sys.seg$ s, sys.file$ f

65

Michael S. Abbey – Advanced DBA Best Practices

Monitoring This is the end

select select select select select select select select select

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

from from from from from from from from from

sys.tab$ t sys.tabpart$ tp sys.clu$ c sys.ind$ i sys.indpart$ ip sys.lob$ l sys.tabsubpart$ tsp sys.indsubpart$ isp sys.lobfrag$ lf

66

Michael S. Abbey – Advanced DBA Best Practices

Monitoring Caveat at upgrade time

67

Michael S. Abbey – Advanced DBA Best Practices

Monitoring So many alerts!!

68

Michael S. Abbey – Advanced DBA Best Practices

The autoextensible black hole revealed

69

Michael S. Abbey – Advanced DBA Best Practices

Monitoring Autoextension

• Default for many installations • 2 serious issues when requested extension – over 2Gb limit – cannot be physically accommodated one device

• Oracle is known to not do a very good job of recovering from aborted autoextension • Cleanup after abend not handled well

70

Michael S. Abbey – Advanced DBA Best Practices

Monitoring Autoextension create table aemon ( file_name sdate bytes insert select from where

varchar2(30), date number);

into aemon file_name,sysdate,bytes dba_data_files autoextensible = 'YES';

71

Michael S. Abbey – Advanced DBA Best Practices

Monitoring Autoextension select fst.file_name, fst.bytes, fsy.bytes, round((fst.bytes-fsy.bytes)/fsy.bytes *100,2) from aem fsy, aem fst where fst.file_name = fsy.file_name and trunc(fst.sdate) = trunc(sysdate) and trunc(fsy.sdate) = trunc(sysdate-1) and fst.bytes > fsy.bytes;

72

Michael S. Abbey – Advanced DBA Best Practices

Monitoring Best practices

• Connection testing • Anticipate common problematic areas • Be thorough and proactive • Email gateway • Share the load

• Page and/or email • Document via some form of tracking system • MetaLink MetaLink MetaLink MetaLink MetaLink MetaLink

73

Michael S. Abbey – Advanced DBA Best Practices

INIT.ora

Best practices NOW will payoff down the road

74

Michael S. Abbey – Advanced DBA Best Practices

INIT.ora • • • • •

Organization Compatibility Shared pool Ramifications Undocumented parameters

75

Michael S. Abbey – Advanced DBA Best Practices

INIT.ora must be clean and readable

76

Michael S. Abbey – Advanced DBA Best Practices

77

INIT.ora Organization

• Not a fan of ifile • Alphabetical order sort < initumc.ora > sio cp sio initumc.ora rm sio

• Clean up dbs directory – What is soxx??

Significant defaults – Hard-code – Movements between versions

• Toggles stay in place • Comment changes • Show parameters

Michael S. Abbey – Advanced DBA Best Practices

INIT.ora Compatibility

• Hard-code – Surprises during upgrades – Are you going far enough

• New features – Can I use them? – Can I go back?

• Access to new features • Changed behaviour of old features

78

Michael S. Abbey – Advanced DBA Best Practices

Wading through the shared pool

79

Michael S. Abbey – Advanced DBA Best Practices

INIT.ora Shared pool

• Increasing demands as version increases • CURSOR_SHARING in 8.1.6 is a big deal – – – –

Default is EXACT Preferred is FORCE Linux 8.1.7 Alpha 8.1.6

• Bigger is not always better • 4031 errors centre around 4096 – _shared_pool_reserved_min_alloc

at 4000 • Flushing the pool – Manual or transparently – A double-edged sword

• Get yourself in a bind

80

Michael S. Abbey – Advanced DBA Best Practices

INIT.ora

81

Michael S. Abbey – Advanced DBA Best Practices

Aware of ramifications when changing values

82

Michael S. Abbey – Advanced DBA Best Practices

INIT.ora Ramifications of higher values • Semaphores are advisory locking mechanisms that ensure a server completes certain tasks before beginning another. • Some parameter values drain semaphores and others look for larger portions of shared memory DB_CACHE_SIZE LARGE_POOL_SIZE SHARED_POOL_SIZE

OPEN_CURSORS PROCESSES

set set set set set set set set set

shmsys:shminfo_shmmax=4294967295 shmsys:shminfo_shmmin=1 shmsys:shminfo_shmmni=100 shmsys:shminfo_shmseg=10 semsys:seminfo_semmni=100 semsys:seminfo_semmsl=500 semsys:seminfo_semmns=500 semsys:seminfo_semopm=1000 semsys:seminfo_semvmx=32767

83

Michael S. Abbey – Advanced DBA Best Practices

More than meets the eye

84

Michael S. Abbey – Advanced DBA Best Practices

INIT.ora Undocumented parameters x$ksppi Name --------ADDR INDX INST_ID KSPPINM KSPPITY KSPPDESC KSPPIFLG

x$ksppcv Type ---------------RAW(4) NUMBER NUMBER VARCHAR2(64) NUMBER VARCHAR2(64) NUMBER

Name ----------ADDR INDX INST_ID KSPPSTVL KSPPSTDF KSPPSTVF KSPPSTCMNT

Type -------------RAW(4) NUMBER NUMBER VARCHAR2(512) VARCHAR2(9) NUMBER VARCHAR2(255)

85

Michael S. Abbey – Advanced DBA Best Practices

86

INIT.ora Undocumented parameters select ksppinm,ksppstvl,ksppdesc from x$ksppi x,x$ksppcv y where x.indx = y.indx and translate(ksppinm,'_','#') like '#%' order by 1 KSPPINSM

KSPPSTVL

KSPPDESC

-------------------------------- --------- --------------------------------_allow_resetlogs_corruption

FALSE

allow resetlogs even if it will cause corruption

_corrupted_rollback_segments

corrupted undo segment list

_db_handles_cached

5

Buffer handles cached each process

_shared_pool_reserved_min_alloc

4400

minimum allocation size in bytes for reserved area of shared pool

Michael S. Abbey – Advanced DBA Best Practices

87

INIT.ora Best practices

• Readable is crucial • Comment changes • Cleanup the dbs directory • Be familiar with memory consumers • Semaphore limitations

• Familiarize yourself with dynamic memory structures in 9i • Block size caches 9i • Watch out for shared_pool_size > 90000000 Issues  Rich

Michael S. Abbey – Advanced DBA Best Practices

Do not wait for WAITs

Best practices NOW will payoff down the road

88

Michael S. Abbey – Advanced DBA Best Practices

Are wait situations detracting from overall performance?

89

Michael S. Abbey – Advanced DBA Best Practices

Do not wait for WAITs • Wait situations are the biggest performance detractor • Latches—protect the integrity of shared memory structures. • Locks—protect the integrity of your data.

• V$ dynamic performance views: – v$waitstat – v$session_wait

• DBA_ views – dba_blockers (catblock.sql)

90

Michael S. Abbey – Advanced DBA Best Practices

Do not wait for WAITs v$session_wait select event,count(*),sum(seconds_in_wait) siw from v$session_wait group by event; EVENT COUNT(*) SIW --------------------------- -------- --------SQL*Net message from client SQL*Net message to client db file sequential read log file parallel write pmon timer rdbms ipc message smon timer

1192 2 5 1 1 24 1

747,039 0 0 0 9,062 128 908

91

Michael S. Abbey – Advanced DBA Best Practices

Where has all the CPU gone?

92

Michael S. Abbey – Advanced DBA Best Practices

Do not wait for WAITs Who's doing what

• Map running SQL to user sessions • Zero in on CPU consumers select from where and and and and

sql_text, sid, serial# v$session s, v$sqlarea sa s.sql_address = sa.address s.sql_hash_value = sa.hash_value s.status = 'ACTIVE' s.audsid != 0 sql_text not like 'select sql_text%';

93

Michael S. Abbey – Advanced DBA Best Practices

Do not wait for WAITs Relationship to system load

• Get a handle on "normal" system load using uptime command • Spool to log file in the crontab, running every 5 minutes */5 /oracle/bin/uptime.sh >> /oracle/logs/uptime.sh.log 2>&1

• High load averages almost always map to SQL*Net message from client wait situations db_file sequential read db file scattered read

94

Michael S. Abbey – Advanced DBA Best Practices

95

Do not wait for WAITs utllockt.sql set charwidth 17 select lpad(' ',3*(level-1))||waiting_session, waiting_session,lock_type,mode_requested, mode_held,lock_id1,lock_id2 from lock_holders connect by prior waiting_session = holding_session start with holding_session is null; WAITING_SESSION

TYPE MODE REQUESTED

MODE HELD

LOCK ID1 LOCK ID2

----------------- ---- ----------------- ----------------- -------- -------553

NONE None

None

0

0

TX

Share (S)

Exclusive (X)

34888

39

378

RW

Exclusive (X)

S/Row-X (SSX)

33255666

2

3928

RW

Exclusive (X)

S/Row-X (SSX)

3255666

2

213

Michael S. Abbey – Advanced DBA Best Practices

96

Do not wait for waits Best practices

• Waiting drains system resources • Wait events cause destructive spinning • Minimizing potential waits foremost in your minds • Commit often

• SQL statement contention • Concurrent user requests for the same data in the cache • DO not exploit multitasking Issues  Rich

Michael S. Abbey – Advanced DBA Best Practices

Integrity of your backups

Best practices NOW will payoff down the road

97

Michael S. Abbey – Advanced DBA Best Practices

Integrity of your backups Media recovery enabled (archivelog mode) 1. Image backups 2. Export

5. INIT.ora 6. listener.ora 7. tnsnames.ora

– No indexes / No constraints – No rows

Assume these are run nightly

3. Control file

98

Michael S. Abbey – Advanced DBA Best Practices

Backup is nada without integrity and recovery testing

99

Michael S. Abbey – Advanced DBA Best Practices

Integrity of your backups Image backups

Best case scenario • Separate server to restore image • Deliberate complete media recovery – recover database . . . – recover datafile . . . – recover tablespace . . .

• Deliberate incomplete recovery at the database level

100

Michael S. Abbey – Advanced DBA Best Practices

Integrity of your backups Image backups

• Mock disaster recovery • Ideally on the same machine – With no downtime, involves an ORACLE_SID change • using backup controlfile is not the Real McCoy

– Plan during a window of opportunity

• Make sure you have performed the recovery portion of your image is NOT tested

101

Michael S. Abbey – Advanced DBA Best Practices

Integrity of your backups Image backups

• NFS device is no substitute for offline storage but … – Mount points all over the corporate server environment – Target of all images and exports

• Run the NFS out to secondary storage • root user buy-in

102

Michael S. Abbey – Advanced DBA Best Practices

Tested rebuild from full database exports

103

Michael S. Abbey – Advanced DBA Best Practices

104

Integrity of your backups Test rebuild from full database export

• Create the database (see in Infrastructure section) • Run 3 or 4 full database imports Just definitions NOT data

1

4

inctype=system

rows=n ignore=y

online rollback segments just built

2

3

inctype=restore

rows=n ignore=y

Michael S. Abbey – Advanced DBA Best Practices

Standby assisting checkup of recovery process

105

Michael S. Abbey – Advanced DBA Best Practices

Integrity of your backups Testing using standby technology

• Shutdown your standby • Re-instantiate (hot  /u02/hot) set pages 0 trimsp on lines 999 echo off feed off select 'scp /u02/hot'||file_name|| ' [email protected]:'||file_name from dba_data_files; set pages 0 trimsp on lines 999 echo off feed off select 'gzip –d '||file_name||'.gz' from dba_data_files;

106

Michael S. Abbey – Advanced DBA Best Practices

Integrity of your backups Testing using standby technology

• Re-get standby control file • Copy to appropriate control_files = locations alter database create standby controlfile as 'standby.ctl';

set pages 0 trimsp on lines 999 echo off feed off select 'cp standby.ctl '||name from v$controlfile;

107

Michael S. Abbey – Advanced DBA Best Practices

Data integrity of your exports

108

Michael S. Abbey – Advanced DBA Best Practices

109

Integrity of your backups How's export written

• Mismatch between UNIX environment and Server character set • Determined by NLS_LANG

Wake-up

Export: Release 9.2.0.5 - Production on Sat Sep 31 16:47:52 2004 (c) Copyright 2001 Oracle Corporation.

All rights reserved.

Connected to: Oracle9i Enterprise Edition Release 9.2.0.5 - Production

With the Partitioning option JServer Release 9.2.0.5 - Production Export done in WE8DEC character set and AL16UTF16 NCHAR character set server uses US7ASCII character set (possible charset conversion)

Michael S. Abbey – Advanced DBA Best Practices

Integrity of your backups Character set conversion

Collège Brébeuf Frhre Norman: Mrs. Jelinski and I were very pleased with our visit to Collhge Bribeuf, and are pleased with what we saw. We are especially happy that we see eye to eye on the preservation of the native Francophone culture with something as simple as accent retention in our Oracle9i database!

110

Michael S. Abbey – Advanced DBA Best Practices

Compression checking your export/import engine

111

Michael S. Abbey – Advanced DBA Best Practices

Integrity of your backups Gee, zip? rm export.pipe > /dev/null 2>&1 mkfifo export.pipe gzip < export.pipe > fulldb.dmp.gz & sleep 2 exp parfile= fulldb.parfile

Usable in its compressed state? 8i

userid=/ full=y log=fulldb indexes=n constraints=n

triggers=n

buffer=5000000 triggers=n file=export.pipe

9i

112

Michael S. Abbey – Advanced DBA Best Practices

Integrity of your backups Gee, unzip? rm import.pipe > /dev/null 2>&1 mkfifo import.pipe gunzip < fulldb.dmp.gz > import.pipe & sleep 2 imp userid=/ file=import.pipe full=y log=fulldb_in buffer=50000000

Better find out sooner than during a disaster recovery!! IMP-00037: Character set marker unknown IMP-00000: Import terminated unsuccessfully

IMP-00009: abnormal end of export file IMP-00000: Import terminated unsuccessfully

113

Michael S. Abbey – Advanced DBA Best Practices

Bottom-line … can I read that export file?

114

Michael S. Abbey – Advanced DBA Best Practices

Integrity of your backups Read this, import! imp userid=/ full=y indexfile=fulldb.sql log=fulldb_if Import: Release 9.2.0.5 - Production on Sat Jun 30 22:13:49 2004 (c) Copyright 2001 Oracle Corporation. All rights reserved. Connected to: Oracle9i Enterprise Edition Release 9.2.0.5 - Production With the Partitioning option JServer Release 9.2.0.5 - Production

Export file created by EXPORT:V09.20.00.05 via conventional path import done in US7ASCII character set and AL16UTF16 NCHAR character set Import terminated successfully without warnings.

115

Michael S. Abbey – Advanced DBA Best Practices

Integrity of your backups Best practices

• Only 10% of the way there without testing recovery • Full and partial components of database • Missing archived redo logs

• Missing control file(s) • Test rebuild from export • Test clone on another server • Role played by your standby

116

Michael S. Abbey – Advanced DBA Best Practices

Infrastructure setup The

Oracle

9i

Best practices NOW will payoff down the road

117

Michael S. Abbey – Advanced DBA Best Practices

Infrastructure setup A word on creating a database I've been an Oracle DBA for 2,000 years (US) and have never created a database; why start now?? I always upgrade

No thanks, sonny, I went to a user group meeting. As soon as I got back to the office I started creating databases. I learned SO MUCH!! You ever tried it?? You need the support N more than me!!

Please sit

o

118

Michael S. Abbey – Advanced DBA Best Practices

Infrastructure setup Creating the database

• 9i Oracle Managed files by specifying – – – – –

db_create_file_dest db_create_online_log_destn undo_management = auto undo_tablespace = rollback undo_retention = 2000

create database umc undo tablespace rollback default temporary tablespace temp;

• Do it yourself – Create database • • • • • •

controlfile character set maxlogfiles maxloghistory maxlogmembers maxdatafiles

– Datafile – Log file(s)

119

Michael S. Abbey – Advanced DBA Best Practices

Step-by-step database creation; the players

120

Michael S. Abbey – Advanced DBA Best Practices

Infrastructure setup Creating the database yourself

• The SYSTEM tablespace – systemnn.dbf ~ 250m – Set pctincrease 1 (later)

• Redo log groups – At least dual twomembered groups – logmn_gn.ora (member number / group number)

• Construct first nonSYSTEM rollback segment – Acquire 20 extents of ~ 100k each

• Run admin scripts • Test creation

121

Michael S. Abbey – Advanced DBA Best Practices

Infrastructure setup Create database – phase 1 startup nomount create database umc controlfile reuse maxlogfiles 16 maxlogmembers 2 maxdatafiles 2048 maxloghistory 1000 character set we8iso8859p1 datafile '/data01/oracle/umc/dbs1_umc.dbf' size 250m logfile group 1 ('/redo01/umc/log1_g1.dbf', '/redo02/umc/log2_g1.dbf') size 200m, group 2 ('/redo02/umc/log1_g2.dbf', '/redo01/umc/log2_g2.dbf') size 200m;

122

Michael S. Abbey – Advanced DBA Best Practices

123

Infrastructure setup Create database (1) – important points

1. For this or create controlfile 2. Will not error out if files already exist 3. Make an artificially large # 4. Do not allow to default – WE good place to start 5. No smaller 6. 2 dual membered groups

1

startup nomount create database umc controlfile reuse

2

maxlogfiles 16 maxlogmembers 2 maxdatafiles 30

3

maxloghistory 1000 character set

4

datafile '/data01/…' size 250m logfile group 1 ('…1_g1.dbf',

5 6

'…2_g1.dbf') size 200m, group 2 ('…1_g2.dbf', '…2_g2.dbf') size 200m;

Michael S. Abbey – Advanced DBA Best Practices

Infrastructure setup A word on sizing online redo logs

Two choices:

1. Small online redo logs to minimize time to push to standby 2. Customary large redo logs with forced log switches

124

Michael S. Abbey – Advanced DBA Best Practices

Infrastructure setup Create database – phase 2 shutdown startup alter tablespace system default

storage (pctincrease 1); create rollback segment rb_temp tablespace system storage (initial 50k next 50k minextents 20 maxextents 20); alter rollback segment rb_temp online;

125

Michael S. Abbey – Advanced DBA Best Practices

126

Infrastructure setup Create database (2) – important points 1 1. No more to be done nomount – rest of work requires 2 instance to be open. 2. Permit pmon to automatically coalesce free space in SYSTEM 3. First non-SYSTEM rollback segment (~1Mb) 4. Rollback segments created OFFLINE by default; edit INIT.ora at the same time so you do not forget shutdown startup

alter tablespace system default storage (pctincrease 1);

create rollback segment rb_temp

3

tablespace system storage (initial 50k next 50k minextents 20 maxextents 20);

alter rollback segment rb_temp online;

4

Michael S. Abbey – Advanced DBA Best Practices

Infrastructure setup Create database – phase 3 @?/rdbms/admin/catalog

Build the data dictionary

@?/rdbms/admin/catproc

Install PL/SQL

@?/rdbms/admin/catrep

Replication

@?/rdbms/admin/catsnap

Snapshot specifics

@?/rdbms/admin/dbmsutil

Popular utility packages

@?/rdbms/admin/prvtutil.plb

@?/rdbms/admin/dbmssql @?/rdbms/admin/prvtsql.plb

""

SQL utilities ""

127

Michael S. Abbey – Advanced DBA Best Practices

128

Infrastructure setup Create database – phase 4 Right option(s)

Version numbering EE/Standard Expected feedback

Michael S. Abbey – Advanced DBA Best Practices

Infrastructure setup

Database is created Data dictionary has been populated First non-system rollback segment exists and is online

129

Michael S. Abbey – Advanced DBA Best Practices

Infrastructure setup pupbld.sql

130

Michael S. Abbey – Advanced DBA Best Practices

Fluency in rollback segment setup

131

Michael S. Abbey – Advanced DBA Best Practices

Infrastructure setup Rollback segments

• 4 to 6 equally-sized • Large segment for large segments transactions • minextents and maxextents – 2 to 4Gb the same at creation time – Larger extent size • 500k to 2Mb extents – Cap at creation time • Not in locally managed • No guarantee unless the tablespaces only one online • Mentioned in INIT.ora

132

Michael S. Abbey – Advanced DBA Best Practices

133

Infrastructure setup Rollback segment tablespace(s)

• Dedicated tablespace • Appropriately named

File names contain tablespace name.

create tablespace rollback datafile '/u3/oradata/umc/rollback01.dbf' size 1024m, '/u5/oradata/umc/rollback02.dbf' size 1024m, '/u5/oradata/umc/rollback03.dbf' size 1024m, '/u5/oradata/umc/rollback04.dbf' size 1024m;

Michael S. Abbey – Advanced DBA Best Practices

Infrastructure setup Rollback segment creation create rollback segment rbs01 tablespace storage (initial 2m next 2m minextents 499 maxextents 499); create rollback segment rbs02 tablespace storage (initial 2m next 2m minextents 499 maxextents 499); create rollback segment rbs03 tablespace storage (initial 2m next 2m minextents 499 maxextents 499); create rollback segment rbs04 tablespace storage (initial 2m next 2m minextents 499 maxextents 499);

rollback

rollback

rollback

rollback

ROLLBACK_SEGMENTS = (rbs01,rbs02,rbs03,rbs04)

134

Michael S. Abbey – Advanced DBA Best Practices

Empowering the techies with do-it-yourself

135

Michael S. Abbey – Advanced DBA Best Practices

136

Infrastructure setup v$dba

• v$ dynamic performance views • Over 200 with 9i – most accessible when database mounted • DBA_ dictionary views similar to their USER_ counterparts with ownership column • There's nothing to hide • Grant access but no public synonyms

Mother may I ??

Michael S. Abbey – Advanced DBA Best Practices

Infrastructure setup v$dba connect / as sysdba set echo off pages 0 lines 999 trimsp on feed off spool veedba select 'grant select on '||view_name||' to public;' from user_views where view_name like 'DBA%' or view_name like 'V_$%';

• Often used here and there by applications • V$ public synonyms probably exist • Granting must be done on view, not public synonym for V$ to avoid ORA-02030: can only select from fixed tables/views

137

Michael S. Abbey – Advanced DBA Best Practices

Fluency in locally managed

138

Michael S. Abbey – Advanced DBA Best Practices

Infrastructure setup Locally managed tablespaces

• Different syntax than DM counterparts • Temporary files end up in DBA_TEMP_FILES • Free space bitmap in datafile headers • Reduced recursive I/O

• Extent management local – autoallocate turns Oracle loose with extent sizing • Objects of differing sizes • Lots of different sized extents

– uniform size {} defaults to 1Mb

139

Michael S. Abbey – Advanced DBA Best Practices

Infrastructure setup Locally managed tablespaces create tablespace loc_geo_index datafile '/u01/oradata/loc_geo_index01.dbf' size 2000m, '/u04/oradata/loc_geo_index01.dbf' size 2000m extent management local autoallocate ;

create tablespace loc_geo_index datafile '/u01/oradata/loc_geo_index01.dbf' size 2000m, '/u04/oradata/loc_geo_index01.dbf' size 2000m extent management local uniform size 20m;

140

Michael S. Abbey – Advanced DBA Best Practices

Infrastructure setup LM temp tablespace create temporary tablespace loc_temp datafile '/u01/oradata/loc_temp01.dbf' size 2000m, '/u04/oradata/loc_temp02.dbf' size 2000m extent management local uniform size 20m;

• Keep extents in TEMP below 1000 • Space allocated then controls uniform size • Great deal of the work done at startup involves reconciliation and transfer of block ids from free to unallocated (fet$ to uet$)

141

Michael S. Abbey – Advanced DBA Best Practices

Infrastructure setup Best practices

• Make a point of starting from the beginning (create database) • Pay attention to each piece in the puzzle • Completeness checking at the end

• Practice practice practice • Do temp and rollback right • Know your friendly neighbourhood admin scripts

142

Michael S. Abbey – Advanced DBA Best Practices

Schema Environments

Best practices NOW will payoff down the road

143

Michael S. Abbey – Advanced DBA Best Practices

Establish and follow guidelines

144

Michael S. Abbey – Advanced DBA Best Practices

Schema environments Guidelines

• Thou shalt not give user an overrich environment • Thou shalt not sort or default to SYSTEM • Thou shalt occupy space in appropriately-named tablespaces • Thou shalt not have DBA, CONNECT, or RESOURCE

145

Michael S. Abbey – Advanced DBA Best Practices

Smart when setting up your user environments

146

Michael S. Abbey – Advanced DBA Best Practices

147

Schema environments User creation • Creating a user • Temporary tablespace • Use O/S authorization for all host-based users • Connection and privileges depend on function

create user sample identified by sx_p0 temporary tablespace loc_temp; alter user sample identified externally;

-- Jack and Jill users grant create session to jj_user;

Michael S. Abbey – Advanced DBA Best Practices

Schema environments Application data users

• Give necessary privileges and no more grant create table, create view, create procedure, create trigger, create synonym, create snapshot, create database link to sample;

• Who has more than they need?? • Who has been given DBA • Are the any privileges given out correctly?

148

Michael S. Abbey – Advanced DBA Best Practices

Schema environments Who has more than they need?? select grantee, privilege -- SAMPLE is a schema from sys.dba_sys_privs -- deliberately set up to where privilege not in -- set the standard (select privilege from sys.dba_sys_privs where grantee = 'SAMPLE') UNION select grantee, granted_role from sys.dba_role_privs where granted_role in ('DBA','CONNECT', 'RESOURCE','EXP_FULL_DATABASE', 'IMP_FULL_DATABASE') order by 1;

149

Michael S. Abbey – Advanced DBA Best Practices

Schema environments Who has more than they need?? GRANTEE -----------------ABRAMSON ABRAMSOM JACKSON JACKSON JONES REDMOND THOMSON THOMSON THOMSON UQUART UQUART

PRIVILEGE ----------------------DBA DROP PUBLIC SYNONYM CONNECT RESOURCE DBA SELECT ANY TABLE DBA INSERT ANY TABLE UPDATE ANY TABLE DBA UNLIMITED TABLESPACES

150

Michael S. Abbey – Advanced DBA Best Practices

Adopt conventions that make sense

151

Michael S. Abbey – Advanced DBA Best Practices

Schema environments Naming conventions

• Plan for the future • Picture yourself at 4:15 am weeding through cryptic names • Bind tablespace names to owner USERNAME • Marry data and index tablespace names

152

Michael S. Abbey – Advanced DBA Best Practices

Schema environments Naming tablespaces

• Based on USERNAME create tablespace DELIVERY datafile -- Data segments '/u01/oracle/oradata/delivery01.dbf' size 1024m, '/u05/oracle/oradata/delivery02.dbf' size 1024m default storage (initial 100m next 100, pctincrease 0);

• Based on function (data or index) create tablespace DELIVERYX datafile -- Index segments '/u02/oracle/oradata/deliveryx01.dbf' size 1024m, '/u03/oracle/oradata/deliveryx02.dbf' size 1024m default storage (initial 100m next 100, pctincrease 0);

153

Michael S. Abbey – Advanced DBA Best Practices

Schema environments Naming tablespaces - violators

Define rules first, implement, and track – Data segment names = USERNAME – Index segment names = USERNAME with X – Partitioned objects = USERNAME followed by underscore ~ X for index partitions ~ PTS for partitioned tablespace select from where or

distinct tablespace_name sys.dba_segments tablespace_name not in (owner,owner||'X') (tablespace_name not in ('%'||owner||'%X%'||'%PTS%') or tablespace_name not in ('%'||owner||'%PTS%'));

154

Michael S. Abbey – Advanced DBA Best Practices

Schema environments Naming partitions

• Object name • Index non-unique or unique indicator + sequential number • Underscore separators • Pnnnn forcing fixedlength names for sorts • Abbreviate carefully

• Imbed hp for hashpartitioned objects – Affects syntax for maintenance – Affects how operations are carried out

• Fix names after merges and splits

155

Michael S. Abbey – Advanced DBA Best Practices

Schema environments Data partitions create table mail (originator varchar2(40), created date, . . . . . . read varchar2(1)) storage (initial 200m next 200m pctincrease 0) partition by range (created) (partition post_mail_p0001 values less than (to_date('01-JAN-2001','DD-MON-YYYY')) tablespace post_mail_pts_0001, partition post_mail_p0002 values less than (to_date('01-JUL-2001','DD-MON-YYYY')) tablespace post_mail_pts_0002, partition post_mail_p0003 values less than (to_date('01-JAN-2002','DD-MON-YYYY')) tablespace post_mail_pts_0003, . . . . . . partition post_mailing_pmax values less than (maxvalue) tablespace post_mail_pts_max);

156

Michael S. Abbey – Advanced DBA Best Practices

Schema environments Index partitions create index mail_n1 on mail (originator) (partition post_mail_n1_p0001 values less than tablespace post_mailx_pts_0001, partition post_mail_n1_p0002 values less than tablespace post_mailx_pts_0002, partition post_mail_n1_p0003 values less than tablespace post_mailx_pts_0003, . . . . . . partition post_mail_n1_pmax values less than (maxvalue) tablespace post_mailx_pts_max);

157

Michael S. Abbey – Advanced DBA Best Practices

Schema environments Naming indexes Table name Abbreviation(s) for column(s) in index

Table name

N for non-unique indexes U for unique indexes Separate series for each type 2 schools of thought

158

Michael S. Abbey – Advanced DBA Best Practices

Key index decisions

159

Michael S. Abbey – Advanced DBA Best Practices

Schema environments Unique index vs. constraint

• Primary key constraints – Always name with _PK suffix – With using index are the same as unique indexes – Allow foreign key references alter table mailer add constraint mailer_pk primary key (id) using index storage (initial 300m next 300m pctincrease 0) tablespace loc_mail_indx;

160

Michael S. Abbey – Advanced DBA Best Practices

Schema environments Best practices

• Users allowed to do what they need and nothing more • Segregate users by function • Adopt and follow naming conventions

• Trap and report on violators • 30 character limit – Abbreviate smartly – Abbreviate consistently – Ensure all players are aware

161

Michael S. Abbey – Advanced DBA Best Practices

Distributed computing

Best practices NOW will payoff down the road

162

Michael S. Abbey – Advanced DBA Best Practices

Manage (not mis-manage) your replication environment

163

Michael S. Abbey – Advanced DBA Best Practices

Distributed computing Snapshots are a snap

• • • • •

Use same name as master table Give them storage parameters just like tables Negotiate refresh interval Ensure there are no premature refreshes Existing refresh intervals . . .

select job,what,interval from user_jobs where lower(what) like 'dbms_refresh%';

164

Michael S. Abbey – Advanced DBA Best Practices

Distributed computing Indexes on snapshots

• • • •

Primary key snapshots preferred ROWID (à la Oracle7) still supported in 9i PK constraint created with create snapshot Check for secondary indexes on snapshots by referring back to master • Do not check and forget—do so on a regular basis

165

Michael S. Abbey – Advanced DBA Best Practices

Distributed computing Indexes on snapshots On master create snapshot log on vendor_prod storage (initial 2m next 2m pctincrease 0) tablespace sn_logs;

On remote

snapshot + secondary indexes

create snapshot vendor_prod refresh fast start with sysdate next sysdate+10/1440 as select * from vendor_prod@product tablespace loc_snaps;

166

Michael S. Abbey – Advanced DBA Best Practices

Thoroughness of indexing your replicated objects

167

Michael S. Abbey – Advanced DBA Best Practices

Distributed computing Indexes on snapshots—completeness check col inm form a10 head Index col column_name form a7 head Column col column_position form 999 head Pos

break on inm select from where minus select from where order

index_name inm,column_position,column_name user_ind_columns table_name = upper('&1') index_name inm,column_position,column_name user_ind_columns@product table_name = upper('&1') by 1,2;

168

Michael S. Abbey – Advanced DBA Best Practices

Many many listeners

169

Michael S. Abbey – Advanced DBA Best Practices

Distributed computing Some port with that?

• Use different ports for different connection requests • Separate by source – By web server – By connection type (jvm, cgi)

• Speak with the SA before choosing ports • Must be reflected on client(s)

170

Michael S. Abbey – Advanced DBA Best Practices

171

Distributed computing Multiple ports / multiple listeners LISTENER1521 = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))) (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = mofo1)(PORT = 1521))))) LISTENER1522 = (DESCRIPTION_LIST = (DESCRIPTION = tnsnames.ora aliases must reflect right port (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))) (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = mofo1)(PORT = 1522)))))

#s

Michael S. Abbey – Advanced DBA Best Practices

Distributed computing Best practices

• Know how to replicate • Fundamental to the Internet environment • Offloading of processing crucial to life expectancy of sites with very large user community

• Completeness in your replication environment • Multiple listeners • Listener per snapshot (if enough to go around) • Fluency with DBMS_JOB package

172

Michael S. Abbey – Advanced DBA Best Practices

Cost-based optimizer

Best practices NOW will payoff down the road

173

Michael S. Abbey – Advanced DBA Best Practices

174

Cost-based optimizer DBA's best-friend

• Collecting of statistics like – – – –

C Number of rows Average row length Distinct column values High value / low value

• Run unattended periodically from crontab

• Frequency decisions

B O

– Consult IT personnel – Stale statistics more harm than good

• Using SQL*Plus analyze command OR PL/SQL packages • Inspect last_analyzed

Michael S. Abbey – Advanced DBA Best Practices

Decisions / approaches

175

Michael S. Abbey – Advanced DBA Best Practices

176

Cost-based optimizer Setup

• analyze is not going any where (yet) with C 9i and 10g • Perform from a central user • Preferably O/S authenticated [externally]

create user analyzer identified by pw; alter user analyzer identified externally;

B

grant create session to analyzer; grant analyze any to analyzer; O

We always identify externally

Michael S. Abbey – Advanced DBA Best Practices

177

Cost-based optimizer How often

• Size based – Pick a size – Treat those above threshold differently

• Usage based – Track most frequently changed objects – Exclude hot objects / treat differently

Michael S. Abbey – Advanced DBA Best Practices

Ensure you begin at the beginning

178

Michael S. Abbey – Advanced DBA Best Practices

Cost-based optimizer In the beginning

• • • • • •

Delete statistics EVERYWHERE Flip or set entry in INIT.ora Liaise with user community Pick 2 or 3 days a week Assess run time Assess impact on system

179

Michael S. Abbey – Advanced DBA Best Practices

180

Cost-based optimizer Deleting statistics set echo off pages 0 trimsp on lines 999 spool stat_del.sql select 'exec dbms_stats.delete_schema_stats (ownname=>'|| ''''||username||''''||')'

from sys.dba_users where username not in ('SYS','SYSTEM'); spool off set echo on feed on

spool stat_del @stat_del spool off

Michael S. Abbey – Advanced DBA Best Practices

Cost-based optimizer Method

• Tables – Estimate sample {2-10} percent – Populates USER_TABLES

• Indexes – Compute – Populates USER_IND_COLUMNS

• Nothing short of a windfall

181

Michael S. Abbey – Advanced DBA Best Practices

Always be aware of your options

182

Michael S. Abbey – Advanced DBA Best Practices

Cost-based optimizer Using PL/SQL procedure PROCEDURE GATHER_SCHEMA_STATS Argument Name Type ----------------- ---------OWNNAME VARCHAR2 ESTIMATE_PERCENT NUMBER BLOCK_SAMPLE BOOLEAN METHOD_OPT VARCHAR2 DEGREE NUMBER GRANULARITY VARCHAR2 CASCADE BOOLEAN STATTAB VARCHAR2 STATID VARCHAR2 OPTIONS VARCHAR2 OBJLIST DBMS_STATS STATOWN VARCHAR2

In/Out -----IN IN IN IN IN IN IN IN IN IN OUT IN

Default? -------DEFAULT DEFAULT DEFAULT DEFAULT DEFAULT DEFAULT DEFAULT DEFAULT DEFAULT DEFAULT

183

Michael S. Abbey – Advanced DBA Best Practices

Four-part approach 1. Initialization parameters 2. Place objects in monitoring mode 3. Place a stake in the ground for each schema 4. Schedule regular statistic collection I. Do not use for Oracle Applications II. Do not use for third party apps – liaise with vendors

184

Michael S. Abbey – Advanced DBA Best Practices

1 – INIT.ora

185

Michael S. Abbey – Advanced DBA Best Practices

2 - Turn on monitoring set pages 0 lines 999 trimsp on feed off spool monon select 'alter table '||owner||'.'||table_name|| ' monitoring;' from sys.dba_tables where owner not in ('SYS','SYSTEM') and nvl(duration,'X') 'SYS$TRANSACTION'

and nvl(iot_type,'X') 'IOT_OVERFLOW' and nvl(temporary,'X') 'Y' and monitoring 'YES'; spool off

186

Michael S. Abbey – Advanced DBA Best Practices

187

3 – Stake in the ground set lines 999 trimsp on pages 0 spool sitg select unique 'exec dbms_stats.gather_schema_stats (ownname=>'|| ''''||owner||''''||',estimate_percent=>2,'||

'block_sample=>false,method_opt=>'|| ''''||'for all indexed columns size 1'|| ''''||',degree=>8,granularity=>'||''''||'ALL'||''''|| ',cascade=>true);'

from sys.dba_tables where owner not in ('SYS','SYSTEM'); spool off

Michael S. Abbey – Advanced DBA Best Practices

4 – Schedule regular collection • turn on monitoring – for tables not already in monitoring mode

• gather empty – new tables created since last run – tables inadvertently taken out of monitoring mode

• gather stale – those that have changed >= 10%

188

Michael S. Abbey – Advanced DBA Best Practices

4.1 – Turn on monitoring set pages 0 lines 999 trimsp on feed off spool monon select 'alter table '||owner||'.'||table_name|| ' monitoring;' from sys.dba_tables where owner not in ('SYS','SYSTEM') and nvl(duration,'X') 'SYS$TRANSACTION'

and nvl(iot_type,'X') 'IOT_OVERFLOW' and nvl(temporary,'X') 'Y' and monitoring 'YES'; spool off

189

Michael S. Abbey – Advanced DBA Best Practices

190

4.2 – gather empty select unique 'exec dbms_stats.gather_schema_stats '|| '(ownname=>'||''''||owner||''''|| ',estimate_percent=>1,block_sample=>false,'|| 'method_opt=>'||''''|| 'for all indexed'|| ' columns'||' size 1'||''''||',options=>'|| ''''||'gather empty'||''''||',degree=>8,'|| 'granularity=>'||''''||'ALL'||''''|| ',cascade=>true);' from sys.dba_tables where owner not in ('SYS','SYSTEM');

Michael S. Abbey – Advanced DBA Best Practices

191

4.3 – gather stale select unique 'exec dbms_stats.gather_schema_stats '|| '(ownname=>'||''''||owner||''''|| ',estimate_percent=>1,block_sample=>false,'|| 'method_opt=>'||''''|| 'for all indexed'|| ' columns'||' size 1'||''''||',options=>'|| ''''||'gather stale'||''''||',degree=>8,'|| 'granularity=>'||''''||'ALL'||''''|| ',cascade=>true);' from sys.dba_tables where owner not in ('SYS','SYSTEM');

Michael S. Abbey – Advanced DBA Best Practices

192

Rationalize the approach break on owner on table_name set pages 70 col table_name form a24 col partition_name form a24 col owner form a16 col pct form 999,999.9 select a.owner,a.table_name,b.partition_name, a.num_rows, (inserts+updates+deletes)/num_rows*100 pct, last_analyzed from sys.dba_tables a,sys.dba_tab_modifications b where a.table_name = b.table_name and a.owner = b.table_owner and (inserts+updates+deletes)/num_rows > .1 and nvl(num_rows,0) 0 order by 1,2

Michael S. Abbey – Advanced DBA Best Practices

Tried, tested, and true analyze (but not recommended unless you have no choice)

193

Michael S. Abbey – Advanced DBA Best Practices

Cost-based optimizer Using analyze set echo off pages 0 feed off lines 999 trimsp on spool anaall.sql {analyze tables and indexes code} spool off

set echo on timi on feed on spool anaall @anaall spool off

Put the pieces together over the next 3 slides

194

Michael S. Abbey – Advanced DBA Best Practices

Cost-based optimizer Using analyze on non-partitioned tables

select 'analyze table '||owner||'.'||table_name|| ' estimate statistics for table sample '||

'20 percent;' from sys.dba_tables where owner not in ('SYS','SYSTEM') and partitioned = 'NO' order by owner,table_name;

195

Michael S. Abbey – Advanced DBA Best Practices

Cost-based optimizer Using analyze on non-partitioned indexes select 'analyze index '||owner||'.'||

index_name|| ' compute statistics;' from sys.dba_indexes where owner not in ('SYS','SYSTEM') and partitioned = 'NO' order by owner,index_name;

196

Michael S. Abbey – Advanced DBA Best Practices

Cost-based optimizer Using analyze on partitioned tables select 'analyze table '||table_owner||'.'|| '.'||table_name||

' partition ('||partition_name||')'|| ' estimate statistics sample 2 percent;' from sys.dba_tab_partitions where table_owner not in ('SYS','SYSTEM') order by table_owner,table_name,partition_name;

197

Michael S. Abbey – Advanced DBA Best Practices

Cost-based optimizer Using analyze on partitioned indexes select 'analyze index '||index_owner|| '.'||index_name|| ' partition ('||partition_name||')'|| ' compute statistics;'

from sys.dba_ind_partitions where index_owner not in ('SYS','SYSTEM') order by index_owner,index_name,partition_name;

198

Michael S. Abbey – Advanced DBA Best Practices

Not interfering with replication

199

Michael S. Abbey – Advanced DBA Best Practices

Cost-based optimizer Exclusions with snapshots and (owner,table_name) not in (select distinct log_owner,master from sys.dba_snapshot_logs union select log_owner,log_table from sys.dba_snapshot_logs) and (owner,index_name) not in (select a.owner,a.index_name from sys.dba_indexes a, sys.dba_snapshot_logs b where a.table_name = b.master)

200

Michael S. Abbey – Advanced DBA Best Practices

201

Cost-based optimizer Exclusions with snapshots

• • • •

Analyzing collides with snapshot refreshes Restrictive lock inhibits job execution System load can skyrocket Horrific latch contention

6:57pm up 6 day(s), 7:12, 9 users, load average: 1.06, 1.08, 1.10

normal during analyze 4:13am up 8 day(s), 7:12, 9 users, load average: 341.06, 309.08, 301.10

Michael S. Abbey – Advanced DBA Best Practices

Stuff just too big to analyze

202

Michael S. Abbey – Advanced DBA Best Practices

Cost-based optimizer Exclusions – large objects

• DBA nightmare • exclude based on row count • gather stale takes care of most very big tables • if still required – store large table names somwhere – join with dba_tables when building calls to DBMS_STATS

203

Michael S. Abbey – Advanced DBA Best Practices

204

Cost-based optimizer Implementation without study

XDBA

Hastily implemented collection plan

Michael S. Abbey – Advanced DBA Best Practices

Cost-based optimizer Best practices

• Know your options • Adopt an approach • Liaise with consumer • No cowboy implementation • Staleness of statistics

• The whole schema • Ensure new objects are analyzed – Whose responsibility – Step in promotion of code and dependent objects

• ONLY option

205

Michael S. Abbey – Advanced DBA Best Practices

Application tuning

Best practices NOW will payoff down the road

206

Michael S. Abbey – Advanced DBA Best Practices

Allow everyone to EXPLAIN themselves

207

Michael S. Abbey – Advanced DBA Best Practices

Application tuning plustrce role

• Create at once when setting up a new instance or inheriting an old one • plustrce.sql as SYS from ?/sqlplus/admin • PLAN_TABLE

beforehand using ?/rdbms/admin/utlxplan

• There's nothing to hide • Access to dynamic performance tables used for – v_$sessstat – v_$statname – v_$session

• Give access to all

208

Michael S. Abbey – Advanced DBA Best Practices

AUTOTRACE

and beyond

209

Michael S. Abbey – Advanced DBA Best Practices

210

Application tuning Empowering the developers

• Want to write good code • Arm them with the tools • Imbed testing into coding – education fosters growth

set autot trace exp SP2-0613: Unable to verify PLAN_TABLE format or existence SP2-0611: Error enabling EXPLAIN report

• Centrally managed PLAN_TABLE with public or private synonyms

Michael S. Abbey – Advanced DBA Best Practices

211

Application tuning Foster smart coding habits SQL> set autot trace exp SQL> select * from mailing partition (mailing_p04); Execution Plan ---------------------------------------------------------0 1

SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=164 Bytes=337676) 0

TABLE ACCESS (FULL) OF 'MAILING' (Cost=1 Card=164 Bytes=337676)

SQL> select * from mailing; Execution Plan

---------------------------------------------------------0

SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=984 Bytes=2026056)

1

0

2

1

PARTITION RANGE (ALL) TABLE ACCESS (FULL) OF 'MAILING' (Cost=2 Card=984 Bytes=2026056)

Michael S. Abbey – Advanced DBA Best Practices

Understanding the cost

212

Michael S. Abbey – Advanced DBA Best Practices

Application tuning Cost analysis set echo off term off feed off ver off select decode(id,0,'', lpad(' ',2*(level-1))||level||'.'||position)||' '||

operation||' '||options||' '||object_name||' '|| object_type||' '|| decode(id,0,'Cost = '||position) Query_plan from plan_table

connect by prior id = parent_id and statement_id = upper('&1') start with id = 0 and statement_id = upper('&1');

213

Michael S. Abbey – Advanced DBA Best Practices

Application tuning Listen and listen closely

You can only compare costs between different wordings of the same SQL statement NOT across statements.

You won't get away with it!

214

Michael S. Abbey – Advanced DBA Best Practices

Find potentially problematic SQL statements before it's too late

215

Michael S. Abbey – Advanced DBA Best Practices

Application tuning Buffer gets measurement select buffer_gets,sql_text,executions, buffer_gets/executions from v$sqlarea where buffer_gets > 200000

Good place to start

and v$sqlarea.executions != 0 order by buffer_gets/executions desc

216

Michael S. Abbey – Advanced DBA Best Practices

Assess I/O balance while applications interact with instance

217

Michael S. Abbey – Advanced DBA Best Practices

218

Application tuning I/O balance - primer col file_name form a30 head File col tablespace_name form a20 head Tbsp col a new_value preads col c new_value pwrites select sum(phyrds) a,sum(phywrts) c from v$filestat;

/u02 /u04

select file_name,tablespace_name, phyrds/&b*100 pctrd,phywrts/&d*100 pctwrt from sys.dba_data_files ddf,v$filestat vf where ddf.file_id = vf.file# and (phyrds/&preads*100 > 5 or phywrts/&pwrites*100 > 5) order by 3;

Michael S. Abbey – Advanced DBA Best Practices

Application tuning Best practices

• Share the responsibility • Make inroads with management

• Balanced I/O patterns • Arm the developers so they can help themselves

• Compare relative costs within different wordings of the same statement • Imbed in program development • Pick reasonable measurement indicators

219

Michael S. Abbey – Advanced DBA Best Practices

Working with OSS

Best practices NOW will payoff down the road

220

Michael S. Abbey – Advanced DBA Best Practices

Working with OSS MetaLink

• The first place to start • Be smart with your search criteria • Save yourself and OSS time • Someone else's problem yesterday is yours today • Learn from others' experience

221

Michael S. Abbey – Advanced DBA Best Practices

Working with OSS Be a smart DBA

• Use profiles – 10 per account – keep them up-to-date – organize in 1 central account

• Familiarize yourself with updates – current O/S? uname –a – current Oracle version tool herald

222

Michael S. Abbey – Advanced DBA Best Practices

Arm yourself with the necessary backup to your request

223

Michael S. Abbey – Advanced DBA Best Practices

224

Working with OSS Profiles

Organize by client and O/S

Michael S. Abbey – Advanced DBA Best Practices

Working with OSS Be specific Problem with rman

Oracle error when doing a list backup command

Unique constraint violation when trying to list backup

225

Michael S. Abbey – Advanced DBA Best Practices

Working with OSS TAR intake

• Keyword scan of free form entry • Routed to subject experts • Response time – 30-60 minutes – Severity 1 next to immediate

• Preferred contact method is email – ensure OSS has correct address – check incoming mail regularily

226

Michael S. Abbey – Advanced DBA Best Practices

227

Working with OSS Tools of the trade

lert log

init.ora

ode

racle error(s)

xplain plan

race file(s)

Michael S. Abbey – Advanced DBA Best Practices

Working with OSS Best practices

• Have realistic expectations • Do your homework first (MetaLink) • Correct contact information

• Be prepared

• Use email—best communications performance • Respond to requests • No games

228

Michael S. Abbey – Advanced DBA Best Practices

Working with OSS

229

Michael S. Abbey – Advanced DBA Best Practices

Hodge-podge

Best practices NOW will payoff down the road

230

Michael S. Abbey – Advanced DBA Best Practices

Hodge-podge Admin scripts

• ?/rdbms/admin • Familiarize yourself with the contents of this directory in your spare time • Two part naming convention – dbmsabcd.sql – prvtabcd.plb

231

Michael S. Abbey – Advanced DBA Best Practices

Hodge-podge Hard-core education Just what do you think you're doing Dave?

232

Michael S. Abbey – Advanced DBA Best Practices

233

Hodge-podge Smart professionals

$$

Michael S. Abbey – Advanced DBA Best Practices

234

Hodge-podge In a bind

• Work with your developers to bind everything – perl – SQL*Plus – AOWBI

• Re-usable SQL • Computation of hash value very restrictive

select from where group

sql_text,count(*) v$sqlarea instr(sql_text,'":SY"') > 0 by sql_text;

select count(*) from v$sqlarea; select count(*) from v$sqlarea where sql_text like '%'||''''||'%';

Michael S. Abbey – Advanced DBA Best Practices

235

Hodge-podge Index foreign keys

• Development requires primary/foreign key relationships to protect data integrity • Primary key constraints using index • Never think of or take the time to oops! index foreign key columns • Locks on deleting from parent

primary key index foreign key INDEX

HUGE locking problems

col table_name form a20 head Table col column_name form a30 heading 'Missing index for FK'

Michael S. Abbey – Advanced DBA Best Practices

Hodge-podge Finding non-indexed foreign keys select dc.table_name,dcc.column_name from sys.dba_constraints dc, sys.dba_cons_columns dcc where dc.constraint_type = 'R' and dc.constraint_name = dcc.constraint_name and dc.owner not in ('SYS','SYSTEM') and not exists (select ' ' from sys.dba_indexes di,sys.dba_ind_columns dic where di.index_name = dic.index_name and di.table_name = dc.table_name and dic.column_name = dcc.column_name);

236

Michael S. Abbey – Advanced DBA Best Practices

Hodge-podge Manage RI before it manages you • Frustrating venture • Endless Oracle errors • constraint_type – C for check • Protection as well as integrity – R for reference – P for primary

• r_constraint_name • r_owner

237

Michael S. Abbey – Advanced DBA Best Practices

Hodge-podge Manage RI before it manages you

SYS_ SYS_

alter table … add constraint …_pk primary key (…) using index storage (initial N next N pctincrease 0) tablespace …; alter table … add constraint …_fk foreign key (…) references … (…);

Thou shalt name your constraints Thou shalt alter table … add constraint

238

Michael S. Abbey – Advanced DBA Best Practices

239

Hodge-podge

Saving foreign key constraints – part 1 select 'alter table '||uc1.owner||'.'||uc1.table_name|| chr(10)||' drop constraint '|| uc1.constraint_name||';' from user_constraints uc1, -- foreign key constraint def user_constraints uc2, -- primary key constraint def user_cons_columns ucc1, -- columns in foreign key user_cons_columns ucc2 -- columns in primary key where uc1.r_constraint_name = upper(uc2.constraint_name) and ucc2.constraint_name = upper(uc2.constraint_name) and ucc1.constraint_name = uc1.constraint_name and uc2.table_name in ({list_of_tables});

DBAs worth their weight in gold

Michael S. Abbey – Advanced DBA Best Practices

Hodge-podge

Saving foreign key constraints – part 2 select 'alter table '||uc1.owner||'.'||uc1.table_name|| ' add constraint '||chr(10)||' '|| uc1.constraint_name||chr(10)||' foreign key ('|| ucc1.column_name||')'|| ' references '||uc2.owner||'.'||uc2.table_name|| ' ('||ucc2.column_name||');' from user_constraints uc1, -- foreign key constraint def user_constraints uc2, -- primary key constraint def user_cons_columns ucc1, -- columns in foreign key user_cons_columns ucc2 -- columns in primary key where uc1.r_constraint_name = upper(uc2.constraint_name) and ucc2.constraint_name = upper(uc2.constraint_name) and ucc1.constraint_name = uc1.constraint_name and uc1.table_name in ({list_of_tables});

240

Michael S. Abbey – Advanced DBA Best Practices

Hodge-podge

Extract source code – procedures / functions

• Be prepared / be smart • Quicker and more useful than alter procedure GEO_MAINT compile; sho errors package geo_maint set lines 9999 trimsp on pages 0 echo off feed off ver off sqlbl on spool pf select decode(line,1,'create or replace '||text,text) from user_source where name = upper('&1') order by line; prompt / spool off

241

Michael S. Abbey – Advanced DBA Best Practices

Hodge-podge Extract source code - packages set lines 9999 trimsp on pages 0 echo off feed off ver off sqlbl on spool pkg select decode(line,1,'create or replace '||text,text) from user_source where name = upper('&1') and type = 'PACKAGE' order by line; prompt / prompt select decode(line,1,'create or replace '||text,text) from user_source where name = upper('&1') and type = 'PACKAGE BODY' order by line; prompt / spool off

242

Michael S. Abbey – Advanced DBA Best Practices

Hodge-podge Global partitioned indexes

• Do not have the same partition implementation as their data • Boundaries specified on creation • Must be rebuilt from scratch when performing partition maintenance – adding or dropping – splitting or merging

243

Michael S. Abbey – Advanced DBA Best Practices

Hodge-podge Avoid global index rebuilds

• List or range partitioning • Painstakingly adopted naming convention • Date or surrogate key based approach easiest to work with • Ensure there are no rows in last 2 partitions

244

Michael S. Abbey – Advanced DBA Best Practices

245

Hodge-podge Avoid global index rebuilds

• Partition naming - table – table name + highest possible date – e.g., SUBS_20020831 • format of date mask important • allows for pseudo-sequential queries

it's 3AM – your planning will pay off

• Partition naming – index – table name + index name + U/N/F identifier – unique / non-unique / function-based

Michael S. Abbey – Advanced DBA Best Practices

Hodge-podge Avoid global index rebuilds set pages 0 lines 999 trimsp on ver off echo off col a new_value mxname select from where and

max(partition_name) a dba_tab_partitions table_owner = upper('&1') table_name = upper('&2');

select 'Partitioned table '||upper('&1')||'.'|| upper('&2')||' has '||count(*)|| ' rows in last partition ('||'&mxname'||')' from &1..&2 partition (&mxname) having count(*) = 0; set lines 75

246

Michael S. Abbey – Advanced DBA Best Practices

Hodge-podge Avoid global index rebuilds set echo off feed off pages 0 select distinct '@lp_look '||table_owner|| ' '||table_name from sys.dba_tab_partitions order by table_owner,table_name; . . . SQL> @lp_look TERA WORK SQL> @lp_look TERA YIELD . . . Partitioned table TERA.WORK has 3 rows in last partition (TERA_WORK_P20030630) Partitioned table TERA.YIELD has 8 rows in last partition (TERA_YIELD_P20030831)

247

Michael S. Abbey – Advanced DBA Best Practices

Hodge-podge Shutdown abort When running with or without media recovery enabled SQL> shutdown abort ORACLE instance shutdown. SQL> startup restrict . . . SQL> shutdown . . . ORACLE instance shutdown.

248

Michael S. Abbey – Advanced DBA Best Practices

Hodge-podge A word on OEM

249

Michael S. Abbey – Advanced DBA Best Practices

250

Hodge-podge Weaning yourself of Server Manager

• No more svrmgrl with release 9i • No more internal user • Done exclusively in SQL*Plus, unlike 8i with either/or • Close the one remaining inconsistency between the way these 2 tools behave • Ripple affect on backup scripts

9i

Michael S. Abbey – Advanced DBA Best Practices

Hodge-podge Ensuring tools behave exactly the same way SVRMGR> select count(*), cus_id 2> from reader 3> 4> group by cus_id 5> having count(*) > 1;

SQL> select count(*), cus_id 2> from reader 3> SQL>

• Server Manager tolerates blank lines, whereas SQL*Plus didn't until

251

Michael S. Abbey – Advanced DBA Best Practices

252

Hodge-podge Change in logon procedures

connect internal

8i

9i /nolog connect / as sysdba 10g

Michael S. Abbey – Advanced DBA Best Practices

253

Hodge-podge Online redo log maintenance

• To protect you from yourself, rename the members … Before … select group#,member from v$logfile order by group#,member GROUP# MEMBER ------ ----------------------1 /redo1/beg9/redo01a.log 1 /redo2/beg9/redo01b.log 2 /redo2/beg9/redo02a.log 2 /redo1/beg9/redo02b.log

After … select group#,member from v$logfile order by group#,member GROUP# MEMBER ------ ----------------------1 /redo1/beg9/log1_g1.log 1 /redo2/beg9/log2_g1.log 2 /redo2/beg9/log1_g2.log 2 /redo1/beg9/log2_g2.log

Michael S. Abbey – Advanced DBA Best Practices

254

The chicken or the egg?? practices allow your systems to

Better systems

=

users contribute to a smarter DBA

better.

users.

Michael S. Abbey – Advanced DBA Best Practices

DBA Best Practices

256