Friday, 26 September 2014
Oracle 11 G (Grid) Database Course Detail
Oracle 11g Database - Course :
olor: rgb(221, 221, 221); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: HelveticaNeue, 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; font-size: 14px; line-height: 2; margin-bottom: 9px; margin-left: 0px; margin-right: 0px; margin-top: 61px; overflow-x: hidden; overflow-y: hidden; padding-bottom: 10px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-rendering: optimizelegibility;"> Oracle 11g Database - CoursePresentation Transcript
- Oracle Database Course Details © UWINPro Inc.
- Oracle 11g At UWINPro, our expert Oracle 11g trainers/consultants provide the best Database training.• Course Duration: 90 Hours (30+30+30)• Course Format: Weekends/Weekdays• Mode of Training: - Onsite/Classroom - Online © UWINPro Inc.
- Course Highlights Oracle Database online access Hands on training Reference course related videos Training through slideshows /notes and exercises Case Study - Real time business scenario and a typical Oracle implementation case study Oracle Database Quiz Oracle Database Certification material Sample of interview Questions for Oracle Training Quality Feedback form How to use important Oracle resources © UWINPro Inc.
- Course Details Introduction to SQL (30 Hrs) Introduction to Oracle Database Retrieve Data using the SQL SELECT Statement Learn to Restrict and Sort Data Usage of Single-Row Functions to Customize Output Invoke Conversion Functions and Conditional Expressions Aggregate Data Using the Group Functions Display Data From Multiple Tables Using Joins Use Sub-queries to Solve Queries The SET Operators Data Manipulation Statements Use of DDL Statements to Create and Manage Tables Other Schema Objects Control User Access Management of Schema Objects Manage Objects with Data Dictionary Views Manipulate Large Data Sets Data Management in different Time Zones Retrieve Data Using Sub-queries Regular Expression Support © UWINPro Inc.
- Course Details Administration Workshop I - OCA (30 Hrs) Exploring the Oracle Database Architecture Installing your Oracle Software Creating an Oracle Database Managing the Oracle Database Instance Manage the ASM Instance Configuring the Oracle Network Environment Managing Database Storage Structures Administering User Security Managing Data Concurrency Managing Undo Data Implementing Oracle Database Auditing Database Maintenance Performance Management Backup and Recovery Concepts Performing Database Backups Performing Database Recovery Moving Data Working with Support © UWINPro Inc.
- Course Details Administration Workshop II - OCP (30 Hrs) Core Concepts and Tools of the Oracle Database Configuring for Recoverability Using the RMAN Recovery Catalog Configuring Backup Settings Creating Backups with RMAN Restore and Recovery Task Using RMAN to Perform Recovery Monitoring and Tuning RMAN Diagnosing the Database Using Flashback Technology I Using Flashback Technology II Performing Flashback Database Managing Memory Managing Database Performance © UWINPro Inc.
- Course Details Managing Performance by SQL Tuning Managing Resources Automating Tasks with the Scheduler Managing Space in Blocks Managing Space in Segments Managing Space for the Database Duplicating a Database © UWINPro Inc.
Oracle Database11g DBA Handbook-McGraw Hill Oracle Database
McGraw Hill Oracle Database
McGraw Hill Oracle DatabaseDocument Transcript
- ®Oracle Database11g DBA Handbook
- About the AuthorsBob Bryla is an Oracle 9i and 10g Certified Professional with more than 20 years of experience indatabase design, database application development, training, and Oracle database administration.He is the primary Internet database designer and an Oracle DBA at Lands’ End in Dodgeville,Wisconsin. In his spare time, he is a technical editor for a number of Oracle Press and Apress books, inaddition to authoring several certification study guides for Oracle 10g and Oracle 11g. He hasalso been known to watch science fiction movies and read science fiction novels in his spare time.Kevin Loney, Director of Data Management for a major financial institution, is an internationallyrecognized expert in the design, development, administration, and tuning of Oracle databases.An Oracle developer and DBA since 1987, he has implemented large-scale transaction processingsystems and data warehouses. He is the author of numerous technical articles and the lead author or coauthor of suchbest-selling books as Oracle: The Complete Reference. He regularly presents at Oracle userconferences in North America and Europe, and in 2002 was named Consultant of the Yearby ORACLE Magazine.About the Technical EditorScott Gossett is a Technical Director for Oracle Corporation’s Advanced Technology Solutionsorganization specializing in RAC, performance tuning and high availability databases. Prior tobecoming a technical director, Scott was a Senior Principal Instructor for Oracle Education forover twelve years, primarily teaching Oracle Internals, performance tuning, RAC and databaseadministration classes. In addition, Scott is one of the architects and primary authors of the OracleCertified Masters exam.
- ®Oracle Database11g DBA HandbookBob BrylaKevin LoneyNew York Chicago San FranciscoLisbon London Madrid Mexico City MilanNew Delhi San Juan Seoul Singapore Sydney Toronto
- Copyright © 2008 by The McGraw-Hill Companies, Inc. All rights reserved. Manufactured in the United States of America.Except as permitted under the United States Copyright Act of 1976, no part of this publication may be reproduced or distributedin any form or by any means, or stored in a database or retrieval system, without the prior written permission of the publisher.0-07-159579-1The material in this eBook also appears in the print version of this title: 0-07-149663-7.All trademarks are trademarks of their respective owners. Rather than put a trademark symbol after every occurrence of atrademarked name, we use names in an editorial fashion only, and to the benefit of the trademark owner, with no intention ofinfringement of the trademark. Where such designations appear in this book, they have been printed with initial caps.McGraw-Hill eBooks are available at special quantity discounts to use as premiums and sales promotions, or for use in corporatetraining programs. For more information, please contact George Hoare, Special Sales, at george_hoare@mcgraw-hill.com or (212)904-4069.TERMS OF USEThis is a copyrighted work and The McGraw-Hill Companies, Inc. (“McGraw-Hill”) and its licensors reserve all rights in and tothe work. Use of this work is subject to these terms. Except as permitted under the Copyright Act of 1976 and the right to storeand retrieve one copy of the work, you may not decompile, disassemble, reverse engineer, reproduce, modify, create derivativeworks based upon, transmit, distribute, disseminate, sell, publish or sublicense the work or any part of it without McGraw-Hill’sprior consent. You may use the work for your own noncommercial and personal use; any other use of the work is strictlyprohibited. Your right to use the work may be terminated if you fail to comply with these terms.THE WORK IS PROVIDED “AS IS.” McGRAW-HILL AND ITS LICENSORS MAKE NO GUARANTEES ORWARRANTIES AS TO THE ACCURACY, ADEQUACY OR COMPLETENESS OF OR RESULTS TO BE OBTAINEDFROM USING THE WORK, INCLUDING ANY INFORMATION THAT CAN BE ACCESSED THROUGH THE WORK VIAHYPERLINK OR OTHERWISE, AND EXPRESSLY DISCLAIM ANY WARRANTY, EXPRESS OR IMPLIED, INCLUDINGBUT NOT LIMITED TO IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULARPURPOSE. McGraw-Hill and its licensors do not warrant or guarantee that the functions contained in the work will meet yourrequirements or that its operation will be uninterrupted or error free. Neither McGraw-Hill nor its licensors shall be liable to youor anyone else for any inaccuracy, error or omission, regardless of cause, in the work or for any damages resulting therefrom.McGraw-Hill has no responsibility for the content of any information accessed through the work. Under no circumstances shallMcGraw-Hill and/or its licensors be liable for any indirect, incidental, special, punitive, consequential or similar damages thatresult from the use of or inability to use the work, even if any of them has been advised of the possibility of such damages. Thislimitation of liability shall apply to any claim or cause whatsoever whether such claim or cause arises in contract, tort orotherwise.DOI: 10.1036/0071496637
- Professional Want to learn more? We hope you enjoy this McGraw-Hill eBook! Ifyou’d like more information about this book,its author, or related books and websites,please click here.
- To the gang at home: I couldn’t have done it without you! And the pizzas. —B.B.
- This page intentionally left blank
- Contents at a Glance PART I Database Architecture 1 Getting Started with the Oracle Architecture ............................ 3 2 Upgrading to Oracle Database 11g ................................... 49 3 Planning and Managing Tablespaces ................................... 61 4 Physical Database Layouts and Storage Management ...................... 75 PART II Database Management 5 Developing and Implementing Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 6 Monitoring Space Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 7 Managing Transactions with Undo Tablespaces . . . . . . . . . . . . . . . . . . . . . . . . . . 207 8 Database Tuning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 9 Database Security and Auditing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277 PART III High Availability10 Real Application Clusters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34911 Backup and Recovery Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39112 Using Recovery Manager (RMAN) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41713 Oracle Data Guard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47514 Miscellaneous High Availability Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495 vii
- viii Oracle Database 11g DBA Handbook PART IV Networked Oracle15 Oracle Net ...................................................... 51116 Managing Large Databases .......................................... 54317 Managing Distributed Databases ..................................... 599 Appendix: Installation and Configuration ............................... 635 Index .......................................................... 653
- For more information about this title, click here Contents Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxi PART I Database Architecture1 Getting Started with the Oracle Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 An Overview of Databases and Instances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Instances ..................................................... 5 Oracle Logical Storage Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Tablespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Blocks ....................................................... 7 Extents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Segments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Oracle Logical Database Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Constraints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Users and Schemas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Profiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Sequences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 Synonyms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 PL/SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 External File Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Database Links and Remote Databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 Oracle Physical Storage Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 Datafiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Redo Log Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Control Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Archived Log Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Initialization Parameter Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 ix
- x Oracle Database 11g DBA Handbook Alert and Trace Log Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 Backup Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 Oracle Managed Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Password Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Multiplexing Database Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Automatic Storage Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Manual Multiplexing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 Oracle Memory Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 System Global Area . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 Program Global Area . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 Software Code Area . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 Background Processes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 Backup/Recovery Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Export/Import . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Offline Backups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Online Backups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 RMAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 Security Capabilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 Privileges and Roles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 Auditing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 Fine-grained Auditing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 Virtual Private Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 Label Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 Real Application Clusters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 Oracle Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 Oracle Enterprise Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 Oracle Initialization Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Basic Initialization Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Advanced Initialization Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 2 Upgrading to Oracle Database 11g . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 Choosing an Upgrade Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 Before Upgrading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 Using the Database Upgrade Assistant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 Performing a Manual Direct Upgrade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 Using Export and Import . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Export and Import Versions to Use . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Performing the Upgrade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Using the Data-Copying Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 After Upgrading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 3 Planning and Managing Tablespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 Tablespace Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 Tablespace Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 Optimal Flexible Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 Oracle Installation Tablespaces .......................................... 72 SYSTEM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 SYSAUX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
- Contents xi TEMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 UNDOTBS1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 USERS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 EXAMPLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 Segment Segregation .................................................. 734 Physical Database Layouts and Storage Management . . . . . . . . . . . . . . . . . . . . . . . . . 75 Traditional Disk Space Storage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 Resizing Tablespaces and Datafiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 Moving Datafiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 Moving Online Redo Log Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 Moving Control Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 Automatic Storage Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 ASM Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 Creating an ASM Instance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 ASM Instance Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 ASM Dynamic Performance Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 ASM Filename Formats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 ASM File Types and Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 Administering ASM Disk Groups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 PART II Database Management5 Developing and Implementing Applications ................................ 123 Tuning by Design: Best Practices ......................................... 124 Do As Little As Possible . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 Do It As Simply As Possible . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 Tell the Database What It Needs to Know . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 Maximize the Throughput in the Environment . . . . . . . . . . . . . . . . . . . . . . . . . 129 Divide and Conquer Your Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 Test Correctly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 Standard Deliverables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 Resource Management and Stored Outlines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 Implementing the Database Resource Manager . . . . . . . . . . . . . . . . . . . . . . . . 136 Implementing Stored Outlines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 Sizing Database Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 Using Temporary Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 Supporting Tables Based on Abstract Datatypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 Using Object Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 Security for Abstract Datatypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 Indexing Abstract Datatype Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 Quiescing and Suspending the Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 Supporting Iterative Development ........................................ 158 Iterative Column Definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 Forcing Cursor Sharing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 Managing Package Development . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 Generating Diagrams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
- xii Oracle Database 11g DBA Handbook Space Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 Tuning Goals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 Security Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 Data Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 Version Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 Execution Plans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 Acceptance Test Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 The Testing Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 6 Monitoring Space Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 Common Space Management Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 Running Out of Free Space in a Tablespace . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 Insufficient Space for Temporary Segments . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 Too Much or Too Little Undo Space Allocated . . . . . . . . . . . . . . . . . . . . . . . . . 165 Fragmented Tablespaces and Segments .............................. 166 Oracle Segments, Extents, and Blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 Data Blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 Extents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 Segments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 Data Dictionary Views and Dynamic Performance Views . . . . . . . . . . . . . . . . . . . . . . . 171 DBA_TABLESPACES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 DBA_SEGMENTS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 DBA_EXTENTS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 DBA_FREE_SPACE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 DBA_LMT_FREE_SPACE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 DBA_THRESHOLDS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 DBA_OUTSTANDING_ALERTS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 DBA_ALERT_HISTORY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 V$ALERT_TYPES ............................................... 174 V$UNDOSTAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 V$OBJECT_USAGE ............................................. 175 V$SORT_SEGMENT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 V$TEMPSEG_USAGE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 Space Management Methodologies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 Locally Managed Tablespaces ..................................... 176 Using OMF to Manage Space . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 Bigfile Tablespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 Automatic Storage Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 Undo Management Considerations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 SYSAUX Monitoring and Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 Archived Redo Log File Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 Built-in Space Management Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 Segment Advisor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 Undo Advisor and the Automatic Workload Repository . . . . . . . . . . . . . . . . . . 187 Index Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 Space Usage Warning Levels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 Resumable Space Allocation ...................................... 192 Managing Alert and Trace Files with ADR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 OS Space Management .......................................... 197
- Contents xiii Space Management Scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 Segments That Cannot Allocate Additional Extents . . . . . . . . . . . . . . . . . . . . . . 197 Used and Free Space by Tablespace and Datafile . . . . . . . . . . . . . . . . . . . . . . . 198 Automating and Streamlining the Notification Process . . . . . . . . . . . . . . . . . . . . . . . . . 199 Using DBMS_SCHEDULER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 OEM Job Control and Monitoring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2007 Managing Transactions with Undo Tablespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 Transaction Basics .................................................... 208 Undo Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 Rollback . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 Read Consistency . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 Database Recovery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 Flashback Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 Managing Undo Tablespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 Creating Undo Tablespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 Undo Tablespace Dynamic Performance Views . . . . . . . . . . . . . . . . . . . . . . . . 216 Undo Tablespace Initialization Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 Multiple Undo Tablespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217 Sizing and Monitoring the Undo Tablespace .......................... 220 Read Consistency vs. Successful DML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222 Flashback Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223 Flashback Query ............................................... 223 DBMS_FLASHBACK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225 Flashback Transaction Backout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 Flashback Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 Flashback Version Query . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232 Flashback Transaction Query . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 Flashback Data Archive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236 Flashback and LOBs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 Migrating to Automatic Undo Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2398 Database Tuning ..................................................... 241 Tuning Application Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 Effective Table Design ........................................... 243 Distribution of CPU Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244 Effective Application Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 Tuning SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 Impact of Order on Load Rates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 Additional Indexing Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249 Generating Explain Plans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250 Tuning Memory Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252 Specifying the Size of the SGA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 Using the Cost-Based Optimizer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 Implications of the COMPUTE STATISTICS Option . . . . . . . . . . . . . . . . . . . . . . 257 Tuning Data Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257 Locally Managed Tablespaces ..................................... 257 Identifying Chained Rows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 Increasing the Oracle Block Size . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
- xiv Oracle Database 11g DBA Handbook Using Index-Organized Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260 Tuning Issues for Index-Organized Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 Tuning Data Manipulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 Bulk Inserts: Using the SQL*Loader Direct Path Option . . . . . . . . . . . . . . . . . . 262 Bulk Data Moves: Using External Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263 Bulk Inserts: Common Traps and Successful Tricks . . . . . . . . . . . . . . . . . . . . . . 264 Bulk Deletes: The truncate Command ............................... 265 Using Partitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 Tuning Physical Storage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267 Using Raw Devices ............................................. 267 Using Automatic Storage Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267 Reducing Network Traffic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268 Replication of Data Using Materialized Views . . . . . . . . . . . . . . . . . . . . . . . . . 268 Using Remote Procedure Calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 Using the Automatic Workload Repository . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 Managing Snapshots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 Managing Baselines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 Generating AWR Reports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 Running the Automatic Database Diagnostic Monitor Reports . . . . . . . . . . . . . 272 Using the Automatic SQL Tuning Advisor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 Tuning Solutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2759 Database Security and Auditing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277 Non-Database Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 Database Authentication Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 Database Authentication ......................................... 280 Database Administrator Authentication .............................. 280 Operating System Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283 Network Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284 3-Tier Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286 Client-Side Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286 Oracle Identity Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286 User Accounts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288 Database Authorization Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292 Profile Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292 System Privileges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299 Object Privileges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 Creating, Assigning, and Maintaining Roles . . . . . . . . . . . . . . . . . . . . . . . . . . . 306 Using a VPD to Implement Application Security Policies . . . . . . . . . . . . . . . . . 313 Auditing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331 Auditing Locations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331 Statement Auditing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332 Privilege Auditing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336 Schema Object Auditing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337 Fine-Grained Auditing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338 Auditing-Related Data Dictionary Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339 Protecting the Audit Trail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340 Enabling Enhanced Auditing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
- Contents xv Data Encryption Techniques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342 DBMS_CRYPTO Package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342 Transparent Data Encryption . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342 PART III High Availability10 Real Application Clusters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349 Overview of Real Application Clusters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350 Hardware Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351 Software Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351 Network Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351 Disk Storage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352 Installation and Setup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353 Operating System Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354 Software Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360 RAC Characteristics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378 Server Parameter File Characteristics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379 RAC-related Initialization Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380 Dynamic Performance Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380 RAC Maintenance .................................................... 382 Starting Up a RAC .............................................. 382 Redo Logs in a RAC Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383 Undo Tablespaces in a RAC Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383 Failover Scenarios and TAF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383 RAC Node Failure Scenario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385 Tuning a RAC Node . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389 Tablespace Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39011 Backup and Recovery Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391 Capabilities ......................................................... 392 Logical Backups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392 Physical Backups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393 Offline Backups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393 Online Backups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394 Using Data Pump Export and Import ...................................... 395 Creating a Directory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395 Data Pump Export Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396 Starting a Data Pump Export Job . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399 Data Pump Import Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403 Starting a Data Pump Import Job . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406 Comparing Data Pump Export/Import to Export/Import . . . . . . . . . . . . . . . . . . . 410 Implementing Offline Backups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411 Implementing Online Backups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411 Integration of Backup Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414 Integration of Logical and Physical Backups . . . . . . . . . . . . . . . . . . . . . . . . . . . 415 Integration of Database and Operating System Backups . . . . . . . . . . . . . . . . . . 416
- xvi Oracle Database 11g DBA Handbook12 Using Recovery Manager (RMAN) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417 RMAN Features and Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418 RMAN Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419 RMAN vs. Traditional Backup Methods .............................. 420 Backup Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421 Overview of RMAN Commands and Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423 Frequently Used Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423 Setting Up a Repository . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423 Registering a Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428 Persisting RMAN Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428 Initialization Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432 Data Dictionary and Dynamic Performance Views . . . . . . . . . . . . . . . . . . . . . . 433 Backup Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434 Full Database Backups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435 Tablespace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439 Datafiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442 Image Copies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442 Control File, SPFILE Backup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444 Archived Redo Logs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444 Incremental Backups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445 Incrementally Updated Backups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447 Incremental Backup Block Change Tracking . . . . . . . . . . . . . . . . . . . . . . . . . . . 450 Backup Compression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451 Using a Flash Recovery Area . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452 Validating Backups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453 Recovery Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455 Block Media Recovery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455 Restoring a Control File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456 Restoring a Tablespace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456 Restoring a Datafile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459 Restoring an Entire Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461 Validating Restore Operations ..................................... 464 Point in Time Recovery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465 Data Recovery Advisor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465 Miscellaneous Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470 Cataloging Other Backups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470 Catalog Maintenance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471 REPORT and LIST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47213 Oracle Data Guard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475 Data Guard Architecture ............................................... 476 Physical vs. Logical Standby Databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477 Data Protection Modes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477 LOG_ARCHIVE_DEST_n Parameter Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478 Creating the Standby Database Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479 Preparing the Primary Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480 Creating Logical Standby Databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484 Using Real-Time Apply . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486 Managing Gaps in Archive Log Sequences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486 Managing Roles—Switchovers and Failovers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487 Switchovers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487
- Contents xvii Switchovers to Physical Standby Databases . . . . . . . . . . . . . . . . . . . . . . . . . . . 487 Switchovers to Logical Standby Databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489 Failovers to Physical Standby Databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490 Failovers to Logical Standby Databases .............................. 490 Administering the Databases ............................................ 491 Startup and Shutdown of Physical Standby Databases ................... 491 Opening Physical Standby Databases in Read-Only Mode . . . . . . . . . . . . . . . . 491 Managing Datafiles in Data Guard Environments . . . . . . . . . . . . . . . . . . . . . . . 492 Performing DDL on a Logical Standby Database ....................... 49214 Miscellaneous High Availability Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495 Recovering Dropped Tables Using Flashback Drop . . . . . . . . . . . . . . . . . . . . . . . . . . . 496 The Flashback Database Command . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498 Using LogMiner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500 How LogMiner Works ........................................... 500 Extracting the Data Dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501 Analyzing One or More Redo Log Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502 LogMiner Features Introduced in Oracle Database 10g .................. 504 LogMiner Features Introduced in Oracle Database 11g . . . . . . . . . . . . . . . . . . . 505 Online Object Reorganization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506 Creating Indexes Online . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506 Rebuilding Indexes Online . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506 Coalescing Indexes Online . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506 Rebuilding Index-Organized Tables Online . . . . . . . . . . . . . . . . . . . . . . . . . . . 506 Redefining Tables Online . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507 PART IV Networked Oracle15 Oracle Net . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 511 Overview of Oracle Net . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512 Connect Descriptors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515 Net Service Names . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516 Replacing tnsnames.ora with Oracle Internet Directory . . . . . . . . . . . . . . . . . . 517 Listeners . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517 Using the Oracle Net Configuration Assistant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520 Configuring the Listener . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521 Using the Oracle Net Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525 Starting the Listener Server Process . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527 Controlling the Listener Server Process . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528 The Oracle Connection Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531 Using Connection Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531 Directory Naming with Oracle Internet Directory . . . . . . . . . . . . . . . . . . . . . . . 534 Using Easy Connect Naming ............................................ 537 Using Database Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538 Tuning Oracle Net . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 540 Limiting Resource Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541 Debugging Connection Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54116 Managing Large Databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543 Creating Tablespaces in a VLDB Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545 Bigfile Tablespace Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545
- xviii Oracle Database 11g DBA Handbook Creating and Modifying Bigfile Tablespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . 546 Bigfile Tablespace ROWID Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546 DBMS_ROWID and Bigfile Tablespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547 Using DBVERIFY with Bigfile Tablespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550 Bigfile Tablespace Initialization Parameter Considerations . . . . . . . . . . . . . . . . 551 Bigfile Tablespace Data Dictionary Changes . . . . . . . . . . . . . . . . . . . . . . . . . . . 552 Advanced Oracle Table Types ........................................... 552 Index-Organized Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553 Global Temporary Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553 External Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555 Partitioned Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557 Materialized Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589 Using Bitmap Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589 Understanding Bitmap Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589 Using Bitmap Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590 Using Bitmap Join Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590 Oracle Data Pump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 591 Data Pump Export .............................................. 592 Data Pump Import . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592 Using Transportable Tablespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59317 Managing Distributed Databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599 Remote Queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601 Remote Data Manipulation: Two-Phase Commit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 602 Dynamic Data Replication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603 Managing Distributed Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604 The Infrastructure: Enforcing Location Transparency . . . . . . . . . . . . . . . . . . . . . 604 Managing Database Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 609 Managing Database Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 610 Managing Materialized Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612 Using DBMS_MVIEW and DBMS_ADVISOR . . . . . . . . . . . . . . . . . . . . . . . . . . 616 What Kind of Refreshes Can Be Performed? . . . . . . . . . . . . . . . . . . . . . . . . . . . 625 Using Materialized Views to Alter Query Execution Paths ................ 629 Managing Distributed Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 630 Resolving In-Doubt Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631 Commit Point Strength . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631 Monitoring Distributed Databases ........................................ 632 Tuning Distributed Databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 632 Appendix: Installation and Configuration .................................. 635 Software Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 636 Overview of Licensing and Installation Options . . . . . . . . . . . . . . . . . . . . . . . . 637 Using OUI to Install the Oracle Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638 Using the DBCA to Create a Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638 Manually Creating a Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 649 Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 653
- Acknowledgments any technical books need the expertise of more than one person, and this one M is no exception. Thanks to Kevin for his expertise on the previous editions of this book making this book a success. Thanks also go out to Carolyn Welch and Lisa McClain for filling in the gaps in mycollege English courses, Mandy Canales for keeping me on schedule, and Scott Gossett,who gave me good advice when the theoretical met the practical. Many of my professional colleagues at Lands’ End were a source of both inspiration andguidance: Joe Johnson, Brook Swenson, and Ann Van Dyn Hoven. In this case, the wholeis truly greater than the sum of its parts. If you have any questions or comments about any part of this book, please do nothesitate to contact me at rjbryla@centurytel.net. —Bob Bryla xix
- This page intentionally left blank
- Introduction hether you’re an experienced DBA, a new DBA, or an application developer, W you need to understand how Oracle11g’s new features can help you best meet your customers’ needs. In this book, you will find coverage of the newest features as well as ways of merging those features into the management of an Oracle database. The emphasis throughout is on managing the database’scapabilities in an effective and efficient manner to deliver a quality product. The end resultwill be a database that is dependable, robust, secure, and extensible. Several components are critical to this goal, and all of them are covered in depth afterwe introduce the Oracle Architecture, Oracle 11g upgrade issues, and tablespace planningin Part I. A well-designed logical and physical database architecture will improve performanceand ease administration by properly distributing database objects. You’ll see appropriatemonitoring, security, and tuning strategies for stand-alone and networked databases in PartII of this book. Backup and recovery strategies are provided to help ensure the database’srecoverability. Each section focuses on both the features and the proper planning andmanagement techniques for each area. High availability is covered in all of its flavors: Real Application Clusters (RAC), RecoveryManager (RMAN), and Oracle Data Guard, to name a few of the topics covered in-depth inPart III of this book. Networking issues and the management of distributed and client/server databases arethoroughly covered. Oracle Net, networking configurations, materialized views, locationtransparency, and everything else you need to successfully implement a distributed orclient/server database are described in detail in Part IV of this book. You’ll also findreal-world examples for every major configuration. In addition to the commands needed to perform DBA activities, you will also see theOracle Enterprise Manager web pages from which you can perform similar functions. Byfollowing the techniques in this book, your systems can be designed and implemented sowell that tuning efforts will be minimal. Administering the database will become easier asthe users get a better product, while the database works—and works well. xxi
- This page intentionally left blank
- PART IDatabase Architecture
- This page intentionally left blank
- CHAPTER 1Getting Started with the Oracle Architecture 3
- 4 Oracle Database 11g DBA Handbook racle Database 11g is an evolutionary step from the previous release of Oracle 10g; O Oracle 10g was, in turn, a truly revolutionary step from Oracle9i in terms of its “set it and forget it” features. Oracle 11g continues the tradition of feature enhancement by making memory management more automated, adding several new advisors, and significantly improving availability and failover capabilities. Part I of this book covers the basics of the Oracle architecture and lays the foundation for deploying a successful Oracle infrastructure by giving practical advice for a new installation or upgrading from a previous release of Oracle. To provide a good foundation for the Oracle 11g software, we cover server hardware and operating system configuration issues in the relevant sections. In Part II of this book, we will cover several areas relevant to the day-to-day maintenance and operation of an Oracle 11g database. The first chapter in Part II discusses the requirements that a DBA needs to gather long before you mount the install CD on your server. Successive chapters deal with ways the DBA can manage disk space, CPU usage, and adjust Oracle parameters to optimize the server’s resources, using a variety of tools at the DBA’s disposal for monitoring database performance. Transaction management is greatly simplified by Automated Undo Management (AUM), an Oracle Database feature introduced in Oracle9i and enhanced in Oracle 10g and Oracle 11g. Part III of this book focuses on the high availability aspects of Oracle 11g. This includes using Oracle’s Recovery Manager (RMAN) to perform and automate database backups and recovery, along with other features, such as Oracle Data Guard, to provide a reliable and easy way to recover from a database failure. Last, but certainly not least, we will show how Oracle 11g Real Application Clusters (RAC) can at the same time provide extreme scalability and transparent failover capabilities to a database environment. Even if you don’t use Oracle 11g’s RAC features, the standby features make Oracle 11g almost as available as a clustered solution; being able to easily switch between standby and primary databases as well as query a physical standby database provides a robust high-availability solution until you are ready to implement a RAC database. In Part IV of this book, we will cover a variety of issues revolving around Networked Oracle. Not only will we cover how Oracle Net can be configured in an N-tier environment, but also how we manage large and distributed databases that may reside in neighboring cities or around the world. In this chapter, we cover the basics of Oracle Database 11g, highlighting many of the features we will cover in the rest of the book as well as the basics of installing Oracle 11g using Oracle Universal Installer (OUI) and the Database Configuration Assistant (DBCA). We will take a tour of the elements that compose an instance of Oracle 11g, ranging from memory structures to disk structures, initialization parameters, tables, indexes, and PL/SQL. Each of these elements plays a large role in making Oracle 11g a highly scalable, available, and secure environment. An Overview of Databases and Instances Although the terms “database” and “instance” are often used interchangeably, they are quite different. They are very distinct entities in an Oracle datacenter, as you shall see in the following sections. Databases A database is a collection of data on disk in one or more files on a database server that collects and maintains related information. The database consists of various physical and logical structures, the table being the most important logical structure in the database. A table consists
- Chapter 1: Getting Started with the Oracle Architecture 5of rows and columns containing related data. At a minimum, a database must have at least tablesto store useful information. Figure 1-1 shows a sample table containing four rows and threecolumns. The data in each row of the table is related: Each row contains information about aparticular employee in the company. In addition, a database provides a level of security to prevent unauthorized access to the data.Oracle Database 11g provides many mechanisms to facilitate the security necessary to keepconfidential data confidential. Oracle Security and access control are covered in more detail inChapter 9. Files composing a database fall into two broad categories: database files and non-databasefiles. The distinction lies in what kind of data is stored in each. Database files contain data andmetadata; non-database files contain initialization parameters, logging information, and so forth.Database files are critical to the ongoing operation of the database on a moment-by-momentbasis. Each of these physical storage structures is discussed later, in the section titled “OraclePhysical Storage Structures.”InstancesThe main components of a typical enterprise server are one or more CPUs, disk space, andmemory. Whereas the Oracle database is stored on a server’s disk, an Oracle instance existsin the server’s memory. An Oracle instance is composed of a large block of memory allocatedin an area called the System Global Area (SGA), along with a number of background processesthat interact between the SGA and the database files on disk. In an Oracle Real Application Cluster (RAC), more than one instance will use the samedatabase. Although the instances that share the database can be on the same server, most likelythe instances will be on separate servers that are connected by a high-speed interconnect andaccess a database that resides on a specialized RAID-enabled disk subsystem. More details onhow a RAC installation is configured are provided in Chapter 10.FIGURE 1-1 Sample database table
- 6 Oracle Database 11g DBA Handbook Oracle Logical Storage Structures The datafiles in an Oracle database are grouped together into one or more tablespaces. Within each tablespace, the logical database structures, such as tables and indexes, are segments that are further subdivided into extents and blocks. This logical subdivision of storage allows Oracle to have more efficient control over disk space usage. Figure 1-2 shows the relationship between the logical storage structures in a database. Tablespaces An Oracle tablespace consists of one or more datafiles; a datafile can be a part of one and only one tablespace. For an installation of Oracle 11g, a minimum of two tablespaces are created: the SYSTEM tablespace and the SYSAUX tablespace; a default installation of Oracle 11g creates six tablespaces (see the appendix “Installation and Configuration” for sample Oracle 11g installations). Oracle 11g allows you to create a special kind of tablespace called a bigfile tablespace, which can be as large as 128TB (terabytes). Using bigfiles makes tablespace management completely transparent to the DBA; in other words, the DBA can manage the tablespace as a unit without worrying about the size and structure of the underlying datafiles. Using Oracle Managed Files (OMF) can make tablespace datafile management even easier. With OMF, the DBA specifies one or more locations in the file system where datafiles, control files, and redo log files will reside, and Oracle automatically handles the naming and management of these files. We discuss OMF in more detail in Chapter 4. If a tablespace is temporary, the tablespace itself is permanent; only the segments saved in the tablespace are temporary. A temporary tablespace can be used for sorting operations and for tables that exist only for the duration of the user’s session. Dedicating a tablespace for these kinds FIGURE 1-2 Logical storage structures
- Chapter 1: Getting Started with the Oracle Architecture 7of operations helps to reduce the I/O contention between temporary segments and permanentsegments stored in another tablespace, such as tables. Tablespaces can be either dictionary managed or locally managed. In a dictionary-managedtablespace, extent management is recorded in data dictionary tables. Therefore, even if allapplication tables are in the USERS tablespace, the SYSTEM tablespace will still be accessed formanaging DML on application tables. Because all users and applications must use the SYSTEMtablespace for extent management, this creates a potential bottleneck for write-intensive applications.In a locally managed tablespace, Oracle maintains a bitmap in each datafile of the tablespace totrack space availability. Only quotas are managed in the data dictionary, dramatically reducingthe contention for data dictionary tables. As of Oracle9i, if the SYSTEM tablespace is locally managed, then all other tablespaces mustbe locally managed if both read and write operations are to be performed on them. Dictionary-managed tablespaces must be read-only in databases with a locally managed SYSTEM tablespace.BlocksA database block is the smallest unit of storage in the Oracle database. The size of a block is aspecific number of bytes of storage within a given tablespace within the database. A block is usually a multiple of the operating system block size to facilitate efficient disk I/O.The default block size is specified by the Oracle initialization parameter DB_BLOCK_SIZE. As manyas four other block sizes may be defined for other tablespaces in the database, although the blocksin the SYSTEM, SYSAUX, and any temporary tablespaces must be of the size DB_BLOCK_SIZE.ExtentsThe extent is the next level of logical grouping in the database. An extent consists of one or moredatabase blocks. When you enlarge a database object, the space added to the object is allocatedas an extent.SegmentsThe next level of logical grouping in a database is the segment. A segment is a group of extentsthat form a database object that Oracle treats as a unit, such as a table or index. As a result, this istypically the smallest unit of storage that an end user of the database will deal with. Four types ofsegments are found in an Oracle database: data segments, index segments, temporary segments,and rollback segments.Data SegmentEvery table in the database resides in a single data segment, consisting of one or more extents;Oracle allocates more than one segment for a table if it is a partitioned table or a clustered table .I discuss partitioned and clustered tables later in this chapter. Data segments include LOB (largeobject) segments that store LOB data referenced by a LOB locator column in a table segment (ifthe LOB is not stored inline in the table).Index SegmentEach index is stored in its own index segment. As with partitioned tables, each partition of apartitioned index is stored in its own segment. Included in this category are LOB index segments;a table’s non-LOB columns, a table’s LOB columns, and the LOBs’ associated indexes can allreside in their own tablespace to improve performance.
- 8 Oracle Database 11g DBA Handbook Temporary Segment When a user’s SQL statement needs disk space to complete an operation, such as a sorting operation that cannot fit in memory, Oracle allocates a temporary segment. Temporary segments exist only for the duration of the SQL statement. Rollback Segment As of Oracle 10g, rollback segments only exist in the SYSTEM tablespace, and typically the DBA does not need to maintain the SYSTEM rollback segment. In previous Oracle releases, a rollback segment was created to save the previous values of a database DML operation in case the transaction was rolled back, and to maintain the “before” image data to provide read-consistent views of table data for other users accessing the table. Rollback segments were also used during database recovery for rolling back uncommitted transactions that were active when the database instance crashed or terminated unexpectedly. Automatic Undo Management handles the automatic allocation and management of rollback segments within an undo tablespace. Within an undo tablespace, the undo segments are structured similarly to rollback segments, except that the details of how these segments are managed is under control of Oracle, instead of being managed (often inefficiently) by the DBA. Automatic undo segments were available staring with Oracle9i, but manually managed rollback segments are still available in Oracle 10g. However, this functionality is deprecated as of Oracle 10g, and will no longer be available in future releases. In Oracle 11g, Automatic Undo Management is enabled by default; in addition, a PL/SQL procedure is provided to help you size the UNDO tablespace. I discuss Automatic Undo Management in detail in Chapter 7. Oracle Logical Database Structures In this section, we will cover the highlights of all major logical database structures, starting with tables and indexes. Next, we discuss the variety of datatypes we can use to define the columns of a table. When we create a table with columns, we can place restrictions, or constraints, on the columns of the table. One of the many reasons we use a relational database management system (RDBMS) to manage our data is to leverage the security and auditing features of the Oracle database. We will review the ways we can segregate access to the database by user or by the object being accessed. We’ll also touch upon many other logical structures that can be defined by either the DBA or the user, including synonyms, links to external files, and links to other databases. Tables A table is the basic unit of storage in an Oracle database. Without any tables, a database has no value to an enterprise. Regardless of the type of table, data in a table is stored in rows and columns, similar to how data is stored in a spreadsheet. But that is where the similarity ends. The robustness of a database table due to the surrounding reliability, integrity, and scalability of the Oracle database makes a spreadsheet a poor second choice when deciding on a place to store critical information. In this section, we will review the many different types of tables in the Oracle database and how they can satisfy most every data-storage need for an organization. You can find more details on how to choose between these types of tables for a particular application, and how to manage them, in Chapter 5 and Chapter 8.
- Chapter 1: Getting Started with the Oracle Architecture 9Relational TablesA relational table is the most common type of table in a database. A relational table is heap-organized; in other words, the rows in the table are stored in no particular order. In the createtable command, you can specify the clause organization heap to define a heap-organized table,but because this is the default, the clause can be omitted. Each row of a table contains one or more columns; each column has a datatype and a length.As of Oracle version 8, a column may also contain a user-defined object type, a nested table, or aVARRAY. In addition, a table can be defined as an object table. We will review object tables andobjects later in this section. The built-in Oracle datatypes are presented in Table 1-1. Oracle also supports ANSI-compatible datatypes; the mapping between the ANSI datatypesand Oracle datatypes is provided in Table 1-2. Oracle Built-in Datatype Description VARCHAR2 (size) [BYTE | CHAR] A variable-length character string with a maximum length of 4000 bytes, minimum of 1 byte. CHAR indicates that character semantics are used to size the string; BYTE indicates that byte semantics are used. NVARCHAR2(size) A variable-length character string with a maximum length of 4000 bytes. NUMBER(p,s) A number with a precision (p) and scale (s). The precision ranges from 1 to 38, and the scale can be from –84 to 127. LONG A variable-length character data with a length up to 2GB (231–1). DATE Date values from January 1st, 4712 B.C. to December 31st, 9999 A.D. BINARY_FLOAT A 32-bit floating point number. BINARY_DOUBLE A 64-bit floating point number. TIMESTAMP (fractional_seconds) Year, month, day, hour, minute, second, and fractional seconds. Value of fractional_seconds can range from 0 to 9; in other words, up to one billionth of a second precision. The default is 6 (one millionth). TIMESTAMP (fractional_seconds) Contains a TIMESTAMP value in addition to a time zone displacement WITH TIME ZONE value. Time zone displacement can be an offset from UTC (such as ‘-06:00’) or a region name (e.g., ‘US/Central’). TIMESTAMP (fractional_seconds) Similar to TIMESTAMP WITH TIMEZONE, except that (1) data is WITH LOCAL TIME ZONE normalized to the database time zone when it is stored and (2) when retrieving columns with this datatype, the user sees the data in the session’s time zone. INTERVAL YEAR (year_precision) Stores a time period in years and months. The value of year_precision is TO MONTH the number of digits in the YEAR field. INTERVAL DAY (day_precision) Stores a period of time as days, hours, minutes, seconds, and fractional TO SECOND (fractional_seconds_ seconds. The value for day_precision is from 0 to 9, with a default of precision) 2. The value of fractional_seconds_precision is similar to the fractional seconds in a TIMESTAMP value; the range is from 0 to 9, with a default of 6. RAW(size) Raw binary data, with a maximum size of 2000 bytes.TABLE 1-1 Oracle Built-in Datatypes
- 10 Oracle Database 11g DBA Handbook Oracle Built-in Datatype Description LONG RAW Raw binary data, variable length, up to 2GB in size. ROWID A base-64 string representing the unique address of a row in its corresponding table. This address is unique throughout the database. UROWID [(size)] A base-64 string representing the logical address of a row in an index- organized table. The maximum for size is 4000 bytes. CHAR(size) [ BYTE | CHAR ] A fixed- length character string of length size. The minimum size is 1, and the maximum is 2000 bytes. The BYTE and CHAR parameters are BYTE and CHAR semantics, as in VARCHAR2. NCHAR(size) A fixed-length character string up to 2000 bytes; the maximum size depends on the national character set definition for the database. The default size is 1. CLOB A character large object containing single-byte or multibyte characters; supports both fixed-width or variable-width character sets. The maximum size is (4GB – 1) * DB_BLOCK_SIZE. NCLOB Similar to CLOB, except that Unicode characters are stored from either fixed-width and variable-width character sets. The maximum size is (4GB – 1) * DB_BLOCK_SIZE. BLOB A binary large object; the maximum size is (4GB – 1) * DB_BLOCK_SIZE. BFILE A pointer to a large binary file stored outside the database. Binary files must be accessible from the server running the Oracle instance. The maximum size is 4GB. TABLE 1-1 Oracle Built-in Datatypes (continued) ANSI SQL Datatype Oracle Datatype CHARACTER(n) CHAR(n) CHAR(n) CHARACTER VARYING(n) VARCHAR(n) CHAR VARYING(n) NATIONAL CHARACTER(n) NCHAR(n) NATIONAL CHAR(n) NCHAR(n) NATIONAL CHARACTER VARYING(n) NVARCHAR2(n) NATIONAL CHAR VARYING(n) NCHAR VARYING(n) NUMERIC(p,s) NUMBER(p,s) DECIMAL(p,s) INTEGER NUMBER(38) INT SMALLINT FLOAT(b) NUMBER DOUBLE PRECISION REAL TABLE 1-2 ANSI-Equivalent Oracle Datatypes
- Chapter 1: Getting Started with the Oracle Architecture 11Temporary TablesTemporary tables have been available since Oracle8i. They are temporary in the sense of the datathat is stored in the table, not in the definition of the table itself. The command create globaltemporary table creates a temporary table. As long as other users have permissions to the table itself, they may perform select statementsor Data Manipulation Language Commands (DML), such as insert, update, or delete, on a temporarytable. However, each user sees their own and only their own data in the table. When a usertruncates a temporary table, only the data that they inserted is removed from the table. There are two different flavors of temporary data in a temporary table: temporary for theduration of the transaction, and temporary for the duration of the session. The longevity of thetemporary data is controlled by the on commit clause; on commit delete rows removes all rowsfrom the temporary table when a commit or rollback is issued, and on commit preserve rowskeeps the rows in the table beyond the transaction boundary. However, when the user’s sessionis terminated, all of the user’s rows in the temporary table are removed. There are a few other things to keep in mind when using temporary tables. Although you cancreate an index on a temporary table, the entries in the index are dropped along with the datarows, as with a regular table. Also, due to the temporary nature of the data in a temporary table,no redo information is generated for DML on temporary tables; however, undo information iscreated in the undo tablespace.Index Organized TablesAs you will find out later in the subsection on indexes, creating an index makes finding a particularrow in a table more efficient. However, this adds a bit of overhead, because the database mustmaintain the data rows and the index entries for the table. What if your table does not have manycolumns, and access to the table occurs primarily on a single column? In this case, an index-organized table (IOT) might be the right solution. An IOT stores rows of a table in a B-tree index,where each node of the B-tree index contains the keyed (indexed) column along with one ormore non-indexed columns. The most obvious advantage of an IOT is that only one storage structure needs to be maintainedinstead of two; similarly, the values for the primary key of the table are stored only once in anIOT, versus twice in a regular table. There are, however, a few disadvantages to using an IOT. Some tables, such as tables forlogging events, may not need a primary key, or any keys for that matter; an IOT must have aprimary key. Also, IOTs cannot be a member of a cluster. Finally, an IOT might not be the bestsolution for a table if there are a large number of columns in the table and many of the columnsare frequently accessed when table rows are retrieved.Object TablesSince Oracle8, the Oracle Database has supported many object-oriented features in the database.User-defined types, along with any defined methods for these object types, can make animplementation of an object-oriented (OO) development project in Oracle seamless. Object tables have rows that are themselves objects, or instantiations of type definitions.Rows in an object table can be referenced by object ID (OID), in contrast to a primary key in arelational, or regular, table; however, object tables can still have both primary and unique keys,just as relational tables do.
- 12 Oracle Database 11g DBA Handbook Let’s say, for example, that you are creating a Human Resources (HR) system from scratch, so you have the flexibility to design the database from an entirely OO point of view. The first step is to define an employee object, or type, by creating the type: create type PERS_TYP as object (Last_Name varchar2(45), First_Name varchar2(30), Middle_Initial char(1), Surname varchar2(10), SSN varchar2(15)); In this particular case, you’re not creating any methods with the PERS_TYP object, but by default Oracle creates a constructor method for the type that has the same name as the type itself (in this case, PERS_TYP). To create an object table as a collection of PERS_TYP objects, you can use the familiar create table syntax, as follows: create table pers of pers_typ; To add an instance of an object to the object table, you can specify the constructor method in the insert command: insert into pers values(pers_typ(Graber,Martha,E,Ms.,123-45-6789)); As of Oracle Database 10g, you do not need the constructor if the table consists of instances of a single object; here is the simplified syntax: insert into pers values(Graber,Martha,E,Ms.,123-45-6789); References to instances of the PERS_TYP object can be stored in other tables as REF objects, and you can retrieve data from the PERS table without a direct reference to the PERS table itself. More examples of how you can use objects to implement an object-oriented design project can be found in Chapter 5. External Tables External tables were introduced in Oracle9i. In a nutshell, external tables allow a user to access a data source, such as a text file, as if it were a table in the database. The metadata for the table is stored within the Oracle data dictionary, but the contents of the table are stored externally. The definition for an external table contains two parts. The first and most familiar part is the definition of the table from the database user’s point of view. This definition looks like any typical definition that you’d see in a create table statement. The second part, however, is what differentiates an external table from a regular table. This is where the mapping between the database columns and the external data source occurs—what column(s) the data element starts in, how wide the column is, and whether the format of the external column is character or binary. The syntax for the default type of external table, ORACLE_ LOADER, is virtually identical to that of a control file in SQL*Loader. This is one of the advantages of external tables; the user only needs to know how to access a standard database table to get to the external file. There are a few drawbacks, however, to using external tables. You cannot create indexes on an external table, and no inserts, updates, or deletes can be performed on external tables. These drawbacks are minor when considering the advantages of using external tables for loading native database tables, for example, in a data warehouse environment.
- Chapter 1: Getting Started with the Oracle Architecture 13Clustered TablesIf two or more tables are frequently accessed together (for example, an order table and a line itemdetail table), then creating a clustered table might be a good way to boost the performance ofqueries that reference those tables. In the case of an order table with an associated line-item detailtable, the order header information could be stored in the same block as the line-item detailrecords, thus reducing the amount of I/O needed to retrieve the order and line-item information. Clustered tables also reduce the amount of space needed to store the columns the two tableshave in common, also known as a cluster key value. The cluster key value is also stored in acluster index. The cluster index operates much like a traditional index in that it will improvequeries against the clustered tables when accessed by the cluster key value. In our example withorders and line items, the order number is only stored once, instead of repeating for each line-item detail row. The advantages to clustering a table are reduced if frequent insert, update, and deleteoperations occur on the table relative to the number of select statements against the table. Inaddition, frequent queries against individual tables in the cluster may also reduce the benefitsof clustering the tables in the first place.Hash ClustersA special type of clustered table, a hash cluster, operates much like a regular clustered table,except that instead of using a cluster index, a hash cluster uses a hashing function to store andretrieve rows in a table. The total estimated amount of space needed for the table is allocatedwhen the table is created, given the number of hash keys specified during the creation of thecluster. In our order-entry example, let’s assume that our Oracle database needs to mirror thelegacy data-entry system, which reuses order numbers on a periodic basis. Also, the order numberis always a six-digit number. We might create the cluster for orders as in the following example:create cluster order_cluster (order_number number(6)) size 50 hash is order_number hashkeys 1000000;create table cust_order ( order_number number(6) primary key, order_date date, customer_number number)cluster order_cluster(order_number); Hash clusters have performance benefits when you select rows from a table using an equalitycomparison, as in this example:select order_number, order_date from cust_order where order_number = 196811; Typically, this kind of query will retrieve the row with only one I/O if the number of hashkeysis high enough and the hash is clause, containing the hashing function, produces an evenlydistributed hash key.Sorted Hash ClustersSorted hash clusters are new as of Oracle 10g. They are similar to regular hash clusters in that ahashing function is used to locate a row in a table. However, in addition, sorted hash clustersallow rows in the table to be stored by one or more columns of the table in ascending order. This
- 14 Oracle Database 11g DBA Handbook allows the data to be processed more quickly for applications that lend themselves to first in, first out (FIFO) processing. You create sorted hash clusters using the same syntax as regular clustered tables, with the addition of the SORT positional parameter after the column definitions within the cluster. Here is an example of creating a table in a sorted hash cluster: create table order_detail ( order_number number, order_timestamp timestamp sort, customer_number number) cluster order_detail_cluster ( order_number, order_timestamp); Due to the FIFO nature of a sorted hash cluster, when orders are accessed by order_number the oldest orders are retrieved first based on the value of order_timestamp. Partitioned Tables Partitioning a table (or index, as you will see in the next section) helps make a large table more manageable. A table may be partitioned, or even subpartitioned, into smaller pieces. From an application point of view, partitioning is transparent (that is, no explicit references to a particular partition are necessary in any end-user SQL). The only effect that a user may notice is that queries against the partitioned table using criteria in the where clause that matches the partitioning scheme run a lot faster! There are many advantages to partitioning from a DBA point of view. If one partition of a table is on a corrupted disk volume, the other partitions in the table are still available for user queries while the damaged volume is being repaired. Similarly, backups of partitions can occur over a period of days, one partition at a time, rather than requiring a single backup of the entire table. Partitions are one of three types: range partitioned, hash partitioned, or, as of Oracle9i, list partitioned; as of Oracle 11g, you can also partition by parent/child relationships, application- controlled partitioning, and many combinations of basic partition types, including list-hash, list- list, list-range, and range-range. Each row in a partitioned table can exist in one, and only one, partition. The partition key directs the row to the proper partition; the partition key can be a composite key of up to 16 columns in the table. There are a few minor restrictions on the types of tables that can be partitioned; for example, a table containing a LONG or LONG RAW column cannot be partitioned. The LONG restriction should rarely be a problem; LOBs (CLOBs and BLOBs, character large objects and binary large objects) are much more flexible and encompass all the features of LONG and LONG RAW datatypes. TIP Oracle Corporation recommends that any table greater than 2GB in size be seriously considered for partitioning. No matter what type of partitioning scheme is in use, each member of a partitioned table must have the same logical attributes, such as column names, datatypes, constraints, and so forth. The physical attributes for each partition, however, can be different depending on its size and location on disk. The key is that the partitioned table must be logically consistent from an application or user point of view.
- Chapter 1: Getting Started with the Oracle Architecture 15Range Partitions A range partition is a partition whose partition key falls within a certain range.For example, visits to the corporate e-commerce website can be assigned to a partition based onthe date of the visit, with one partition per quarter. A website visit on May 25, 2004, will berecorded in the partition with the name FY2004Q2, whereas a website visit on December 2,2004, will be recorded in the partition with the name FY2004Q4.List Partitions A list partition is a partition whose partition key falls within groups of distinctvalues. For example, sales by region of the country may create a partition for NY, CT, MA, and VT,and another partition for IL, WI, IA, and MN. Any sales from elsewhere in the world may beassigned to its own partition when the state code is missing.Hash Partitions A hash partition assigns a row to a partition based on a hashing function,specifying the column or columns used in the hashing function, but not explicitly assigningthe partition, only specifying how many partitions are available. Oracle will assign the rowto a partition and ensure a balanced distribution of rows in each partition. Hash partitions are useful when there is no clear list or range-partitioning scheme giventhe types of columns in the table, or when the relative sizes of the partitions change frequently,requiring repeated manual adjustments to the partitioning scheme.Composite Partitions Even further refinement of the partitioning process is available withcomposite partitions. For example, a table may be partitioned by range, and within each range,subpartitioned by list or by hash. New combinations in Oracle 11g include list-hash, list-list, list-range, and range-range partitioning.Partitioned IndexesYou can also partition indexes on a table, either matching the partition scheme of the table beingindexed (local indexes) or partitioned independently from the partition scheme of the table (globalindexes). Local partitioned indexes have the advantage of increased availability of the index whenpartition operations occur; for example, archiving and dropping the partition FY2002Q4 and itslocal index will not affect index availability for the other partitions in the table.ConstraintsAn Oracle constraint is a rule or rules that you can define on one or more columns in a tableto help enforce a business rule. For example, a constraint can enforce the business rule that anemployee’s starting salary must be at least $25,000.00. Another example of a constraint enforcinga business rule is to require that if a new employee is assigned a department (although they neednot be assigned to a particular department right away), the department number must be valid andexist in the DEPT table. Six types of data integrity rules can be applied to table columns: null rule, unique columnvalues, primary key values, referential integrity values, complex in-line integrity, and trigger-basedintegrity. We will touch upon each of these briefly in the following sections. All the constraints on a table are defined either when the table is created or when the table isaltered at the column level, except for triggers, which are defined according to which DML operationyou are performing on the table. Constraints may be enabled or disabled at creation or at anypoint of time in the future; when a constraint is either enabled or disabled (using the keywordenable or disable), existing data in the table may or may not have to be validated (using thekeyword validate or novalidate) against the constraint, depending on the business rules in effect.
- 16 Oracle Database 11g DBA Handbook For example, a table in an automaker’s database named CAR_INFO containing new automobile data needs a new constraint on the AIRBAG_QTY column, where the value of this column must not be NULL and must have a value that is at least 1 for all new vehicles. However, this table contains data for model years before air bags were required, and as a result, this column is either 0 or NULL. One solution, in this case, would be to create a constraint on the AIRBAG_QTY table to enforce the new rule for new rows added to the table, but not to validate the constraint for existing rows. Here is a table created with all constraint types. Each constraint is reviewed in the following subsections. create table CUST_ORDER (Order_Number NUMBER(6) PRIMARY KEY, Order_Date DATE NOT NULL, Delivery_Date DATE, Warehouse_Number NUMBER DEFAULT 12, Customer_Number NUMBER NOT NULL, Order_Line_Item_Qty NUMBER CHECK (Order_Line_Item_Qty < 100), UPS_Tracking_Number VARCHAR2(50) UNIQUE, foreign key (Customer_Number) references CUSTOMER(Customer_Number)); Null Rule The NOT NULL constraint prevents NULL values from being entered into the Order_Date or Customer_Number column. This makes a lot of sense from a business rule point of view: Every order must have an order date, and an order doesn’t make any sense unless a customer places it. Note that a NULL value in a column doesn’t mean that the value is blank or zero; rather, the value does not exist. A NULL value is not equal to anything, not even another NULL value. This concept is important when using SQL queries against columns that may have NULL values. Unique Column Values The UNIQUE integrity constraint ensures that a column or group of columns (in a composite constraint) is unique throughout the table. In the preceding example, the UPS_Tracking_Number column will not contain duplicate values. To enforce the constraint, Oracle will create a unique index on the UPS_Tracking_Number column. If there is already a valid unique index on the column, Oracle will use that index to enforce the constraint. A column with a UNIQUE constraint may also be declared as NOT NULL. If the column is not declared with the NOT NULL constraint, then any number of rows may contain NULL values, as long as the remaining rows have unique values in this column. In a composite unique constraint that allows NULLs in one or more columns, the columns that are not NULL determine whether the constraint is being satisfied. The NULL column always satisfies the constraint, because a NULL value is not equal to anything. Primary Key Values The PRIMARY KEY integrity constraint is the most common type of constraint found in a database table. At most, only one primary key constraint can exist on a table. The column or columns that comprise the primary key cannot have NULL values. In the preceding example, the Order_Number column is the primary key. A unique index is created to enforce the constraint; if a usable unique index already exists for the column, the primary key constraint uses that index.
- Chapter 1: Getting Started with the Oracle Architecture 17Referential Integrity ValuesThe referential integrity or FOREIGN KEY constraint is more complicated than the others we havecovered so far because it relies on another table to restrict what values can be entered into thecolumn with the referential integrity constraint. In the preceding example, a FOREIGN KEY is declared on the Customer_Number column;any values entered into this column must also exist in the Customer_Number column of anothertable (in this case, the CUSTOMER table). As with other constraints that allow NULL values, a column with a referential integrityconstraint can be NULL without requiring that the referenced column contain a NULL value. Furthermore, a FOREIGN KEY constraint can be self-referential. In an EMPLOYEE table whoseprimary key is Employee_Number, the Manager_Number column can have a FOREIGN KEYdeclared against the Employee_Number column in the same table. This allows for the creationof a reporting hierarchy within the EMPLOYEE table itself. Indexes should almost always be declared on a FOREIGN KEY column to improve performance;the only exception to this rule is when the referenced primary or unique key in the parent table isnever updated or deleted.Complex In-Line IntegrityMore complex business rules may be enforced at the column level by using a CHECK constraint.In the preceding example, the Order_Line_Item_Qty column must never exceed 99. A CHECK constraint can use other columns in the row being inserted or updated to evaluatethe constraint. For example, a constraint on the STATE_CD column would allow NULL valuesonly if the COUNTRY_CD column is not USA. In addition, the constraint can use literal valuesand built-in functions such as TO_CHAR or TO_DATE, as long as these functions operate onliterals or columns in the table. Multiple CHECK constraints are allowed on a column. All the CHECK constraints must evaluateto TRUE to allow a value to be entered in the column. For example, we could modify the precedingCHECK constraint to ensure that Order_Line_Item_Qty is greater than 0 in addition to being lessthan 100.Trigger-Based IntegrityIf the business rules are too complex to implement using unique constraints, a database triggercan be created on a table using the create trigger command along with a block of PL/SQL codeto enforce the business rule. Triggers are required to enforce referential integrity constraints when the referenced tableexists in a different database. Triggers are also useful for many things outside the realm ofconstraint checking (auditing access to a table, for example).I cover database triggers in-depthin Chapter 17.IndexesAn Oracle index allows faster access to rows in a table when a small subset of the rows will beretrieved from the table. An index stores the value of the column or columns being indexed, alongwith the physical RowID of the row containing the indexed value, except for index-organizedtables (IOTs), which use the primary key as a logical RowID. Once a match is found in the index,the RowID in the index points to the exact location of the table row: which file, which blockwithin the file, and which row within the block.
- 18 Oracle Database 11g DBA Handbook Indexes are created on a single column or multiple columns. Index entries are stored in a B-tree structure so that traversing the index to find the key value of the row uses very few I/O operations. An index may serve a dual purpose in the case of a unique index: Not only will it speed the search for the row, but it enforces a unique or primary key constraint on the indexed column. Entries within an index are automatically updated whenever the contents of a table row are inserted, updated, or deleted. When a table is dropped, all indexes created on the table are also automatically dropped. Several types of indexes are available in Oracle, each suitable for a particular type of table, access method, or application environment. We will present the highlights and features of the most common index types in the following subsections. Unique Indexes A unique index is the most common form of B-tree index. It is often used to enforce the primary key constraint of a table. Unique indexes ensure that duplicate values will not exist in the column or columns being indexed. A unique index may be created on a column in the EMPLOYEE table for the Social Security Number because there should not be any duplicates in this column. However, some employees may not have a Social Security Number, so this column would contain a NULL value. Non-Unique Indexes A non-unique index helps speed access to a table without enforcing uniqueness. For example, we can create a non-unique index on the Last_Name column of the EMPLOYEE table to speed up our searches by last name, but we would certainly have many duplicates for any given last name. A non-unique B-tree index is created on a column by default if no other keywords are specified in a CREATE INDEX statement. Reverse Key Indexes A reverse key index is a special kind of index used typically in an OLTP (online transaction processing) environment. In a reverse key index, all the bytes in each column’s key value of the index are reversed. The reverse keyword specifies a reverse key index in the create index command. Here is an example of creating a reverse key index: create index IE_LINE_ITEM_ORDER_NUMBER on LINE_ITEM(Order_Number) REVERSE; If an order number of 123459 is placed, the reverse key index stores the order number as 954321. Inserts into the table are distributed across all leaf keys in the index, reducing the contention among several writers all doing inserts of new rows. A reverse key index also reduces the potential for these “hot spots” in an OLTP environment if orders are queried or modified soon after they are placed. Function-Based Indexes A function-based index is similar to a standard B-tree index, except that a transformation of a column or columns, declared as an expression, is stored in the index instead of the columns themselves. Function-based indexes are useful in cases where names and addresses might be stored in the database as mixed case. A regular index on a column containing the value ‘SmiTh’ would not return any values if the search criterion was ‘Smith’. On the other hand, if the index stored the last
- Chapter 1: Getting Started with the Oracle Architecture 19names in all uppercase, all searches on last names could use uppercase. Here is an example ofcreating a function-based index on the Last_Name column of the EMPLOYEE table:create index up_name on employee(upper(Last_Name)); As a result, searches using queries such as the following will use the index we just createdinstead of doing a full table scan:select Employee_Number, Last_Name, First_Name, from employee where upper(Last_Name) = SMITH;Bitmap IndexesA bitmap index has a significantly different structure from a B-tree index in the leaf node of the index.It stores one string of bits for each possible value (the cardinality) of the column being indexed. Thelength of the string of bits is the same as the number of rows in the table being indexed. In addition to saving a tremendous amount of space compared to traditional indexes, abitmap index can provide dramatic improvements in response time because Oracle can quicklyremove potential rows from a query containing multiple where clauses long before the table itselfneeds to be accessed. Multiple bitmaps can use logical and and or operations to determine whichrows to access from the table. Although you can use a bitmap index on any column in a table, it is most efficient when thecolumn being indexed has a low cardinality, or number of distinct values. For example, theGender column in the PERS table will either be NULL, M, or F. The bitmap index on the Gendercolumn will have only three bitmaps stored in the index. On the other hand, a bitmap index onthe Last_Name column will have close to the same number of bitmap strings as rows in the tableitself! The queries looking for a particular last name will most likely take less time if a full tablescan is performed instead of using an index. In this case, a traditional B-treenon-unique indexmakes more sense. A variation of bitmap indexes called bitmap join indexes creates a bitmap index on a tablecolumn that is frequently joined with one or more other tables on the same column. This providestremendous benefits in a data warehouse environment where a bitmap join index is created on afact table and one or more dimension tables, essentially pre-joining those tables and saving CPUand I/O resources when an actual join is performed. NOTE Bitmap indexes are only available in the Enterprise Edition of Oracle 11g.ViewsViews allow users to see a customized presentation of the data in a single table or even a joinbetween many tables. A view is also known as a stored query—the query details underlying theview are hidden from the user of the view. A regular view does not store any data, only the definition,and the underlying query is run every time the view is accessed. Extensions to a regular view,called a materialized view, allows the results of the query to be stored along with the definitionof the query to speed processing, among other benefits. Object views, like traditional views, hidethe details of the underlying table joins and allow object-oriented development and processing tooccur in the database while the underlying tables are still in a relational format.
- 20 Oracle Database 11g DBA Handbook In the following subsections, I’ll review the basics of the types of views a typical database user, developer, or DBA will create and use on a regular basis. Regular Views A regular view, or more commonly referred to as a view, is not allocated any storage; only its definition, a query, is stored in the data dictionary. The tables in the query underlying the view are called base tables; each base table in a view can be further defined as a view. The advantages of a view are many. Views hide data complexity—a senior analyst can define a view containing the EMPLOYEE, DEPARTMENT, and SALARY tables to make it easier for upper management to retrieve information about employee salaries by using a select statement against what appears to be a table but is actually a view containing a query that joins the EMPLOYEE, DEPARTMENT, and SALARY tables. Views can also be used to enforce security. A view on the EMPLOYEE table called EMP_INFO may contain all columns except for salary, and the view can be defined as read only to prevent updates to the table: create view EMP_INFO as select Employee_Number, Last_Name, First_Name, Middle_Initial, Surname from EMPLOYEE with READ ONLY; Without the read only clause, it is possible to update or add rows to a view, even to a view containing multiple tables. There are some constructs in a view that prevent it from being updatable, such as having a distinct operator, an aggregate function, or a group by clause. When Oracle processes a query containing a view, it substitutes the underlying query definition in the user’s select statement and processes the resulting query as if the view did not exist. As a result, the benefits of any existing indexes on the base tables are not lost when a view is used. Materialized Views In some ways, a materialized view is very similar to a regular view: The definition of the view is stored in the data dictionary, and the view hides the details of the underlying base query from the user. That is where the similarities end. A materialized view also allocates space in a database segment to hold the result set from the execution of the base query. You can use a materialized view to replicate a read-only copy of table to another database, with the same column definitions and data as the base table. This is the simplest implementation of a materialized view. To enhance the response time when a materialized view needs to be refreshed, a materialized view log can be created to refresh the materialized view. Otherwise, a full refresh is required when a refresh is required—the results of the base query must be run in their entirety to refresh the materialized view. The materialized view log facilitates incremental updates of the materialized views. In a data warehouse environment, materialized views can store aggregated data from a group by rollup or a group by cube query. If the appropriate initialization parameter values are set, such as QUERY_REWRITE_ENABLED, and the query itself allows for query rewrites (with the query rewrite clause), then any query that appears to do the same kind of aggregation as the materialized view will automatically use the materialized view instead of running the original query. Regardless of the type of materialized view, it can be refreshed automatically when a committed transaction occurs in the base table, or it can be refreshed on demand.
- Chapter 1: Getting Started with the Oracle Architecture 21 Materialized views have many similarities to indexes, in that they are directly tied to a tableand take up space, they must be refreshed when the base tables are updated, their existence isvirtually transparent to the user, and they can aid in optimizing queries by using an alternateaccess path to return the results of a query. More details on how to use materialized views in a distributed environment can be found inChapter 17.Object ViewsObject-oriented (OO) application development environments are becoming increasingly prevalent,and the Oracle 10g database fully supports the implementation of objects and methods natively inthe database. However, a migration from a purely relational database environment to a purelyOO database environment is not an easy transition to make; few organizations have the time andresources to build a new system from the ground up. Oracle 10g makes the transition easier withobject views. Object views allow the object-oriented applications to see the data as a collectionof objects that have attributes and methods, while the legacy systems can still run batch jobsagainst the INVENTORY table. Object views can simulate abstract datatypes, object identifiers(OIDs), and references that a purely OO database environment would provide. As with regular views, you can use instead of triggers in the view definition to allow DMLagainst the view by running a block of PL/SQL code instead of the actual DML statement suppliedby the user or application.Users and SchemasAccess to the database is granted to a database account known as a user. A user may exist in thedatabase without owning any objects. However, if the user creates and owns objects in the database,those objects are part of a schema that has the same name as the database user. A schema can ownany type of object in the database: tables, indexes, sequences, views, and so forth. The schemaowner or DBA can grant access to these objects to other database users. The user always has fullprivileges and control over the objects in the user’s schema. When a user is created by the DBA (or by any other user with the create user system privilege),a number of other characteristics can be assigned to the user, such as which tablespaces areavailable to the user for creating objects, and whether the password is pre-expired. You can authenticate users in the database with three methods: database authentication,operating system authentication, and network authentication. With database authentication, theencrypted password for the user is stored in the database. In contrast, operating system authenticationmakes an assumption that a user who is already authenticated by an operating system connectionhas the same privileges as a user with the same or similar name (depending on the value of theOS_AUTHENT_PREFIX initialization parameter). Network authentication uses solutions basedon Public Key Infrastructure (PKI). These network authentication methods require Oracle 11gEnterprise Edition with the Oracle Advanced Security option.ProfilesDatabase resources are not unlimited; therefore, a DBA must manage and allocate resourcesamong all database users. Some examples of database resources are CPU time, concurrentsessions, logical reads, and connect time. A database profile is a named set of resource limits that you can assigned to a user. After Oracleis installed, the DEFAULT profile exists and is assigned to any user not explicitly assigned a profile.The DBA can add new profiles or change the DEFAULT profile to suit the needs of the enterprise.The initial values for the DEFAULT profile allow for unlimited use of all database resources.
- 22 Oracle Database 11g DBA Handbook Sequences An Oracle sequence assigns sequential numbers, guaranteed to be unique unless the sequence is re-created or reset. It produces a series of unique numbers in a multi-user environment without the overhead of disk locking or any special I/O calls, other than what is involved in loading the sequence into the shared pool. Sequences can generate numbers up to 38 digits in length; the series of numbers can be ascending or descending, the interval can be any user-specified value, and Oracle can cache blocks of numbers from a sequence in memory for even faster performance. The numbers from sequences are guaranteed to be unique, but not necessarily sequential. If a block of numbers is cached, and the instance is restarted, or a transaction that uses a number from a sequence is rolled back, the next call to retrieve a number from the sequence will not return the number that was not used in the original reference to the sequence. Synonyms An Oracle synonym is simply an alias to a database object, to simplify references to database objects and to hide the details of the source of the database objects. Synonyms can be assigned to tables, views, materialized views, sequences, procedures, functions, and packages. Like views, a synonym allocates no space in the database, other than its definition in the data dictionary. Synonyms can be either public or private. A private synonym is defined in the schema of a user and is available only to the user. A public synonym is usually created by a DBA and is automatically available for use by any database user. TIP After creating a public synonym, make sure the users of the synonym have the correct privileges to the object referenced by the synonym. When referencing a database object, Oracle first checks whether the object exists in the user’s schema. If no such object exists, Oracle checks for a private synonym. If there is no private synonym, Oracle checks for a public synonym. If there is no public synonym, Oracle returns an error. PL/SQL Oracle PL/SQL is Oracle’s procedural language extension to SQL. PL/SQL is useful when the standard DML and select statements cannot produce the desired results in an easy fashion because of the lack of the procedural elements found in a traditional third-generation language such as C++ and Ada. As of Oracle9i, the SQL processing engine is shared between SQL and PL/ SQL, which means that all new features added to SQL are automatically available to PL/SQL. In the next few sections, I’ll take a whirlwind tour of the benefits of using Oracle PL/SQL. Procedures/Functions PL/SQL procedures and functions are examples of PL/SQL named blocks. A PL/SQL block is a sequence of PL/SQL statements treated as a unit for the purposes of execution, and it contains up to three sections: a variable declaration section, an executable section, and an exception section. The difference between a procedure and function is that a function will return a single value to a calling program such as a SQL select statement. A procedure, on the other hand, does not return a value, only a status code. However, procedures may have one or many variables that can be set and returned as part of the argument list to the procedure.
- Chapter 1: Getting Started with the Oracle Architecture 23 Procedures and functions have many advantages in a database environment. Procedures arecompiled and stored in the data dictionary once; when more than one user needs to call theprocedure, it is already compiled, and only one copy of the stored procedure exists in the sharedpool. In addition, network traffic is reduced, even if the procedural features of PL/SQL are notused. One PL/SQL call uses up much less network bandwidth than several SQL select and insertstatements sent separately over the network, not to mention the reparsing that occurs for eachstatement sent over the network.PackagesPL/SQL packages group together related functions and procedures, along with common variablesand cursors. Packages consist of two parts: a package specification and a package body. In thepackage specification, the methods and attributes of the package are exposed; the implementationof the methods along with any private methods and attributes are hidden in the package body.Using a package instead of a standalone procedure or function allows the embedded procedureor function to be changed without invalidating any objects that refer to elements of the packagespecification, thus avoiding recompilation of the objects that reference the package.TriggersTriggers are a specialized type of a PL/SQL or Java block of code that is executed, or triggered,when a specified event occurs. The types of events can be DML statements on a table or view, DDLstatements, and even database events such as startup or shutdown. The specified trigger can berefined to execute on a particular event for a particular user as part of an auditing strategy. Triggers are extremely useful in a distributed environment to simulate a foreign key relationshipbetween tables that do not exist in the same database. They are also very useful in implementingcomplex integrity rules that cannot be defined using the built-in Oracle constraint types. More information on how triggers can be used in a robust distributed environment can befound in Chapter 17.External File AccessIn addition to external tables, there are a number of other ways Oracle can access external files: ■ From SQL*Plus, either by accessing an external script containing other SQL commands to be run or by sending the output from a SQL*Plus spool command to a file in the operating system’s file system. ■ Text information can be read or written from a PL/SQL procedure using the UTL_FILE built-in package; similarly, dbms_output calls within a PL/SQL procedure can generate text messages and diagnostics that can be captured by another application and saved to a text file. ■ External data can be referenced by the BFILE datatype. A BFILE datatype is a pointer to an external binary file. Before BFILEs can be used in a database, a directory alias needs to be created with the create directory command that specifies a prefix containing the full directory path where the BFILE target is stored. ■ DBMS_PIPE can communicate with any 3GL language that Oracle supports, such as C++, Ada, Java, or COBOL, and exchange information. ■ UTL_MAIL, a new package in Oracle 10g, allows a PL/SQL application to send e-mails without knowing how to use the underlying SMTP protocol stack.
- 24 Oracle Database 11g DBA Handbook When using an external file as a data source, for either input or output, a number of cautions are in order. The following should be carefully considered before you use an external data source: ■ The database data and the external data may be frequently out of synch when one of the data sources changes without synchronizing with the other. ■ It is important to make sure that the backups of the two data sources occur at nearly the same time to ensure that the recovery of one data source will keep the two data sources in synch. ■ Script files may contain passwords; many organizations forbid the plain-text representation of any user account in a script file. In this situation, operating system validation may be a good alternative for user authentication. ■ You should review the security of files located in a directory that is referenced by each DIRECTORY object. Extreme security measures on database objects are mitigated by lax security on referenced operating system files. Database Links and Remote Databases Database links allow an Oracle database to reference objects stored outside of the local database. The command create database link creates the path to a remote database, which in turn allows access to objects in the remote database. A database link wraps together the name of the remote database, a method for connecting to the remote database, and a username/password combination to authenticate the connection to the remote database. In some ways, a database link is similar to a database synonym: A database link can be public or private, and it provides a convenient shorthand way to access another set of resources. The main difference is that the resource is outside of the database instead of in the same database, and therefore requires more information to resolve the reference. The other difference is that a synonym is a reference to a specific object, whereas a database link is a defined path used to access any number of objects in a remote database. For links to work between databases in a distributed environment, the global database name of each database in the domain must be different. Therefore, it is important to assign the initialization parameters DB_NAME and DB_DOMAIN correctly. To make using database links even easier, you can assign a synonym to a database link to make the table access even more transparent; the user does not know if the synonym accesses an object locally or on a distributed database. The object can move to a different remote database, or to the local database, and the synonym name can remain the same, making access to the object transparent to users. How database links to remote databases are leveraged in a distributed environment is covered further in Chapter 17. Oracle Physical Storage Structures The Oracle database uses a number of physical storage structures on disk to hold and manage the data from user transactions. Some of these storage structures, such as the datafiles, redo log files, and archived redo log files, hold actual user data; other structures, such as control files, maintain the state of the database objects, and text-based alert and trace files contain logging information for both routine events and error conditions in the database. Figure 1-3 shows the relationship
- Chapter 1: Getting Started with the Oracle Architecture 25FIGURE 1-3 Oracle physical storage structuresbetween these physical structures and the logical storage structures we reviewed in the earliersection “Oracle Logical Database Structures.”DatafilesEvery Oracle database must contain at least one datafile. One Oracle datafile corresponds to onephysical operating system file on disk. Each datafile in an Oracle database is a member of oneand only one tablespace; a tablespace, however, can consist of many datafiles. (A BIGFILEtablespace consists of exactly one datafile.) An Oracle datafile may automatically expand when it runs out of space, if the DBA createdthe datafile with the AUTOEXTEND parameter. The DBA can also limit the amount of expansionfor a given datafile by using the MAXSIZE parameter. In any case, the size of the datafile isultimately limited by the disk volume on which it resides.
- 26 Oracle Database 11g DBA Handbook TIP The DBA often has to decide whether to allocate one datafile that can autoextend indefinitely or to allocate many smaller datafiles with a limit to how much each can extend. Although the performance of each solution is likely very similar, it is probably a better idea to stick with more datafiles that are each less than 2GB in size. It is a lot easier to move around relatively smaller files, and some file systems may limit the size of an individual file to 2GB anyway. Also, if you need to temporarily move all the datafiles for a tablespace to another server, it is often easier to find several volumes, each with enough space to hold one of the datafiles, rather than one volume with enough space to hold a single datafile that is 25GB. The datafile is the ultimate resting place for all data in the database. Frequently accessed blocks in a datafile are cached in memory; similarly, new data blocks are not immediately written out to the datafile but rather are written to the datafile depending on when the database writer process is active. Before a user’s transaction is considered complete, however, the transaction’s changes are written to the redo log files. Redo Log Files Whenever data is added, removed, or changed in a table, index, or other Oracle object, an entry is written to the current redo log file. Every Oracle database must have at least two redo log files, because Oracle reuses redo log files in a circular fashion. When one redo log file is filled with redo log entries, the current log file is marked as ACTIVE, if it is still needed for instance recovery, or INACTIVE, if it is not needed for instance recovery; the next log file in the sequence is reused from the beginning of the file and is marked as CURRENT. Ideally, the information in a redo log file is never used. However, when a power failure occurs, or some other server failure causes the Oracle instance to fail, the new or updated data blocks in the database buffer cache may not yet have been written to the datafiles. When the Oracle instance is restarted, the entries in the redo log file are applied to the database datafiles in a roll forward operation, to restore the state of the database up to the point where the failure occurred. To be able to recover from the loss of one redo log file within a redo log group, multiple copies of a redo log file can exist on different physical disks. Later in this chapter, you will see how redo log files, archived log files, and control files can be multiplexed to ensure the availability and data integrity of the Oracle database. Control Files Every Oracle database has at least one control file that maintains the metadata of the database (in other words, data about the physical structure of the database itself). Among other things, it contains the name of the database, when the database was created, and the names and locations of all datafiles and redo log files. In addition, the control file maintains information used by Recovery Manager (RMAN), such as the persistent RMAN settings and the types of backups that have been performed on the database. RMAN is covered in depth in Chapter 12. Whenever any changes are made to the structure of the database, the information about the changes is immediately reflected in the control file.
- Chapter 1: Getting Started with the Oracle Architecture 27 Because the control file is so critical to the operation of the database, it can also be multiplexed.However, no matter how many copies of the control file are associated with an instance, only oneof the control files is designated as primary for purposes of retrieving database metadata. The alter database backup controlfile to trace command is another way to back up thecontrol file. It produces a SQL script that you can use to re-create the database control file incase all multiplexed binary versions of the control file are lost due to a catastrophic failure. This trace file can also be used, for example, to re-create a control file if the database needsto be renamed, or to change various database limits that could not otherwise be changed withoutre-creating the entire database.Archived Log FilesAn Oracle database can operate in one of two modes: archivelog or noarchivelog mode. Whenthe database is in noarchivelog mode, the circular reuse of the redo log files (also known as theonline redo log files) means that redo entries (the contents of previous transactions) are no longeravailable in case of a failure to a disk drive or another media-related failure. Operating innoarchivelog mode does protect the integrity of the database in the event of an instance failureor system crash, because all transactions that are committed but not yet written to the datafilesare available in the online redo log files. In contrast, archivelog mode sends a filled redo log file to one or more specified destinationsand can be available to reconstruct the database at any given point in time in the event that adatabase media failure occurs. For example, if the disk drive containing the datafiles crashes,the contents of the database can be recovered to a point in time before the crash, given a recentbackup of the datafiles and the redo log files that were generated since the backup occurred. The use of multiple archived log destinations for filled redo log files is critical for one ofOracle’s high-availability features known as Oracle Data Guard, formerly known as OracleStandby Database. Oracle Data Guard is covered in detail in Chapter 13.Initialization Parameter FilesWhen a database instance starts, the memory for the Oracle instance is allocated, and one oftwo types of initialization parameter files is opened: either a text-based file called init<SID>.ora(known generically as init.ora or a PFILE) or a server parameter file (otherwise known as anSPFILE). The instance first looks for an SPFILE in the default location for the operating system($ORACLE_HOME/dbs on Unix, for example) as either spfile<SID>.ora or spfile.ora. If neitherof these files exists, the instance looks for a PFILE with the name init<SID>.ora. Alternatively, thestartup command can explicitly specify a PFILE to use for startup. Initialization parameter files, regardless of the format, specify file locations for trace files,control files, filled redo log files, and so forth. They also set limits on the sizes of the variousstructures in the System Global Area (SGA) as well as how many users can connect to thedatabase simultaneously. Until Oracle9i, using the init.ora file was the only way to specify initialization parametersfor the instance. Although it is easy to edit with a text editor, it has some drawbacks. If a dynamicsystem parameter is changed at the command line with the alter system command, the DBA mustremember to change the init.ora file so that the new parameter value will be in effect the nexttime the instance is restarted. An SPFILE makes parameter management easier and more effective for the DBA. If an SPFILEis in use for the running instance, any alter system command that changes an initialization
- 28 Oracle Database 11g DBA Handbook parameter can change the initialization parameter automatically in the SPFILE, change it only for the running instance, or both. No editing of the SPFILE is necessary, or even possible without corrupting the SPFILE itself. Although you cannot mirror a parameter file or SPFILE per se, you can back up an SPFILE to an init.ora file, and both the init.ora and the SPFILE for the Oracle instance should be backed up using conventional operating system commands or using Recovery Manager in the case of an SPFILE. When the DBCA is used to create a database, an SPFILE is created by default. Alert and Trace Log Files When things go wrong, Oracle can and often does write messages to the alert log and, in the case of background processes or user sessions, trace log files. The alert log file, located in the directory specified by the initialization parameter BACKGROUND_DUMP_DEST, contains both routine status messages as well as error conditions. When the database is started up or shut down, a message is recorded in the alert log, along with a list of initialization parameters that are different from their default values. In addition, any alter database or alter system commands issued by the DBA are recorded. Operations involving tablespaces and their datafiles are recorded here, too, such as adding a tablespace, dropping a tablespace, and adding a datafile to a tablespace. Error conditions, such as tablespaces running out of space, corrupted redo logs, and so forth, are also recorded here. The trace files for the Oracle instance background processes are also located in BACKGROUND_DUMP_DEST. For example, the trace files for PMON and SMON contain an entry when an error occurs or when SMON needs to perform instance recovery; the trace files for QMON contain informational messages when it spawns a new process. Trace files are also created for individual user sessions or connections to the database. These trace files are located in the directory specified by the initialization parameter USER_DUMP_ DEST. Trace files for user processes are created in two situations: The first is when some type of error occurs in a user session because of a privilege problem, running out of space, and so forth. In the second situation, a trace file can be created explicitly with the command alter session set sql_trace=true. Trace information is generated for each SQL statement that the user executes, which can be helpful when tuning a user’s SQL statement. The alert log file can be deleted or renamed at any time; it is re-created the next time an alert log message is generated. The DBA will often set up a daily batch job (either through an operating system mechanism or using Oracle Enterprise Manager’s scheduler) to rename and archive the alert log on a daily basis. Backup Files Backup files can originate from a number of sources, such as operating system copy commands or Oracle Recovery Manager (RMAN). If the DBA performs a “cold” backup (see the section titled “Backup/Recovery Overview” for more details on backup types), the backup files are simply operating system copies of the datafiles, redo log files, control files, archived redo log files, and so forth. In addition to bit-for-bit image copies of datafiles (the default in RMAN), RMAN can generate full and incremental backups of datafiles, control files, archived redo log files, and SPFILEs that are in a special format, called backupsets, only readable by RMAN. RMAN backupset backups are generally smaller than the original datafiles because RMAN does not back up unused blocks.
- Chapter 1: Getting Started with the Oracle Architecture 29Oracle Managed FilesOracle Managed Files (OMF), introduced in Oracle version 9i, makes the DBA’s job easier byautomating the creation and removal of the datafiles that make up the logical structures in thedatabase. Without OMF, a DBA might drop a tablespace and forget to remove the underlying operatingsystem files. This makes inefficient use of disk resources, and it unnecessarily increases backuptime for datafiles that are no longer needed by the database. OMF is well suited for small databases with a low number of users and a part-time DBA,where optimal configuration of a production database is not necessary.Password FilesAn Oracle password file is a file within the Oracle administrative or software directory structureon disk used to authenticate Oracle system administrators for tasks such as creating a databaseor starting up and shutting down the database. The privileges granted through this file are theSYSDBA and SYSOPER privileges. Authenticating any other type of user is done within thedatabase itself; because the database may be shut down or not mounted, another form ofadministrator authentication is necessary in these cases. The Oracle command-line utility orapwd creates a password file if one does not exist or isdamaged. Because of the extremely high privileges granted via this file, it should be stored in asecure directory location that is not available to anyone except for DBAs and operating systemadministrators. Once this file is created, the initialization parameter REMOTE_LOGIN_PASSWORDFILE should be set to EXCLUSIVE to allow users other than SYS to use the password file. TIP Create at least one user other than SYS or SYSTEM who has DBA privileges for daily administrative tasks. If there is more than one DBA administering a database, each DBA should have their own account with DBA privileges. Alternatively, authentication for the SYSDBA and SYSOPER privileges can be done with OSauthentication; in this case, a password file does not have to be created, and the initializationparameter REMOTE_LOGIN_PASSWORDFILE is set to NONE.Multiplexing Database FilesTo minimize the possibility of losing a control file or a redo log file, multiplexing of database filesreduces or eliminates data-loss problems caused by media failures. Multiplexing can be somewhatautomated by using an Automatic Storage Management (ASM) instance, available starting inOracle 10g. For a more budget-conscious enterprise, control files and redo log files can bemultiplexed manually.Automatic Storage ManagementUsing Automatic Storage Management is a multiplexing solution that automates the layout ofdatafiles, control files, and redo log files by distributing them across all available disks. Whennew disks are added to the ASM cluster, the database files are automatically redistributed across
- 30 Oracle Database 11g DBA Handbook all disk volumes for optimal performance. The multiplexing features of an ASM cluster minimize the possibility of data loss and are generally more effective than a manual scheme that places critical files and backups on different physical drives. Manual Multiplexing Without a RAID or ASM solution, you can still provide some safeguards for your critical database files by setting some initialization parameters and providing an additional location for control files, redo log files, and archived redo log files. Control Files Control files can be multiplexed immediately when the database is created, or they can be multiplexed later with a few extra steps to manually copy them to multiple destinations. You can multiplex up to eight copies of a control file. Whether you multiplex the control files when the database is created or you multiplex them later, the initialization parameter value for CONTROL_FILES is the same. If you want to add another multiplexed location, you need to edit the initialization parameter file and add another location to the CONTROL_FILES parameter. If you are using an SPFILE instead of an init.ora file, then use a command similar to the following to change the CONTROL_ FILES parameter: alter system set control_files = /u01/oracle/whse2/ctrlwhse1.ctl, /u02/oracle/whse2/ctrlwhse2.ctl, /u03/oracle/whse2/ctrlwhse3.ctl scope=spfile; The other possible values for SCOPE in the alter system command are MEMORY and BOTH. Specifying either one of these for SCOPE returns an error, because the CONTROL_FILES parameter cannot be changed for the running instance, only for the next restart of the instance. Therefore, only the SPFILE is changed. In either case, the next step is to shut down the database. Copy the control file to the new destinations, as specified in CONTROL_FILES, and restart the database. You can always verify the names and locations of the control files by looking in one of the data dictionary views: select value from v$spparameter where name=control_files; This query will return one row for each multiplexed copy of the control file. In addition, the view V$CONTROLFILE contains one row for each copy of the control file along with its status. Redo Log Files Redo log files are multiplexed by changing a set of redo log files into a redo log file group. In a default Oracle installation, a set of three redo log files is created. As you learned in the previous section on redo log files, after each log file is filled, it starts filling the next in sequence. After the third is filled, the first one is reused. To change the set of three redo log files to a group, we can add one or more identical files as a companion to each of the existing redo log files. After the groups are created, the redo log entries are concurrently written to the group of redo log files. When the group of redo log files is filled, it begins to write redo entries to the next group. Figure 1-4 shows how a set of four redo log files can be multiplexed with four groups, each group containing three members.
- Chapter 1: Getting Started with the Oracle Architecture 31FIGURE 1-4 Multiplexing redo log files Adding a member to a redo log group is very straightforward. In the alter database command,we specify the name of the new file and the group to add it to. The new file is created with thesame size as the other members in the group:alter database add logfile member /u05/oracle/dc2/log_3d.dbf to group 3; If the redo log files are filling up faster than they can be archived, one possible solution is toadd another redo log group. Here is an example of how to add a fifth redo log group to the set ofredo log groups in Figure 1-4:alter database add logfile group 5 (/u02/oracle/dc2/log_3a.dbf, /u03/oracle/dc2/log_3b.dbf, /u04/oracle/dc2/log_3c.dbf) size 250m; All members of a redo log group must be the same size. However, the log file sizes betweengroups may be different. In addition, redo log groups may have a different number of members. Inthe preceding example, we started with four redo log groups, added an extra member to redo loggroup 3 (for a total of four members), and added a fifth redo log group with three members. As of Oracle 10g, you can use the Redo Logfile Sizing Advisor to assist in determining theoptimal size for redo log files to avoid excessive I/O activity or bottlenecks. See Chapter 8 formore information on how to use the Redo Logfile Sizing Advisor.
- 32 Oracle Database 11g DBA Handbook Archived Redo Log Files If the database is in archivelog mode, Oracle copies redo log files to a specified location before they can be reused in the redo log switch cycle. Oracle Memory Structures Oracle uses the server’s physical memory to hold many things for an Oracle instance: the Oracle executable code itself, session information, individual processes associated with the database, and information shared between processes (such as locks on database objects). In addition, the memory structures contain user and data dictionary SQL statements, along with cached information that is eventually permanently stored on disk, such as data blocks from database segments and information about completed transactions in the database. The data area allocated for an Oracle instance is called the System Global Area (SGA). The Oracle executables reside in the software code area. In addition, an area called the Program Global Area (PGA) is private to each server and background process; one PGA is allocated for each process. Figure 1-5 shows the relationships between these Oracle memory structures. System Global Area The System Global Area is a group of shared memory structures for an Oracle instance, shared by the users of the database instance. When an Oracle instance is started, memory is allocated for the FIGURE 1-5 Oracle logical memory structures
- Chapter 1: Getting Started with the Oracle Architecture 33SGA based on the values specified in the initialization parameter file or hard-coded in the Oraclesoftware. Many of the parameters that control the size of the various parts of the SGA are dynamic;however, if the parameter SGA_MAX_SIZE is specified, the total size of all SGA areas must notexceed the value of SGA_MAX_SIZE. If SGA_MAX_SIZE is not specified, but the parameter SGA_TARGET is specified, Oracle automatically adjusts the sizes of the SGA components so that the totalamount of memory allocated is equal to SGA_TARGET. SGA_TARGET is a dynamic parameter; itcan be changed while the instance is running. The parameter MEMORY_TARGET, new to Oracle11g, balances all memory available to Oracle between the SGA and the Program Global Area(discussed later in this chapter) to optimize performance. Memory in the SGA is allocated in units of granules. A granule can be either 4MB or 16MB,depending on the total size of the SGA. If the SGA is less than or equal to 128MB, a granule is4MB; otherwise, it is 16MB. In the next few subsections, we will cover the highlights of how Oracle uses each section inthe SGA. You can find more information on how to adjust the initialization parameters associatedwith these areas in Chapter 8.Buffer CachesThe database buffer cache holds blocks of data from disk that have been recently read to satisfya select statement or that contain modified blocks that have been changed or added from a DMLstatement. As of Oracle9i, the memory area in the SGA that holds these data blocks is dynamic.This is a good thing, considering that there may be tablespaces in the database with block sizesother than the default block size; tablespaces with up to five different block sizes (one block sizefor the default, and up to four others) require their own buffer cache. As the processing andtransactional needs change during the day or during the week, the values of DB_CACHE_SIZEand DB_nK_CACHE_SIZE can be dynamically changed without restarting the instance to enhanceperformance for a tablespace with a given block size. Oracle can use two additional caches with the same block size as the default (DB_CACHE_SIZE) block size: the KEEP buffer pool and the RECYCLE buffer pool. As of Oracle9i, both of thesepools allocate memory independently of other caches in the SGA. When a table is created, you can specify the pool where the table’s data blocks will reside byusing the BUFFER_POOL KEEP or BUFFER_POOL_RECYCLE clause in the STORAGE clause. Fortables that you use frequently throughout the day, it would be advantageous to place this tableinto the KEEP buffer pool to minimize the I/O needed to retrieve blocks in the table.Shared PoolThe shared pool contains two major subcaches: the library cache and the data dictionary cache.The shared pool is sized by the SHARED_POOL_SIZE initialization parameter. This is anotherdynamic parameter that can be resized as long as the total SGA size is less than SGA_MAX_SIZEor SGA_TARGET.Library Cache The library cache holds information about SQL and PL/SQL statements that arerun against the database. In the library cache, because it is shared by all users, many differentdatabase users can potentially share the same SQL statement. Along with the SQL statement itself, the execution plan and parse tree of the SQL statementare stored in the library cache. The second time an identical SQL statement is run, by the sameuser or a different user, the execution plan and parse tree are already computed, improving theexecution time of the query or DML statement.
- 34 Oracle Database 11g DBA Handbook If the library cache is sized too small, the execution plans and parse trees are flushed out of the cache, requiring frequent reloads of SQL statements into the library cache. See Chapter 8 for ways to monitor the efficiency of the library cache. Data Dictionary Cache The data dictionary is a collection of database tables, owned by the SYS and SYSTEM schemas, that contain the metadata about the database, its structures, and the privileges and roles of database users. The data dictionary cache holds a subset of the columns from data dictionary tables after first being read into the buffer cache. Data blocks from tables in the data dictionary are used continually to assist in processing user queries and other DML commands. If the data dictionary cache is too small, requests for information from the data dictionary will cause extra I/O to occur; these I/O-bound data dictionary requests are called recursive calls and should be avoided by sizing the data dictionary cache correctly. Redo Log Buffer The redo log buffer holds the most recent changes to the data blocks in the datafiles. When the redo log buffer is one-third full, or every three seconds, Oracle writes redo log records to the redo log files. As of Oracle Database 10g, the LGWR process will write the redo log records to the redo log files when 1MB of redo is stored in the redo log buffer. The entries in the redo log buffer, once written to the redo log files, are critical to database recovery if the instance crashes before the changed data blocks are written from the buffer cache to the datafiles. A user’s committed transaction is not considered complete until the redo log entries have been successfully written to the redo log files. Large Pool The large pool is an optional area of the SGA. It is used for transactions that interact with more than one database, message buffers for processes performing parallel queries, and RMAN parallel backup and restore operations. As the name implies, the large pool makes available large blocks of memory for operations that need to allocate large blocks of memory at a time. The initialization parameter LARGE_POOL_SIZE controls the size of the large pool and is a dynamic parameter as of Oracle9i release 2. Java Pool The Java pool is used by the Oracle JVM (Java Virtual Machine) for all Java code and data within a user session. Storing Java code and data in the Java pool is analogous to SQL and PL/SQL code cached in the shared pool. Streams Pool New to Oracle 10g, the streams pool is sized by using the initialization parameter STREAMS_ POOL_SIZE. The streams pool holds data and control structures to support the Oracle Streams feature of Oracle Enterprise Edition. Oracle Streams manages the sharing of data and events in a distributed environment. If the initialization parameter STREAMS_POOL_SIZE is uninitialized or set to zero, the memory used for Streams operations is allocated from the shared pool and may use up to 10 percent of the shared pool. For more information on Oracle Streams, see Chapter 17.
- Chapter 1: Getting Started with the Oracle Architecture 35Program Global AreaThe Program Global Area is an area of memory allocated and private for one process. Theconfiguration of the PGA depends on the connection configuration of the Oracle database:either shared server or dedicated. In a shared server configuration, multiple users share a connection to the database, minimizingmemory usage on the server, but potentially affecting response time for user requests. In a sharedserver environment, the SGA holds the session information for a user instead of the PGA. Sharedserver environments are ideal for a large number of simultaneous connections to the databasewith infrequent or short-lived requests. In a dedicated server environment, each user process gets its own connection to the database;the PGA contains the session memory for this configuration. The PGA also includes a sort area. The sort area is used whenever a user request requires asort, bitmap merge, or hash join operation. As of Oracle9i, the PGA_AGGREGATE_TARGET parameter, in conjunction with theWORKAREA_SIZE_POLICY initialization parameter, can ease system administration by allowingthe DBA to choose a total size for all work areas and let Oracle manage and allocate the memorybetween all user processes. As I mentioned earlier in this chapter, the parameter MEMORY_TARGET manages the PGA and SGA memory as a whole to optimize performance.Software Code AreaSoftware code areas store the Oracle executable files that are running as part of an Oracle instance.These code areas are static in nature and only change when a new release of the software is installed.Typically, the Oracle software code areas are located in a privileged memory area separate fromother user programs. Oracle software code is strictly read-only and can be installed either shared or non-shared.Installing Oracle software code as sharable saves memory when multiple Oracle instances arerunning on the same server at the same software release level.Background ProcessesWhen an Oracle instance starts, multiple background processes start. A background process isa block of executable code designed to perform a specific task. Figure 1-6 shows the relationshipbetween the background processes, the database, and the Oracle SGA. In contrast to aforeground process, such as a SQL*Plus session or a web browser, a background processworks behind the scenes. Together, the SGA and the background processes compose anOracle instance.SMONSMON is the System Monitor process. In the case of a system crash or instance failure, due to apower outage or CPU failure, the SMON process performs crash recovery by applying the entriesin the online redo log files to the datafiles. In addition, temporary segments in all tablespaces arepurged during system restart. One of SMON’s routine tasks is to coalesce the free space in tablespaces on a regular basis ifthe tablespace is dictionary managed.
- 36 Oracle Database 11g DBA Handbook FIGURE 1-6 Oracle background processes PMON If a user connection is dropped, or a user process otherwise fails, PMON, also known as the Process Monitor, does the cleanup work. It cleans up the database buffer cache along with any other resources that the user connection was using. For example, a user session may be updating some rows in a table, placing a lock on one or more of the rows. A thunderstorm knocks out the power at the user’s desk, and the SQL*Plus session disappears when the workstation is powered off. Within moments, PMON will detect that the connection no longer exists and perform the following tasks: ■ Roll back the transaction that was in progress when the power went out. ■ Mark the transaction’s blocks as available in the buffer cache.
- Chapter 1: Getting Started with the Oracle Architecture 37 ■ Remove the locks on the affected rows in the table. ■ Remove the process ID of the disconnected process from the list of active processes. PMON will also interact with the listeners by providing information about the status of theinstance for incoming connection requests.DBWnThe database writer process, known as DBWR in older versions of Oracle, writes new or changeddata blocks (known as dirty blocks) in the buffer cache to the datafiles. Using an LRU algorithm,DBWn writes the oldest, least active blocks first. As a result, the most commonly requestedblocks, even if they are dirty blocks, are in memory. Up to 20 DBWn processes can be started, DBW0 through DBW9 and DBWa through DBWj.The number of DBWn processes is controlled by the DB_WRITER_PROCESSES parameter.LGWRLGWR, or Log Writer, is in charge of redo log buffer management. LGWR is one of the mostactive processes in an instance with heavy DML activity. A transaction is not considered completeuntil LGWR successfully writes the redo information, including the commit record, to the redo logfiles. In addition, the dirty buffers in the buffer cache cannot be written to the datafiles by DBWnuntil LGWR has written the redo information. If the redo log files are grouped, and one of the multiplexed redo log files in a group isdamaged, LGWR writes to the remaining members of the group and records an error in the alertlog file. If all members of a group are unusable, the LGWR process fails and the entire instancehangs until the problem can be corrected.ARCnIf the database is in ARCHIVELOG mode, then the archiver process, or ARCn, copies redo logs toone or more destination directories, devices, or network locations whenever a redo log fills upand redo information starts to fill the next redo log in sequence. Optimally, the archive processfinishes before the filled redo log is needed again; otherwise, serious performance problemsoccur—users cannot complete their transactions until the entries are written to the redo log files,and the redo log file is not ready to accept new entries because it is still being written to thearchive location. There are at least three potential solutions to this problem: make the redo logfiles larger, increase the number of redo log groups, and increase the number of ARCn processes.Up to ten ARCn processes can be started for each instance by increasing the value of the LOG_ARCHIVE_MAX_PROCESSES initialization parameter.CKPTThe checkpoint process, or CKPT, helps to reduce the amount of time required for instance recovery.During a checkpoint, CKPT updates the header of the control file and the datafiles to reflect thelast successful SCN (System Change Number). A checkpoint occurs automatically every time a redolog file switch occurs. The DBWn processes routinely write dirty buffers to advance the checkpointfrom where instance recovery can begin, thus reducing the Mean Time to Recovery (MTTR).RECOThe RECO, or recoverer process, handles failures of distributed transactions (that is, transactionsthat include changes to tables in more than one database). If a table in the CCTR database ischanged along with a table in the WHSE database, and the network connection between thedatabases fails before the table in the WHSE database can be updated, RECO will roll back thefailed transaction.
- 38 Oracle Database 11g DBA Handbook Backup/Recovery Overview Oracle supports many different forms of backup and recovery. Some of them can be managed at the user level, such as export and import; most of them are strictly DBA-centric, such as online or offline backups and using operating system commands or the RMAN utility. Details for configuring and using these backup and recovery methods can be found in Chapter 11 and also in Chapter 12. Export/Import The export command is a standalone utility on all Oracle hardware and software platforms, and it’s started by running the command exp at the operating system command-line prompt or through the Oracle Enterprise Manager console in a GUI environment. Export is considered a logical backup, because the underlying storage characteristics of the tables are not recorded, only the table metadata, user privileges, and table data. Depending on the task at hand, and whether you have DBA privileges or not, the exp command can either export all tables in the database, all the tables of one or more users, or a specific set of tables. For restoring from a database export, the import command, started by running the command imp, takes a binary format file created by export and imports it into the database with the assumption that the users in the exported database tables exist in the database where the import command is performed. One advantage to using export and import is that a database power user may be able to manage their own backups and recoveries, especially in a development environment. Also, a binary file generated by export is typically readable across Oracle versions, making a transfer of a small set of tables from an older version to a newer version of Oracle fairly straightforward. Export and import are inherently “point in time” backups and therefore are not the most robust backup and recovery solutions if the data is volatile. In Oracle 10g, Oracle Data Pump takes import and export operations to a new performance level. Exports to an external data source can be up to two times faster, and an import operation can be up to 45 times faster because Data Pump Import uses direct path loading, unlike traditional import. In addition, an export from the source database can be simultaneously imported into the target database without an intermediate dump file, saving time and administrative effort. Oracle Data Pump is implemented using the DBMS_DATAPUMP package with the expdb and impdb commands and includes numerous other manageability features, such as fine-grained object selection. More information on Oracle Data Pump is provided in Chapter 17. Offline Backups One of the ways to make a physical backup of the database is to perform an offline backup. To perform an offline backup, the database is shut down and all database-related files, including datafiles, control files, SPFILEs, password files, and so forth, are copied to a second location. Once the copy operation is complete, the database instance can be started. Offline backups are similar to export backups because they are point-in-time backups and therefore of less value if up-to-the minute recovery of the database is required and the database is not in archivelog mode. Another downside to offline backups is the amount of downtime necessary to perform the backup; any multinational company that needs 24/7 database access will most likely not do offline backups very often.
- Chapter 1: Getting Started with the Oracle Architecture 39Online BackupsIf a database is in archivelog mode, it is possible to do online backups of the database. Thedatabase can be open and available to users even while the backup is in process. The procedurefor doing online backups is as easy as placing a tablespace into a backup state by using the altertablespace users begin backup command, backing up the datafiles in the tablespace with operatingsystem commands, and then taking the tablespace out of the backup state with the alter tablespaceusers end backup command.RMANThe backup tool Recovery Manager, known more commonly as RMAN, has been around sinceOracle8. RMAN provides many advantages over other forms of backup. It can perform incrementalbackups of only changed data blocks in between full database backups while the database remainsonline throughout the backup. RMAN keeps track of the backups via one of two methods: through the control file of thedatabase being backed up, or through a recovery catalog stored in another database. Using thetarget database’s control file for RMAN is easy, but it’s not the best solution for a robust enterprisebackup methodology. Although a recovery catalog requires another database to store the metadatafor the target database along with a record of all backups, it is well worth it when all the controlfiles in the target database are lost due to a catastrophic failure. In addition, a recovery catalogretains historical backup information that may be overwritten in the target database’s control fileif the value of CONTROL_FILE_RECORD_KEEP_TIME is set too low. RMAN is discussed in detail in Chapter 12.Security CapabilitiesIn the next few sections, I’ll give a brief overview of the different ways that the Oracle 11gDatabase controls and enforces security in a database. Account security based on user andschema objects was covered in the section on database objects; the other security topics arecovered here. An in-depth look at these and other security capabilities within Oracle is covered in Chapter 9.Privileges and RolesIn an Oracle database, privileges control access to both the actions a user can perform and theobjects in the database. Privileges that control access to actions in the database are called systemprivileges, whereas privileges that control access to data and other objects are called objectprivileges. To make assignment and management of privileges easier for the DBA, a database role groupsprivileges together. To put it another way, a role is a named group of privileges. In addition, a rolecan itself have roles assigned to it. Privileges and roles are granted and revoked with the grant and revoke commands. The usergroup PUBLIC is neither a user nor a role, nor can it be dropped; however, when privileges aregranted to PUBLIC, they are granted to every user of the database, both present and future.
- 40 Oracle Database 11g DBA Handbook System Privileges System privileges grant the right to perform a specific type of action in the database, such as creating users, altering tablespaces, or dropping any view. Here is an example of granting a system privilege: grant DROP ANY TABLE to SCOTT WITH ADMIN OPTION; The user SCOTT can drop anyone’s table in any schema. The with grant option clause allows SCOTT to grant his newly granted privilege to other users. Object Privileges Object privileges are granted on a specific object in the database. The most common object privileges are SELECT, UPDATE, DELETE, and INSERT for tables, EXECUTE for a PL/SQL stored object, and INDEX for granting index-creation privileges on a table. In the following example, the user RJB can perform any DML on the JOBS table owned by the HR schema: grant SELECT, UPDATE, INSERT, DELETE on HR.JOBS to RJB; Auditing To audit access to objects in the database by users, you can set up an audit trail on a specified object or action by using the audit command. Both SQL statements and access to a particular database object can be audited; the success or failure of the action (or both) can be recorded in the audit trail table, SYS.AUD$, or in an O/S file if specified by the AUDIT_TRAIL initialization parameter with a value of OS. For each audited operation, Oracle creates an audit record with the username, the type of operation that was performed, the object involved, and a timestamp. Various data dictionary views, such as DBA_AUDIT_TRAIL and DBA_FGA_AUDIT_TRAIL, make interpreting the results from the raw audit trail table SYS.AUD$ easier. CAUTION Excessive auditing on database objects can have an adverse effect on performance. Start out with basic auditing on key privileges and objects, and expand the auditing when the basic auditing has revealed a potential problem. Fine-grained Auditing The fine-grained auditing capability that was introduced in Oracle9i and enhanced in both Oracle 10g and Oracle 11g takes auditing one step further: Standard auditing can detect when a select statement was executed on an EMPLOYEE table; fine-grained auditing will record an audit record containing specific columns accessed in the EMPLOYEE table, such as the SALARY column.
- Chapter 1: Getting Started with the Oracle Architecture 41 Fine-grained auditing is implemented using the DBMS_FGA package along with the datadictionary view DBA_FGA_AUDIT_TRAIL. The data dictionary view DBA_COMMON_AUDIT_TRAIL combines standard audit records in DBA_AUDIT_TRAIL with fine-grained audit records.Virtual Private DatabaseThe Virtual Private Database feature of Oracle, first introduced in Oracle8i, couples fine-grainedaccess control with a secure application context. The security policies are attached to the data,and not to the application; this ensures that security rules are enforced regardless of how the datais accessed. For example, a medical application context may return a predicate based on the patientidentification number accessing the data; the returned predicate will be used in a WHERE clauseto ensure that the data retrieved from the table is only the data associated with the patient.Label SecurityOracle Label Security provides a “VPD Out-of-the-Box” solution to restrict access to rows in anytable based on the label of the user requesting the access and the label on the row of the tableitself. Oracle Label Security administrators do not need any special programming skills to assignsecurity policy labels to users and rows in the table. This highly granular approach to data security can, for example, allow a DBA at an ApplicationService Provider (ASP) to create only one instance of an accounts receivable application and touse Label Security to restrict rows in each table to an individual company’s accounts receivableinformation.Real Application ClustersOracle’s Real Application Clusters (RAC) feature, known in previous Oracle versions as theOracle Parallel Server option, allows more than one instance, on separate servers, to accessthe same database files. A RAC installation can provide extreme high availability for both planned and unplannedoutages. One instance can be restarted with new initialization parameters while the other instanceis still servicing requests against the database. If one of the hardware servers crashes due to a faultof some type, the Oracle instance on the other server will continue to process transactions, evenfrom users who were connected to the crashed server, transparently and with minimal downtime. RAC, however, is not a software-only solution: The hardware that implements RAC has specialrequirements. The shared database should be on a RAID-enabled disk subsystem to ensure thateach component of the storage system is fault tolerant. In addition, RAC requires a high-speedinterconnect, or a private network, between the nodes in the cluster to support messaging andtransfer of blocks from one instance to another using the Cache Fusion mechanism. The diagram in Figure 1-7 shows a two-node RAC installation. How to set up and configureReal Application Clusters is discussed in depth in Chapter 10.
- 42 Oracle Database 11g DBA Handbook FIGURE 1-7 A two-node Real Application Clusters (RAC) configuration Oracle Streams As a component of Oracle Enterprise Edition, Oracle Streams is the higher-level component of the Oracle infrastructure that complements Real Application Clusters. Oracle Streams allows the smooth flow and sharing of both data and events within the same database or from one database to another. It is another key piece in Oracle’s long list of high-availability solutions, tying together and enhancing Oracle’s message queuing, data replication, and event management functions. More information on how to implement Oracle Streams can be found in Chapter 17. Oracle Enterprise Manager Oracle Enterprise Manager (OEM) is a valuable set of tools that facilitates the comprehensive management of all components of an Oracle infrastructure, including Oracle database instances, Oracle application servers, and web servers. If a management agent exists for a third-party application, then OEM can manage the third-party application in the same framework as any Oracle-supplied target. OEM is fully web-enabled via Netscape or Internet Explorer, and as a result any operating system platform that supports Netscape or IE can be used to launch the OEM console. One of the key decisions to make when using OEM with Oracle Grid Control is the location to store the management repository. The OEM management repository is stored in a database separate from the nodes or services being managed or monitored. The metadata from the nodes and services is centralized and facilitates the administration of these nodes. The management repository database should be backed up often and separately from the databases being managed. An installation of OEM provides a tremendous amount of value “out of the box.” When the OEM installation is complete, e-mail notifications are already set up to send messages to the SYSMAN or any other e-mail account for critical conditions, and the initial target discovery is automatically completed.
- Chapter 1: Getting Started with the Oracle Architecture 43Oracle Initialization ParametersAn Oracle database uses initialization parameters to configure memory settings, disk locations,and so forth. There are two ways to store initialization parameters: using an editable text file andusing a server-side binary file. Regardless of the method used to store the initialization parameters,there is a defined set of basic initialization parameters (as of Oracle 10g) that every DBA shouldbe familiar with when creating a new database. As of Oracle 10g, initialization parameters fall into two broad categories: basic initializationparameters and advanced initialization parameters. As Oracle becomes more and more self-managing,the number of parameters that a DBA must be familiar with and adjust on a daily basis is reduced.Basic Initialization ParametersThe list of Oracle 10g basic initialization parameters appears in Table 1-3 along with a briefdescription of each. In the sections that follow, we will give some further explanation and adviceregarding how some of these parameters should be set, depending on the hardware and softwareenvironment, the types of applications, and the number of users in the database. Initialization Parameter Description CLUSTER_DATABASE Enables this node to be a member of a cluster. COMPATIBLE Allows a new database version to be installed while ensuring compatibility with the release specified by this parameter. CONTROL_FILES Specifies the location of the control files for this instance. DB_BLOCK_SIZE Specifies the size of Oracle blocks. This block size is used for the SYSTEM, SYSAUX, and temporary tablespaces at database creation. DB_CREATE_FILE_DEST The default location for OMF datafiles. Also specifies the location of control files and redo log files if DB_CREATE_ONLINE_LOG_DEST_ n is not set. DB_CREATE_ONLINE_LOG_DEST_n The default location for OMF control files and online redo log files. DB_DOMAIN The logical domain name where the database resides in a distributed database system (for example, us.oracle.com). DB_NAME A database identifier of up to eight characters. Prepended to the DB_DOMAIN value for a fully qualified name (for example, marketing. us.oracle.com). DB_RECOVERY_FILE_DEST The default location for the recovery area. Must be set along with DB_RECOVERY_FILE_DEST_SIZE. DB_RECOVERY_FILE_DEST_SIZE The maximum size, in bytes, for the files used for recovery in the recovery area location. DB_UNIQUE_NAME A globally unique name for the database. This distinguishes databases that have the same DB_NAME within the same DB_ DOMAIN. INSTANCE_NUMBER In a RAC installation, the instance number of this node in the cluster.TABLE 1-3 Basic Initialization Parameters
- 44 Oracle Database 11g DBA Handbook Initialization Parameter Description JOB_QUEUE_PROCESSES The maximum number of processes allowed for executing jobs, ranging from 0 to 1000. LDAP_DIRECTORY_SYSAUTH Enables or disables directory-based authorization for users with the SYSDBA and SYSOPER roles. LOG_ARCHIVE_DEST_n For ARCHIVELOG mode, up to ten locations for sending archived log files. LOG_ARCHIVE_DEST_STATE_n Sets the availability of the corresponding LOG_ARCHIVE_DEST_n sites. NLS_LANGUAGE Specifies the default language of the database, including messages, day and month names, and sorting rules (for example, ‘AMERICAN’). NLS_TERRITORY The territory name used for day and week numbering (for example, ‘SWEDEN’, ‘TURKEY’, or ‘AMERICA’). OPEN_CURSORS The maximum number of open cursors per session. PGA_AGGREGATE_TARGET The total memory to allocate for all server processes in this instance. PROCESSES The maximum number of operating system processes that can connect to Oracle simultaneously. SESSIONS and TRANSACTIONS are derived from this value. REMOTE_LISTENER A network name resolving to an Oracle Net remote listener. REMOTE_LOGIN_PASSWORDFILE Specifies how Oracle uses password files. Required for RAC. ROLLBACK_SEGMENTS Names of private rollback segments to bring online, if undo management is not used for transaction rollback. SESSIONS The maximum number of sessions, and therefore simultaneous users, in the instance. Defaults to 1.1*PROCESSES + 5. SGA_TARGET Specifies the total size of all SGA components; this parameter automatically determines DB_CACHE_SIZE, SHARED_POOL_SIZE, LARGE_POOL_SIZE, STREAMS_POOL_SIZE, and JAVA_POOL_SIZE. SHARED_SERVERS The number of shared server processes to allocate when an instance is started. STAR_TRANSFORMATION_ENABLED Controls query optimization when start queries are executed. UNDO_MANAGEMENT Specifies whether undo management is automatic (AUTO) or manual (MANUAL). If MANUAL is specified, rollback segments are used for undo management. UNDO_TABLESPACE The tablespace to use when UNDO_MANAGEMENT is set to AUTO. TABLE 1-3 Basic Initialization Parameters (continued) Some of these parameters will be revisited in the appendix, where we will set the initial parameters for the SGA, file locations, and other limits. COMPATIBLE The COMPATIBLE parameter allows a newer version of Oracle to be installed while restricting the feature set of the new version as if an older version of Oracle was installed. This is a good way to move forward with a database upgrade while remaining compatible with an application that may fail when it runs with the new version of the software. The COMPATIBLE parameter can then be
- Chapter 1: Getting Started with the Oracle Architecture 45bumped up as the applications are reworked or rewritten to work with the new version of thedatabase. The downside of using this parameter is that none of the new applications for the databasecan take advantage of new features until the COMPATIBLE parameter is set to the same value asthe current release.DB_NAMEDB_NAME specifies the local portion of the database name. It can be up to eight characters andmust begin with an alphanumeric character. Once set, it can only be changed with the OracleDBNEWID utility (nid); the DB_NAME is recorded in each datafile, redo log file, and control filein the database. At database startup, the value of this parameter must match the value of DB_NAME recorded in the control file.DB_DOMAINDB_DOMAIN specifies the name of the network domain where the database will reside. Thecombination of DB_NAME and DB_DOMAIN must be unique within a distributed databasesystem.DB_RECOVERY_FILE_DEST and DB_RECOVERY_FILE_DEST_SIZEWhen database recovery operations occur, either due to an instance failure or a media failure,it is convenient to have a flash recovery area to store and manage files related to a recovery orbackup operation. Starting with Oracle 10g, the parameter DB_RECOVERY_FILE_DEST can be adirectory location on the local server, a network directory location, or an ASM (Automatic StorageManagement) disk area. The parameter DB_RECOVERY_FILE_DEST_SIZE places a limit on howmuch space is allowed for the recovery or backup files. These parameters are optional, but if they are specified, Recovery Manager (RMAN) canautomatically manage the files needed for backup and recovery operations. The size of thisrecovery area should be large enough to hold two copies of all datafiles, incremental RMANbackups, online redo logs, archived log files not yet backed up to tape, the SPFILE, and thecontrol file.CONTROL_FILESThe CONTROL_FILES parameter is not required when you create a database. If it is not specified,Oracle creates one control file in a default location, or if OMF is configured, in the locationspecified by either DB_CREATE_FILE_DEST or DB_CREATE_ONLINE_LOG_DEST_n and asecondary location specified by DB_RECOVERY_FILE DEST. Once the database is created, theCONTROL_FILES parameter reflects the names of the control file locations if you are using anSPFILE; if you are using a text initialization parameter file, you must add the location to this filemanually. However, it is strongly recommended that multiple copies of the control file be created onseparate physical volumes. Control files are so critical to the database integrity and are so smallthat at least three multiplexed copies of the control file should be created on separate physicaldisks. In addition, the command alter database backup controlfile to trace should be executedto create a text-format copy of the control file in the event of a major disaster. The following example specifies three locations for copies of the control file:CONTROL_FILES = (/u01/oracle10g/test/control01.ctl, /u03/oracle10g/test/control02.ctl, /u07/oracle10g/test/control03.ctl)
- 46 Oracle Database 11g DBA Handbook DB_BLOCK_SIZE The parameter DB_BLOCK_SIZE specifies the size of the default Oracle block in the database. At database creation, the SYSTEM, TEMP, and SYSAUX tablespaces are created with this block size. Ideally, this parameter is the same as or a multiple of the operating system block size for I/O efficiency. Before Oracle9i, you might specify a smaller block size (4KB or 8KB) for OLTP systems and a larger block size (up to 32KB) for DSS (decision support system) databases. However, now that tablespaces with up to five block sizes can coexist in the same database, a smaller value for DB_ BLOCK_SIZE is fine. However, 8KB is probably preferable as a minimum for any database, unless it has been rigorously proven in the target environment that a 4KB block size will not cause performance issues. SGA_TARGET Another way that Oracle 10g can facilitate a “set it and forget it” database is by the ability to specify a total amount of memory for all SGA components. If SGA_TARGET is specified, the parameters DB_CACHE_SIZE, SHARED_POOL_SIZE, LARGE_POOL_SIZE, STREAMS_POOL_ SIZE, and JAVA_POOL_SIZE are automatically sized by Automatic Shared Memory Management (ASMM). If any of these four parameters are manually sized when SGA_TARGET is also set, ASMM uses the manually sized parameters as minimums. Once the instance starts, the automatically sized parameters can by dynamically increased or decreased, as long as the parameter SGA_MAX_SIZE is not exceeded. The parameter SGA_MAX_ SIZE specifies a hard upper limit for the entire SGA, and it cannot be exceeded or changed until the instance is restarted. Regardless of how the SGA is sized, be sure that enough free physical memory is available in the server to hold the components of the SGA and all background processes; otherwise, excessive paging will occur and performance will suffer. MEMORY_TARGET Even though MEMORY_TARGET is not a “basic” parameter according to the Oracle documentation, it can greatly simplify instance memory management. This parameter specifies the Oracle system- wide usable memory; Oracle in turn reallocates memory between, for example, the SGA and PGA to optimize performances. DB_CACHE_SIZE and DB_nK_CACHE_SIZE The parameter DB_CACHE_SIZE specifies the size of the area in the SGA to hold blocks of the default size, including those from the SYSTEM, TEMP, and SYSAUX tablespaces. Up to four other caches can be defined if there are tablespaces with block sizes other than the SYSTEM and SYSAUX tablespaces. The value of n can be 2, 4, 8, 16, or 32; if the value of n is the same as the default block size, the corresponding DB_nK_CACHE_SIZE parameter is illegal. Although this parameter is not one of the basic initialization parameters, it becomes very basic when you transport a tablespace from another database with a block size other than DB_BLOCK_SIZE! There are distinct advantages to a database containing multiple block sizes. The tablespace handling OLTP applications can have a smaller block size, and the tablespace with the data warehouse table can have a larger block size. However, be careful when allocating memory for each of these cache sizes so as not to allocate too much memory for one at the expense of another. As of Oracle9i, Oracle’s Buffer Cache Advisory feature monitors the cache usage for each cache size in the view V$DB_CACHE_ADVICE to assist the DBA in sizing these memory areas. More information on how to use the Buffer Cache Advisory feature can be found in Chapter 8.
- Chapter 1: Getting Started with the Oracle Architecture 47SHARED_POOL_SIZE, LARGE_POOL_SIZE, STREAMS_POOL_SIZE,and JAVA_POOL_SIZEThe parameters SHARED_POOL_SIZE, LARGE_POOL_SIZE, STREAMS_POOL_SIZE, and JAVA_POOL_SIZE, which size the shared pool, large pool, streams pool, and Java pool, respectively,are automatically sized by Oracle if the SGA_TARGET initialization parameter is specified. Moreinformation on manually tuning these areas can be found in Chapter 8.PROCESSESThe value for the PROCESSES initialization parameter represents the total number of processesthat can simultaneously connect to the database. This includes both the background processesand the user processes; a good starting point for the PROCESSES parameter would be 15 for thebackground processes plus the number of expected maximum concurrent users; for a smallerdatabase, 50 is a good starting point, because there is little or no overhead associated withmaking PROCESSES too big.UNDO_MANAGEMENT and UNDO_TABLESPACEAutomatic Undo Management (AUM), introduced in Oracle9i, eliminates or at least greatly reducesthe headaches in trying to allocate the right number and size of rollback segments to handle theundo information for transactions. Instead, a single undo tablespace is specified for all undooperations (except for a SYSTEM rollback segment), and all undo management is handledautomatically when the UNDO_MANAGEMENT parameter is set to AUTO. The remaining task for the DBA is sizing the undo tablespace. Data dictionary views such asV$UNDOSTAT and the Undo Advisor can help the DBA adjust the size of the undo tablespace.Multiple undo tablespaces may be created; for example, a smaller undo tablespace is onlineduring the day to handle relatively small transaction volumes, and a larger undo tablespaceis brought online overnight to handle batch jobs and long-running queries that load the datawarehouse and need transactional consistency. Only one undo tablespace may be active atany given time. As of Oracle 11g, AUM is enabled by default. In addition, new PL/SQL procedures areavailable to supplement the information you get from the Undo Advisor and V$UNDOSTAT.Advanced Initialization ParametersThe advanced initialization parameters include the balance of the initialization parameters notlisted here, for a total of 283 of them in Release 1 of Oracle Database 11g. Most of these can beautomatically set and tuned by the Oracle instance when the basic initialization parameters areset. We will review some of these in the appendix (“Installation and Configuration”).
- This page intentionally left blank
- CHAPTER 2Upgrading to Oracle Database 11g 49
- 50 Oracle Database 11g DBA Handbook f you have previously installed an earlier version of the Oracle database server, I you can upgrade your database to Oracle Database 11g. Multiple upgrade paths are supported; the right choice for you will depend on factors such as your current Oracle software version and your database size. In this chapter, you will see descriptions of these methods along with guidelines for their use. If you have not used a version of Oracle prior to Oracle Database 11g, you can skip this chapter for now. However, you will likely need to refer to it when you upgrade from Oracle Database 11g to a later version or when you migrate data from a different database into your database. Prior to beginning the upgrade, you should read the Oracle Database 11g Installation Guide for your operating system. A successful installation is dependent on a properly configured environment— including operating system patch levels and system parameter settings. Plan to get the installation and upgrade right the first time rather than attempting to restart a partially successful installation. Configure the system to support both the installation of the Oracle software and the creation of a usable starter database. This chapter assumes that your installation of the Oracle Database 11g software (see Chapter 1 and the appendix titled “Installation and Configuration”) completed successfully and that you have an Oracle database that uses an earlier version of the Oracle software on the same server. Note that whether you are installing from scratch or upgrading a previous version of the Oracle Database, there are distinct advantages to installing the Oracle Database 11g software and creating the database in separate steps. When installing from scratch, you have greater control over initialization parameters, database file locations, memory allocation, and so forth when you create the database in a separate step; when upgrading from a previous release, installing the software first provides you with the Oracle Pre-Upgrade Information Tool that you use against the existing database to alert you to any potential compatibility problems when you upgrade to Oracle Database 11g. To upgrade that database, you have four options: ■ Use the Database Upgrade Assistant (DBUA) to guide and perform the upgrade in place. The old database will become an Oracle 11g database during this process. DBUA supports both Oracle Real Application Clusters (RAC) and Automatic Storage Management (ASM); you can launch DBUA as part of the installation process or as a standalone tool after installation. Oracle strongly recommend using DBUA for Oracle Database major releases or patch release upgrades. ■ Perform a manual upgrade of the database. The old database will become an Oracle 11g database during this process. While you have very precise control over every step of the process, this method is more susceptible to error if you miss a step or forget a prerequisite step. ■ Use the Export and Import (or Oracle Data Pump) utilities to move data from an earlier version of Oracle to the Oracle 11g database. Two separate databases will be used—the old database as the source for the export and the new database as the target for the import. If you are upgrading from Oracle Database 10g, you will use Oracle Data Pump to move your data from the old database to the new database. ■ Copy data from an earlier version of Oracle to an Oracle 11g database. Two separate databases will be used—the old database as the source for the copy and the new database as the target for the copy. This method is the most straightforward because your migration consists primarily of create table as select SQL statements referencing the old and new
- Chapter 2: Upgrading to Oracle Database 11g 51 databases; however, unless your database has very few tables and you aren’t concerned with using existing SQL tuning sets, statistics, and so forth, Oracle does not recommend this method for production databases. Upgrading a database in place—via either the Database Upgrade Assistant or the manualupgrade path—is called a direct upgrade. Because a direct upgrade does not involve creating asecond database for the one being upgraded, it may complete faster and require less disk spacethan an indirect upgrade. NOTE Direct upgrade of the database to version 11 is only supported if your present database is using one of these releases of Oracle: 9.2.0.4, 10.1.0.2, or 10.2.0.1. If you are using any other release, you will first have to upgrade the database to one of those releases or you will need to use a different upgrade option. Oracle 8.0.6 is only supported for some versions (generally 64-bit), so be sure to check the online certification matrixes at Oracle’s Metalink site or in the Oracle Database Upgrade Guide. NOTE Plan your upgrades carefully; you may need to allow time for multiple incremental upgrades (such as from 8.1.7 to 8.1.7.4 to 9.2.0.8) prior to upgrading to Oracle Database 11g.Choosing an Upgrade MethodAs described in the previous section, two direct upgrade and two indirect upgrade paths areavailable. In this section, you will see a more detailed description of the options, followed byusage descriptions. In general, the direct upgrade paths will perform the upgrade the fastest because they upgradethe database in place. The other methods involve copying data, either to an Export dump file onthe file system, across a database link, or via a Data Pump export. For very large databases, thetime required to completely re-create the database via the indirect methods may exclude themas viable options. The first direct method relies on the Database Upgrade Assistant (DBUA). DBUA is aninteractive tool that guides you through the upgrade process. DBUA evaluates your presentdatabase configuration and recommends modifications that can be implemented during theupgrade process. These recommendations may include the sizing of files and the specificationsfor the new SYSAUX tablespace if you are upgrading from a version previous to 10g. After youaccept the recommendations, DBUA performs the upgrade in the background while a progresspanel is displayed. DBUA is very similar in approach to the Database Configuration Assistant(DBCA). As discussed in Chapter 1 and the appendix, DBCA is a graphical interface to the stepsand parameters required to make the upgrade a success. The second direct method is called a manual upgrade. Whereas DBUA runs scripts in thebackground, the manual upgrade path involves database administrators running the scriptsthemselves. The manual upgrade approach gives you a great deal of control, but it also addsto the level of risk in the upgrade because you must perform the steps in the proper order.
- 52 Oracle Database 11g DBA Handbook You can use the original Export and Import (or Oracle Data Pump Export/Import starting with Oracle Database 10g) as an indirect method for upgrading a database. In this method, you export the data from the old version of the database and then import it into a database that uses the new version of the Oracle software. This process may require disk space for multiple copies of the data—in the source database, in the Export dump file, and in the target database. In exchange for these costs, this method gives you great flexibility in choosing which data will be migrated. You can select specific tablespaces, schemas, tables, and rows to be exported. In the Export/Import and Data Pump methods, the original database is not upgraded; its data is extracted and moved, and the database can then either be deleted or be run in parallel with the new database until testing of the new database has been completed. In the process of performing the export/import, you are selecting and reinserting each row of the database. If the database is very large, the import process may take a long time, impacting your ability to provide the upgraded database to your users in a timely fashion. See Chapter 12 for details on the Export/Import and Data Pump utilities. NOTE Depending on the version of the source database, you will need to use a specific version of the Export and Import utilities. See the section “Export and Import Versions to Use” later in this chapter. In the data-copying method, you issue a series of create table as select . . . or insert into . . . select commands that cross database links (see Chapter 16) to retrieve the source data. The tables are created in the Oracle 11g database based on queries of data from a separate source database. This method allows you to bring over data incrementally and to limit the rows and columns migrated. However, you will need to be careful that the copied data maintains all the necessary relationships among tables as well as any indexes or constraints. As with the Export/Import method, this method may require a significant amount of time for large databases. NOTE If you are changing the operating platform at the same time, you can use transportable tablespaces to move the data from the old database to the new database. For very large databases, this method may be faster than the other data-copying methods. See Chapter 17 for the details on transportable tablespaces. Selecting the proper upgrade method requires you to evaluate the technical expertise of your team, the data that is to be migrated, and the allowable downtime for the database during the migration. In general, using DBUA will be the method of choice for very large databases, whereas smaller databases may use an indirect method. Before Upgrading Prior to beginning the migration, you should back up the existing database and database software. If the migration fails for some reason and you are unable to revert the database or software to its earlier version, you will be able to restore your backup and re-create your database.
- Chapter 2: Upgrading to Oracle Database 11g 53 You should develop and test scripts that will allow you to evaluate the performance andfunctionality of the database following the upgrade. This evaluation may include the performance ofspecific database operations or the overall performance of the database under a significant user load. Prior to executing the upgrade process on a production database, you should attempt theupgrade on a test database so any missing components (such as operating system patches) canbe identified and the time required for the upgrade can be measured. Oracle Database 11g includes the Pre-Upgrade Information Tool called utlu111i.sql. This toolis included in the installation files in the directory $ORACLE_HOME/rdbms/admin. Copy this scriptto a location accessible by the old database, connect to the old database with SYSDBA privileges,and run this tool from a SQL*Plus session similar to the following:SQL> spool upgrade_11g_info.txtSQL> @utlu111i.sqlSQL> spool off Review the file upgrade_11g_info.txt for adjustments you should make before performing theactual upgrade; these adjustments include increasing the size of tablespaces, removing obsoleteinitialization parameters, and revoking obsolete roles such as CONNECT. As of Oracle Database 11g,the CONNECT role only contains the CREATE SESSION privilege. You need to grant permissionsto users with the CONNECT role before upgrading. Here is a query you can use to identify usersgranted the CONNECT role:SELECT grantee FROM dba_role_privs WHERE granted_role = CONNECT and grantee NOT IN ( SYS, OUTLN, SYSTEM, CTXSYS, DBSNMP, LOGSTDBY_ADMINISTRATOR, ORDSYS, ORDPLUGINS, OEM_MONITOR, WKSYS, WKPROXY, WK_TEST, WKUSER, MDSYS, LBACSYS, DMSYS, WMSYS, OLAPDBA, OLAPSVR, OLAP_USER, OLAPSYS, EXFSYS, SYSMAN, MDDATA, SI_INFORMTN_SCHEMA, XDB, ODM); Prior to performing a direct upgrade, you should analyze the data dictionary tables. Duringthe upgrade process to Oracle 11g, the data dictionary will be analyzed if it has not beenanalyzed already, so performing this step in advance will aid the performance of the upgrade. Foran Oracle version 10g database, you can use this procedure invocation to gather dictionary stats:EXEC DBMS_STATS.GATHER_DICTIONARY_STATS;Using the Database Upgrade AssistantYou can start the Database Upgrade Assistant (DBUA) via thedbuacommand (in Unix environments) or by selecting Database Upgrade Assistant from the OracleConfiguration and Migration Tools menu option (in Windows environments). If you are using aUnix environment, you will need to enable an X Window display prior to starting DBUA.
- 54 Oracle Database 11g DBA Handbook When started, DBUA will display a Welcome screen. At the next screen, select the database you want to upgrade from the list of available databases. You can upgrade only one database at a time. After you make your selection, the upgrade process begins. DBUA will perform pre-upgrade checks (such as for obsolete initialization parameters or files that are too small). DBUA will then create the SYSAUX tablespace, a standard tablespace in all Oracle 10g and 11g databases. You can override Oracle’s defaults for the location and size parameters for the datafiles used by the SYSAUX tablespace. DBUA will then prompt you to recompile invalid PL/SQL objects following the upgrade. If you do not recompile these objects after the upgrade, the first user of these objects will be forced to wait while Oracle performs a run-time recompilation. DBUA will then prompt you to back up the database as part of the upgrade process. If you have already backed up the database prior to starting DBUA, you may elect to skip this step. If you choose to have DBUA back up the database, it will shut down the database and perform an offline backup of the datafiles to the directory location you specify. DBUA will also create a batch file in that directory to automate the restoration of those files to their earlier locations. The next step is to choose whether to enable Oracle Enterprise Manager (OEM) to manage the database. If you enable the Oracle Management Agent, the upgraded database will automatically be available via OEM. You will then be asked to finalize the security configuration for the upgraded database. As with the database-creation process, you can specify passwords for each privileged account or you can set a single password to apply to all the OEM user accounts. Finally, you will be prompted for details on the flash recovery area location (see Chapter 14), the archive log setting, and the network configuration. A final summary screen displays your choices for the upgrade, and the upgrade starts when you accept them. After the upgrade has completed, DBUA will display the Checking Upgrade Results screen, showing the steps performed, the related log files, and the status. The section of the screen titled Password Management allows you to manage the passwords and the locked/unlocked status of accounts in the upgraded database. If you are not satisfied with the upgrade results, you can choose the Restore option. If you used DBUA to perform the backup, the restoration will be performed automatically; otherwise, you will need to perform the restoration manually. When you exit DBUA after successfully upgrading the database, DBUA removes the old database’s entry in the network listener configuration file, inserts an entry for the upgraded database, and reloads the file. Performing a Manual Direct Upgrade In a manual upgrade, you must perform the steps that DBUA performs. The result will be a direct upgrade of the database in which you are responsible for (and control) each step in the upgrade process. You should use the Pre-Upgrade Information Tool to analyze the database prior to its upgrade. As I mentioned earlier in this chapter, this tool is provided in a SQL script that is installed with the Oracle Database 11g software; you will need to run it against the database to be upgraded. The file, named utlu111i.sql, is located in the $ORACLE_HOME/rdbms/admin subdirectory under the Oracle 11g software home directory. You should run that file in the database to be upgraded as a SYSDBA-privileged user, spooling the results to a log file. The results will show potential problems that should be addressed prior to the upgrade.
- Chapter 2: Upgrading to Oracle Database 11g 55 If there are no issues to resolve prior to the upgrade, you should shut down the database andperform an offline backup before continuing with the upgrade process. This ensures that if youhave any serious problems with the database upgrade, you can always get back to the state ofyour old database as of when you started the upgrade process. Once you have a backup you can restore if needed, you are ready to proceed with the upgradeprocess. The process is detailed and script-based, so you should consult with the Oracle installationand upgrade documentation for your environment and version. The steps are as follows: 1. Copy configuration files (init.ora, spfile.ora, password file) from their old location to the new Oracle software home directory. By default, the configuration files are found in the /dbs subdirectory on Unix platforms and the database directory on Windows platforms. 2. Remove obsolete and deprecated initialization parameter from the configuration files identified in the Pre-Upgrade Information Tool. Update any initialization parameters to at least the minimum values specified in the Pre-Upgrade Information Tool report. Use full pathnames in the parameter files. 3. If you are upgrading a cluster database, set the CLUSTER_DATABASE initialization parameter to FALSE. After the upgrade, you must set this initialization parameter back to TRUE. 4. Shut down the instance. 5. If you are using Windows, stop the service associated with the instance and delete the Oracle service at the command prompt. For Oracle 8.0, use the command NET STOP OracleServiceName ORADIM –DELETE –SID instance_name Next, create the new Oracle Database 11g service using the ORADIM command, as shown here. The variables for this command are shown in the following table. C:> ORADIM -NEW -SID SID -INTPWD PASSWORD -MAXUSERS USERS -STARTMODE AUTO -PFILE ORACLE_HOMEDATABASEINITSID.ORA Variable Description SID The name of the SID (instance identifier) of the database you are upgrading. PASSWORD The password for the new release 11.1 database instance. This is the password for the user connected with SYSDBA privileges. If you do not specify INTPWD, operating system authentication is used and no password is required. USERS The maximum number of users who can be granted SYSDBA and SYSOPER privileges. ORACLE_HOME The release 11.1 Oracle home directory. Ensure that you specify the full pathname with the -PFILE option, including the drive letter of the Oracle home directory. 6. If your operating system is Unix or Linux, make sure the environment variables ORACLE_ HOME and PATH point to the new release 11.1 directories, ORACLE_SID is set to the existing database’s SID, and the file /etc/oratab points to the new Oracle Database 11g home directory. In addition, any server or client-side scripts that set ORACLE_HOME must be changed to point to the new Oracle software home directory.
- 56 Oracle Database 11g DBA Handbook 7. Log into the system as the owner of the Oracle Database 11g software. 8. Change your directory to the $ORACLE_HOME/rdbms/admin subdirectory under the Oracle software home directory. 9. Connect to SQL*Plus as a user with SYSDBA privileges. 10. Issue the startup upgrade command. 11. Use the spool command to log the results of the following steps. 12. Create a SYSAUX tablespace via the create tablespace command if you are upgrading from a release prior to 10.1. You should allocate SYSAUX between 500MB and 5GB of disk space, depending on the number of user objects. SYSAUX must be created with the following clauses: online, permanent, read write, extent management local, and segment space management auto. All those clauses except segment space management auto are the defaults. See the output from the Pre-Upgrade Information Tool for suggested sizing of the SYSAUX tablespace. Here’s an example: create tablespace SYSAUX datafile /u01/oradata/db1/sysaux01.dbf size 500m reuse extent management local segment space management auto online; 13. Run the script catupgrd.sql in the 11g environment. This script automatically determines which upgrade scripts must be run, runs them, and then shuts down the database. 14. Stop spooling (via spool off) and review the spool file for errors. Resolve any problems identified there. Restart the database at the SQL*Plus prompt using the startup command. 15. Run the utlu111s.sql file to upgrade Oracle components such as Oracle Text, Oracle Ultra Search, Oracle Application Express, and the Oracle Server itself. You run it as follows: @utlu101s.sql 16. Oracle will then display the upgrade status of each component. The upgrade elements should all be listed with a status of “VALID.” 17. Run the catuppst.sql script, located in $ORACLE_HOME/rdbms/admin to perform upgrade steps that do not require the database to be in UPGRADE mode: @rdbms/admin/catuppst.sql 18. Run the utlrp.sql script to recompile invalid packages: @utlrp.sql 19. You can then verify that all packages and classes are valid by using the following SQL: select count(*) from dba_invalid_objects; select distinct object_name from dba_invalid_objects; 20. Exit SQL*Plus. 21. Shut down the database and perform an offline backup of the database; then restart the database. The upgrade is complete.
- Chapter 2: Upgrading to Oracle Database 11g 57 NOTE After the upgrade, you should never start your Oracle 11g database with the software from an earlier release.Using Export and ImportExport and Import provide you with an indirect method for the upgrade. You can create an Oracle11g database alongside your existing database and use Export and Import to move data from theold database to the new database. When the movement of the data is complete, you will need topoint your applications to connect to the new database instead of the old database. You will alsoneed to update any configuration files, version-specific scripts, and the networking configurationfiles (tnsnames.ora and listener.ora) to point to the new database. The advantage to using an Export/Import method is that the existing database is unaffectedthroughout the upgrade process; however, to ensure that relational integrity remains intact andno new transactions are left behind in the old database, you can run the old database in restrictedmode for the duration of the export and upgrade.Export and Import Versions to UseWhen you create an Export dump file via the Export utility, that file can be imported into all laterreleases of Oracle. When you create a Data Pump Export dump file, you can only import it intothe same or later versions of Data Pump Export. Export dump files are not backward compatible,so if you ever need to revert to an earlier version of Oracle, you will need to carefully select theversion of Export and Import used. The following table shows the versions of the Export/Importand Data Pump Export/Import executables you should use when going between versions of Oracle:Export From Import To Use Export Utility Use Import UtilityRelease 10.2 Release 11.1 Data Pump Export 10.2 Data Pump Import 11.1Release 10.1 Release 11.1 Data Pump Export 10.1 Data Pump Import 11.1Release 9.2 Release 11.1 Original Export 9.2 Original Import 11.1Release 8.1.7 Release 11.1 Original Export 8.1.7 Original Import 11.1Release 8.0.6 Release 11.1 Original Export 8.0.6 Original Import 11.1Release 7.3.4 Release 11.1 Original Export 7.3.4 Original Import 11.1 Note that when you are exporting in order to downgrade your database release, you should usethe older version of the Export utility to minimize compatibility problems. You may still encountercompatibility problems if the newer version of the database uses new features (such as newdatatypes) that the old version will not support.Performing the UpgradeExport the data from the source database using the version of the Export utility specified inthe prior section. Perform a consistent export or perform the export when the database is notavailable for updates during and after the export.
- 58 Oracle Database 11g DBA Handbook NOTE If you have little free space available, you may back up and delete the existing database at this point and then install Oracle Database 11g software and create a target database for the import. If at all possible, maintain the source and target databases concurrently during the upgrade. The only benefit of having only one database on the server at a time is that they can share the same database name. Install the Oracle Database 11g software and create the target database. In the target database, pre-create the users and tablespaces needed to store the source data. If the source and target databases will coexist on the server, you need to be careful not to overwrite datafiles from one database with datafiles from the other. The Import utility will attempt to execute the create tablespace commands found in the Export dump file, and those commands will include the datafile names from the source database. By default, those commands will fail if the files already exist (although this can be overridden via Import’s DESTROY parameter). Pre-create the tablespaces with the proper datafile names to avoid this problem. NOTE You can export specific tablespaces, users, tables, and rows. Once the database has been prepared, use Import or Data Pump Import to load the data from the Export dump file into the target database. Review the log file for information about objects that did not import successfully. See Chapter 11 for detailed instructions on how to use Data Pump Export and Import. Using the Data-Copying Method The data-copying method requires that the source database and target database coexist. This method is most appropriate when the tables to be migrated are fairly small and few in number. As with the Export/Import method, you must guard against transactions occurring in the source database during and after the extraction of the data. In this method, the data is extracted via queries across database links. Create the target database using the Oracle Database 11g software and then pre-create the tablespaces, users, and tables to be populated with data from the source database. Create database links (see Chapter 16) in the target database that access accounts in the source database. Use the insert as select command to move data from the source database to the target. The data-copying method allows you to bring over just the rows and columns you need; your queries limit the data migrated. You will need to be careful with the relationships between the tables in the source database so that you can re-create them properly in the target database. If you have a long application outage available for performing the upgrade and you need to modify the data structures during the migration, the data-copying method may be appropriate for your needs. Note that this method requires that the data be stored in multiple places at once, thus impacting your storage needs. To improve the performance of this method, you may consider the following options: ■ Disable all indexes and constraints until all the data has been loaded. ■ Run multiple data-copying jobs in parallel.
- Chapter 2: Upgrading to Oracle Database 11g 59 ■ Use the parallel query option to enhance the performance of individual queries and inserts. ■ Use the APPEND hint to enhance the performance of inserts. As of Oracle 10g, you can use cross-platform transportable tablespaces. When transportingtablespaces, you export and import only the metadata for the tablespace, while the datafiles arephysically moved to the new platform. For very large databases, the time required to move thedatafiles may be significantly shorter than the time required to reinsert the rows. See Chapter 17for details on the use of transportable tablespaces; see Chapter 8 for additional advice onperformance tuning.After UpgradingFollowing the upgrade, you should double-check the configuration and parameter files related tothe database, particularly if the instance name changed in the migration process. These files include ■ The tnsnames.ora file ■ The listener.ora file ■ Programs that may have hard-coded instance names in them NOTE You will need to manually reload the modified listener.ora file if you are not using DBUA to perform the upgrade. You should review your database initialization parameters to make sure deprecated andobsolete parameters have been removed; these should have been identified during the migrationprocess when you ran the Pre-Upgrade Information Tool utlu111i.sql. Be sure to recompile anyprograms you have written that rely on the database software libraries. Once the upgrade has completed, perform the functional and performance tests identifiedbefore the upgrade began. If there are issues with the database functionality, attempt to identifyany parameter settings or missing objects that may be impacting the test results. If the problemcannot be resolved, you may need to revert to the prior release. If you performed a full backupbefore starting the upgrade, you should be able to easily revert to the old release with minimaldowntime.
- This page intentionally left blank
- CHAPTER 3Planning and Managing Tablespaces 61
- 62 Oracle Database 11g DBA Handbook ow a DBA configures the layout of the tablespaces in a database directly affects the H performance and manageability of the database. In this chapter, we’ll review the different types of tablespaces as well as how temporary tablespace usage can drive the size and number of tablespaces in a database leveraging the temporary tablespace group feature introduced in Oracle 10g. We’ll also show how Oracle’s Optimal Flexible Architecture (OFA), supported since Oracle 7, helps to standardize the directory structure for both Oracle executables and the database files themselves; Oracle Database 11g further enhances OFA to complement its original role of improving performance to enhancing security and simplifying cloning and upgrade tasks. A default installation of Oracle provides the DBA with a good starting point, not only creating an OFA-compliant directory structure but also segregating segments into a number of tablespaces based on their function. We’ll review the space requirements for each of these tablespaces and provide some tips on how to fine-tune the characteristics of these tablespaces. At the end of the chapter, we’ll provide some guidelines to help place segments into different tablespaces based on their type, size, and frequency of access, as well as ways to identify hotspots in one or more tablespaces. Tablespace Architecture A prerequisite to competently setting up the tablespaces in your database is understanding the different types of tablespaces and how they are used in an Oracle database. In this section, we’ll review the different types of tablespaces and give some examples of how they are managed. In addition, we’ll provide an overview of Oracle’s Optimal Flexible Architecture and how it provides a framework for storing tablespace datafiles as well as Oracle executables and other Oracle components, such as redo log files, control files, and so forth. We’ll also review the types of tablespaces by category—SYSTEM tablespaces, the SYSAUX tablespace, temporary tablespaces, undo tablespaces, and bigfile tablespaces—and describe their function. Tablespace Types The primary types of tablespaces in an Oracle database are permanent, undo, and temporary. Permanent tablespaces contain segments that persist beyond the duration of a session or a transaction. Although the undo tablespace may have segments that are retained beyond the end of a session or a transaction, it provides read consistency for select statements that access tables being modified as well as provides undo data for a number of the flashback features of the database. Primarily, however, undo segments store the previous values of columns being updated or deleted, or to provide an indication that the row did not exist for an insert so that if a user’s session fails before the user issues a commit or a rollback, the updates, inserts, and deletes will be removed. Undo segments are never directly accessible by a user session, and undo tablespaces may only have undo segments. As the name implies, temporary tablespaces contain transient data that exists only for the duration of the session, such as space to complete a sort operation that will not fit in memory. Bigfile tablespaces can be used for any of these three types of tablespaces, and they simplify tablespace management by moving the maintenance point from the datafile to the tablespace. Bigfile tablespaces consist of one and only one datafile. There are a couple of downsides to bigfile tablespaces, however, and I will present these later in this chapter. Permanent The SYSTEM and SYSAUX tablespaces are two examples of permanent tablespaces. In addition, any segments that need to be retained by a user or an application beyond the boundaries of a session or transaction should be stored in a permanent tablespace.
- Chapter 3: Planning and Managing Tablespaces 63SYSTEM Tablespace User segments should never reside in the SYSTEM tablespace, period. As ofOracle 10g, you can specify a default permanent tablespace in addition to the ability to specify adefault temporary tablespace in Oracle9i. If you use the Oracle Universal Installer (OUI) to create a database for you, a separatetablespace other than SYSTEM is created for both permanent and temporary segments. If youcreate a database manually, be sure to specify both a default permanent tablespace and a defaulttemporary tablespace, as in the sample create database command that follows.CREATE DATABASE rjbdb USER SYS IDENTIFIED BY kshelt25 USER SYSTEM IDENTIFIED BY mgrab45 LOGFILE GROUP 1 (/u02/oracle11g/oradata/rjbdb/redo01.log) SIZE 100M, GROUP 2 (/u04/oracle11g/oradata/rjbdb/redo02.log) SIZE 100M, GROUP 3 (/u06/oracle11g/oradata/rjbdb/redo03.log) SIZE 100M MAXLOGFILES 5 MAXLOGMEMBERS 5 MAXLOGHISTORY 1 MAXDATAFILES 100 MAXINSTANCES 1 CHARACTER SET US7ASCII NATIONAL CHARACTER SET AL16UTF16 DATAFILE /u01/oracle11g/oradata/rjbdb/system01.dbf SIZE 325M REUSE EXTENT MANAGEMENT LOCAL SYSAUX DATAFILE /u01/oracle11g/oradata/rjbdb/sysaux01.dbf SIZE 325M REUSE DEFAULT TABLESPACE USERS DATAFILE /u03/oracle11g/oradata/rjbdb/users01.dbf SIZE 50M REUSE DEFAULT TEMPORARY TABLESPACE tempts1 TEMPFILE /u01/oracle11g/oradata/rjbdb/temp01.dbf SIZE 20M REUSE UNDO TABLESPACE undotbs DATAFILE /u02/oracle11g/oradata/rjbdb/undotbs01.dbf SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED; As of Oracle 10g, the SYSTEM tablespace is locally managed by default; in other words,all space usage is managed by a bitmap segment in the first part of the first datafile for thetablespace. In a database where the SYSTEM tablespace is locally managed, the other tablespacesin the database must also be locally managed or they must be read-only. Using locally managedtablespaces takes some of the contention off the SYSTEM tablespace because space allocation anddeallocation operations for a tablespace do not need to use data dictionary tables. More detailson locally managed tablespaces can be found in Chapter 6.SYSAUX Tablespace Like the SYSTEM tablespace, the SYSAUX tablespace should not have anyuser segments. The contents of the SYSAUX tablespace, broken down by application, can bereviewed using EM Database Control. You can edit the SYSAUX tablespace by clicking theTablespaces link under the Server tab and clicking the SYSAUX link. Figure 3-1 shows a graphicalrepresentation of the space usage within SYSAUX.
- 64 Oracle Database 11g DBA Handbook FIGURE 3-1 EM Database Control SYSAUX tablespace contents If the space usage for a particular application that resides in the SYSAUX tablespace becomes too high or creates an I/O bottleneck through high contention with other applications that use the SYSAUX tablespace, you can move one or more of these applications to a different tablespace. Below the pie chart in Figure 3-1, we can click the Change Tablespace link of a SYSAUX occupant and move it to another tablespace, as shown in Figure 3-2. An example of moving a SYSAUX occupant to a different tablespace using the command line interface can be found in Chapter 6. FIGURE 3-2 Using EM Database Control to move a SYSAUX occupant
- Chapter 3: Planning and Managing Tablespaces 65 The SYSAUX tablespace can be monitored just like any other tablespace; later in this chapter,we’ll show how EM Database Control can help us to identify hotspots in a tablespace.UndoMultiple undo tablespaces can exist in a database, but only one undo tablespace can be activeat any given time. Undo tablespaces are used for rolling back transactions, for providing readconsistency for select statements that run concurrently with DML statements on the same table orset of tables, and for supporting a number of Oracle Flashback features, such as Flashback Query. The undo tablespace needs to be sized correctly to prevent “Snapshot too old” errors and toprovide enough space to support initialization parameters such as UNDO_RETENTION. Moreinformation on how to monitor, size, and create undo tablespaces can be found in Chapter 7.TemporaryMore than one temporary tablespace can be online and active in the database, but until Oracle10g, multiple sessions by the same user would use the same temporary tablespace because onlyone default temporary tablespace could be assigned to a user. To solve this potential performancebottleneck, Oracle supports temporary tablespace groups. A temporary tablespace group is asynonym for a list of temporary tablespaces. A temporary tablespace group must consist of at least one temporary tablespace; it cannot beempty. Once a temporary tablespace group has no members, it no longer exists. One of the big advantages of using temporary tablespace groups is to provide a single userwith multiple sessions with the ability to use a different actual temporary tablespace for eachsession. In the diagram shown in Figure 3-3, the user OE has two active sessions that needtemporary space for performing sort operations. Instead of a single temporary tablespace being assigned to a user, the temporary tablespacegroup is assigned; in this example, the temporary tablespace group TEMPGRP has been assignedto OE. However, because there are three actual temporary tablespaces within the TEMPGRPtemporary tablespace group, the first OE session may use temporary tablespace TEMP1, and theselect statement executed by the second OE session may use the other two temporary tablespaces,TEMP2 and TEMP3, in parallel. Before Oracle 10g, both sessions would use the same temporarytablespace, potentially causing a performance issue.FIGURE 3-3 Temporary tablespace group TEMPGRP
- 66 Oracle Database 11g DBA Handbook Creating a temporary tablespace group is very straightforward. After creating the individual tablespaces TEMP1, TEMP2, and TEMP3, we can create a temporary tablespace group named TEMPGRP as follows: SQL> alter tablespace temp1 tablespace group tempgrp; Tablespace altered. SQL> alter tablespace temp2 tablespace group tempgrp; Tablespace altered. SQL> alter tablespace temp3 tablespace group tempgrp; Tablespace altered. Changing the database’s default temporary tablespace to TEMPGRP uses the same command as assigning an actual temporary tablespace as the default; temporary tablespace groups are treated logically the same as a temporary tablespace: SQL> alter database default temporary tablespace tempgrp; Database altered. To drop a tablespace group, we must first drop all its members. Dropping a member of a tablespace group is accomplished by assigning the temporary tablespace to a group with an empty string (in other words, removing the tablespace from the group): SQL> alter tablespace temp3 tablespace group ; Tablespace altered. As you might expect, assigning a temporary tablespace group to a user is identical to assigning a temporary tablespace to a user; this assignment can happen either when the user is created or at some point in the future. In the following example, the new user JENWEB is assigned the temporary tablespace TEMPGRP: SQL> create user jenweb identified by pi4001 2 default tablespace users 3 temporary tablespace tempgrp; User created. Note that if we did not assign the tablespace during user creation, the user JENWEB would still be assigned TEMPGRP as the temporary tablespace because it is the database default from our previous create database example. A couple of changes have been made to the data dictionary views in Oracle Database 10g and Oracle Database 11g to support temporary tablespace groups. The data dictionary view DBA_USERS still has the column TEMPORARY_TABLESPACE, as in previous versions of Oracle, but this column may now contain either the name of the temporary tablespace assigned to the user, or the name of a temporary tablespace group. SQL> select username, default_tablespace, temporary_tablespace 2 from dba_users where username = JENWEB; USERNAME DEFAULT_TABLESPACE TEMPORARY_TABLESPACE -------------------- ------------------ -------------------- JENWEB USERS TEMPGRP 1 row selected.
- Chapter 3: Planning and Managing Tablespaces 67 The new data dictionary view DBA_TABLESPACE_GROUPS shows the members of eachtemporary tablespace group:SQL> select group_name, tablespace_name from dba_tablespace_groups;GROUP_NAME TABLESPACE_NAME---------------------------- ----------------------------TEMPGRP TEMP1TEMPGRP TEMP2TEMPGRP TEMP33 rows selected. As with most every other feature of Oracle that can be accomplished with the commandline, assigning members to temporary tablespace groups or removing members from temporarytablespace groups can be performed using EM Database Control. In Figure 3-4, we can add orremove members from a temporary tablespace group.BigfileA bigfile tablespace eases database administration because it consists of only one datafile. The singledatafile can be up to 128TB (terabytes) in size if the tablespace block size is 32KB. Many of thecommands previously available only for maintaining datafiles can now be used at the tablespacelevel if the tablespace is a bigfile tablespace. Chapter 6 reviews how bigfile tablespaces are createdand maintained.FIGURE 3-4 Using EM Database Control to edit temporary tablespace groups
- 68 Oracle Database 11g DBA Handbook The maintenance convenience of bigfile tablepsaces can be offset by some potential disadvantages. Because a bigfile tablespace is a single datafile, a full backup of a single large datafile will take significantly longer than a full backup of several smaller datafiles (with the same total size as the single bigfile tablespace) because Oracle only uses one slave process per datafile and therefore cannot back up different parts of a bigfile tablespace using parallel processes. If your bigfile tablespaces are read-only or only changed blocks are backed up on a regular basis, the backup issue may not be critical in your environment. Optimal Flexible Architecture Oracle’s Optimal Flexible Architecture (OFA) provides guidelines to ease the maintenance of the Oracle software and database files as well as improve the performance of the database by placing the database files such that I/O bottlenecks are minimized. Although using OFA is not strictly enforced when you’re installing or maintaining an Oracle environment, using OFA makes it easy for someone to understand how your database is organized on disk, preventing that phone call in the middle of the night during the week you’re on vacation! OFA is slightly different depending on the type of storage options you use—either an Automatic Storage Management (ASM) environment or a standard operating system file system that may or may not be using a third-party logical volume manager or RAID-enabled disk subsystem. Non-ASM Environment In a non-ASM environment on a Unix server, at least three file systems on separate physical devices are required to implement OFA recommendations. Starting at the top, the recommended format for a mount point is /<string const><numeric key>, where <string const> can be one or several letters and <numeric key> is either two or three digits. For example, on one system we may have mount points /u01, /u02, /u03, and /u04, with room to expand to an additional 96 mount points without changing the file-naming convention. Figure 3-5 shows a typical Unix file system layout with an OFA-compliant Oracle directory structure. There are two instances on this server: an ASM instance to manage disk groups and a standard RDBMS instance (dw). Software Executables The software executables for each distinct product name reside in the directory /<string const><numeric key>/<directory type>/<product owner>, where <string const> and <numeric key> are defined previously, <directory type> implies the type of files installed in this directory, and <product owner> is the name of the user that owns and installs the files in this directory. For example, /u01/app/oracle would contain application-related files (executables) installed by the user oracle on the server. The directory /u01/app/apache would contain the executables for the middleware web server installed from a previous version of Oracle. As of Oracle 10g, the OFA standard makes it easy for the DBA to install multiple versions of the database and client software within the same high-level directory. The OFA-compliant Oracle home path, corresponding to the environment variable ORACLE_HOME, contains a suffix that corresponds to the type and incarnation of the installation. For example, one installation of Oracle 11g, two different installations of Oracle 10g, and one installation of Oracle9i may reside in the following three directories: /u01/app/oracle/product/9.2.0.1 /u01/app/oracle/product/10.1.0/db_1 /u01/app/oracle/product/10.1.0/db_2 /u01/app/oracle/product/11.1.0/db_1
- Chapter 3: Planning and Managing Tablespaces 69FIGURE 3-5 OFA-compliant Unix directory structure At the same time, the Oracle client executables and configuration may be stored in the sameparent directory as the database executables:/u01/app/oracle/product/10.1.0/client_1 Some installation directories will never have more than one instance for a given product; forexample, Oracle Cluster Ready Services (CRS) will be installed in the following directory giventhe previous installations:/u01/app/oracle/product/11.1.0/crs Because CRS can only be installed once on a system, it does not have an incrementingnumeric suffix.Database Files Any non-ASM Oracle datafiles reside in /<mount point>/oradata/<databasename>, where <mount point> is one of the mount points we discussed earlier, and <databasename> is the value of the initialization parameter DB_NAME. For example, /u02/oradata/rac0 and/u03/oradata/rac0 would contain the non-ASM control files, redo log files, and datafiles for theinstance rac0, whereas /u05/oradata/dev1 would contain the same files for the dev1 instance onthe same server. The naming convention for the different file types under the oradata directory aredetailed in Table 3-1.
- 70 Oracle Database 11g DBA Handbook File Type Filename Format Variables Control files control.ctl None. Redo log files redo<n>.log n is a two-digit number. Datafiles <tn>.dbf t is an Oracle tablespace name, and n is a two-digit number. TABLE 3-1 OFA-Compliant Control File, Redo Log File, and Datafile Naming Conventions Although Oracle tablespace names can be as long as 30 characters, it is advisable to keep the tablespace names eight characters or less in a Unix environment. Because portable Unix filenames are restricted to 14 characters, and the suffix of an OFA datafile name is <n>.dbf, where n is two digits, a total of six characters are needed for the suffix in the file system. This leaves eight characters for the tablespace name itself. Only control files, redo log files, and datafiles associated with the database <database name> should be stored in the directory /<mount point>/oradata/<database name>. For the database ord managed without ASM, the datafile names are as follows: SQL> select file#, name from v$datafile; FILE# NAME ---------- ----------------------------------- 1 /u05/oradata/ord/system01.dbf 2 /u05/oradata/ord/undotbs01.dbf 3 /u05/oradata/ord/sysaux01.dbf 4 /u05/oradata/ord/users01.dbf 5 /u09/oradata/ord/example01.dbf 6 /u09/oradata/ord/oe_trans01.dbf 7 /u05/oradata/ord/users02.dbf 8 /u06/oradata/ord/logmnr_rep01.dbf 9 /u09/oradata/ord/big_users.dbf 10 /u08/oradata/ord/idx01.dbf 11 /u08/oradata/ord/idx02.dbf 12 /u08/oradata/ord/idx03.dbf 13 /u08/oradata/ord/idx04.dbf 14 /u08/oradata/ord/idx05.dbf 15 /u08/oradata/ord/idx06.dbf 16 /u08/oradata/ord/idx07.dbf 17 /u08/oradata/ord/idx08.dbf 17 rows selected. Other than file numbers 8 and 9, all the datafiles in the ord database are OFA compliant and are spread out over four different mount points. The tablespace name in file number 8 is too long, and file number 9 does not have a numeric two-digit counter to represent new datafiles for the same tablespace.
- Chapter 3: Planning and Managing Tablespaces 71ASM EnvironmentIn an ASM environment, the executables are stored in the directory structure presented previously;however, if you browsed the directory /u02/oradata in Figure 3-5, you would see no files. All thecontrol files, redo log files, and datafiles for the instance dw are managed by the ASM instance+ASM on this server. The actual datafile names are not needed for most administrative functions because ASM files areall Oracle Managed Files (OMF). This eases the overall administrative effort required for the database.Within the ASM storage structure, an OFA-like syntax is used to subdivide the file types even further:SQL> select file#, name from v$datafile; FILE# NAME---------- ---------------------------------------- 1 +DATA/dw/datafile/system.256.622426913 2 +DATA/dw/datafile/sysaux.257.622426915 3 +DATA/dw/datafile/undotbs1.258.622426919 4 +DATA/dw/datafile/users.259.622426921 5 +DATA/dw/datafile/example.265.6224271815 rows selected.SQL> select name from v$controlfile;NAME----------------------------------------+DATA/dw/controlfile/current.260.622427059+RECOV/dw/controlfile/current.256.6224271232 rows selected.SQL> select member from v$logfile;MEMBER----------------------------------------+DATA/dw/onlinelog/group_3.263.622427143+RECOV/dw/onlinelog/group_3.259.622427145+DATA/dw/onlinelog/group_2.262.622427135+RECOV/dw/onlinelog/group_2.258.622427137+DATA/dw/onlinelog/group_1.261.622427127+RECOV/dw/onlinelog/group_1.257.6224271316 rows selected. Within the disk groups +DATA and +RECOV, we see that each of the database file types, suchas datafiles, control files, and online log files, has its own directory. Fully qualified ASM filenameshave the format+<group>/<dbname>/<file type>/<tag>.<file>.<incarnation>where <group> is the disk group name, <dbname> is the database to which the file belongs,<file type> is the Oracle file type, <tag> is information specific to the file type, and the pair<file>.<incarnation> ensures uniqueness within the disk group. Automatic Storage Management is covered in Chapter 6.
- 72 Oracle Database 11g DBA Handbook Oracle Installation Tablespaces Table 3-2 lists the tablespaces created with a standard Oracle installation using the Oracle Universal Installer (OUI); the EXAMPLE tablespace is optional; it is installed if you specify that you want the sample schemas created during the installation dialogue. SYSTEM As mentioned previously in this chapter, no user segments should ever be stored in the SYSTEM tablespace. The new clause default tablespace in the create database command helps to prevent this occurrence by automatically assigning a permanent tablespace for all users that have not explicitly been assigned a permanent tablespace. An Oracle installation performed using the Oracle Universal Installer will automatically assign the USERS tablespace as the default permanent tablespace. The SYSTEM tablespace will grow more quickly the more you use procedural objects such as functions, procedures, triggers, and so forth, because these objects must reside in the data dictionary. This also applies to abstract datatypes and Oracle’s other object-oriented features. SYSAUX As with the SYSTEM tablespace, user segments should never be stored in the SYSAUX tablespace. If one particular occupant of the SYSAUX tablespace takes up too much of the available space or significantly affects the performance of other applications that use the SYSAUX tablespace, you should consider moving the occupant to another tablespace. TEMP Instead of one very large temporary tablespace, consider using several smaller temporary tablespaces and creating a temporary tablespace group to hold them. As you found out earlier in this chapter, this can improve the response time for applications that create many sessions with the same username. Tablespace Type Segment Space Management Approx. Initial Allocated Size (MB) SYSTEM Permanent Manual 680 SYSAUX Permanent Auto 585 TEMP Temporary Manual 20 UNDOTBS1 Permanent Manual 115 USERS Permanent Auto 16 EXAMPLE Permanent Auto 100 TABLE 3-2 Standard Oracle Installation Tablespaces
- Chapter 3: Planning and Managing Tablespaces 73UNDOTBS1Even though a database may have more than one undo tablespace, only one undo tablespace canbe active at any given time. If more space is needed for an undo tablespace, and AUTOEXTEND isnot enabled, another datafile can be added. One undo tablespace must be available for each nodein a Real Application Clusters (RAC) environment because each instance manages its own undo.USERSThe USERS tablespace is intended for miscellaneous segments created by each database user, andit’s not appropriate for any production applications. A separate tablespace should be created foreach application and segment type; later in this chapter we’ll present some additional criteria youcan use to decide when to segregate segments into their own tablespace.EXAMPLEIn a production environment, the EXAMPLE tablespace should be dropped; it takes up 100MB ofdisk space and has examples of all types of Oracle segments and data structures. A separate databaseshould be created for training purposes with these sample schemas; for an existing training database,the sample schemas can be installed into the tablespace of your choice by using the scripts in$ORACLE_HOME/demo/schema.Segment SegregationAs a general rule of thumb, you want to divide segments into different tablespaces based on theirtype, size, and frequency of access. Furthermore, each of these tablespaces would benefit frombeing on its own disk group or disk device; in practice, however, most shops will not have theluxury of storing each tablespace on its own device. The following bulleted points identify some ofthe conditions you might use to determine how segments should be segregated among tablespaces.They are not prioritized here because the priority depends on your particular environment. UsingAutomatic Storage Management (ASM) eliminates many of the contention issues listed with noadditional effort by the DBA. ASM is discussed in detail in Chapter 4. ■ Big segments and small segments should be in separate tablespaces. ■ Table segments and their corresponding index segments should be in separate tablespaces. ■ A separate tablespace should be used for each application. ■ Segments with low usage and segments with high usage should be in different tablespaces. ■ Static segments should be separated from high DML segments. ■ Read-only tables should be in their own tablespace. ■ Staging tables for a data warehouse should be in their own tablespace.
- 74 Oracle Database 11g DBA Handbook ■ Tablespaces should be created with the appropriate block size, depending on whether segments are accessed row by row or in full table scans. ■ Materialized views should be in a separate tablespace from the base table. ■ For partitioned tables and indexes, each partition should be in its own tablespace. Using EM Database Control, you can identify overall contention on any tablespace by identifying hotspots, either at the file level or at the object level. We’ll cover performance tuning, including resolving I/O contention issues, in Chapter 8.
- CHAPTER 4Physical Database Layouts and Storage Management 75
- 76 Oracle Database 11g DBA Handbook n Chapter 3, we talked about the logical components of the database, tablespaces, I and how to not only create the right number and types of tablespaces but also to place table and index segments in the appropriate tablespace, based on their usage patterns and function. In this chapter, I’ll focus more on the physical aspects of a database, the datafiles, and where to store them to maximize I/O throughput and overall database performance. The assumption throughout this chapter is that you are using locally managed tablespaces with automatic segment space management. In addition to reducing the load on the SYSTEM tablespace by using bitmaps stored in the tablespace itself instead of freelists stored in the table or index header blocks, automatic segment space management (autoallocated or uniform) makes more efficient use of the space in the tablespace. As of Oracle 10g, the SYSTEM tablespace is created as locally managed. As a result, this requires all read-write tablespaces to also be locally managed. In the first part of this chapter, I’ll review some of the common problems and solutions when using traditional disk space management using a file system on a database server. In the second half of the chapter, I’ll present an overview of Automatic Storage Management (ASM), a built-in logical volume manager that eases administration, enhances performance, and improves availability. Traditional Disk Space Storage In lieu of using a third-party logical volume or Oracle’s Automatic Storage Management (discussed later in this chapter), you must be able to manage the physical datafiles in your database to ensure a high level of performance, availability, and recoverability. In general, this means spreading out your datafiles to different physical disks. In addition to ensuring availability by keeping mirrored copies of redo log files and control files on different disks, I/O performance is improved when users access tables that reside in tablespaces on multiple physical disks instead of one physical disk. Identifying an I/O bottleneck or a storage deficiency on a particular disk volume is only half the battle; once the bottleneck is identified, you need to have the tools and knowledge to move datafiles to different disks. If a datafile has too much space or not enough space, resizing an existing datafile is a common task. In this section, I’ll discuss a number of different ways to resize tablespaces, whether they are smallfile or bigfile tablespaces. In addition, I’ll cover the most common ways to move datafiles, online redo log files, and control files to different disks. Resizing Tablespaces and Datafiles In an ideal database, all tablespaces and the objects within them are created at their optimal sizes. Resizing a tablespace proactively or setting up a tablespace to automatically extend can potentially avoid a performance hit when the tablespace expands or an application failure occurs if the datafile(s) within the tablespace cannot extend. More details on how to monitor space usage can be found in Chapter 6. The procedures and methods available for resizing a tablespace are slightly different, depending on whether the tablespace is a smallfile or a bigfile tablespace. A smallfile tablespace, the only type of tablespace available before Oracle 10g, can consist of multiple datafiles. A bigfile tablespace, in contrast, can only consist of one datafile, but the datafile can be much larger than a datafile in
- Chapter 4: Physical Database Layouts and Storage Management 77a smallfile tablespace: A bigfile tablespace with 64K blocks can have a datafile as large as 128TB.In addition, bigfile tablespaces must be locally managed.Resizing a Smallfile Tablespace Using ALTER DATABASEIn the following examples, we attempt to resize the USERS tablespace, which contains onedatafile, starting out at 5MB. First, we make it 15MB, then realize it’s too big, and shrink it downto 10MB. Then, we attempt to shrink it too much. Finally, we try to increase its size too much.SQL> alter database 2 datafile /u01/app/oracle/oradata/rmanrep/users01.dbf resize 15m; Database altered.SQL> alter database 2 datafile /u01/app/oracle/oradata/rmanrep/users01.dbf resize 10m; Database altered.SQL> alter database 2 datafile /u01/app/oracle/oradata/rmanrep/users01.dbf resize 1m;alter database*ERROR at line 1:ORA-03297: file contains used data beyond requested RESIZE valueSQL> alter database 2 datafile /u01/app/oracle/oradata/rmanrep/users01.dbf resize 100t;alter database*ERROR at line 1:ORA-00740: datafile size of (13421772800) blocks exceeds maximum file sizeSQL> alter database 2 datafile /u01/app/oracle/oradata/rmanrep/users01.dbf resize 50g;alter database*ERROR at line 1:ORA-01144: File size (6553600 blocks) exceeds maximum of 4194303 blocks If the resize request cannot be supported by the free space available, or there is data beyondthe requested decreased size, or an Oracle file size limit is exceeded, Oracle returns an error. To avoid manual resizing of tablespaces reactively, we can instead be proactive and use theautoextend, next, and maxsize clauses when modifying or creating a datafile. Table 4-1 lists thespace-related clauses for modifying or creating datafiles in the alter datafile and alter tablespacecommands. In the following example, we set autoextend to ON for the datafile /u01/app/oracle/oradata/rmanrep/users01.dbf, specify that each extension of the datafile is 20MB, and specify that the totalsize of the datafile cannot exceed 1GB:SQL> alter database 2 datafile /u01/app/oracle/oradata/rmanrep/users01.dbf 3 autoextend on 4 next 20m 5 maxsize 1g;Database altered.
- 78 Oracle Database 11g DBA Handbook Clause Description autoextend When this clause is set to ON, the datafile will be allowed to expand. When it’s set to OFF, no expansion is allowed, and the other clauses are set to zero. next <size> The size, in bytes, of the next amount of disk space to allocate for the datafile when expansion is required; the <size> value can be qualified with K, M, G, or T to specify the size in kilobytes, megabytes, gigabytes, or terabytes, respectively. maxsize <size> When this clause is set to unlimited, the size of the datafile is unlimited within Oracle, up to 128TB for a bigfile tablespace, and 128GB for a smallfile tablespace with 32K blocks (otherwise limited by the file system containing the datafile). Otherwise, maxsize is set to the maximum number of bytes in the datafile, using the same qualifiers used in the next clause: K, M, G, or T. TABLE 4-1 Datafile Extension Clauses If the disk volume containing the datafile does not have the disk space available for the expansion of the datafile, we must either move the datafile to another disk volume or create a second datafile for the tablespace on another disk volume. In this example, we’re going to add a second datafile to the USERS tablespace on a different disk volume with an initial size of 50MB, allowing for the automatic extension of the datafile, with each extension 10MB and a maximum datafile size of 200MB: SQL> alter tablespace users 2 add datafile /u03/oradata/users02.dbf 3 size 50m 4 autoextend on 5 next 10m 6 maxsize 200m; Tablespace altered. Notice that when we modify an existing datafile in a tablespace, we use the alter database command, whereas when we add a datafile to a tablespace, we use the alter tablespace command. As you will see shortly, using a bigfile tablespace simplifies these types of operations. Resizing a Smallfile Tablespace Using EM Database Control Using EM Database Control, we can use either of the methods described in the preceding section: increase the size and turn on autoextend for the tablespace’s single datafile, or add a second datafile. Resizing a Datafile in a Smallfile Tablespace To resize a datafile in EM Database Control, click the Server tab from the database instance home page, then click Tablespaces under the Storage
- Chapter 4: Physical Database Layouts and Storage Management 79FIGURE 4-1 Using EM Database Control to edit tablespace characteristicsheading. In Figure 4-1, you have selected the XPORT tablespace; it is over 85 percent full, so youdecide to expand its size using a second datafile. This tablespace was originally created using thiscommand:create tablespace xport datafile /u02/oradata/xport.dbf size 150m; Rather than let the tablespace’s datafile autoextend, we will change the current size of thedatafile to 200MB from 150MB. By clicking the Edit button, you can see the characteristics of the XPORT tablespace, asshown in Figure 4-2. It is locally managed, permanent, and not a bigfile tablespace (i.e., it is asmallfile tablespace). At the bottom of the page is the single datafile for the XPORT tablespace, /u02/oradata/xport.dbf.
- 80 Oracle Database 11g DBA Handbook FIGURE 4-2 Tablespace characteristics With the only datafile in the XPORT tablespace selected, click the Edit button or click the datafile name itself, and you will see the Edit Tablespace: Edit Datafile page, shown in Figure 4-3, where you can change the size of the datafile. On this page, change the file size from 150MB to 200MB and click Continue. In Figure 4-4, you are back to the Edit Tablespace page. At this point, you can make the changes to the datafile by clicking Apply, cancel the changes by clicking Revert, or show the SQL to be executed by clicking Show SQL. Before committing the changes, it is often beneficial to review the SQL commands about to be executed by clicking the Show SQL button—it is a good way to brush up on your SQL command syntax! Here is the command that will be executed when you click Apply: ALTER DATABASE DATAFILE /u02/oradata/xport.dbf RESIZE 200M When you click Apply, Oracle changes the size of the datafile. The Edit Tablespace: XPORT page reflects the successful operation and the new size of the datafile, as you can see in Figure 4-5.
- Chapter 4: Physical Database Layouts and Storage Management 81FIGURE 4-3 Editing a tablespace’s datafileFIGURE 4-4 Confirming datafile changes
- 82 Oracle Database 11g DBA Handbook FIGURE 4-5 Datafile resizing results Adding a Datafile to a Smallfile Tablespace Adding a datafile to a smallfile tablespace is just as easy as resizing a datafile using EM Database Control. In our preceding example, we expanded the datafile for the XPORT tablespace to 200MB. Because the file system (/u02) containing the datafile for the XPORT tablespace is now at capacity, you will have to turn off AUTOEXTEND on the existing datafile and then create a new datafile on a different file system. In Figure 4-6, you turn off AUTOEXTEND for the existing datafile by unchecking the check box in the Storage section. Here is the SQL command that is executed for this operation when you click Continue and then Apply: ALTER DATABASE DATAFILE /u02/oradata/xport.dbf AUTOEXTEND OFF; On the Tablespaces page in earlier Figure 4-1, select the radio button next to the XPORT tablespace, and click on the Edit button. You will see the page in Figure 4-7. Click the Add button in Figure 4-7 and you will see the page in Figure 4-8.
- Chapter 4: Physical Database Layouts and Storage Management 83FIGURE 4-6 Editing a tablespace’s datafile characteristicsFIGURE 4-7 Editing the XPORT tablespace
- 84 Oracle Database 11g DBA Handbook FIGURE 4-8 Adding a datafile to the XPORT tablespace On the page in Figure 4-8, specify the filename and directory location for the new datafile. Because you know that the /u04 file system has at least 100MB free, you specify /u04/oradata as the directory and xport2.dbf as the filename, although the filename itself need not contain the tablespace name. In addition, you set the file size to 100MB and do not click the check box for AUTOEXTEND. After clicking Continue and then Apply, you see the Update Message and the new size of the XPORT tablespace’s datafiles, as shown in Figure 4-9. Dropping a Datafile from a Tablespace In previous versions of Oracle, dropping a datafile from a tablespace was problematic; there was not a single command you could issue to drop a datafile unless you dropped the entire tablespace. You only had three alternatives: ■ Live with it. ■ Shrink it and turn off AUTOEXTEND. ■ Create a new tablespace, move all the objects to the new tablespace, and drop the original tablespace.
- Chapter 4: Physical Database Layouts and Storage Management 85FIGURE 4-9 Viewing XPORT tablespace after adding a datafile Although creating a new tablespace was the most ideal from a maintenance and metadatapoint of view, performing the steps involved was error-prone and involved some amount ofdowntime for the tablespace, impacting availability. Using EM Database Control, you can drop a datafile and minimize downtime, and let EMDatabase Control generate the scripts for you. Following our previous example when weexpanded the XPORT tablespace by adding a datafile, I’ll step through an example of how youcan remove the datafile by reorganizing the tablespace. On the Tablespace page, select thetablespace to be reorganized (XPORT in this case), choose Reorganize in the Actions drop-downbox, and then click Go, as shown in Figure 4-10. In Figure 4-11, on the Reorganize Objects page, you confirm that you are reorganizing theXPORT tablespace and then click Next.
- 86 Oracle Database 11g DBA Handbook FIGURE 4-10 Tablespace: Reorganize FIGURE 4-11 Reorganize Objects: Objects
- Chapter 4: Physical Database Layouts and Storage Management 87FIGURE 4-12 Reorganize Objects: Options The next page, as you can see in Figure 4-12, is where you set some of the parameters for thereorganization, such as whether speed of the reorganization or the availability of the tablespaceis more important for this reorganization. In addition, you can leverage the tablespace renamefeature instead of using a scratch tablespace for a working area, potentially saving disk spaceor the amount of time it will take for the reorganization. Other parameters on this page includespecifying parallel execution, index rebuilds without logging, and what level of statistics gatheringis required after the reorganization is complete. Figure 4-13 shows the status of the script creation. The time it takes to generate the script isroughly proportional to the number of objects in the tablespace. A summary screen is presented with any warnings or errors encountered during scriptgeneration, as you can see in Figure 4-14 on the Impact Report.
- 88 Oracle Database 11g DBA Handbook FIGURE 4-13 Processing: Generating Reorganization Script After clicking Next, you see the Schedule page, as shown in Figure 4-15. In this scenario, go ahead and specify host credentials for the server, but we will not submit the job at the end of the wizard because we need to make one edit to the script. Clicking Next, we arrive at the Review page in Figure 4-16. An excerpt of the generated script is presented in the text box. Instead of submitting the job, you will click Save Full Script to make one minor change to the script before you run it. In Figure 4-17, you specify the location where you want to save the script. FIGURE 4-14 Reorganize Objects: Impact Report
- Chapter 4: Physical Database Layouts and Storage Management 89FIGURE 4-15 Reorganize Objects: ScheduleFIGURE 4-16 Reorganize Objects: Review
- 90 Oracle Database 11g DBA Handbook FIGURE 4-17 Review: Save Full Script When you edit the full script, locate the execute immediate command where the tablespace is created: EXECUTE IMMEDIATE CREATE SMALLFILE TABLESPACE "XPORT_REORG0" DATAFILE /u02/oradata/xport_reorg0.dbf SIZE 200M REUSE, /u04/oradata/xport2_reorg0.dbf SIZE 100M REUSE LOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO; Because we want to drop a datafile, we want to remove the highlighted datafile clause in the script and then either change the location of the second datafile or re-create the first datafile with a larger size. In this example, you modify the create tablespace command to not only create the new tablespace with a larger size, but also place the new tablespace on a different disk volume: EXECUTE IMMEDIATE CREATE SMALLFILE TABLESPACE "XPORT_REORG0" DATAFILE /u04/oradata/xport.dbf SIZE 300M REUSE LOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO; Once the script has been edited, run the script in SQL*Plus using an account with DBA privileges. The output of the script looks like this: SQL> @reorg1.sql -- Target database: dw.world -- Script generated at: 08-JUL-2007 23:38 Starting reorganization Executing as user: RJB CREATE SMALLFILE TABLESPACE "XPORT_REORG0" DATAFILE /u04/oradata/xport_reorg0.dbf SIZE 300M REUSE LOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO
- Chapter 4: Physical Database Layouts and Storage Management 91ALTER TABLE "SYS"."OBJ_FILL" MOVE TABLESPACE "XPORT_REORG0"DROP TABLESPACE "XPORT" INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTSALTER TABLESPACE "XPORT_REORG0" RENAME TO "XPORT"Completed Reorganization. Starting cleanup phase.Starting cleanup of recovery tablesCompleted cleanup of recovery tablesStarting cleanup of generated proceduresCompleted cleanup of generated proceduresScript execution completeSQL> You can avoid using reorganization scripts in many cases if you use bigfile tablespacesbecause they consist of only one datafile. We will discuss bigfile tablespace reorganizationin the next section.Resizing a Bigfile Tablespace Using ALTER TABLESPACEA bigfile tablespace consists of one and only one datafile. Although you will learn more aboutbigfile tablespaces in Chapter 6, we will present a few details about how a bigfile tablespace canbe resized. Most of the parameters available for changing the characteristics of a tablespace’sdatafile—such as the maximum size, whether it can extend at all, and the size of the extents—arenow modifiable at the tablespace level. Let’s start with a bigfile tablespace created as follows:create bigfile tablespace dmarts datafile /u05/oradata/dmarts.dbf size 750m autoextend on next 100m maxsize unlimited extent management local segment space management auto; Operations that are valid only at the datafile level with smallfile tablespaces can be used withbigfile tablespaces at the tablespace level:SQL> alter tablespace dmarts resize 1g;Tablespace altered. Although using alter database with the datafile specification for the DMARTS tablespace willwork, the advantage of the alter tablespace syntax is obvious: You don’t have to or need to knowwhere the datafile is stored. As you might suspect, trying to change datafile parameters at thetablespace level with smallfile tablespaces is not allowed:SQL> alter tablespace users resize 500m;alter tablespace users resize 500m*ERROR at line 1:ORA-32773: operation not supported for smallfile tablespace USERS If a bigfile tablespace runs out of space because its single datafile cannot extend on the disk,you need to relocate the datafile to another volume, as we will discuss in the next section,“Moving Datafiles.” Using Automatic Storage Management (ASM), presented later in this chapter,can potentially eliminate the need to manually move datafiles at all: Instead of moving thedatafile, you can add another disk volume to the ASM storage group.
- 92 Oracle Database 11g DBA Handbook Moving Datafiles To better manage the size of a datafile or improve the overall I/O performance of the database, it may be necessary to move one or more datafiles in a tablespace to a different location. There are three methods for relocating the datafiles: using alter database, using alter tablespace, and via EM Database Control, although EM Database Control does not provide all the commands necessary to relocate the datafile. The alter tablespace method works for datafiles in all tablespaces except for SYSTEM, SYSAUX, the online undo tablespace, and the temporary tablespace. The alter database method works for datafiles in all tablespaces because the instance is shut down when the move operation occurs. Moving Datafiles with ALTER DATABASE The steps for moving one or more datafiles with alter database are as follows: 1. Connect to the database as SYSDBA and shut down the instance. 2. Use operating system commands to move the datafile(s). 3. Open the database in MOUNT mode. 4. Use alter database to change the references to the datafile in the database. 5. Open the database in OPEN mode. 6. Perform an incremental or full backup of the database that includes the control file. In the following example, we will show you how to move the datafile of the XPORT tablespace from the file system /u04 to the file system /u06. First, you connect to the database with SYSDBA privileges using the following command: sqlplus / as sysdba Next, you use a query against the dynamic performance views V$DATAFILE and V$TABLESPACE to confirm the names of the datafiles in the XPORT tablespace: SQL> select d.name from 2 v$datafile d join v$tablespace t using(ts#) 3 where t.name = XPORT; NAME ------------------------------------------------------------- /u04/oradata/xport.dbf 1 row selected. SQL> To complete step 1, shut down the database: SQL> shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down. SQL>
- Chapter 4: Physical Database Layouts and Storage Management 93 For step 2, you stay in SQL*Plus and use the “!” escape character to execute the operatingsystem command to move the datafile:SQL> ! mv /u04/oradata/xport.dbf /u06/oradata In step 3, you start up the database in MOUNT mode so that the control file is availablewithout opening the datafiles:SQL> startup mountORACLE instance started.Total System Global Area 422670336 bytesFixed Size 1299112 bytesVariable Size 230690136 bytesDatabase Buffers 184549376 bytesRedo Buffers 6131712 bytesDatabase mounted. For step 4, you change the pathname reference in the control file to point to the new locationof the datafile:SQL> alter database rename file 2 /u04/oradata/xport.dbf to 3 /u06/oradata/xport.dbf;Database altered. In step 5, you open the database to make it available to users:SQL> alter database open;Database altered. Finally, in step 6, you can make a backup copy of the updated control file:SQL> alter database backup controlfile to trace;Database altered.SQL> Alternatively, you can use RMAN to perform an incremental backup that includes a backup ofthe control file.Moving Datafiles with ALTER TABLESPACEIf the datafile you want to move is part of a tablespace other than SYSTEM, SYSAUX, the activeundo tablespace, or the temporary tablespace, then it is preferable to use the alter tablespacemethod to move a tablespace for one primary reason: The database, except for the tablespacewhose datafile will be moved, remains available to all users during the entire operation. The steps for moving one or more datafiles with alter tablespace are as follows: 1. Using an account with the ALTER TABLESPACE privilege, take the tablespace offline. 2. Use operating system commands to move the datafile(s). 3. Use alter tablespace to change the references to the datafile in the database. 4. Bring the tablespace back online.
- 94 Oracle Database 11g DBA Handbook In the alter database example, assume that you moved the datafile for the XPORT tablespace to the wrong file system. In this example, you’ll move it from /u06/oradata to /u05/oradata: SQL> alter tablespace xport offline; Tablespace altered. SQL> ! mv /u06/oradata/xport.dbf /u05/oradata/xport.dbf SQL> alter tablespace xport rename datafile 2 /u06/oradata/xport.dbf to /u05/oradata/xport.dbf; Tablespace altered. SQL> alter tablespace xport online; Tablespace altered. Note how this method is much more straightforward and much less disruptive than the alter database method. The only downtime for the XPORT tablespace is the amount of time it takes to move the datafile from one disk volume to another. Moving Datafiles with EM Database Control In release 1 of Oracle Database 11g, EM Database Control does not have an explicit function for moving a datafile, short of performing a tablespace reorganization, as demonstrated earlier in the chapter. For moving a datafile to another volume, this is overkill. Moving Online Redo Log Files Although it is possible to indirectly move online redo log files by dropping entire redo log groups and re-adding the groups in a different location, this solution will not work if there are only two redo log file groups because a database will not open with only one redo log file group. Temporarily adding a third group and dropping the first or second group is an option if the database must be kept open; alternatively, the method shown here will move the redo log file(s) while the database is shut down. In the following example, we have three redo log file groups with two members each. One member of each group is on the same volume as the Oracle software and should be moved to a different volume to eliminate any contention between log file filling and accessing Oracle software components. The method you will use here is very similar to the method used to move datafiles with the alter database method. SQL> select group#, member from v$logfile 2 order by group#, member; GROUP# MEMBER ---------- -------------------------------------------- 1 /u01/app/oracle/oradata/redo01.log 1 /u05/oradata/redo01.log 2 /u01/app/oracle/oradata/redo02.log 2 /u05/oradata/redo02.log 3 /u01/app/oracle/oradata/redo03.log 3 /u05/oradata/redo03.log 6 rows selected.
- Chapter 4: Physical Database Layouts and Storage Management 95SQL> shutdown immediate;Database closed.Database dismounted.ORACLE instance shut down.SQL> ! mv /u01/app/oracle/oradata/redo0[1-3].log /u04/oradataSQL> startup mountORACLE instance started.Total System Global Area 422670336 bytesFixed Size 1299112 bytesVariable Size 230690136 bytesDatabase Buffers 184549376 bytesRedo Buffers 6131712 bytesDatabase mounted.SQL> alter database rename file /u01/app/oracle/oradata/redo01.log 2 to /u04/oradata/redo01.log;Database altered.SQL> alter database rename file /u01/app/oracle/oradata/redo02.log 2 to /u04/oradata/redo02.log;Database altered.SQL> alter database rename file /u01/app/oracle/oradata/redo03.log 2 to /u04/oradata/redo03.log;Database altered.SQL> alter database open;Database altered.SQL> select group#, member from v$logfile 2 order by group#, member; GROUP# MEMBER---------- ------------------------------------------ 1 /u04/oradata/redo01.log 1 /u05/oradata/redo01.log 2 /u04/oradata/redo02.log 2 /u05/oradata/redo02.log 3 /u04/oradata/redo03.log 3 /u05/oradata/redo03.log6 rows selected.SQL> The I/O for the redo log files no longer contends with the Oracle software; in addition, theredo log files are multiplexed between two different mount points, /u04 and /u05.
- 96 Oracle Database 11g DBA Handbook Moving Control Files Moving a control file when you use an initialization parameter file follows a procedure similar to the one you used for datafiles and redo log files: Shut down the instance, move the file with operating system commands, and restart the instance. When you use a server parameter file (SPFILE), however, the procedure is a bit different. The initialization file parameter CONTROL_FILES is changed using alter system … scope=spfile when either the instance is running or it’s shut down and opened in NOMOUNT mode. Because the CONTROL_FILES parameter is not dynamic, the instance must be shut down and restarted in either case. In this example, you discover that you have three copies of the control file in your database, but they are not multiplexed on different disks. You will edit the SPFILE with the new locations, shut down the instance so that you can move the control files to different disks, and then restart the instance. SQL> select name, value from v$spparameter 2 where name = control_files; NAME VALUE --------------- -------------------------------------------------- control_files /u01/app/oracle/oradata/control01.ctl control_files /u01/app/oracle/oradata/control02.ctl control_files /u01/app/oracle/oradata/control03.ctl SQL> show parameter control_files NAME TYPE VALUE ---------------- ----------- ------------------------------ control_files string /u01/app/oracle/oradata/contro l01.ctl, /u01/app/orac le/orad ata/control02.ctl, /u01/app/or acle/oradata/control03.ctl SQL> alter system set control_files = 2 /u02/oradata/control01.ctl, 3 /u03/oradata/control02.ctl, 4 /u04/oradata/control03.ctl 5 scope = spfile; System altered. SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. SQL> ! mv /u01/app/oracle/oradata/control01.ctl /u02/oradata SQL> ! mv /u01/app/oracle/oradata/control02.ctl /u03/oradata SQL> ! mv /u01/app/oracle/oradata/control03.ctl /u04/oradata SQL> startup ORACLE instance started.
- Chapter 4: Physical Database Layouts and Storage Management 97Total System Global Area 422670336 bytesFixed Size 1299112 bytesVariable Size 230690136 bytesDatabase Buffers 184549376 bytesRedo Buffers 6131712 bytesDatabase mounted.Database opened.SQL> select name, value from v$spparameter 2 where name = control_files;NAME VALUE--------------- --------------------------------------------------control_files /u02/oradata/control01.ctlcontrol_files /u03/oradata/control02.ctlcontrol_files /u04/oradata/control03.ctlSQL> show parameter control_filesNAME TYPE VALUE---------------- ----------- ------------------------------control_files string /u02/oradata/control01.ctl, /u 03/oradata/control02.ctl, /u04 /oradata/control03.ctlSQL> The three control files have been moved to separate file systems, no longer on the volumewith the Oracle software and in a higher availability configuration (if the volume containing oneof the control files fails, two other volumes contain up-to-date control files). NOTE In a default installation of Oracle Database 11g using ASM disks for tablespace storage and the flash recovery area, one copy of the control file is created in the default tablespace ASM disk and another in the flash recovery area. Making one or more copies of the control file to an ASM volume is just as easy: using theRMAN utility (described in detail in Chapter 12), restore a control file backup to an ASM disklocation, as in this example:RMAN> restore controlfile to +DATA/dw/controlfile/control_bak.ctl; The next step is identical to adding file system–based control files as I presented earlier inthis section: change the CONTROL_FILES parameter to add the location +DATA/dw/controlfile/control_bak.ctl in addition to the existing control file locations, and then shut down and restartthe database.SQL> show parameter control_filesNAME TYPE VALUE---------------- ----------- ------------------------------control_files string /u02/oradata/control01.ctl, /u 03/oradata/control02.ctl, /u04
- 98 Oracle Database 11g DBA Handbook /oradata/control03.ctl, +DATA/ dw/controlfile/control_bak.ctl SQL> Similarly, you can use the Linux utility asmcmd to make copies of the control file from one disk group to another, and change the CONTROL_FILES parameter to reflect the new control file location. I present an overview of the asmcmd command later in this chapter. Automatic Storage Management In Chapter 3, we presented some of the file naming conventions used for ASM objects. In this section, I’ll delve more deeply into how we can create tablespaces—and ultimately datafiles behind the scenes—in an ASM environment with one or more disk groups. When creating a new tablespace or other database structure, such as a control file or redo log file, you can specify a disk group as the storage area for the database structure instead of an operating system file. ASM takes the ease of use of Oracle-Managed Files (OMF) and combines it with mirroring and striping features to provide a robust file system and logical volume manager that can even support multiple nodes in an Oracle Real Application Cluster (RAC). ASM eliminates the need to purchase a third-party logical volume manager. ASM not only enhances performance by automatically spreading out database objects over multiple devices, but also increases availability by allowing new disk devices to be added to the database without shutting down the database; ASM automatically rebalances the distribution of files with minimal intervention. We’ll also review the ASM architecture. In addition, I’ll show how you create a special type of Oracle instance to support ASM as well as how to start up and shut down an ASM instance. We’ll review the new initialization parameters related to ASM and the existing initialization parameters that have new values to support an ASM instance. Also, I’ll introduce the asmcmd command-line utility, new to Oracle 10g Release 2, that gives you an alternate way to browse and maintain objects in your ASM disk groups. Finally, I’ll use some raw disk devices on a Linux server to demonstrate how disk groups are created and maintained. ASM Architecture ASM divides the datafiles and other database structures into extents, and it divides the extents among all the disks in the disk group to enhance both performance and reliability. Instead of mirroring entire disk volumes, ASM mirrors the database objects to provide the flexibility to mirror or stripe the database objects differently depending on their type. Optionally, the objects may not be striped at all if the underlying disk hardware is already RAID enabled, part of a storage area network (SAN), or part of a network-attached storage (NAS) device. Automatic rebalancing is another key feature of ASM. When an increase in disk space is needed, additional disk devices can be added to a disk group, and ASM moves a proportional number of files from one or more existing disks to the new disks to maintain the overall I/O balance across all disks. This happens in the background while the database objects contained in the disk files are still online and available to users. If the impact to the I/O subsystem is high during a rebalance operation, the speed at which the rebalance occurs can be reduced using an initialization parameter.
- Chapter 4: Physical Database Layouts and Storage Management 99 ASM requires a special type of Oracle instance to provide the interface between a traditionalOracle instance and the file system; the ASM software components are shipped with the Oracledatabase software and are always available as a selection when you’re selecting the storage typefor the SYSTEM, SYSAUX, and other tablespaces when the database is created. Using ASM does not, however, prevent you from mixing ASM disk groups with manual Oracledatafile management techniques such as those I presented in Chapter 3 and earlier in this chapter.However, the ease of use and performance of ASM makes a strong case for eventually using ASMdisk groups for all your storage needs. Two Oracle background processes introduced in Oracle Database 10g support ASM instances:RBAL and ORBn. RBAL coordinates the disk activity for disk groups, whereas ORBn, where n canbe a number from 0 to 9, performs the actual extent movement between disks in the disk groups. For databases that use ASM disks, there are also two new background processes as of OracleDatabase 10g: OSMB and RBAL. OSMB performs the communication between the database andthe ASM instance, whereas RBAL performs the opening and closing of the disks in the disk groupon behalf of the database.Creating an ASM InstanceASM requires a dedicated Oracle instance to manage the disk groups. An ASM instance generallyhas a smaller memory footprint, in the range of 60MB to 120MB, and is automatically configuredwhen ASM is specified as the database’s file storage option when the Oracle software is installedand an existing ASM instance does not already exist, as you can see in the Oracle UniversalInstaller screen in Figure 4-18.FIGURE 4-18 Specifying ASM as the database file storage method
- 100 Oracle Database 11g DBA Handbook Device Name Capacity /dev/raw/raw1 12GB /dev/raw/raw2 12GB /dev/raw/raw3 12GB /dev/raw/raw4 12GB /dev/raw/raw5 4GB /dev/raw/raw6 4GB /dev/raw/raw7 4GB /dev/raw/raw8 4GB TABLE 4-2 Raw Disks for ASM Disk Groups As an example of disk devices used to create ASM disk groups, suppose our Linux server has a number of raw disk devices with the capacities listed in Table 4-2. You configure the first disk group within the Oracle Universal Installer, as shown in Figure 4-19. FIGURE 4-19 Configuring the initial ASM disk group with OUI
- Chapter 4: Physical Database Layouts and Storage Management 101 The name of the first disk group is DATA, and you will be using /dev/raw/raw1 and /dev/raw/raw2 to create the normal redundancy disk group. If an insufficient number of raw disks areselected for the desired redundancy level, OUI generates an error message. After the databaseis created, both the regular instance and the ASM instance are started. An ASM instance has a few other unique characteristics. Although it does have an initializationparameter file and a password file, it has no data dictionary, and therefore all connections to anASM instance are via SYS and SYSTEM using operating system authentication only; you can onlyconnect to an ASM instance with the connect / as sysdba command; any username/password inthe connect command is ignored. Disk group commands such as create diskgroup, alter diskgroup,and drop diskgroup are only valid in an ASM instance. Finally, an ASM instance is either in aNOMOUNT or MOUNT state; it is never in an OPEN state.ASM Instance ComponentsASM instances cannot be accessed using the variety of methods available with a traditionaldatabase. In this section, I’ll talk about the privileges available to you that connect with SYSDBAand SYSOPER privileges. We’ll also distinguish an ASM instance by the new and expandedinitialization parameters (introduced in Oracle Database 10g and enhanced in Oracle Database11g) available only for an ASM instance. At the end of this section, I’ll present the procedures forstarting and stopping an ASM instance along with the dependencies between ASM instances andthe database instances they serve.Accessing an ASM InstanceAs mentioned earlier in the chapter, an ASM instance does not have a data dictionary, so accessto the instance is restricted to users who can authenticate with the operating system—in otherwords, connecting as SYSDBA or SYSOPER by an operating system user in the dba group. Users who connect to an ASM instance as SYSDBA can perform all ASM operations, such ascreating and deleting disk groups as well as adding and removing disks from disk groups. The SYSOPER users have a much more limited set of commands available in an ASM instance.In general, the commands available to SYSOPER users give only enough privileges to performroutine operations for an already configured and stable ASM instance. The following list containsthe operations available as SYSOPER: ■ Starting up and shutting down an ASM instance ■ Mounting or dismounting a disk group ■ Altering a disk group’s disk status from ONLINE to OFFLINE, or vice versa ■ Rebalancing a disk group ■ Performing an integrity check of a disk group ■ Accessing the V$ASM_* dynamic performance viewsASM Initialization ParametersA number of initialization parameters are either specific to ASM instances or have new valueswithin an ASM instance. An SPFILE is highly recommended instead of an initialization parameterfile for an ASM instance. For example, parameters such as ASM_DISKGROUPS will automaticallybe maintained when a disk group is added or dropped, potentially freeing you from ever havingto manually change this value. We will present the ASM-related initialization parameters in the following sections.
- 102 Oracle Database 11g DBA Handbook INSTANCE_TYPE For an ASM instance, the INSTANCE_TYPE parameter has a value of ASM. The default, for a traditional Oracle instance, is RDBMS. DB_UNIQUE_NAME The default value for the DB_UNIQUE_NAME parameter is +ASM and is the unique name for a group of ASM instances within a cluster or on a single node. ASM_POWER_LIMIT To ensure that rebalancing operations do not interfere with ongoing user I/ O, the ASM_POWER_LIMIT parameter controls how fast rebalance operations occur. The values range from 1 to 11, with 11 being the highest possible value; the default value is 1 (low I/O overhead). Because this is a dynamic parameter, you may set this to a low value during the day and set it higher overnight whenever a disk-rebalancing operation must occur. ASM_DISKSTRING The ASM_DISKSTRING parameter specifies one or more strings, operating system dependent, to limit the disk devices that can be used to create disk groups. If this value is NULL, all disks visible to the ASM instance are potential candidates for creating disk groups. For the examples in this chapter for our test server, the value of the ASM_DISKSTRING parameter is / dev/raw/*: SQL> select name, type, value from v$parameter 2 where name = asm_diskstring; NAME TYPE VALUE --------------- ---------- ------------------------- asm_diskstring 2 /dev/raw/* ASM_DISKGROUPS The ASM_DISKGROUPS parameter specifies a list containing the names of the disk groups to be automatically mounted by the ASM instance at startup or by the alter diskgroup all mount command. Even if this list is empty at instance startup, any existing disk group can be manually mounted. LARGE_POOL_SIZE The LARGE_POOL_SIZE parameter is useful for both regular and ASM instances; however, this pool is used differently for an ASM instance. All internal ASM packages are executed from this pool, so this parameter should be set to at least 12MB for a single instance and 16MB for a RAC instance. ASM_PREFERRED_READ_FAILURE_GROUPS The ASM_PREFERRED_READ_FAILURE_GROUPS parameter, new to Oracle Database 11g, contains a list of the preferred failure groups for a given database instance when using clustered ASM instances. This parameter is instance specific: each instance can specify a failure group that is closest to the instance’s node (for example, a failure group on the server’s local disk) to improve performance. ASM Instance Startup and Shutdown An ASM instance is started much like a database instance, except that the startup command defaults to startup mount. Because there is no control file, database, or data dictionary to mount, the ASM disk groups are mounted instead of a database. The command startup nomount starts up the instance but does not mount any ASM disks. In addition, you can specify startup restrict to temporarily prevent database instances from connecting to the ASM instance to mount disk groups. Performing a shutdown command on an ASM instance performs the same shutdown command on any database instances using the ASM instance; before the ASM instance finishes a shutdown, it waits for all dependent databases to shut down. The only exception to this is if you use the
- Chapter 4: Physical Database Layouts and Storage Management 103shutdown abort command on the ASM instance, which eventually forces all dependent databasesto perform a shutdown abort. For multiple ASM instances sharing disk groups, such as in a Real Application Clusters (RAC)environment, the failure of an ASM instance does not cause the database instances to fail. Instead,another ASM instance performs a recovery operation for the failed instance.ASM Dynamic Performance ViewsA few new dynamic performance views are associated with ASM instances. Table 4-3 containsthe common ASM-related dynamic performance views. We’ll provide further explanation, whereappropriate, later in this chapter for some of these views.ASM Filename FormatsAll ASM files are Oracle-Managed Files (OMF), so the details of the actual filename within thedisk group is not needed for most administrative functions. When an object in an ASM disk groupis dropped, the file is automatically deleted. Certain commands will expose the actual filenames,such as alter database backup controlfile to trace, as well as some data dictionary and dynamic View Name Used in Standard Description Database? V$ASM_DISK Yes One row for each disk discovered by an ASM instance, used by a disk group or not. For a database instance, one row for each disk group in use by the instance. V$ASM_DISKGROUP Yes For an ASM instance, one row for each disk group containing general characteristics of the disk group. For a database instance, one row for each disk group in use whether mounted or not. V$ASM_FILE No One row for each file in every mounted disk group. V$ASM_OPERATION No One row for each executing long-running operation in the ASM instance. V$ASM_TEMPLATE Yes One row for each template in each mounted disk group in the ASM instance. For a database instance, one row for each template for each mounted disk group. V$ASM_CLIENT Yes One row for each database using disk groups managed by the ASM instance. For a database instance, one row for the ASM instance if any ASM files are open. V$ASM_ALIAS No One row for every alias in every mounted disk group.TABLE 4-3 ASM-Related Dynamic Performance Views
- 104 Oracle Database 11g DBA Handbook performance views. For example, the dynamic performance view V$DATAFILE shows the actual filenames within each disk group. Here is an example: SQL> select file#, name, blocks from v$datafile; FILE# NAME BLOCKS ---------- ---------------------------------------- ---------- 1 +DATA/dw/datafile/system.256.627432971 89600 2 +DATA/dw/datafile/sysaux.257.627432973 77640 3 +DATA/dw/datafile/undotbs1.258.627432975 12800 4 +DATA/dw/datafile/users.259.627432977 640 5 +DATA/dw/datafile/example.265.627433157 12800 6 /u05/oradata/dmarts.dbf 32000 8 /u05/oradata/xport.dbf 38400 7 rows selected. ASM filenames can be one of six different formats. In the sections that follow, I’ll give an overview of the different formats and the context where they can be used—either as a reference to an existing file, during a single-file creation operation, or during a multiple-file creation operation. Fully Qualified Names Fully qualified ASM filenames are used only when referencing an existing file. A fully qualified ASM filename has the format +group/dbname/file type/tag.file.incarnation where group is the disk group name, dbname is the database to which the file belongs, file type is the Oracle file type, tag is information specific to the file type, and the file.incarnation pair ensures uniqueness. Here is an example of an ASM file for the USERS tablespace: +DATA/dw/datafile/users.259.627432977 The disk group name is +DATA, the database name is dw, it’s a datafile for the USERS tablespace, and the file number/incarnation pair 259.627432977 ensures uniqueness if you decide to create another ASM datafile for the USERS tablespace. Numeric Names Numeric names are used only when referencing an existing ASM file. This allows you to refer to an existing ASM file by only the disk group name and the file number/incarnation pair. The numeric name for the ASM file in the preceding section is +DATA.259.627432977 Alias Names An alias can be used when either referencing an existing object or creating a single ASM file. Using the alter diskgroup add alias command, a more readable name can be created for an existing or a new ASM file, and it’s distinguishable from a regular ASM filename because it does not end in a dotted pair of numbers (the file number/incarnation pair), as shown here:
- Chapter 4: Physical Database Layouts and Storage Management 105SQL> alter diskgroup data 2 add directory +data/purch;Diskgroup altered.SQL> alter diskgroup data 2 add alias +data/purch/users.dbf 3 for +data/dw/datafile/users.259.627432977;Diskgroup altered.SQL>Alias with Template NamesAn alias with a template can only be used when creating a new ASM file. Templates provide ashorthand for specifying a file type and a tag when creating a new ASM file. Here’s an exampleof an alias using a template for a new tablespace in the +DATA disk group:SQL> create tablespace users2 datafile +data(datafile);Tablespace created. The template datafile specifies COARSE striping, MIRROR for a normal-redundancy group,and HIGH for a high-redundancy group; it is the default for a datafile. Because we did not fullyqualify the name, the ASM name for this diskgroup is as follows:+DATA/dw/datafile/users2.267.627782171 I’ll talk more about ASM templates in the section “ASM File Types and Templates” later in thischapter.Incomplete NamesAn incomplete filename format can be used either for single-file or multiple-file creation operations.Only the disk group name is specified, and a default template is used depending on the type offile, as shown here:SQL> create tablespace users5 datafile +data1;Tablespace created.Incomplete Names with TemplateAs with incomplete ASM filenames, an incomplete filename with a template can be used eitherfor single-file or multiple-file creation operations. Regardless of the actual file type, the templatename determines the characteristics of the file. Even though we are creating a tablespace in the following example, the striping and mirroringcharacteristics of an online log file (fine striping) are used for the new tablespace instead as theattributes for the datafile (coarse striping):SQL> create tablespace users6 datafile +data1(onlinelog);Tablespace created.ASM File Types and TemplatesASM supports all types of files used by the database except for operating system executables.Table 4-4 contains the complete list of ASM file types; the ASM File Type and Tag columns arethose presented previously for ASM filenaming conventions.
- 106 Oracle Database 11g DBA Handbook Oracle File Type ASM File Tag Default Template Type Control files controlfile cf (control file) CONTROLFILE or bcf (backup control file) Data files datafile tablespace DATAFILE name.file# Online logs online_log log_thread# ONLINELOG Archive logs archive_log parameter ARCHIVELOG Temp files temp tablespace TEMPFILE name.file# RMAN datafile backupset Client specified BACKUPSET backup piece RMAN incremental backupset Client specified BACKUPSET backup piece RMAN archive log backupset Client specified BACKUPSET backup piece RMAN datafile copy datafile tablespace DATAFILE name.file# Initialization init spfile PARAMETERFILE parameters Broker config drc drc DATAGUARDCONFIG Flashback logs rlog thread#_log# FLASHBACK Change tracking ctb bitmap CHANGETRACKING bitmap Auto backup autobackup Client specified AUTOBACKUP Data Pump dumpset dumpset dump DUMPSET Cross-platform data XTRANSPORT files TABLE 4-4 ASM File Types The default ASM file templates referenced in the last column of Table 4-4 are presented in Table 4-5. When a new disk group is created, a set of ASM file templates copied from the default templates in Table 4-5 is saved with the disk group; as a result, individual template characteristics can be changed and apply only to the disk group where they reside. In other words, the DATAFILE system template in disk group +DATA1 may have the default coarse striping, but the DATAFILE template in disk group +DATA2 may have fine striping. You can create your own templates in each disk group as needed. When an ASM datafile is created with the DATAFILE template, by default the datafile is 100MB and autoextensible, and the maximum size is 32767MB (32GB).
- Chapter 4: Physical Database Layouts and Storage Management 107 System Template External Normal Redundancy High Redundancy Striping Redundancy CONTROLFILE Unprotected Two-way mirroring Three-way mirroring Fine DATAFILE Unprotected Two-way mirroring Three-way mirroring Coarse ONLINELOG Unprotected Two-way mirroring Three-way mirroring Fine ARCHIVELOG Unprotected Two-way mirroring Three-way mirroring Coarse TEMPFILE Unprotected Two-way mirroring Three-way mirroring Coarse BACKUPSET Unprotected Two-way mirroring Three-way mirroring Coarse XTRANSPORT Unprotected Two-way mirroring Three-way mirroring Coarse PARAMETERFILE Unprotected Two-way mirroring Three-way mirroring Coarse DATAGUARDCONFIG Unprotected Two-way mirroring Three-way mirroring Coarse FLASHBACK Unprotected Two-way mirroring Three-way mirroring Fine CHANGETRACKING Unprotected Two-way mirroring Three-way mirroring Coarse AUTOBACKUP Unprotected Two-way mirroring Three-way mirroring Coarse DUMPSET Unprotected Two-way mirroring Three-way mirroring CoarseTABLE 4-5 ASM File Template Defaults Administering ASM Disk Groups Using ASM disk groups benefits you in a number of ways: I/O performance is improved, availability is increased, and the ease with which you can add a disk to a disk group or add an entirely new disk group enables you to manage many more databases in the same amount of time. Understanding the components of a disk group as well as correctly configuring a disk group are important goals for a successful DBA. In this section, I’ll delve more deeply into the details of the structure of a disk group. Also, I’ll review the different types of administrative tasks related to disk groups and show how disks are assigned to failure groups, how disk groups are mirrored, and how disk groups are created, dropped, and altered. I’ll also briefly review the EM Database Control interface to ASM; at the command line, I’ll also give you an introduction to the asmcmd command-line utility that you can use to browse, copy, and manage ASM objects. Disk Group Architecture As defined earlier in this chapter, a disk group is a collection of physical disks managed as a unit. Every ASM disk, as part of a disk group, has an ASM disk name that is either assigned by the DBA or automatically assigned when it is assigned to the disk group. Files in a disk group are striped on the disks using either coarse striping or fine striping. Coarse striping spreads files in units of 1MB each across all disks. Coarse striping is appropriate for a system with a high degree of concurrent small I/O requests, such as an OLTP environment. Alternatively, fine striping spreads files in units of 128KB, is appropriate for traditional data warehouse environments or OLTP systems with low concurrency, and maximizes response time for individual I/O requests.
- 108 Oracle Database 11g DBA Handbook Disk Group Mirroring and Failure Groups Before defining the type of mirroring within a disk group, you must group disks into failure groups. A failure group is one or more disks within a disk group that share a common resource, such as a disk controller, whose failure would cause the entire set of disks to be unavailable to the group. In most cases, an ASM instance does not know the hardware and software dependencies for a given disk. Therefore, unless you specifically assign a disk to a failure group, each disk in a disk group is assigned to its own failure group. Once the failure groups have been defined, you can define the mirroring for the disk group; the number of failure groups available within a disk group can restrict the type of mirroring available for the disk group. There are three types of mirroring available: external redundancy, normal redundancy, and high redundancy. External Redundancy External redundancy requires only one disk location and assumes that the disk is not critical to the ongoing operation of the database or that the disk is managed externally with high-availability hardware such as a RAID controller. Normal Redundancy Normal redundancy provides two-way mirroring and requires at least two failure groups within a disk group. Failure of one of the disks in a failure group does not cause any downtime for the disk group or any data loss other than a slight performance hit for queries against objects in the disk group; when all disks in the failure group are online, read performance is typically improved because the requested data is available on more than one disk. High Redundancy High redundancy provides three-way mirroring and requires at least three failure groups within a disk group. The failure of disks in two out of the three failure groups is for the most part transparent to the database users, as in normal redundancy mirroring. Mirroring is managed at a very low level. Extents, not disks, are mirrored. In addition, each disk will have a mixture of both primary and mirrored (secondary and tertiary) extents on each disk. Although a slight amount of overhead is incurred for managing mirroring at the extent level, it provides the advantage of spreading out the load from the failed disk to all other disks instead of a single disk. Disk Group Dynamic Rebalancing Whenever you change the configuration of a disk group—whether you are adding or removing a failure group or a disk within a failure group—dynamic rebalancing occurs automatically to proportionally reallocate data from other members of the disk group to the new member of the disk group. This rebalance occurs while the database is online and available to users; any impact to ongoing database I/O can be controlled by adjusting the value of the initialization parameter ASM_POWER_LIMIT to a lower value. Not only does dynamic rebalancing free you from the tedious and often error-prone task of identifying hot spots in a disk group, it also provides an automatic way to migrate an entire database from a set of slower disks to a set of faster disks while the entire database remains online. Faster disks are added as a new failure group in the existing disk group with the slower disks and the automatic rebalance occurs. After the rebalance operations complete, the failure groups containing the slower disks are dropped, leaving a disk group with only fast disks. To make this operation even faster, both the add and drop operations can be initiated within the same alter diskgroup command. As an example, suppose you want to create a new disk group with high redundancy to hold tablespaces for a new credit card authorization. Using the view V$ASM_DISK, you can view all
- Chapter 4: Physical Database Layouts and Storage Management 109disks discovered using the initialization parameter ASM_DISKSTRING, along with the status ofthe disk (in other words, whether it is assigned to an existing disk group or is unassigned). Hereis the command:SQL> select group_number, disk_number, name, 2 failgroup, create_date, path from v$asm_disk;GROUP_NUMBER DISK_NUMBER NAME FAILGROUP CREATE_DA PATH------------ ----------- ---------- ---------- --------- --------------- 0 0 /dev/raw/raw8 0 1 /dev/raw/raw7 0 2 /dev/raw/raw6 0 3 /dev/raw/raw5 2 1 RECOV_0001 RECOV_0001 08-JUL-07 /dev/raw/raw4 2 0 RECOV_0000 RECOV_0000 08-JUL-07 /dev/raw/raw3 1 1 DATA_0001 DATA_0001 08-JUL-07 /dev/raw/raw2 1 0 DATA_0000 DATA_0000 08-JUL-07 /dev/raw/raw18 rows selected.SQL> Out of the eight disks available for ASM, only four of them are assigned to two disk groups,DATA and RECOV, each in its own failure group. The disk group name can be obtained from theview V$ASM_DISKGROUP:SQL> select group_number, name, type, total_mb, free_mb 2 from v$asm_diskgroup;GROUP_NUMBER NAME TYPE TOTAL_MB FREE_MB------------ ---------- ------ ---------- ---------- 1 DATA NORMAL 24568 20798 2 RECOV NORMAL 24568 24090SQL> Note that if you had a number of ASM disks and disk groups, you could have joined the twoviews on the GROUP_NUMBER column and filtered the query result by GROUP_NUMBER. Also,you see from V$ASM_DISKGROUP that both of the disk groups are NORMAL REDUNDANCYgroups consisting of two disks each. Your first step is to create the disk group:SQL> create diskgroup data2 high redundancy 2 failgroup fg1 disk /dev/raw/raw5 name d2a 3 failgroup fg2 disk /dev/raw/raw6 name d2b 4 failgroup fg3 disk /dev/raw/raw7 name d2c 5 failgroup fg4 disk /dev/raw/raw8 name d2d;Diskgroup created.SQL>
- 110 Oracle Database 11g DBA Handbook Looking at the dynamic performance views, you see the new disk group available in V$ASM_ DISKGROUP and the failure groups in V$ASM_DISK: SQL> select group_number, name, type, total_mb, free_mb 2 from v$asm_diskgroup; GROUP_NUMBER NAME TYPE TOTAL_MB FREE_MB ------------ ---------- ------ ---------- ---------- 1 DATA NORMAL 24568 20798 2 RECOV NORMAL 24568 24090 3 DATA2 HIGH 16376 16221 SQL> select group_number, disk_number, name, 2 failgroup, create_date, path from v$asm_disk; GROUP_NUMBER DISK_NUMBER NAME FAILGROUP CREATE_DA PATH ------------ ----------- ---------- ---------- --------- --------------- 3 3 D2D FG4 13-JUL-07 /dev/raw/raw8 3 2 D2C FG3 13-JUL-07 /dev/raw/raw7 3 1 D2B FG2 13-JUL-07 /dev/raw/raw6 3 0 D2A FG1 13-JUL-07 /dev/raw/raw5 2 1 RECOV_0001 RECOV_0001 08-JUL-07 /dev/raw/raw4 2 0 RECOV_0000 RECOV_0000 08-JUL-07 /dev/raw/raw3 1 1 DATA_0001 DATA_0001 08-JUL-07 /dev/raw/raw2 1 0 DATA_0000 DATA_0000 08-JUL-07 /dev/raw/raw1 8 rows selected. SQL> However, if disk space is tight, you don’t need four members; for a high-redundancy disk group, only three failure groups are necessary, so you drop the disk group and re-create it with only three members: SQL> drop diskgroup data2; Diskgroup dropped. If the disk group has any database objects other than disk group metadata, you have to specify the including contents clause in the drop diskgroup command. This is an extra safeguard to make sure that disk groups with database objects are not accidentally dropped. Here is the command: SQL> create diskgroup data2 high redundancy 2 failgroup fg1 disk /dev/raw/raw5 name d2a 3 failgroup fg2 disk /dev/raw/raw6 name d2b 4 failgroup fg3 disk /dev/raw/raw7 name d2c; Diskgroup created. SQL> select group_number, disk_number, name, 2 failgroup, create_date, path from v$asm_disk;
- Chapter 4: Physical Database Layouts and Storage Management 111GROUP_NUMBER DISK_NUMBER NAME FAILGROUP CREATE_DA PATH------------ ----------- ---------- ---------- --------- --------------- 0 3 13-JUL-07 /dev/raw/raw8 3 2 D2C FG3 13-JUL-07 /dev/raw/raw7 3 1 D2B FG2 13-JUL-07 /dev/raw/raw6 3 0 D2A FG1 13-JUL-07 /dev/raw/raw5 2 1 RECOV_0001 RECOV_0001 08-JUL-07 /dev/raw/raw4 2 0 RECOV_0000 RECOV_0000 08-JUL-07 /dev/raw/raw3 1 1 DATA_0001 DATA_0001 08-JUL-07 /dev/raw/raw2 1 0 DATA_0000 DATA_0000 08-JUL-07 /dev/raw/raw18 rows selected.SQL> Now that the configuration of the new disk group has been completed, you can create atablespace in the new disk group from the database instance:SQL> create tablespace users3 datafile +DATA2;Tablespace created. Because ASM files are Oracle-Managed Files (OMF), you don’t need to specify any othercharacteristics when you create the tablespace.Disk Group Fast Mirror ResyncMirroring the files in your disk groups improves performance and availability; when a failed diskin a disk group is repaired and brought back online, however, the re-mirroring of the entire newdisk can be time consuming. There are occasions when a disk in a disk group needs be broughtoffline because of a disk controller failure; the entire disk does not need remirroring, and onlythe data changed during the failed disk’s downtime needs to be resynced. As a result, you canuse the ASM fast mirror resync feature introduced in Oracle Database 11g. To implement fast mirror resync, you set the time window within which ASM will notautomatically drop the disk in the disk group when a transient planned or unplanned failureoccurs. During the transient failure, ASM keeps track of all changed data blocks so that whenthe unavailable disk is brought back online, only the changed blocks need to be remirroredinstead of the entire disk. To set a time window for the DATA disk group, you must first set the compatibility level of thedisk group to 11.1 or higher for both the RDBMS instance and the ASM instance (this only needsto be done once for the disk group):SQL> alter diskgroup data set attribute 2 compatible.asm = 11.1.0.0.0;Diskgroup altered.SQL> alter diskgroup data set attribute 2 compatible.rdbms = 11.1.0.0.0;Diskgroup altered.SQL>
- 112 Oracle Database 11g DBA Handbook The only side effect to using a higher compatibility level for the RDBMS and ASM instance is that only other instances with a version number 11.1.0.0.0 or higher can access this disk group. Next, set the disk group attribute disk_repair_time as in this example: SQL> alter diskgroup data set attribute 2 disk_repair_time = 2.5h; Diskgroup altered. SQL> The default disk repair time is 3.6 hours, which should be more than adequate for most planned and unplanned (transient) outages. Once the disk is back online, run this command to notify the ASM instance that the disk DATA_0001 is back online: SQL> alter diskgroup data online disk data_0001; Diskgroup altered. SQL> This command starts the background procedure to copy all changed extents on the remaining disks in the disk group to the disk DATA_0001 that is now back online. Altering Disk Groups Disks can be added and dropped from a disk group; also, most characteristics of a disk group can be altered without re-creating the disk group or impacting user transactions on objects in the disk group. When a disk is added to a disk group, a rebalance operation is performed in the background after the new disk is formatted for use in the disk group. As mentioned earlier in this chapter, the speed of the rebalance is controlled by the initialization parameter ASM_POWER_LIMIT. Continuing with our example in the preceding section, suppose you decide to improve the I/O characteristics of the disk group DATA by adding the last available raw disk to the disk group, as follows: SQL> alter diskgroup data 2 add failgroup d1fg3 disk /dev/raw/raw8 name d1c; Diskgroup altered. The command returns immediately and the formatting and rebalancing continue in the background. You then check the status of the rebalance operation by checking the view V$ASM_ OPERATION: SQL> select group_number, operation, state, power, actual, 2 sofar, est_work, est_rate, est_minutes from v$asm_operation; GROUP_NUMBER OPERA STAT POWER ACTUA SOFAR EST_WORK EST_RATE EST_MINUTES ------------ ----- ---- ----- ----- ----- -------- -------- ----------- 1 REBAL RUN 1 1 3 964 60 16
- Chapter 4: Physical Database Layouts and Storage Management 113 Because the estimate for completing the rebalance operation is 16 minutes, you decide toallocate more resources to the rebalance operation and change the power limit for this particularrebalance operation:SQL> alter diskgroup data rebalance power 8;Diskgroup altered. Checking the status of the rebalance operation confirms that the estimated time to completionhas been reduced to four minutes instead of 16:SQL> select group_number, operation, state, power, actual, 2 sofar, est_work, est_rate, est_minutes from v$asm_operation;GROUP_NUMBER OPERA STAT POWER ACTUA SOFAR EST_WORK EST_RATE EST_MINUTES------------ ----- ---- ----- ----- ----- -------- -------- ----------- 1 REBAL RUN 8 8 16 605 118 4 About four minutes later, you check the status once more:SQL> /no rows selected Finally, you can confirm the new disk configuration from the V$ASM_DISK and V$ASM_DISKGROUP views:SQL> select group_number, disk_number, name, 2 failgroup, create_date, path from v$asm_disk;GROUP_NUMBER DISK_NUMBER NAME FAILGROUP CREATE_DA PATH------------ ----------- ---------- ---------- --------- --------------- 1 2 D1C D1FG3 13-JUL-07 /dev/raw/raw8 3 2 D2C FG3 13-JUL-07 /dev/raw/raw7 3 1 D2B FG2 13-JUL-07 /dev/raw/raw6 3 0 D2A FG1 13-JUL-07 /dev/raw/raw5 2 1 RECOV_0001 RECOV_0001 08-JUL-07 /dev/raw/raw4 2 0 RECOV_0000 RECOV_0000 08-JUL-07 /dev/raw/raw3 1 1 DATA_0001 DATA_0001 08-JUL-07 /dev/raw/raw2 1 0 DATA_0000 DATA_0000 08-JUL-07 /dev/raw/raw18 rows selected.SQL> select group_number, name, type, total_mb, free_mb 2 from v$asm_diskgroup;GROUP_NUMBER NAME TYPE TOTAL_MB FREE_MB------------ ---------- ------ ---------- ---------- 1 DATA NORMAL 28662 24814 2 RECOV NORMAL 24568 24090 3 DATA2 HIGH 12282 11820SQL>
- 114 Oracle Database 11g DBA Handbook ALTER DISKGROUP Command Description alter diskgroup ... drop disk Removes a disk from a failure group within a disk group and performs an automatic rebalance alter diskgroup ... drop ... add Drops a disk from a failure group and adds another disk, all in the same command alter diskgroup ... mount Makes a disk group available to all instances alter diskgroup ... dismount Makes a disk group unavailable to all instances alter diskgroup ... check all Verifies the internal consistency of the disk group TABLE 4-6 Disk Group ALTER Commands Note that the disk group DATA is still normal redundancy, even though it has three failure groups. However, the I/O performance of select statements against objects in the DATA disk group is improved due to additional copies of extents available in the disk group. Other disk group alter commands are listed in Table 4-6. EM Database Control and ASM Disk Groups The EM Database Control can also be used to administer disk groups. For a database that uses ASM disk groups, the link Disk Groups under the Administration tab brings you to a login page for the ASM instance shown in Figure 4-20. Remember that authentication for an ASM instance uses operating system authentication only. Figure 4-21 shows the home page for the ASM instance. After authentication with the ASM instance, you can perform the same operations that you performed earlier in this chapter at the command line—mounting and dismounting disk groups, adding disk groups, adding or deleting disk group members, and so forth. Figure 4-22 shows the ASM administration page, whereas Figure 4-23 shows the statistics and options for the disk group DATA. FIGURE 4-20 EM Database Control ASM instance login page
- Chapter 4: Physical Database Layouts and Storage Management 115FIGURE 4-21 EM Database Control ASM instance home pageFIGURE 4-22 EM Database Control ASM disk group administration page
- 116 Oracle Database 11g DBA Handbook FIGURE 4-23 EM Database Control ASM disk group statistics On the page in Figure 4-23 you can see that the new disk in the disk group is significantly smaller than the other disks in the group; this may affect the performance and waste disk space within the disk group. To remove a failure group using EM Database Control, select the member disk’s check box and click the Remove button. Other EM Database Control ASM–related pages show I/O response time for the disk group, the templates defined for the disk group, the initialization parameters in effect for this ASM instance, and more. Using the asmcmd Command The asmcmd utility, new to Oracle 10g Release 2, is a command-line utility that provides you an easy way to browse and maintain objects within ASM disk groups by using a command set similar to Linux shell commands such as ls and mkdir. The hierarchical nature of objects maintained by the ASM instance lends itself to a command set similar to what you would use to browse and maintain files in a Linux file system. Before you can use asmcmd, you must ensure that the environment variables ORACLE_BASE, ORACLE_HOME, and ORACLE_SID are set to point to the ASM instance; for the ASM instance used in this chapter, these variables are set as follows: ORACLE_BASE=/u01/app/oracle ORACLE_HOME=/u01/app/oracle/product/11.1.0/db_1 ORACLE_SID=+ASM
- Chapter 4: Physical Database Layouts and Storage Management 117 In addition, you must be logged into the operating system as a user in the dba group, sincethe asmcmd utility connects to the database with SYSDBA privileges. The operating system useris usually oracle but can be any other user in the dba group. You can use asmcmd one command at a time by using the format asmcmd command, oryou can start asmcmd interactively by typing just asmcmd at the Linux shell prompt. To get alist of available commands, use help from the ASMCMD> prompt, and help command atthe ASMCMD> prompt for more details. Table 4-7 lists the asmcmd commands and a briefdescription of their purpose; the asmcmd commands available only in Oracle Database 11gare noted in the last column. When you start asmcmd, you start out at the root node of the ASM instance’s file system;unlike in a Linux file system, the root node is designated by a plus sign (+) instead of a leadingforward slash (/), although subsequent directory levels use a forward slash. In this example, you asmcmd Command 11g Only Description cd Change the directory to the specified directory. cp Y Copy files between ASM disk groups, both in the same instance and in remote instances. du Recursively displays total disk space usage for the current directory and all subdirectories. exit Terminate asmcmd and return to the operating system shell prompt. find Find all occurrences of the name (using wildcards as well), starting with the specified directory. help List the asmcmd commands. ls List the contents of the current directory. lsct Lists information about current ASM client databases. lsdg Lists all disk groups and their attributes. lsdsk Y Lists all disks visible to this ASM instance. md_backup Y Create metadata backup script for specified disk groups. md_restore Y Restore disk groups from a backup. mkalias Creates an alias for system-generated ASM filenames. mkdir Create an ASM directory. pwd Display the current ASM directory. remap Y Repair a range of corrupted or damaged physical blocks on a disk. rm Remove ASM files or directories. rmalias Remove an ASM alias, but not the target of the alias.TABLE 4-7 asmcmd Command Summary
- 118 Oracle Database 11g DBA Handbook start asmcmd and query the existing disk groups, along with the total disk space used within all disk groups: [oracle@dw ~]$ asmcmd ASMCMD> ls –l State Type Rebal Unbal Name MOUNTED NORMAL N N DATA/ MOUNTED HIGH N N DATA2/ MOUNTED NORMAL N N RECOV/ ASMCMD> du Used_MB Mirror_used_MB 2143 4399 ASMCMD> pwd + ASMCMD> As with the Linux shell ls command, you can append –l to get a more detailed listing of the objects retrieved by the command. The ls command shows the three disk groups in the ASM instance used throughout this chapter, +DATA, +DATA2, and +RECOV. Note also that the du command only shows the used disk space and total disk space used across mirrored disk groups; to get the amount of free space in each disk group, use the lsdg command instead. In this example, you want to find all files that have the string user in the filename: ASMCMD> pwd + ASMCMD> find . user* +DATA/DW/DATAFILE/USERS.259.627432977 +DATA/DW/DATAFILE/USERS2.267.627782171 +DATA/purch/users.dbf +DATA2/DW/DATAFILE/USERS3.256.627786775 ASMCMD> ls -l +DATA/purch/users.dbf Type Redund Striped Time Sys Name N users.dbf => +DATA/DW/DATAFILE/USERS.259.627432977 ASMCMD> Note the line with +DATA/purch/users.dbf: the find command finds all ASM objects; in this case, it finds an alias as well as datafiles that match the pattern. Finally, you can perform file backups to external file systems or even other ASM instances. In this example, you use the cp command to back up the database’s SPFILE to the /tmp directory on the host’s file system: ASMCMD> pwd +data/DW ASMCMD> ls CONTROLFILE/ DATAFILE/ ONLINELOG/ PARAMETERFILE/ TEMPFILE/
- Chapter 4: Physical Database Layouts and Storage Management 119spfiledw.oraASMCMD> cp spfiledw.ora /tmp/BACKUPspfiledw.orasource +data/DW/spfiledw.oratarget /tmp/BACKUPspfiledw.oracopying file(s)...file, /tmp/BACKUPspfiledw.ora, copy committed.ASMCMD> exit[oracle@dw ~]$ ls -l /tmp/BACKUP*-rw-r----- 1 oracle oinstall 2560 Jul 13 09:47 /tmp/BACKUPspfiledw.ora[oracle@dw ~]$ This example also shows how all database files for the database dw are stored within the ASMfile system. It looks like they are stored on a traditional host file system, but instead managed byASM, providing built-in performance and redundancy features (optimized for use with OracleDatabase 11g) making the DBA’s life a bit easier when it comes to datafile management.
- This page intentionally left blank
- PART IIDatabase Management
- This page intentionally left blank
- CHAPTER 5Developing and Implementing Applications 123
- 124 Oracle Database 11g DBA Handbook anaging application development can be a difficult process. From a DBA’s M perspective, the best way to manage the development process is to become an integral part of teams involved in the process. In this chapter, you will learn the guidelines for migrating applications into databases and the technical details needed for implementation, including the sizing of database objects. This chapter focuses on the design and creation of applications that use the database. These activities should be integrated with the database-planning activities described in Chapter 3 and Chapter 4. The following chapters in this part of the book address the monitoring and tuning activities that follow the database creation. Implementing an application in a database by merely running a series of create table commands fails to integrate the creation process with the other major areas (planning, monitoring, and tuning). The DBA must be involved in the application development process in order to correctly design the database that will support the end product. The methods described in this chapter will also provide important information for structuring the database monitoring and tuning efforts. The first section of this chapter addresses overall design and implementation considerations that directly address performance. The following sections focus on implementation details such as resource management, using stored outlines, sizing tables and indexes, quiescing the database for maintenance activities, and managing packaged applications. Tuning by Design: Best Practices At least 50 percent of the time—conservatively—performance problems are designed into an application. During the design of the application and the related database structures, the application architects may not know all the ways in which the business will use the application data over time. As a result, there may be some components whose performance is poor during the initial release, whereas other problems will appear later as the business usage of the application changes and increases. In some cases, the fix will be relatively straightforward—changing an initialization parameter, adding an index, or rescheduling large operations. In other cases, the problem cannot be fixed without altering the application’s architecture. For example, an application may be designed to heavily reuse functions for all data access—so that functions call other functions, which call additional functions, even to perform the simplest database actions. As a result, a single database call may result in tens of thousands of function calls and database accesses. Such an application will usually not scale well; as more users are added to the system, the CPU burden of the number of executions per user will slow the performance for the individual users. Tuning the individual SQL statements executed as part of that application may yield little performance benefit; the statements themselves may be well-tuned already. Rather, it is the sheer number of executions that leads to the performance problem. The following best practices may seem overly simplistic, but they are violated over and over in database applications, and those violations directly result in performance problems. There are always exceptions to the rules—the next change to your software or environment may allow you to violate the rules without affecting your performance. In general, though, following these rules will allow you to meet performance requirements as the application usage increases. Do As Little As Possible End users do not care, in general, if the underlying database structures are fully normalized to Third Normal Form or if they are laid out in compliance with object-oriented standards. Users want to perform a business process, and the database application should be a tool that helps that
- Chapter 5: Developing and Implementing Applications 125business process complete as quickly as possible. The focus of your design should not be theachievement of theoretical design perfection; it should always be on the end user’s ability to dohis or her job. Therefore, you should simplify the processes involved at every step in the application. This can be a difficult point to negotiate with application development teams. If applicationdevelopment teams or enterprise architects insist on perfectly normalized data models, DBAsshould point out the number of database steps involved in even the simplest transaction. Forexample, inserts for a complex transaction (such as a line item for an invoice) may involve manycode table lookups as well as multiple inserts. For a single user this may not present a problem,but with many concurrent users this design may lead to performance issues or locking issues.From a performance-planning perspective, inserts should involve as few tables as possible, andqueries should retrieve data that is already stored in a format that is as close as possible to thefinal format requested by the users. Fully normalized databases and object-oriented designs tendto require a high number of joins during complex queries. Although you should strive to maintaina manageable data model, the first emphasis should be on the functionality of the application andits ability to meet the business’s performance needs.In Your Application Design, Strive to Eliminate Logical ReadsIn the past, there was a heavy focus on eliminating physical reads—and although this is still agood idea, no physical reads occur unless logical reads require them. Let’s take a simple example. Select the current time from DUAL. If you select down to thesecond level, the value will change 86,400 times per day. Yet there are application designers whorepeatedly perform this query, executing it millions of times per day. Such a query likely performsfew physical reads throughout the day. Therefore, if you are focused solely on tuning the physicalI/O, you would likely disregard it. However, it can significantly impact the performance of theapplication. How? By using the CPU resources available. Each execution of the query will forceOracle to perform work, using processing power to find and return the correct data. As more andmore users execute the command repeatedly, you may find that the number of logical reads usedby the query exceeds all other queries. In some cases, multiple processors on the server arededicated to servicing repeated small queries of this sort. If multiple users need to read thesame data, you should store it in a table or in a package variable. NOTE As of Oracle Database 10g, the DUAL table is an internal table, not a physical table, and therefore does not generate consistent gets as long as you don’t use * as the column list in a query referencing DUAL. Consider the following real-world example. A programmer wanted to implement a pausein a program, forcing it to wait 30 seconds between two steps. Because the performance ofthe environment would not be consistent over time, the programmer coded the routine in thefollowing format (shown in pseudocode):perform Step 1select SysDate from DUAL into a StartTime variablebegin loop select SysDate from DUAL in a CurrentTime variable; Compare CurrentTime with the StartTime variable value. If 30 seconds have passed, exit the loop; Otherwise repeat the loop, calculating SysDate again.end loopPerform Step 2.
- 126 Oracle Database 11g DBA Handbook Is this a reasonable approach? Absolutely not! It will do what the developer wanted, but at a significant cost to the application. What’s more, there is nothing a database administrator can do to improve its performance. In this case, the cost will not be due to I/O activity—the DUAL table will stay in the instance’s memory area—but rather due to CPU activity. Every time this program is run, by every user, the database will spend 30 seconds consuming as many CPU resources as the system can support. In this particular case the select SysDate from DUAL query accounts for over 40 percent of all the CPU time used by the application. All of that CPU time is wasted. Tuning the database initialization parameters will not solve the problem. Tuning the individual SQL statement will not help; the application design must be revised to eliminate the needless execution of commands. For instance, in this case the developer could have used a sleep command at the operating system level or within a PL/SQL program using the DBMS_LOCK.SLEEP() procedure to enforce the same behavior without the database accesses. For those who favor tuning based on the buffer cache hit ratio, this database has a hit ratio of almost 100 percent due to the high number of completely unnecessary logical reads without related physical reads. The buffer cache hit ratio compares the number of logical reads to the number of physical reads; if 10 percent of the logical reads require physical reads, the buffer cache hit ratio is 90 percent. Low hit ratios identify databases that perform a high number of physical reads; extremely high hit ratios such as found in this example may identify databases that perform an excessive number of logical reads. You must look beyond the buffer cache hit ratio to the commands that are generating the logical reads and the physical reads. In Your Application Design, Strive to Avoid Trips to the Database Remember that you are tuning an application, not a query. When tuning database operations, you may need to combine multiple queries into a single procedure so that the database can be visited once rather than multiple times for each screen. This bundled-query approach is particularly relevant for “thin-client” applications that rely on multiple application tiers. Look for queries that are interrelated based on the values they return, and see if there are opportunities to transform them into single blocks of code. The goal is not to make a monolithic query that will never complete; the goal is to avoid doing work that does not need to be done. In this case, the constant back- and-forth communication between the database server, the application server, and the end user’s computer is targeted for tuning. This problem is commonly seen on complex data-entry forms in which each field displayed on the screen is populated via a separate query. Each of those queries is a separate trip to the database. As with the example in the previous section, the database is forced to execute large numbers of related queries. Even if each of those queries is tuned, the burden from the number of commands—multiplied by the number of users—will consume the CPU resources available on the server. Such a design may also impact the network usage, but the network is seldom the problem—the issue is the number of times the database is accessed. Within your packages and procedures, you should strive to eliminate unnecessary database accesses. Store commonly needed values in local variables instead of repeatedly querying the database. If you don’t need to make a trip to the database for information, don’t make it. That sounds simple, but you would be amazed at how often application developers fail to consider this advice. There is no initialization parameter that can make this change take effect. It is a design issue and requires the active involvement of developers, designers, DBAs, and application users in the application performance planning and tuning process.
- Chapter 5: Developing and Implementing Applications 127For Reporting Systems, Store the Data the Way the Users Will Query ItIf you know the queries that will be executed—such as via parameterized reports—you shouldstrive to store the data so that Oracle will do as little work as possible to transform the format ofthe data in your tables into the format presented to the user. This may require the creation andmaintenance of materialized views or reporting tables. That maintenance is, of course, extra workfor the database and DBA to perform—but it is performed in batch mode and does not directlyaffect the end user. The end user, on the other hand, benefits from the ability to perform the queryfaster. The database as a whole will perform fewer logical and physical reads because the accessesto the base tables to populate and refresh the materialized views are performed infrequently whencompared to the end-user queries against the views.Avoid Repeated Connections to the DatabaseOpening a database connection may take more time than the commands you execute withinthat connection. If you need to connect to the database, keep the connection open and reusethe connection. See Chapter 15 for more information on Oracle Net and optimizing databaseconnections. One application designer took normalization to the extreme, moving all code tables into theirown database. As a result, most operations in the order-processing system repeatedly openeddatabase links to access the code tables, thus severely hampering the performance of the application.Again, tuning the database initialization parameters is not going to lead to the greatest performancebenefit; the application is slow by design.Use the Right IndexesIn an effort to eliminate physical reads, some application developers create numerous indexeson every table. Aside from their impact on data load times, many of the indexes may never beneeded to support queries. In OLTP applications, you should not use bitmap indexes; if a columnhas few distinct values, you should consider leaving it unindexed. The optimizer supports “skip-scan” index accesses, so it may choose an index on a set of columns even if the leading columnof the index is not a limiting condition for the query.Do It As Simply As PossibleOnce you have eliminated the performance costs of unnecessary logical reads, unneeded databasetrips, unmanaged connections, and inappropriate indexes, take a look at the commands that remain.Go AtomicYou can use SQL to combine many steps into one large query. In some cases, this may benefityour application—you can create stored procedures and reuse the code and thus reduce thenumber of database trips performed. However, you can take this too far, creating large queriesthat fail to complete quickly enough. These queries commonly include multiple sets of groupingoperations, inline views, and complex multirow calculations against millions of rows. If you are performing batch operations, you may be able to break such a query into its atomiccomponents, creating temporary tables to store the data from each step. If you have an operationthat takes hours to complete, you almost always can find a way to break it into smallercomponent parts. Divide and conquer the performance problem.
- 128 Oracle Database 11g DBA Handbook For example, a batch operation may combine data from multiple tables, perform joins and sorts, and then insert the result into a table. On a small scale, this may perform satisfactorily. On a large scale, you may have to divide this operation into multiple steps: 1. Create a work table. Insert rows into it from one of the source tables for the query, selecting only those rows and columns that you care about later in the process. 2. Create a second work table for the columns and rows from the second table. 3. Create any needed indexes on the work tables. Note that all the steps to this point can be parallelized—the inserts, the queries of the source tables, and the creation of the indexes. 4. Perform the join, again parallelized. The join output may go into another work table. 5. Perform any sorts needed. Sort as little data as possible. 6. Insert the data into the target table. Why go through all these steps? Because you can tune them individually, you may be able to tune them to complete much faster individually than Oracle can complete them as a single command. For batch operations, you should consider making the steps as simple as possible. You will need to manage the space allocated for the work tables, but this approach can generate significant benefits to your batch-processing performance. Eliminate Unnecessary Sorts As part of the example in the preceding section, the sort operation was performed last. In general, sort operations are inappropriate for OLTP applications. Sort operations do not return any rows to the user until the entire set of rows is sorted. Row operations, on the other hand, return rows to the user as soon as those rows are available. Consider the following simple test: Perform a full table scan of a large table. As soon as the query starts to execute, the first rows are displayed. Now, perform the same full table scan but add an order by clause on an unindexed column. No rows will be displayed until all the rows have been sorted. Why does this happen? Because for the second query Oracle performs a SORT ORDER BY operation on the results of the full table scan. Because it is a set operation, the set must be completed before the next operation is performed. Now, imagine an application in which there are many queries executed within a procedure. Each of the queries has an order by clause. This turns into a series of nested sorts—no operation can start until the one before it completes. Note that union operations perform sorts. If it is appropriate for the business logic, use a union all operation in place of a union, because a union all does not perform a sort. NOTE A union all operation does not eliminate duplicate rows from the result set, so it may generate more rows—and therefore different results—than a union. Eliminate the Need to Query Undo Segments When performing a query, Oracle will need to maintain a read-consistent image of the rows queried. If a row is modified by another user, the database will need to query the undo segment to see the row as it existed at the time your query began. Application designs that call for queries to frequently access data that others may be changing at the same time force the database to do more work—it has to look in multiple locations for one piece of data. Again, this is a design
- Chapter 5: Developing and Implementing Applications 129issue. DBAs may be able to configure the undo segment areas to reduce the possibility of queriesencountering “Snapshot too old” errors, but correcting the fundamental problem requires achange to the application design.Tell the Database What It Needs to KnowOracle’s optimizer relies on statistics when it evaluates the thousands of possible paths to takeduring the execution of a query. How you manage those statistics can significantly impact theperformance of your queries.Keep Your Statistics UpdatedHow often should you gather statistics? With each major change to the data in your tables, youshould reanalyze the tables. If you have partitioned the tables, you can analyze them on apartition-by-partition basis. As of Oracle Database 10g, you can use the Automatic StatisticsGathering feature to automate the collection of statistics. By default, that process gathers statisticsduring a maintenance window from 10 P.M to 6 A.M. each night and all day on weekends. Ofcourse, manual statistics gathering is still available when you have volatile tables that are beingdropped or deleted during the day, or when bulk-loaded tables increase in size by more than10 percent. Because the analysis job is usually a batch operation performed after hours, you can tune itby improving sort and full table scan performance at the session level. If you are performing theanalysis manually, increase the settings for the DB_FILE_MULTIBLOCK_READ_COUNT parameterat the session level or the PGA_AGGREGATE_TARGET parameter at the system level to gatheringthe statistics. If you are not using PGA_AGGREGATE_TARGET or do not want to modify a system-wide setting, increase SORT_AREA_SIZE (which is modifiable at the session level) instead. Theresult will be enhanced performance for the sorts and full table scans the analysis performs. CAUTION Increasing the DB_FILE_MULTIBLOCK_READ_COUNT in a RAC database environment can cause performance problems when too many blocks are shipped across the interconnect.Hint Where NeededIn most cases, the cost-based optimizer (CBO) selects the most efficient execution path for queries.However, you may have information about a better path. You may give Oracle a hint to influencethe join operations, the overall query goal, the specific indexes used, or the parallelism of the query.Maximize the Throughput in the EnvironmentIn an ideal environment, there is never a need to query information outside the buffer cache; allof the data stays in memory all of the time. Unless you are working with a very small database,however, this is not a realistic approach. In this section, you will see guidelines for maximizingthe throughput of the environment.Use Disk CachingIf Oracle cannot find the data it needs in the buffer cache or PGA, it performs a physical read. Buthow many of the physical reads actually reach the disk? If you use disk caching, you may be ableto prevent 90 percent or more of the access requests for the most-needed blocks. If the databasebuffer cache hit ratio is 90 percent, you are accessing the disks 10 percent of the time—and if the
- 130 Oracle Database 11g DBA Handbook disk cache prevents 90 percent of those requests from reaching the disk, your effective hit ratio is 99 percent. Oracle’s internal statistics do not reflect this improvement; you will need to work with your disk administrators to configure and monitor the disk cache. Use a Larger Database Block Size There is only one reason not to use the largest block size available in your environment for a new database: if you cannot support a greater number of users performing updates and inserts against a single block. Other than that, increasing the database block size should improve the performance of almost everything in your application. Larger database block sizes help keep indexes from splitting levels and help keep more data in memory longer. If you are experiencing buffer busy waits during inserts, increase the settings for the freelists parameter setting at the object level (if you are using Automatic Segment Space Management, the freelists parameter does not apply). Design to Throughput, Not Disk Space Take an application that is running on eight 9GB disks and move it to a single 72GB disk. Will the application run faster or slower? In general, it will run slower because the throughput of the single disk is unlikely to be equal to the combined throughput of the eight separate disks. Rather than designing your disk layout based on the space available (a common method), design it based on the throughput of the disks available. You may decide to use only part of each disk. The remaining space on the disk will not be used by the production application unless the throughput available for that disk improves. Avoid the Use of the Temporary Segments Whenever possible, perform all sorts in memory. Any operation that writes to the temporary segments is potentially wasting resources. Oracle uses temporary segments when the SORT_ AREA_SIZE parameter (or PGA_AGGREGATE_TARGET, if it is used) does not allocate enough memory to support the sorting requirements of operations. Sorting operations include index creations, order by clauses, statistics gathering, group by operations, and some joins. As noted earlier in this chapter, you should strive to sort as few rows as possible. When performing the sorts that remain, perform them in memory. Favor Fewer, Faster Processors Given the choice, use a small number of fast processors in place of a larger number of slower processors. The operating system will have fewer processing queues to manage and will generally perform better. Divide and Conquer Your Data If you cannot avoid performing expensive operations on your database, you can attempt to split the work into more manageable chunks. Often you can severely limit the number of rows acted on by your operations, substantially improving performance. Use Partitions Partitions can benefit end users, DBAs, and application support personnel. For end users, there are two potential benefits: improved query performance and improved availability for the database. Query performance may improve because of partition elimination. The optimizer knows what partitions may contain the data requested by a query. As a result, the partitions that will not participate are eliminated from the query process. Because fewer logical and physical reads are needed, the query should complete faster.
- Chapter 5: Developing and Implementing Applications 131 NOTE The Partitioning Option is an extra-cost option for the Enterprise Edition of the database software. The availability improves because of the benefits partitions generate for DBAs and applicationsupport personnel. Many administrative functions can be performed on single partitions, allowingthe rest of the table to be unaffected. For example, you can truncate a single partition of a table.You can split a partition, move it to a different tablespace, or switch it with an existing table (sothat the previously independent table is then considered a partition). You can gather statistics onone partition at a time. All these capabilities narrow the scope of administrative functions, reducingtheir impact on the availability of the database as a whole.Use Materialized ViewsYou can use materialized views to divide the types of operations users perform against your tables.When you create a materialized view, you can direct users to query the materialized view directlyor you can rely on Oracle’s query rewrite capability to redirect queries to the materialized view.As a result, you will have two copies of the data—one that services the input of new transactionaldata, and a second (the materialized view) that services queries. As a result, you can take one ofthem offline for maintenance without affecting the availability of the other. Also, the materializedview can pre-join tables and pre-generate aggregations so that user queries perform as little workas possible.Use ParallelismAlmost every major operation can be parallelized—including queries, inserts, object creations,and data loads. The parallel options allow you to involve multiple processors in the execution ofa single command, effectively dividing the command into multiple smaller coordinated commands.As a result, the command may perform better. You can specify a degree of parallelism at the objectlevel and can override it via hints in your queries.Test CorrectlyIn most development methodologies, application testing has multiple phases, including moduletesting, full system testing, and performance stress testing. Many times, the full system test andperformance stress test are not performed adequately due to time constraints as the applicationnears its delivery deadline. The result is that applications are released into production without anyway to guarantee that the functionality and performance of the application as a whole will meetthe needs of the users. This is a serious and significant flaw and should not be tolerated by anyuser of the application. Users do not need just one component of the application to functionproperly; they need the entire application to work properly in support of a business process.If they cannot do a day’s worth of business in a day, the application fails. This is a key tenet regarding identifying the need for tuning: If the application slows the speedof the business process, it should be tuned. The tests you perform must be able to determine if theapplication will hinder the speed of the business process under the expected production load.Test with Large Volumes of DataAs described earlier in this chapter, objects within the database function differently after they havebeen used for some time. For example, a table’s pctfree and pctused settings may make it likely thatblocks will be only half-used or rows will be chained. Each of these scenarios causes performanceproblems that will only be seen after the application has been used for some time.
- 132 Oracle Database 11g DBA Handbook A further problem with data volume concerns indexes. As a B-tree index grows in size, it may split internally—the level of entries within the index increases. As a result, you can picture the new level as being an index within the index. The additional level in the index increases the negative effect of the index on data load rates. You will not see this impact until after the index is split. Applications that work acceptably for the first week or two in production only to suddenly falter after the data volume reaches critical levels do not support the business needs. In testing, there is no substitute for production data loaded at production rates while the tables already contain a substantial amount of data. Test with Many Concurrent Users Testing with a single user does not reflect the expected production usage of most database applications. You must be able to determine if concurrent users will encounter deadlocks, data consistency issues, or performance problems. For example, suppose an application module uses a work table during its processing. Rows are inserted into the table, manipulated, and then queried. A separate application module does similar processing—and uses the same table. When executed at the same time, the two processes attempt to use each other’s data. Unless you are testing with multiple users executing multiple application functions simultaneously, you may not discover this problem and the business data errors it will generate. Testing with many concurrent users will also help to identify areas in the application where users frequently use undo segments to complete their queries, thus impacting performance. Test the Impact of Indexes on Your Load Times Every insert, update, or delete of an indexed column may be slower than the same transaction against an unindexed table. There are some exceptions—sorted data has much less of an impact, for example—but the rule is generally true. The impact is dependent on your operating environment, the data structures involved, and the degree to which the data is sorted. How many rows per second can you insert in your environment? Perform a series of simple tests. Create a table with no indexes and insert a large number of rows into it. Repeat the tests to reduce the impact of physical reads on the timing results. Calculate the number of rows inserted per second. In most environments you can insert tens of thousands of rows per second into the database. Perform the same test in your other database environments so you can identify any that are significantly different from the others. Now consider your application. Are you able to insert rows into your tables via your application at anywhere near the rate you just calculated? Many applications run at less than 5 percent of the rate the environment will support. They are bogged down by unneeded indexes or the type of code design issues described earlier in this chapter. If your application’s load rate decreases—say, from 40 rows per second to 20 rows per second—your tuning focus should not be solely on how that decrease occurred but also on how the application managed to get only 40 rows per second inserted in an environment that supports thousands of rows inserted per second. Make All Tests Repeatable Most regulated industries have standards for tests. Their standards are so reasonable that all testing efforts should follow them. Among the standards is that all tests must be repeatable. To be compliant with the standards, you must be able to re-create the data set used, the exact action performed, the exact result expected, and the exact result seen and recorded. Pre-production tests for validation of the application must be performed on the production hardware. Moving the application to different hardware requires retesting the application. The tester and the business users must sign off on all tests.
- Chapter 5: Developing and Implementing Applications 133 Most people, on hearing those restrictions, would agree that they are good steps to take inany testing process. Indeed, your business users may be expecting that the people developing theapplication are following such standards, even if they are not required by the industry. But arethey followed? And if not, then why not? The two commonly cited reasons for not following suchstandards are time and cost. Such tests require planning, personnel resources, business userinvolvement, and time for execution and documentation. Testing on production-caliber hardwaremay require the purchase of additional servers. Those are the most evident costs—but what is thebusiness cost of failing to perform such tests? The testing requirements for validated systems insome health industries were implemented because those systems directly impact the integrity ofcritical products such as the safety of the blood supply. If your business has critical componentsserved by your application (and if it does not, then why are you building the application?), youmust consider the costs of insufficient, rushed testing and communicate those potential costs tothe business users. The evaluation of the risks of incorrect data or unacceptably slow performancemust involve the business users. In turn, that may lead to an extended deadline to support propertesting. In many cases, the rushed testing cycle occurs because a testing standard was not in place atthe start of the project. If there is a consistent, thorough, and well-documented testing standard inplace at the enterprise level when the project starts, the testing cycle will be shorter when it isfinally executed. Testers will have known long in advance that repeatable data sets will be needed.Templates for tests will be available. If there is an issue with any test result, or if the applicationneeds to be retested following a change, the test can be repeated. Also, the application userswill know that the testing is robust enough to simulate the production usage of the application.In addition, the testing environment must support automation of tasks that will be automatedin production, especially if the developers used many manual processes in the developmentenvironment. If the system fails the tests for performance reasons, the problem may be a designissue (as described in the previous sections) or a problem with an individual query.Standard DeliverablesHow do you know if an application is ready to be migrated to a production environment? Theapplication development methodology must clearly define, both in format and in level of detail,the required deliverables for each stage of the life cycle. These should include specifications foreach of the following items: ■ Entity relationship diagram ■ Physical database diagram ■ Space requirements ■ Tuning goals for queries and transaction processing ■ Security requirements ■ Data requirements ■ Query execution plans ■ Acceptance test procedures In the following sections, you will see descriptions of each of these items.
- 134 Oracle Database 11g DBA Handbook Entity Relationship Diagram The entity relationship (E-R) diagram illustrates the relationships that have been identified among the entities that make up the application. E-R diagrams are critical for providing an understanding of the goals of the system. They also help to identify interface points with other applications and to ensure consistency in definitions across the enterprise. Physical Database Diagram A physical database diagram shows the physical tables generated from the entities and the columns generated from the defined attributes in the logical model; most, if not all, data modeling tools support the automatic translation of a logical database diagram to the physical database design. A physical database diagramming tool is usually capable of generating the DDL necessary to create the application’s objects. You can use the physical database diagram to identify tables that are most likely to be involved in transactions. You should also be able to identify which tables are commonly used together during a data entry or query operation. You can use this information to effectively plan the distribution of these tables (and their indexes) across the available physical devices to reduce the amount of I/O contention encountered. In data warehousing applications, the physical database diagram should show the aggregations and materialized views accessed by user queries. Although they contain derived data, they are critical components of the data access path and must be documented. Space Requirements The space requirements deliverable should show the initial space requirements for each database table and index. The recommendations for the proper size of tables, clusters, and indexes are shown in the “Sizing Database Objects” section later in this chapter. Tuning Goals for Queries and Transaction Processing Changes to the application design may have significant impact on the application’s performance. Application design choices may also directly affect your ability to tune the application. Because application design has such a great effect on the DBA’s ability to tune its performance, the DBA must be involved in the design process. You must identify the performance goals of a system before it goes into production. The role of expectation in perception cannot be overemphasized. If the users have an expectation that the system will be at least as fast as an existing system, anything less will be unacceptable. The estimated response time for each of the most-used components of the application must be defined and approved. It is important during this process to establish two sets of goals: reasonable goals and “stretch” goals. Stretch goals represent the results of concentrated efforts to go beyond the hardware and software constraints that limit the system’s performance. Maintaining two sets of performance goals helps to focus efforts on those goals that are truly mission-critical versus those that are beyond the scope of the core system deliverables. In terms of the goals, you should establish control boundaries for query and transaction performance; the application performance will be judged to be “out of control” if the control boundaries are crossed. Security Requirements The development team must specify the account structure the application will use, including the ownership of all objects in the application and the manner in which privileges will be granted. All roles and privileges must be clearly defined. The deliverables from this section will be used to
- Chapter 5: Developing and Implementing Applications 135generate the account and privilege structure of the production application (see Chapter 9 for a fullreview of Oracle’s security capabilities). Depending on the application, you may need to specify the account usage for batch accountsseparately from that of online accounts. For example, the batch accounts may use the database’sautomatic login features, whereas the online users have to manually sign in. Your security plansfor the application must support both types of users. Like the space requirements deliverable, security planning is an area in which the DBA’sinvolvement is critical. The DBA should be able to design an implementation that meets theapplication’s needs while fitting in with the enterprise database security plan.Data RequirementsThe methods for data entry and retrieval must be clearly defined. Data-entry methods must betested and verified while the application is in the test environment. Any special data-archivingrequirements of the application must also be documented because they will be application specific. You must also describe the backup and recovery requirements for the application. Theserequirements can then be compared to the enterprise database backup plans (see Chapter 11 forguidelines). Any database recovery requirements that go beyond the site’s standard will requiremodifying the site’s backup standard or adding a module to accommodate the application’s needs.Query Execution PlansExecution plans are the steps that the database will go through while executing queries. They aregenerated via the explain plan or set autotrace commands, as described in Chapter 8. Recordingthe execution plans for the most important queries against the database will aid in planningthe index usage and tuning goals for the application. Generating them prior to productionimplementation will simplify tuning efforts and identify potential performance problems beforethe application is released. Generating the explain plans for your most important queries willalso facilitate the process of performing code reviews of the application. If you are implementing a third-party application, you may not have visibility to all the SQLcommands the application is generating. As described in Chapter 8, you can Oracle’s automatedtuning and monitoring utilities to identify the most resource-intensive queries performed betweentwo points in time; many of the new automated tuning features introduced in Oracle Database10g are enhanced in Oracle Database 11g, such as the capability to store Automatic WorkloadRepository (AWR) baselines in addition to automatically create SQL profiles.Acceptance Test ProceduresDevelopers and users should very clearly define what functionality and performance goals mustbe achieved before the application can be migrated to production. These goals will form thefoundation of the test procedures that will be executed against the application while it is in thetest environment. The procedures should also describe how to deal with unmet goals. The procedures shouldvery clearly list the functional goals that must be met before the system can move forward. Asecond list of non-critical functional goals should also be provided. This separation of functionalcapabilities will aid in both resolving scheduling conflicts and structuring appropriate tests. NOTE As part of acceptance testing, all interfaces to the application should be tested and their input and output verified.
- 136 Oracle Database 11g DBA Handbook Resource Management and Stored Outlines You can use stored outlines to migrate execution paths between databases, and you can use the Database Resource Manager to control the allocation of system resources among database users. Stored outlines and resource management are important components in a managed development environment. The Database Resource Manager gives DBAs more control over the allocation of system resources than is possible with operating system controls alone. NOTE As of Oracle 10g, you can use SQL profiles to further refine the execution path selected. Implementing the Database Resource Manager You can use the Database Resource Manager to allocate percentages of system resources to classes of users and jobs. For example, you could allocate 75 percent of the available CPU resources to your online users, leaving 25 percent to your batch users. To use the Database Resource Manager, you will need to create resource plans, resource consumer groups, and resource plan directives. Prior to using the Database Resource Manager commands, you must create a “pending area” for your work. To create a pending area, use the CREATE_PENDING_AREA procedure of the DBMS_ RESOURCE_MANAGER package. When you have completed your changes, use the VALIDATE_ PENDING_AREA procedure to check the validity of the new set of plans, subplans, and directives. You can then either submit the changes (via SUBMIT_PENDING_AREA) or clear the changes (via CLEAR_PENDING_AREA). The procedures that manage the pending area do not have any input variables, so a sample creation of a pending area uses the following syntax: execute DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA(); If the pending area is not created, you will receive an error message when you try to create a resource plan. To create a resource plan, use the CREATE_PLAN procedure of the DBMS_RESOURCE_ MANAGER package. The syntax for the CREATE_PLAN procedure is shown in the following listing: CREATE_PLAN (plan IN VARCHAR2, comment IN VARCHAR2, cpu_mth IN VARCHAR2 DEFAULT EMPHASIS, active_sess_pool_mth IN VARCHAR2 DEFAULT ACTIVE_SESS_POOL_ABSOLUTE, parallel_degree_limit_mth IN VARCHAR2 DEFAULT PARALLEL_DEGREE_LIMIT_ABSOLUTE, queueing_mth IN VARCHAR2 DEFAULT FIFO_TIMEOUT) When you create a plan, give the plan a name (in the plan variable) and a comment. By default, the CPU allocation method will use the “emphasis” method, allocating CPU resources based on percentage. The following example shows the creation of a plan called DEVELOPERS: execute DBMS_RESOURCE_MANAGER.CREATE_PLAN - (Plan => DEVELOPERS, - Comment => Developers, in Development database);
- Chapter 5: Developing and Implementing Applications 137 NOTE The hyphen (-) character is a continuation character in SQL*Plus, allowing a single command to span multiple lines. In order to create and manage resource plans and resource consumer groups, you must havethe ADMINISTER_RESOURCE_MANAGER system privilege enabled for your session. DBAs havethis privilege with the with admin option. To grant this privilege to non-DBAs, you must executethe GRANT_SYSTEM_PRIVILEGE procedure of the DBMS_RESOURCE_MANAGER_PRIVSpackage. The following example grants the user MARTHAG the ability to manage the DatabaseResource Manager:execute DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SYSTEM_PRIVILEGE - (grantee_name => MarthaG, - privilege_name => ADMINISTER_RESOURCE_MANAGER, - admin_option => TRUE);You can revoke MARTHAG’s privileges via the REVOKE_SYSTEM_PRIVILEGE procedure of theDBMS_RESOURCE_MANAGER package. With the ADMINISTER_RESOURCE_MANAGER privilege enabled, you can create a resourceconsumer group using the CREATE_CONSUMER_GROUP procedure within DBMS_RESOURCE_MANAGER. The syntax for the CREATE_CONSUMER_GROUP procedure is shown in thefollowing listing:CREATE_CONSUMER_GROUP (consumer_group IN VARCHAR2, comment IN VARCHAR2, cpu_mth IN VARCHAR2 DEFAULT ROUND-ROBIN) You will be assigning users to resource consumer groups, so give the groups names that arebased on the logical divisions of your users. The following example creates two groups—one foronline developers and a second for batch developers:execute DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP - (Consumer_Group => Online_developers, - Comment => Online developers);execute DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP - (Consumer_Group => Batch_developers, - Comment => Batch developers); Once the plan and resource consumer groups are established, you need to create resourceplan directives and assign users to the resource consumer groups. To assign directives to a plan,use the CREATE_PLAN_DIRECTIVE procedure of the DBMS_RESOURCE_MANAGER package.The syntax for the CREATE_PLAN_DIRECTIVE procedure is shown in the following listing:CREATE_PLAN_DIRECTIVE (plan IN VARCHAR2, group_or_subplan IN VARCHAR2, comment IN VARCHAR2, cpu_p1 IN NUMBER DEFAULT NULL, cpu_p2 IN NUMBER DEFAULT NULL,
- 138 Oracle Database 11g DBA Handbook cpu_p3 IN NUMBER DEFAULT NULL, cpu_p4 IN NUMBER DEFAULT NULL, cpu_p5 IN NUMBER DEFAULT NULL, cpu_p6 IN NUMBER DEFAULT NULL, cpu_p7 IN NUMBER DEFAULT NULL, cpu_p8 IN NUMBER DEFAULT NULL, active_sess_pool_p1 IN NUMBER DEFAULT UNLIMITED, queueing_p1 IN NUMBER DEFAULT UNLIMITED, parallel_degree_limit_p1 IN NUMBER DEFAULT NULL, switch_group IN VARCHAR2 DEFAULT NULL, switch_time IN NUMBER DEFAULT UNLIMITED, switch_estimate IN BOOLEAN DEFAULT FALSE, max_est_exec_time IN NUMBER DEFAULT UNLIMITED, undo_pool IN NUMBER DEFAULT UNLIMITED, max_idle_time IN NUMBER DEFAULT NULL, max_idle_time_blocker IN NUMBER DEFAULT NULL, switch_time_in_call IN NUMBER DEFAULT NULL); The multiple CPU variables in the CREATE_PLAN_DIRECTIVE procedure support the creation of multiple levels of CPU allocation. For example, you could allocate 75 percent of all your CPU resources (level 1) to your online users. Of the remaining CPU resources (level 2), you could allocate 50 percent to a second set of users. You could split the remaining 50 percent of resources available at level 2 to multiple groups at a third level. The CREATE_PLAN_DIRECTIVE procedure supports up to eight levels of CPU allocations. The following example shows the creation of the plan directives for the ONLINE_DEVELOPERS and BATCH_DEVELOPERS resource consumer groups within the DEVELOPERS resource plan: execute DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE - (Plan => DEVELOPERS, - Group_or_subplan => ONLINE_DEVELOPERS, - Comment => online developers, - Cpu_p1 => 75, - Cpu_p2=> 0, - Parallel_degree_limit_p1 => 12); execute DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE - (Plan => DEVELOPERS, - Group_or_subplan => BATCH_DEVELOPERS, - Comment => Batch developers, - Cpu_p1 => 25, - Cpu_p2 => 0, - Parallel_degree_limit_p1 => 6); In addition to allocating CPU resources, the plan directives restrict the parallelism of operations performed by members of the resource consumer group. In the preceding example, batch developers are limited to a degree of parallelism of 6, reducing their ability to consume system resources. Online developers are limited to a degree of parallelism of 12. To assign a user to a resource consumer group, use the SET_INITIAL_CONSUMER_GROUP procedure of the DBMS_RESOURCE_MANAGER package. The syntax for the SET_INITIAL_ CONSUMER_GROUP procedure is shown in the following listing:
- Chapter 5: Developing and Implementing Applications 139SET_INITIAL_CONSUMER_GROUP (user IN VARCHAR2, consumer_group IN VARCHAR2)If a user has never had an initial consumer group set via the SET_INITIAL_CONSUMER_GROUPprocedure, the user is automatically enrolled in the resource consumer group named DEFAULT_CONSUMER_GROUP. To enable the Resource Manager within your database, set the RESOURCE_MANAGER_PLANdatabase initialization parameter to the name of the resource plan for the instance. Resource planscan have subplans, so you can create tiers of resource allocations within the instance. If you donot set a value for the RESOURCE_MANAGER_PLAN parameter, resource management is notperformed in the instance. You can dynamically alter the instance to use a different resource allocation plan using theRESOURCE_MANAGER_PLAN initialization parameter: for example, you could create a resourceplan for your daytime users (DAYTIME_USERS) and a second for your batch users (BATCH_USERS). You could create a job that each day executes this command at 6:00 A.M.:alter system set resource_manager_plan = DAYTIME_USERS; Then at a set time in the evening, you could change consumer groups to benefit the batch users:alter system set resource_manager_plan = BATCH_USERS;The resource allocation plan for the instance will thus be altered without needing to shut downand restart the instance. When using multiple resource allocation plans in this fashion, you need to make sure youdon’t accidentally use the wrong plan at the wrong time. For example, if the database is downduring a scheduled plan change, your job that changes the plan allocation may not execute. Howwill that affect your users? If you use multiple resource allocation plans, you need to consider theimpact of using the wrong plan at the wrong time. To avoid such problems, you should try tominimize the number of resource allocation plans in use. In addition to the examples and commands shown in this section, you can update existingresource plans (via the UPDATE_PLAN procedure), delete resource plans (via DELETE_PLAN), andcascade the deletion of a resource plan plus all its subplans and related resource consumer groups(DELETE_PLAN_CASCADE). You can update and delete resource consumer groups viathe UPDATE_CONSUMER_GROUP and DELETE_CONSUMER_GROUP procedures, respectively.Resource plan directives may be updated via UPDATE_PLAN_DIRECTIVE and deleted viaDELETE_PLAN_DIRECTIVE. When you are modifying resource plans, resource consumer groups, and resource plandirectives, you should test the changes prior to implementing them. To test your changes, create apending area for your work. To create a pending area, use the CREATE_PENDING_AREA procedureof the DBMS_RESOURCE_MANAGER package. When you have completed your changes, use theVALIDATE_PENDING_AREA procedure to check the validity of the new set of plans, subplans,and directives. You can then either submit the changes (via SUBMIT_PENDING_AREA) or clearthe changes (via CLEAR_PENDING_AREA). The procedures that manage the pending area donot have any input variables, so a sample validation and submission of a pending area uses thefollowing syntax:execute DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();execute DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
- 140 Oracle Database 11g DBA Handbook Switching Consumer Groups Three of the parameters in the CREATE_PLAN_DIRECTIVE procedure allow sessions to switch consumer groups when resource limits are met. As shown in the previous section, the parameters for CREATE_PLAN_DIRECTIVE include SWITCH_GROUP, SWITCH_TIME, and SWITCH_ESTIMATE. The SWITCH_TIME value is the time, in seconds, a job can run before it is switched to another consumer group. The default SWITCH_TIME value is NULL (unlimited). You should set the SWITCH_GROUP parameter value to the group the session will be switched to once the switch time limit is reached. By default, SWITCH_GROUP is NULL. If you set SWITCH_GROUP to the value ‘CANCEL_SQL’, the current call will be canceled when the switch criteria is met. If the SWITCH_GROUP value is ‘KILL_SESSION’, the session will be killed when the switch criteria is met. You can use the third parameter, SWITCH_ESTIMATE, to tell the database to switch the consumer group for a database call before the operation even begins to execute. If you set SWITCH_ESTIMATE to TRUE, Oracle will use its execution time estimate to automatically switch the consumer group for the operation instead of waiting for it to reach the SWITCH_TIME value. You can use the group-switching features to minimize the impact of long-running jobs within the database. You can configure consumer groups with different levels of access to the system resources and customize them to support fast jobs as well as long-running jobs—the ones that reach the switch limit will be redirected to the appropriate groups before they even execute. Implementing Stored Outlines As you migrate from one database to another, the execution paths for your queries may change. Your execution paths may change for several reasons: ■ You may have enabled different optimizer features in the different databases. ■ The statistics for the queried tables may differ in the databases. ■ The frequency with which statistics are gathered may differ among the databases. ■ The databases may be running different versions of the Oracle kernel. The effects of these differences on your execution paths can be dramatic, and they can have a negative impact on your query performance as you migrate or upgrade your application. To minimize the impact of these differences on your query performance, you can use a feature called a stored outline. A stored outline stores a set of hints for a query. Those hints will be used every time the query is executed. Using the stored hints will increase the likelihood that the query will use the same execution path each time. Hints decrease the impact of database moves on your query performance. You can view the outlines and related hints via the USER_OUTLINES and USER_OUTLINE_HINTS views. To start creating hints for all queries, create custom categories of outlines and use the category name as a value of the CREATE_STORED_OUTLINES parameter in the database initialization file, as shown here: CREATE_STORED_OUTLINES = development In this example, outlines will be stored for queries within the DEVELOPMENT category. You must have the CREATE ANY OUTLINE system privilege in order to create an outline. Use the create outline command to create an outline for a query, as shown in the following listing:
- Chapter 5: Developing and Implementing Applications 141create outline YTD_SALES for category DEVELOPMENT onselect Year_to_Date_Sales from SALES where region = SOUTH and period = 1; NOTE If you do not specify a name for your outline, the outline will be given a system-generated name. If you have set CREATE_STORED_OUTLINES to a category name in your initialization file,Oracle will create stored outlines for your queries; using the create outline command gives youmore control over the outlines that are created. Unless you’re sure that you want to create storedoutlines for the entire database, set this parameter at the session level instead of the system level. NOTE You can create outlines for DML commands and for create table as select commands. Once an outline has been created, you can alter it. For example, you may need to alter theoutline to reflect significant changes in data volumes and distribution. You can use the rebuildclause of the alter outline command to regenerate the hints used during query execution, asshown next:alter outline YTD_SALES rebuild; You can also rename an outline via the rename clause of the alter outline command, asshown here:alter outline YTD_SALES rename to YTD_SALES_REGION; You can change the category of an outline via the change category clause, as shown in thefollowing example:alter outline YTD_SALES_REGION change category to DEFAULT; To manage stored outlines, use the DBMS_OUTLN package, which gives you the followingcapabilities: ■ Drop outlines that have never been used ■ Drop outlines within a specific category ■ Move outlines from one category to another ■ Create outlines for specific statements ■ Update outlines to the current version’s signature ■ Reset the usage flag for an outline
- 142 Oracle Database 11g DBA Handbook Each of these capabilities has a corresponding procedure within DBMS_OUTLN. To drop outlines that have never been used, execute the DROP_UNUSED procedure, as shown in the following example: execute DBMS_OUTLN.DROP_UNUSED; You can clear the “used” setting of an outline via the CLEAR_USED procedure. Pass the name of the outline as the input variable to CLEAR_USED: execute DBMS_OUTLN.CLEAR_USED(YTD_SALES_REGION); To drop all the outlines within a category, execute the DROP_BY_CAT procedure. The DROP_BY_CAT procedure has the name of the category as its only input parameter. The following example drops all the outlines within the DEVELOPMENT category: execute DBMS_OUTLN.DROP_BY_CAT(DEVELOPMENT); To reassign outlines from an old category to a new category, use the UPDATE_BY_CAT procedure, as shown in the following example: execute OUTLN_PKG.UPDATE_BY_CAT - (oldcat => DEVELOPMENT, - newcat => TEST); To drop a specific outline, use the drop outline command. If you have imported outlines generated in an earlier release, use the UPDATE_SIGNATURES procedure of DBMS_OUTLN to ensure the signatures are compatible with the current release’s computation algorithm. Editing Stored Outlines You can use DBMS_OUTLN_EDIT to edit the stored outlines. The procedures within DBMS_ OUTLN_EDIT are detailed in the following table: Procedure Description CHANGE_JOIN_POS Changes the join position for the hint identified by outline name and hint number to the position specified. Inputs are name, hintno, and newpos. CREATE_EDIT_TABLES Creates outline editing tables in the user’s schema. DROP_EDIT_TABLES Drops the outline editing tables in the user’s schema. GENERATE_SIGNATURE Generates a signature for the specified SQL text. REFRESH_PRIVATE_OUTLINE Refreshes the in-memory copy of the outline, synchronizing it with the edits made. NOTE As of Oracle 10g, you no longer need to execute the CREATE_EDIT_ TABLES procedure because the edit tables are available as temporary tables in the SYSTEM schema. The procedure is still available, however, for backward compatibility. You can use private outlines, which are seen only within your current session. Changes made to a private outline do not affect any other users. To enable private outline editing, set the USE_
- Chapter 5: Developing and Implementing Applications 143PRIVATE_OUTLINES initialization parameter to TRUE. Use the REFRESH_PRIVATE_OUTLINEprocedure to have your changes take effect for the in-memory versions of the outlines.Using SQL ProfilesAs of Oracle 10g, you can use SQL profiles to further refine the SQL execution plans chosen bythe optimizer. SQL profiles are particularly useful when you are attempting to tune code that youdo not have direct access to (for example, within a packaged application). The SQL profile consistsof statistics that are specific to the statement, allowing the optimizer to know more about the exactselectivity and cost of the steps in the execution plan. SQL profiling is part of the automatic tuning capability that I will describe in Chapter 8. Onceyou accept a SQL profile recommendation, it is stored in the data dictionary. As with stored outlines,you can use a category attribute to control its usage. See Chapter 8 for further details on the use ofthe automatic tools for detection and diagnosis of SQL performance issues.Sizing Database ObjectsChoosing the proper space allocation for database objects is critical. Developers should beginestimating space requirements before the first database objects are created. Afterward, the spacerequirements can be refined based on the actual usage statistics. In the following sections, youwill see the space estimation methods for tables, indexes, and clusters. You’ll also see methodsfor determining the proper settings for pctfree and pctused. NOTE You can enable Automatic Segment Space Management when you create a tablespace; you cannot enable this feature for existing tablespaces. If you are using Automatic Segment Space Management, Oracle ignores the pctused, freelists, and freelist groups parameters.Why Size Objects?You should size your database objects for three reasons: ■ To preallocate space in the database, thereby minimizing the amount of future work required to manage objects’ space requirements ■ To reduce the amount of space wasted due to overallocation of space ■ To improve the likelihood of a dropped free extent being reused by another segment You can accomplish all these goals by following the sizing methodology shown in the followingsections. This methodology is based on Oracle’s internal methods for allocating space to databaseobjects. Rather than rely on detailed calculations, the methodology relies on approximations thatwill dramatically simplify the sizing process while simplifying the long-term maintainability of thedatabase.The Golden Rule for Space CalculationsKeep your space calculations simple, generic, and consistent across databases. There are far moreproductive ways to spend your work time than performing extremely detailed space calculationsthat Oracle may ignore anyway. Even if you follow the most rigorous sizing calculations, youcannot be sure how Oracle will load the data into the table or index.
- 144 Oracle Database 11g DBA Handbook In the following section, you’ll see how to simplify the space-estimation process, freeing you to perform much more useful DBA functions. These processes should be followed whether you are generating the default storage values for a dictionary managed tablespace or the extent sizes for locally managed tablespaces. NOTE In an Oracle 10g database, you should be using locally managed tablespaces. If you have upgraded from a prior release that used dictionary-managed tablespaces, you should replace them with locally managed tablespaces. The Ground Rules for Space Calculations Oracle follows a set of internal rules when allocating space: ■ Oracle only allocates whole blocks, not parts of blocks. ■ Oracle allocates sets of blocks rather than individual blocks. ■ Oracle may allocate larger or smaller sets of blocks, depending on the available free space in the tablespace. Your goal should be to work with Oracle’s space-allocation methods instead of against them. If you use consistent extent sizes, you can largely delegate the space allocation to Oracle even in a dictionary-managed tablespace. The Impact of Extent Size on Performance There is no direct performance benefit gained by reducing the number of extents in a table. In some situations (such as in Parallel Query environments), having multiple extents in a table can significantly reduce I/O contention and enhance your performance. Regardless of the number of extents in your tables, they need to be properly sized; as of Oracle Database 10g, you should rely on automatic (system-managed) extent allocation if the objects in the tablespace are of varying sizes. Unless you know the precise amount of space you need for each object and the number and size of extents, use autoallocate when you create a tablespace, as in this example: create tablespace users12 datafile +DATA size 100m extent management local autoallocate; The extent management local clause is the default for create tablespace; autoallocate is the default for tablespaces with local extent management. Oracle reads data from tables in two ways: by RowID (usually immediately following an index access) and via full table scans. If the data is read via RowID, the number of extents in the table is not a factor in the read performance. Oracle will read each row from its physical location (as specified in the RowID) and retrieve the data. If the data is read via a full table scan, the size of your extents can impact performance to a very small degree. When reading data via a full table scan, Oracle will read multiple blocks at a time. The number of blocks read at a time is set via the DB_FILE_MULTIBLOCK_READ_COUNT database initialization parameter and is limited by the operating system’s I/O buffer size. For example, if your database block size is 8KB and your operating system’s I/O buffer size is 128KB,
- Chapter 5: Developing and Implementing Applications 145you can read up to 16 blocks per read during a full table scan. In that case, setting DB_FILE_MULTIBLOCK_READ_COUNT to a value higher than 16 will not affect the performance of thefull table scans.Estimating Space Requirements for TablesAs of Oracle Database 10g, you can use the CREATE_TABLE_COST procedure of the DBMS_SPACE package to estimate the space required by a table. The procedure determines the spacerequired for a table based on attributes such as the tablespace storage parameters, the tablespaceblock size, the number of rows, and the average row length. The procedure is valid for bothdictionary-managed and locally managed tablespaces. TIP When you create a new table using Oracle Enterprise Manager DB Control, you can click the Estimate Table Size button to estimate table size for a given estimated row count. There are two versions of the CREATE_TABLE_COST procedure (it is overloaded so you canuse the same procedure both ways). The first version has four input variables: tablespace_name,avg_row_size, row_count, and pct_free. Its output variables are used_bytes and alloc_bytes.The second version’s input variables are tablespace_name, colinfos, row_count, and pct_free;its output variables are used_bytes and alloc_bytes. Descriptions of the variables are providedin the following table:Parameter Descriptiontablespace_name The tablespace in which the object will be created.avg_row_size The average length of a row in the table.colinfos The description of the columns.row_count The anticipated number of rows in the table.pct_free The pctfree setting for the table.used_bytes The space used by the table’s data. This value includes the overhead due to the pctfree setting and other block features.alloc_bytes The space allocated to the table’s data, based on the tablespace characteristics. This value takes the tablespace extent size settings into account. For example, if you have an existing tablespace named USERS, you can estimate the spacerequired for a new table in that tablespace. In the following example, the CREATE_TABLE_COSTprocedure is executed with values passed for the average row size, the row count, and the pctfreesetting. The used_bytes and alloc_bytes variables are defined and are displayed via the DBMS_OUTPUT.PUT_LINE procedure:declare calc_used_bytes NUMBER; calc_alloc_bytes NUMBER;begin DBMS_SPACE.CREATE_TABLE_COST ( tablespace_name => USERS,
- 146 Oracle Database 11g DBA Handbook avg_row_size => 100, row_count => 5000, pct_free => 10, used_bytes => calc_used_bytes, alloc_bytes => calc_alloc_bytes ); DBMS_OUTPUT.PUT_LINE(Used bytes: ||calc_used_bytes); DBMS_OUTPUT.PUT_LINE(Allocated bytes: ||calc_alloc_bytes); end; / The output of this PL/SQL block will display the used and allocated bytes calculated for these variable settings. You can easily calculate the expected space usage for multiple combinations of space settings prior to creating the table. Here is the output from the preceding example: Used bytes: 589824 Allocated bytes: 589824 PL/SQL procedure successfully completed. NOTE You must use the set serveroutput on command to enable the script’s output to be displayed within a SQL*Plus session. Estimating Space Requirements for Indexes As of Oracle Database 10g, you can use the CREATE_INDEX_COST procedure of the DBMS_ SPACE package to estimate the space required by an index. The procedure determines the space required for a table based on attributes such as the tablespace storage parameters, the tablespace block size, the number of rows, and the average row length. The procedure is valid for both dictionary-managed and locally managed tablespaces. For index space estimations, the input variables include the DDL commands executed to create the index and the name of the local plan table (if one exists). The index space estimates rely on the statistics for the related table. You should be sure those statistics are correct before starting the space-estimation process; otherwise, the results will be skewed. The variables for the CREATE_INDEX_COST procedure are described in the following table: Parameter Description ddl The create index command used_bytes The number of bytes used by the index’s data alloc_bytes The number of bytes allocated for the index’s extents plan_table The plan table to use (the default is NULL) Because the CREATE_INDEX_COST procedure bases its results on the table’s statistics, you cannot use this procedure until the table has been created, loaded, and analyzed. The following example estimates the space required for a new index on the BOOKSHELF table. The tablespace designation is part of the create index command passed to the CREATE_INDEX_COST procedure as part of the ddl variable value.
- Chapter 5: Developing and Implementing Applications 147declare calc_used_bytes NUMBER; calc_alloc_bytes NUMBER;begin DBMS_SPACE.CREATE_INDEX_COST ( ddl => create index EMP_FN on EMPLOYEES || (FIRST_NAME) tablespace USERS, used_bytes => calc_used_bytes, alloc_bytes => calc_alloc_bytes ); DBMS_OUTPUT.PUT_LINE(Used bytes = ||calc_used_bytes); DBMS_OUTPUT.PUT_LINE(Allocated bytes = ||calc_alloc_bytes);end;/ The output of the script will show the used and allocated bytes values for the proposed indexfor the employee’s first name:Used bytes = 749Allocated bytes = 65536PL/SQL procedure successfully completed.Estimating the Proper Value for pctfreeThe pctfree value represents the percentage of each data block that is reserved as free space. Thisspace is used when a row that has already been stored in that data block grows in length, either byupdates of previously NULL fields or by updates of existing values to longer values. The size of arow can increase (and therefore move the row within a block) during an update when a NUMBERcolumn increases its precision or a VARCHAR2 column increases in length. There is no single value for pctfree that will be adequate for all tables in all databases. To simplifyspace management, choose a consistent set of pctfree values: ■ For indexes whose key values are rarely changed: 2 ■ For tables whose rows seldom change: 2 ■ For tables whose rows frequently change: 10 to 30 Why maintain free space in a table or index even if the rows seldom change? Oracle needsspace within blocks to perform block maintenance functions. If there is not enough free spaceavailable (for example, to support a large number of transaction headers during concurrentinserts), Oracle will temporarily allocate part of the block’s pctfree area. You should choose apctfree value that supports this allocation of space. To reserve space for transaction headers ininsert-intensive tables, set the initrans parameter to a non-default value. In general, your pctfreearea should be large enough to hold several rows of data. NOTE Oracle automatically allows up to 255 concurrent update transactions for any data block, depending on the available space in the block.
- 148 Oracle Database 11g DBA Handbook Because pctfree is tied to the way in which updates occur in an application, determining the adequacy of its setting is a straightforward process. The pctfree setting controls the number of records that are stored in a block in a table. To see if pctfree has been set correctly, first determine the number of rows in a block. You can use the DBMS_STATS package to gather statistics. If the pctfree setting is too low, the number of chained rows will steadily increase. You can monitor the database’s V$SYSSTAT view (or the Automatic Workload Repository) for increasing values of the “table fetch continued row” action; these indicate the need for the database to access multiple blocks for a single row. NOTE When rows are moved due to inadequate space in the pctfree area, the move is called a row migration. Row migration will impact the performance of your transactions. The DBMS_STATS procedure, while powerful, does not collect statistics on chained rows. You can still use the analyze command, which is otherwise deprecated in favor of DBMS_STATS, to reveal chained rows, as in this example: analyze table employees list chained rows; NOTE For indexes that will support a large number of inserts, pctfree may need to be as high as 50 percent. Reverse Key Indexes In a reverse key index, the values are stored backward—for example, a value of 2201 is stored as 1022. If you use a standard index, consecutive values are stored near each other. In a reverse key index, consecutive values are not stored near each other. If your queries do not commonly perform range scans and you are concerned about I/O contention (in a RAC database environment) or concurrency contention (buffer busy waits statistic in ADDM) in your indexes, reverse key indexes may be a tuning solution to consider. When sizing a reverse key index, follow the same method used to size a standard index, as shown in the prior sections of this chapter. There is a downside to reverse key indexes, however: they need a high value for pctfree to allow for frequent inserts, and must be rebuilt often, more often than a standard B-tree index. Sizing Bitmap Indexes If you create a bitmap index, Oracle will dynamically compress the bitmaps generated. The compression of the bitmap may result in substantial storage savings. To estimate the size of a bitmap index, estimate the size of a standard (B-tree) index on the same columns using the methods provided in the preceding sections of this chapter. After calculating the space requirements for the B-tree index, divide that size by 10 to determine the most likely maximum size of a bitmap index for those columns. In general, bitmap indexes will be between 2 and 10 percent of the size of a comparable B-tree index for a bitmap index with low cardinality. The size of the bitmap index will depend on the variability and number of distinct values in the indexed columns; if a bitmap index is created on a high-cardinality column, the space occupied by a bitmap index may exceed the size of a B-tree index on the same column!
- Chapter 5: Developing and Implementing Applications 149 NOTE Bitmap indexes are only available in Oracle Enterprise Edition and Standard Edition One.Sizing Index-Organized TablesAn index-organized table is stored sorted by its primary key. The space requirements of an index-organized table closely mirror those of an index on all of the table’s columns. The difference inspace estimation comes in calculating the space used per row, because an index-organized tabledoes not have RowIDs. The following listing gives the calculation for the space requirement per row for an index-organized table (note that this storage estimate is for the entire row, including its out-of-line storage):Row length for sizing = Average row length + number of columns + number of LOB columns + 2 headerbytesEnter this value as the row length when using the CREATE_TABLE_COST procedure for the index-organized table.Sizing Tables That Contain Large Objects (LOBs)LOB data (in BLOB or CLOB datatypes) is usually stored apart from the main table. You can usethe lob clause of the create table command to specify the storage attributes for the LOB data, suchas a different tablespace. In the main table, Oracle stores a LOB locator value that points to theLOB data. When the LOB data is stored out of line, between 36 and 86 bytes of control data(the LOB locator) remain inline in the row piece. Oracle does not always store the LOB data apart from the main table. In general, the LOBdata is not stored apart from the main table until the LOB data and the LOB locator value totalmore than 4000 bytes. Therefore, if you will be storing short LOB values, you need to considertheir impact on the storage of your main table. If your LOB values are less than 4000 characters,you may be able to use VARCHAR2 datatypes instead of LOB datatypes for the data storage. To explicitly specify where the LOB will reside if its size is 4000 bytes or less, use the disablestorage in row or enable storage in row clause in the LOB storage clause of the create tablestatement. If a LOB is stored inline, and its value starts out with a size less than 4000 bytes, it willmigrate to out of line. If an out of line LOB’s size becomes less than 4000 bytes, it stays out of line.Sizing PartitionsYou can create multiple partitions of a table. In a partitioned table, multiple separate physicalpartitions constitute the table. For example, a SALES table may have four partitions: SALES_NORTH,SALES_SOUTH, SALES_EAST, and SALES_WEST. You should size each of those partitions usingthe table-sizing methods described earlier in this chapter. You should size the partition indexesusing the index-sizing methods shown earlier in this chapter.Using Temporary TablesYou can create temporary tables to hold temporary data during your application processing.The table’s data can be specific to a transaction or maintained throughout a user’s session.When the transaction or session completes, the data is truncated from the table.
- 150 Oracle Database 11g DBA Handbook To create a temporary table, use the create global temporary table command. To automatically delete the rows at the end of the transaction, specify on commit delete rows, as shown here: create global temporary table MY_TEMP_TABLE (Name VARCHAR2(25), Street VARCHAR2(25), City VARCHAR2(25)) on commit delete rows; You can then insert rows into MY_TEMP_TABLE during your application processing. When you commit, Oracle will truncate MY_TEMP_TABLE. To keep the rows for the duration of your session, specify on commit preserve rows instead. From the DBA perspective, you need to know if your application developers are using this feature. If they are, you need to account for the space required by their temporary tables during their processing. Temporary tables are commonly used to improve processing speeds of complex transactions, so you may need to balance the performance benefit against the space costs. You can create indexes on temporary tables to further improve processing performance, again at the cost of increased space usage. NOTE Temporary tables and their indexes do not allocate any space until the first insert into them occurs. When they are no longer in use, their space is deallocated. In addition, if you are using PGA_AGGREGATE TARGET, Oracle will try to create the tables in memory and will only write them to temporary space if necessary. Supporting Tables Based on Abstract Datatypes User-defined datatypes, also known as abstract datatypes, are a critical part of object-relational database applications. Every abstract datatype has related constructor methods used by developers to manipulate data in tables. Abstract datatypes define the structure of data—for example, an ADDRESS_TY datatype may contain attributes for address data, along with methods for manipulating that data. When you create the ADDRESS_TY datatype, Oracle will automatically create a constructor method called ADDRESS_TY. The ADDRESS_TY constructor method contains parameters that match the datatype’s attributes, facilitating inserts of new values into the datatype’s format. In the following sections, you will see how to create tables that use abstract datatypes, along with information on the sizing and security issues associated with that implementation. You can create tables that use abstract datatypes for their column definitions. For example, you could create an abstract datatype for addresses, as shown here: create type ADDRESS_TY as object (Street VARCHAR2(50), City VARCHAR2(25), State CHAR(2), Zip NUMBER); Once the ADDRESS_TY datatype has been created, you can use it as a datatype when creating your tables, as shown in the following listing:
- Chapter 5: Developing and Implementing Applications 151create table CUSTOMER(Name VARCHAR2(25), Address ADDRESS_TY); When you create an abstract datatype, Oracle creates a constructor method for use duringinserts. The constructor method has the same name as the datatype, and its parameters are theattributes of the datatype. When you insert records into the CUSTOMER table, you need to usethe ADDRESS_TY datatype’s constructor method to insert Address values, as shown here:insert into CUSTOMER values (Joe,ADDRESS_TY(My Street, Some City, ST, 10001));In this example, the insert command calls the ADDRESS_TY constructor method in order to insertvalues into the attributes of the ADDRESS_TY datatype. The use of abstract datatypes increases the space requirements of your tables by eight bytesfor each datatype used. If a datatype contains another datatype, you should add eight bytes foreach of the datatypes.Using Object ViewsThe use of abstract datatypes may increase the complexity of your development environment. Whenyou query the attributes of an abstract datatype, you must use a syntax different from the syntaxyou use against tables that do not contain abstract datatypes. If you do not implement abstractdatatypes in all your tables, you will need to use one syntax for some of your tables and a separatesyntax for other tables—and you will need to know ahead of time which queries use abstractdatatypes. For example, the CUSTOMER table uses the ADDRESS_TY datatype described in the previoussection:create table CUSTOMER(Name VARCHAR2(25), Address ADDRESS_TY); The ADDRESS_TY datatype, in turn, has four attributes: Street, City, State, and Zip. If you wantto select the Street attribute value from the Address column of the CUSTOMER table, you may writethe following query:select Address.Street from CUSTOMER; However, this query will not work. When you query the attributes of abstract datatypes, youmust use correlation variables for the table names. Otherwise, there may be an ambiguity regardingthe object being selected. To query the Street attribute, use a correlation variable (in this case, “C”)for the CUSTOMER table, as shown in the following example:select C.Address.Street from CUSTOMER C; As shown in this example, you need to use correlation variables for queries of abstract datatypeattributes even if the query only accesses one table. There are therefore two features of queriesagainst abstract datatype attributes: the notation used to access the attributes and the correlationvariables requirement. In order to implement abstract datatypes consistently, you may need to alteryour SQL standards to support 100-percent usage of correlation variables. Even if you use correlation
- 152 Oracle Database 11g DBA Handbook variables consistently, the notation required to access attribute values may cause problems as well, because you cannot use a similar notation on tables that do not use abstract datatypes. Object views provide an effective compromise solution to this inconsistency. The CUSTOMER table created in the previous examples assumes that an ADDRESS_TY datatype already exists. But what if your tables already exist? What if you had previously created a relational database application and are trying to implement object-relational concepts in your application without rebuilding and re-creating the entire application? What you would need is the ability to overlay object-oriented (OO) structures such as abstract datatypes on existing relational tables. Oracle provides object views as a means for defining objects used by existing relational tables. If the CUSTOMER table already exists, you could create the ADDRESS_TY datatype and use object views to relate it to the CUSTOMER table. In the following listing, the CUSTOMER table is created as a relational table, using only the normally provided datatypes: create table CUSTOMER (Name VARCHAR2(25) primary key, Street VARCHAR2(50), City VARCHAR2(25), State CHAR(2), Zip NUMBER); If you want to create another table or application that stores information about people and addresses, you may choose to create the ADDRESS_TY datatype. However, for consistency, that datatype should be applied to the CUSTOMER table as well. The following examples will use the ADDRESS_TY datatype created in the preceding section. To create an object view, use the create view command. Within the create view command, specify the query that will form the basis of the view. The code for creating the CUSTOMER_OV object view on the CUSTOMER table is shown in the following listing: create view CUSTOMER_OV (Name, Address) as select Name, ADDRESS_TY(Street, City, State, Zip) from CUSTOMER; The CUSTOMER_OV view will have two columns: the Name and the Address columns (the latter is defined by the ADDRESS_TY datatype). Note that you cannot specify object as an option within the create view command. Several important syntax issues are presented in this example. When a table is built on existing abstract datatypes, you select column values from the table by referring to the names of the columns (such as Name) instead of their constructor methods. When creating the object view, however, you refer to the names of the constructor methods (such as ADDRESS_TY) instead. Also, you can use where clauses in the query that forms the basis of the object view. You can therefore limit the rows that are accessible via the object view. If you use object views, you as the DBA will administer relational tables the same way as you did before. You will still need to manage the privileges for the datatypes (see the following section of this chapter for information on security management of abstract datatypes), but the table and index structures will be the same as they were before the creation of the abstract datatypes. Using the relational structures will simplify your administration tasks while allowing developers to access objects via the object views of the tables. You can also use object views to simulate the references used by row objects. Row objects are rows within an object table. To create an object view that supports row objects, you need to first create a datatype that has the same structure as the table, as shown here:
- Chapter 5: Developing and Implementing Applications 153create or replace type CUSTOMER_TY as object(Name VARCHAR2(25), Street VARCHAR2(50), City VARCHAR2(25), State CHAR(2), Zip NUMBER); Next, create an object view based on the CUSTOMER_TY type while assigning objectidentifier, or OID, values to the rows in CUSTOMER:create view CUSTOMER_OV of CUSTOMER_TY with object identifier (Name) asselect Name, Street, City, State, Zip from CUSTOMER;The first part of this create view command gives the view its name (CUSTOMER_OV) and tellsOracle that the view’s structure is based on the CUSTOMER_TY datatype. An object identifieridentifies the row object. In this object view, the Name column will be used as the OID. If you have a second table that references CUSTOMER via a foreign key or primary keyrelationship, you can set up an object view that contains references to CUSTOMER_OV. For example,the CUSTOMER_CALL table contains a foreign key to the CUSTOMER table, as shown here:create table CUSTOMER_CALL(Name VARCHAR2(25), Call_Number NUMBER, Call_Date DATE, constraint CUSTOMER_CALL_PK primary key (Name, Call_Number), constraint CUSTOMER_CALL_FK foreign key (Name) references CUSTOMER(Name)); The Name column of CUSTOMER_CALL references the same column in the CUSTOMER table.Because you have simulated OIDs (called pkOIDs) based on the primary key of CUSTOMER, youneed to create references to those OIDs. Oracle provides an operator called MAKE_REF that createsthe references (called pkREFs). In the following listing, the MAKE_REF operator is used to createreferences from the object view of CUSTOMER_CALL to the object view of CUSTOMER:create view CUSTOMER_CALL_OV asselect MAKE_REF(CUSTOMER_OV, Name) Name, Call_Number, Call_Date from CUSTOMER_CALL; Within the CUSTOMER_CALL_OV view, you tell Oracle the name of the view to referenceand the columns that constitute the pkREF. You could now query CUSTOMER_OV data fromwithin CUSTOMER_CALL_OV by using the DEREF operator on the Customer_ID column:select DEREF(CCOV.Name) from CUSTOMER_CALL_OV CCOV where Call_Date = TRUNC(SysDate);You can thus return CUSTOMER data from your query without directly querying the CUSTOMERtable. In this example, the Call_Date column is used as a limiting condition for the rows returnedby the query.
- 154 Oracle Database 11g DBA Handbook Whether you use row objects or column objects, you can use object views to shield your tables from the object relationships. The tables are not modified; you administer them the way you always did. The difference is that the users can now access the rows of CUSTOMER as if they are row objects. From a DBA perspective, object views allow you to continue creating and supporting standard tables and indexes while the application developers implement the advanced object-relational features as a layer above those tables. Security for Abstract Datatypes The examples in the previous sections assumed that the same user owned the ADDRESS_TY datatype and the CUSTOMER table. What if the owner of the datatype is not the table owner? What if another user wants to create a datatype based on a datatype you have created? In the development environment, you should establish guidelines for the ownership and use of abstract datatypes just as you would for tables and indexes. For example, what if the account named KAREN_SHELL owns the ADDRESS_TY datatype, and the user of the account named CON_K tries to create a PERSON_TY datatype? I’ll show you the problem with type ownership, and then show you an easy solution later in this section. For example, CON_K executes the following command: create type PERSON_TY as object (Name VARCHAR2(25), Address ADDRESS_TY); / If CON_K does not own the ADDRESS_TY abstract datatype, Oracle will respond to this create type command with the following message: Warning: Type created with compilation errors. The compilation errors are caused by problems creating the constructor method when the datatype is created. Oracle cannot resolve the reference to the ADDRESS_TY datatype because CON_K does not own a datatype with that name. CON_K will not be able to create the PERSON_TY datatype (which includes the ADDRESS_ TY datatype) unless KAREN_SHELL first grants her EXECUTE privilege on the type. The following listing shows this grant command in action: grant EXECUTE on ADDRESS_TY to CON_K; NOTE You must also grant EXECUTE privilege on the type to any user who will perform DML operations on the table. Now that the proper grants are in place, CON_K can create a datatype that is based on KAREN_SHELL’s ADDRESS_TY datatype: create or replace type PERSON_TY as object (Name VARCHAR2(25), Address KAREN_SHELL.ADDRESS_TY);
- Chapter 5: Developing and Implementing Applications 155 CON_K’s PERSON_TY datatype will now be successfully created. However, using datatypesbased on another user’s datatypes is not trivial. For example, during insert operations, you mustfully specify the name of the owner of each type. CON_K can create a table based on herPERSON_TY datatype (which includes KAREN_SHELL’s ADDRESS_TY datatype), as shownin the following listing:create table CON_K_CUSTOMERS(Customer_ID NUMBER, Person PERSON_TY); If CON_K owned the PERSON_TY and ADDRESS_TY datatypes, an insert into theCUSTOMER table would use the following format:insert into CON_K_CUSTOMERS values(1,PERSON_TY(Jane Doe, ADDRESS_TY(101 Main Street,Dodgeville,WI,53595))); This command will not work. During the insert, the ADDRESS_TY constructor method isused, and KAREN_SHELL owns it. Therefore, the insert command must be modified to specifyKAREN_SHELL as the owner of ADDRESS_TY. The following example shows the corrected insertstatement, with the reference to KAREN_SHELL shown in bold:insert into CON_K_CUSTOMERS values(1,PERSON_TY(John Doe, KAREN_SHELL.ADDRESS_TY(101 Main Street,Dodgeville,WI,53595))); Solving this problem is easy: as of Oracle Database 10g, you can create and use a publicsynonym for a datatype. Continuing with the previous examples, KAREN_SHELL can create apublic synonym like so and grant EXECUTE privileges on the type:create public synonym pub_address_ty for address_ty;grant execute on address_ty to public; As a result, any user, including CON_K, can now reference the type using the synonym forcreating new tables or types:create or replace type person_ty as object (name varchar2(25), address pub_address_ty); In a relational-only implementation of Oracle, you grant the EXECUTE privilege on proceduralobjects, such as procedures and packages. Within the object-relational implementation of Oracle,the EXECUTE privilege is extended to cover abstract datatypes as well, as you can see in the exampleearlier in this section. The EXECUTE privilege is used because abstract datatypes can includemethods—PL/SQL functions and procedures that operate on the datatypes. If you grant someonethe privilege to use your datatype, you are granting the user the privilege to execute the methodsyou have defined on the datatype. Although KAREN_SHELL did not yet define any methods onthe ADDRESS_TY datatype, Oracle automatically creates constructor methods that are used to accessthe data. Any object (such as PERSON_TY) that uses the ADDRESS_TY datatype uses the constructormethod associated with ADDRESS_TY.
- 156 Oracle Database 11g DBA Handbook You cannot create public types, but as you saw earlier in this section, you can create public synonyms for your types. This helps to alleviate solution to the problem of datatype management; one solution would be to create all types using a single schema name and creating the appropriate synonyms. The users who reference the type do not have to know the owner of the types to use them effectively. Indexing Abstract Datatype Attributes In the preceding example, the CON_K_CUSTOMERS table was created based on a PERSON_TY datatype and an ADDRESS_TY datatype. As shown in the following listing, the CON_K_CUSTOMERS table contains a scalar (non-object-oriented) column—Customer_ID—and a Person column that is defined by the PERSON_TY abstract datatype: create table GEORGE_CUSTOMERS (Customer_ID NUMBER, Person PERSON_TY); From the datatype definitions shown in the previous section of this chapter, you can see that PERSON_TY has one column—Name—followed by an Address column defined by the ADDRESS_TY datatype. When referencing columns within the abstract datatypes during queries, updates, and deletes, specify the full path to the datatype attributes. For example, the following query returns the Customer_ID column along with the Name column. The Name column is an attribute of the datatype that defines the Person column, so you refer to the attribute as Person.Name, as shown here: select C.Customer_ID, C.Person.Name from CON_K_CUSTOMERS C; You can refer to attributes within the ADDRESS_TY datatype by specifying the full path through the related columns. For example, the Street column is referred to as Person.Address. Street, which fully describes its location within the structure of the table. In the following example, the City column is referenced twice—once in the list of columns to select and once within the where clause: select C.Person.Name, C.Person.Address.City from CON_K_CUSTOMERS C where C.Person.Address.City like C%; Because the City column is used with a range search in the where clause, the optimizer may be able to use an index when resolving the query. If an index is available on the City column, Oracle can quickly find all the rows that have City values starting with the letter C, as requested by the query. To create an index on a column that is part of an abstract datatype, you need to specify the full path to the column as part of the create index command. To create an index on the City column (which is part of the Address column), you can execute the following command: create index I_CON_K_CUSTOMERS_CITY on CON_K_CUSTOMERS(Person.Address.City);
- Chapter 5: Developing and Implementing Applications 157This command will create an index named I_CON_K_CUSTOMER_CITY on the Person.Address.City column. Whenever the City column is accessed, the optimizer will evaluate the SQL usedto access the data and determine if the new index can be useful to improve the performance ofthe access. When creating tables based on abstract datatypes, you should consider how the columnswithin the abstract datatypes will be accessed. If, like the City column in the previous example,certain columns will commonly be used as part of limiting conditions in queries, they should beindexed. In this regard, the representation of multiple columns in a single abstract datatype mayhinder your application performance, because it may obscure the need to index specific columnswithin the datatype. When you use abstract datatypes, you become accustomed to treating a group of columns asa single entity, such as the Address columns or the Person columns. It is important to rememberthat the optimizer, when evaluating query access paths, will consider the columns individually.You therefore need to address the indexing requirements for the columns even when you areusing abstract datatypes. In addition, remember that indexing the City column in one table thatuses the ADDRESS_TY datatype does not affect the City column in a second table that uses theADDRESS_TY datatype. If there is a second table named BRANCH that uses the ADDRESS_TYdatatype, then its City column will not be indexed unless you explicitly create an index for it.Quiescing and Suspending the DatabaseYou can temporarily quiesce or suspend the database during your maintenance operations. Usingthese options allows you to keep the database open during application maintenance, avoiding thetime or availability impact associated with database shutdowns. While the database is quiesced, no new transactions will be permitted by any accounts otherthan SYS and SYSTEM. New queries or attempted logins will appear to hang until you unquiescethe database. The quiesce feature is useful when performing table maintenance or complicateddata maintenance. To use the quiesce feature, you must first enable the Database ResourceManager, as described earlier in this chapter. In addition, the RESOURCE_MANAGER_PLANinitialization parameter must have been set to a valid plan when the database was started, andit must not have been disabled following database startup. While logged in as SYS or SYSTEM (other SYSDBA privileged accounts cannot execute thesecommands), quiesce the database as follows:alter system quiesce restricted; Any non-DBA sessions logged into the database will continue until their current commandcompletes, at which point they will become inactive. In Real Application Clusters configurations,all instances will be quiesced. To see if the database is in quiesced state, log in as SYS or SYSTEM and execute the followingquery:select Active_State from V$INSTANCE;The Active_State column value will be either NORMAL (unquiesced), QUIESCING (active non-DBA sessions are still running), or QUIESCED. To unquiesce the database, use the following command:alter system unquiesce;
- 158 Oracle Database 11g DBA Handbook Instead of quiescing the database, you can suspend it. A suspended database performs no I/O to its datafiles and control files, allowing the database to be backed up without I/O interference. To suspend the database, use the following command: alter system suspend; NOTE Do not use the alter system suspend command unless you have put the database in hot backup mode. Although the alter system suspend command can be executed from any SYSDBA privileged account, you can only resume normal database operations from the SYS and SYSTEM accounts. Use SYS and SYSTEM to avoid potential errors while resuming the database operations. In Real Application Clusters configurations, all instances will be suspended. To see the current status of the instance, use the following command: select Database_Status from V$INSTANCE; The database will be either SUSPENDED or ACTIVE. To resume the database, log in as SYS or SYSTEM and execute the following command: alter system resume; Supporting Iterative Development Iterative development methodologies typically consist of a series of rapidly developed prototypes. These prototypes are used to define the system requirements as the system is being developed. These methodologies are attractive because of their ability to show the customers something tangible as development is taking place. However, there are a few common pitfalls that occur during iterative development that undermine its effectiveness. First, effective versioning is not always used. Creating multiple versions of an application allows certain features to be “frozen” while others are changed. It also allows different sections of the application to be in development while others are in test. Too often, one version of the application is used for every iteration of every feature, resulting in an end product that is not adequately flexible to handle changing needs (which was the alleged purpose of the iterative development). Second, the prototypes are not always thrown away. Prototypes are developed to give the customer an idea of what the final product will look like; they should not be intended as the foundation of a finished product. Using them as a foundation will not yield the most stable and flexible system possible. When performing iterative development, treat the prototypes as temporary legacy systems. Third, the divisions between development, test, and production environments are clouded. The methodology for iterative development must very clearly define the conditions that have to be met before an application version can be moved to the next stage. It may be best to keep the prototype development completely separate from the development of the full application. Finally, unrealistic timelines are often set. The same deliverables that applied to the structured methodology apply to the iterative methodology. The fact that the application is being developed at an accelerated pace does not imply that the deliverables will be any quicker to generate.
- Chapter 5: Developing and Implementing Applications 159Iterative Column DefinitionsDuring the development process, your column definitions may change frequently. You candrop columns from existing tables. You can drop a column immediately, or you can mark it asUNUSED to be dropped at a later time. If the column is dropped immediately, the action mayimpact performance. If the column is marked as unused, there will be no impact on performance.The column can actually be dropped at a later time when the database is less heavily used. To drop a column, use either the set unused clause or the drop clause of the alter tablecommand. You cannot drop a pseudocolumn, a column of a nested table, or a partition key column. In the following example, column Col2 is dropped from a table named TABLE1:alter table TABLE1 drop column Col2; You can mark a column as unused, as shown here:alter table TABLE1 set unused column Col3; Marking a column as unused does not release the space previously used by the column. Youcan also drop any unused columns:alter table TABLE1 drop unused columns;You can query USER_UNUSED_COL_TABS, DBA_UNUSED_COL, and ALL_UNUSED_COL_TABSto see all tables with columns marked as unused. NOTE Once you have marked a column as unused, you cannot access that column. If you export the table after designating a column as unused, the column will not be exported. You can drop multiple columns in a single command, as shown in the following example:alter table TABLE1 drop (Col4, Col5); NOTE When dropping multiple columns, you should not use the column keyword of the alter table command. The multiple column names must be enclosed in parentheses, as shown in the preceding example. If the dropped columns are part of primary keys or unique constraints, you will also need touse the cascade constraints clause as part of your alter table command. If you drop a column thatbelongs to a primary key, Oracle will drop both the column and the primary key index. If you cannot immediately arrange for a maintenance period during which you can dropthe columns, mark them as unused. During a later maintenance period, you can complete themaintenance from the SYS or SYSTEM account.Forcing Cursor SharingIdeally, application developers should use bind variables in their programs to maximize the reuseof their previously parsed commands in the shared SQL area. If bind variables are not in use, youmay see many very similar statements in the library cache—queries that differ only in the literalvalue in the where clause.
- 160 Oracle Database 11g DBA Handbook Statements that are identical except for their literal value components are called similar statements. Similar statements can reuse previously parsed commands in the shared SQL area if the CURSOR_SHARING initialization parameter is set to SIMILAR or FORCE. In general, you should favor using SIMILAR over FORCE, because SIMILAR will allow for a new execution plan to be generated reflecting any histogram data known about the literal value. Setting CURSOR_SHARING to EXACT (the default setting) reuses previously parsed commands only when the literal values are identical. To use stored outlines with CURSOR_SHARING set to FORCE or SIMILAR, the outlines must have been generated with that CURSOR_SHARING setting in effect. NOTE Dynamic SQL commands are always parsed, essentially bypassing the value of the shared SQL area. Managing Package Development Imagine a development environment with the following characteristics: ■ None of your standards are enforced. ■ Objects are created under the SYS or SYSTEM account. ■ Proper distribution and sizing of tables and indexes is only lightly considered. ■ Every application is designed as if it were the only application you intend to run in your database. As undesirable as these conditions are, they are occasionally encountered during the implementation of purchased packaged applications. Properly managing the implementation of packages involves many of the same issues that were described for the application development processes in the previous sections. This section will provide an overview of how packages should be treated so they will best fit with your development environment. Generating Diagrams Most CASE tools have the ability to reverse-engineer packages into a physical database diagram. Reverse engineering consists of analyzing the table structures and generating a physical database diagram that is consistent with those structures, usually by analyzing column names, constraints, and indexes to identify key columns. However, normally there is no one-to-one correlation between the physical database diagram and the entity relationship diagram. Entity relationship diagrams for packages can usually be obtained from the package vendor; they are helpful in planning interfaces to the package database. Space Requirements Most Oracle-based packages provide fairly accurate estimates of their database resource usage during production usage. However, they usually fail to take into account their usage requirements during data loads and software upgrades. You should carefully monitor the package’s undo requirements during large data loads. A spare DATA tablespace may be needed as well if the package creates copies of all its tables during upgrade operations.
- Chapter 5: Developing and Implementing Applications 161Tuning GoalsJust as custom applications have tuning goals, packages must be held to tuning goals as well.Establishing and tracking these control values will help to identify areas of the package in needof tuning (see Chapter 8).Security RequirementsUnfortunately, many packages that use Oracle databases fall into one of two categories: eitherthey were migrated to Oracle from another database system, or they assume they will have fullDBA privileges for their object owner accounts. If the packages were first created on a different database system, their Oracle port very likelydoes not take full advantage of Oracle’s functional capabilities, such as sequences, triggers, andmethods. Tuning such a package to meet your needs may require modifying the source code. If the package assumes that it has full DBA authority, it must not be stored in the samedatabase as any other critical database application. Most packages that require DBA authority doso in order to add new users to the database. You should determine exactly which system-levelprivileges the package administrator account actually requires (usually just CREATE SESSION andCREATE USER). You can create a specialized system-level role to provide this limited set of systemprivileges to the package administrator. Packages that were first developed on non-Oracle databases may require the use of the sameaccount as another Oracle-ported package. For example, ownership of a database account calledSYSADM may be required by multiple applications. The only way to resolve this conflict with fullconfidence is to create the two packages in separate databases.Data RequirementsAny processing requirements that the packages have, particularly on the data-entry side, must beclearly defined. These requirements are usually well documented in package documentation.Version RequirementsApplications you support may have dependencies on specific versions and features of Oracle. Ifyou use packaged applications, you will need to base your kernel version upgrade plans on thevendor’s support for the different Oracle versions. Furthermore, the vendor may switch the optimizerfeatures it supports—for example, requiring that your COMPATIBLE parameter be set to a specificvalue. Your database environment will need to be as flexible as possible in order to support thesechanges. Because of these restrictions outside of your control, you should attempt to isolate thepackaged application to its own instance. If you frequently query data across applications, theisolation of the application to its own instance will increase your reliance on database links. Youneed to evaluate the maintenance costs of supporting multiple instances against the maintenancecosts of supporting multiple applications in a single instance.Execution PlansGenerating execution plans requires accessing the SQL statements that are run against the database.The shared SQL area in the SGA maintains the SQL statements that are executed against thedatabase (accessible via the V$SQL_PLAN view). Matching the SQL statements against specific partsof the application is a time-consuming process. You should attempt to identify specific areas whosefunctionality and performance are critical to the application’s success and work with the package’s
- 162 Oracle Database 11g DBA Handbook support team to resolve performance issues. You can use the Automated Workload Repository (see Chapter 8) to gather all the commands generated during testing periods and then determine the explain plans for the most resource-intensive queries in that set. If the commands are still in the shared SQL area, you can see the statistics via V$SQL and the explain plan via V$SQL_PLAN. Acceptance Test Procedures Purchased packages should be held to the same functional requirements that custom applications must meet. The acceptance test procedures should be developed before the package has been selected; they can be generated from the package-selection criteria. By testing in this manner, you will be testing for the functionality you need rather than what the package developers thought you wanted. Be sure to specify what your options are in the event the package fails its acceptance test for functional or performance reasons. Critical success factors for the application should not be overlooked just because it is a purchased application. The Testing Environment When establishing a testing environment, follow these guidelines: ■ It must be larger than your production environment. You need to be able to forecast future performance. ■ It must contain known data sets, explain plans, performance results, and data result sets. ■ It must be used for each release of the database and tools, as well as for new features. ■ It must support the generation of multiple test conditions to enable the evaluation of the features’ business costs. You do not want to have to rely on point analysis of results; ideally, you can determine the cost/benefit curves of a feature as the database grows in size. ■ It must be flexible enough to allow you to evaluate different licensing cost options. ■ It must be actively used as a part of your technology implementation methodology. When testing transaction performance, be sure to track the incremental load rate over time. In general, the indexes on a table will slow the performance of loads when they reach a second internal level. See Chapter 8 for details on indexes and load performance. When testing, your sample queries should represent each of the following groups: ■ Queries that perform joins, including merge joins, nested loops, outer joins, and hash joins ■ Queries that use database links ■ DML statements that use database links ■ Each type of DML statement (insert, update, and delete statements) ■ Each major type of DDL statement, including table creations, index rebuilds, and grants ■ Queries that use Parallel Query (if that option is in use in your environment) The sample set should not be fabricated; it should represent your operations, and it must be repeatable. Generating the sample set should involve reviewing your major groups of operations as well as the OLTP operations executed by your users. The result will not reflect every action within the database, but will allow you to be aware of the implications of upgrades and thus allow you to mitigate your risk and make better decisions about implementing new options.
- CHAPTER 6Monitoring Space Usage 163
- 164 Oracle Database 11g DBA Handbook good DBA has a toolset in place to monitor the database, both proactively A monitoring various aspects of the database, such as transaction load, security enforcement, space management, and performance monitoring, and effectively reacting to any potentially disastrous system problems. Transaction management, performance tuning, memory management, and database security and auditing are covered in Chapters 7, 8, and 9. In this chapter, we’ll address how a DBA can effectively and efficiently manage the disk space used by database objects in the different types of tablespaces: the SYSTEM tablespace, the SYSAUX tablespace, temporary tablespaces, undo tablespaces, and tablespaces of different sizes. To reduce the amount of time it takes to manages disk space, it is important for the DBA to understand how the applications will be using the database as well as to provide guidance during the design of the database application. Designing and implementing the database application, including tablespace layouts and expected growth of the database, have been covered in Chapters 3, 4, and 5. In this chapter, I’ll also provide some scripts that need not much more than SQL*Plus and the knowledge to interpret the results. These scripts are good for a quick look at the database’s health at a given point in time—for example, to see if there is enough disk space to handle a big SQL*Loader job that evening or to diagnose some response-time issues for queries that normally run quickly. Oracle provides a number of built-in packages to help the busy DBA manage space and diagnose problems. For example, Oracle Segment Advisor, introduced in Oracle Database 10g, helps to determine if a database object has space available for reuse, given how much fragmentation exists in the object. Other features of Oracle, such as Resumable Space Allocation, allow a long-running operation that runs out of disk space to be suspended until the DBA can intervene and allocate enough additional disk space to complete the operation. As a result, the long-running job will not have to be restarted from the beginning. We’ll also cover some of the key data dictionary and dynamic performance views that give us a close look at the structure of the database and a way to optimize space usage. Many of the scripts provided in this chapter use these views. At the end of this chapter, we’ll cover two different methods for automating some of the scripts and Oracle tools: using the DBMS_SCHEDULER built-in package as well as using the Oracle Enterprise Manager (OEM) infrastructure. Space usage for tablespaces will be the primary focus in this chapter, along with the objects contained within the tablespaces. Other database files, such as control files and redo log files, take up disk space, but as a percentage of the total space used by a database they are small. We will, however, briefly consider how archived log files are managed because the number of archived log files will increase indefinitely at a pace proportional to how much DML activity occurs in the database. Therefore, a good plan for managing archived log files will help keep disk space usage under control. Common Space Management Problems Space management problems generally fall into one of three categories: running out of space in a regular tablespace, not having enough undo space for long-running queries that need a consistent “before” image of the tables, and insufficient space for temporary segments. Although we may still have some fragmentation issues within a database object such as a table or index, locally managed tablespaces solve the problem of tablespace fragmentation.
- Chapter 6: Monitoring Space Usage 165 I will address each of these three problem areas by using the techniques described in thefollowing sections.Running Out of Free Space in a TablespaceIf a tablespace is not defined with the AUTOEXTEND attribute, then the total amount of space inall the datafiles that compose the tablespace limits the amount of data that can be stored in thetablespace. If the AUTOEXTEND attribute is defined, then one or more of the datafiles that composethe tablespace will grow to accommodate the requests for new segments or the growth of existingsegments. Even with the AUTOEXTEND attribute, the amount of space in the tablespace is ultimatelylimited by the amount of disk space on the physical disk drive or storage group. The AUTOEXTEND attribute is the default if you don’t specify the SIZE parameter in thecreate tablespace command and you are using OMF, so you’ll actually have to go out of yourway to prevent a datafile from autoextending. In Oracle Database 11g with the initializationparameter DB_CREATE_FILE_DEST set to an ASM or file system location, you can run a createtablespace command like this:create tablespace bi_02; In this case, the tablespace BI_02 is created with a size of 100MB in a single datafile,AUTOEXTEND is on, and the next extent is 100MB when the first datafile fills up. In addition,extent management is set to LOCAL, space allocation is AUTOALLOCATE, and segment spacemanagement set to AUTO. The conclusion to be reached here is that we want to monitor the free and used space withina tablespace to detect trends in space usage over time, and as a result be proactive in making surethat enough space is available for future space requests. As of Oracle Database 10g, you can usethe DBMS_SERVER_ALERT package to automatically notify you when a tablespace reaches awarning or critical space threshold level, either at a percent used, space remaining, or both.Insufficient Space for Temporary SegmentsA temporary segment stores intermediate results for database operations such as sorts, index builds,distinct queries, union queries, or any other operation that necessitates a sort/merge operation thatcannot be performed in memory. Temporary segments should be allocated in a temporary tablespace,which I introduced in Chapter 1. Under no circumstances should the SYSTEM tablespace be used fortemporary segments; when the database is created, a non-SYSTEM tablespace should be specified asa default temporary tablespace for users who are not otherwise assigned a temporary tablespace. Ifthe SYSTEM tablespace is locally managed, a default temporary tablespace must be defined when thedatabase is created. When there is not enough space available in the user’s default temporary tablespace, andeither the tablespace cannot be autoextended or the tablespace’s AUTOEXTEND attribute isdisabled, the user’s query or DML statement fails.Too Much or Too Little Undo Space AllocatedAs of Oracle9i, undo tablespaces have simplified the management of rollback information bymanaging undo information automatically within the tablespace. The DBA no longer has to definethe number and size of the rollback segments for the kinds of activity occurring in the database.As of Oracle 10g, manual rollback management has been deprecated.
- 166 Oracle Database 11g DBA Handbook Not only does an undo segment allow a rollback of an uncommitted transaction, it provides for read consistency of long-running queries that begin before inserts, updates, and deletes occur on a table. The amount of undo space available for providing read consistency is under the control of the DBA and is specified as the number of seconds that Oracle will attempt to guarantee that “before” image data is available for long-running queries. As with temporary tablespaces, we want to make sure we have enough space allocated in an undo tablespace for peak demands without allocating more than is needed. As with any tablespace, we can use the AUTOEXTEND option when creating the tablespace to allow for unexpected growth of the tablespace without reserving too much disk space up front. Undo segment management is discussed in detail in Chapter 7, whereas the tools to help size the undo tablespaces are discussed later in this chapter. Fragmented Tablespaces and Segments As of Oracle8i, a tablespace that is locally managed uses bitmaps to keep track of free space, which, in addition to eliminating the contention on the data dictionary, eliminates wasted space because all extents are either the same size (with uniform extent allocation) or are multiples of the smallest size (with autoallocation). For migrating from a dictionary-managed tablespace, we will review an example that converts a dictionary-managed tablespace to a locally managed tablespace. In a default installation of Oracle Database 10g or Oracle Database 11g using the Database Creation Assistant (DBCA), all tablespaces, including the SYSTEM and SYSAUX tablespaces, are created as locally managed tablespaces. Even though locally managed tablespaces with automatic extent management (using the autoallocate clause) are created by default when you use create tablespace, you still need to specify extent management local if you need to specify uniform for the extent management type in the create tablespace statement: SQL> create tablespace USERS4 2 datafile +DATA 3 size 250M autoextend on next 250M maxsize 2000M 4 extent management local uniform size 8M 5 segment space management auto; Tablespace created. This tablespace will be created with an initial size of 250MB, and it can grow as large as 2000MB (2GB); extents will be locally managed with a bitmap, and every extent in this tablespace will be exactly 8MB in size. Space within each segment (table or index) will be managed automatically with a bitmap instead of freelists. Even with efficient extent allocation, table and index segments may eventually contain a lot of free space due to update and delete statements. As a result, a lot of unused space can be reclaimed by using some of the scripts I provide later in this chapter, as well as by using the Oracle Segment Advisor. Oracle Segments, Extents, and Blocks In Chapter 1, I gave you an overview of tablespaces and the logical structures contained within them. I also briefly presented datafiles, allocated at the operating system level, as the building blocks for tablespaces. Being able to effectively manage disk space in the database requires an in-depth knowledge of tablespaces and datafiles, as well as the components of the segments
- Chapter 6: Monitoring Space Usage 167stored within the tablespaces, such as tables and indexes. At the lowest level, a tablespacesegment consists of one or more extents, each extent comprising one or more data blocks.Figure 6-1 shows the relationship between segments, extents, and blocks in an Oracle database. In the following sections, we’ll cover some of the details of data blocks, extents, and segmentswith the focus on space management.Data BlocksA data block is the smallest unit of storage in the database. Ideally, an Oracle block is a multipleof the operating system block to ensure efficient I/O operations. The default block size for thedatabase is specified with the DB_BLOCK_SIZE initialization parameter; this block size is usedfor the SYSTEM, TEMP, and SYSAUX tablespaces at database creation and cannot be changedwithout re-creating the database. The format for a data block is presented in Figure 6-2. Every data block contains a header that specifies what kind of data is in the block—table rowsor index entries. The table directory section has information about the table with rows in the block;a block can have rows from only one table or entries from only one index, unless the table is aclustered table, in which case the table directory identifies all the tables with rows in this block.The row directory provides details of the specific rows of the table or index entries in the block.FIGURE 6-1 Oracle segments, extents, and blocks
- 168 Oracle Database 11g DBA Handbook FIGURE 6-2 Contents of an Oracle data block The space for the header, table directory, and row directory is a very small percentage of the space allocated for a block; our focus, then, is on the free space and row data within the block. Within a newly allocated block, free space is available for new rows and updates to existing rows; the updates may increase or decrease the space allocated for the row if there are varying- length columns in the row or a non-NULL value is changed to a NULL value, or vice versa. Space is available within a block for new inserts until there is less than a certain percentage of space available in the block defined by the PCTFREE parameter, specified when the segment is created. Once there is less than PCTFREE space in the block, no inserts are allowed. If freelists are used to manage space within the blocks of a segment, then new inserts are allowed on the table when used space within the block falls below PCTUSED. A row may span more than one block if the row size is greater than the block size or an updated row no longer fits into the original block. In the first case, a row that is too big for a block is stored in a chain of blocks; this may be unavoidable if a row contains columns that exceed even the largest block size allowed, which in Oracle 11g is 32KB.
- Chapter 6: Monitoring Space Usage 169 In the second case, an update to a row in a block may no longer fit in the original block, andas a result Oracle will migrate the data for the entire row to a new block and leave a pointer inthe first block to point to the location in the second block where the updated row is stored. Asyou may infer, a segment with many migrated rows may cause I/O performance problems becausethe number of blocks required to satisfy a query can double. In some cases, adjusting the value ofPCTFREE or rebuilding the table may result in better space utilization and I/O performance. Moretips on how to improve I/O performance can be found in Chapter 8. Starting with Oracle9i Release 2, you can use Automatic Segment Space Management (ASSM)to manage free space within blocks; you enable ASSM in locally managed tablespaces by usingthe segment space management auto keywords in the create tablespace command (although thisis the default for locally managed tablespaces). Using ASSM reduces segment header contention and improves simultaneous insert concurrency;this is because the free space map in a segment is spread out into a bitmap block within eachextent of the segment. As a result, you dramatically reduce waits because each process performinginsert, update, or delete operations will likely be accessing different blocks instead of one freelistor one of a few freelist groups. In addition, each extent’s bitmap block lists each block within theextent along with a four-bit “fullness” indicator defined as follows (with room for future expansionfrom values 6–15): ■ 0000 Unformatted block ■ 0001 Block full ■ 0010 Less than 25 percent free space available ■ 0011 25 percent to 50 percent free space ■ 0100 50 percent to 75 percent free space ■ 0101 Greater than 75 percent free space In a RAC database environment, using ASSM segments means you no longer need to createmultiple freelist groups. In addition, you no longer need to specify PCTUSED, FREELISTS, orFREELIST GROUPS parameters when you create a table; if you specify any of these parameters,they are ignored.ExtentsAn extent is the next level of logical space allocation in a database; it is a specific number ofblocks allocated for a specific type of object, such as a table or index. An extent is the minimumnumber of blocks allocated at one time; when the space in an extent is full, another extent isallocated. When a table is created, an initial extent is allocated. Once the space is used in the initial extent,incremental extents are allocated. In a locally managed tablespace, these subsequent extents caneither be the same size (using the UNIFORM keyword when the tablespace is created) or optimallysized by Oracle (AUTOALLOCATE). For extents that are optimally sized, Oracle starts with aminimum extent size of 64KB and increases the size of subsequent extents as multiples of the initialextent as the segment grows. In this way, fragmentation of the tablespace is virtually eliminated.
- 170 Oracle Database 11g DBA Handbook When the extents are sized automatically by Oracle, the storage parameters INITIAL, NEXT, PCTINCREASE, and MINEXTENTS are used as a guideline, along with Oracle’s internal algorithm, to determine the best extent sizes. In the following example, a table created in the USERS tablespace (during installation of a new database, the USERS tablespace is created with AUTOALLOCATE enabled) does not use the storage parameters specified in the create table statement: SQL> create table t_autoalloc (c1 char(2000)) 2 storage (initial 1m next 2m pctincrease 50) 3 tablespace users; Table created. SQL> begin 2 for i in 1..3000 loop 3 insert into t_autoalloc values (a); 4 end loop; 5 end; 6 / PL/SQL procedure successfully completed. SQL> select segment_name, extent_id, bytes, blocks 2 from user_extents where segment_name = T_AUTOALLOC; SEGMENT_NAME EXTENT_ID BYTES BLOCKS ------------ ---------- ---------- ---------- T_AUTOALLOC 0 65536 8 T_AUTOALLOC 1 65536 8 . . . T_AUTOALLOC 15 65536 8 T_AUTOALLOC 16 1048576 128 . . . T_AUTOALLOC 22 1048576 128 23 rows selected. Unless a table is truncated or the table is dropped, any blocks allocated to an extent remain allocated for the table, even if all rows have been deleted from the table. The maximum number of blocks ever allocated for a table is known as the high-water mark (HWM). Segments Groups of extents are allocated for a single segment. A segment must be wholly contained within one and only one tablespace. Every segment represents one and only one type of database object, such as a table, a partition of a partitioned table, an index, or a temporary segment. For partitioned tables, every partition resides in its own segment; however, a cluster (with two or more tables) resides within a single segment. Similarly, a partitioned index consists of one segment for each index partition. Temporary segments are allocated in a number of scenarios. When a sort operation cannot fit in memory, such as a select statement that needs to sort the data to perform a distinct, group by, or union operation, a temporary segment is allocated to hold the intermediate results of the sort.
- Chapter 6: Monitoring Space Usage 171Index creation also typically requires the creation of a temporary segment. Because allocation anddeallocation of temporary segments occurs often, it is highly desirable to create a tablespacespecifically to hold temporary segments. This helps to distribute the I/O required for a givenoperation, and it reduces the possibility that fragmentation may occur in other tablespacesdue to the allocation and deallocation of temporary segments. When the database is created,a default temporary tablespace can be created for any new users who do not have a specifictemporary tablespace assigned; if the SYSTEM tablespace is locally managed, a separate temporarytablespace must be created to hold temporary segments. How space is managed within a segment depends on how the tablespace containing the blockis created. If the tablespace is dictionary managed, the segment uses freelists to manage spacewithin the data blocks; if the tablespace is locally managed, space in segments can be managedwith either freelists or bitmaps. Oracle strongly recommends that all new tablespaces be createdas locally managed and that free space within segments be managed automatically with bitmaps.Automatic segment space management allows more concurrent access to the bitmap lists in asegment compared to freelists; in addition, tables that have widely varying row sizes make moreefficient use of space in segments that are automatically managed. As I mentioned earlier, in the section titled “Data Blocks,” if a segment is created with automaticsegment space management, bitmaps are used to manage the space within the segment. As a result,the pctused, freelist, and freelist groups keywords within a create table or create index statementare ignored. The three-level bitmap structure within the segment indicates whether blocks belowthe HWM are full (less than pctfree), 0 to 25 percent free, 25 to 50 percent free, 50 to 75 percentfree, 75 to 100 percent free, or unformatted.Data Dictionary Views and DynamicPerformance ViewsA number of data dictionary and dynamic performance views are critical in understanding howdisk space is being used in your database. The data dictionary views that begin with DBA_ are ofa more static nature, whereas the V$ views, as expected, are of a more dynamic nature and giveyou up-to-date statistics on how space is being used in the database. In the next few sections, I’ll highlight the space management views and provide some quickexamples; later in this chapter, you’ll see how these views form the basis of Oracle’s spacemanagement tools.DBA_TABLESPACESThe view DBA_TABLESPACES contains one row for each tablespace, whether native or currentlyplugged in from another database. It contains default extent parameters for objects created in thetablespace that don’t specify initial and next values. The EXTENT_MANAGEMENT column indicateswhether the tablespace is locally managed or dictionary managed. As of Oracle 10g, the columnBIGFILE indicates whether the tablespace is a smallfile or a bigfile tablespace. Bigfile tablespacesare discussed later in this chapter. In the following query we retrieve the tablespace type and the extent management type for alltablespaces within the database:SQL> select tablespace_name, block_size, 2 contents, extent_management from dba_tablespaces;
- 172 Oracle Database 11g DBA Handbook TABLESPACE_NAME BLOCK_SIZE CONTENTS EXTENT_MAN ------------------------------ ---------- --------- ---------- SYSTEM 8192 PERMANENT LOCAL SYSAUX 8192 PERMANENT LOCAL UNDOTBS1 8192 UNDO LOCAL TEMP 8192 TEMPORARY LOCAL USERS 8192 PERMANENT LOCAL EXAMPLE 8192 PERMANENT LOCAL DMARTS 16384 PERMANENT LOCAL XPORT 8192 PERMANENT LOCAL USERS2 8192 PERMANENT LOCAL USERS3 8192 PERMANENT LOCAL USERS4 8192 PERMANENT LOCAL 11 rows selected. In this example, all the tablespaces are locally managed; in addition, the DMARTS tablespace has a larger block size to improve response time for data mart tables that are typically accessed hundreds or thousands of rows at a time. DBA_SEGMENTS The data dictionary view DBA_SEGMENTS has one row for each segment in the database. This view is not only good for retrieving the size of the segment, in blocks or bytes, but also for identifying the owner of the object and the tablespace where an object resides: SQL> select tablespace_name, count(*) NUM_OBJECTS, 2 sum(bytes), sum(blocks), sum(extents) from dba_segments 3 group by rollup (tablespace_name); TABLESPACE_NAME NUM_OBJECTS SUM(BYTES) SUM(BLOCKS) SUM(EXTENTS) ---------------- ----------- ---------- ----------- ------------ DMARTS 2 67108864 4096 92 EXAMPLE 418 81068032 9896 877 SYSAUX 5657 759103488 92664 8189 SYSTEM 1423 732233728 89384 2799 UNDOTBS1 10 29622272 3616 47 USERS 44 11665408 1424 73 XPORT 1 134217728 16384 87 7555 1815019520 217464 12164 DBA_EXTENTS The DBA_EXTENTS view is similar to DBA_SEGMENTS, except that DBA_EXTENTS drills down further into each database object. There is one row in DBA_EXTENTS for each extent of each segment in the database, along with the FILE_ID and BLOCK_ID of the datafile containing the extent: SQL> select owner, segment_name, tablespace_name, 2 extent_id, file_id, block_id, bytes from dba_extents 3 where segment_name = AUD$;
- Chapter 6: Monitoring Space Usage 173OWNER SEGMENT_NAM TABLESPACE EXTENT_ID FILE_ID BLOCK_ID BYTES----- -------------- ---------- ---------- ---------- ---------- ---------SYS AUD$ SYSTEM 3 1 32407 196608SYS AUD$ SYSTEM 4 1 42169 262144SYS AUD$ SYSTEM 5 2 289 393216SYS AUD$ SYSTEM 2 1 31455 131072SYS AUD$ SYSTEM 1 1 30303 65536SYS AUD$ SYSTEM 0 1 261 16384 In this example, the table AUD$ owned by SYS has extents in two different datafiles thatcompose the SYSTEM tablespace.DBA_FREE_SPACEThe view DBA_FREE_SPACE is broken down by datafile number within the tablespace. You caneasily compute the amount of free space in each tablespace by using the following query:SQL> select tablespace_name, sum(bytes) from dba_free_space 2 group by tablespace_name;TABLESPACE_NAME SUM(BYTES)---------------- ----------DMARTS 194969600XPORT 180289536SYSAUX 44105728UNDOTBS1 75169792USERS3 104792064USERS4 260046848USERS 1376256USERS2 104792064SYSTEM 75104256EXAMPLE 2372403210 rows selected. Note that the free space does not take into account the space that would be available if andwhen the datafiles in a tablespace are autoextended. Also, any space allocated to a table for rowsthat are later deleted will be available for future inserts into the table, but it is not counted in thepreceding query results as space available for other database objects. When a table is truncated,however, the space is made available for other database objects.DBA_LMT_FREE_SPACEThe view DBA_LMT_FREE_SPACE provides the amount of free space, in blocks, for all tablespacesthat are locally managed, and it must be joined with DBA_DATA_FILES to get the tablespace names.DBA_THRESHOLDSNew to Oracle 10g, DBA_THRESHOLDS contains the currently active list of the different metricsthat gauge the database’s health and specify a condition under which an alert will be issued if themetric threshold reaches or exceeds a specified value.
- 174 Oracle Database 11g DBA Handbook The values in this view are typically maintained via the OEM interface; in addition, the Oracle 10g DBMS_SERVER_ALERT built-in PL/SQL package can set and get the threshold values with the SET_THRESHOLD and GET_THRESHOLD procedures, respectively. To read alert messages in the alert queue, you can use the DBMS_AQ and DBMS_AQADM packages, or OEM can be configured to send a pager or e-mail message when the thresholds have been exceeded. For a default installation of Oracle Database 10g and Oracle Database 11g, a number of thresholds are configured, including the following: ■ At least one user session is blocked every minute for three consecutive minutes. ■ Any segments are not able to extend for any reason. ■ The total number of concurrent processes comes within 80 percent of the PROCESSES initialization parameter value. ■ More than two invalid objects exist for any individual database user. ■ The total number of concurrent user sessions comes within 80 percent of the SESSIONS initialization parameter value. ■ There are more than 1200 concurrent open cursors. ■ There are more than 100 logons per second. ■ A tablespace is more than 85 percent full (warning) or more than 97 percent full (critical). ■ User logon time is greater than 1000 milliseconds (1 second). DBA_OUTSTANDING_ALERTS The Oracle 10g view DBA_OUTSTANDING_ALERTS contains one row for each active alert in the database, until the alert is cleared or reset. One of the fields in this view, SUGGESTED_ACTION, contains a recommendation for addressing the alert condition. DBA_ALERT_HISTORY After an alert in DBA_OUTSTANDING_ALERTS has been addressed and cleared, a record of the cleared alert is available in the view DBA_ALERT_HISTORY. V$ALERT_TYPES The dynamic performance view V$ALERT_TYPES (new to Oracle 10g) lists the 158 alert conditions (as of Oracle 11g, Release 1) that can be monitored. The GROUP_NAME column categorizes the alert conditions by type. For example, for space management issues, we would use alerts with a GROUP_NAME of Space: SQL> select reason_id, object_type, scope, internal_metric_category, 2 internal_metric_name from v$alert_types 3 where group_name = Space; REASON_ID OBJECT_TYPE SCOPE INTERNAL_METRIC_CATE INTERNAL_METRIC_NA ---------- ------------------ -------- -------------------- ------------------ 123 RECOVERY AREA Database Recovery_Area Free_Space 1 SYSTEM Instance 0 SYSTEM Instance
- Chapter 6: Monitoring Space Usage 175 133 TABLESPACE Database problemTbsp bytesFree 9 TABLESPACE Database problemTbsp pctUsed 12 TABLESPACE Database Suspended_Session Tablespace 10 TABLESPACE Database Snap_Shot_Too_Old Tablespace 13 ROLLBACK SEGMENT Database Suspended_Session Rollback_Segment 11 ROLLBACK SEGMENT Database Snap_Shot_Too_Old Rollback_Segment 14 DATA OBJECT Database Suspended_Session Data_Object 15 QUOTA Database Suspended_Session Quota11 rows selected. Using alert type with REASON_ID=123 as an example, an alert can be initiated when the freespace in the database recovery area falls below a specified percentage.V$UNDOSTATHaving too much undo space and having not enough undo space are both problems. Althoughan alert can be set up to notify the DBA when the undo space is not sufficient to provide enoughtransaction history to satisfy Flashback queries or enough “before” image data to prevent“Snapshot Too Old” errors, a DBA can be proactive by monitoring the dynamic performanceview V$UNDOSTAT during heavy database usage periods. V$UNDOSTAT displays historical information about the consumption of undo space for ten-minute intervals. By analyzing the results from this table, a DBA can make informed decisionswhen adjusting the size of the undo tablespace or changing the value of the UNDO_RETENTIONinitialization parameter.V$OBJECT_USAGEIf an index is not being used, it not only takes up space that could be used by other objects, butthe overhead of maintaining the index whenever an insert, update, or delete occurs is wasted.By using the alter index . . . monitoring usage command, the view V$OBJECT_USAGE will beupdated when the index has been accessed indirectly because of a select statement.V$SORT_SEGMENTThe view V$SORT_SEGMENT can be used to view the allocation and deallocation of space in atemporary tablespace’s sort segment. The column CURRENT_USERS indicates how many distinctusers are actively using a given segment. V$SORT_SEGMENT is only populated for temporarytablespaces.V$TEMPSEG_USAGEFrom the perspective of users requesting temporary segments, the view V$TEMPSEG_USAGEidentifies the locations, types, and sizes of the temporary segments currently being requested.Unlike V$SORT_SEGMENT, V$TEMPSEG_USAGE will contain information about temporarysegments in both temporary and permanent tablespaces. Later in this chapter, I’ll introduce theimproved and simplified temporary tablespace management tools available in Oracle Database 11g.Space Management MethodologiesIn the following sections, we will consider various features of Oracle 11g to facilitate the efficientuse of disk space in the database. Locally managed tablespaces offer a variety of advantages to theDBA, improving the performance of the objects within the tablespace, as well as easing administration
- 176 Oracle Database 11g DBA Handbook of the tablespace—fragmentation of a tablespace is a thing of the past. Another feature introduced in Oracle9i, Oracle Managed Files, eases datafile maintenance by automatically removing files at the operating system level when a tablespace or other database object is dropped. Bigfile tablespaces, introduced in Oracle 10g, simplify datafile management because one and only one datafile is associated with a bigfile tablespace. This moves the maintenance point up one level, from the datafile to the tablespace. We’ll also review a couple other features introduced in Oracle9i—undo tablespaces and multiple block sizes. Locally Managed Tablespaces Prior to Oracle8i, there was only one way to manage free space within a tablespace—by using data dictionary tables in the SYSTEM tablespace. If a lot of insert, delete, and update activity occurs anywhere in the database, there is the potential for a “hot spot” to occur in the SYSTEM tablespace where the space management occurs. Oracle removed this potential bottleneck by introducing locally managed tablespaces (LMTs). A locally managed tablespace tracks free space in the tablespace with bitmaps, as discussed in Chapter 1. These bitmaps can be managed very efficiently because they are very compact compared to a freelist of available blocks. Because they are stored within the tablespace itself, instead of in the data dictionary tables, contention in the SYSTEM tablespace is reduced. As of Oracle 10g, by default, all tablespaces are created as locally managed tablespaces, including the SYSTEM and SYSAUX tablespaces. When the SYSTEM tablespace is locally managed, you can no longer create any dictionary-managed tablespaces in the database that are read/write. A dictionary-managed tablespace may still be plugged into the database from an earlier version of Oracle, but it is read-only. An LMT can have objects with one of two types of extents: automatically sized or all of a uniform size. If extent allocation is set to UNIFORM when the LMT is created, all extents, as expected, are the same size. Because all extents are the same size, there can be no fragmentation. Gone is the classic example of a 51MB segment that can’t be allocated in a tablespace with two free 50MB extents because the two 50MB extents are not adjacent. On the other hand, automatic segment extent management within a locally managed tablespace allocates space based on the size of the object. Initial extents are small, and if the object stays small, very little space is wasted. If the table grows past the initial extent allocated for the segment, subsequent extents to the segment are larger. Extents in an autoallocated LMT have sizes of 64KB, 1MB, 8MB, and 64MB, and the extent size increases as the size of the segment increases, up to a maximum of 64MB. In other words, Oracle is specifying what the values of INITIAL, NEXT, and PCTINCREASE are automatically, depending on how the object grows. Although it seems like fragmentation can occur in a tablespace with autoallocation, in practice the fragmentation is minimal because a new object with a 64KB initial segment size will fit nicely in a 1MB, 4MB, 8MB, or 64MB block preallocated for all other objects with an initial 64KB extent size. Given an LMT with either automatically managed extents or uniform extents, the free space within the segment itself can be AUTO or MANUAL. With AUTO segment space management, a bitmap is used to indicate how much space is used in each block. The parameters PCTUSED, FREELISTS, and FREELIST GROUPS no longer need to be specified when the segment is created. In addition, the performance of concurrent DML operations is improved because the segment’s bitmap allows concurrent access. In a freelist-managed segment, the data block in the segment header that contains the freelist is locked out to all other writers of the block when a single writer is looking for a free block in the segment. Although allocating multiple freelists for very active segments does somewhat solve the problem, it is another structure that the DBA has to manage.
- Chapter 6: Monitoring Space Usage 177 Another advantage of LMTs is that rollback information is reduced or eliminated when anyLMT space-related operation is performed. Because the update of a bitmap in a tablespace is notrecorded in a data dictionary table, no rollback information is generated for this transaction. Other than third-party applications, such as older versions of SAP that require dictionary-managed tablespaces, there are no other reasons for creating new dictionary-managed tablespacesin Oracle 10g. As mentioned earlier, compatibility is provided in part to allow dictionary-managedtablespaces from previous versions of Oracle to be “plugged into” an Oracle 11g database, althoughif the SYSTEM tablespace is locally managed, any dictionary-managed tablespaces must be openedread-only. Later in this chapter, you’ll see some examples where we can optimize space andperformance by moving a tablespace from one database to another and allocating additionaldata buffers for tablespaces with different sizes. Migrating a dictionary-managed tablespace to a locally managed tablespace is verystraightforward using the DBMS_SPACE_ADMIN built-in package:execute sys.dbms_space_admin.tablespace_migrate_to_local(USERS)After upgrading a database to either Oracle9i, Oracle 10g, or Oracle 11g, you may also want toconsider migrating the SYSTEM tablespace to an LMT; if so, a number of prerequisites are in order: ■ Before starting the migration, shut down the database and perform a cold backup of the database. ■ Any non-SYSTEM tablespaces that are to remain read/write should be converted to LMTs. ■ The default temporary tablespace must not be SYSTEM. ■ If automatic undo management is being used, the undo tablespace must be online. ■ For the duration of the conversion, all tablespaces except for the undo tablespace must be set to read-only. ■ The database must be started in RESTRICTED mode for the duration of the conversion. If any of these conditions are not met, the TABLESPACE_MIGRATE_TO_LOCAL procedure willnot perform the migration.Using OMF to Manage SpaceIn a nutshell, Oracle-Managed Files (OMF) simplifies the administration of an Oracle database. Atdatabase-creation time, or later by changing a couple parameters in the initialization parameterfile, the DBA can specify a number of default locations for database objects such as datafiles,redo log files, and control files. Prior to Oracle9i, the DBA had to remember where the existingdatafiles were stored by querying the DBA_DATA_FILES and DBA_TEMP_FILES views. On manyoccasions, a DBA would drop a tablespace, but would forget to delete the underlying datafiles,thus wasting space and the time it took to back up files that were no longer used by the database. Using OMF, Oracle not only automatically creates and deletes the files in the specifieddirectory location, it ensures that each filename is unique. This avoids corruption and databasedowntime in a non-OMF environment due to existing files being overwritten by a DBA inadvertentlycreating a new datafile with the same name as an existing datafile, and using the REUSE clause. In a test or development environment, OMF reduces the amount of time the DBA must spendon file management and lets him or her focus on the applications and other aspects of the test
- 178 Oracle Database 11g DBA Handbook database. OMF has an added benefit for packaged Oracle applications that need to create tablespaces: The scripts that create the new tablespaces do not need any modification to include a datafile name, thus increasing the likelihood of a successful application deployment. Migrating to OMF from a non-OMF environment is easy, and it can be accomplished over a longer time period. Non-OMF files and OMF files can coexist indefinitely in the same database. When the appropriate initialization parameters are set, all new datafiles, control files, and redo log files can be created as OMF files, while the previously existing files can continue to be managed manually until they are converted to OMF, if ever. The OMF-related initialization parameters are detailed in Table 6-1. Note that the operating system path specified for any of these initialization parameters must already exist; Oracle will not create the directory. Also, these directories must be writable by the operating system account that owns the Oracle software (which on most platforms is oracle). Bigfile Tablespaces Bigfile tablespaces, introduced in Oracle 10g, take OMF files to the next level; in a bigfile tablespace, a single datafile is allocated, and it can be up to 8EB (exabytes, a million terabytes) in size. Bigfile tablespaces can only be locally managed with automatic segment space management. If a bigfile tablespace is used for automatic undo or for temporary segments, then segment space management must be set to MANUAL. Bigfile tablespaces can save space in the System Global Area (SGA) and the control file because fewer datafiles need to be tracked; similarly, all alter tablespace commands on bigfile tablespaces need not refer to datafiles because one and only one datafile is associated with each bigfile tablespace. This moves the maintenance point from the physical (datafile) level to the logical (tablespace) level, simplifying administration. One downside to bigfile tablespaces is that a Initialization Parameter Description DB_CREATE_FILE_DEST The default operating system file directory where datafiles and tempfiles are created if no pathname is specified in the create tablespace command. This location is used for redo log files and control files if DB_CREATE_ONLINE_LOG_DEST_n is not specified. DB_CREATE_ONLINE_LOG_DEST_n Specifies the default location to store redo log files and control files when no pathname is specified for redo log files or control files at database-creation time. Up to five destinations can be specified with this parameter, allowing up to five multiplexed control files and five members of each redo log group. DB_RECOVERY_FILE_DEST Defines the default pathname in the server’s file system where RMAN backups, archived redo logs, and flashback logs are located. Also used for redo log files and control files if neither DB_CREATE_ FILE_DEST nor DB_CREATE_ONLINE_LOG_DEST_n is specified. TABLE 6-1 OMF-Related Initialization Parameters
- Chapter 6: Monitoring Space Usage 179backup of a bigfile tablespace uses a single process; a number of smaller tablespaces, however,can be backed up using parallel processes and will most likely take less time to back up than asingle bigfile tablespace. Creating a bigfile tablespace is as easy as adding the bigfile keyword to the create tablespacecommand:SQL> create bigfile tablespace whs01 2 datafile /u06/oradata/whs01.dbf size 10g;Tablespace created. If you are using OMF, then the datafile clause can be omitted. To resize a bigfile tablespace,you can use the resize clause:SQL> alter tablespace whs01 resize 80g;Tablespace altered.In this scenario, even 80GB is not big enough for this tablespace, so we will let it autoextend20GB at a time:SQL> alter tablespace whs01 autoextend on next 20g;Tablespace altered.Notice in both cases that we do not need to refer to a datafile; there is only one datafile, and oncethe tablespace is created, we no longer need to worry about the details of the underlying datafileand how it is managed. Bigfile tablespaces are intended for use with Automatic Storage Management, discussed in thenext section.Automatic Storage ManagementUsing Automatic Storage Management (ASM) can significantly reduce the administrative overheadof managing space in a database because a DBA need only specify an ASM disk group whenallocating space for a tablespace or other database object. Database files are automaticallydistributed among all available disks in a disk group, and the distribution is automatically updatedwhenever the disk configuration changes. For example, when a new disk volume is added to anexisting disk group in an ASM instance, all datafiles within the disk group are redistributed to usethe new disk volume. I introduced ASM in Chapter 4. In this section, I’ll revisit some other keyASM concepts from a storage management point of view and provide more examples. Because ASM automatically places datafiles on multiple disks, performance of queries andDML statements is improved because the I/O is spread out among several disks. Optionally, thedisks in an ASM group can be mirrored to provide additional redundancy and performance benefits. Using ASM provides a number of other benefits. In many cases, an ASM instance with a numberof physical disks can be used instead of a third-party volume manager or network-attached storage(NAS) subsystem. As an added benefit over volume managers, ASM maintenance operations donot require a shutdown of the database if a disk needs to be added or removed from a disk group. In the next few sections, we’ll delve further into how ASM works, with an example of how tocreate a database object using ASM.Disk Group RedundancyA disk group in ASM is a collection of one or more ASM disks managed as a single entity. Diskscan be added or removed from a disk group without shutting down the database. Whenever a
- 180 Oracle Database 11g DBA Handbook disk is added or removed, ASM automatically rebalances the datafiles on the disks to maximize redundancy and I/O performance. In addition to the advantages of high redundancy, a disk group can be used by more than one database. This helps to maximize the investment in physical disk drives by easily reallocating disk space among several databases whose disk space needs may change over the course of a day or the course of a year. As I explained in Chapter 4, the three types of disk groups are normal redundancy, high redundancy, and external redundancy. The normal-redundancy and high-redundancy groups require that ASM provide the redundancy for files stored in the group. The difference between normal redundancy and high redundancy is in the number of failure groups required: A normal- redundancy disk group typically has two failure groups, and a high-redundancy disk group will have at least three failure groups. A failure group in ASM would roughly correspond to a redo log file group member using traditional Oracle datafile management. External redundancy requires that the redundancy be provided by a mechanism other than ASM (for example, with a hardware third-party RAID storage array). Alternatively, a disk group might contain a non-mirrored disk volume that is used for a read-only tablespace that can easily be re-created if the disk volume fails. ASM Instance ASM requires a dedicated Oracle instance, typically on the same node as the database that is using an ASM disk group. In an Oracle Real Application Clusters (RAC) environment, each node in a RAC database has an ASM instance. An ASM instance never mounts a database; it only coordinates the disk volumes for other database instances. In addition, all database I/O from an instance goes directly to the disks in a disk group. Disk group maintenance, however, is performed in the ASM instance; as a result, the memory footprint needed to support an ASM instance can be as low as 64MB. For more details on how to configure ASM for use with RAC, see Chapter 10. Background Processes Two new Oracle background processes exist in the ASM instance. The RBAL background process coordinates the automatic disk group rebalance activity for a disk group. The other background processes, ORB0 through ORB9, perform the actual rebalance activity in parallel. Creating Objects Using ASM Before a database can use an ASM disk group, the group must be created by the ASM instance. In the following example, a new disk group, KMS25, is created to manage the Unix disk volumes / dev/hda1, /dev/hda2, /dev/hdb1, /dev/hdc1, and /dev/hdd4: SQL> create diskgroup kms25 normal redundancy 2 failgroup mir1 disk /dev/hda1,/dev/hda2, 3 failgroup mir2 disk /dev/hdb1,/dev/hdc1,/dev/hdd4; When normal redundancy is specified, at least two failure groups must be specified to provide two-way mirroring for any datafiles created in the disk group. In the database instance that is using the disk group, OMF is used in conjunction with ASM to create the datafiles for the logical database structures. In the following example, we set the initialization parameter DB_CREATE_FILE_DEST using a disk group so that any tablespaces created using OMF will automatically be named and placed in the disk group KMS25: db_create_file_dest = +kms25
- Chapter 6: Monitoring Space Usage 181 Creating a tablespace in the disk group is straight to the point:SQL> create tablespace lob_video; Once an ASM file is created, the automatically generated filenames can be found in V$DATAFILEand V$LOGFILE, along with manually generated filenames. All typical database files can be createdusing ASM, except for administrative files, including trace files, alert logs, backup files, exportfiles, and core dump files. OMF is a handy option when you want to let Oracle manage the datafile naming for you,whether the datafile is on a conventional file system or in an ASM disk group. You can also mixand match: some of your datafiles can be OMF-named, and others manually named.Undo Management ConsiderationsCreating an undo tablespace provides a number of benefits for both the DBA and a typical databaseuser. For the DBA, the management of rollback segments is a thing of the past—all undo segmentsare managed automatically by Oracle in the undo tablespace. In addition to providing a read-consistent view of database objects to database readers when a long transaction against an object isin progress, an undo tablespace can provide a mechanism for a user to recover rows from a table. A big enough undo tablespace will minimize the possibility of getting the classic “Snapshottoo old” error message, but how much undo space is enough? If it is undersized, then theavailability window for flashback queries is short; if it is sized too big, disk space is wasted andbackup operations may take longer than necessary. A number of initialization parameter files control the allocation and use of undo tablespaces.The UNDO_MANAGEMENT parameter specifies whether AUTOMATIC undo management is used,and the UNDO_TABLESPACE parameter specifies the undo tablespace itself. To change undomanagement from rollback segments to automatic undo management (changing the value ofUNDO_MANAGEMENT from MANUAL to AUTO), the instance must be shut down and restartedfor the change to take effect; you can change the value of UNDO_TABLESPACE while the databaseis open. The UNDO_RETENTION parameter specifies, in seconds, the minimum amount of timethat undo information should be retained for Flashback queries. However, with an undersizedundo tablespace and heavy DML usage, some undo information may be overwritten before thetime period specified in UNDO_RETENTION. New to Oracle 10g is the RETENTION GUARANTEE clause of the CREATE UNDO TABLESPACEcommand. In essence, an undo tablespace with a RETENTION GUARANTEE will not overwriteunexpired undo information at the expense of failed DML operations when there is not enough freeundo space in the undo tablespace. More details on using this clause can be found in Chapter 7. The following initialization parameters enable automatic undo management with the undotablespace UNDO04 using a retention period of at least 24 hours:undo_management = autoundo_tablespace = undo04undo_retention = 86400 The dynamic performance view V$UNDOSTAT can assist in sizing the undo tablespacecorrectly for the transaction load during peak processing periods. The rows in V$UNDOSTATare inserted at ten-minute intervals and give a snapshot of the undo tablespace usage:SQL> select to_char(end_time,yyyy-mm-dd hh24:mi) end_time, 2 undoblks, ssolderrcnt from v$undostat;
- 182 Oracle Database 11g DBA Handbook END_TIME UNDOBLKS SSOLDERRCNT ------------------ -------- ----------- 2007-07-23 10:28 522 0 2007-07-23 10:21 1770 0 2007-07-23 10:11 857 0 2007-07-23 10:01 1605 0 2007-07-23 09:51 2864 3 2007-07-23 09:41 783 0 2007-07-23 09:31 1543 0 2007-07-23 09:21 1789 0 2007-07-23 09:11 890 0 2007-07-23 09:01 1491 0 In this example, a peak in undo space usage occurred between 9:41 A.M. and 9:51 A.M., resulting in a “Snapshot too old” error for three queries. To prevent these errors, the undo tablespace should be either manually resized or allowed to autoextend. SYSAUX Monitoring and Usage The SYSAUX tablespace, introduced in Oracle 10g, is an auxiliary tablespace to the SYSTEM tablespace, and it houses data for several components of the Oracle database that either required their own tablespace or used the SYSTEM tablespace in previous releases of Oracle. These components include the Enterprise Manager Repository, formerly in the tablespace OEM_ REPOSITORY, as well as LogMiner, Oracle Spatial, and Oracle Text, all of which formerly used the SYSTEM tablespace for storing configuration information. The current occupants of the SYSAUX tablespace can be identified by querying the V$SYSAUX_OCCUPANTS view: SQL> select occupant_name, occupant_desc, space_usage_kbytes 2 from v$sysaux_occupants; OCCUPANT_NAME OCCUPANT_DESC SPACE_USAGE_KBYTES ------------- ---------------------------------------- ------------------ LOGMNR LogMiner 7744 LOGSTDBY Logical Standby 960 SMON_SCN_TIME Transaction Layer - SCN to TIME mapping 3328 PL/SCOPE PL/SQL Identifier Collection 384 STREAMS Oracle Streams 1024 XDB XDB 98816 AO Analytical Workspace Object Table 38208 XSOQHIST OLAP API History Tables 38208 XSAMD OLAP Catalog 15936 SM/AWR Server Manageability - Automatic Workloa 131712 d Repository SM/ADVISOR Server Manageability - Advisor Framework 13248 SM/OPTSTAT Server Manageability - Optimizer Statist 52672 ics History SM/OTHER Server Manageability - Other Components 6016 STATSPACK Statspack Repository 0 SDO Oracle Spatial 47424 WM Workspace Manager 7296 ORDIM Oracle interMedia ORDSYS Components 11200
- Chapter 6: Monitoring Space Usage 183ORDIM/PLUGINS Oracle interMedia ORDPLUGINS Components 0ORDIM/SQLMM Oracle interMedia SI_INFORMTN_SCHEMA Com 0 ponentsEM Enterprise Manager Repository 155200TEXT Oracle Text 5568ULTRASEARCH Oracle Ultra Search 7616ULTRASEARCH_D Oracle Ultra Search Demo User 12288EMO_USEREXPRESSION_FI Expression Filter System 3968LTEREM_MONITORING Enterprise Manager Monitoring User 1536_USERTSM Oracle Transparent Session Migration User 256SQL_MANAGEMEN SQL Management Base Schema 1728T_BASEAUTO_TASK Automated Maintenance Tasks 320JOB_SCHEDULER Unified Job Scheduler 57629 rows selected. If the SYSAUX tablespace is taken offline or otherwise becomes corrupted, only thesecomponents of the Oracle database will be unavailable; the core functionality of the database willbe unaffected. In any case, the SYSAUX tablespace helps to take the load off of the SYSTEMtablespace during normal operation of the database. To monitor the usage of the SYSAUX tablespace, you can query the column SPACE_USAGE_KBYTES on a routine basis, and it can alert the DBA when the space usage grows beyond a certainlevel. If the space usage for a particular component requires a dedicated tablespace to be allocatedfor the component, such as for the EM Repository, the procedure identified in the MOVE_PROCEDURE column of the V$SYSAUX_OCCUPANTS view will move the application toanother tablespace:SQL> select occupant_name, move_procedure from v$sysaux_occupants 2 where occupant_name = EM;OCCUPANT_NAME MOVE_PROCEDURE--------------- -------------------------------------------------EM emd_maintenance.move_em_tblspc In the following scenario, we know that we will be adding several hundred nodes to ourmanagement repository in the near future. Because we want to keep the SYSAUX tablespace fromgrowing too large, we decide to create a new tablespace to hold only the Enterprise Managerdata. In the following example, we’ll create a new tablespace and move the Enterprise Managerschema into the new tablespace:SQL> create tablespace EM_REP 2> datafile +DATA size 250m autoextend on next 100m;Tablespace created.SQL> execute sysman.emd_maintenance.move_em_tblspc(EM_REP);PL/SQL procedure successfully completed.SQL> select occupant_name, occupant_desc, space_usage_kbytes 2> from v$sysaux_occupants
- 184 Oracle Database 11g DBA Handbook 3> where occupant_name = EM; OCCUPANT_NAME OCCUPANT_DESC SPACE_USAGE_KBYTES -------------- ---------------------------------------- ------------------- EM Enterprise Manager Repository 0 1 row selected. Since the current space allocation for the EM tools is about 150MB, a tablespace starting at a size of 250MB with additional extents of 100MB each should be sufficient for most environments. Note that the row for Enterprise Manager is still in V$SYSAUX_OCCUPANTS; even though it is not taking up any space in the SYSAUX tablespace, we may want to move its metadata back into SYSAUX at some point in the future. Therefore, we may need to query V$SYSAUX_OCCUPANTS again to retrieve the move procedure. We use the same procedure for moving the application into and out of SYSAUX: SQL> execute sysman.emd_maintenance.move_em_tblspc(SYSAUX); PL/SQL procedure successfully completed. If a component is not being used in the database at all, such as Ultra Search, a negligible amount of space is used in the SYSAUX tablespace. Archived Redo Log File Management It is important to consider space management for objects that exist outside of the database, such as archived redo log files. In ARCHIVELOG mode, an online redo log file is copied to the destination(s) specified by LOG_ARCHIVE_DEST_n (where n is a number from 1 to 10) or by DB_RECOVERY_ FILE_DEST (the flash recovery area) if none of the LOG_ARCHIVE_DEST_n values are set. The redo log being copied must be copied successfully to at least one of the destinations before it can be reused by the database. The LOG_ARCHIVE_MIN_SUCCEED_DEST parameter defaults to 1 and must be at least 1. If none of the copy operations are successful, the database will be suspended until at least one of the destinations receives the log file. Running out of disk space is one possible reason for this type of failure. If the destination for the archived log files is on a local file system, an operating system shell script can monitor the space usage of the destination, or it can be scheduled with DBMS_ SCHEDULER or with OEM. Built-in Space Management Tools Oracle 10g provides a number of built-in tools that a DBA can use on demand to determine if there are any problems with disk space in the database. Most, if not all, of these tools can be manually configured and run by calling the appropriate built-in package. In this section, we’ll cover the packages and procedures used to query the database for space problems or advice on space management. In addition, I’ll show you the new initialization parameter used by the Automatic Diagnostic Repository to identify the alert and trace file location. Later in this chapter, you’ll see how some of these tools can be automated to notify the DBA via e-mail or pager when a problem is imminent; many, if not all, of these tools are available on demand via the EM Database Control web interface.
- Chapter 6: Monitoring Space Usage 185Segment AdvisorFrequent inserts, updates, and deletes on a table may, over time, leave the space within a tablefragmented. Oracle can perform segment shrink on a table or index. Shrinking the segment makesthe free space in the segment available to other segments in the tablespace, with the potential toimprove future DML operations on the segment because fewer blocks may need to be retrievedfor the DML operation after the segment shrink. Segment shrink is very similar to online tableredefinition in that space in a table is reclaimed. However, segment shrink can be performedin place without the additional space requirements of online table redefinition. To determine which segments will benefit from segment shrink, you can invoke SegmentAdvisor to perform growth trend analysis on specified segments. In this section, we’ll invokeSegment Advisor on some candidate segments that may be vulnerable to fragmentation. In the example that follows, we’ll set up Segment Advisor to monitor the HR.EMPLOYEEStable. In recent months, there has been high activity on this table; in addition, a new column,WORK_RECORD, has been added to the table, which HR uses to maintain comments aboutthe employees:SQL> alter table hr.employees add (work_record varchar2(4000));Table altered.SQL> alter table hr.employees enable row movement;Table altered.We have enabled ROW MOVEMENT in the table so that shrink operations can be performed onthe table if recommended by Segment Advisor. After Segment Advisor has been invoked to give recommendations, the findings from SegmentAdvisor are available in the DBA_ADVISOR_FINDINGS data dictionary view. To show the potentialbenefits of shrinking segments when Segment Advisor recommends a shrink operation, the viewDBA_ADVISOR_RECOMMENDATIONS provides the recommended shrink operation along withthe potential savings, in bytes, for the operation. To set up Segment Advisor to analyze the HR.EMPLOYEES table, we will use an anonymousPL/SQL block, as follows:-- begin Segment Advisor analysis for HR.EMPLOYEES-- rev. 1.1 RJB 07/07/2007---- SQL*Plus variable to retrieve the task number from Segment Advisorvariable task_id number-- PL/SQL block followsdeclare name varchar2(100); descr varchar2(500); obj_id number;begin name := ; -- unique name generated from create_task descr := Check HR.EMPLOYEE table; dbms_advisor.create_task (Segment Advisor, :task_id, name, descr, NULL); dbms_advisor.create_object (name, TABLE, HR, EMPLOYEES, NULL, NULL, obj_id);
- 186 Oracle Database 11g DBA Handbook dbms_advisor.set_task_parameter(name, RECOMMEND_ALL, TRUE); dbms_advisor.execute_task(name); end; PL/SQL procedure successfully completed. SQL> print task_id TASK_ID ---------- 384 SQL> The procedure DBMS_ADVISOR.CREATE_TASK specifies the type of advisor; in this case, it is Segment Advisor. The procedure will return a unique task ID and an automatically generated name to the calling program; we will assign our own description to the task. Within the task, identified by the uniquely generated name returned from the previous procedure, we identify the object to be analyzed with DBMS_ADVISOR.CREATE_OBJECT. Depending on the type of object, the second through the sixth arguments vary. For tables, we only need to specify the schema name and the table name. Using DBMS_ADVISOR.SET_TASK_PARAMETER, we tell Segment Advisor to give all possible recommendations about the table. If we want to turn off recommendations for this task, we would specify FALSE instead of TRUE for the last parameter. Finally, we initiate the Segment Advisor task with the DBMS_ADVISOR.EXECUTE_TASK procedure. Once it is done, we display the identifier for the task so we can query the results in the appropriate data dictionary views. Now that we have a task number from invoking Segment Advisor, we can query DBA_ ADVISOR_FINDINGS to see what we can do to improve the space utilization of the HR.EMPLOYEES table: SQL> select owner, task_id, task_name, type, 2 message, more_info from dba_advisor_findings 3 where task_id = 384; OWNER TASK_ID TASK_NAME TYPE ---------- ------- --------- ------ RJB 6 TASK_00003 INFORMATION MESSAGE -------------------------------------------------- Perform shrink, estimated savings is 107602 bytes. MORE_INFO --------------------------------------------------------------------- Allocated Space:262144: Used Space:153011: Reclaimable Space :107602: The results are fairly self-explanatory. We can perform a segment shrink operation on the table to reclaim space from numerous insert, delete, and update operations on the HR.EMPLOYEES table. Because the WORK_RECORD column was added to the HR.EMPLOYEES table after the table was already populated, we may have created some chained rows in the table; in addition, since the WORK_RECORD column can be up to 4000 bytes long, updates or deletes of rows with big
- Chapter 6: Monitoring Space Usage 187WORK_RECORD columns may create blocks in the table with free space that can be reclaimed.The view DBA_ADVISOR_RECOMMENDATIONS provides similar information:SQL> select owner, task_id, task_name, benefit_type 2 from dba_advisor_recommendations 3 where task_id = 384;OWNER TASK_ID TASK_NAME---------- ------- ----------RJB 384 TASK_00003BENEFIT_TYPE--------------------------------------------------Perform shrink, estimated savings is 107602 bytes. In any case, we will shrink the segment HR.EMPLOYEES to reclaim the free space. As anadded time-saving benefit to the DBA, the SQL needed to perform the shrink is provided in theview DBA_ADVISOR_ACTIONS:SQL> select owner, task_id, task_name, command, attr1 2 from dba_advisor_actions where task_id = 384;OWNER TASK_ID TASK_NAME COMMAND---------- ------- ---------- -----------------RJB 6 TASK_00003 SHRINK SPACEATTR1-----------------------------------------------------alter table HR.EMPLOYEES shrink space1 row selected.SQL> alter table HR.EMPLOYEES shrink space;Table altered. As mentioned earlier, the shrink operation does not require extra disk space and does notprevent access to the table during the operation, except for a very short period of time at the end ofthe process to free the unused space. All indexes are maintained on the table during the operation. In addition to freeing up disk space for other segments, there are other benefits to shrinking asegment. Cache utilization is improved because fewer blocks need to be in the cache to satisfySELECT or other DML statements against the segment. Also, because the data in the segment ismore compact, the performance of full table scans is improved. There are a couple of caveats and minor restrictions. First, segment shrink will not workon LOB segments if you are using Oracle Database 10g. Online table reorganization is a moreappropriate method in this case. Also, segment shrink is not allowed on a table that containsany function-based indexes regardless of whether you are using Oracle Database 10g or 11g.Undo Advisor and the Automatic Workload RepositoryNew to Oracle 10g, the Undo Advisor provides tuning information for the undo tablespace,whether it’s sized too large, it’s too small, or the undo retention (via the initialization parameterUNDO_RETENTION) is not set optimally for the types of transactions that occur in the database.
- 188 Oracle Database 11g DBA Handbook Using the Undo Advisor is similar to using the Segment Advisor in that we will call the DBMS_ADVISOR procedures and query the DBA_ADVISOR_* data dictionary views to see the results of the analysis. The Undo Advisor, however, relies on another feature new to Oracle 10g—the Automatic Workload Repository (AWR). The Automatic Workload Repository, built into every Oracle database, contains snapshots of all key statistics and workloads in the database at 60-minute intervals by default. The statistics in the AWR are kept for seven days, after which the oldest statistics are dropped. Both the snapshot intervals and the retention period can be adjusted to suit your environment, however. The AWR maintains the historical record of how the database is being used over time and helps to diagnose and predict problems long before they can cause a database outage. To set up Undo Advisor to analyze undo space usage, we will use an anonymous PL/SQL block similar to what we used for Segment Advisor. Before we can use Segment Advisor, however, we need to determine the timeframe to analyze. The data dictionary view DBA_HIST_SNAPSHOT contains the snapshot numbers and date stamps; we will look for the snapshot numbers from 8:00 P.M. Saturday, July 21, 2007 through 9:30 P.M. Saturday, July 21, 2007: SQL> select snap_id, begin_interval_time, end_interval_time 2 from DBA_HIST_SNAPSHOT 3 where begin_interval_time > 21-Jul-07 08.00.00 PM and 4 end_interval_time < 21-Jul-07 09.31.00 PM 5 order by end_interval_time desc; SNAP_ID BEGIN_INTERVAL_TIME END_INTERVAL_TIME ---------- --------------------------- --------------------------- 8 21-JAN-07 09.00.30.828 PM 21-JAN-07 09.30.14.078 PM 7 21-JAN-07 08.30.41.296 PM 21-JAN-07 09.00.30.828 PM 6 21-JAN-07 08.00.56.093 PM 21-JAN-07 08.30.41.296 PM Given these results, we will use a SNAP_ID range from 6 to 8 when we invoke Undo Advisor. The PL/SQL anonymous block is as follows: -- begin Undo Advisor analysis -- rev. 1.1 RJB 7/16/2007 -- -- SQL*Plus variable to retrieve the task number from Segment Advisor variable task_id number declare task_id number; name varchar2(100); descr varchar2(500); obj_id number; begin name := ; -- unique name generated from create_task descr := Check Undo Tablespace; dbms_advisor.create_task (Undo Advisor, :task_id, name, descr); dbms_advisor.create_object (name, UNDO_TBS, NULL, NULL, NULL, null, obj_id); dbms_advisor.set_task_parameter(name, TARGET_OBJECTS, obj_id); dbms_advisor.set_task_parameter(name, START_SNAPSHOT, 6);
- Chapter 6: Monitoring Space Usage 189 dbms_advisor.set_task_parameter(name, END_SNAPSHOT, 8); dbms_advisor.set_task_parameter(name, INSTANCE, 1); dbms_advisor.execute_task(name);end;PL/SQL procedure successfully completed.SQL> print task_idTASK_ID------- 527 As with the Segment Advisor, we can review the DBA_ADVISOR_FINDINGS view to see theproblem and the recommendations.SQL> select owner, task_id, task_name, type, 2 message, more_info from dba_advisor_findings 3 where task_id = 527;OWNER TASK_ID TASK_NAME TYPE---------- ------- ---------- -------------RJB 527 TASK_00003 PROBLEMMESSAGE-----------------------------------------------------The undo tablespace is OK.MORE_INFO-------------------------------------------------------------------- In this particular scenario, Undo Advisor indicates that there is enough space allocated in theundo tablespace to handle the types and volumes of queries run against this database.Index UsageAlthough indexes provide a tremendous benefit by speeding up queries, they can have an impacton space usage in the database. If an index is not being used at all, the space occupied by anindex can be better used elsewhere; if we don’t need the index, we also can save processing timefor insert, update, and delete operations that have an impact on the index. Index usage can bemonitored with the dynamic performance view V$OBJECT_USAGE. In our HR schema, wesuspect that the index on the JOB_ID column of the EMPLOYEES table is not being used. Weturn on monitoring for this index as follows:SQL> alter index hr.emp_job_ix monitoring usage;Index altered. We take a quick look at the V$OBJECT_USAGE view to make sure this index is being monitored:SQL> select * from v$object_usage;INDEX_NAME TABLE_NAME MON USED START_MONITORING--------------- --------------- --- ---- -------------------EMP_JOB_IX EMPLOYEES YES NO 07/24/2007 10:04:55
- 190 Oracle Database 11g DBA Handbook The column USED will tell us if this index is accessed to satisfy a query. After a full day of typical user activity, we check V$OBJECT_USAGE again and then turn off monitoring: SQL> alter index hr.emp_job_ix nomonitoring usage; Index altered. SQL> select * from v$object_usage; INDEX_NAME TABLE_NAME MON USED START_MONITORING END_MONITORING ---------- --------------- --- ---- ------------------- --------------- EMP_JOB_IX EMPLOYEES NO YES 07/24/2007 10:04:55 07/25/2007 11:39:45 Sure enough, the index appears to be used at least once during a typical day. On the other end of the spectrum, an index may be accessed too frequently. If key values are inserted, updated, and deleted frequently, an index can become less efficient in terms of space usage. The following commands can be used as a baseline for an index after it is created, and then run periodically to see if the space usage becomes inefficient: SQL> analyze index hr.emp_job_ix validate structure; Index analyzed. SQL> select pct_used from index_stats where name = EMP_JOB_IX; PCT_USED ---------- 78 The PCT_USED column indicates the percentage of the allocated space for the index in use. Over time, the EMPLOYEES table is heavily used, due to the high turnover rate of employees at the company, and this index, among others, is not using its space efficiently, as indicated by the following analyze command and select query, so we decide that a rebuild is in order: SQL> analyze index hr.emp_job_ix validate structure; Index analyzed. SQL> select pct_used from index_stats where name = EMP_JOB_IX; PCT_USED ---------- 26 SQL> alter index hr.emp_job_ix rebuild online; Index altered. Notice the inclusion of the online option in the alter index . . . rebuild statement. The indexed table can remain online with minimal overhead while the index is rebuilding. In rare circumstances, such as on longer key lengths, you may not be able to use the online option. Space Usage Warning Levels Earlier in this chapter, we reviewed the data dictionary view DBA_THRESHOLDS, which contains a list of the active metrics to measure a database’s health. In a default installation of Oracle 11g, use the following select statement to see some of the 22 built-in thresholds: SQL> select metrics_name, warning_operator warn, warning_value wval, 2 critical_operator crit, critical_value cval, 3 consecutive_occurrences consec 4 from dba_thresholds;
- Chapter 6: Monitoring Space Usage 191METRICS_NAME WARN WVAL CRIT CVAL CONSEC-------------------------------- ---- ------------- ---- ------------- ------Average Users Waiting Counts GT 10 NONE 3. . .Blocked User Session Count GT 0 NONE 15Current Open Cursors Count GT 1200 NONE 3Database Time Spent Waiting (%) GT 30 NONE 3. . .Logons Per Sec GE 100 NONE 2Session Limit % GT 90 GT 97 3Tablespace Bytes Space Usage LE 0 LE 0 1Tablespace Space Usage GE 85 GE 97 122 rows selected. In terms of space usage, we see that the warning level for a given tablespace is when thetablespace is 85 percent full, and the space is at a critical level when it reaches 97 percent full.In addition, this condition need only occur during one reporting period, which by default is oneminute. For the other conditions in this list, the condition must be true anywhere between 2 and15 consecutive reporting periods before an alert is issued. To change the level at which an alert is generated, we can use the DBMS_SERVER_ALERT.SET_THRESHOLD procedure. In this example, we want to be notified sooner if a tablespace isrunning out of space, so we will update the warning threshold for alert notification from 85percent down to 60 percent:---- PL/SQL anonymous procedure to update the Tablespace Space Usage threshold--declare /* OUT */ warning_operator number; warning_value varchar2(100); critical_operator number; critical_value varchar2(100); observation_period number; consecutive_occurrences number; /* IN */ metrics_id number; instance_name varchar2(50); object_type number; object_name varchar2(50); new_warning_value varchar2(100) := 60;begin metrics_id := DBMS_SERVER_ALERT.TABLESPACE_PCT_FULL; object_type := DBMS_SERVER_ALERT.OBJECT_TYPE_TABLESPACE; instance_name := dw; object_name := NULL;
- 192 Oracle Database 11g DBA Handbook -- retrieve the current values with get_threshold dbms_server_alert.get_threshold( metrics_id, warning_operator, warning_value, critical_operator, critical_value, observation_period, consecutive_occurrences, instance_name, object_type, object_name); -- update the warning threshold value from 85 to 60 dbms_server_alert.set_threshold( metrics_id, warning_operator, new_warning_value, critical_operator, critical_value, observation_period, consecutive_occurrences, instance_name, object_type, object_name); end; PL/SQL procedure successfully completed. Checking DBA_THRESHOLDS again, we see the warning level has been changed to 60 percent: SQL> select metrics_name, warning_operator warn, warning_value wval 2 from dba_thresholds; METRICS_NAME WARN WVAL -------------------------------- ---- ------------- Average Users Waiting Counts GT 10 . . . Blocked User Session Count GT 0 Current Open Cursors Count GT 1200 Database Time Spent Waiting (%) GT 30 . . . Logons Per Sec GE 100 Session Limit % GT 90 Tablespace Bytes Space Usage LE 0 Tablespace Space Usage GE 60 22 rows selected. A detailed example of how to use Oracle’s Advanced Queuing to subscribe to queue alert messages is beyond the scope of this book. Later in this chapter, I will, however, show some examples of how to use Enterprise Manager to set up asynchronous notification of alert conditions using e-mail, a pager, or a PL/SQL procedure. Resumable Space Allocation Starting with Oracle9i, the Oracle database provides a way to suspend long-running operations in the event of space allocation failures. Once the DBA is notified and the space allocation problem has been corrected, the long-running operation can complete. The long-running operation does not have to be restarted from the beginning.
- Chapter 6: Monitoring Space Usage 193 Three types of space management problems can be addressed with Resumable Space Allocation: ■ Out of space in the tablespace ■ Maximum extents reached in the segment ■ Space quota exceeded for a user The DBA can automatically make statements resumable by setting the initialization parameterRESUMABLE_TIMEOUT to a value other than 0. This value is specified in seconds. At the sessionlevel, a user can enable resumable operations by using the ALTER SESSION ENABLE RESUMABLEcommand:SQL> alter session enable resumable timeout 3600;In this case, any long-running operation that may run out of space will suspend for up to 3600seconds (60 minutes) until the space condition is corrected. If it is not corrected within the timelimit, the statement fails. In the scenario that follows, the HR department is trying to add the employees from the branchoffice EMPLOYEES table to an EMPLOYEE_SEARCH table that contains employees throughout thecompany. Without Resumable Space Allocation, the HR user receives an error, as follows:SQL> insert into employee_search 2 select * from employees;insert into employee_search*ERROR at line 1:ORA-01653: unable to extend table HR.EMPLOYEE_SEARCH by 128 in tablespace USERS9 After running into this problem many times, the HR user decides to use Resumable SpaceAllocation to prevent a lot of rework whenever there are space problems in the database, andtries the operation again:SQL> alter session enable resumable timeout 3600;Session altered.SQL> insert into hr.employee_search 2 select * from hr.employees; The user does not receive a message, and it is not clear that the operation has beensuspended. However, in the alert log (managed by the Automatic Diagnostic Repositoryas of Oracle Database 11g), the XML message reads as follows:<msg time=2007-07-23T22:58:26.749-05:00 org_id=oracle comp_id=rdbms client_id= type=UNKNOWN level=16 host_id=dw host_addr=192.168.2.95 module=SQL*Pluspid=1843><txt> ORA-01653: unable to extend table HR.EMPLOYEE_SEARCH by 128 in tablespace USERS9</txt></msg>
- 194 Oracle Database 11g DBA Handbook The DBA receives a pager alert, set up in OEM, and checks the data dictionary view DBA_ RESUMABLE: SQL> select user_id, instance_id, status, name, error_msg 2 from dba_resumable; USER_ID INSTANCE_ID STATUS NAME ERROR_MSG ---------- ----------- --------- -------------------- -------------------- 80 1 SUSPENDED User HR(80), Session ORA-01653: unable to 113, Instance 1 extend table HR.EMP LOYEE_SEARCH by 128 in tablespace USERS9 The DBA notices that the tablespace USERS9 does not allow autoextend, and modifies the tablespace to allow growth: SQL> alter tablespace users9 2 add datafile +DATA 3 size 100m autoextend on; Tablespace altered. The user session’s insert completes successfully, and the status of the resumable operation is reflected in the DBA_RESUMABLE view: USER_ID INSTANCE_ID STATUS NAME ERROR_MSG ---------- ----------- --------- -------------------- -------------------- 80 1 NORMAL User HR(80), Session 113, Instance 1 The alert log file also indicates a successful resumption of this operation: <msg time=2007-07-23T23:06:31.178-05:00 org_id=oracle comp_id=rdbms client_id= type=UNKNOWN level=16 host_id=dw host_addr=192.168.2.95 module=SQL*Plus pid=1843> <txt>statement in resumable session 'User HR(80), Session 113, Instance 1' was resumed </txt> </msg> In Figure 6-3, you can see the tablespace USERS9 space alert appear on the instance’s home page in the Alerts section, in addition to the previous alert warning you that the USERS9 tablespace was nearly full about 15 minutes before the HR user temporarily ran out of space! As far as the user is concerned, the operation took longer than expected but still completed successfully. Another way to provide more information to the user is to set up a special type of trigger introduced in Oracle9i called a system trigger. A system trigger is like any other trigger,
- Chapter 6: Monitoring Space Usage 195FIGURE 6-3 Alerts section on the instance home pageexcept it is based on some type of system event rather than on a DML statement against a table.Here is a template for a system trigger that fires on an AFTER SUSPEND event:create or replace trigger resumable_notify after suspend on database -- fired when resumable space event occursdeclare -- variables, if requiredbegin -- give DBA 2 hours to resolve dbms_resumable.set_timeout(7200); -- check DBA_RESUMABLE for user ID, then send e-mail utl_mail.send (karen_s@rjbdba.com, . . . );end;Managing Alert and Trace Files with ADRNew to Oracle Database 11g, the Automatic Diagnostic Repository (ADR) is a system-managedrepository for storing database alert logs, trace files, and any other diagnostic data previouslycontrolled by several other initialization parameters. The initialization parameter DIAGNOSTIC_DEST sets the base location for all diagnosticdirectories; in the dw database I use throughout this chapter, the value of the parameterDIAGNOSTIC_DEST is /u01/app/oracle. Figure 6-4 shows a typical directory structure startingwith the subdirectory /u01/app/oracle/diag. Notice that there are separate directories for the ASM databases and the database (rdbms)instances; within the rdbms directory, you can see the dw directory twice: the first-level directoryis the database dw, and the second dw is the instance dw. If this were a Real Application Clusters(RAC) database, you would see each instance of the dw database under the first-level dw directory.In fact, Oracle strongly recommends that all instances within a RAC database have the samevalue for DIAGNOSTIC_DEST. Because the location of all logging and diagnostic information is controlled by the initializationparameter DIAGNOSTIC_DEST, the following initialization parameters are ignored: ■ BACKGROUND_DUMP_DEST ■ USER_DUMP_DEST ■ CORE_DUMP_DEST
- 196 Oracle Database 11g DBA Handbook FIGURE 6-4 ADR directory structure For backward compatibility, however, you can still use these as read-only parameters to determine the location of the alert log, trace files, and core dumps: SQL> show parameter dump_dest NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ background_dump_dest string /u01/app/oracle/diag/rdbms/dw/ dw/trace core_dump_dest string /u01/app/oracle/diag/rdbms/dw/ dw/cdump user_dump_dest string /u01/app/oracle/diag/rdbms/dw/ dw/trace You can still alter the values for these parameters, but they are ignored by ADR. Alternatively, you can use the view V$DIAG_INFO to find all diagnostic-related directories for the instance: SQL> select name, value from v$diag_info; NAME VALUE ------------------------- --------------------------------------------- Diag Enabled TRUE
- Chapter 6: Monitoring Space Usage 197ADR Base /u01/app/oracleADR Home /u01/app/oracle/diag/rdbms/dw/dwDiag Trace /u01/app/oracle/diag/rdbms/dw/dw/traceDiag Alert /u01/app/oracle/diag/rdbms/dw/dw/alertDiag Incident /u01/app/oracle/diag/rdbms/dw/dw/incidentDiag Cdump /u01/app/oracle/diag/rdbms/dw/dw/cdumpHealth Monitor /u01/app/oracle/diag/rdbms/dw/dw/hmDefault Trace File /u01/app/oracle/diag/rdbms/dw/dw/trace/dw_ora _28810.trcActive Problem Count 0Active Incident Count 011 rows selected.OS Space ManagementOutside of the Oracle environment, space should be monitored by the system administrator witha thorough understanding from the DBA as to the parameters in place for autoextending datafiles.Setting AUTOEXTEND ON with large NEXT values for a tablespace will allow a tablespace togrow and accommodate more inserts and updates, but this will fail if the server’s disk volumesdo not have the space available.Space Management ScriptsIn this section, I provide a couple scripts you can run on an as-needed basis, or you can schedulethem to run on a regular basis to proactively monitor the database. These scripts take the dictionary views and give a more detailed look at a particular structure.The functionality of some of these scripts might overlap with the results provided by some of thetools I’ve mentioned earlier in the chapter, but they might be more focused and in some casesprovide more detail about the possible space problems in the database.Segments That Cannot Allocate Additional ExtentsIn the following script, we want to identify segments (most likely tables or indexes) that cannotallocate additional extents:select s.tablespace_name, s.segment_name, s.segment_type, s.ownerfrom dba_segments swhere s.next_extent >= (select max(f.bytes) from dba_free_space f where f.tablespace_name = s.tablespace_name)or s.extents = s.max_extentsorder by tablespace_name, segment_name;TABLESPACE_NAME SEGMENT_NAME SEGMENT_TYPE OWNER------------------ ----------------------- ----------------- ---------------USERS9 EMPLOYEE_SEARCH TABLE HR
- 198 Oracle Database 11g DBA Handbook In this example, we’re using a correlated subquery to compare the size of the next extent to the amount of free space left in the tablespace. The other condition we’re checking is whether the next extent request will fail because the segment is already at the maximum number of extents. The reason these objects might be having problems is most likely one of two possibilities: The tablespace does not have room for the next extent for this segment, or the segment has the maximum number of extents allocated. To solve this problem, the DBA can extend the tablespace by adding another datafile or by exporting the data in the segment and re-creating it with storage parameters that more closely match its growth pattern. As of Oracle9i, using locally managed tablespaces instead of dictionary-managed tablespaces solves this problem when disk space is not the issue— the maximum number of extents in an LMT is unlimited. Used and Free Space by Tablespace and Datafile The following SQL*Plus script breaks down the space usage of each tablespace, which is further broken down by datafile within each tablespace. This is a good way to see how space is used and extended within each datafile of a tablespace, and it may be useful for load balancing when you’re not using ASM or other high-availability storage. -- -- Free space within non-temporary datafiles, by tablespace. -- -- No arguments. -- 1024*1024*1000 = 1048576000 = 1GB to match OEM -- column free_space_gb format 9999999.999 column allocated_gb format 9999999.999 column used_gb format 9999999.999 column tablespace format a12 column filename format a20 select ts.name tablespace, trim(substr(df.name,1,100)) filename, df.bytes/1048576000 allocated_gb, ((df.bytes/1048576000) - nvl(sum(dfs.bytes)/1048576000,0)) used_gb, nvl(sum(dfs.bytes)/1048576000,0) free_space_gb from v$datafile df join dba_free_space dfs on df.file# = dfs.file_id join v$tablespace ts on df.ts# = ts.ts# group by ts.name, dfs.file_id, df.name, df.file#, df.bytes order by filename; TABLESPACE FILENAME ALLOCATED_GB USED_GB FREE_SPACE_GB ------------ -------------------- ------------ ---------- ------------- DMARTS +DATA/dw/datafile/dm .25 .0640625 .1859375 arts.269.628621093 EM_REP +DATA/dw/datafile/em .25 .0000625 .2499375 _rep.270.628640521 EXAMPLE +DATA/dw/datafile/ex .1 .077375 .022625 ample.265.627433157 SYSAUX +DATA/dw/datafile/sy .7681875 .7145 .0536875 saux.257.627432973
- Chapter 6: Monitoring Space Usage 199SYSTEM +DATA/dw/datafile/sy .77 .7000625 .0699375 stem.256.627432971UNDOTBS1 +DATA/dw/datafile/un .265 .0155625 .2494375 dotbs1.258.627432975USERS +DATA/dw/datafile/us .0125 .0111875 .0013125 ers.259.627432977USERS2 +DATA/dw/datafile/us .1 .0000625 .0999375 ers2.267.627782171USERS4 +DATA/dw/datafile/us .25 .002 .248 ers4.268.628561597USERS9 +DATA/dw/datafile/us .01 .0000625 .0099375 ers9.271.628727991USERS9 +DATA/dw/datafile/us .01 .0000625 .0099375 ers9.272.628729587USERS9 +DATA/dw/datafile/us .05 .0000625 .0499375 ers9.273.628730561USERS3 +DATA2/dw/datafile/u .1 .0000625 .0999375 sers3.256.627786775XPORT /u05/oradata/xport.d .3 .1280625 .1719375 bf14 rows selected. Only the USERS9 tablespace has more than one datafile in this database. To include temporarytablespaces on this report, you can use a union query to combine this query with a similar querybased on V$TEMPFILE.Automating and Streamliningthe Notification ProcessAlthough any of the scripts and packages presented earlier in this chapter can be executed ondemand, some of them can and should be automated, not only to save time for the DBA but alsoto be proactive and catch problems long before they cause a system outage. Two of the primary methods for automating the scripts and packages are DBMS_SCHEDULERand Oracle Enterprise Manager. Each of these methods has its advantages and disadvantages.DBMS_SCHEDULER can provide more control over how the task is scheduled and can be setup using only a command-line interface. Oracle Enterprise Manager, on the other hand, uses acompletely web-based environment that allows a DBA to oversee a database environment fromwherever there is access to a web browser.Using DBMS_SCHEDULERNew to Oracle 10g is the DBMS_SCHEDULER package. It provides new features and functionalityover the previous job scheduler package, DBMS_JOB. Although DBMS_JOB is still available inOracle 10g, it is highly recommended that your jobs convert to DBMS_SCHEDULER because theDBMS_JOB package may be deprecated in a future release. DBMS_SCHEDULER contains many of the procedures you’d expect from a scheduling package:CREATE_JOB, DROP_JOB, DISABLE, STOP_JOB, and COPY_JOB. In addition, DBMS_SCHEDULERmakes it easy to automatically repeat job executions with CREATE_SCHEDULE and to partition jobsinto categories based on resource usage with the CREATE_JOB_CLASS procedure.
- 200 Oracle Database 11g DBA Handbook OEM Job Control and Monitoring Not only can Oracle Enterprise Manager present most database administration tasks in a graphical, web-based environment, it can automate some of the routine tasks that a DBA might perform on a daily basis. In this section, we’ll cover the OEM-equivalent functionality to Segment Advisor and Undo Advisor, covered previously in this chapter. Segment Advisor Figure 6-5 shows the home page for OEM. Many of the space management functions, including Segment Advisor, are available directly from this home page, especially when there is a pending alert. The top portion of the home page lists general availability information of the instance, including the instance name, host name, CPU usage, and session information. The bottom half of the home page contains direct links to status pages and advisors. Figure 6-6 shows the bottom half of the home page from Figure 6-5. FIGURE 6-5 OEM home page
- Chapter 6: Monitoring Space Usage 201FIGURE 6-6 OEM home page-related links If there is not an outstanding space-related alert, and you want to run Segment Advisor, clickthe Advisor Central link in Figure 6-6, and then click the Segment Advisor link; you will see thepage in Figure 6-7. In Figure 6-7, select the Tablespaces radio button; you suspect that one or more tables in theUSERS tablespace might need reorganization. Click Next; you will see Step 2 in Figure 6-8. Addthe USERS tablespace to the list of objects to be analyzed. When you click Next in Figure 6-8, you can change the scheduling for the analysis job; bydefault, the job runs immediately, which is what you want to do in this case. Figure 6-9 shows theother scheduling options. When you click Next in Figure 6-9, you see the review page in Figure 6-10. You can click ShowSQL if you are curious or if you want to use the SQL statements in your own custom batch job.
- 202 Oracle Database 11g DBA Handbook FIGURE 6-7 Segment Advisor Step 1: select analysis type As you might suspect, clicking Submit in Figure 6-10 submits the job to be run either immediately or at the specified time. The next page you see is the Advisors tab in Figure 6-11. FIGURE 6-8 Segment Advisor Step 2: select objects
- Chapter 6: Monitoring Space Usage 203FIGURE 6-9 Segment Advisor Step 3: scheduling optionsFIGURE 6-10 Segment Advisor Step 4: review
- 204 Oracle Database 11g DBA Handbook FIGURE 6-11 Advisors and Tasks In Figure 6-11, you see the Segment Advisor task you just initiated. In this case, all of the recent Advisor tasks are Segment Advisor tasks; depending on the time of day and other jobs you have scheduled, this can be a mix of Memory Advisor tasks, SQL Advisor tasks, and so forth. Most of the tasks in Figure 6-11 are created with the default Oracle installation and are run on a regular basis, such as the Auto Space Advisor. As a result, any results you see in your ad hoc analysis task would show up eventually in one of the periodic Segment Advisor task results. When the Status column for your Segment Advisor job changes to COMPLETED (you can refresh the list by refreshing the browser window or clicking Refresh), you can click the job name to see the results of the job; you can see the results of this job in Figure 6-12. The advisor results in Figure 6-12 indicate that the table EMPLOYEES_SEARCH would benefit from a shrink operation, potentially improving access to the table and freeing up space in the USERS tablespace. To implement the recommendation, you can click the Shrink button in the Recommendation column. Undo Advisor To start the Automatic Undo Management Advisor, start at the page in Figure 6-11, and click the Automatic Undo Management link at the top of the page. In Figure 6-13, you see the current settings for the undo tablespace UNDOTBS1.
- Chapter 6: Monitoring Space Usage 205FIGURE 6-12 Segment Advisor resultsFIGURE 6-13 Undo Advisor current settings and options
- 206 Oracle Database 11g DBA Handbook Given the recent SQL load in this database, the current size of the undo tablespace (265MB) is sufficient (with AUTOEXTEND set at 5MB increments) to satisfy the undo data needs for similar queries in the future. However, you’re expecting to add some data warehouse tables and you may have long-running queries that may exceed the current 15-minute undo retention window, and you want to maintain overall system performance by avoiding frequent extensions to the existing undo tablespace. Therefore, you probably need to increase the size of the undo tablespace; in Figure 6-13, specify 45 minutes in the Duration text box and click the Run Analysis button. The analysis is performed immediately; at the bottom of Figure 6-14, you see that the minimum required undo tablespace size is 545MB. You don’t need to change your undo tablespace size immediately; the beauty of Undo Advisor is that you can change the time period for analysis and retention to see what your disk requirements will be in a given scenario. FIGURE 6-14 Undo Advisor recommendations
- CHAPTER 7Managing Transactionswith Undo Tablespaces 207
- 208 Oracle Database 11g DBA Handbook n Chapter 6, we touched briefly on how the space in an undo tablespace is I managed, along with views such as V$UNDOSTAT that can help the DBA monitor and size the undo tablespace. In this chapter, we’ll delve much more deeply into the configuration and management of the undo tablespace, and how we may resolve the sometimes conflicting requirements of providing enough undo for read consistency while preventing the failure of DML statements because the undo retention parameter is set too high. To start off this chapter, we’ll do a quick review of transactions from a database user’s point of view so that you will better understand how to support the user’s transactions with the appropriately sized undo tablespace. Next, we’ll cover the basics of how to create an undo tablespace, either during database creation or later using the familiar create tablespace command. Undo segments fulfill a number of requirements for database users, and we will enumerate and explain each of those requirements in some detail. Oracle provides a number of ways to monitor and, as a result, more precisely size undo tablespaces. The package dbms_advisor can be used to analyze the undo tablespace usage, as we did in Chapter 6; we will investigate this package in more detail and show how Oracle Enterprise Manager Database Control can make it easy to perform the analysis. The last major section of this book will review the different types of Oracle Flashback features that rely on an adequately sized undo tablespace to recover from a number of different user error scenarios. All the major Flashback features at the query, table, or transaction level are covered in this section; Flashback Database is covered in Chapter 14. Rollback segments from previous Oracle releases were hard to manage and were usually sized too large or too small by most DBAs; Oracle strongly recommends that all new databases use Automatic Undo Management and that databases upgraded from a previous version of Oracle be converted to using Automatic Undo Management. We won’t cover any aspects of manual undo management here except for how to migrate from rollback segments to automatic undo. Transaction Basics A transaction is a collection of SQL DML statements that is treated as a logical unit; the failure of any of the statements in the transaction implies that none of the other changes made to the database in the transaction should be permanently saved to the database. Once the DML statements in the transaction have successfully completed, the application or SQL*Plus user will issue a commit to make the changes permanent. In the classic banking example, a transaction that transfers a dollar amount from one account to another is successful only if both the debit of one account (an update of the savings account balance) and the credit of another account (an update of the checking account balance) are both successful. Failure of either or both statements invalidates the entire transaction. When the application or SQL*Plus user issues a commit, if only one or the other update statement is successful, the bank will have some very unhappy customers! A transaction is initiated implicitly. After a commit of a previous transaction is completed, and at least one row of a table is inserted, updated, or deleted, a new transaction is implicitly created. Also, any DDL commands such as create table and alter index will commit an active transaction and begin a new transaction. You can name a transaction by using the set transaction . . . name ‘transaction_name’ command. Although this provides no direct benefit to the application, the name assigned to the transaction is available in the dynamic performance view V$TRANSACTION and allows a DBA to monitor long-running transactions; in addition, the transaction name helps
- Chapter 7: Managing Transactions with Undo Tablespaces 209the DBA resolve in-doubt transactions in distributed database environments. The set transactioncommand, if used, must be the first statement within the transaction. Within a given transaction, you can define a savepoint. A savepoint allows the sequence of DMLcommands within a transaction to be partitioned so that it is possible to roll back one or more ofthe DML commands after the savepoint, and subsequently submit additional DML commands orcommit the DML commands performed before the savepoint. Savepoints are created with thesavepoint savepoint_name command. To undo the DML commands since the last savepoint,you use the command rollback to savepoint savepoint_name. A transaction is implicitly committed if a user disconnects from Oracle normally; if the userprocess terminates abnormally, the most recent transaction is rolled back.Undo BasicsUndo tablespaces facilitate the rollback of logical transactions. In addition, undo tablespacessupport a number of other features, including read consistency, various database-recoveryoperations, and Flashback functions.RollbackAs described in the previous section, any DML command within a transaction—whether thetransaction is one or one hundred DML commands—may need to be rolled back. When a DMLcommand makes a change to a table, the old data values changed by the DML command arerecorded in the undo tablespace within a system-managed undo segment or a rollback segment. When an entire transaction is rolled back (that is, a transaction without any savepoints),Oracle undoes all the changes made by DML commands since the beginning of the transactionusing the corresponding undo records, releases the locks on the affected rows, if any, and thetransaction ends. If part of a transaction is rolled back to a savepoint, Oracle undoes all changes made by DMLcommands after the savepoint. All subsequent savepoints are lost, all locks obtained after thesavepoint are released, and the transaction remains active.Read ConsistencyUndo provides read consistency for users who are reading rows that are involved in a DMLtransaction by another user. In other words, all users who are reading the affected rows will seeno changes in the rows until they issue a new query after the DML user commits the transaction.Undo segments are used to reconstruct the datablocks back to a read-consistent version and, asa result, provide the previous values of the rows to any user issuing a select statement before thetransaction commits. For example, user CLOLSEN begins a transaction at 10:00 that is expected to commit at 10:15,with various updates and insertions to the EMPLOYEES table. As each insert, update, and deleteoccurs on the EMPLOYEES table, the old values of the table are saved in the undo tablespace.When the user SUSANP issues a select statement against the EMPLOYEES table at 10:08, noneof the changes made by CLOLSEN are visible to anyone except CLOLSEN; the undo tablespaceprovides the previous values of CLOLSEN’s changes for SUSANP and all other users. Even if thequery from SUSANP does not finish until 10:20, the table still appears to be unchanged until anew query is issued after the changes are committed. Until CLOLSEN performs a commit at 10:15,the data in the table appears unchanged as of 10:00.
- 210 Oracle Database 11g DBA Handbook If there is not enough undo space available to hold the previous values of changed rows, the user issuing the select statement may receive an “ORA-01555: Snapshot Too Old” error. Later in this chapter, we will discuss ways in which we can address this issue. Database Recovery Undo tablespaces are also a key component of instance recovery. The online redo logs bring both committed and uncommitted transactions forward to the point in time of the instance crash; the undo data is used to roll back any transactions that were not committed at the time of the crash or instance failure. Flashback Operations The data in the undo tablespace is used to support the various types of Flashback options: Flashback Table, Flashback Query, and the package DBMS_FLASHBACK. Flashback Table will restore a table as of a point of time in the past, Flashback Query lets you view a table as of an SCN or time in the past, and DBMS_FLASHBACK provides a programmatic interface for Flashback operations. Flashback Data Archive, new to Oracle Database 11g, stores and tracks all transactions on a specified table for a specified time period; in a nutshell, Flashback Data Archive stores undo data for a specific table in a specific tablespace outside of the global undo tablespace. Also new to Oracle Database 11g is Flashback Transaction Backout that can roll back an already committed transaction and its dependent transactions while the database is online. All these Flashback options are covered in more detail at the end of this chapter. Managing Undo Tablespaces Creating and maintaining undo tablespaces is a “set it and forget it” operation once the undo requirements of the database are understood. Within the undo tablespace, Oracle automatically creates, sizes, and manages the undo segments, unlike previous versions of Oracle in which the DBA would have to manually size and constantly monitor rollback segments. In the next couple sections, we’ll review the processes used to create and manage undo tablespaces, including the relevant initialization parameters. In addition, we’ll review some scenarios where we may create more than one undo tablespace and how to switch between undo tablespaces. Creating Undo Tablespaces Undo tablespaces can be created in two ways: at database creation or with the create tablespace command after the database is created. As with any other tablespace in Oracle 10g, the undo tablespace can be a bigfile tablespace, further easing the maintenance of undo tablespaces. Creating an Undo Tablespace with CREATE DATABASE A database may have more than one undo tablespace, although only one can be active at a time. Here’s what creating an undo tablespace at database creation looks like:
- Chapter 7: Managing Transactions with Undo Tablespaces 211create database ord user sys identified by ds88dkw2 user system identified by md78s233 sysaux datafile /u02/oradata/ord/sysaux001.dbf size 1g default temporary tablespace temp01 tempfile /u03/oradata/ord/temp001.dbf size 150m undo tablespace undotbs01 datafile /u01/oradata/ord/undo001.dbf size 500m; If the undo tablespace cannot be successfully created in the create database command, theentire operation fails. The error must be corrected, any files remaining from the operation mustbe deleted, and the command must be reissued. Although the undo tablespace clause in the create database command is optional, if it isomitted and Automatic Undo Management is enabled, an undo tablespace is still created withan autoextensible datafile with an initial size of 10MB and the default name SYS_UNDOTBS.Creating an Undo Tablespace with CREATE TABLESPACEAny time after the database is created, a new undo tablespace can be created. An undotablespace is created just as any other tablespace with the addition of the undo keyword:create undo tablespace undotbs02 datafile /u01/oracle/rbdb1/undo0201.dbf size 500m reuse autoextend on;Depending on the volatility of the database or the expectation that the undo needs of the databasemay increase dramatically in the future, we start out this tablespace at only 500MB and allow itto grow. Extents in an undo tablespace must be system managed; in other words, you can only specifyextent management as local autoallocate.Creating an Undo Tablespace Using EM Database ControlCreating an undo tablespace is straightforward using Enterprise Manager Database Control. Fromthe Server tab on the home page, click the Tablespaces link. You will be presented with a list ofexisting tablespaces; click the Create button. In Figure 7-1, we’re creating a new undo tablespacenamed UNDO_BATCH. Specify Undo Retention Guarantee as well. I’ll explain how that workslater in this chapter. At the bottom of the screen, click Add and specify the name of the datafile to use for the undotablespace, as indicated in Figure 7-2. In this example, you use the ASM disk group DATA for thedatafile with a size of 500MB and 100MB more each time it extends. Click Continue to return tothe page in Figure 7-1. Clicking Storage allows us to specify extent allocation, although for an undo tablespace itmust be automatic. If we are supporting multiple block sizes, we can specify the block size forthe undo tablespace. Figure 7-3 shows that we are specifying automatic extent allocation and ablock size of 8192, the default and only block size defined for the database.
- 212 Oracle Database 11g DBA Handbook FIGURE 7-1 Using EM Database Control to create an undo tablespace FIGURE 7-2 Specifying a datafile for a new undo tablespace
- Chapter 7: Managing Transactions with Undo Tablespaces 213FIGURE 7-3 Specifying storage characteristics for an undo tablespace As with most every EM Database Control maintenance screen, we can view the actual SQLcommands that will be executed when we are ready to create the tablespace. In Figure 7-4, weclicked the Show SQL button to preview the SQL commands used to create the tablespace. After we click OK in Figure 7-3, the new undo tablespace is created successfully in Figure 7-5. Note that EM Database Control, although a big timesaver for the DBA, does not cover everypossible scenario, nor does it prevent the DBA from trying to create an undo tablespace with thewrong parameters. Earlier in Figure 7-3, we could have specified Uniform extent allocation, butif you try to create the tablespace, it will fail with an error message. As mentioned earlier in thischapter, undo tablespaces must have automatically allocated extents.FIGURE 7-4 Previewing SQL commands to create an undo tablespace
- 214 Oracle Database 11g DBA Handbook FIGURE 7-5 Create Undo Tablespace confirmation Dropping Undo Tablespaces Dropping an undo tablespace is similar to dropping any other tablespace; the only restriction is that the undo tablespace being dropped must not be the active undo tablespace or still have undo data for an uncommitted transaction. You may, however, drop an undo tablespace that has unexpired undo information, which may cause a long-running query to fail. To drop the tablespace we created in the previous section, we use the drop tablespace command: SQL> drop tablespace undo_batch; Tablespace dropped. SQL> The clause including contents is implied when dropping an undo tablespace. However, to remove the operating system data files when the tablespace is dropped, you must specify including contents and datafiles. Trying to drop the active undo tablespace is not allowed:
- Chapter 7: Managing Transactions with Undo Tablespaces 215SQL> drop tablespace undotbs1;drop tablespace undotbs1*ERROR at line 1:ORA-30013: undo tablespace UNDOTBS1 is currently in useSQL> The active undo tablespace must be switched with another undo tablespace before it can bedropped. More information on switching undo tablespaces is covered later in this chapter.Modifying Undo TablespacesThe following operations are allowed on undo tablespaces: ■ Adding a datafile to an undo tablespace ■ Renaming a datafile in an undo tablespace ■ Changing an undo tablespace’s datafile to online or offline ■ Beginning or ending an open tablespace backup (alter tablespace undotbs begin backup) ■ Enabling or disabling the undo retention guarantee Everything else is automatically managed by Oracle.Using OMF for Undo TablespacesIn addition to using a bigfile tablespace for undo tablespaces, you can also use OMF to automaticallyname (and locate, if you’re not using ASM) an undo tablespace; the initialization parameter DB_CREATE_FILE_DEST contains the location where an undo tablespace will be created if the datafileclause is not specified in the create undo tablespace command. In the following example, wecreate an undo tablespace using OMF in an ASM disk group:SQL> show parameter db_create_file_destNAME TYPE VALUE------------------------------------ ----------- ------------------------------db_create_file_dest string +DATASQL> create undo tablespace undo_bi;Tablespace created.SQL> select ts.name ts_name, df.name df_name, bytes 2 from v$tablespace ts join v$datafile df using(ts#) 3 where ts.name = UNDO_BI;TS_NAME DF_NAME BYTES------------ --------------------------------------------- ----------UNDO_BI +DATA/dw/datafile/undo_bi.275.629807457 104857600SQL> Because we did not specify a datafile size either, the tablespace defaults to a size of 100MB;in addition, the datafile is autoextensible with an unlimited maximum size, limited only by the filesystem.
- 216 Oracle Database 11g DBA Handbook Undo Tablespace Dynamic Performance Views A number of dynamic performance views and data dictionary views contain information about undo tablespaces, user transactions, and undo segments. Table 7-1 contains the view names and their descriptions. The views in Table 7-1 are described in more detail later in this chapter. Undo Tablespace Initialization Parameters In the following sections, we’ll describe the initialization parameters needed to specify the undo tablespace for the database as well as control how long Oracle will retain undo information in the database. UNDO_MANAGEMENT The parameter UNDO_MANAGEMENT defaults to MANUAL in Oracle Database 10g, and AUTO in Oracle Database 11g. Setting the parameter UNDO_MANAGEMENT to AUTO places the database in Automatic Undo Management mode. At least one undo tablespace must exist in the database for this parameter to be valid, whether UNDO_TABLESPACE is specified or not. UNDO_ MANAGEMENT is not a dynamic parameter; therefore, the instance must be restarted whenever UNDO_MANAGEMENT is changed from AUTO to MANUAL, or vice versa. UNDO_TABLESPACE The UNDO_TABLESPACE parameter specifies which undo tablespace will be used for Automatic Undo Management. If UNDO_MANAGEMENT is not specified or set to MANUAL, and UNDO_ TABLESPACE is specified, the instance will not start. NOTE UNDO_TABLESPACE is used in a Real Application Clusters (RAC) environment to assign a particular undo tablespace to an instance, where the total number of undo tablespaces in the database is the same or more than the number of instances in the cluster. View Description DBA_TABLESPACES Tablespace names and characteristics, including the CONTENTS column, which can be PERMANENT, TEMPORARY, or UNDO; the undo RETENTION column is NOT APPLY, GUARANTEE, or NOGUARANTEE. DBA_UNDO_EXTENTS All undo segments in the database, including their size, their extents, the tablespace where they reside, and current status (EXPIRED or UNEXPIRED). V$UNDOSTAT The amount of undo usage for the database at ten-minute intervals; contains at most 1008 rows (7 days). V$ROLLSTAT Rollback segment statistics, including size and status. V$TRANSACTION Contains one row for each active transaction for the instance. TABLE 7-1 Undo Tablespace Views
- Chapter 7: Managing Transactions with Undo Tablespaces 217 Conversely, if UNDO_MANAGEMENT is set to AUTO and there is no undo tablespace in thedatabase, the instance will start, but then the SYSTEM rollback segment will be used for all undooperations, and a message is written to the alert log. Any user DML that attempts to make changesin non-SYSTEM tablespaces will, in addition, receive the error message “ORA-01552: cannot usesystem rollback segment for non-system tablespace ‘USERS,’” and the statement fails.UNDO_RETENTIONUNDO_RETENTION specifies a minimum amount of time that undo information is retained forqueries. In automatic undo mode, UNDO_RETENTION defaults to 900 seconds. This value isvalid only if there is enough space in the undo tablespace to support read-consistent queries; ifactive transactions require additional undo space, an unexpired undo may be used to satisfy theactive transactions and may cause “ORA-01555: Snapshot Too Old” errors. The column TUNED_UNDORETENTION of the dynamic performance view V$UNDOSTATgives the tuned undo retention time for each time period; the status of the undo tablespace usageis updated in V$UNDOSTAT every ten minutes:SQL> show parameter undo_retentionNAME TYPE VALUE------------------------------------ ----------- ---------------undo_retention integer 900SQL> select to_char(begin_time,yyyy-mm-dd hh24:mi), 2 undoblks, txncount, tuned_undoretention 3 from v$undostat where rownum = 1;TO_CHAR(BEGIN_TI UNDOBLKS TXNCOUNT TUNED_UNDORETENTION---------------- ---------- ---------- -------------------2007-08-05 16:07 9 89 9001 row selected.SQL> Because the transaction load is very light during the most recent time period, and the instancehas just recently started up, the tuned undo retention value is the same as the minimum specifiedin the UNDO_RETENTION initialization parameter: 900 seconds (15 minutes). TIP You don’t need to specify UNDO_RETENTION unless you have Flashback or LOB retention requirements; the UNDO_RETENTION parameter is not used for managing transaction rollback.Multiple Undo TablespacesAs mentioned earlier in this chapter, a database can have multiple undo tablespaces, but only oneof them can be active for a given instance at any one time. In this section, we’ll show an exampleof switching to a different undo tablespace while the database is open. NOTE In a Real Application Clusters (RAC) environment, one undo tablespace is required for each instance in the cluster.
- 218 Oracle Database 11g DBA Handbook In our dw database, we have three undo tablespaces: SQL> select tablespace_name, status from dba_tablespaces 2 where contents = UNDO; TABLESPACE_NAME STATUS --------------------------- --------- UNDOTBS1 ONLINE UNDO_BATCH ONLINE UNDO_BI ONLINE 2 rows selected. But only one of the undo tablespaces is active: SQL> show parameter undo_tablespace NAME TYPE VALUE -------------------------- ----------- ---------------------- undo_tablespace string UNDOTBS1 For overnight processing, we change the undo tablespace from UNDOTBS1 to the tablespace UNDO_BATCH, which is much larger to support higher DML activity. The disk containing the daytime undo tablespace is much faster but has a limited amount of space; the disk containing the overnight undo tablespace is much larger, but slower. As a result, we use the smaller undo tablespace to support OLTP during the day, and the larger undo tablespace for our data mart and data warehouse loads, as well as other aggregation activities, at night when response time is not as big of an issue. NOTE Other than special circumstances described in this section, it is unlikely that you will be switching undo tablespaces for a given instance. Oracle’s best practices suggest that you create a single undo tablespace per instance that is large enough to handle all transaction loads; in other words, “set it and forget it.” About the time the undo tablespace is going to be switched, the user HR is performing some maintenance operations on the HR.EMPLOYEES table, and she has an active transaction in the current undo tablespace: SQL> connect hr/hr@dw; Connected. SQL> set transaction name Employee Maintenance; Transaction set. SQL> update employees set commission_pct = commission_pct * 1.1; 107 rows updated. SQL> Checking V$TRANSACTION, you see HR’s uncommitted transaction: SQL> select t.status, t.start_time, t.name 2 from v$transaction t join v$session s on t.ses_addr = s.saddr 3 where s.username = HR;
- Chapter 7: Managing Transactions with Undo Tablespaces 219STATUS START_TIME NAME-------------- -------------------- -------------------------ACTIVE 08/05/07 17:41:50 Employee Maintenance1 row selected. You change the undo tablespace as follows:SQL> alter system set undo_tablespace=undo_batch;System altered. HR’s transaction is still active, and therefore the old undo tablespace still contains the undoinformation for HR’s transaction, leaving the undo segment still available with the following statusuntil the transaction is committed or rolled back:SQL> select r.status 2 from v$rollstat r join v$transaction t on r.usn=t.xidusn 3 join v$session s on t.ses_addr = s.saddr 4 where s.username = HR;STATUS---------------PENDING OFFLINE1 row selected. Even though the current undo tablespace is UNDO_BATCH, the daytime tablespaceUNDOTBS1 cannot be taken offline or dropped until HR’s transaction is committed orrolled back:SQL> show parameter undo_tablespaceNAME TYPE VALUE-------------------------- ----------- ----------------------undo_tablespace string UNDO_BATCHSQL> alter tablespace undotbs1 offline;alter tablespace undotbs1 offline*ERROR at line 1:ORA-30042: Cannot offline the undo tablespace The error message ORA-30042 applies if you try to offline an undo tablespace that is in use—either it is the current undo tablespace or it still has pending transactions. Note that if we switchback to the daytime tablespace before HR commits or rolls back the original transaction, the statusof HR’s rollback segment reverts back to ONLINE:SQL> alter system set undo_tablespace=undotbs1;System altered.SQL> select r.status 2 from v$rollstat r join v$transaction t on r.usn=t.xidusn 3 join v$session s on t.ses_addr = s.saddr 4 where s.username = HR;
- 220 Oracle Database 11g DBA Handbook STATUS --------------- ONLINE 1 row selected. Sizing and Monitoring the Undo Tablespace There are three types of undo data in the undo tablespace: active or unexpired, expired, and unused. Active or unexpired is undo data that is still needed for read consistency, even after a transaction has been committed. Once all queries needing the active undo data have completed and the undo retention period is reached, the active undo data becomes expired. Expired undo data may still be used to support other Oracle features, such as the Flashback features, but it is no longer needed to support read consistency for long-running transactions. Unused undo data is space in the undo tablespace that has never been used. As a result, the minimum size for an undo tablespace is enough space to hold the before-image versions of all data from all active transactions that have not yet been committed or rolled back. If the space allocated to the undo tablespace cannot even support the changes to uncommitted transactions to support a rollback operation, the user will get the error message “ORA-30036: unable to extend segment by space_qty in undo tablespace tablespace_name.” In this situation, the DBA must increase the size of the undo tablespace, or as a stopgap measure the user can split up a larger transaction into smaller ones while still maintaining any required business rules. Manual Methods The DBA can use a number of manual methods to correctly size the undo tablespace. As demonstrated in Chapter 6, we can review the contents of the dynamic performance view V$UNDOSTAT to see the undo segment usage at ten-minute intervals. In addition, the column SSOLDERRCNT indicates how many queries failed with a “Snapshot too old” error: SQL> select to_char(end_time,yyyy-mm-dd hh24:mi) end_time, 2> undoblks, ssolderrcnt from v$undostat; END_TIME UNDOBLKS SSOLDERRCNT ---------------- ---------- ----------- 2007-08-02 20:17 45 0 2007-08-02 20:07 116 0 2007-08-02 19:57 2763 0 2007-08-02 19:47 23 0 2007-08-02 19:37 45120 2 2007-08-02 19:27 119 0 2007-08-02 19:17 866 0 Between 19:27 and 19:37 we have a spike in undo usage, resulting in some failed queries. As a rule of thumb, you can use the following calculations: undo_tablespace_size = UR * UPS + overhead In this formula, UR equals undo retention in seconds (from the initialization parameter UNDO_RETENTION), UPS equals undo blocks used per second (maximum), and overhead equals undo metadata, usually a very small number relative to the overall size. For example, if a database has an 8K block size, and UNDO_RETENTION equals 43200 (12 hours), and we
- Chapter 7: Managing Transactions with Undo Tablespaces 221generate 500 undo blocks every second, all of which must be retained for at least 12 hours, ourtotal undo space must be:undo_tablespace_size = 43200 * 500 * 8192 = 176947200000 = 177GB Add about 10 to 20 percent to this calculation to allow for unexpected situations. Alternatively,you can enable autoextend for the datafiles in the undo tablespace. Although this calculation isuseful as a starting point, Oracle 10g’s and Oracle 11g’s built-in advisors, using trending analysis,can give a better overall picture of undo space usage and recommendations.Undo AdvisorOracle 11g’s Undo Advisor automates a lot of the tasks necessary to fine-tune the amount of spacerequired for an undo tablespace. In Chapter 6, we reviewed two examples of using the UndoAdvisor: via the EM Database Control interface and using the PL/SQL DBMS_ADVISOR packageswithin the Automatic Workload Repository (AWR) to programmatically choose a time period toanalyze and perform the analysis. The Automatic Undo Management GUI screen is shown in Figure 7-6. UNDO_RETENTION is currently set to 15 minutes and the size of the active undo tablespace(UNDO_BATCH) is 500MB. In this example, if we want a read-consistent view of table data for720 minutes, clicking the Run Analysis button tells us that we only need an undo tablespace sizeof 165MB (and ideally three times this amount) to support workload fluctuations. Therefore, ourundo tablespace is sized adequately at 500MB.FIGURE 7-6 Tablespace characteristics
- 222 Oracle Database 11g DBA Handbook Controlling Undo Usage As of Oracle9i, Oracle’s Database Resource Manager can help to control undo space usage by user or by group of users within a resource consumer group via the UNDO_POOL directive. Each consumer group can have its own undo pool; when the total undo generated by a group exceeds the assigned limit, the current transaction generating the undo is terminated and generates the error message “ORA-30027: Undo quota violation—failed to get number (bytes).” The session will have to wait until the DBA increases the size of the undo pool or until other transactions from users in the same consumer group complete. In the following example, we change the default value of UNDO_POOL from NULL (unlimited) to 50000KB (50MB) for users in the resource consumer group LOW_GROUP: begin dbms_resource_manager.create_pending_area(); dbms_resource_manager.update_plan_directive( plan => system_plan, group_or_subplan => low_group, new_comment => Limit undo space for low priority groups, new_undo_pool => 50000); dbms_resource_manager.validate_pending_area(); dbms_resource_manager.submit_pending_area(); end; Oracle Resource Manager and other resource directives are covered in more detail in Chapter 5. Read Consistency vs. Successful DML For OLTP databases, generally we want DML commands to succeed at the expense of read-consistent queries. For a DSS environment, however, we may want long-running queries to complete without getting a “Snapshot too old” error. Although increasing the UNDO_RETENTION parameter or increasing the size of the undo tablespace helps to ensure that undo blocks are available for read- consistent queries, undo tablespaces have another characteristic to help ensure that queries will run to completion: the RETENTION GUARANTEE setting. Undo retention guarantee is set at the tablespace level, and it can be altered at any time. Setting a retention guarantee for an undo tablespace ensures that an unexpired undo within the tablespace should be retained even if it means that DML transactions might not have enough undo space to complete successfully. By default, a tablespace is created with NOGUARANTEE, unless you specify the GUARANTEE keyword, either when the tablespace is created or later with ALTER TABLESPACE: SQL> alter tablespace undotbs1 retention guarantee; Tablespace altered. SQL> select tablespace_name, retention 2 from dba_tablespaces 3 where tablespace_name = UNDOTBS1; TABLESPACE_NAME RETENTION ------------------------------ ----------- UNDOTBS1 GUARANTEE
- Chapter 7: Managing Transactions with Undo Tablespaces 2231 row selected. For non-undo tablespaces, the value of RETENTION is always NOT APPLY.Flashback FeaturesIn this section we’ll discuss the Flashback features supported by undo tablespaces or Flashback DataArchive: Flashback Query, Flashback Table, Flashback Version Query, and Flashback TransactionQuery. In addition, we’ll cover the highlights of using the DBMS_FLASHBACK package. As ofOracle Database 11g, these features are collectively known as the Oracle Total Recall Option. Flashback Database and Flashback Drop are covered in Chapter 14. Flashback Databaseuses Flashback logs in the Flash Recovery Area instead of undo in an undo tablespace to providethe Flashback functionality; Flashback Drop places dropped tables into a virtual recycle bin withinthe tablespace and they remain there until the user retrieves it with flashback table . . . to beforedrop command or empties the recycle bin, or else until the space is needed by new permanentobjects in the tablespace. To further extend the self-service capabilities of Oracle10g and Oracle 11g, the DBA can grantsystem and object privileges to users to allow them to fix their own problems, usually without anyDBA intervention. In the following example, we’re enabling the user SCOTT to perform Flashbackoperations on specific tables and to access transaction metadata across the database:SQL> grant insert, update, delete, select on hr.employees to scott;Grant succeeded.SQL> grant insert, update, delete, select on hr.departments to scott;Grant succeeded.SQL> grant flashback on hr.employees to scott;Grant succeeded.SQL> grant flashback on hr.departments to scott;Grant succeeded.SQL> grant select any transaction to scott;Grant succeeded.Flashback QueryStarting with Oracle9i Release 2, the as of clause is available in a select query to retrieve the stateof a table as of a given timestamp or SCN. You might use this to find out which rows in a table weredeleted since midnight, or you might want to just do a comparison of the rows in a table todayversus what was in the table yesterday. In the following example, HR is cleaning up the EMPLOYEES table and deletes twoemployees who no longer work for the company:SQL> delete from employees 2 where employee_id in (195,196);2 rows deleted.SQL> commit;Commit complete.SQL>
- 224 Oracle Database 11g DBA Handbook Normally, HR will copy these rows to the EMPLOYEES_ARCHIVE table first, but she forgot to do that this time; HR doesn’t need to put those rows back into the EMPLOYEES table, but she needs to get the two deleted rows and put them into the archive table. Because HR knows she deleted the rows less than an hour ago, we can use a relative timestamp value with Flashback Query to retrieve the rows: SQL> insert into hr.employees_archive 2 select * from hr.employees 3 as of timestamp systimestamp - interval 60 minute 4 where hr.employees.employee_id not in 5 (select employee_id from hr.employees); 2 rows created. SQL> commit; Commit complete. Because we know that EMPLOYEE_ID is the primary key of the table, we can use it to retrieve the employee records that existed an hour ago but do not exist now. Note also that we didn’t have to know which records were deleted; we essentially compared the table as it existed now versus an hour ago and inserted the records that no longer exist into the archive table. TIP It is preferable to use the SCN for Flashback over a timestamp; SCNs are exact, whereas the timestamp values are only stored every three seconds to support Flashback operations. As a result, enabling Flashback using timestamps may be off by as much as 1.5 seconds. Although we could use Flashback Table to get the entire table back, and then archive and delete the affected rows, in this case it is much simpler to merely retrieve the deleted rows and insert them directly into the archive table. Another variation of Flashback Table is to use Create Table As Select (CTAS) with the subquery being a Flashback Query: SQL> delete from employees where employee_id in (195,196); 2 rows deleted. SQL> commit; Commit complete. SQL> create table employees_deleted as 2 select * from employees 3 as of timestamp systimestamp - interval 60 minute 4 where employees.employee_id not in 5 (select employee_id from employees); Table created. SQL> select employee_id, last_name from employees_deleted;
- Chapter 7: Managing Transactions with Undo Tablespaces 225EMPLOYEE_ID LAST_NAME----------- ------------------------- 195 Jones 196 Walsh2 rows selected. This is known as an out-of-place restore (in other words, restoring the table or a subset of thetable to a different location than the original). This has the advantage of being able to furthermanipulate the missing rows, if necessary, before placing them back in the table; for example,after reviewing the out-of-place restore, an existing referential integrity constraint may require thatyou insert a row into a parent table before the restored row can be placed back in the child table. One of the disadvantages of an out-of-place restore using CTAS is that neither constraints norindexes are rebuilt automatically.DBMS_FLASHBACKAn alternative to Flashback Query is the package DBMS_FLASHBACK. One of the key differencesbetween the DBMS_FLASHBACK package and Flashback Query is that DBMS_FLASHBACK operatesat the session level, whereas Flashback Query operates at the object level. Within a PL/SQL procedure or a user session, DBMS_FLASHBACK can be enabled and allsubsequent operations, including existing applications, can be carried out without the as of clausebeing added to select statements. After DBMS_FLASHBACK is enabled as of a particular timestampor SCN, the database appears as if the clock was turned back to the timestamp or SCN untilDBMS_FLASHBACK is disabled. Although DML is not allowed when DBMS_FLASHBACK isenabled, a cursor can be opened in a PL/SQL procedure before DBMS_FLASHBACK is enabledto allow data from a previous point in time to be inserted or updated in the database as of thecurrent point in time. Table 7-2 lists the procedures available within DBMS_FLASHBACK. Procedure Description DISABLE Disables Flashback mode for the session ENABLE_AT_SYSTEM_CHANGE_NUMBER Enables Flashback mode for the session, specifying an SCN ENABLE_AT_TIME Enables Flashback mode for the session, using the SCN closest to the TIMESTAMP specified GET_SYSTEM_CHANGE_NUMBER Returns the current SCN TRANSACTION_BACKOUT Backs out a transaction and all dependent transactions using transaction names or transaction identifiers (XIDs)TABLE 7-2 DBMS_FLASHBACK Procedures
- 226 Oracle Database 11g DBA Handbook The procedures that enable and disable Flashback mode are relatively simple to use. The complexity usually lies within a PL/SQL procedure, for example, that creates cursors to support DML commands. In the following example, we’ll revisit HR’s deletion of the EMPLOYEES rows and how HR can restore those to the table using the DBMS_FLASHBACK package. In this scenario, HR will put the deleted employee rows back into the table and instead add a termination date column to the table to reflect the date at which the employees left the company: SQL> delete from hr.employees where employee_id in (195,196); 2 rows deleted. SQL> commit; Commit complete. About ten minutes later, HR decides to get those rows back using DBMS_FLASHBACK, and enables Flashback for her session: SQL> execute dbms_flashback.enable_at_time( 2 to_timestamp(sysdate - interval 45 minute)); PL/SQL procedure successfully completed. Next, HR verifies that the two deleted rows existed as of 45 minutes ago: SQL> select employee_id, last_name from hr.employees 2 where employee_id in (195,196); EMPLOYEE_ID LAST_NAME ----------- ------------------------- 195 Jones 196 Walsh SQL> To put the rows back into the HR.EMPLOYEES table, HR writes an anonymous PL/SQL procedure to create a cursor to hold the deleted rows, disable Flashback Query, then reinsert the rows: declare -- cursor to hold deleted rows before closing cursor del_emp is select * from employees where employee_id in (195,196); del_emp_rec del_emp%rowtype; -- all columns of the employee row begin -- open the cursor while still in Flashback mode open del_emp; -- turn off Flashback so we can use DML to put the rows -- back into the EMPLOYEES table dbms_flashback.disable; loop fetch del_emp into del_emp_rec; exit when del_emp%notfound; insert into employees values del_emp_rec; end loop;
- Chapter 7: Managing Transactions with Undo Tablespaces 227 commit; close del_emp;end; -- anonymous PL/SQL procedure Note that HR could have enabled Flashback within the procedure; in this case, HR enabledit outside of the procedure to run some ad hoc queries, and then used the procedure to create thecursor, turn off Flashback, and reinsert the rows.Flashback Transaction BackoutA given transaction in a complex application may be consistent and atomic, but the validity of thetransaction may not be validated until many other transactions have taken place; in other words,the ill effects of an earlier transaction may cause other transactions to further modify the samedata as the original transaction. Trying to manually track the interdependent successive transactionsis tedious and error-prone. Flashback Transaction makes it easy to identify and roll back theoffending transaction and optionally all dependent transactions. To enable Flashback Transaction Backout, enable archiving (if it is not already in ARCHIVELOGmode) while the database is mounted (but not open):alter database archivelog; Next, run these commands to create at least one archived redo log file and to add additionaltransaction information to the log files.alter system archive log current;alter database add supplemental log data; Adding the supplemental log data will have a noticeable impact on performance in a heavyDML environment. Be sure to monitor system resources before and after you enable the additionallogging to assess the cost of the logging operation. Finally, open the database:alter database open; You leverage Flashback Transaction Backout features via the DBMS_FLASHBACK procedureTRANSACTION_BACKOUT. After you run DBMS_FLASHBACK.TRANSACTION_BACKOUT, theDML against the related tables is performed but not committed; you must then review the tablesDBA_FLASHBACK_TRANSACTION_STATE and DBA_FLASHBACK_TRANSACTION_REPORT tosee if the correct transactions were rolled back. You must then manually perform either a commitor a rollback.Flashback TableNew to Oracle10g, the Flashback Table feature not only restores the state of rows in a table as ofa point of time in the past, but it also restores the table’s indexes, triggers, and constraints whilethe database is online, increasing the overall availability of the database. The table can be restoredas of a timestamp or an SCN. Flashback Table is preferable to other Flashback methods if thescope of user errors is small and limited to one or very few tables. It’s also the most straightforward ifyou know that you want to restore the table to a point in the past unconditionally. For recoveringthe state of a larger number of tables, Flashback Database may be a better choice. FlashbackTable cannot be used on a standby database and cannot reconstruct all DDL operations, suchas adding and dropping columns.
- 228 Oracle Database 11g DBA Handbook To use Flashback Table on a table or tables, you must enable row movement on the table before performing the Flashback operation, although row movement need not be in effect when the user error occurs. Row movement is also required to support Oracle’s segment shrink functionality; because row movement will change the ROWID of a table row, do not enable row movement if your applications depend on the ROWID being the same for a given row until the row is deleted. Because none of our applications reference our tables by ROWID, we can safely enable row movement for the HR tables: SQL> alter table employees enable row movement; Table altered. SQL> alter table departments enable row movement; Table altered. SQL> alter table jobs enable row movement; Table altered. The next day, the HR user accidentally deletes all the rows in the EMPLOYEES table due to a cut-and-paste error from an existing script: SQL> delete from hr.employees 2 / 107 rows deleted. SQL> commit 2 ; Commit complete. SQL> where employee_id = 195 SP2-0734: unknown command beginning "where empl..." - rest of line ignored. Because the undo tablespace is large enough and the HR user notices the problem within the retention period, the HR user can bring back the entire table quickly without calling the DBA: SQL> flashback table employees 2 to timestamp systimestamp - interval 15 minute; Flashback complete. SQL> select count(*) from employees; COUNT(*) ---------- 107 If two or more tables have a parent/child relationship with foreign key constraints, and rows were inadvertently deleted from both tables, they can be flashed back in the same flashback command:
- Chapter 7: Managing Transactions with Undo Tablespaces 229FIGURE 7-7 EM Database Control Backup/Recovery pageSQL> flashback table employees, departments 2 to timestamp systimestamp - interval 15 minute;Flashback complete. The HR user can also use EM Database Control to flash back one or more tables. In Figure 7-7, she has selected the Perform Recovery link under the Availability tab. Selecting an object type of Tables, the HR user has the option to flash back existing tables ordropped tables. In this case, she will be flashing back an existing table. After clicking Next, she knows the precise time of day at which the table was valid, so shespecifies a time about ten minutes before the delete operation on the screen in Figure 7-8. Inaddition, you can specify a restore point or SCN for the recovery operation if you don’t knowthe time of day. In Figure 7-9, HR is selecting the table to flash back (in this case, HR.EMPLOYEES).
- 230 Oracle Database 11g DBA Handbook FIGURE 7-8 Specifying the time frame for table recovery operation FIGURE 7-9 Specifying the table name for table recovery operation
- Chapter 7: Managing Transactions with Undo Tablespaces 231FIGURE 7-10 Specifying the dependency options for table recovery operation EM Database Control identifies any dependencies, such as foreign key constraints, and alertsthe HR user in Figure 7-10. Unless there is a good reason to break any parent/child relationshipsbetween the tables, leave the default option, Cascade, selected. In Figure 7-11, the HR user can take one more look at the options she has selected.FIGURE 7-11 Reviewing table recovery operation actions
- 232 Oracle Database 11g DBA Handbook In addition, as with most EM Database Control screens, she can review the SQL commands generated: FLASHBACK TABLE HR.EMPLOYEES, HR.JOBS, HR.DEPARTMENTS TO TIMESTAMP to_timestamp(2007-08-05 20:10:47, YYYY-MM-DD HH24:MI:SS) Clicking Submit runs the command. Note that in this example, using the command line would take less time and is probably more straightforward; however, if you have unknown dependencies or if the command-line syntax is unfamiliar to you, then EM Database Control is a better option. Flashback Version Query Flashback Version Query, another Flashback feature that relies on undo data, provides a finer level of detail than an as of query: Whereas the Flashback methods we’ve presented up to now bring back rows of a table or an entire table for a particular point in time, Flashback Version Query will return the entire history of a given row between two SCNs or timestamps. For the examples in this and the next section, the user HR makes a number of changes to the HR.EMPLOYEES and HR.DEPARTMENTS tables: SQL> select dbms_flashback.get_system_change_number from dual; GET_SYSTEM_CHANGE_NUMBER ------------------------ 4011365 SQL> update hr.employees set salary = salary*1.2 where employee_id=195; 1 row updated. SQL> select dbms_flashback.get_system_change_number from dual; GET_SYSTEM_CHANGE_NUMBER ------------------------ 4011381 SQL> delete from hr.employees where employee_id = 196; 1 row deleted. SQL> select dbms_flashback.get_system_change_number from dual; GET_SYSTEM_CHANGE_NUMBER ------------------------ 4011409 SQL> insert into hr.departments values (660,Security, 100, 1700); 1 row created. SQL> select dbms_flashback.get_system_change_number from dual; GET_SYSTEM_CHANGE_NUMBER ------------------------ 4011433 SQL> update hr.employees set manager_id = 100 where employee_id = 195; 1 row updated. SQL> commit;
- Chapter 7: Managing Transactions with Undo Tablespaces 233Commit complete.SQL> select dbms_flashback.get_system_change_number from dual;GET_SYSTEM_CHANGE_NUMBER------------------------ 4011464SQL> update hr.employees set department_id = 660 where employee_id = 195;1 row updated.SQL> select dbms_flashback.get_system_change_number from dual;GET_SYSTEM_CHANGE_NUMBER------------------------ 4011470SQL> update hr.employees set salary = salary*1.2 where employee_id=195;1 row updated.SQL> commit;Commit complete.SQL> select dbms_flashback.get_system_change_number from dual;GET_SYSTEM_CHANGE_NUMBER------------------------ 4011508SQL> The next day, the HR user is out of the office, and the other HR department employees wantsto know what rows and tables were changed. Using Flashback Version Query, the user HR cansee not only the values of a column at a particular time, but the entire history of changes betweenspecified timestamps or SCNs. A Flashback Version Query uses the versions between clause to specify a range of SCNsor timestamps for analysis of a given table (in this case, the EMPLOYEES table). When versionsbetween is used in a Flashback Version Query, a number of pseudocolumns are available to helpidentify the SCN and timestamp of the modifications, as well as the transaction ID and the typeof operation performed on the row. Table 7-3 shows the pseudocolumns available with FlashbackVersion Queries. Pseudocolumn Description VERSIONS_ The starting SCN or timestamp when the change was made to START{SCN|TIME} the row. VERSION_END{SCN|TIME} The ending SCN or timestamp when the change was no longer valid for the row. If this is NULL, either the row version is still current or the row was deleted. VERSIONS_XID The transaction ID of the transaction that created the row version. VERSIONS_OPERATION The operation performed on the row (I=Insert, D=Delete, U=Update).TABLE 7-3 Flashback Version Query Pseudocolumns
- 234 Oracle Database 11g DBA Handbook The HR user runs a Flashback Version Query to see the changes to any key columns in HR.EMPLOYEES for the two employees with IDs 195 and 196: SQL> select versions_startscn startscn, versions_endscn endscn, 2 versions_xid xid, versions_operation oper, 3 employee_id empid, last_name name, manager_id mgrid, salary sal 4 from hr.employees 5 versions between scn 4011365 and 4011508 6 where employee_id in (195,196); STARTSCN ENDSCN XID OPER EMPID NAME MGRID SAL --------- --------- ---------------- ---- ----- -------- ----- ---------- 4011507 1100120025000000 U 195 Jones 100 4032 4011463 4011507 0E001A0024000000 U 195 Jones 100 3360 4011463 195 Jones 123 2800 4011463 0E001A0024000000 D 196 Walsh 124 3100 4011463 196 Walsh 124 3100 The rows are presented with the most recent changes first. Alternatively, HR could have filtered the query by TIMESTAMP or displayed the TIMESTAMP values, but either can be used in a Flashback Query or Flashback Table operation, if required later. From this output, we see that one employee was deleted and that another employee received two pay adjustments instead of one. It’s also worth noting that some of the transactions contain only one DML command, and others have two.In the next section, we’ll attempt to correct one or more of these problems. Flashback Transaction Query Once we have identified any erroneous or incorrect changes to a table, we can use Flashback Transaction Query to identify any other changes that were made by the transaction containing the inappropriate changes. Once identified, all changes within the transaction can be reversed as a group, typically to maintain referential integrity or the business rules used to process the transaction in the first place. A Flashback Transaction Query, unlike a Flashback Version Query, does not reference the table involved in DML transactions; instead, you query the data dictionary view FLASHBACK_ TRANSACTION_QUERY. The columns of FLASHBACK_TRANSACTION_QUERY are summarized in Table 7-4. To further investigate the changes that were made to the EMPLOYEES table, we will query the view FLASHBACK_TRANSACTION_QUERY with the oldest transaction from the query in the previous section: SQL> select start_scn, commit_scn, logon_user, 2 operation, table_name, undo_sql 3 from flashback_transaction_query 4 where xid = hextoraw(0E001A0024000000); START_SCN COMMIT_SCN LOGON_USER OPERATION TABLE_NAME ---------- ---------- ---------- ------------ --------------- UNDO_SQL --------------------------------------------------------------------- 4011380 4011463 HR UPDATE EMPLOYEES update "HR"."EMPLOYEES" set "MANAGER_ID" = 123 where ROWID =
- Chapter 7: Managing Transactions with Undo Tablespaces 235AAARAxAAFAAAAHGABO; 4011380 4011463 HR INSERT DEPARTMENTSdelete from "HR"."DEPARTMENTS" where ROWID = AAARAsAAFAAAAA3AAb; 4011380 4011463 HR DELETE EMPLOYEESinsert into "HR"."EMPLOYEES"("EMPLOYEE_ID","FIRST_NAME","LAST_NAME","EMAIL","PHONE_NUMBER","HIRE_DATE","JOB_ID","SALARY","COMMISSION_PCT","MANAGER_ID","DEPARTMENT_ID","WORK_RECORD")values (196,Alana,Walsh,AWALSH,650.507.9811,TO_DATE(24-APR-98, DD-MON-RR),SH_CLERK,3100,NULL,124,50,NULL); 4011380 4011463 HR UPDATE EMPLOYEESupdate "HR"."EMPLOYEES" set "SALARY" = 2800 whereROWID = AAARAxAAFAAAAHGABO; 4011380 4011463 HR BEGIN We confirm what we already expected—that another user in the HR department made thedeletion and salary update (thus pointing out the usefulness of assigning separate user accountsfor each member of the HR department). The UNDO_SQL column contains the actual SQL codethat can be used to reverse the effect of the transaction. Note, however, that in this example, thisis the first transaction to occur between the SCNs of interest. If other transactions made furtherupdates to the same columns, we may want to review the other updates before running the SQLcode in the UNDO_SQL column. Column Name Description XID Transaction ID number START_SCN SCN for the first DML in the transaction START_TIMESTAMP Timestamp of the first DML in the transaction COMMIT_SCN SCN when the transaction was committed COMMIT_TIMESTAMP Timestamp when the transaction was committed LOGON_USER User who owned the transaction UNDO_CHANGE# Undo SCN OPERATION DML operation performed: DELETE, INSERT, UPDATE, BEGIN, or UNKNOWN TABLE_NAME Table changed by DML TABLE_OWNER Owner of the table changed by DML ROW_ID ROWID of the row modified by DML UNDO_SQL SQL statement to undo the DML operationTABLE 7-4 FLASHBACK_TRANSACTION_QUERY Columns
- 236 Oracle Database 11g DBA Handbook Flashback Data Archive Recent regulations such as Sarbanes-Oxley and HIPAA require strict control and tracking requirements for customer and patient data; keeping a historical record of all changes to rows in critical tables is error prone and requires custom applications or database triggers to maintain repositories for the historical changes. Every time you create a new application or update a table in an application that requires historical tracking, you must make changes to your tracking application as well. As of Oracle Database 11g, you can use Flashback Data Archive to automatically save historical changes to all key tables for as long as regulatory agencies or your stakeholders require. Flashback Data Archive is implemented natively in Oracle Database 11g; in a nutshell, you create one or more repository areas (one of which can be the default), assign a default retention period for objects in the repository, and then mark the appropriate tables for tracking. A Flashback Data Archive acts much like an undo tablespace; however, a Flashback Data Archive only records update and delete statements, but not insert statements. In addition, undo data is typically retained for a period of hours or days for all objects; rows in Flashback Data Archives can span years or even decades. Flashback Data Archives has a much narrower focus as well, recording only historical changes to table rows; Oracle uses data in an undo tablespace for read-consistency in long-running transactions and to roll back uncommitted transactions. You can access data in a Flashback Data Archive just as you do with Flashback Query: using the as of clause in a select statement. In the next few sections, we’ll show you how to create a Flashback Data Archive, assign permissions to users and objects, and query historical data in a Flashback Data Archive. Creating an Archive You can create one or several Flashback Data Archives in existing tablespaces using the create flashback archive command; however, Oracle best practices recommends that you use dedicated tablespaces. All archives must have a default retention period using the retention clause and can optionally be identified as the default archive using the default keyword. The disk quota in an archive is limited by the disk space within the tablespace unless you assign a maximum amount of disk space in the archive using the quota keyword. In this example, you first create a dedicated tablespace for your Flashback Data Archive: SQL> create tablespace fbda1 2 datafile +data size 10g; Tablespace created. SQL> Next, you create three Flashback Data Archives: one for the ES department with no quota limit and a ten-year retention period, a second one for the finance department with a 500MB limit and a seven-year retention period, and a third for all other users in the USERS4 tablespace as the default with a 250MB limit and a two-year retention period: SQL> create flashback archive fb_es 2 tablespace fbda1 retention 10 year; Flashback archive created. SQL> create flashback archive fb_fi
- Chapter 7: Managing Transactions with Undo Tablespaces 237 2 tablespace fbda1 quota 500m 3 retention 7 year;Flashback archive created.SQL> create flashback archive default fb_dflt 2 tablespace users4 quota 250m 3 retention 2 year;Flashback archive created.SQL> You cannot specify more than one tablespace in the create flashback archive command; youmust use the alter flashback archive command to add a tablespace, as you’ll see later in this chapter,in the section “Managing Flashback Data Archives.”Using Flashback Data Archive Data Dictionary ViewsTwo new data dictionary views support Flashback Data Archives: DBA_FLASHBACK_ARCHIVEand DBA_FLASHBACK_ARCHIVE_TS. DBA_FLASHBACK_ARCHIVE lists the archives, and DBA_FLASHBACK_ARCHIVE_TS displays the tablespace-to-archive mapping:SQL> select flashback_archive_name, flashback_archive#, 2 retention_in_days, status 3 from dba_flashback_archive;FLASHBACK_AR FLASHBACK_ARCHIVE# RETENTION_IN_DAYS STATUS------------ ------------------ ----------------- -------FB_ES 1 3650FB_FI 2 2555FB_DFLT 3 730 DEFAULTSQL> select * from dba_flashback_archive_ts;FLASHBACK_AR FLASHBACK_ARCHIVE# TABLESPACE QUOTA_IN_M------------ ------------------ ---------- ----------FB_ES 1 FBDA1FB_FI 2 FBDA1 500FB_DFLT 3 USERS4 250SQL> The view DBA_FLASHBACK_ARCHIVE_TABLES tracks the tables enabled for flashbackarchiving. I’ll show you the contents of this view later in this chapter after enabling a table forflashback archiving.Assigning Flashback Data Archive PermissionsA user must have the FLASHBACK ARCHIVE ADMINISTER system privilege to create or modifyFlashback Data Archives, and the FLASHBACK ARCHIVE object privilege to enable tracking on atable. Once enabled, a user doesn’t need any specific permissions to use the as of clause in a selectstatement other than the SELECT permission on the table itself.
- 238 Oracle Database 11g DBA Handbook The FLASHBACK_ARCHIVE_ADMINSTER privilege also includes adding and removing tablespaces from an archive, dropping an archive, and performing an ad hoc purge of history data. Managing Flashback Data Archives You can easily add another tablespace to an existing archive; use the alter flashback archive command like this to add the USERS3 tablespace to the FB_DFLT archive with a quota of 400MB: SQL> alter flashback archive fb_dflt 2 add tablespace users3 quota 400m; Flashback archive altered. SQL> You can purge archive data with the purge clause; in this example, you want to purge all rows in the FB_DFLT archive before January 1, 2005: SQL> alter flashback archive fb_dflt 2 purge before timestamp 3 to_timestamp(2005-01-01 00:00:00, YYYY-MM-DD HH24:MI:SS); Assigning a Table to a Flashback Data Archive You assign a table to an archive either at table creation using the standard create table syntax with the addition of the flashback archive clause, or later with the alter table command, as in this example: SQL> alter table hr.employees flashback archive fb_es; Table altered. Note that in the previous command that specified a specific archive for the HR.EMPLOYEES table; if you did not specify an archive, Oracle assigns FB_DFLT. You can review the tables that use Flashback Data Archive by querying the data dictionary view DBA_FLASHBACK_ARCHIVE_ TABLES: SQL> select * from dba_flashback_archive_tables; TABLE_NAME OWNER_NAME FLASHBACK_AR ARCHIVE_TABLE_NAME ---------------------- ---------- ------------ -------------------- EMPLOYEES HR FB_ES SYS_FBA_HIST_70313 Querying Flashback Data Archives Querying the historical data for a table in a Flashback Data Archive is as easy as using the as of clause in a table when you are using DML activity stored in an undo tablespace. In fact, users will not know whether they are retrieving historical data from the undo tablespace or from a Flashback Data Archive. In this scenario, much like in the scenarios earlier in this chapter, one of the employees in the HR department deletes an employee row in the EMPLOYEES table and forgets to archive it to the EMPLOYEE_HISTORY table first; with Flashback Data Archives enabled for the EMPLOYEES table,
- Chapter 7: Managing Transactions with Undo Tablespaces 239the HR employee can rely on the FB_ES archive to satisfy any queries on employees no longer inthe EMPLOYEE table. This is the delete statement from three weeks ago:SQL> delete from employees where employee_id = 169;1 row deleted.SQL> The HR employee needs to find the hire date for employee 169, so she retrieves the historicalinformation from the EMPLOYEES table with the as of clause specifying a time four weeks ago:SQL> select employee_id, last_name, hire_date 2 from employees 3 as of timestamp (systimestamp - interval 28 day) 4 where employee_id = 169;EMPLOYEE_ID LAST_NAME HIRE_DATE----------- ------------------------- --------- 169 Bloom 23-MAR-98SQL>Whether Oracle is using an undo tablespace or a Flashback Data Archive for a query containingas of is completely transparent to the user.Flashback and LOBsUndo data for LOB columns in a table can take up gigabytes of disk space even for a single row;therefore, to enable flashback operations for LOB columns, you must explicitly specify the retentionkeyword in the storage clause for the LOB. This keyword is mutually exclusive with the pctversionkeyword, which specified a percentage of the table space for old versions of the LOBs. If you usethe retention keyword, old versions of a LOB are retained for the amount of time specified by theUNDO_RETENTION parameter, just as any other table rows in the undo tablespace.Migrating to Automatic Undo ManagementTo migrate your environment from manually managed rollback segments to Automatic UndoManagement, you need to know one thing: how large to size the undo tablespace based on theusage of the rollback segments in manual undo mode. With all manual rollback segments online,execute the procedure DBMS_UNDO_ADV.RBU_MIGRATION to return the size, in megabytes,of the current rollback segment utilization:SQL> variable undo_size numberSQL> begin 2 :undo_size := dbms_undo_adv.rbu_migration; 3 end; 4 /
- 240 Oracle Database 11g DBA Handbook PL/SQL procedure successfully completed. SQL> print :undo_size UNDO_SIZE ---------- 2840 SQL> In this example, an undo tablespace created to replace the rollback segments should be at least 2840MB, or 2.84GB, to support the undo requirements currently supported by rollback segments.
- CHAPTER 8Database Tuning 241
- 242 Oracle Database 11g DBA Handbook rom a tuning perspective, every system has a performance bottleneck that may F move from component to component over a time period of days or even weeks The goal of performance design is to make sure that the physical limitations of the applications and the associated hardware—I/O throughput rates, memory sizes, query performance, and so on—do not impact the business performance. If the application performance limits the business process it is supposed to be supporting, the application must be tuned. During the design process, the limits of the application environment—including the hardware and the design of the application’s interactions with the database—must be evaluated. No environment provides infinite computing capacity, so every environment is designed to fail at some performance point. In the process of designing the application, you should strive to have your performance needs amply served by the performance capabilities of the environment. Performance tuning is a part of the life cycle of every database application, and the earlier performance is addressed (preferably before going into production), the more likely it will be successfully resolved. As noted in previous chapters, most performance problems are not isolated symptoms but rather are the result of the system design. Tuning efforts should therefore focus on identifying and fixing the underlying flaws that result in unacceptable performance. Tuning is the final step in a four-step process: planning, implementing, and monitoring must precede it. If you tune only for the sake of tuning, you are failing to address the full cycle of activity and will likely never resolve the underlying flaws that caused the performance problem. Most of the database objects that can be tuned are discussed elsewhere in this book—for example, undo segments are covered thoroughly in Chapter 7. This chapter only discusses the tuning-related activities for such objects, while their own chapters cover planning and monitoring activities. As of Oracle Database 10g, and significantly enhanced in Oracle Database 11g, you can take advantage of new tuning tools and features, including the Automated Workload Repository. For ease of use, and to take advantage of numerous automated monitoring and diagnostic tools, OEM Database Control is the Oracle-recommended tool on a routine basis. Before jumping into the OEM tools, however, I’ll present some of the prerequisites and principles behind effective proactive and reactive tuning methods. In the following sections, you will see tuning activities for the following areas: ■ Application design ■ SQL ■ Memory usage ■ Data storage ■ Data manipulation ■ Physical storage ■ Logical storage ■ Network traffic
- Chapter 8: Database Tuning 243Tuning Application DesignWhy should a DBA tuning guide include a section on application design? And why should thissection come first? Because nothing you can do as a DBA will have as great an impact on thesystem performance as the design of the application. The requirements for making the DBA’sinvolvement in application development a reality are described in Chapter 5. In designing anapplication, you can take several steps to make effective and proper use of the availabletechnology, as described in the following sections.Effective Table DesignNo matter how well designed your database is, poor table design will lead to poor performance.Not only that, but overly rigid adherence to relational table designs will lead to poor performance.That is due to the fact that while fully relational table designs (said to be in the third normal formor even fourth normal form) are logically desirable, they are usually physically undesirable inanything but OLTP environments. The problem with such designs is that although they accurately reflect the ways in which anapplication’s data is related to other data, they do not reflect the normal access paths that users willemploy to access that data. Once the user’s access requirements are evaluated, the fully relationaltable design will become unworkable for many large queries. Typically, the first problems will occurwith queries that return a large number of columns. These columns are usually scattered amongseveral tables, forcing the tables to be joined together during the query. If one of the joined tablesis large, the performance of the whole query may suffer. In designing the tables for an application, developers should first develop the model in thirdnormal form and then consider denormalizing data to meet specific requirements—for example,creating small summary tables (or materialized views) from large, static tables. Can that data bedynamically derived from the large, static tables on demand? Of course. But if the users frequentlyrequest it, and the data is largely unchanging, then it makes sense to periodically store that data inthe format in which the users will ask for it. For example, some applications store historical data and current data in the same table. Eachrow may have a timestamp column, so the current row in a set is the one with the most recenttimestamp. Every time a user queries the table for a current row, the user will need to perform asubquery, such as the following:where timestamp_col = (select max(timestamp_col) from table where emp_no=196811) If two such tables are joined, there will be two subqueries. In a small database, this may notpresent a performance problem, but as the number of tables and rows increase, performanceproblems will follow. Partitioning the historical data away from the current data or storing thehistorical data in a separate table will involve more work for the DBAs and developers but shouldimprove the long-term performance of the application. User-centered table design, rather than theory-centered table design, will yield a system thatbetter meets the users’ requirements; this is not to say that you should not design the database
- 244 Oracle Database 11g DBA Handbook using 3NF and 4NF methodologies: it’s a good starting point for revealing business requirements and a prerequisite for the physical database design. Physical database design options include separating a single table into multiple tables, and the reverse—combining multiple tables into one. The emphasis should be on providing the users the most direct path possible to the data they want in the format they want. Distribution of CPU Requirements When effectively designed and given adequate hardware, an Oracle database application will process I/O requests without excessive waits, will use memory areas without swapping and paging memory to disk, and will use the CPU without generating high load averages. Data that is read into memory by one process will be stored in memory and reused by many processes before it is aged out of memory. SQL commands are reused via the shared SQL area, further reducing the burden on the system. If the I/O burdens of the system are reduced, the CPU burden may increase. You have several options for managing the CPU resources: ■ The CPU load should be scheduled. You should time long-running batch queries or update programs to run at off-peak hours. Rather than run them at lower operating system priority while online users are performing transactions, run them at normal operating system priority at an appropriate time. Maintaining their normal priority level while scheduling the jobs appropriately will minimize potential locking, undo, and CPU conflicts. ■ Take advantage of the opportunity to physically shift CPU requirements from one server to another. Wherever possible, isolate the database server from the application’s CPU requirements. The data distribution techniques described in the networking chapters of this book will result in data being stored in its most appropriate place, and the CPU requirements of the application may be separated from the I/O requirements against the database. ■ Consider using Oracle’s Real Application Clusters (RAC) technology to spread the database access requirements for a single database across multiple instances. See Chapter 10 for an in-depth review of RAC features along with step-by-step instructions on how to create a RAC database. ■ Use the database resource management features. You can use the Database Resource Manager to establish resource allocation plans and resource consumer groups. You can use Oracle’s capabilities to change the resource allocations available to the consumer groups. See Chapter 5 for details on creating and implementing resource consumer groups and resource plans via the Database Resource Manager. ■ Use Parallel Query to distribute the processing requirements of SQL statements among multiple CPUs. Parallelism can be used by almost every SQL command, including select, create table as select, create index, recover, and the SQL*Loader Direct Path loading options. The degree to which a transaction is parallelized depends on the defined degree of parallelism for the transaction. Each table has a defined degree of parallelism, and a query can override the
- Chapter 8: Database Tuning 245default degree of parallelism by using the PARALLEL hint. Oracle evaluates the number of CPUsavailable on the server and the number of disks on which the table’s data is stored in order todetermine the default degree of parallelism. The maximum available parallelism is set at the instance level. The PARALLEL_MAX_SERVERSinitialization parameter sets the maximum number of parallel query server processes that can beused at any one time by all the processes in the database. For example, if you set PARALLEL_MAX_SERVERS to 32 for your instance, and you run a query that uses 30 parallel query serverprocesses for its query and sorting operations, then only two parallel query server processes areavailable for all the rest of the users in the database. Therefore, you need to carefully manage theparallelism you allow for your queries and batch operations. The PARALLEL_ADAPTIVE_MULTI_USER parameter, when set to TRUE, enables an adaptive algorithm designed to improveperformance in multiuser environments using parallel execution. The algorithm automaticallyreduces the requested degree of parallelism according to the system load at query startup time.The effective degree of parallelism is based on the default degree of parallelism, or the degreefrom the table, or hints, divided by a reduction factor. For each table, you can set a default degree of parallelism via the parallel clause of the createtable and alter table commands. The degree of parallelism tells Oracle how many parallel queryserver processes to attempt to use for each part of the operation. For example, if a query thatperforms both table scanning and data sorting operations has a degree of parallelism of 5, therecould be ten parallel query server processes used—five for scanning and five for sorting. You canalso specify a degree of parallelism for an index when it is created, via the parallel clause of thecreate index command. The minimum number of parallel query server processes started is set via the PARALLEL_MIN_SERVERS initialization parameter. In general, you should set this parameter to a very lownumber (less than 5) unless the system is actively used at all hours of the day. Setting thisparameter to a low value will force Oracle to repeatedly start new query server processes, but itwill greatly decrease the amount of memory held by idle parallel query server processes duringlow-use periods. If you set a high value for PARALLEL_MIN_SERVERS, you may frequently haveidle parallel query server processes on your server, holding onto the memory they had previouslyacquired but not performing any functions. Parallelizing operations distributes their processing requirements across multiple CPUs;however, you should use these features carefully. If you use a degree of parallelism of 5 for a largequery, you will have five separate processes accessing the data. If you have that many processesaccessing the data, you may create contention for the disks on which the data is stored, thushurting performance. When using Parallel Query, you should selectively apply it to those tableswhose data is well distributed over many physical devices. Also, you should avoid using it for alltables; as noted earlier, a single query may use all the available parallel query server processes,eliminating the parallelism for all the rest of the transactions in your database.Effective Application DesignIn addition to the application design topics described later in this chapter are several generalguidelines for Oracle applications. First, they should minimize the number of times they request data from the database. Optionsinclude the use of sequences, PL/SQL blocks, and the denormalization of tables. You can usedistributed database objects such as materialized views to help reduce the number of times adatabase is queried.
- 246 Oracle Database 11g DBA Handbook NOTE Even mildly inefficient SQL can impact your database’s performance if it is executed frequently enough. SQL that generates few or no physical I/O reads still consumes CPU resources. Second, different users of the same application should query the database in a very similar fashion. Consistent access paths increase the likelihood that requests may be resolved by information that is already available in the SGA. The sharing of data includes not only the tables and rows retrieved but also the queries that are used. If the queries are identical, a parsed version of a query may already exist in the shared SQL pool, reducing the amount of time needed to process the query. Cursor sharing enhancements in the optimizer increase the likelihood of statement reuse within the shared pool—but the application needs to be designed with statement reuse in mind. Third, you should restrict the use of dynamic SQL. Dynamic SQL, by definition, is undefined until run time; an application’s dynamic SQL may select a couple of rows the first time, perform several full table scans of the order table the second time, and inadvertently perform a Cartesian join the third time (or consciously perform a Cartesian join using the cross join keyword in a select statement!). In addition, there is no way to guarantee that a dynamically generated SQL statement is syntactically correct until run time. Dynamically generated SQL is a double-edged sword: you have the flexibility to create your SQL on the fly based on user input, but you open yourself up to SQL injection attacks for both your in-house applications and your external website applications. Fourth, you should minimize the number of times you open and close sessions in the database. If the application repeatedly opens a session, executes a small number of commands, and then closes the session, the performance of the SQL may be a minor factor in the overall performance. The session management may cost more than any other step in the application. When stored procedures are used, the same code may be executed multiple times, taking advantage of the shared pool. You can also manually compile procedures, functions, and packages to avoid run-time compilation. When you create a procedure, Oracle automatically compiles it. If the procedure later becomes invalid, the database must recompile it before executing it. To avoid incurring this compilation cost at run time, use the alter procedure command shown here: alter procedure MY_RAISE compile; You can view the SQL text for all procedures in a database via the Text column in the DBA_ SOURCE view. The USER_SOURCE view will display the procedures owned by the user performing the query. Text for packages, functions, and package bodies is also accessible via the DBA_SOURCE and USER_SOURCE views, which in turn reference a table named SYS.SOURCE$. The first two design guidelines discussed—limiting the number of user accesses and coordinating their requests—require the application developer to know as much as possible about how the data is to be used and the access paths involved. For this reason, it is critical that users be as involved in the application design as they are in the table design. If the users spend long hours drawing pictures of tables with the data modelers and little time with the application developers discussing the access paths, the application will most likely not meet the users’ needs. The access paths should be discussed as part of the data modeling exercise.
- Chapter 8: Database Tuning 247Tuning SQLAs with application design, the tuning of SQL statements seems far removed from a DBA’s duties.However, DBAs should be involved in reviewing the SQL that is written as part of the application.A well-designed application may still experience performance problems if the SQL it uses is poorlytuned. Application design and SQL problems cause most of the performance problems in properlydesigned databases. The key to tuning SQL is to minimize the search path that the database uses to find the data.In most Oracle tables, each row has a RowID associated with it. The RowID contains informationabout the physical location of the row—its file, the block within that file, and the row within thedatabase block. When a query with no where clause is executed, the database will usually perform a full tablescan, reading every block from the table. During a full table scan, the database locates the firstblock of the table and then reads sequentially through all the other blocks in the table. For largetables, full table scans can be very time-consuming. When specific rows are queried, the database may use an index to help speed the retrievalof the desired rows. An index maps logical values in a table to their RowIDs—which in turn mapthem to specific physical locations. Indexes may either be unique—in which case there is nomore than one occurrence for each value—or nonunique. Indexes only store RowIDs for NOTNULL values in the indexed columns. You may index several columns together. This is called a concatenated or composite index,and it will be used if its leading column is used in the query’s where clause. The optimizer canalso use a “skip-scan” approach in which a concatenated index is used even if its leading columnis not in the query’s where clause. Indexes must be tailored to the access path needed. Consider the case of a three-column,concatenated index. As shown in the following listing, this index is created on the City, State,and Zip columns of the EMPLOYEE table:create index CITY_ST_ZIP_NDXon EMPLOYEE(City, State, Zip)tablespace INDEXES; If a query of the formselect * from EMPLOYEE where State=NJ;is executed, then the leading column of the index (City) is not in the where clause. Oracle canuse two types of index-based accesses to retrieve the rows—a skip-scan of the index or a full scanof the index. The optimizer will select an execution path based on the index’s statistics—its size,the size of the table, and the selectivity of the index. If users will frequently run this type of query,the index’s columns may need to be reordered with State first in order to reflect the actual usagepattern. An index range scan is another index-based optimization that Oracle can use to efficientlyretrieve selective data. Oracle uses an index range scan when the variable in the where clause isequal to, less than, or greater than the specified constant and the variable is the leading column if
- 248 Oracle Database 11g DBA Handbook the index is a multi-part index. No order by clause is required if you want the rows returned in the index order, as in this example where you are looking for employees hired before August 1st, 2007: select * from EMPLOYEE where hire_date < 1-AUG-2007; It is critical that the table’s data be as ordered as possible. If users are frequently executing range queries—selecting those values that are within a specified range—then having the data ordered may require fewer data blocks to be read while resolving the query, thus improving performance. The ordered entries in the index will point to a set of neighboring blocks in the table rather than blocks that are scattered throughout the datafile(s). For example, consider a range query of the following type: select * from EMPLOYEE where Empno between 1 and 100; This range query will require fewer data blocks to be read if the physical rows in the EMPLOYEE table are ordered by the EMPNO column. To guarantee that the rows are properly ordered in the table, extract the rows to a flat file (or another table), sort the rows there, and then delete the old rows and reload them from the sorted data set. In addition, you should use online segment shrink to reclaim fragmented free space below the high water mark for tables with frequent DML activity; this improves cache utilization and requires fewer blocks to be scanned in full table scans. You use the alter table . . . shrink space command to compact the free space in a table. Impact of Order on Load Rates Indexes impact the performance of both queries and data loads. During insert operations, the rows’ order has a significant impact on load performance. Even in heavily indexed environments, properly ordering the rows prior to insert may improve load performance by 50 percent. As an index grows, Oracle allocates new blocks. If a new index entry is added beyond the last previous entry, the new entry will be added to the last block in the index. If the new entry causes Oracle to exceed the space available in that block, the entry will be moved to a new block. There is very little performance impact from this block allocation. If the inserted rows are not ordered, new index entries will be written to existing index node blocks. If there is no more room in the block where the new value is added, and the block is not the last block in the index, the block’s entries will be split in two. Half the index entries will be left in the original block, and half will be moved to a new block. As a result, the performance suffers during loads (because of the additional space management activity) and during queries (because the index contains more unused space, requiring more blocks to be read for the same number of entries read). NOTE There is a significant drop in load performance when an index increases its number of internal levels. To see the number of levels, analyze an index and then select its B level column value from DBA_ INDEXES. Because of the way Oracle manages its indexes internally, load rates will be affected each time a new index is added (because it is unlikely that inserted rows will be sorted correctly for
- Chapter 8: Database Tuning 249multiple columns). From a load rate perspective, favor fewer multicolumn indexes over multiplesingle-column indexes.Additional Indexing OptionsIf the data is not very selective, you may consider using bitmap indexes. As described in Chapter16, bitmap indexes are most effective for queries against large, static data sets with few distinctvalues. You can create both bitmap indexes and normal (B-tree) indexes on the same table, andOracle will perform any necessary index conversions dynamically during query processing. SeeChapter 16 for details on using bitmap indexes. NOTE Avoid creating bitmap indexes on tables modified by online transactions; data warehouse tables, however, are excellent candidates for bitmap indexes. If two tables are frequently queried together, then clusters may be effective in improvingperformance. Clusters store rows from multiple tables in the same physical data blocks, basedon their logical values (the cluster key). Queries in which a column’s value is compared to an exact value (rather than a range ofvalues) are called equivalence queries. A hash cluster stores a row in a specific location basedon its value in the cluster key column. Every time a row is inserted, its cluster key value is usedto determine in which block it should be stored; this same logic can be used during queries toquickly find data blocks that are needed for retrieval. Hash clusters are designed to improve theperformance of equivalence queries; they will not be as helpful in improving the performance ofthe range queries discussed earlier. Performance will be significantly worse with range queries,queries that force a full table scan, or for hash clusters that are frequently updated. Reverse indexes provide another tuning solution for equivalence queries. In a reverse index,the bytes of the index are stored in reverse order. In a traditional index, two consecutive valuesare stored next to each other. In a reverse index, consecutive values are not stored next to eachother. For example, the values 2004 and 2005 are stored as 4002 and 5002, respectively, in areverse index. Although not appropriate for range scans, reverse indexes may reduce contentionfor index blocks if many equivalence queries are performed. Reverse key indexes may need to berebuilt quite often to perform well. They should also include a large value for PCTFREE to allowfor inserts. NOTE You cannot reverse a bitmap index. You can create function-based indexes on expressions involving columns. This query couldnot use a B-tree index on the Name column:Select * from EMPLOYEEwhere UPPER(Name) = JONES;However, the queryselect * from EMPLOYEE where Name = JONES;
- 250 Oracle Database 11g DBA Handbook could, because the second query does not perform a function on the Name column. Instead of creating an index on the column Name, you can create an index on the column expression UPPER(Name), as shown in the following example: create index EMP_UPPER_NAME on EMPLOYEE(UPPER(Name)); Although function-based indexes can be useful, be sure to consider the following points when creating them: ■ Can you restrict the functions that will be used on the column? If so, can you restrict all functions from being performed on the column? ■ Do you have adequate storage space for the additional indexes? ■ When you drop the table, you will be dropping more indexes (and therefore more extents) than before. How will that impact the time required to drop the table? (This is less of a consideration if you are using locally managed tablespaces, which you should be using if you’re running Oracle Database 10g or later.) Function-based indexes are useful, but you should implement them sparingly. The more indexes you create on a table, the longer all insert, update, and delete operations will take. Of course, this applies to creating any additional indexes on a table, regardless of type. Text indexes use Oracle’s text options (Oracle Text) to create and manage lists of words and their occurrences—similar to the way a book’s index works. Text indexes are most often used to support applications that perform searches on portions of words with wildcards. Partitioned tables can have indexes that span all partitions (global indexes) or indexes that are partitioned along with the table partitions (local indexes). From a query-tuning perspective, local indexes may be preferable because they contain fewer entries than global indexes. Generating Explain Plans How can you determine which access path the database will use to perform a query? This information can be viewed via the explain plan command. This command will evaluate the execution path for a query and will place its output into a table (named PLAN_TABLE) in the database. A sample explain plan command is shown in the following listing: explain plan for select * from BOOKSHELF where Title like M%; The first line of this command tells the database that it is to explain its execution plan for the query without actually executing the query. You can optionally include a set Statement_ID clause to label the explain plan in PLAN_TABLE. Following the keyword for, the query to be analyzed is listed. The account that is running this command must have a plan table in its schema. Oracle provides the create table commands needed for this table. The file, named utlxplan.sql, is located in the $ORACLE_HOME/rdbms/admin directory. Users may run this script to create the table in their schemas.
- Chapter 8: Database Tuning 251 NOTE You should drop and re-create the plan table following each Oracle upgrade because new columns may be added by the upgrade scripts. Query the plan table using the DBMS_XPLAN procedure:select * from table(DBMS_XPLAN.DISPLAY); You can also use the Oracle-supplied script in $ORACLE_HOME/rdbms/admin/utlxpls.sql toquery the plan table for serial execution, or the $ORACLE_HOME/rdbms/admin/utlxplp.sql forparallel execution. This query will report on the types of operations the database must perform to resolve thequery. The output will show the steps of the query execution in a hierarchical fashion, illustratingthe relationships between the steps. For example, you may see an index-based step that has aTABLE ACCESS BY INDEX ROWID step as its parent, indicating that the index step is processedfirst and the RowIDs returned from the index are used to retrieve specific rows from the table. You can use the set autotrace on command in SQL*Plus to automatically generate the explainplan output and trace information for every query you run. The autotrace-generated output willnot be displayed until after the query has completed, whereas the explain plan output is generatedwithout running the command. To enable autotrace-generated output, a plan table must either becreated in the schema in which the autotrace utility will be used or created in the SYSTEM schemawith access granted to the schema that will use the autotrace utility. The script plustrce.sql, locatedin the $ORACLE_HOME/sqlplus/admin directory, must also be run as SYS before you can setautotrace on. Users must have the PLUSTRACE role enabled prior to executing set autotrace on.For an installation or upgrade to Oracle Database 10g or later, this script is run automatically. NOTE To show the explain plan output without running the query, use the set autotrace traceonly explain command. If you use the parallel query options or query remote databases, an additional section of theset autotrace on output will show the text of the queries executed by the parallel query serverprocesses or the query executed within the remote database. To disable the autotrace feature, use the set autotrace off command. The following listing shows how to turn on autotrace and generate an explain plan:set autotrace traceonly explainselect * from BOOKSHELF where Title like M%;Execution Plan---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=3 Card=2 Bytes=80) 1 0 TABLE ACCESS (BY INDEX ROWID) OF BOOKSHELF (TABLE) (Cost =3 Card=2 Bytes=80) 2 1 INDEX (RANGE SCAN) OF SYS_C004834 (INDEX (UNIQUE)) (Co st=1 Card=2)
- 252 Oracle Database 11g DBA Handbook To understand the explain plan, read the order of operations within the hierarchy from inside out, until you come to a set of operations at the same level of indentation; then read from top to bottom. In this example, there are no operations at the same level of indentation; therefore, you read the order of operations from inside out. The first operation is the index range scan, followed by the table access; the SELECT STATEMENT operation displays the output to the user. Each operation has an ID value (the first column) and a parent ID value (the second number; it is blank in the topmost operation). In more complex explain plans, you may need to use the parent ID values to determine the order of operations. This plan shows that the data returned to the user comes via a TABLE ACCESS BY INDEX ROWID operation. The RowIDs are supplied by an index range scan of a unique index. Each step is assigned a “cost.” The cost is cumulative, reflecting the cost of that step plus the costs of all its child steps. You can use the cost values to identify steps that contribute the greatest amount to the overall cost of the query and then target them for specific tuning efforts. When evaluating the output of the explain plan command, you should make sure that the most selective indexes (that is, the most nearly unique indexes) are used by the query. If a nonselective index is used, you may be forcing the database to perform unnecessary reads to resolve the query. A full discussion of SQL tuning is beyond the scope of this book, but you should focus your tuning efforts on making sure that the most resource-intensive SQL statements are using the most selective indexes possible. In general, transaction-oriented applications (such as multiuser systems used for data entry) judge performance by the time it takes to return the first row of a query. For transaction-oriented applications, you should focus your tuning efforts on using indexes to reduce the database’s response time to the query. If the application is batch oriented (with large transactions and reports), you should focus on improving the time it takes to complete the overall transaction instead of the time it takes to return the first row from the transaction. Improving the overall throughput of the transaction may require using full table scans in place of index accesses—and may improve the overall performance of the application. If the application is distributed across multiple databases, focus on reducing the number of times database links are used in queries. If a remote database is frequently accessed during a query, the cost of accessing that remote database is paid each time the remote data is accessed. Even if the cost of accessing the remote data is low, accessing it thousands of times will eventually place a performance burden on your application. See the section “Reducing Network Traffic” later in this chapter for additional tuning suggestions for distributed databases. Tuning Memory Usage As of Oracle 10g, you can use the Automatic Workload Repository (AWR) toolset to gather and manage statistical data (as described later in this chapter). As of Oracle 11g, you can use new initialization parameters such as MEMORY_TARGET to further automate the overall memory used by Oracle—helping you tune the database automatically when you don’t have time to read the AWR reports! The data block buffer cache and the shared pool are managed via a least recently used (LRU) algorithm. A preset area is set aside to hold values; when it fills, the least recently used data is eliminated from memory and written back to disk. An adequately sized memory area keeps the most frequently accessed data in memory; accessing less frequently used data requires physical reads.
- Chapter 8: Database Tuning 253 You can see the queries performing the logical and physical reads in the database via theV$SQL view. V$SQL reports the cumulative number of logical and physical reads performed foreach query currently in the shared pool, as well as the number of times each query was executed.The following script shows the SQL text for the queries in the shared pool, with the most I/Ointensive queries listed first. The query also displays the number of logical reads (buffer gets)per execution:select Buffer_Gets, Disk_Reads, Executions, Buffer_Gets/Executions B_E, SQL_Text from V$SQL where executions != 0 order by Disk_Reads desc; If the shared pool has been flushed, queries executed prior to the flush will no longer beaccessible via V$SQL. However, the impact of those queries can still be seen, provided the usersare still logged in. The V$SESS_IO view records the cumulative logical reads and physical readsperformed for each user’s session. You can query V$SESS_IO for each session’s hit ratio, as shownin the following listing:select SESS.Username, SESS_IO.Block_Gets, SESS_IO.Consistent_Gets, SESS_IO.Physical_Reads, round(100*(SESS_IO.Consistent_Gets +SESS_IO.Block_Gets-SESS_IO.Physical_Reads)/ (decode(SESS_IO.Consistent_Gets,0,1, SESS_IO.Consistent_Gets+SESS_IO.Block_Gets)),2) session_hit_ratio from V$SESS_IO sess_io, V$SESSION sess where SESS.Sid = SESS_IO.Sid and SESS.Username is not null order by Username; To see the objects whose blocks are currently in the data block buffer cache, query the X$BHtable in SYS’s schema, as shown in the following query (note that the SYS and SYSTEM objects areexcluded from the output so the DBA can focus on the application tables and indexes present inthe SGA):select Object_Name, Object_Type , count(*) Num_Buff from X$BH a, SYS.DBA_OBJECTS b where A.Obj = B.Object_Id and Owner not in (SYS,SYSTEM) group by Object_Name, Object_Type; NOTE You can query the Name and Kind columns from V$CACHE to see similar data if you are not connected as the SYS user.
- 254 Oracle Database 11g DBA Handbook There are multiple cache areas within the data block buffer cache: ■ The DEFAULT cache This is the standard cache for objects that use the default database block size for the database. ■ The KEEP cache This is dedicated to objects you wish to keep in memory at all times. In general, this area is used for small tables with few transactions. This cache is good for lookup tables for such things as state codes, ZIP codes, and salesman data. ■ The RECYCLE cache This is a dedicated to objects you wish to flush from memory quickly. Like the KEEP cache, the RECYCLE cache isolates objects in memory so that they do not interfere with the normal functioning of the DEFAULT cache. ■ Block-size-specific caches Oracle supports multiple database block sizes within a single database; you must create a cache for each non-default database block size. With all the areas of the SGA—the data block buffers, the dictionary cache, and the shared pool—the emphasis should be on sharing data among users. Each of these areas should be large enough to hold the most commonly requested data from the database. In the case of the shared pool, it should be large enough to hold the parsed versions of the most commonly used queries. When they are adequately sized, the memory areas in the SGA can dramatically improve the performance of individual queries and of the database as a whole. The sizes of the KEEP and RECYCLE buffer pools do not reduce the available space in the data block buffer cache. For a table to use one of the new buffer pools, specify the name of the buffer pool via the buffer_pool parameter within the table’s storage clause. For example, if you want a table to be quickly removed from memory, assign it to the RECYCLE pool. The default pool is named DEFAULT, so you can use the alter table command to redirect a table to the DEFAULT pool at a later date. Here is an example of assigning a table to the KEEP buffer pool: create table state_cd_lookup (state_cd char(2), state_nm varchar2(50) ) storage (buffer_pool keep); You can use the LARGE_POOL_SIZE initialization parameter to specify the size of the large pool allocation heap in bytes. The large pool allocation heap is used in shared server systems for session memory, by parallel execution for message buffers, and by backup processes for I/O buffers. By default, the large pool is not created. As of Oracle Database 10g, you can use Automatic Shared Memory Management (ASMM). To activate ASMM, set a nonzero value for the SGA_TARGET database initialization parameter. After you set SGA_TARGET to the size of the SGA you want (that is, all of the caches added together), you can then set the other cache-related parameters (DB_CACHE_SIZE, SHARED_POOL_SIZE, JAVA_POOL_SIZE, and LARGE_POOL_SIZE) each to 0; if you provide values for these parameters, those values will serve as the lower bound for the automatic tuning algorithm. Shut down and restart the database for the changes to take effect; the database will then begin actively managing the size of the different caches. You can monitor the size of the caches at any time via the V$SGASTAT dynamic performance view. Oracle Database 11g takes the automation a step farther: you can set MEMORY_TARGET to the total amount of memory available to Oracle. The amount of memory specified in MEMORY_TARGET is allocated between the SGA and PGA automatically; when MEMORY_TARGET is set, SGA_TARGET and PGA_AGGREGATE_TARGET are set to zero and ignored.
- Chapter 8: Database Tuning 255 As the workload in the database changes, the database will alter the cache sizes to reflect theneeds of the application. For example, if there is a heavy batch-processing load at night and amore intensive online transaction load during the day, the database may alter the cache sizes asthe load changes. These changes occur automatically, without DBA intervention. If you specify avalue for a pool in your initialization parameter file, Oracle will use that as the minimum valuefor that pool. NOTE DBAs can create KEEP and RECYCLE pools in the buffer cache. KEEP and RECYCLE pools are not affected by the dynamic cache resizing and are not part of the DEFAULT buffer pool. From within OEM, you can see if dynamic memory management is enabled by clicking theMemory Parameters option; the Automatic Shared Memory Management button can be set to“Enabled” or “Disabled.” You may wish to selectively “pin” packages in the shared pool. Pinning packages in memoryimmediately after starting the database will increase the likelihood that a large enough section ofcontiguous free space is available in memory. As shown in the following listing, the KEEP procedureof the DBMS_SHARED_POOL package designates the packages to pin in the shared pool:execute DBMS_SHARED_POOL.KEEP(APPOWNER.ADD_CLIENT,P); Pinning of packages is more closely related to application management than application tuning,but it can have a performance impact. If you can avoid dynamic management of fragmentedmemory areas, you minimize the work Oracle has to do when managing the shared pool.Specifying the Size of the SGATo enable the automatic management of the caches, set the SGA_TARGET initialization parameterto the size of the SGA. If you choose to manage the caches manually, you can set the SGA_MAX_SIZE parameter tothe size of the SGA. You can then specify the sizes for the individual caches; they can bedynamically altered while the database is running via the alter system command. You can also set the SGA_TARGET to a size smaller than the SGA_MAX_SIZE. Oracle will usethe SGA_TARGET to initially set the individual caches and can grow them over time to occupymore memory up to SGA_MAX_SIZE. This is a good way to determine what the total memoryrequirements should be before deploying your database in a production environment.Parameter DescriptionSGA_MAX_SIZE The maximum size to which the SGA can grow.SHARED_POOL_SIZE The size of the shared pool.DB_BLOCK_SIZE This will be the default database block size for the database.DB_CACHE_SIZE The cache size specified in bytes.DB_nK_CACHE_SIZE If you will be using multiple database block sizes within a single database, you must specify at a DB_CACHE_SIZE parameter value and at least one DB_nK_CACHE_SIZE parameter value. For example, if your standard database block size is 4KB, you can also specify a cache for the 8KB block size tablespaces via the DB_8K_CACHE_SIZE parameter.
- 256 Oracle Database 11g DBA Handbook For example, you may specify the following: SGA_MAX_SIZE=1024M SHARED_POOL_SIZE=220M DB_BLOCK_SIZE=8192 DB_CACHE_SIZE=320M DB_4K_BLOCK_SIZE=4M With these parameters, 4MB will be available for data queried from objects in tablespaces with 4KB block sizes. Objects using the standard 8KB block size will use the 160MB cache. While the database is open, you can change the SHARED_POOL_SIZE and DB_CACHE_SIZE parameter values via the alter system command. SGA_TARGET is a dynamic parameter and can be changed through Database Control or with the alter system command. SGA_TARGET can be increased up to the value of SGA_MAX_SIZE. It can be reduced until any one of the auto-tuned components reaches its minimum size—either a user-specified minimum or an internally determined minimum. Both of these parameters can be used to tune the SGA. Using the Cost-Based Optimizer With each release of its software, Oracle has added new features to its optimizer and has enhanced existing features. Effective use of the cost-based optimizer requires that the tables and indexes in your application be analyzed regularly. The frequency with which you analyze the objects depends on the rate of change within the objects. For batch transaction applications, you should reanalyze the objects after each large set of batch transactions. For OLTP applications, you should reanalyze the objects on a time-based schedule (such as via a weekly or nightly process). NOTE As of Oracle Database 10g Release 1, the rule-based optimizer is desupported. Statistics on objects are gathered via executions of the DBMS_STATS package’s procedures. If you analyze a table, its associated indexes are automatically analyzed as well. You can analyze a schema (via the GATHER_SCHEMA_STATS procedure) or a specific table (via GATHER_TABLE_ STATS). You can also analyze only the indexed columns, thus speeding the analysis process. In general, you should analyze a table’s indexes each time you analyze the table. In the following listing, the PRACTICE schema is analyzed: execute DBMS_STATS.GATHER_SCHEMA_STATS(PRACTICE, COMPUTE); You can view the statistics on tables and indexes via DBA_TABLES, DBA_TAB_COL_ STATISTICS, and DBA_INDEXES. Some column-level statistics are still provided in DBA_TAB_ COLUMNS, but they are provided there strictly for backward compatibility. The statistics for the columns of partitioned tables are found in DBA_PART_COL_STATISTICS. NOTE As of Oracle Database 10g, statistics are automatically gathered in a default installation using the automated maintenance tasks infrastructure (AutoTask) during maintenance windows.
- Chapter 8: Database Tuning 257 When the command in the preceding listing is executed, all the objects belonging to thePRACTICE schema will be analyzed using the compute statistics option. You can also chooseto estimate statistics based on a specified percentage of the table’s rows.Implications of the COMPUTE STATISTICS OptionIn the examples in the preceding section, the compute statistics option was used to gatherstatistics about objects. Oracle also provides the estimate statistics option, which bases theobject’s statistics on a review of a portion of the data. If you choose to use estimate statistics,analyze as much of the table as possible. You can specify a percentage of the rows to analyze—analyzing 20 percent is usually sufficient. TIP The availability of the analyze table . . . compute statistics or analyze table . . . estimate statistics command outside of the DBMS_STATS package may be removed in a future release of Oracle; use the analyze command for non-statistics-related tasks such as validate structure or list chained rows, or else to collect information on freelist blocks. Analyzing data can require large amounts of sort space. Because the analysis may includefull table scans as well, you should change your session settings immediately prior to starting theanalysis. When the analysis completes, either end your session or change your settings back tothe database’s values. The session settings to change are those for SORT_AREA_SIZE and DB_FILE_MULTIBLOCK_READ_COUNT. As of Oracle Database 10g, Oracle strongly suggests usingPGA_AGGREGATE_TARGET to automatically manage the value of SORT_AREA_SIZE. The largerthe sort area size is, the less likely you are to need to use the temporary tablespace for sortsegments. The higher the multiblock read count is, the more blocks you may be able to readduring a single physical read (as limited by the operating system). Use the alter session commandto increase these values for your session.Tuning Data AccessEven if your tables are properly configured and indexed, your performance may suffer if thereare wait events caused by file accesses. In the following sections, you will see recommendationsrelated to file and tablespace configuration. In general, you should avoid placing Oracle files on distributed-parity RAID systems such asRAID 5. The overhead generated during writes to such file systems generally presents a performancebottleneck as the system use increases, particularly for sequentially written files such as the onlineredo log files. Favor the use of RAID 0+1 to support both the mirroring and striping of data withoutintroducing these performance bottlenecks.Locally Managed TablespacesYou can use locally managed tablespaces to handle extent management within the tablespaces.Locally managed tablespaces manage their own space by maintaining a bitmap in each datafile ofthe free and used blocks or sets of blocks in the datafile. Each time an extent is allocated or freedfor reuse, the database updates the bitmap to show the new status.
- 258 Oracle Database 11g DBA Handbook NOTE As of Oracle Database 10g, all tablespaces in a default installation are locally managed; bigfile tablespaces must be locally managed. Use dictionary-managed tablespaces only for compatibility with previous versions of Oracle. When you use locally managed tablespaces, the data dictionary is not updated and rollback activity is not generated during extent creations. Locally managed tablespaces automatically track adjacent free space, so there is no need to coalesce extents. Within a locally managed tablespace, all extents can have the same size or the system can automatically determine the size of extents. To use local space management, you can specify the local option for the extent management clause in the create tablespace command. An example of the create tablespace command declaring a locally managed tablespace is shown here: create tablespace CODES_TABLES datafile /u01/oracle/VLDB/codes_tables.dbf size 500M extent management local uniform size 256K; Assuming that the block size for the database in which this tablespace is created is 8KB, in this example, the tablespace is created with the extent management declared as local and with a uniform size of 256KB. Each bit in the bitmap describes 32 blocks (256/8). If the uniform size clause is omitted, the default is autoallocate. The default size for uniform is 1MB. NOTE If you specify local in a create tablespace command, you cannot specify a default storage clause, minextents, or temporary. If you use the create temporary tablespace command to create the tablespace, you can specify extent_management local. As of Oracle9i, tablespaces are created as locally managed by default, so the extent management local clause is optional when you create a new tablespace. NOTE If you make the SYSTEM tablespace locally managed, you can only create locally managed tablespaces within the database; any dictionary-managed tablespaces imported using the transportable tablespace feature can only be opened read-only. Identifying Chained Rows When a data segment is created, a pctfree value is specified. The pctfree parameter tells the database how much space should be kept free in each data block. The free space is used when rows that are already stored in the data block extend in length via update operations. If an update to a row causes that row to no longer completely fit in a single data block, that row may be moved to another data block, or the row may be chained to another block. If you are storing rows whose length is greater than the Oracle block size, you will automatically have chaining.
- Chapter 8: Database Tuning 259 Chaining affects performance because it requires Oracle to look in multiple physical locationsfor data from the same logical row. By eliminating unnecessary chaining, you reduce the numberof physical reads needed to return data from a datafile. You can avoid chaining by setting the proper value for pctfree during the creation of datasegments. The default value, 10, should be increased if your application will frequently updateNULL values to non-NULL values, or if long text values are frequently updated. You can use the analyze command to collect statistics about database objects. The cost-basedoptimizer can use these statistics to determine the best execution path to use. The analyze commandhas an option that detects and records chained rows in tables. Its syntax isanalyze table TABLE_NAME list chained rows into CHAINED_ROWS; The analyze command will put the output from this operation into a table called CHAINED_ROWS in your local schema. The SQL to create the CHAINED_ROWS table is in a file namedutlchain.sql, in the $ORACLE_HOME/rdbms/admin directory. The following query will select themost significant columns from the CHAINED_ROWS table:select Owner_Name, /*Owner of the data segment*/ Table_Name, /*Name of the table with the chained rows*/ Cluster_Name, /*Name of the cluster, if it is clustered*/ Head_RowID /*Rowid of the first part of the row*/from CHAINED_ROWS;The output will show the RowIDs for all chained rows, allowing you to quickly see how many ofthe rows in the table are chained. If chaining is prevalent in a table, that table should be rebuiltwith a higher value for pctfree. You can see the impact of row chaining by querying V$SYSSTAT. The V$SYSSTAT entry forthe “table fetch continued row” statistic will be incremented each time Oracle selects data froma chained row. This statistic will also be incremented when Oracle selects data from a spannedrow—a row that is chained because it is greater than a block in length. Tables with LONG, BLOB,CLOB, and NCLOB datatypes are likely to have spanned rows. The “table fetch continued row”statistic is also available in the AWR reports (or STATSPACK reports in Oracle Database 10g andearlier). In addition to chaining rows, Oracle will occasionally move rows. If a row exceeds the spaceavailable to its block, the row may be inserted into a different block. The process of moving a rowfrom one block to another is called row migration, and the moved row is called a migrated row.During row migration, Oracle has to dynamically manage space in multiple blocks and access thefreelist (the list of blocks available for insert operations). A migrated row does not appear asa chained row, but it does impact the performance of your transactions. See Chapter 6 for anexample of using the DBMS_ADVISOR to find and reorganize tables with chained rows. TIP Accessing a migrated row increments the count in the “table fetch continued row” statistic.Increasing the Oracle Block SizeThe effect of increasing the database block size is significant. Doubling the database block sizemay improve the performance of query-intensive operations by up to 50 percent.
- 260 Oracle Database 11g DBA Handbook The performance benefit has few costs. Because there will be more rows per database block, there is a greater likelihood of block-level contention during data manipulation commands. To address the contention problems, increase the settings for freelists and initrans at the table and index level. In general, setting freelists to greater than 4 will not yield much additional benefit. The initrans setting should reflect the number of concurrent transactions expected within a block. Four is a good number for INITRANS for OLTP applications with heavy DML activity. Increasing the INITRANS value for data warehouse applications does not improve performance. Note also that freelists are used only for objects in non-ASSM tablespaces. NOTE Oracle now automatically allows up to 255 concurrent update transactions in any data block, depending on the available space in the block. When you create a tablespace, you can specify a database block size for the tablespace; by default, the tablespace will use the database block size you specify via the DB_BLOCK_SIZE initialization parameter. If you use a non-default database block size for the tablespace, you will need to create a cache for that block size. For example, if your database block size is 8KB and you want to create a 4KB database block size tablespace, you must first set a value for DB_4K_ CACHE_SIZE. To increase the database block size for the entire database, you must rebuild the entire database and delete all the old database files. The new files can be created in the same location as the old files, with the same size, but will be managed more efficiently by the database. The performance savings comes from the way that Oracle manages the block header information. More space is used by data, improving the ability of multiple users to access the same block of data in memory. Doubling the size of the Oracle blocks has little effect on the block header; therefore, a smaller percentage of space is used to store block header information. To set the block size, modify the DB_BLOCK_SIZE initialization parameter prior to creating a new database. Using Index-Organized Tables An index-organized table (IOT) is an index in which an entire row is stored, rather than just the key values for the row. Rather than storing a RowID for the row, the primary key for the row is treated as the row’s logical identifier. Rows in IOTs do not have RowIDs. Within the IOT, the rows are stored sorted by their primary key values. Thus, any range query that is based on the primary key may benefit because the rows are stored near each other (see the section “Tuning SQL” earlier in this chapter for the steps involved in ordering the data within normal tables). Additionally, any equivalence query based on the primary key may benefit because the table’s data is all stored in the index. In the traditional table/index combination, an index-based access requires an index access followed by a table access. In an IOT, only the IOT is accessed; there is no companion index. However, the performance gains from a single index access in place of a normal index/table combination access may be minimal—any index-based access should be fast. To help improve performance further, index-organized tables offer additional features: ■ An overflow area By setting the pctthreshold parameter when the IOT is created, you can store the primary key data apart from the row data. If the row’s data exceeds the threshold of available space in the block, it will dynamically be moved to an overflow
- Chapter 8: Database Tuning 261 area. You can designate the overflow area to be in a separate tablespace, improving your ability to distribute the I/O associated with the table. ■ Secondary indexes You can create secondary indexes on the IOT. Oracle will use the primary key values as the logical RowIDs for the rows. ■ Reduced storage requirements In a traditional table/index combination, the same key values are stored in two places. In an IOT, they are stored once, reducing the storage requirements. TIP When specifying an overflow area, you can use the including column clause to specify the column (and all successive columns in the table definition) that will be stored in the overflow area: create table ord_iot (order_id number, order_date date, order_notes varchar2(1000), primary key(order_id,order_date)) organization index including order_date overflow tablespace over_ord_tab PARTITION BY RANGE (order_date) (PARTITION p1 VALUES LESS THAN (01-JAN-2005) TABLESPACE data01, PARTITION p2 VALUES LESS THAN (MAXVALUE) TABLESPACE data02); Both order_date and order_notes will be stored in the overflow area. To create an IOT, use the organization index clause of the create table command. You mustspecify a primary key when creating an IOT. Within an IOT, you can drop columns or mark themas inactive via the set unused clause of the alter table command.Tuning Issues for Index-Organized TablesLike indexes, IOTs may become internally fragmented over time, as values are inserted, updated,and deleted. To rebuild an IOT, use the move clause of the alter table command. In the followingexample, the EMPLOYEE_IOT table is rebuilt, along with its overflow area:alter table EMPLOYEE_IOT move tablespace DATAoverflow tablespace DATA_OVERFLOW; You should avoid storing long rows of data in IOTs. In general, you should avoid using an IOTif the data is longer than 75 percent of the database block size. If the database block size is 4KB,and your rows will exceed 3KB in length, you should investigate the use of normal tables andindexes instead of IOTs. The longer the rows are, and the more transactions are performed againstthe IOT, the more frequently it will need to be rebuilt. NOTE You cannot use LONG datatypes in IOTs, but you can use LOBs.
- 262 Oracle Database 11g DBA Handbook As noted earlier in this chapter, indexes impact data load rates. For best results, the primary key index of an index-organized table should be loaded with sequential values to minimize the costs of index management. Tuning Data Manipulation Several data manipulation tasks—usually concerning the manipulation of large quantities of data—may involve the DBA. You have several options when loading and deleting large volumes of data, as described in the following sections. Bulk Inserts: Using the SQL*Loader Direct Path Option When used in the Conventional Path mode, SQL*Loader reads records from a file, generates insert commands, and passes them to the Oracle kernel. Oracle then finds places for those rows in free blocks in the table and updates any associated indexes. In Direct Path mode, SQL*Loader creates formatted data blocks and writes directly to the datafiles. This requires occasional checks with the database to get new locations for data blocks, but no other I/O with the database kernel is required. The result is a data load process that is dramatically faster than Conventional Path mode. If the table is indexed, the indexes will be placed in DIRECT PATH state during the load. After the load is complete, the new keys (index column values) will be sorted and merged with the existing keys in the index. To maintain the temporary set of keys, the load will create a temporary index segment that is at least as large as the largest index on the table. The space requirements for this can be minimized by presorting the data and using the SORTED INDEXES clause in the SQL*Loader control file. To minimize the amount of dynamic space allocation necessary during the load, the data segment that you are loading into should already be created, with all the space it will need already allocated. You should also presort the data on the columns of the largest index in the table. Sorting the data and leaving the indexes on the table during a Direct Path load will usually yield better performance than if you were to drop the indexes before the load and then re-create them after it completed. To take advantage of the Direct Path option, the table cannot be clustered, and there can be no other active transactions against it. During the load, only NOT NULL, UNIQUE, and PRIMARY KEY constraints will be enforced; after the load has completed, the CHECK and FOREIGN KEY constraints can be automatically reenabled. To force this to occur, use the REENABLE DISABLED_CONSTRAINTS clause in the SQL*Loader control file. The only exception to this reenabling process is that table insert triggers, when reenabled, are not executed for each of the new rows in the table. A separate process must manually perform whatever commands were to have been performed by this type of trigger. The SQL*Loader Direct Path loading option provides significant performance improvements over the SQL*Loader Conventional Path loader in loading data into Oracle tables by bypassing SQL processing, buffer cache management, and unnecessary reads for the data blocks. The Parallel Data Loading option of SQL*Loader allows multiple processes to load data into the same table, utilizing spare resources on the system and thereby reducing the overall elapsed times for loading. Given enough CPU and I/O resources, this can significantly reduce the overall loading times.
- Chapter 8: Database Tuning 263 To use Parallel Data Loading, start multiple SQL*Loader sessions using the parallel keyword(otherwise, SQL*Loader puts an exclusive lock on the table). Each session is an independentsession requiring its own control file. The following listing shows three separate Direct Path loads,all using the PARALLEL=TRUE parameter on the command line:sqlload USERID=ME/PASS CONTROL=PART1.CTL DIRECT=TRUE PARALLEL=TRUEsqlload USERID=ME/PASS CONTROL=PART2.CTL DIRECT=TRUE PARALLEL=TRUEsqlload USERID=ME/PASS CONTROL=PART3.CTL DIRECT=TRUE PARALLEL=TRUE Each session creates its own log, bad, and discard files (part1.log, part2.log, part3.log, part1.bad, part2.bad, and so on) by default. Because you have multiple sessions loading data into thesame table, only the APPEND option is allowed for Parallel Data Loading. The SQL*LoaderREPLACE, TRUNCATE, and INSERT options are not allowed for Parallel Data Loading. If you needto delete the table’s data before starting the load, you must manually delete the data (via delete ortruncate commands). You cannot use SQL*Loader to delete the rows automatically if you areusing Parallel Data Loading. NOTE If you use Parallel Data Loading, indexes are not maintained by the SQL*Loader session. Before starting the loading process, you must drop all indexes on the table and disable all its PRIMARY KEY and UNIQUE constraints. After the loads complete, you can re-create the table’s indexes. In serial Direct Path Loading (PARALLEL=FALSE), SQL*Loader loads data into extents in thetable. If the load process fails before the load completes, some data could be committed to thetable prior to the process failure. In Parallel Data Loading, each load process creates temporarysegments for loading the data. The temporary segments are later merged with the table. If aParallel Data Loading process fails before the load completes, the temporary segments will nothave been merged with the table. If the temporary segments have not been merged with the tablebeing loaded, no data from the load will have been committed to the table. You can use the SQL*Loader FILE parameter to direct each data loading session to a differentdatafile. By directing each loading session to its own datafile, you can balance the I/O load of theloading processes. Data loading is very I/O intensive and must be distributed across multiple disksfor parallel loading to achieve significant performance improvements over serial loading. After a Parallel Data Load, each session may attempt to reenable the table’s constraints. Aslong as at least one load session is still underway, attempting to reenable the constraints will fail.The final loading session to complete should attempt to reenable the constraints, and shouldsucceed. You should check the status of your constraints after the load completes. If the tablebeing loaded has PRIMARY KEY and UNIQUE constraints, you can create the associated indexesin parallel prior to enabling the constraints.Bulk Data Moves: Using External TablesYou can query data from files outside the database via an object called an external table. Anexternal table’s structure is defined via the organization external clause of the create tablecommand; its syntax closely resembles the SQL*Loader control file syntax. You cannot manipulate rows in an external table, and you cannot index it—every access ofthe table results in a full table scan (that is, a full scan of the file at the operating system level). As
- 264 Oracle Database 11g DBA Handbook a result, the performance of queries against external tables tends to be worse than that of tables stored within the database. However, external tables offer a couple of potential benefits for systems that load large sets of data: ■ Because the data is not stored within the database, the data is only stored once (outside the database, rather than both outside and inside the database), thus saving space. ■ Because the data is never loaded into the database, the data-loading time is eliminated. Given that you cannot index external tables, they are most useful for operations in which large volumes of data are accessed by batch programs. For example, many data warehousing environments have a staging area in which data is loaded into temporary tables prior to rows being inserted into the tables users will query. Instead of loading the data into those temporary tables, you can access the operating system files directly via external tables, saving time and space. From an architectural perspective, external tables allow you to focus your database contents on the objects users will most commonly use—small codes tables, aggregation tables, and transaction tables—while keeping very large data sets outside the database. You can replace the files accessed by the external tables at any time without incurring any transaction overhead within the database. Bulk Inserts: Common Traps and Successful Tricks If your data is not being inserted from a flat file, SQL*Loader will not be a useful solution. For example, if you need to move a large set of data from one table to another, you will likely want to avoid having to write the data to a flat file and then read it back into the database. The fastest way to move data in your database is to move it from one table to another without going out to the operating system. When you’re moving data from one table to another, there are several common methods for improving the performance of the data migration: ■ Tuning the structures (removing indexes and triggers) ■ Disabling constraints during the data migration ■ Using hints and options to improve the transaction performance The first of the tips, tuning the structures, involves disabling any triggers or indexes that are on the table into which data is being loaded. For example, if you have a row-level trigger on the target table, that trigger will be executed for every row inserted into the table. If possible, disable the triggers prior to the data load. If the trigger should be executed for every inserted row, you may be able to do a bulk operation once the rows have been inserted, rather than a repeated operation during each insert. If properly tuned, the bulk operation will complete faster than the repeated trigger executions. You will need to be sure that the bulk operations execute for all rows that have not already been processed by the triggers. In addition to disabling triggers, you should disable the indexes on the target table prior to starting the data load. If the indexes are left on the table, Oracle will dynamically manage the indexes as each row is inserted. Rather than continuously manage the index, drop it prior to the start of the load and re-create it when the load has completed.
- Chapter 8: Database Tuning 265 NOTE Disabling indexes and triggers resolves most of the performance problems associated with large table-to-table data migration efforts. In addition to disabling indexes, you should consider disabling constraints on the table. If thesource data is already in a table in the database, you can check that data for its adherence to yourconstraints (such as foreign keys or CHECK constraints) prior to loading it into your target table.Once the data has been loaded, you can reenable the constraints. If none of those options gives you adequate performance, you should investigate the optionsOracle has introduced for data migration tuning. Those options include the following: ■ The append hint for insert commands Like the Direct Path Loader, the APPEND hint loads blocks of data into a table, starting at the high water mark for the table. Use of the APPEND hint may increase your space usage. ■ The nologging option If you are performing a create table as select command, use the nologging option to avoid writing to the redo logs during the operation. ■ The parallel option Parallel Query uses multiple processes to accomplish a single task. For a create table as select, you can parallelize both the create table portion and the query. If you use the parallel option, you should also use the nologging option; otherwise, the parallel operations will have to wait due to serialized writes to the online redo log files. Before using any of these advanced options, you should first investigate the target table’sstructures to make sure you’ve avoided the common traps cited earlier in this section. You can also use programming logic to force inserts to be processed in arrays rather thanas an entire set. For example, COBOL and C support array inserts, thus reducing the size of thetransactions required to process a large set of data.Bulk Deletes: The truncate CommandOccasionally, users attempt to delete all the rows from a table at once. When they encountererrors during this process, they complain that the rollback segments are too small, when in facttheir transaction is too large. A second problem occurs once the rows have all been deleted. Even though the segment nolonger has any rows in it, it still maintains all the space that was allocated to it. Therefore, deletingall those rows saved not a single byte of allocated space. The truncate command resolves both of these problems. It is a DDL command, not a DMLcommand, so it cannot be rolled back. Once you have used the truncate command on a table,its rows are gone, and none of its delete triggers are executed in the process. However, the tableretains all its dependent objects—such as grants, indexes, and constraints. The truncate command is the fastest way to delete large volumes of data. Because it will deleteall the rows in a table, this may force you to alter your application design so that no protectedrows are stored in the same table as the rows to be deleted. If you use partitions, you can truncateone partition of a table without affecting the rest of the table’s partitions (see Chapter 16). A sample truncate command for a table is shown here:truncate table EMPLOYEE drop storage;
- 266 Oracle Database 11g DBA Handbook This example, in which the EMPLOYEE table’s rows are deleted, shows a powerful feature of truncate. The drop storage clause is used to deallocate the non-initial space from the table (this is the default option). Therefore, you can delete all of a table’s rows and reclaim all but its initial extent’s allocated space, without dropping the table. The truncate command also works for clusters. In this example, the reuse storage option is used to leave all allocated space empty within the segment that acquired it: truncate cluster EMP_DEPT reuse storage; When this example command is executed, all the rows in the EMP_DEPT cluster will be instantly deleted. To truncate a partition, you need to know its name. In the following example, the partition named PART3 of the EMPLOYEE table is truncated via the alter table command: alter table EMPLOYEE truncate partition PART3 drop storage; The rest of the partitions of the EMPLOYEE table will be unaffected by the truncation of the PART3 partition. See Chapter 16 for details on creating and managing partitions. As an alternative, you can create a PL/SQL program that uses dynamic SQL to divide a large delete operation into multiple smaller transactions. Using Partitions You can use partitions to isolate data physically. For example, you can store each month’s transactions in a separate partition of an ORDERS table. If you perform a bulk data load or deletion on the table, you can customize the partitions to tune the data manipulation operation. For example: ■ You can truncate a partition and its indexes without affecting the rest of the table. ■ You can drop a partition, via the drop partition clause of the alter table command. ■ You can drop a partition’s local index. ■ You can set a partition to nologging, reducing the impact of large transactions. From a performance perspective, the chief advantage of partitions lies in their ability to be managed apart from the rest of the table. For example, being able to truncate a partition enables you to delete a large amount of data from a table (but not all of the table’s data) without generating any redo information. In the short term, the beneficiary of this performance improvement is the DBA; in the longer term, the entire enterprise benefits from the improved availability of the data. See Chapter 16 for details on implementing partitions and subpartitions. You can use the exchange partition option to greatly reduce the impact your data-loading processes have on system availability. Start by creating an empty table that has the same column structure as your partitioned table. Load your data into the new table and then analyze the new table. Create indexes on the new table to match the partitioned table’s indexes; the indexes must be local, and not global, indexes. When these steps are complete, alter the partitioned table using the exchange partition clause to exchange an empty partition with the new table you populated. All the loaded data will now be accessible via the partitioned table. There is little impact to the system availability during this step because it is a DDL operation.
- Chapter 8: Database Tuning 267Tuning Physical StorageDatabase I/O should be evenly distributed across as many devices as possible. The standard solutionis called SAME (which stands for stripe and mirror everything). The I/O throughput limits of the disksare the key limits to overcome, so distributing the I/O needs over many disks allows you to takeadvantage of the combined throughputs of many devices. Striping enhances your throughput, whichmay improve your performance; mirroring provides support in the case of disk failure. In addition to that level of physical storage tuning, several other factors should be considered.The following sections address factors that are external to the database but may have a profoundimpact on its ability to access data quickly.Using Raw DevicesRaw devices are available with most Unix operating systems. When they are used, Oracle bypassesthe Unix buffer cache and eliminates the file system overhead. For I/O-intensive applications,they may result in a performance improvement of around 20 percent over traditional file systems(and a slightly smaller improvement over Automatic Storage Management). Recent file systemenhancements have largely overcome this performance difference. Raw devices cannot be managed with the same commands as file systems. For example, thetar command cannot be used to back up individual files; instead, the dd command must be used.This is a much less flexible command to use and limits your recovery capabilities. NOTE Oracle files should not reside on the same physical devices as non- Oracle files, particularly if you use raw devices. Mixing an active Unix file system with an active Oracle raw device will cause I/O performance problems. Most operating systems that support raw devices also provide a logical volume managementlayer that allows administrators to perform file system commands for the raw devices. Thisapproach allows you to have the benefits of file system management along with the performancebenefits of raw devices. If you are planning to use raw devices, you should use a logical volumemanagement tool to simplify the system management.Using Automatic Storage ManagementAs of Oracle 10g, you can use Automatic Storage Management (ASM) to manage your databasestorage area. See Chapter 4 for a detailed analysis of how ASM can provide most of theperformance benefits of raw devices with the ease of use of a traditional operating systemfile system, along with numerous examples. When creating a new tablespace or other database structure in an ASM environment, suchas a control file or redo log file, you can specify a disk group as the storage area for the databasestructure instead of an operating system file. ASM takes the ease of use of Oracle-Managed Files(OMF) and combines it with mirroring and striping features to provide a robust file system andlogical volume manager that can even support multiple nodes in an Oracle Real ApplicationCluster (RAC). ASM eliminates the need to purchase a third-party logical volume manager. ASM not only enhances performance by automatically spreading out database objects overmultiple devices, but also increases availability by allowing new disk devices to be added to thedatabase without shutting down the database; ASM automatically rebalances the distribution offiles with minimal intervention.
- 268 Oracle Database 11g DBA Handbook Reducing Network Traffic As databases and the applications that use them become more distributed, the network that supports the servers may become a bottleneck in the process of delivering data to the users. Because DBAs typically have little control over the network management, it is important to use the database’s capabilities to reduce the number of network packets required for the data to be delivered. Reducing network traffic will reduce your reliance on the network and thus eliminate a potential cause of performance problems. Replication of Data Using Materialized Views You can manipulate and query data from remote databases. However, it is not desirable to have large volumes of data constantly sent from one database to another. To reduce the amount of data being sent across the network, you should consider different data replication options. In a purely distributed environment, each data element exists in one database. When data is required, it is accessed from remote databases via database links. This purist approach is similar to implementing an application strictly in third normal form—an approach that will not easily support any major production application. Modifying the application’s tables to improve data retrieval performance involves denormalizing data. The denormalization process deliberately stores redundant data in order to shorten users’ access paths to the data. In a distributed environment, replicating data accomplishes this goal. Rather than force queries to cross the network to resolve user requests, selected data from remote servers is replicated to the local server. This can be accomplished via a number of means, as described in the following sections. Replicated data is out of date as soon as it is created. Replicating data for performance purposes is therefore most effective when the source data is very infrequently changed or when the business processes can support the use of old data. Oracle’s distributed capabilities offer a means of managing the data replication within a database. Materialized views replicate data from a master source to multiple targets. Oracle provides tools for refreshing the data and updating the targets at specified time intervals. Materialized views may be read-only or updatable. The management issues for materialized views are covered in Chapter 17; in this section, you will see their performance-tuning aspects. Before creating a materialized view for replication, you should first create a database link to the source database. The following example creates a private database link called HR_LINK, using the LOC service name: create database link HR_LINK connect to HR identified by ESNOTHR1968 using loc; The create database link command, as shown in this example, has several parameters: ■ The name of the link (HR_LINK, in this case). ■ The account to connect to. ■ The service name of the remote database (as found in the tnsnames.ora file for the server). In this case, the service name is LOC. Materialized views automate the data replication and refresh processes. When materialized views are created, a refresh interval is established to schedule refreshes of replicated data. Local
- Chapter 8: Database Tuning 269updates can be prevented, and transaction-based refreshes can be used. Transaction-basedrefreshes, available for many types of materialized views, send from the master database onlythose rows that have changed for the materialized view. This capability, described later in thischapter, may significantly improve the performance of your refreshes. The syntax used to create the materialized view on the local server is shown in the followingexample, where the materialized view is given a name (LOCAL_EMP) and its storage parametersare specified. Its base query is given as well as its refresh interval. In this case, the materializedview is told to immediately retrieve the master data and then to perform the refresh operationagain in seven days (SYSDATE+7).create materialized view LOCAL_EMPpctfree 5tablespace data_2storage (initial 100K next 100K pctincrease 0)refresh fast start with SysDate next SysDate+7as select * from EMPLOYEE@HR_LINK; The refresh fast clause tells the database to use a materialized view log to refresh the localmaterialized view. The ability to use materialized view logs during refreshes is only available ifthe materialized view’s base query is simple enough that Oracle can determine which row in thematerialized view will change when a row changes in the source tables. When a materialized view log is used, only the changes to the master table are sent to thetargets. If you use a complex materialized view, you must use the refresh complete clause inplace of the refresh fast clause. In a complete refresh, the refresh completely replaces the existingdata in the materialized view’s underlying table. Materialized view logs must be created in the master database, via the create materializedview log command. An example of the create materialized view log command is shown here:create materialized view log on EMPLOYEEtablespace DATAstorage (initial 500k next 100k pctincrease 0);The materialized view log is always created in the same schema as the master table. You can use simple materialized views with materialized view logs to reduce the amount ofnetwork traffic involved in maintaining the replicated data. Because only the changes to the datawill be sent via a materialized view log, the maintenance of simple materialized views should usefewer network resources than complex materialized views require, particularly if the master tablesare large, fairly static tables. If the master tables are not static, the volume of transactions sent viathe materialized view log may not be any less than would be sent to perform a complete refresh.For details on the refresh capabilities of materialized views, see Chapter 17. Regardless of the refresh option chosen, you should index the materialized view’s base tableto optimize queries against the materialized view. From a performance perspective, your goal isto present the users with the data they want in the format they want it as quickly as possible. Bycreating materialized views on remote data, you can avoid traversing database links duringqueries. By creating materialized views on local data, you can prevent users from repeatedlyaggregating large volumes of data, presenting them instead with pre-aggregated data that answerstheir most common queries.
- 270 Oracle Database 11g DBA Handbook Using Remote Procedure Calls When using procedures in a distributed database environment, you can use one of two options: to create a local procedure that references remote tables or to create a remote procedure that is called by a local application. The proper location for the procedure depends on the distribution of the data and the way the data is to be used. The emphasis should be on minimizing the amount of data that must be sent through the network in order to resolve the data request. The procedure should reside within the database that contains most of the data used during the procedure’s operations. For example, consider this procedure: create procedure MY_RAISE (My_Emp_No IN NUMBER, Raise IN NUMBER) as begin update EMPLOYEE@HR_LINK set Salary = Salary+Raise where Empno = My_Emp_No; end; In this case, the procedure only accesses a single table (EMPLOYEE) on a remote node (as indicated by the database link HR_LINK). To reduce the amount of data sent across the network, move this procedure to the remote database identified by the database link HR_LINK and remove the reference to that database link from the from clause in the procedure. Then, call the procedure from the local database by using the database link, as shown here: execute MY_RAISE@HR_LINK(1234,2000); In this case, two parameters are passed to the procedure—My_Emp_No is set to 1234, and Raise is set to 2000. The procedure is invoked using a database link to tell the database where to find the procedure. The tuning benefit of performing a remote procedure call is that all of the procedure’s processing is performed in the database where the data resides. The remote procedure call minimizes the amount of network traffic necessary to complete the procedure’s processing. To maintain location transparency, you may create a local synonym that points to the remote procedure. The database link name will be specified in the synonym so that user requests will automatically use the remote database: create synonym MY_RAISE for MY_RAISE@HR_LINK; A user could then enter the command execute MY_RAISE(1234,2000); and it would execute the remote procedure defined by the synonym MY_RAISE. Using the Automatic Workload Repository In Oracle Database 10g and earlier, STATSPACK gathers and reports on database statistics, albeit in a strictly text-based format! As of Oracle 10g, the Automatic Workload Repository (AWR) provides enhancements to the STATSPACK concept, generating all statistics found in STATSPACK, and more. In addition, AWR is highly integrated with OEM, making it easy to analyze and fix a performance problem.
- Chapter 8: Database Tuning 271 Like STATSPACK, AWR collects and maintains performance statistics for problem detectionand self-tuning purposes. You can generate reports on the AWR data, and you can access it viaviews and through OEM. You can report on recent session activity as well as the overall systemstatistics and SQL usage. AWR captures the system statistics on an hourly basis (taking “snapshots” of the database) andstores the data in its repository tables. As with STATSPACK, the space requirements of the AWRrepository will increase as the historical retention period is increased or the interval betweensnapshots is decreased. By default, seven days worth of data is maintained in the repository. Youcan see the snapshots that are stored in the AWR repository via the DBA_HIST_SNAPSHOT view. To enable AWR, set the STATISTICS_LEVEL initialization parameter to TYPICAL or ALL. If youset STATISTICS_LEVEL to BASIC, you can take manual snapshots of AWR data, but they will notbe as comprehensive as those performed automatically by AWR. Setting STATISTICS_LEVEL to ALLadds timed OS statistics and plan execution statistics to those gathered with the TYPICAL setting.Managing SnapshotsTo take a manual snapshot, use the CREATE_SNAPSHOT procedure of the DBMS_WORKLOAD_REPOSITORY package:execute DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT (); To alter the snapshot settings, use the MODIFY_SNAPSHOT_SETTINGS procedure. You canmodify the retention (in minutes) and the interval (in minutes) for snapshots. The following examplechanges the interval to 30 minutes for the current database:execute DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS( interval => 30); To drop a range of snapshots, use the DROP_SNAPSHOT_RANGE procedure, specifying thestart and end of the snapshot IDs to drop:execute DBMS_WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE (low_snap_id => 1, high_snap_id => 10);Managing BaselinesYou can designate a set of snapshots as a baseline for the performance of the system. The baselinedata will be retained for later comparisons with snapshots. Use the CREATE_BASELINE procedureto specify the beginning and ending snapshots for the baseline:execute DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE(start_snap_id => 1, end_snap_id => 10,baseline_name => Monday baseline); When you create a baseline, Oracle will assign an ID to the baseline; you can view pastbaselines via the DBA_HIST_BASELINE view. The snapshots you specify for the beginning andending of the baseline are maintained until you drop the baseline. To drop the baseline, use theDROP_BASELINE procedure:execute DBMS_WORKLOAD_REPOSITORY.DROP_BASELINE(baseline_name => Monday baseline, cascade => FALSE);If you set the CASCADE parameter of the DROP_BASELINE procedure to TRUE, the relatedsnapshots will be dropped when the baseline is dropped.
- 272 Oracle Database 11g DBA Handbook You can see the AWR data via OEM or via the data dictionary views listed earlier in this section. Additional views supporting AWR include V$ACTIVE_SESSION_HISTORY (sampled every second), DBA_HIST_SQL_PLAN (execution plans), and DBA_HIST_WR_CONTROL (for the AWR settings). Generating AWR Reports You can generate reports from AWR either via OEM or via the reporting scripts provided. The awrrpt.sql script generates a report based on the differences in statistics between the beginning and ending snapshots. A second report, awrrpti.sql, displays a report based on the beginning and ending snapshots for a specified database and instance. Both awrrpt.sql and awrrpti.sql are located in the $ORACLE_HOME/rdbms/admin directory. When you execute a report (from any DBA account), you will be prompted for the type of report (HTML or text), the number of days for which snapshots will be listed, the beginning and ending snapshot IDs, and the name for the output file. Running the Automatic Database Diagnostic Monitor Reports Rather than relying on manual reporting against the AWR table (much as you did with STATSPACK in previous versions of Oracle), you can use the Automatic Database Diagnostic Monitor (ADDM). Because it is based on AWR data, ADDM requires that the STATISTICS_LEVEL parameter be set (either to TYPICAL or ALL, as recommended earlier). You can access ADDM via the Performance Analysis section of OEM, or you can run an ADDM report manually. To run ADDM against a set of snapshots, use the addmrpt.sql script located in the $ORACLE_ HOME/rdbms/admin directory. NOTE You must have the ADVISOR system privilege in order to execute ADDM reports. Within SQL*Plus, execute the addmrpt.sql script. You will be prompted for the beginning and ending snapshot IDs for the analysis and a name for the output file. To view the ADDM data, you can use OEM or the advisor data dictionary views. The advisor views include DBA_ADVISOR_TASKS (existing tasks), DBA_ADVISOR_LOG (status and progress on tasks), DBA_ADVISOR_RECOMMENDATIONS (completed diagnostic tasks plus recommendations), and DBA_ADVISOR_FINDINGS. You can implement the recommendations to address the findings identified via ADDM. Figure 8-1 shows a typical AWR report, generated from the default baseline; in this example, the snapshot began on 14-Sep-2007 and ended on 22-Sep-2007. This database seems to be lightly loaded with plenty of CPU and memory resources; for example, latch contention is non-existent, and there is enough memory to perform all sorting without using disk. Using the Automatic SQL Tuning Advisor New to Oracle Database 11g, the Automatic SQL Tuning Advisor runs during the default maintenance window (using AutoTask) and targets the highest-load SQL statements collected in the AWR. Once the automatic SQL tuning begins during a maintenance window, the following steps are performed by the Automatic SQL Tuning Advisor: 1. Identify repeated high-load SQL from AWR statistics. Recently tuned SQL and recursive SQL are ignored.
- Chapter 8: Database Tuning 273FIGURE 8-1 Sample AWR report via OEM 2. Tune high-load SQL using calls to the SQL Tuning Advisor. 3. Create SQL Profiles for the high-load SQL; performance is tested both with and without the profile. 4. If the performance is better by at least a factor of three, automatically keep the profile; otherwise, note the improvement in the tuning report. Figure 8-2 shows a summary of the Advisor tasks from Advisor Central; in this example, youcan see a summary of the results for the Automatic Database Diagnostic Monitor (ADDM), theSegment Advisor, and the SQL Tuning Advisor.
- 274 Oracle Database 11g DBA Handbook FIGURE 8-2 OEM Advisor Central summary Clicking the SQL Tuning Advisor result link, you can see the SQL Tuning Result summary in Figure 8-3. On this low-usage database, the SQL Tuning Advisor found 14 repeating SQL statements that were classified as high-load, but it did not find a way to improve the performance of these SQL statements.
- Chapter 8: Database Tuning 275FIGURE 8-3 Automatic SQL Tuning Advisor resultsTuning SolutionsThis chapter does not cover every potential tuning solution. However, there is an underlyingapproach to the techniques and tools presented throughout this chapter. Before spending yourtime and resources on the implementation of a new feature, you should first stabilize yourenvironment and architecture—the server, the database, and the application. If the environmentis stable, you should be able to quickly accomplish two goals: 1. Successfully re-create the performance problem. 2. Successfully isolate the cause of the problem.
- 276 Oracle Database 11g DBA Handbook To achieve these goals, you may need to have a test environment available for your performance tests. Once the problem has been successfully isolated, you can apply the steps outlined in this chapter to the problem. In general, your tuning approach should mirror the order of the sections of this chapter: 1. Evaluate application design. 2. Tune SQL. 3. Tune memory usage. 4. Tune data storage. 5. Tune data manipulation. 6. Tune physical and logical storage. 7. Tune network traffic. Depending on the nature of your application, you may choose a different order for the steps, or you may combine steps. If the application design cannot be altered and the SQL cannot be altered, you can tune the memory and disk areas used by the application. As you alter the memory and disk area settings, you must be sure to revisit the application design and SQL implementation to be sure that your changes do not adversely impact the application. The need to revisit the application design process is particularly important if you choose to use a data replication method, because the timeliness of the replicated data may cause problems within the business process served by the application.
- CHAPTER 9Database Security and Auditing 277
- 278 Oracle Database 11g DBA Handbook o protect one of the most vital assets to a company—its data—you as a DBA must T be keenly aware of how Oracle can protect corporate data and the different tools you have at your disposal. The Oracle-provided tools and mechanisms fall into three broad categories: authentication, authorization, and auditing. Authentication includes methods used to identify who is accessing the database, ensuring that you are who you say you are, regardless of what resources you are requesting of the database. Even if you are merely trying to access the daily lunch menu at the cafeteria, it is important that you identify yourself correctly to the database. If, for example, the web-based database application presents customized content based on the user account, you want to make sure you get the lunch menu for your branch office in Houston, Texas, and not the one for the home office in Buffalo, New York! Authorization provides access to various objects in the database once you are authenticated by the database. Some users may be authorized to run a report against the daily sales table, some users may be developers and therefore need to create tables and reports, whereas others may only be allowed to see the daily lunch menu. Some users may never log in at all, but their schema may own a number of tables for a particular application, such as payroll or accounts receivable. Additional authorization methods are provided for database administrators, due to the extreme power that a database administrator has. Because a DBA can shut down and start up a database, an additional level of authorization is provided. Authorization goes well beyond simple access to a table or a report; it also includes the rights to use system resources in the database as well as privileges to perform certain actions in the database. A given database user might only be allowed to use 15 seconds of CPU time per session or can only be idle for five minutes before being disconnected from the database. Another database user might be granted the privilege to create or drop tables in any other user’s schema, but not be able to create synonyms or view data dictionary tables. Fine-grained access control gives the DBA more control over how database objects are accessed. For example, standard object privileges will either give a user access to an entire row of a table or not at all; using fine-grained access control, a DBA can create a policy implemented by a stored procedure that restricts access based on time of day, where the request originates, which column of the table is being accessed, or all three. At the end of the section on database authorization, we will present a short example of a Virtual Private Database (VPD) to provide methods for defining, setting, and accessing application attributes along with the predicates (usually WHERE clauses) to control which data is accessible or returned to the user of the application. Auditing in an Oracle database encompasses a number of different levels of monitoring in the database. At a high level, auditing can record both successful and unsuccessful attempts to log in, access an object, or perform an action. As of Oracle9i, not only can fine-grained auditing (FGA) record what objects are accessed, but what columns of a table are accessed when an insert, update, or delete is being performed on the data in the column. Fine-grained auditing is to auditing what fine-grained access control is to standard authorization: more precise control and information about the objects being accessed or actions being performed. DBAs must use auditing judiciously so as not to be overwhelmed by audit records or create too much overhead by implementing continuous auditing. On the flip side, auditing can help to protect company assets by monitoring who is using what resource, at what time, and how often, as well as whether the access was successful or not. Therefore, auditing is another tool that the DBA should be using on a continuous basis to monitor the security health of the database.
- Chapter 9: Database Security and Auditing 279Non-Database SecurityAll the methodologies presented later in the chapter are useless if access to the operating systemis not secure or the physical hardware is not in a secure location. In this section, we’ll discuss afew of the elements outside of the database itself that need to be secure before the database canbe considered secure. In the following list are a few things that need to be considered outside of the database: ■ Operating system security Unless the Oracle database is running on its own dedicated hardware with only the root and oracle user accounts enabled, operating system security must be reviewed and implemented. Ensure that the software is installed with the oracle account and not the root account. You may also consider using another account instead of oracle as the owner of the software and the database files, to eliminate an easy target for a hacker. Ensure that the software and the database files are readable only by the oracle account and the group that oracle belongs to. Other than the Oracle executables that require it, turn off the SUID (set UID, or running with root privileges) bit on files that don’t require it. Don’t send passwords (operating system or Oracle) to users via e-mail in plain text. Finally, remove any system services that are not required on the server to support the database, such as telnet and ftp. ■ Securing backup media Ensure that the database backup media—whether tape, disk, or CD/DVD-ROM—is accessible by a limited number of people. A secure operating system and robust, encrypted passwords on the database are of little value if a hacker can obtain backup copies of the database and load them onto another server. The same applies to any server that contains data replicated from your database. ■ Background security checks Screening of employees that deal with sensitive database data—whether it be a DBA, auditor, or operating system administrator—is a must. ■ Security education Ensure that all database users understand the security and usage policies of the IT infrastructure. Requiring that users understand and follow the security policies emphasizes the critical nature and value of the data to the company, including the information in the database. A well-educated user will be more likely to resist attempts at system access from a hacker’s social-engineering skills. ■ Controlled access to hardware All computer hardware that houses the database should be located in a secure environment that is accessible only with badges or security access codes.Database Authentication MethodsBefore the database can allow a person or application access to objects or privileges in the database,the person or application must be authenticated; in other words, the identity of who is attemptingaccess to the database needs to be validated. In this section, we’ll give an overview of the most basic method used to allow access to thedatabase—the user account, otherwise known as database authentication. In addition, we’ll showhow to reduce the number of passwords a user needs to remember by allowing the operating systemto authenticate the user and, as a result, automatically connect the user to the database. Using 3-tier
- 280 Oracle Database 11g DBA Handbook authentication via an application server, network authentication, or Oracle’s Identity Management can reduce the number of passwords even further. Finally, we’ll talk about using a password file to authenticate DBAs when the database is down and cannot provide authentication services. Database Authentication In an environment where the network is protected from the outside environment with firewalls and the network traffic between the client and the database server uses some method of encryption, authentication by the database is the most common and easiest method to authenticate the user with the database. All information needed to authenticate the user is stored in a table within the SYSTEM tablespace. Very special database operations, such as starting up or shutting down the database, require a different and more secure form of authentication, either by using operating system authentication or by using password files. Network authentication relies on third-party authentication services such as the Distributed Computing Environment (DCE), Kerberos, Public Key Infrastructure (PKI), and Remote Authentication Dial-In User Service (RADIUS). 3-tier authentication, although at first glance appears to be a network authentication method, is different in that a middle tier, such as Oracle Application Server, authenticates the user while maintaining the client’s identity on the server. In addition, the middle tier provides connection pooling services as well as implements business logic for the client. Later in this chapter, in the section titled “User Accounts,” we’ll go through all the options available to the DBA for setting up accounts in the database for authentication. Database Administrator Authentication The database is not always available to authenticate a database administrator, such as when it is down because of an unplanned outage or for an offline database backup. To address this situation, Oracle uses a password file to maintain a list of database users who are allowed to perform functions such as starting up and shutting down the database, initiating backups, and so forth. Alternatively, a database administrator can use operating system authentication, which we discuss in the next section. The flow chart shown in Figure 9-1 identifies the options for a database administrator when deciding what method will work the best in their environment. FIGURE 9-1 Authentication method flowchart
- Chapter 9: Database Security and Auditing 281 For connecting locally to the server, the main consideration is the convenience of using thesame account for both the operating system and the Oracle server versus maintaining a passwordfile. For a remote administrator, the security of the connection is the driving factor when choosingan authentication method. Without a secure connection, a hacker could easily impersonate a userwith the same account as that of an administrator on the server itself and gain full access to thedatabase with OS authentication. NOTE When using a password file for authentication, ensure that the password file itself is in a directory location that is only accessible by the operating system administrators and the user or group that owns the Oracle software installation. We will discuss system privileges in greater detail later in this chapter. For now, though, youneed to know that there are three particular system privileges that give administrators specialauthentication in the database: SYSDBA, SYSOPER, and SYSASM. An administrator with theSYSOPER privilege can start up and shut down the database, perform online or offline backups,archive the current redo log files, and connect to the database when it is in RESTRICTED SESSIONmode. The SYSDBA privilege contains all the rights of SYSOPER, with the addition of being ableto create a database and grant the SYSDBA or SYSOPER privilege to other database users. New toOracle Database 11g, the SYSASM privilege is specific to an ASM instance to manage databasestorage. To connect to the database from a SQL*Plus session, you append AS SYSDBA or AS SYSOPERto your connect command. Here’s an example:[oracle@dw ~]$ sqlplus /nologSQL*Plus: Release 11.1.0.6.0 - Production on Fri Aug 10 20:57:30 2007Copyright (c) 1982, 2007, Oracle. All rights reserved.SQL> connect rjb/rjb as sysdbaConnected.SQL> show userUSER is "SYS"SQL> Other than the additional privileges available to the users who connect as SYSDBA or SYSOPER,the default schema is also different for these users when they connect to the database. Users whoconnect with the SYSDBA or SYSASM privilege connect as the SYS user; the SYSOPER privilegesets the user to PUBLIC:SQL> show userUSER is "SYS" As with any database connection request, you have the option to specify the username andpassword on the same line as the sqlplus command, along with the SYSDBA or SYSOPER keyword:[oracle@dw ~]$ sqlplus rjb/rjb as sysdba Although a default installation of the Oracle Database using the Oracle Universal Installer witha seed database or using the Database Creation Assistant will automatically create a password file,
- 282 Oracle Database 11g DBA Handbook there are occasions when you may need to re-create one if it is accidentally deleted or damaged. The orapwd command will create a password file with a single entry for the SYS user and other options, as noted, when you run the orapwd command without any options: [oracle@dw ~]$ orapwd Usage: orapwd file=<fname> password=<password> entries=<users> force=<y/n> ignorecase=<y/n> nosysdba=<y/n> where file - name of password file (required), password - password for SYS (optional), entries - maximum number of distinct DBA (required), force - whether to overwrite existing file (optional), ignorecase - passwords are case-insensitive (optional), nosysdba - whether to shut out the SYSDBA logon (optional Database Vault only). There must be no spaces around the equal-to (=) character. [oracle@dw ~]$ Once you re-create the password file, you will have to grant the SYSDBA and SYSOPER privileges to those database users who previously had those privileges. In addition, if the password you provided in the orapwd command is not the same password that the SYS account has in the database, this is not a problem: when you connect using connect / as sysdba, you’re using operating system authentication, and if you use connect sys/syspassword as sysdba, the password syspassword is the password for SYS in the database. And just to reiterate, if the database is down or in MOUNT mode, you must use operating system authentication or the password file. Also worth noting is that operating system authentication takes precedence over password file authentication, so as long as you fulfill the requirements for operating system authentication, the password file will not be used for authentication if it exists. CAUTION As of Oracle Database 11g, database passwords are case sensitive. To disable case sensitivity, set the SEC_CASE_SENSITIVE_LOGON intitialization parameter to FALSE. The system initialization parameter REMOTE_LOGIN_PASSWORDFILE controls how the password file is used for the database instance. It has three possible values: NONE, SHARED, and EXCLUSIVE. If the value is NONE, then Oracle ignores any password file that exists. Any privileged users must be authenticated by other means, such as by operating system authentication, which is discussed in the next section. With a value of SHARED, multiple databases can share the same password file, but only the SYS user is authenticated with the password file, and the password for SYS cannot be changed. As a result, this method is not the most secure, but it does allow a DBA to maintain more than one database with a single SYS account.
- Chapter 9: Database Security and Auditing 283 TIP If a shared password file must be used, ensure that the password for SYS is at least eight characters long and includes a combination of upper- and lowercase alphabetic, numeric, and special characters to fend off a brute-force attack. A value of EXCLUSIVE binds the password file to only one database, and other database useraccounts can exist in the password file. As soon as the password file is created, use this value tomaximize the security of SYSDBA or SYSOPER connections. The dynamic performance view V$PWFILE_USERS lists all the database users who have eitherSYSDBA or SYSOPER privileges, as shown here:SQL> select * from v$pwfile_users;USERNAME SYSDB SYSOP SYSAS------------------------------ ----- ----- -----SYS TRUE TRUE FALSERJB TRUE FALSE FALSEOperating System AuthenticationIf a DBA chooses to implement operating system authentication, a database user is automaticallyconnected to the database when they use the following SQL*Plus syntax:SQL> sqlplus /This method is similar to how an administrator connects to the database, without the as sysdba oras sysoper clause. The main difference is that the operating system account authorization methodsare used instead of an Oracle-generated and maintained password file. In fact, administrators can also use operating system authentication to connect using as sysdbaor as sysoper. If the administrator’s operating system login account is in the Unix group dba (orthe Windows group ORA_DBA), the administrator can connect to the database using as sysdba.Similarly, if the operating system login account is in the Unix group oper (or the Windows groupORA_OPER), the administrator can connect to the database using as sysoper without the need foran Oracle password file. The Oracle Server makes the assumption that if the user is authenticated by an operatingsystem account, then the user is also authenticated for the database. With operating systemauthentication, Oracle does not need to maintain passwords in the database, but it still maintainsthe usernames. The usernames are still needed to set the default schema and tablespaces inaddition to providing information for auditing. In a default Oracle 11g installation, as well as in previous releases of Oracle, operating systemauthentication is enabled for user accounts if you create database users with the identified externallyclause. The prefix for the database username must match the value of the initialization parameterOS_AUTHENT_PREFIX; the default value is OPS$. Here’s an example:SQL> create user ops$corie identified externally;
- 284 Oracle Database 11g DBA Handbook When the user logs into the operating system with the account CORIE, she is automatically authenticated in the Oracle database as if the account OPS$CORIE was created with database authentication. Setting the value of OS_AUTHENT_PREFIX to a null string allows the database administrator and the operating system account administrator to use identical usernames when using external authentication. Using identified globally is similar to using identified externally in that the authentication is done outside of the database. However, with a globally identified user, authentication is performed by an enterprise directory service such as Oracle Internet Directory (OID). OID facilitates ease of account maintenance for database administrators and the convenience of single sign-on for database users who need to access more than just a single database or service. Network Authentication Authentication by a network service is another option available to the DBA to authenticate users in the database. Although a complete treatment is beyond the scope of this book, we will give a brief summary of each method and its components. These components include Secure Sockets Layer (SSL), Distributed Computing Environment (DCE), Kerberos, PKI, RADIUS, and directory- based services. Secure Sockets Layer Protocol Secure Sockets Layer (SSL) is a protocol originally developed by Netscape Development Corporation for use in web browsers. Because it is a public standard and open source, it faces continuous scrutiny by the programming community to ensure that there are no holes or “back doors” that can compromise its robustness. At a minimum, a server-side certificate is required for authentication. Client authentication is also doable with SSL to validate the client, but setting up certificates may become a large administrative effort. Using SSL over TCP/IP requires only slight changes to the listener configuration by adding another protocol (TCPS) at a different port number in the listener.ora file. In the following excerpt, configured with Oracle Net Configuration Assistant (netca), the listener named LISTENER on the server dw10g will accept traffic via TCP on port 1521 and SSL TCP traffic on port 2484: # listener.ora Network Configuration File: /u01/app/oracle/product/10.1.0/network/admin/listener.ora # Generated by Oracle configuration tools. SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = /u01/app/oracle/product/10.1.0) (PROGRAM = extproc) ) (SID_DESC = (GLOBAL_DBNAME = dw.world) (ORACLE_HOME = /u01/app/oracle/product/10.1.0) (SID_NAME = dw) ) )
- Chapter 9: Database Security and Auditing 285LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = dw10g)(PORT = 1521)) ) (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCPS)(HOST = dw10g)(PORT = 2484)) ) ) )Distributed Computing EnvironmentThe Distributed Computing Environment (DCE) provides a number of services, such as remoteprocedure calls, distributed file services, and distributed time service, in addition to a securityservice. DCE supports distributed applications in a heterogeneous environment on all majorsoftware and hardware platforms. DCE is one of the protocols that support single sign-on (SSO); once a user authenticates withDCE, they can securely access any Oracle database configured with DCE without specifying ausername or password.KerberosKerberos is another trusted third-party authentication system that, like DCE, provides SSOcapabilities. Oracle fully supports Kerberos version 5 with Oracle Advanced Security underthe Enterprise Edition of Oracle Database 10g and 11g. As with other middleware authentication solutions, the basic premise is that passwords shouldnever be sent across the network; all authentication is brokered by the Kerberos server. In Kerberosterminology, a password is a “shared secret.”Public Key InfrastructurePublic Key Infrastructure (PKI) comprises a number of components. It is implemented using the SSLprotocol and is based on the concept of secret private keys and related public keys to facilitatesecure communications between the client and server. To provide identification and authentication services, PKI uses certificates and certificateauthorities (CAs). In a nutshell, a certificate is an entity’s public key validated by a trusted thirdparty (a certificate authority), and it contains information such as the certificate user’s name, anexpiration date, the public key, and so forth.RADIUSRemote Authentication Dial-In User Service (RADIUS) is a lightweight protocol used forauthentication as well as authorization and accounting services. In an Oracle environment,the Oracle Server acts as the client to a RADIUS server when an authorization request issent from an Oracle client. Any authentication method that supports the RADIUS standard—whether it be token cards,smart cards, or SecurID ACE—can easily be added to the RADIUS server as a new authenticationmethod without any changes being made on the client or server configuration files, such assqlnet.ora.
- 286 Oracle Database 11g DBA Handbook 3-Tier Authentication In a 3-tier or multitier environment, an application server can provide authentication services for a client and provide a common interface to the database server, even if the clients use a variety of different browsers or “thick” client applications. The application server, in turn, is authenticated with the database and demonstrates that the client is allowed to connect to the database, thus preserving the identity of the client in all tiers. In multitier environments, both users and middle tiers are given the fewest possible privileges necessary to do their jobs. The middle tier is granted permission to perform actions on behalf of a user with a command such as the following: alter user kmourgos grant connect through oes_as with role all except ordmgmt; In this example, the application server service OES_AS is granted permission to perform actions on behalf of the database user KMOURGOS. The user KMOURGOS has been assigned a number of roles, and they can all be enabled through the application server, except for the ORDMGMT role. As a result, when KMOURGOS connects through the application server, he is permitted to access, via the web, all tables and privileges granted to him via roles, except for the order management functions. Because of the business rules in place at his company, all access to the order management applications must be done via a direct connection to the database. Roles are discussed in detail in the section titled “Assigning and Maintaining Roles” later in this chapter. Client-Side Authentication Client-side authentication is one way to authenticate users in a multitier environment, but Oracle strongly discourages this method unless all clients are on a secure network, inside a firewall, with no connections allowed to the database from outside the firewall. In addition, users should not have any administrative rights on any workstation that can connect to the database. If an Oracle user is created with the IDENTIFIED EXTERNALLY attribute, and the initialization parameter REMOTE_OS_AUTHENT is set to TRUE, then an attacker can easily authenticate himself on the workstation with a local user account that matches the Oracle user account, and as a result gain access to the database. As a result, it is strongly recommended that the REMOTE_OS_AUTHENT parameter be set to FALSE. The database will have to be stopped and restarted for this change to take effect. NOTE As of Oracle Database 11g, the parameter REMOTE_OS_AUTHENT is deprecated. There are several other, more secure ways to allow remote access to the database. Oracle Identity Management Oracle Identity Management (IM), a component of Oracle Application Server 10g and 11g, provides a complete end-to-end framework for centrally managing user accounts, from account creation to resource authorization to account deletion. It centralizes the management of accounts along with
- Chapter 9: Database Security and Auditing 287the devices, applications, web services, or any other networked entity that uses authenticationand authorization. IM saves money and time. Because the user accounts and the associated resources arecentralized, administration is the same regardless of the application being maintained. In addition, IM enhances the security of the enterprise. Because users only use one usernameand password to access all enterprise resources, they are less prone to write down or forget theirpassword. When a user leaves the company, all access to applications and services can be removedquickly and easily in one place. Although a complete treatment of Oracle Identity Management is beyond the scope of thisbook, it’s important for the DBA to understand how the components of IM will impact theperformance and security of the Oracle database. The user account information and other metadataneeds to be stored somewhere, and stored redundantly, in an Oracle database. In addition, therequests for authentication and authorization services must be processed within a reasonableamount of time, defined most likely within the Service Level Agreements (SLAs) in effect for oneor more of the applications. For example, Oracle Internet Directory (OID), one of the major components of Oracle IdentityManagement, requires database tuning somewhat like tuning for an OLTP system, with many shorttransactions from a large number of users with widely varying loads depending on the time ofday. But that is where the similarity ends! In Table 9-1 are some general guidelines for settingvarious system-initialization parameters for the database that will be maintaining the LightweightDirectory Access Protocol (LDAP) directory information. It is assumed that this database’s only job is to maintain OID directory information. In additionto tuning basic database parameters, overall throughput will depend on factors such as networkbandwidth available between the server and the user community, the location of shared diskresources, disk throughput, and so forth. A typical IM deployment with 500,000 directory entrieswill require approximately 3GB of disk space, and how fast or how slow the entries can be writtento or read from disk can easily become the throughput bottleneck. Database Parameter 500 Concurrent Users 2000 Concurrent Users OPEN_CURSORS 200 200 SESSIONS 225 1200 DB_BLOCK_SIZE 8K 8K DB_CACHE_SIZE 250MB 250MB SHARED_POOL_SIZE 40MB 40MB PROCESSES 400 1500 SORT_AREA_SIZE 256KB 256KB LOG_BUFFER 512KB 512KBTABLE 1-1 Database Initialization Parameter Sizing for OID
- 288 Oracle Database 11g DBA Handbook User Accounts In order to gain access to the database, a user must provide a username to access the resources associated with that account. Each username must have a password and is associated with one and only one schema in the database; some accounts may have no objects in the schema, but instead would have the privileges granted to that account to access objects in other schemas. In this section, we’ll explain the syntax and give examples for creating, altering, and dropping users. In addition, we’ll show you how to become another user without explicitly knowing the password for the user. Creating Users The create user command is fairly straightforward. It has a number of parameters, which are listed in Table 9-2 along with a brief description of each one. In the following example, we are creating a user (SKING) to correspond with the user Steven King, employee number 100 in the HR.EMPLOYEES table from the sample schemas installed with the database: SQL> create user sking identified by sking901 2 account unlock 3 default tablespace users 4 temporary tablespace temp; User created. Parameter Usage username The name of the schema, and therefore the user, to be created. The username can be up to 30 characters long and cannot be a reserved word unless it is quoted (which is not recommended). IDENTIFIED { BY password | Specifies how the user will be authenticated: by the EXTERNALLY | GLOBALLY AS database with a password, by the operating system ‘extname’ } (local or remote), or by a service (such as Oracle Internet Directory). DEFAULT TABLESPACE tablespace The tablespace where permanent objects are created, unless a tablespace is explicitly specified during creation. TEMPORARY TABLESPACE The tablespace where temporary segments are created tablespace during sort operations, index creation, and so forth. QUOTA { size | UNLIMITED } ON The amount of space allowed for objects created on tablespace the specified tablespace. Size is in kilobytes (K) or megabytes (M). PROFILE profile The profile assigned to this user. Profiles are discussed later in this chapter. If a profile is not specified, the DEFAULT profile is used. PASSWORD EXPIRE At first logon, the user must change their password. ACCOUNT {LOCK | UNLOCK} Specifies whether the account is locked or unlocked. By default, the account is unlocked. TABLE 9-2 The Options for the CREATE USER Command
- Chapter 9: Database Security and Auditing 289The user SKING is authenticated by the database with an initial password of SKING901. Thesecond line is not required; all accounts are created unlocked by default. Both the default permanenttablespace and default temporary tablespace are defined at the database level, so the last twolines of the command aren’t required unless you want a different default permanent tablespaceor a different temporary tablespace for the user. Even though the user SKING has been either explicitly or implicitly assigned a default permanenttablespace, he cannot create any objects in the database until we provide both a quota and therights to create objects in their own schema. A quota is simply a space limit, by tablespace, for a given user. Unless a quota is explicitlyassigned or the user is granted the UNLIMITED TABLESPACE privilege (privileges are discussedlater in this chapter), the user cannot create objects in their own schema. In the followingexample, we’re giving the SKING account a quota of 250MB in the USERS tablespace:SQL> alter user sking quota 250M on users;User altered. Note that we could have granted this quota at the time the account was created, along withalmost every other option in the create user command. A default role, however, can only beassigned after the account is created. (Role management is discussed later in this chapter.) Unless we grant some basic privileges to a new account, the account cannot even log in;therefore, we need to grant at least the CREATE SESSION privilege or the CONNECT role (rolesare discussed in detail later in this chapter). For Oracle Database 10g Release 1 and earlier, theCONNECT role contains the CREATE SESSION privilege, along with other basic privileges, suchas CREATE TABLE and ALTER SESSION; as of Oracle Database 10g Release 2, the CONNECT roleonly has the CREATE SESSION privilege and therefore is deprecated. In the following example,we grant SKING the CREATE SESSION and CREATE TABLE privileges:SQL> grant create session, create table to sking;Grant succeeded.Now the user SKING has a quota on the USERS tablespace as well as the privileges to createobjects in that tablespace. All these options for create user are available in the web-based Oracle Enterprise Managerinterface, as demonstrated in Figure 9-2. As with any Enterprise Manager operation, the Show SQL button shows the actual SQLcommands, such as create and grant, that will be run when the user is created. This is a greatway to take advantage of the web interface’s ease of use, while at the same time brushing upon your SQL command syntax! In Figure 9-3, you can see that it’s also very easy to pick an existing user and create a newuser with the same characteristics except for the password. Other options available in the Enterprise Manager interface include expiring a user account,generating the DDL used to create the account, and locking or unlocking the account.Altering UsersChanging the characteristics of a user is accomplished by using the alter user command. Thesyntax for alter user is nearly identical to that of create user, except that alter user allows you toassign roles as well as grant rights to a middle-tier application to perform functions on behalf ofthe user.
- 290 Oracle Database 11g DBA Handbook FIGURE 9-2 Creating users with Enterprise Manager FIGURE 9-3 Copying users with Enterprise Manager
- Chapter 9: Database Security and Auditing 291 In this example, we’ll change user SKING to use a different default permanent tablespace:SQL> alter user sking 2 default tablespace users2 3 quota 500M on users2;User altered. Note that the user SKING still can create objects in the USERS tablespace, but he mustexplicitly specify USERS in any create table and create index commands.Dropping UsersDropping users is very straightforward and is accomplished with the drop user command. Theonly parameters are the username to be dropped and the cascade option; any objects owned bythe user must be explicitly dropped or moved to another schema if the cascade option is not used.In the following example, the user QUEENB is dropped, and if there are any objects owned byQUEENB, they are automatically dropped as well:SQL> drop user queenb cascade;User dropped. If any other schema objects, such as views or packages, rely on objects dropped when theuser is dropped, the other schema objects are marked INVALID and must be recoded to use otherobjects and then recompiled. In addition, any object privileges that were granted by the first userto a second user via the with grant option clause are automatically revoked from the second userif the first user is dropped.Becoming Another UserTo debug an application, a DBA sometimes needs to connect as another user to simulate theproblem. Without knowing the actual plain-text password of the user, the DBA can retrievethe encrypted password from the database, change the password for the user, connect with thechanged password, and then change back the password using an undocumented clause of the alteruser command. It is assumed that the DBA has access to the DBA_USERS table, along with theALTER USER privilege. If the DBA has the DBA role, then these two conditions are satisfied. The first step is to retrieve the encrypted password for the user, which is stored in the tableDBA_USERS:SQL> select password from dba_users 2 where username = SKING;PASSWORD------------------------------83C7CBD27A9414281 row selected. Save this password using cut and paste in a GUI environment, or save it in a text file toretrieve later. The next step is to temporarily change the user’s password and then log in usingthe temporary password:SQL> alter user sking identified by temp_pass;User altered.SQL> connect sking/temp_pass@dw;Connected.
- 292 Oracle Database 11g DBA Handbook At this point, you can debug the application from SKING’s point of view. Once you are done debugging, change the password back using the undocumented by values clause of alter user: SQL> alter user sking identified by values 83C7CBD27A941428; User altered. User-Related Data Dictionary Views A number of data dictionary views contain information related to users and characteristics of users. Table 9-3 lists the most common views and tables. Database Authorization Methods Once a user is authenticated with the database, the next step is to determine what types of objects, privileges, and resources the user is permitted to access or use. In this section, we’ll review how profiles can control not only how passwords are managed but also how profiles can put limits on various types of system resources. In addition, we’ll review the two types of privileges in an Oracle database: system privileges and object privileges. Both of these privileges can be assigned directly to users, or indirectly through roles, another mechanism that can make a DBA’s job easier when assigning privileges to users. At the end of this section, we’ll cover the Virtual Private Database (VPD) features of Oracle and how it can be used to provide more precise control over what parts of a table can be seen by a user based on a set of DBA-defined credentials assigned to the user. To help make the concepts clearer, we’ll step through an implementation of a VPD from beginning to end. Profile Management There never seems to be enough CPU power or disk space or I/O bandwidth to run a user’s query. Because all these resources are inherently limited, Oracle provides a mechanism to control how much of these resources a user can use. An Oracle profile is a named set of resource limits providing this mechanism. Data Dictionary View Description DBA_USERS Contains usernames, encrypted passwords, account status, and default tablespaces. DBA_TS_QUOTAS Disk space usage and limits by user and tablespace, for users who have quotas that are not UNLIMITED. DBA_PROFILES Profiles that can be assigned to users with resource limits assigned to the profiles. USER_HISTORY$ Password history with usernames, encrypted passwords, and datestamps. Used to enforce password reuse rules if you set the initialization parameter RESOURCE_LIMIT to TRUE and limit password reuse using the alter profile parameters password_reuse_*. TABLE 9-3 User-Related Data Dictionary Views and Tables
- Chapter 9: Database Security and Auditing 293 In addition, profiles can be used as an authorization mechanism to control how user passwordsare created, reused, and validated. For example, we may wish to enforce a minimum passwordlength, along with a requirement that at least one upper- and lowercase letter appear in thepassword. In this section, we’ll talk about how profiles manage passwords and resources.The CREATE PROFILE commandThe create profile command does double duty; we can create a profile to limit the connect timefor a user to 120 minutes:create profile lim_connect limit connect_time 120; Similarly, we can limit the number of consecutive times a login can fail before the account islocked:create profile lim_fail_login limit failed_login_attempts 8; Or, we can combine both types of limits in a single profile:create profile lim_connectime_faillog limit connect_time 120 failed_login_attempts 8; How Oracle responds to one of the resource limits being exceeded depends on the type oflimit. When one of the connect time or idle time limits is reached (such as CPU_PER_SESSION),the transaction in progress is rolled back, and the session is disconnected. For most other resourcelimits (such as PRIVATE_SGA), the current transaction is rolled back, an error is returned to theuser, and the user has the option to commit or roll back the transaction. If an operation exceeds alimit for a single call (such as LOGICAL_READS_PER_CALL), the operation is aborted, the currentstatement is rolled back, and an error is returned to the user. The rest of the transaction remainsintact; the user can then roll back, commit, or attempt to complete the transaction withoutexceeding statement limits. Oracle provides the DEFAULT profile, which is applied to any new user if no other profile isspecified. This query against the data dictionary view DBA_PROFILES reveals the limits for theDEFAULT profile:SQL> select * from dba_profiles 2 where profile = DEFAULT;PROFILE RESOURCE_NAME RESOURCE LIMIT---------------- ------------------------- -------- -------------DEFAULT COMPOSITE_LIMIT KERNEL UNLIMITEDDEFAULT SESSIONS_PER_USER KERNEL UNLIMITEDDEFAULT CPU_PER_SESSION KERNEL UNLIMITEDDEFAULT CPU_PER_CALL KERNEL UNLIMITEDDEFAULT LOGICAL_READS_PER_SESSION KERNEL UNLIMITEDDEFAULT LOGICAL_READS_PER_CALL KERNEL UNLIMITEDDEFAULT IDLE_TIME KERNEL UNLIMITEDDEFAULT CONNECT_TIME KERNEL UNLIMITEDDEFAULT PRIVATE_SGA KERNEL UNLIMITEDDEFAULT FAILED_LOGIN_ATTEMPTS PASSWORD 10DEFAULT PASSWORD_LIFE_TIME PASSWORD 180
- 294 Oracle Database 11g DBA Handbook DEFAULT PASSWORD_REUSE_TIME PASSWORD UNLIMITED DEFAULT PASSWORD_REUSE_MAX PASSWORD UNLIMITED DEFAULT PASSWORD_VERIFY_FUNCTION PASSWORD NULL DEFAULT PASSWORD_LOCK_TIME PASSWORD 1 DEFAULT PASSWORD_GRACE_TIME PASSWORD 7 16 rows selected. The only real restrictions in the DEFAULT profile limit the number of consecutive unsuccessful login attempts (FAILED_LOGIN_ATTEMPTS) to ten before the account is locked and the number of days before a password must be changed (PASSWORD_LIFE_TIME) to 180. In addition, no password verification function is enabled. Profiles and Password Control In Table 9-4 are the password-related profile parameters. All units of time are specified in days (to specify any of these parameters in minutes, for example, divide by 1440): SQL> create profile lim_lock limit password_lock_time 5/1440; Profile created. Password Parameter Description FAILED_LOGIN_ATTEMPTS The number of failed login attempts before the account is locked. PASSWORD_LIFE_TIME The number of days the password can be used before it must be changed. If it is not changed within PASSWORD_ GRACE_TIME, the password must be changed before logins are allowed. PASSWORD_REUSE_TIME The number of days a user must wait before reusing a password; this parameter is used in conjunction with PASSWORD_REUSE_MAX. PASSWORD_REUSE_MAX The number of password changes that have to occur before a password can be reused; this parameter is used in conjunction with PASSWORD_REUSE_TIME. PASSWORD_LOCK_TIME How many days the account is locked after FAILED_ LOGIN_ATTEMPTS attempts. After this time period, the account is automatically unlocked. PASSWORD_GRACE_TIME The number of days after which an expired password must be changed. If it is not changed within this time period, the account is expired and the password must be changed before the user can log in successfully. PASSWORD_VERIFY_ A PL/SQL script to provide an advanced password- FUNCTION verification routine. If NULL is specified (the default), no password verification is performed. TABLE 9-4 Password-Related Profile Parameters
- Chapter 9: Database Security and Auditing 295 In this example, an account will only be locked for five minutes after the specified number oflogin failures. A parameter value of unlimited means that there is no bound on how much of the givenresource can be used. default means that this parameter takes its values from the DEFAULT profile. The parameters password_reuse_time and password_reuse_max must be used together;setting one without the other has no useful effect. In the following example, we create a profilethat sets password_reuse_time to 20 days and password_reuse_max to 5:create profile lim_reuse_pass limit password_reuse_time 20 password_reuse_max 5;For users with this profile, their password can be reused after 20 days if the password has beenchanged at least five times. If you specify a value for either of these, and UNLIMITED for theother, a user can never reuse a password. As with most other operations, profiles can easily be managed with Oracle Enterprise Manager.Figure 9-4 shows an example of changing the DEFAULT profile to disconnect the user after only15 minutes of inactivity. If we wanted to provide tighter control over how passwords are created and reused, such as amixture of upper- and lowercase characters in every password, we need to enable the PASSWORD_VERIFY_FUNCTION limit in each applicable profile. Oracle provides a template for enforcing anFIGURE 9-4 Changing password limits with Oracle Enterprise Manager
- 296 Oracle Database 11g DBA Handbook organization’s password policy. It’s located in $ORACLE_HOME/rdbms/admin/utlpwdmg.sql. Some key sections of this script follow: CREATE OR REPLACE FUNCTION verify_function_11G (username varchar2, password varchar2, old_password varchar2) RETURN boolean IS n boolean; m integer; differ integer; isdigit boolean; ischar boolean; ispunct boolean; db_name varchar2(40); digitarray varchar2(20); punctarray varchar2(25); chararray varchar2(52); i_char varchar2(10); simple_password varchar2(10); reverse_user varchar2(32); BEGIN digitarray:= 0123456789; chararray:= abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ; . . . -- Check if the password is same as the username reversed FOR i in REVERSE 1..length(username) LOOP reverse_user := reverse_user || substr(username, i, 1); END LOOP; IF NLS_LOWER(password) = NLS_LOWER(reverse_user) THEN raise_application_error(-20003, Password same as username reversed); END IF; . . . -- Everything is fine; return TRUE ; RETURN(TRUE); END; / -- This script alters the default parameters for Password Management -- This means that all the users on the system have Password Management -- enabled and set to the following values unless another profile is -- created with parameter values set to different value or UNLIMITED -- is created and assigned to the user. ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME 180 PASSWORD_GRACE_TIME 7 PASSWORD_REUSE_TIME UNLIMITED PASSWORD_REUSE_MAX UNLIMITED
- Chapter 9: Database Security and Auditing 297FAILED_LOGIN_ATTEMPTS 10PASSWORD_LOCK_TIME 1 PASSWORD_VERIFY_FUNCTION verify_function_11G; The script provides the following functionality for password complexity: ■ Ensures that the password is not the same as the username ■ Ensures that the password is at least four characters long ■ Checks to make sure the password is not a simple, obvious word, such as ORACLE or DATABASE ■ Requires that the password contains one letter, one digit, and one punctuation mark ■ Ensures that the password is different from the previous password by at least three characters To use this policy, the first step is to make your own custom changes to this script. For example,you may wish to have several different verify functions, one for each country or business unit, tomatch the database password complexity requirements to that of the operating systems in use in aparticular country or business unit. Therefore, you can rename this function as VERIFY_FUNCTION_US_MIDWEST, for example. In addition, you might want to change the list of simple words toinclude names of departments or buildings at your company. Once the function is successfully compiled, you can either alter an existing profile to use thisfunction with the alter profile command, or you can create a new profile that uses this function.In the following example, we’re changing the DEFAULT profile to use the function VERIFY_FUNCTION_US_MIDWEST:SQL> alter profile default limit 2 password_verify_function verify_function_us_midwest;Profile altered. For all existing users who are using the DEFAULT profile, or for any new users who use theDEFAULT profile, their password will be checked by the function VERIFY_FUNCTION_US_MIDWEST. If the function returns a value other than TRUE, the password is not allowed, and theuser must specify a different password. If a user has a current password that does not conform tothe rules in this function, it is still valid until the password is changed, at which time the newpassword must be validated by the function.Profiles and Resource ControlThe list of resource-control profile options that can appear after CREATE PROFILE profilenameLIMIT are explained in Table 9-5. Each of these parameters can either be an integer, UNLIMITED,or DEFAULT. As with the password-related parameters, UNLIMITED means that there is no bound on howmuch of the given resource can be used. DEFAULT means that this parameter takes its values fromthe DEFAULT profile. The COMPOSITE_LIMIT parameter allows you to control a group of resource limits when thetypes of resources typically used varies widely by type; it allows a user to use a lot of CPU timebut not much disk I/O during one session, and vice versa during another session, without beingdisconnected by the policy.
- 298 Oracle Database 11g DBA Handbook Resource Parameter Description SESSIONS_PER_USER The maximum number of sessions a user can simultaneously have CPU_PER_SESSION The maximum CPU time allowed per session, in hundredths of a second CPU_PER_CALL Maximum CPU time for a statement parse, execute, or fetch operation, in hundredths of a second CONNECT_TIME Maximum total elapsed time, in minutes IDLE_TIME Maximum continuous inactive time in a session, in minutes, while a query or other operation is not in progress LOGICAL_READS_PER_SESSION Total number of data blocks read per session, either from memory or disk LOGICAL_READS_PER_CALL Maximum number of data blocks read for a statement parse, execute, or fetch operation COMPOSITE_LIMIT Total resource cost, in service units, as a composite weighted sum of CPU_PER_SESSION, CONNECT_TIME, LOGICAL_READS_PER_SESSION, and PRIVATE_SGA PRIVATE_SGA Maximum amount of memory a session can allocate in the shared pool, in bytes, kilobytes, or megabytes TABLE 9-5 Resource-Related Profile Parameters By default, all resource costs are zero: SQL> select * from resource_cost; RESOURCE_NAME UNIT_COST -------------------------------- ---------- CPU_PER_SESSION 0 LOGICAL_READS_PER_SESSION 0 CONNECT_TIME 0 PRIVATE_SGA 0 4 rows selected. To adjust the resource cost weights, use the ALTER RESOURCE COST command. In this example, we change the weightings so that CPU_PER_SESSION favors CPU usage over connect time by a factor of 25 to 1; in other words, a user is more likely to be disconnected because of CPU usage than connect time: SQL> alter resource cost 2 cpu_per_session 50 3 connect_time 2; Resource cost altered.
- Chapter 9: Database Security and Auditing 299SQL> select * from resource_cost;RESOURCE_NAME UNIT_COST-------------------------------- ----------CPU_PER_SESSION 50LOGICAL_READS_PER_SESSION 0CONNECT_TIME 2PRIVATE_SGA 04 rows selected. The next step is to create a new profile or modify an existing profile to use a composite limit:SQL> create profile lim_comp_cpu_conn limit 2 composite_limit 250;Profile created. As a result, users assigned to the profile LIM_COMP_CPU_CONN will have their sessionresources limited using the following formula to calculate cost:composite_cost = (50 * CPU_PER_SESSION) + (2 * CONNECT_TIME); In Table 9-6, we provide some examples of resource usage to see if the composite limit of 250is exceeded. The parameters PRIVATE_SGA and LOGICAL_READS_PER_SESSION are not used in thisparticular example, so unless they are specified otherwise in the profile definition, they defaultto whatever their value is in the DEFAULT profile. The goal of using composite limits is to giveusers some leeway in the types of queries or DML they run. On some days, they may run a lotof queries that perform numerous calculations but don’t access a lot of table rows; on other days,they may do a lot of full table scans but don’t stay connected very long. In these situations, wedon’t want to limit a user by a single parameter, but instead by total resource usage weighted bythe availability of each resource on the server.System PrivilegesA system privilege is a right to perform an action on any object in the database, as well as otherprivileges that do not involve objects at all, but rather things like running batch jobs, alteringsystem parameters, creating roles, and even connecting to the database itself. There are 206 CPU (Seconds) Connect (Seconds) Composite Cost Exceeded? 0.05 100 (50*5) + (2*100) = 450 Yes 0.02 30 (50*2) + (2*30) = 160 No 0.01 150 (50*1) + (2*150) = 350 Yes 0.02 5 (50*2) + (2*5) = 110 NoTABLE 9-6 Resource Usage Scenarios
- 300 Oracle Database 11g DBA Handbook system privileges in Release 1 of Oracle 11g. All of them can be found in the data dictionary table SYSTEM_PRIVILEGE_MAP: SQL> select * from system_privilege_map; PRIVILEGE NAME PROPERTY ---------- ---------------------------------------- ---------- -3 ALTER SYSTEM 0 -4 AUDIT SYSTEM 0 -5 CREATE SESSION 0 -6 ALTER SESSION 0 -7 RESTRICTED SESSION 0 -10 CREATE TABLESPACE 0 -11 ALTER TABLESPACE 0 -12 MANAGE TABLESPACE 0 -13 DROP TABLESPACE 0 -15 UNLIMITED TABLESPACE 0 -20 CREATE USER 0 -21 BECOME USER 0 -22 ALTER USER 0 -23 DROP USER 0 . . . -318 INSERT ANY MEASURE FOLDER 0 -319 CREATE CUBE BUILD PROCESS 0 -320 CREATE ANY CUBE BUILD PROCESS 0 -321 DROP ANY CUBE BUILD PROCESS 0 -322 UPDATE ANY CUBE BUILD PROCESS 0 -326 UPDATE ANY CUBE DIMENSION 0 -327 ADMINISTER SQL MANAGEMENT OBJECT 0 -350 FLASHBACK ARCHIVE ADMINISTER 0 206 rows selected. Table 9-7 lists some of the more common system privileges, along with a brief description of each. Granting System Privileges Privileges are granted to a user, role, or PUBLIC using the grant command; privileges are revoked using the revoke command. PUBLIC is a special group that includes all database users, and it’s convenient shorthand for granting privileges to everyone in the database. To grant the user SCOTT the ability to create stored procedures and synonyms, you can use a command like the following: SQL> grant create procedure, create synonym to scott; Grant succeeded. Revoking privileges is just as easy: SQL> revoke create synonym from scott; Revoke succeeded.
- Chapter 9: Database Security and Auditing 301 System Privilege Capability ALTER DATABASE Make changes to the database, such as changing the state of the database from MOUNT to OPEN, or recover a database. ALTER SYSTEM Issue ALTER SYSTEM statements: Switch to the next redo log group and change system-initialization parameters in the SPFILE. AUDIT SYSTEM Issue AUDIT statements. CREATE DATABASE LINK Create database links to remote databases. CREATE ANY INDEX Create an index in any schema; CREATE INDEX is granted along with CREATE TABLE for the user’s schema. CREATE PROFILE Create a resource/password profile. CREATE PROCEDURE Create a function, procedure, or package in your own schema. CREATE ANY PROCEDURE Create a function, procedure, or package in any schema. CREATE SESSION Connect to the database. CREATE SYNONYM Create a private synonym in your own schema. CREATE ANY SYNONYM Create a private synonym in any schema. CREATE PUBLIC SYNONYM Create a public synonym. DROP ANY SYNONYM Drop a private synonym in any schema. DROP PUBLIC SYNONYM Drop a public synonym. CREATE TABLE Create a table in your own schema. CREATE ANY TABLE Create a table in any schema. CREATE TABLESPACE Create a new tablespace in the database. CREATE USER Create a user account/schema. ALTER USER Make changes to a user account/schema. CREATE VIEW Create a view in your own schema. SYSDBA Create an entry in the external password file, if enabled; also, perform startup/shutdown, alter a database, create a database, recover a database, create an SPFILE, and connect when the database is in RESTRICTED SESSION mode. SYSOPER Create an entry in the external password file, if enabled; also, perform startup/shutdown, alter a database, recover a database, create an SPFILE, and connect when the database is in RESTRICTED SESSION mode.TABLE 9-7 Common System Privileges
- 302 Oracle Database 11g DBA Handbook If you wish to allow grantees the right to grant the same privilege to someone else, you include with admin option when you grant the privilege. In the preceding example, we want the user SCOTT to be able to grant the CREATE PROCEDURE privilege to other users. To accomplish this, we need to re-grant the CREATE PROCEDURE privilege: SQL> grant create procedure to scott with admin option; Grant succeeded. Now the user SCOTT may issue the grant create procedure command. Note that if SCOTT’s permission to grant his privileges to others is revoked, the users he granted the privileges to retain the privileges. System Privilege Data Dictionary Views Table 9-8 contains the data dictionary views related to system privileges. Object Privileges In contrast to a system privilege, an object privilege is a right to perform a particular type of action on a specific object, such as a table or a sequence, that is not in the user’s own schema. As with system privileges, you use the grant and revoke commands to grant and revoke privileges on objects. As with system privileges, you can grant object privileges to PUBLIC or a specific user; a user with the object privilege may pass it on to others by granting the object privilege with the with grant option clause. CAUTION Only grant object or system privileges to PUBLIC when the privilege is truly required by all current and future users of the database. Some schema objects, such as clusters and indexes, rely on system privileges to control access. In these cases, the user can change these objects if they own the objects or have the ALTER ANY CLUSTER or ALTER ANY INDEX system privilege. A user with objects in their own schema automatically has all object privileges on those objects and can grant any object privilege on these objects to any user or another role, with or without the grant option clause. In Table 9-9 are the object privileges available for different types of objects; some privileges are only applicable to certain types of objects. For example, the INSERT privilege only makes sense with tables, views, and materialized views; the EXECUTE privilege, on the other hand, is applicable to functions, procedures, and packages, but not tables. Data Dictionary View Description DBA_SYS_PRIVS System privileges assigned to roles and users SESSION_PRIVS All system privileges in effect for this user for the session, granted directly or via a role ROLE_SYS_PRIVS Current session privileges granted to a user via a role TABLE 9-8 System Privilege Data Dictionary Views
- Chapter 9: Database Security and Auditing 303 Object Privilege Capability ALTER Can alter a table or sequence definition. DELETE Can delete rows from a table, view, or materialized view. EXECUTE Can execute a function or procedure, with or without a package. DEBUG Allowed to view PL/SQL code in triggers defined on a table, or SQL statements that reference a table. For object types, this privilege allows access to all public and private variables, methods, and types defined on the object type. FLASHBACK Allows flashback queries on tables, views, and materialized views using retained undo information. INDEX Can create an index on a table. INSERT Can insert rows into a table, view, or materialized view. ON COMMIT REFRESH Can create a refresh-on-commit materialized view based on a table. QUERY REWRITE Can create a materialized view for query rewrite based on a table. READ Can read the contents of an operating system directory using an Oracle DIRECTORY definition. REFERENCES Can create a foreign key constraint that references another table’s primary key or unique key. SELECT Can read rows from a table, view, or materialized view, in addition to reading current or next values from a sequence. UNDER Can create a view based on an existing view. UPDATE Can update rows in a table, view, or materialized view. WRITE Can write information to an operating system directory using an Oracle DIRECTORY definition.TABLE 9-9 Object Privileges It’s worth noting that DELETE, UPDATE, and INSERT privileges cannot be granted to materializedviews unless they are updatable. Some of these object privileges overlap with system privileges;for example, if you don’t have the FLASHBACK object privilege on a table, you can still performflashback queries if you have the FLASHBACK ANY TABLE system privilege. In the following example, the DBA grants SCOTT full access to the table HR.EMPLOYEES, butonly allows SCOTT to pass on the SELECT object privilege to other users:SQL> grant insert, update, delete on hr.employees to scott;Grant succeeded.SQL> grant select on hr.employees to scott with grant option;Grant succeeded. Note that if the SELECT privilege on the table HR.EMPLOYEES is revoked from SCOTT, theSELECT privilege is also revoked from anyone he granted the privilege.
- 304 Oracle Database 11g DBA Handbook Table Privileges The types of privileges that can be granted on a table fall into two broad categories: DML operations and DDL operations. DML operations include delete, insert, select, and update, whereas DDL operations include adding, dropping, and changing columns in the table as well as creating indexes on the table. When granting DML operations on a table, it is possible to restrict those operations only to certain columns. For example, we may want to allow SCOTT to see and update all the rows and columns in the HR.EMPLOYEES table, except for the SALARY column. To do this, we first need to revoke the existing SELECT privilege on the table: SQL> revoke update on hr.employees from scott; Revoke succeeded. Next, we will let SCOTT update all the columns except for the SALARY column: SQL> grant update (employee_id, first_name, last_name, email, 2 phone_number, hire_date, job_id, commission_pct, 3 manager_id, department_id) 4 on hr.employees to scott; Grant succeeded. SCOTT will be able to update all columns in the HR.EMPLOYEES table except for the SALARY column: SQL> update hr.employees set first_name = Stephen where employee_id = 100; 1 row updated. SQL> update hr.employees set salary = 50000 where employee_id = 203; update hr.employees set salary = 50000 where employee_id = 203 * ERROR at line 1: ORA-01031: insufficient privileges This operation is also easy to perform with the web-based OEM tool, as demonstrated in Figure 9-5. View Privileges Privileges on views are similar to those granted on tables. Rows in a view can be selected, updated, deleted, or inserted, assuming that the view is updatable. To create a view, first you need either the CREATE VIEW system privilege (to create a view in your own schema) or the CREATE ANY VIEW system privilege (to create a view in any schema). Even to create the view, you must also have at least SELECT object privileges on the underlying tables of the view, along with INSERT, UPDATE, and DELETE, if you wish to perform those operations on the view and the view is updatable. Alternatively, you can have the SELECT ANY TABLE, INSERT ANY TABLE, UPDATE ANY TABLE, or DELETE ANY TABLE privileges if the underlying objects are not in your schema. To allow others to use your view, you must also have permissions on the view’s base tables with the GRANT OPTION, or you must have the system privileges with the ADMIN OPTION. For example, if you are creating a view against the HR.EMPLOYEES table, you must have been granted the SELECT object privilege WITH GRANT OPTION on HR.EMPLOYEES, or you must have the SELECT ANY TABLE system privilege WITH ADMIN OPTION.
- Chapter 9: Database Security and Auditing 305FIGURE 9-5 Granting column privileges in Oracle Enterprise ManagerProcedure PrivilegesFor procedures, functions, and the packages that contain procedures and functions, the EXECUTEprivilege is the only object privilege that can be applied. Since Oracle8i, procedures and functionscan be run either from the perspective of the definer, the creator of the procedure or function, orfrom the invoker, the user who is running the procedure or function. A procedure with definer’s rights is run as if the definer was running the procedure, with allprivileges of the definer in effect against objects referenced in the procedure. This is a good wayto enforce restrictions on private database objects: Other users are granted EXECUTE permissionson the procedure and no permissions on the referenced objects. As a result, the definer can controlhow other users access the objects. Conversely, an invoker’s rights procedure requires that the invoker has direct rights, such asSELECT and UPDATE, to any objects referenced in the procedure. The procedure could referencean unqualified table named ORDERS, and if all users of the database have an ORDERS table, thesame procedure could be used by any user who has their own ORDERS table. Another advantageto using invoker’s rights procedures is that roles are enabled within them. Roles are discussed indepth later in this chapter. By default, a procedure is created with definer’s rights. To specify that a procedure usesinvoker’s rights, you must include the keywords authid current_user in the procedure definition,as in the following example:create or replace procedure process_orders (order_batch_date date)authid current_user asbegin -- process users ORDERS table here using invokers rights, -- all roles are in effectend;
- 306 Oracle Database 11g DBA Handbook To create a procedure, a user must have either the CREATE PROCEDURE or CREATE ANY PROCEDURE system privilege. For the procedure to compile correctly, the user must have direct privileges against all objects referenced in the procedure, even though roles are enabled at runtime in an invoker’s rights procedure to obtain these same privileges. To allow other users to access a procedure, you grant EXECUTE privileges on the procedure or package. Object Privilege Data Dictionary Views A number of data dictionary views contain information about object privileges assigned to users. Table 9-10 lists the most important views containing object privilege information. Creating, Assigning, and Maintaining Roles A role is a named group of privileges, either system privileges or object privileges or a combination of the two, that helps to ease the administration of privileges. Rather than granting system or object privileges individually to each user, you can grant the group of system or object privileges to a role, and in turn the role can be granted to the user instead. This reduces tremendously the amount of administrative overhead involved in maintaining privileges for users. Figure 9-6 shows how a role can reduce the number of grant commands (and ultimately revoke commands) that need to be executed when roles are used to group privileges. If the privileges for a group of people authorized by a role need to change, only the privileges of the role need to be changed, and the capabilities of the users with that role automatically use the new or changed privileges. Roles may selectively be enabled by a user; some roles may automatically be enabled at login. In addition, passwords can be used to protect a role, adding another level of authentication to the capabilities in the database. In Table 9-11 are the most common roles that are automatically provided with the database, along with a brief description of what privileges come with each role. The roles CONNECT, RESOURCE, and DBA are provided mainly for compatibility with previous versions of Oracle; they may not exist in future versions of Oracle. The database administrator should create custom roles using the privileges granted to these roles as a starting point. Data Dictionary View Description DBA_TAB_PRIVS Table privileges granted to roles and users. Includes the user who granted the privilege to the role or user, with or without GRANT OPTION. DBA_COL_PRIVS Column privileges granted to roles or users, containing the column name and the type of privilege on the column. SESSION_PRIVS All system privileges in effect for this user for the session, granted directly or via a role. ROLE_TAB_PRIVS For the current session, privileges granted on tables via roles. TABLE 9-10 Object Privilege Data Dictionary Views
- Chapter 9: Database Security and Auditing 307FIGURE 9-6 Using roles to manage privileges Role Name Privileges CONNECT Previous to Oracle Database 10g Release 2: ALTER SESSION, CREATE CLUSTER, CREATE DATABASE LINK, CREATE SEQUENCE, CREATE SESSION, CREATE SYNONYM, CREATE TABLE, CREATE VIEW. These privileges are typically those given to a general user of the database, allowing them to connect and create tables, indexes, and views. Oracle Database 10g Release 2 and later: CREATE SESSION only. RESOURCE CREATE CLUSTER, CREATE INDEXTYPE, CREATE OPERATOR, CREATE PROCEDURE, CREATE SEQUENCE, CREATE TABLE, CREATE TRIGGER, CREATE TYPE. These privileges are typically used for application developers who may be coding PL/SQL procedures and functions. DBA All system privileges WITH ADMIN OPTION. Allows a person with the DBA role to grant system privileges to others. DELETE_CATALOG_ROLE Does not have any system privileges, but only object privileges (DELETE) on SYS.AUD$ and FGA_LOG$. In other words, this role allows a user to remove audit records from the audit trail for regular or fine-grained auditing. EXECUTE_CATALOG_ROLE Execute privileges on various system packages, procedures, and functions, such as DBMS_FGA and DBMS_RLS. SELECT_CATALOG_ROLE SELECT object privilege on 1,638 data dictionary tables. EXP_FULL_DATABASE EXECUTE_CATALOG_ROLE, SELECT_CATALOG_ROLE, and system privileges such as BACKUP ANY TABLE and RESUMABLE. Allows a user with this role to export all objects in the database.TABLE 9-11 Predefined Oracle Roles
- 308 Oracle Database 11g DBA Handbook Role Name Privileges IMP_FULL_DATABASE Similar to EXP_FULL_DATABASE, with many more system privileges, such as CREATE ANY TABLE, to allow the import of a previously exported full database. AQ_USER_ROLE Execute access for routines needed with Advanced Queuing, such as DBMS_AQ. AQ_ADMINISTRATOR_ROLE Manager for Advanced Queuing queues. SNMPAGENT Used by the Enterprise Manager Intelligent Agent. RECOVERY_CATALOG_OWNER Used to create a user who owns a recovery catalog for RMAN backup and recovery. HS_ADMIN_ROLE Provides access to the tables HS_* and the package DBMS_HS for administering Oracle Heterogeneous Services. SCHEDULER_ADMIN Provides access to the DBMS_SCHEDULER package, along with privileges to create batch jobs.TABLE 9-11 Predefined Oracle Roles (continued) Creating or Dropping a Role To create a role, you use the create role command, and you must have the CREATE ROLE system privilege. Typically, this is granted only to database administrators or application administrators. Here’s an example: SQL> create role hr_admin not identified; Role created. By default, no password or authentication is required to enable or use an assigned role; therefore, the not identified clause is optional. As with creating users, you can authorize use of a role by a password (database authorization with identified by password), by the operating system (identified externally), or by the network or directory service (identified globally). In addition to these familiar methods, a role can be authorized by the use of a package: This is known as using a secure application role. This type of role uses a procedure within the package to enable the role. Typically, the role is enabled only under certain conditions: The user is connecting via a web interface or from a certain IP address, or it’s a certain time of day. Here is a role that is enabled using a procedure: SQL> create role hr_clerk identified using hr.clerk_verif; Role created. The procedure HR.CLERK_VERIF need not exist when the role is created; however, it must be compiled and valid when a user who is granted this role needs to enable it. Typically, with secure application roles, the role is not enabled by default for the user. To specify that all roles are enabled by default, except for the secure application role, use the following command:
- Chapter 9: Database Security and Auditing 309SQL> alter user kshelton default role all except hr_clerk;User altered. In this way, when the HR application starts, it can enable the role by performing a set role hr_clerk command, thus calling the procedure HR.CLERK_VERIF. The user need not know about therole or the procedure that enables the role; therefore, no access to the objects and privilegesprovided by the role are available to the user outside of the application. Dropping a role is just as easy as creating a role:SQL> drop role keypunch_operator;Role dropped. Any users assigned to this role will lose the privileges assigned to this role the next time theyconnect to the database. If they are currently logged in, they will retain the privileges until theydisconnect from the database.Granting Privileges to a RoleAssigning a privilege to a role is very straightforward; you use the grant command to assign theprivilege to a role, just as you would assign a privilege to a user:SQL> grant select on hr.employees to hr_clerk;Grant succeeded.SQL> grant create table to hr_clerk;Grant succeeded. In this example, we’ve assigned an object privilege and a system privilege to the HR_CLERKrole. In Figure 9-7, we can use the web-enabled OEM to add more object or system privileges tothe role.FIGURE 9-7 Granting privileges to roles with OEM
- 310 Oracle Database 11g DBA Handbook Assigning or Revoking Roles Once we have the desired system and object privileges assigned to the role, we can assign the role to a user, using familiar syntax: SQL> grant hr_clerk to smavris; Grant succeeded. Any other privileges granted to the HR_CLERK role in the future will automatically be usable by SMAVRIS because SMAVRIS has been granted the role. Roles may be granted to other roles; this allows a DBA to have a hierarchy of roles, making role administration easier. For example, we may have roles named DEPT30, DEPT50, and DEPT100, each having object privileges to tables owned by each of those departments. An employee in department 30 would be assigned the DEPT30 role, and so forth. The president of the company would like to see tables in all departments; but rather than assigning individual object privileges to the role ALL_DEPTS, we can assign the individual department roles to ALL_DEPTS: SQL> create role all_depts; Role created. SQL> grant dept30, dept50, dept100 to all_depts; Grant succeeded. SQL> grant all_depts to sking; Grant succeeded. The role ALL_DEPTS may also contain individual object and system privileges that do not apply to individual departments, such as object privileges on order entry tables or accounts receivable tables. Revoking a role from a user is very similar to revoking privileges from a user: SQL> revoke all_depts from sking; Revoke succeeded. The privileges revoked will no longer be available to the user the next time they connect to the database. However, it is worth noting that if another role contains privileges on the same objects as the dropped role, or privileges on the objects are granted directly, the user retains these privileges on the objects until these and all other grants are explicitly revoked. Default Roles By default, all roles granted to a user are enabled when the user connects. If a role is going to be used only within the context of an application, the role can start out disabled when the user is logged in; then it can be enabled and disabled within the application. If the user SCOTT has CONNECT, RESOURCE, HR_CLERK, and DEPT30 roles, and we want to specify that HR_CLERK and DEPT30 are not enabled by default, we can use something like the following: SQL> alter user scott default role all 2> except hr_clerk, dept30; User altered. When SCOTT connects to the database, he automatically has all privileges granted with all roles except for HR_CLERK and DEPT30. SCOTT may explicitly enable a role in his session by using set role:
- Chapter 9: Database Security and Auditing 311SQL> set role dept30;Role set. When he’s done accessing the tables for department 30, he can disable the role in his session:SQL> set role all except dept30;Role set. NOTE The initialization parameter MAX_ENABLED_ROLES is deprecated as of Oracle 10g. It is retained for compatibility with previous versions only.Password-Enabled RolesTo enhance security in the database, the DBA can assign a password to a role. The password isassigned to the role when it’s created:SQL> create role dept99 identified by d99secretpw;Role created.SQL> grant dept99 to scott;Grant succeeded.SQL> alter user scott default role all except hr_clerk, dept30, dept99;User altered. When the user SCOTT is connected to the database, either the application he is using willprovide or prompt for a password, or he can enter the password when he enables the role:SQL> set role dept99 identified by d99secretpw;Role set.Role Data Dictionary ViewsIn Table 9-12 are listed the data dictionary views related to roles. Data Dictionary View Description DBA_ROLES All roles and whether they require a password. DBA_ROLE_PRIVS Roles granted to users or other roles. ROLE_ROLE_PRIVS Roles granted to other roles. ROLE_SYS_PRIVS System privileges that have been granted to roles. ROLE_TAB_PRIVS Table and table column privileges that have been granted to roles. SESSION_ROLES Roles currently in effect for the session. Available to every user session.TABLE 9-12 Role-Related Data Dictionary Views
- 312 Oracle Database 11g DBA Handbook The view DBA_ROLE_PRIVS is a good way to find out what roles are granted to a user as well as whether they can pass this role to another user (ADMIN_OPTION) and whether this role is enabled by default (DEFAULT_ROLE): SQL> select * from dba_role_privs 2 where grantee = SCOTT; GRANTEE GRANTED_ROLE ADMIN_OPTION DEFAULT_ROLE ------------ -------------------- ------------ ------------ SCOTT DEPT30 NO NO SCOTT DEPT50 NO YES SCOTT DEPT99 NO YES SCOTT CONNECT NO YES SCOTT HR_CLERK NO NO SCOTT RESOURCE NO YES SCOTT ALL_DEPTS NO YES SCOTT DELETE_CATALOG_ROLE NO YES 8 rows selected. Similarly, we can find out which roles we assigned to the ALL_DEPTS role: SQL> select * from dba_role_privs 2> where grantee = ALL_DEPTS; GRANTEE GRANTED_ROLE ADMIN_OPTION DEFAULT_ROLE ------------ -------------------- ------------ ------------ ALL_DEPTS DEPT30 NO YES ALL_DEPTS DEPT50 NO YES ALL_DEPTS DEPT100 NO YES 3 rows selected. The data dictionary view ROLE_ROLE_PRIVS can also be used to get this information; it only contains information about roles assigned to roles, and it does not have the DEFAULT_ROLE information. To find out privileges granted to users on a table or table columns, we can write two queries: one to retrieve privileges granted directly, and another to retrieve privileges granted indirectly via a role. Retrieving privileges granted directly is straightforward: SQL> select dtp.grantee, dtp.owner, dtp.table_name, 2 dtp.grantor, dtp.privilege, dtp.grantable 3 from dba_tab_privs dtp 4 where dtp.grantee = SCOTT; GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRANTABLE ------------ ---------- --------------- ------------ ------------ ---------- SCOTT HR EMPLOYEES HR SELECT YES SCOTT HR EMPLOYEES HR DELETE NO SCOTT HR EMPLOYEES HR INSERT NO 4 rows selected.
- Chapter 9: Database Security and Auditing 313 To retrieve table privileges granted via roles, we need to join DBA_ROLE_PRIVS and ROLE_TAB_PRIVS. DBA_ROLE_PRIVS has the roles assigned to the user, and ROLE_TAB_PRIVS has theprivileges assigned to the roles:SQL> select drp.grantee, rtp.owner, rtp.table_name, 2 rtp.privilege, rtp.grantable, rtp.role 3 from role_tab_privs rtp 4 join dba_role_privs drp on rtp.role = drp.granted_role 5 where drp.grantee = SCOTT;GRANTEE OWNER TABLE_NAME PRIVILEGE GRANTABLE ROLE---------- -------- --------------- ------------ ---------- ---------------SCOTT HR EMPLOYEES SELECT NO HR_CLERKSCOTT HR JOBS SELECT NO JOB_MAINTSCOTT HR JOBS UPDATE NO JOB_MAINTSCOTT SYS AUD$ DELETE NO DELETE_CATA LOG_ROLESCOTT SYS FGA_LOG$ DELETE NO DELETE_CATA LOG_ROLE5 rows selected. In the case of SCOTT’s privileges, notice that he has the SELECT privilege on the HR.EMPLOYEEStable both via a direct grant and via a role. Revoking either one of the privileges will still leavehim with access to the HR.EMPLOYEES table until both privileges have been removed.Using a VPD to Implement Application Security PoliciesA Virtual Private Database (VPD) combines server-enforced fine-grained access control with asecure application context. The context-aware functions return a predicate—a where clause—thatis automatically appended to all select statements or other DML statements. In other words, aselect statement on a table, view, or synonym controlled by a VPD will return a subset of rowsbased on a where clause generated automatically by the security policy function in effect by theapplication context. The major component of a VPD is row-level security (RLS), also known asfine-grained access control (FGAC). Because a VPD generates the predicates transparently during statement parse, the securitypolicy is enforced consistently regardless of whether the user is running ad hoc queries, retrievingthe data from an application, or viewing the data from Oracle Forms. Because the Oracle Serverapplies the predicate to the statement at parse time, the application need not use special tables,views, and so forth to implement the policy. As a result, Oracle can optimize the query usingindexes, materialized views, and parallel operations where it otherwise might not be able.Therefore, using a VPD may incur less overhead than a query whose results are filtered usingapplications or other means. From a maintenance point of view, security policies can be defined within a policy functionthat would be difficult to create using roles and privileges. Similarly, an Application ServerProvider (ASP) may only need to set up one database to service multiple customers for the sameapplication, with a VPD policy to ensure that employees of one customer can see only their data.The DBA can maintain one larger database with a small number of VPD policies instead of anindividual database for each customer.
- 314 Oracle Database 11g DBA Handbook New to Oracle Database 10g are column-level VPD operations. Using column-level VPD, a DBA can restrict access to a particular column or columns in a table. The query returns the same number of rows, but if the user’s context does not allow access to the column or columns, NULL values are returned in the restricted column or columns. VPD policies can be static, context sensitive, or dynamic. Static and context-sensitive policies, new to Oracle Database 10g, can improve performance dramatically because they do not need to call the policy function every time a query is run because it is cached for use later in the session. Before Oracle Database 10g, all policies were dynamic; in other words, the policy function was run every time a SQL statement containing the target VPD table was parsed. Static policies are evaluated once during login and remain cached throughout the session, regardless of application context. With context-sensitive policies, the policy function is called at statement parse time if the application context changes—for example, a policy that enforces the business rule that “employees only see their own salary history, but managers can see all the salaries of their employees.” If the employee executing the statement has not changed, the policy function need not be called again, thus reducing the amount of overhead due to VPD policy enforcement. You create application contexts using the create context command, and the package DBMS_ RLS manages VPD policies. The function used to return the predicates to enforce the policy is created like any other function, except that the function has two required parameters and returns a VARCHAR2. Later in this chapter, we’ll go into more detail on these functions and we’ll step through a VPD example using the sample schemas provided during the installation of the Oracle database. Application Context Using the create context command, you can create the name of application-defined attributes that will be used to enforce your security policy, along with the package name for the functions and procedures used to set the security context for the user session. Here’s an example: create context hr_security using vpd.emp_access; create or replace package emp_access as procedure set_security_parameters; end; In this example, the context name is HR_SECURITY, and the package used to set up the characteristics or attributes for the user during the session is called EMP_ACCESS. The procedure SET_SECURITY_PARAMETERS will be called in the logon trigger. Because the context HR_ SECURITY is bound only to EMP_ACCESS, no other procedures can change the session attributes. This ensures a secure application context that can’t be changed by the user or any other process after connecting to the database. In a typical package used to implement application context, you use the built-in context USERENV to retrieve information about the user session itself. In Table 9-13 are a few of the more common parameters in the USERENV context.
- Chapter 9: Database Security and Auditing 315 Parameter Return Value CURRENT_SCHEMA The default schema for the session DB_NAME The name of the database as specified in the initialization parameter DB_NAME HOST The name of the host machine from which the user connected IP_ADDRESS The IP address from which the user connected OS_USER The operating system account that initiated the database session SESSION_USER The authenticated database user’s nameTABLE 9-13 Common USERENV Context Parameters For example, the following calls to SYS_CONTEXT will retrieve the username and IP_ADDRESSof the database session:declare username varchar2(30); ip_addr varchar2(30);begin username := SYS_CONTEXT(USERENV,SESSION_USER); ip_addr := SYS_CONTEXT(USERENV,IP_ADDRESS); -- other processing hereend; Similarly, the SYS_CONTEXT function can be used within a SQL select statement:SQL> select SYS_CONTEXT(USERENV,SESSION_USER) username from dual;USERNAME-------------------------KSHELTON Using some combination of the USERENV context and authorization information in thedatabase, we use DBMS_SESSION.SET_CONTEXT to assign values to parameters in the applicationcontext that we create:dbms_session.set_context(HR_SECURITY,SEC_LEVEL,HIGH);In this example, the application context variable SEC_LEVEL is set to HIGH in the HR_SECURITYcontext. The value can be assigned based on a number of conditions, including a mapping tablethat assigns security levels based on user ID.
- 316 Oracle Database 11g DBA Handbook To ensure that the context variables are set for each session, we can use a logon trigger to call the procedure associated with the context. As mentioned earlier, the variables in the context can only be set or changed within the assigned package. Here is a sample logon trigger that calls the procedure to set up the context: create or replace trigger vpd.set_security_parameters after logon on database begin vpd.emp_access.set_security_parameters; end; In this example, the procedure SET_SECURITY_PARAMETERS would make the necessary calls to DBMS_SESSION.SET_CONTEXT. Within Oracle Enterprise Manager, you can use Policy Manager to set up contexts and policy groups, as demonstrated in Figure 9-8. Security Policy Implementation Once the infrastructure is in place to set up the security environment, the next step is to define the function or functions used to generate the predicate that will be attached to every select statement or DML command against the protected tables. The function used to implement the predicate generation has two arguments: the owner of the object being protected, and the name of the object within the owner’s schema. One function may handle predicate generation for just one type of operation, such as select, or may be applicable to all DML commands, depending on how this function is associated with the protected table. The following example shows a package body FIGURE 9-8 Oracle Policy Manager
- Chapter 9: Database Security and Auditing 317containing two functions—one that will be used to control access from select statements, and theother for any other DML statements:create or replace package body get_predicates is function emp_select_restrict(owner varchar2, object_name varchar2) return varchar2 is ret_predicate varchar2(1000); -- part of WHERE clause begin -- only allow certain employees to see rows in the table -- . . . check context variables and build predicate return ret_predicate; end emp_select_restrict; function emp_dml_restrict(owner varchar2, object_name varchar2) return varchar2 is ret_predicate varchar2(1000); -- part of WHERE clause begin -- only allow certain employees to make changes to the table -- . . . check context variables and build predicate return ret_predicate; end emp_dml_restrict;end; -- package bodyEach function returns a string containing an expression that is added to a where clause for a selectstatement or a DML command. The user or application never sees the value of this WHERE clause;it is automatically added to the command at parse time. The developer must ensure that the functions always return a valid expression. Otherwise,any access to a protected table will always fail, as in the following example:SQL> select * from hr.employees;select * from hr.employees *ERROR at line 1:ORA-28113: policy predicate has error The error message does not say what the predicate is, and all users are locked out of the tableuntil the predicate function is fixed. Tips on how to debug a predicate function are presented laterin this chapter.Using DBMS_RLSThe built-in package DBMS_RLS contains a number of subprograms that a DBA uses to maintainthe security policies associated with tables, views, and synonyms. In Table 9-14 are the subprogramsavailable in the DBMS_RLS package. Any user who needs to create or administer policies musthave EXECUTE privileges granted on the package SYS.DBMS_RLS.
- 318 Oracle Database 11g DBA Handbook Subprogram Description ADD_POLICY Adds a fine-grained access control policy to an object DROP_POLICY Drops an FGAC policy from an object REFRESH_POLICY Reparses all cached statements associated with the policy ENABLE_POLICY Enables or disables an FGAC policy CREATE_POLICY_GROUP Creates a policy group ADD_GROUPED_POLICY Adds a policy to a policy group ADD_POLICY_CONTEXT Adds the context for the current application DELETE_POLICY_GROUP Deletes a policy group DROP_GROUPED_POLICY Drops a policy from a policy group DROP_POLICY_CONTEXT Drops a context for the active application ENABLE_GROUPED_POLICY Enables or disables a group policy DISABLE_GROUPED_POLICY Disables a group policy REFRESH_GROUPED_POLICY Reparses all cached statements associated with the policy group TABLE 9-14 DBMS_RLS Package Subprograms In this chapter, we’ll cover the most commonly used subprograms, ADD_POLICY and DROP_ POLICY. The syntax of ADD_POLICY follows: DBMS_RLS.ADD_POLICY ( object_schema IN varchar2 null, object_name IN varchar2, policy_name IN varchar2, function_schema IN varchar2 null, policy_function IN varchar2, statement_types IN varchar2 null, update_check IN boolean false, enable IN boolean true, static_policy IN boolean false, policy_type IN binary_integer null, long_predicate IN in Boolean false, sec_relevant_cols IN varchar2, sec_relevant_cols_opt IN binary_integer null ); Note that some of the parameters have BOOLEAN default values and that the less commonly used parameters are near the end of the argument list. This makes the syntax for any particular call to DBMS_RLS.ADD_POLICY easier to write and understand for the vast majority of cases. The description and usage for each parameter are provided in Table 9-15.
- Chapter 9: Database Security and Auditing 319 Parameter Description object_schema The schema containing the table, view, or synonym to be protected by the policy. If this value is NULL, the schema of the user calling the procedure is used. object_name The name of the table, view, or synonym to be protected by the policy. policy_name The name of the policy to be added to this object. It must be unique for each object being protected. function_schema The schema that owns the policy function; if this value is NULL, the schema of the user calling the procedure is used. policy_function The name of the function that will generate the predicate for the policy against the object_name. If the function is part of the package, the package name must also be specified here to qualify the policy function name. statement_types The statement types to which the policy applies. The allowable values, separated by commas, can be any combination of SELECT, INSERT, UPDATE, DELETE, and INDEX. By default, all types are applied except for INDEX. update_check For INSERT or UPDATE types, this parameter is optional, and it defaults to FALSE. If it is TRUE, the policy is also checked for INSERT or UPDATE statements when a SELECT or DELETE operation is being checked. enable This parameter defaults to TRUE and indicates if the policy is enabled when it is added. static_policy If this parameter is TRUE, the policy produces the same predicate string for anyone accessing the object, except for the SYS user or any user with the EXEMPT ACCESS POLICY privilege. The default is FALSE. policy_type Overrides static_policy if this value is not NULL. Allowable values are STATIC, SHARED_STATIC, CONTEXT_SENSITIVE, SHARED_ CONTEXT_SENSITIVE, and DYNAMIC. long_predicate This parameter defaults to FALSE. If it is TRUE, the predicate string can be up to 32K bytes long. Otherwise, the limit is 4000 bytes. sec_relevant_cols Enforces column-level VPD, new to Oracle 10g. Applies to tables and views only. Protected columns are specified in a list with either commas or spaces as delimiters. The policy is applied only if the specified sensitive columns are in the query or DML statement. By default, all columns are protected. sec_relevant_cols_opt Allows rows in a column-level VPD filtered query to still appear in the result set, with NULL values returned for the sensitive columns. The default for this parameter is NULL; otherwise, you must specify DBMS_RLS.ALL_ROWS to show all columns with NULLs for the sensitive columns.TABLE 9-15 DBMS_RLS.ADD_POLICY Parameters
- 320 Oracle Database 11g DBA Handbook Using the parameter sec_relevant_cols is handy when you don’t mind if users see part of a row, just not the columns that might contain confidential information, such as a Social Security Number or a salary. In our example later in this chapter, we’ll build on the first security policy we define to filter out sensitive data for most employees of the company. In the following example, we’re applying a policy named EMP_SELECT_RESTRICT to the table HR.EMPLOYEES. The schema VPD owns the policy function get_predicates.emp_select_restrict. The policy explicitly applies to SELECT statements on the table; however, with UPDATE_CHECK set to TRUE, update or delete commands will also be checked when rows are updated or inserted into the table. dbms_rls.add_policy ( object_schema => HR, object_name => EMPLOYEES, policy_name => EMP_SELECT_RESTRICT, function_schema => VPD, policy_function => get_predicates.emp_select_restrict, statement_types => SELECT, update_check => TRUE, enable => TRUE ); Because we did not set static_policy, it defaults to FALSE, meaning that the policy is dynamic and is checked every time a select statement is parsed. This is the only behavior available before Oracle Database 10g. Using the subprogram ENABLE_POLICY is an easy way to disable the policy temporarily without having to rebind the policy to the table later: dbms_rls.enable_policy( object_schema => HR, object_name => EMPLOYEES, policy_name => EMP_SELECT_RESTRICT, enable => FALSE ); If multiple policies are specified for the same object, an AND condition is added between each predicate. If you need to have an OR condition between predicates for multiple policies instead, the policy most likely needs to be revised. The logic for each policy needs to be combined within a single policy with an OR condition between each part of the predicate. Creating a VPD In this section, we’ll step through a complete implementation of a VPD from beginning to end. This example relies on the sample schemas installed with Oracle Database 10g and 11g. To be specific, we are going to implement an FGAC policy on the HR.EMPLOYEES table to restrict access based on manager status and the employee’s department number. If you are an employee, you can see your own row in HR.EMPLOYEES; if you are a manager, you can see the rows for all the employees who report directly to you. TIP If you do not have the sample schemas installed in your database, you can create them using the scripts found in $ORACLE_HOME/demo/ schema.
- Chapter 9: Database Security and Auditing 321 Once the sample schemas are in place, we need to create some users in the database whowant to see rows from the table HR.EMPLOYEES.create user smavris identified by smavris702;grant connect, resource to smavris;create user dgrant identified by dgrant507;grant connect, resource to dgrant;create user kmourgos identified by kmourgos622;grant connect, resource to kmourgos;The user KMOURGOS is the manager for all the stocking clerks, and DGRANT is one ofKMOURGOS’s employees. The user SMAVRIS is the HR_REP for the company. In the following three steps, we will grant SELECT privileges on the HR.EMPLOYEES table toeveryone in the database, and we will create a lookup table that maps employee ID numbers totheir database account. The procedure that sets the context variables for the user session will usethis table to assign the employee ID number to the context variable that will be used in the policyfunction to generate the predicate.grant select on hr.employees to public;create table hr.emp_login_map (employee_id, login_acct) as select employee_id, email from hr.employees;grant select on hr.emp_login_map to public; Next, we will create a user account called VPD that has the privileges to create contexts andmaintains the policy functions:create user vpd identified by vpd439;grant connect, resource, create any context, create public synonym to vpd; Connecting to the VPD schema, we will create a context called HR_SECURITY and define thepackage and procedure used to set the context for the application:connect vpd/vpd439@dw;create context hr_security using vpd.emp_access;create or replace package vpd.emp_access as procedure set_security_parameters;end; Remember that the procedures in the package VPD.EMP_ACCESS are the only proceduresthat can set the context variables. The package body for VPD.EMP_ACCESS follows:create or replace package body vpd.emp_access is---- At user login, run set_security_parameters to-- retrieve the user login name, which corresponds to the EMAIL-- column in the table HR.EMPLOYEES.
- 322 Oracle Database 11g DBA Handbook -- -- context USERENV is pre-defined for user characteristics such -- as username, IP address from which the connection is made, -- and so forth. -- -- for this procedure, we are only using SESSION_USER -- from the USERENV context. -- procedure set_security_parameters is emp_id_num number; emp_login varchar2(50); begin -- database username corresponds to email address in HR.EMPLOYEES emp_login := sys_context(USERENV,SESSION_USER); dbms_session.set_context(HR_SECURITY,USERNAME,emp_login); -- get employee id number, so manager rights can be established -- but dont bomb out other DB users who are not in the -- EMPLOYEES table begin select employee_id into emp_id_num from hr.emp_login_map where login_acct = emp_login; dbms_session.set_context(HR_SECURITY,EMP_ID,emp_id_num); exception when no_data_found then dbms_session.set_context(HR_SECURITY,EMP_ID,0); end; -- Future queries will restrict rows based on emp_id end; -- procedure end; -- package body A few things are worth noting about this procedure. We retrieve the user’s schema by looking in the USERENV context, which is enabled by default for all users, and assigning it to the variable USERNAME in the newly created context HR_SECURITY. The other HR_SECURITY context variable EMP_ID is determined by doing a lookup in the mapping table HR.EMP_LOGIN_MAP. We don’t want the procedure to terminate with an error if the logged-in user is not in the mapping table; instead, we assign an EMP_ID of 0, which will result in no access to the table HR.EMPLOYEES when the predicate is generated in the policy function. In the next steps, we grant everyone in the database EXECUTE privileges on the package, and we create a synonym for it to save a few keystrokes any time we need to call it: grant execute on vpd.emp_access to PUBLIC; create public synonym emp_access for vpd.emp_access;
- Chapter 9: Database Security and Auditing 323 To ensure that the context is defined for each user when they log on, we will connect asSYSTEM and create a logon trigger to set up the variables in the context:connect system/nolongermanager@dw as sysdba;create or replace trigger vpd.set_security_parameters after logon on databasebegin vpd.emp_access.set_security_parameters;end;Because this trigger is fired for every user who connects to the database, it is vitally important thatthe code be tested for every class of user, if not every user in the database! If the trigger fails withan error, regular users cannot log in. So far, we have our context defined, the procedure used to set up the context variables, and atrigger that automatically calls the procedure. Logging in as one of our three users defined previously,we can query the contents of the context:SQL> connect smavris/smavris702@dwConnected.SQL> select * from session_context;NAMESPACE ATTRIBUTE VALUE------------------------ ------------------------- ---------------------HR_SECURITY USERNAME SMAVRISHR_SECURITY EMP_ID 2032 rows selected. Notice what happens when SMAVRIS tries to impersonate another employee:SQL> begin 2 dbms_session.set_context(HR_SECURITY,EMP_ID,100); 3 end;begin*ERROR at line 1:ORA-01031: insufficient privilegesORA-06512: at "SYS.DBMS_SESSION", line 94ORA-06512: at line 2Only the package VPD.EMP_ACCESS is allowed to set or change variables in the context. The final steps include defining the procedures that will generate the predicate and assigningone or more of these procedures to the HR.EMPLOYEES table. As the user VPD, which alreadyowns the context procedures, we’ll set up the package that determines the predicates:connect vpd/vpd439@dw;create or replace package vpd.get_predicates as -- note -- security function ALWAYS has two parameters,
- 324 Oracle Database 11g DBA Handbook -- table owner name and table name function emp_select_restrict (owner varchar2, object_name varchar2) return varchar2; -- other functions can be written here for INSERT, DELETE, and so forth. end get_predicates; create or replace package body vpd.get_predicates is function emp_select_restrict (owner varchar2, object_name varchar2) return varchar2 is ret_predicate varchar2(1000); -- part of WHERE clause begin -- only allow employee to see their row or immediate subordinates ret_predicate := EMPLOYEE_ID = || sys_context(HR_SECURITY,EMP_ID) || OR MANAGER_ID = || sys_context(HR_SECURITY,EMP_ID); return ret_predicate; end emp_select_restrict; end; -- package body Once we attach the function to a table with DBMS_RLS, it will generate a text string that can be used in a WHERE clause every time the table is accessed. The string will always look something like this: EMPLOYEE_ID = 124 OR MANAGER_ID = 124 As with the packages that set up the context environment, we need to allow users access to this package: grant execute on vpd.get_predicates to PUBLIC; create public synonym get_predicates for vpd.get_predicates; Last, but certainly not least, we will attach the policy function to the table using the DBMS_ RLS.ADD_POLICY procedure: dbms_rls.add_policy ( object_schema => HR, object_name => EMPLOYEES, policy_name => EMP_SELECT_RESTRICT, function_schema => VPD, policy_function => get_predicates.emp_select_restrict, statement_types => SELECT, update_check => TRUE, enable => TRUE );
- Chapter 9: Database Security and Auditing 325 An employee can access the HR.EMPLOYEES table as before, but they will only see their rowand the rows of the employees who work for them, if any. Logging in as KMOURGOS, we try toretrieve all the rows of the HR.EMPLOYEES table, but we only see KMOURGOS and the employeeswho report directly to him:SQL> connect kmourgos/kmourgos622@dw;Connected.SQL> select employee_id, first_name, last_name, 2 email, job_id, salary, manager_id from hr.employees;EMPLOYEE_ID FIRST_NAME LAST_NAME EMAIL JOB_ID SALARY MANAGER_ID----------- ---------- ----------- ---------- ---------- ------- ---------- 124 Kevin Mourgos KMOURGOS ST_MAN 5800 100 141 Trenna Rajs TRAJS ST_CLERK 3500 124 142 Curtis Davies CDAVIES ST_CLERK 3100 124 143 Randall Matos RMATOS ST_CLERK 2600 124 144 Peter Vargas PVARGAS ST_CLERK 2500 124 196 Alana Walsh AWALSH SH_CLERK 3100 124 197 Kevin Feeney KFEENEY SH_CLERK 3000 124 198 Donald OConnell DOCONNEL SH_CLERK 2600 124 199 Douglas Grant DGRANT SH_CLERK 2600 1249 rows selected. For the user DGRANT, it’s a different story:SQL> connect dgrant/dgrant507@dw;Connected.SQL> select employee_id, first_name, last_name, 2 email, job_id, salary, manager_id from hr.employees;EMPLOYEE_ID FIRST_NAME LAST_NAME EMAIL JOB_ID SALARY MANAGER_ID----------- ---------- ----------- ---------- ---------- ------- ---------- 199 Douglas Grant DGRANT SH_CLERK 2600 1241 row selected.DGRANT gets to see only his own row, because he does not manage anyone else in the company. In the case of SMAVRIS, we see similar results from the query:SQL> connect smavris/smavris702@dw;Connected.SQL> select employee_id, first_name, last_name, 2 email, job_id, salary, manager_id from hr.employees;EMPLOYEE_ID FIRST_NAME LAST_NAME EMAIL JOB_ID SALARY MANAGER_ID----------- ---------- ------------ ---------- ---------- ------- ---------- 203 Susan Mavris SMAVRIS HR_REP 6500 1011 row selected. But wait, SMAVRIS is in the HR department and should be able to see all rows from the table.In addition, SMAVRIS should be the only person to see the salary information for all employees.
- 326 Oracle Database 11g DBA Handbook As a result, we need to change our policy function to give SMAVRIS and other employees in the HR department full access to the HR.EMPLOYEES table; in addition, we can use column-level restrictions in the policy assignment to return the same number of rows, but with the sensitive data returned as NULL values. To facilitate access to the HR.EMPLOYEES table by HR department employees, we first need to change our mapping table to include the JOB_ID column. If the JOB_ID column has a value of HR_REP, the employee is in the HR department. We will first disable the policy in effect and create the new mapping table: SQL> begin 2 dbms_rls.enable_policy( 3 object_schema => HR, 4 object_name => EMPLOYEES, 5 policy_name => EMP_SELECT_RESTRICT, 6 enable => FALSE 7 ); 8 end; PL/SQL procedure successfully completed. SQL> drop table hr.emp_login_map; Table dropped. SQL> create table hr.emp_login_map (employee_id, login_acct, job_id) 2 as select employee_id, email, job_id from hr.employees; Table created. SQL> grant select on hr.emp_login_map to public; Grant succeeded. The procedure we’re using to set up the context variables, VPD.EMP_ACCESS, needs another context variable added that indicates the security level of the user accessing the table. We will change the SELECT statement and make another call to DBMS_SESSION.SET_CONTEXT, as follows: . . . emp_job_id varchar2(50); . . . select employee_id, job_id into emp_id_num, emp_job_id from hr.emp_login_map where login_acct = emp_login; dbms_session.set_context(HR_SECURITY,SEC_LEVEL, case emp_job_id when HR_REP then HIGH else NORMAL end ); . . . Whenever the employee has a job title of HR_REP, the context variable SEC_LEVEL is set to HIGH instead of NORMAL. In our policy function, we need to check for this new condition as follows: create or replace package body vpd.get_predicates is function emp_select_restrict
- Chapter 9: Database Security and Auditing 327 (owner varchar2, object_name varchar2) return varchar2 is ret_predicate varchar2(1000); -- part of WHERE clause begin -- only allow employee to see their row or immediate subordinates, -- unless they have high security clearance if sys_context(HR_SECURITY,SEC_LEVEL) = HIGH then ret_predicate := ; -- no restrictions in WHERE clause else ret_predicate := EMPLOYEE_ID = || sys_context(HR_SECURITY,EMP_ID) || OR MANAGER_ID = || sys_context(HR_SECURITY,EMP_ID); end if; return ret_predicate; end emp_select_restrict;end; -- package body Because the policy is dynamic, the predicate is generated each time a SELECT statement isexecuted, so we don’t have to do a policy refresh. When the user SMAVRIS, the HR representative,runs the query now, she sees all rows in the HR.EMPLOYEES table:SQL> connect smavris/smavris702@dw;Connected.SQL> select employee_id, first_name, last_name, 2 email, job_id, salary, manager_id from hr.employees;EMPLOYEE_ID FIRST_NAME LAST_NAME EMAIL JOB_ID SALARY MANAGER_ID----------- ----------- ----------- ---------- ---------- ------- ---------- 100 Steven King SKING AD_PRES 24000 101 Neena Kochhar NKOCHHAR AD_VP 17000 100. . . 204 Hermann Baer HBAER PR_REP 10000 101 205 Shelley Higgins SHIGGINS AC_MGR 12000 101 206 William Gietz WGIETZ AC_ACCOUNT 8300 205107 rows selected. As you might expect, SMAVRIS’s security level within the HR_SECURITY context is HIGH:SQL> connect smavris/smavris702Connected.SQL> select sys_context(HR_SECURITY,SEC_LEVEL) from dual;SYS_CONTEXT(HR_SECURITY,SEC_LEVEL)--------------------------------------------------------------HIGHSQL>
- 328 Oracle Database 11g DBA Handbook However, DGRANT can still only see his row in the table because his security level within the HR_SECURITY context is NORMAL: SQL> connect dgrant/dgrant507@dw; Connected. SQL> select employee_id, first_name, last_name, 2 email, job_id, salary, manager_id from hr.employees; EMPLOYEE_ID FIRST_NAME LAST_NAME EMAIL JOB_ID SALARY MANAGER_ID ----------- ---------- ----------- ---------- ---------- ------- ---------- 199 Douglas Grant DGRANT SH_CLERK 2600 124 1 row selected. SQL> select sys_context(HR_SECURITY,SEC_LEVEL) from dual; SYS_CONTEXT(HR_SECURITY,SEC_LEVEL) -------------------------------------------------------------- NORMAL To enforce the requirement that only HR employees can see salary information, we would need to make a slight change to the policy function and enable the policy with column-level restrictions: dbms_rls.add_policy ( object_schema => HR, object_name => EMPLOYEES, policy_name => EMP_SELECT_RESTRICT, function_schema => VPD, policy_function => get_predicates.emp_select_restrict, statement_types => SELECT, update_check => TRUE, enable => TRUE, sec_relevant_cols => SALARY, sec_relevant_cols_opt => dbms_rls.all_rows ); The last parameter, SEC_RELEVANT_COLS_OPT, specifies the package constant DBMS_RLS. ALL_ROWS to indicate that we still want to see all rows in our query results, but with the relevant columns (in this case SALARY) returning NULL values. Otherwise, we would not see any rows from queries that contain the SALARY column. Debugging a VPD Policy Even if you’re not getting an “ORA-28113: policy predicate has error” or an “ORA-00936: missing expression,” it can be very useful to see the actual predicate being generated at statement parse time. There are a couple of ways to debug your predicates, both have their advantages and disadvantages. The first method uses the dynamic performance views V$SQLAREA and V$VPD_POLICY. As the names imply, V$SQLAREA contains the SQL statements currently in the shared pool, along with current execution statistics. The view V$VPD_POLICY lists all the policies currently being
- Chapter 9: Database Security and Auditing 329enforced in the database, along with the predicate. Joining the two tables, as in the followingexample, gives us the information we need to help debug any problems we’re having with thequery results:SQL> select s.sql_text, v.object_name, v.policy, v.predicate 2 from v$sqlarea s, v$vpd_policy v 3 where s.hash_value = v.sql_hash;SQL_TEXT OBJECT_NAM POLICY PREDICATE------------------------- ---------- ------------------- -------------------select employee_id, first EMPLOYEES EMP_SELECT_RESTRICT EMPLOYEE_ID = 199_name, last_name, email, OR MANAGER_ID = 199job_id, salary, manager_id from hr.employeesselect employee_id, first EMPLOYEES EMP_SELECT_RESTRICT_name, last_name, email,job_id, salary, manager_id from hr.employeesSQL> If we add a join to V$SESSION in this query, we can identify which user was running the SQL.This is especially important in the second SQL statement: there is no predicate applied to the SQLstatement; therefore, all we can infer is that one of the HR employees ran the query. There is adownside to this method: If the database is extremely busy, the SQL commands may be flushed fromthe shared pool for other SQL commands before you get a chance to run this query. The other method uses the alter session command to generate a plain-text trace file containingmuch of the information from the previous query. Here are the commands to set up tracing:SQL> begin 2 dbms_rls.refresh_policy; 3 end;PL/SQL procedure successfully completed.SQL> alter session set events 10730 trace name context forever, level 12;Session altered. Event 10730 is defined for tracing RLS policy predicates. Other common events that can betraced are 10029 and 10030 for session logon/logoff, 10710 to trace bitmap index access, and10253 for simulating write errors to the redo log, among others. Once the session is altered, theuser DGRANT runs his query:SQL> select employee_id, first_name, last_name, 2 email, job_id, salary, manager_id from hr.employees;EMPLOYEE_ID FIRST_NAME LAST_NAME EMAIL JOB_ID SALARY MANAGER_ID----------- ----------- ----------- ---------- ---------- ------- ---------- 199 Douglas Grant DGRANT SH_CLERK 2600 1241 row selected.
- 330 Oracle Database 11g DBA Handbook Here’s a look at the bottom part of the trace file located in the directory specified by the initialization parameter USER_DUMP_DEST (DIAGNOSTIC_DEST in Oracle Database 11g): Trace file /u01/app/oracle/diag/rdbms/dw/dw/trace/dw_ora_31128.trc Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 – Production With the Partitioning, OLAP, Data Mining and Real Application Testing options ORACLE_HOME = /u01/app/oracle/product/11.1.0/db_1 System name: Linux Node name: dw Release: 2.6.9-55.0.2.0.1.EL Version: #1 Mon Jun 25 14:24:38 PDT 2007 Machine: i686 Instance name: dw Redo thread mounted by this instance: 1 Oracle process number: 40 Unix process pid: 31128, image: oracle@dw (TNS V1-V3) *** 2007-08-12 12:48:37.852 *** SESSION ID:(120.9389) 2007-08-12 12:48:37.852 *** CLIENT ID:() 2007-08-12 12:48:37.852 *** SERVICE NAME:(SYS$USERS) 2007-08-12 12:48:37.852 *** MODULE NAME:(SQL*Plus) 2007-08-12 12:48:37.852 *** ACTION NAME:() 2007-08-12 12:48:37.852 ------------------------------------------------------------- Logon user : DGRANT Table/View : HR.EMPLOYEES Policy name : EMP_SELECT_RESTRICT Policy function: VPD.GET_PREDICATES.EMP_SELECT_RESTRICT RLS view : SELECT "EMPLOYEE_ID","FIRST_NAME","LAST_NAME", "EMAIL","PHONE_NUMBER", "HIRE_DATE","JOB_ID","SALARY","COMMISSION_PCT","MANAGER_ID", "DEPARTMENT_ID" FROM "HR"."EMPLOYEES" "EMPLOYEES" WHERE (EMPLOYEE_ID = 199 OR MANAGER_ID = 199) ------------------------------------------------------------- The user’s original SQL statement plus the appended predicate are clearly shown in the trace file. The downside to using this method is that while a user may be able to access dynamic performance views, a developer might not normally have access to the user dump directory on the server itself. As a result, the DBA may need to be involved when trying to debug predicate problems. Be sure to turn off tracing when you’re done debugging to reduce the overhead and disk space associated with tracing operations (or just log off!): SQL> alter session set events 10730 trace name context off; Session altered.
- Chapter 9: Database Security and Auditing 331 Auditing Type Description Statement auditing Audits SQL statements by the type of statement regardless of the specific schema objects being accessed. One or more users can also be specified in the database to be audited for a particular statement. Privilege auditing Audits system privileges, such as CREATE TABLE or ALTER INDEX. As with statement auditing, privilege auditing can specify one or more particular users as the target of the audit. Schema object auditing Audits specific statements operating on a specific schema object (for example, UPDATE statements on the DEPARTMENTS table). Schema object auditing always applies to all users in the database. Fine-grained auditing Audits table access and privileges based on the content of the objects being accessed. Uses the package DBMS_FGA to set up a policy on a particular table.TABLE 9-16 Auditing TypesAuditingOracle uses a number of different auditing methods to monitor what kinds of privileges are beingused as well as what objects are being accessed. Auditing does not prevent the use of theseprivileges, but it can provide useful information to uncover abuse or misuse of privileges. In Table 9-16, we summarize the different types of auditing in an Oracle database. In the next few sections, we’ll review how a DBA can manage audits of both system andobject privilege use. When the granularity is required, a DBA can use fine-grained auditing tomonitor access to certain rows or columns of a table, not just whether the table was accessed.Auditing LocationsAudit records can be sent to either the SYS.AUD$ database table or an operating system file.To enable auditing and specify the location where audit records are recorded, the initializationparameter AUDIT_TRAIL is set to one of the following values:Parameter Value ActionNONE, FALSE Disable auditing.OS Enable auditing. Send audit records to an operating system file.DB, TRUE Enable auditing. Send audit records to the SYS.AUD$ table.DB_EXTENDED Enable auditing. Send audit records to the SYS.AUD$ table, and record additional information in the CLOB columns SQLBIND and SQLTEXTXML Enable auditing and write all audit records in XML format.EXTENDED Enable auditing and record all columns in the audit trail, including SqlText and SqlBind values.
- 332 Oracle Database 11g DBA Handbook The parameter AUDIT_TRAIL is not dynamic; the database must be shut down and restarted for a change in the AUDIT_TRAIL parameter to take effect. When auditing to the SYS.AUD$ table, the size of the table should be carefully monitored so as not to impact the space requirements for other objects in the SYS tablespace. It is recommended that the rows in SYS.AUD$ be periodically archived and the table truncated. Oracle provides the role DELETE_CATALOG_ROLE to use with a special account in a batch job to archive and truncate the audit table. Statement Auditing All types of auditing use the audit command to turn on auditing and noaudit to turn off auditing. For statement auditing, the format of the audit command looks something like the following: AUDIT sql_statement_clause BY {SESSION | ACCESS} WHENEVER [NOT] SUCCESSFUL; The sql_statement_clause contains a number of different pieces of information, such as the type of SQL statement we want to audit and who we are auditing. In addition, we want to either audit the action every time it happens (by access) or only once (by session). The default is by session. Sometimes we want to audit successful actions—statements that did not generate an error message. For these statements, we add whenever successful. Other times we only care if the commands using the audited statements fail, either due to privilege violations, running out of space in the tablespace, or syntax errors. For these we use whenever not successful. For most categories of auditing methods, we can specify all instead of individual statement types or objects if we truly want all types of access to a table or any privileges by a certain user to be audited. The types of statements we can audit, with a brief description of what statements are covered in each category, are listed in Table 9-17. If all is specified, any statement in this list is audited. However, the types of statements in Table 9-18 do not fall into the all category when enabling auditing; they must be explicitly specified in any audit commands. Some examples will help make all these options a lot clearer. In our sample database, the user KSHELTON has privileges on all of the tables in the HR schema and other schemas. KSHELTON is allowed to create indexes on some of these tables, but we want to know when the indexes are created in case we have some performance issues related to execution plans changing. We can audit index creation by KSHELTON with the following command: SQL> audit index by kshelton; Audit succeeded. Later that day, KSHELTON creates an index on the HR.JOBS table: SQL> create index job_title_idx on hr.jobs(job_title); Index created.
- Chapter 9: Database Security and Auditing 333 Statement Option SQL Operations ALTER SYSTEM All ALTER SYSTEM options such as dynamically altering instance parameters, switching to the next log file group, and terminating user sessions. CLUSTER CREATE, ALTER, DROP, or TRUNCATE a cluster. CONTEXT CREATE or DROP a CONTEXT. DATABASE LINK CREATE or DROP a database link. DIMENSION CREATE, ALTER, or DROP a dimension. DIRECTORY CREATE or DROP a dimension. INDEX CREATE, ALTER, or DROP an index. MATERIALIZED VIEW CREATE, ALTER, or DROP a materialized view. NOT EXISTS Failure of SQL statement due to nonexistent referenced objects. PROCEDURE CREATE or DROP FUNCTION, LIBRARY, PACKAGE, PACKAGE BODY, or PROCEDURE. PROFILE CREATE, ALTER, or DROP a profile. PUBLIC DATABASE LINK CREATE or DROP a public database link. PUBLIC SYNONYM CREATE or DROP a public synonym. ROLE CREATE, ALTER, DROP, or SET a role. ROLLBACK SEGMENT CREATE, ALTER, or DROP a rollback segment. SEQUENCE CREATE or DROP a sequence. SESSION Logons and logoffs. SYNONYM CREATE or DROP synonyms. SYSTEM AUDIT AUDIT or NOAUDIT of system privileges. SYSTEM GRANT GRANT or REVOKE system privileges and roles. TABLE CREATE, DROP, or TRUNCATE a table. TABLESPACE CREATE, ALTER, or DROP a tablespace. TRIGGER CREATE, ALTER (enable/disable), DROP triggers; ALTER TABLE with either ENABLE ALL TRIGGERS or DISABLE ALL TRIGGERS. TYPE CREATE, ALTER and DROP types and type bodies. USER CREATE, ALTER or DROP a user. VIEW CREATE or DROP a view.TABLE 9-17 Auditable Statements Included in the ALL Category
- 334 Oracle Database 11g DBA Handbook Statement Option SQL Operations ALTER SEQUENCE Any ALTER SEQUENCE command. ALTER TABLE Any ALTER TABLE command. COMMENT TABLE Add a comment to a table, view, materialized view, or any of their columns. DELETE TABLE Delete rows from a table or view. EXECUTE Execute a procedure, function, or any variables or cursors within a PROCEDURE package. GRANT GRANT or REVOKE a privilege on a DIRECTORY object. DIRECTORY GRANT GRANT or REVOKE a privilege on a procedure, function, or package. PROCEDURE GRANT GRANT or REVOKE a privilege on a sequence. SEQUENCE GRANT TABLE GRANT or REVOKE a privilege on a table, view, or materialized view. GRANT TYPE GRANT or REVOKE a privilege on a TYPE. INSERT TABLE INSERT INTO a table or view. LOCK TABLE LOCK TABLE command on a table or view. SELECT SEQUENCE Any command referencing the sequence’s CURRVAL or NEXTVAL. SELECT TABLE SELECT FROM a table, view, or materialized view. UPDATE TABLE Execute UPDATE on a table or view. TABLE 9-18 Explicitly Specified Statement Types Checking the audit trail in the data dictionary view DBA_AUDIT_TRAIL, we see that KSHELTON did indeed create an index at 5:15 P.M. on August 12th: SQL> select username, to_char(timestamp,MM/DD/YY HH24:MI) Timestamp, 2 obj_name, action_name, sql_text from dba_audit_trail 3 where username = KSHELTON; USERNAME TIMESTAMP OBJ_NAME ACTION_NAME SQL_TEXT ---------- -------------- ---------------- ---------------- ---------------- KSHELTON 08/12/07 17:15 JOB_TITLE_IDX CREATE INDEX create index hr. job_title_idx on hr.jobs(job_title) 1 row selected.
- Chapter 9: Database Security and Auditing 335 NOTE Starting with Oracle Database 11g, the columns SQL_TEXT and SQL_ BIND in DBA_AUDIT_TRAIL are populated only if the initialization parameter AUDIT_TRAIL is set to DB_EXTENDED. By default, the value of AUDIT_TRAIL is DB. To turn off auditing for KSHELTON on the HR.JOBS table, we use the noaudit command, asfollows:SQL> noaudit index by kshelton;Noaudit succeeded. We also may wish to routinely audit both successful and unsuccessful logins. This requirestwo audit commands:SQL> audit session whenever successful;Audit succeeded.SQL> audit session whenever not successful;Audit succeeded. Reviewing the audit trail reveals one failed login attempt by the user RJB on August 10th:SQL> select username, to_char(timestamp,MM/DD/YY HH24:MI) Timestamp, 2 obj_name, returncode, action_name, sql_text from dba_audit_trail 3 where action_name in (LOGON,LOGOFF) 4 and username in (SCOTT,RJB,KSHELTON) 5 order by timestamp desc;USERNAME TIMESTAMP OBJ_NAME RETURNCODE ACTION_NAME SQL_TEXT---------- -------------- ---------- ---------- ---------------- ----------KSHELTON 08/12/07 17:04 0 LOGONSCOTT 08/12/07 16:10 0 LOGOFFRJB 08/12/07 11:35 0 LOGONRJB 08/12/07 11:35 0 LOGONRJB 08/11/07 22:51 0 LOGONRJB 08/11/07 22:51 0 LOGOFFRJB 08/11/07 21:55 0 LOGOFFRJB 08/11/07 21:40 0 LOGOFFRJB 08/10/07 22:52 0 LOGOFFRJB 08/10/07 22:52 0 LOGOFFRJB 08/10/07 22:52 1017 LOGONRJB 08/10/07 12:23 0 LOGOFFSCOTT 08/03/07 04:18 0 LOGOFF13 rows selected.The RETURNCODE represents the ORA error message. An ORA-1017 message indicates that anincorrect password was entered. Note that if we are just interested in logons and logoffs, we coulduse the DBA_AUDIT_SESSION view instead.
- 336 Oracle Database 11g DBA Handbook Statement auditing also includes startup and shutdown operations. Although we can audit the command shutdown immediate in the SYS.AUD$ table, it is not possible to audit the startup command in SYS.AUD$ because the database has to be started before rows can be added to this table. For these cases, we can look in the directory specified in the initialization parameter AUDIT_FILE_DEST to see a record of a startup operation performed by a system administrator (by default this parameter contains $ORACLE_HOME/admin/dw/adump). Here is a text file created when the database was started with the startup command: Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 – Production With the Partitioning, OLAP, Data Mining and Real Application Testing options ORACLE_HOME = /u01/app/oracle/product/11.1.0/db_1 System name: Linux Node name: dw Release: 2.6.9-55.0.2.0.1.EL Version: #1 Mon Jun 25 14:24:38 PDT 2007 Machine: i686 Instance name: dw Redo thread mounted by this instance: 1 Oracle process number: 44 Unix process pid: 28962, image: oracle@dw (TNS V1-V3) Sun Aug 12 11:57:36 2007 ACTION : CONNECT DATABASE USER: / PRIVILEGE : SYSDBA CLIENT USER: oracle CLIENT TERMINAL: pts/2 STATUS: 0 In this example, the database was started by a user connected as oracle on the host system and connected to the instance with operating system authentication. We will cover additional system administrator auditing issues in the next section. Privilege Auditing Auditing system privileges has the same basic syntax as statement auditing, except that system privileges are specified in the sql_statement_clause instead of statements. For example, we may wish to grant the ALTER TABLESPACE privilege to all our DBAs, but we want to generate an audit record when this happens. The command to enable auditing on this privilege looks similar to statement auditing: SQL> audit alter tablespace by access whenever successful; Audit succeeded. Every time the ALTER TABLESPACE privilege is successfully used, a row is added to SYS.AUD$. Special auditing is available for system administrators who use the SYSDBA and SYSOPER privileges or connect with the SYS user. To enable this extra level of auditing, set the initialization parameter AUDIT_SYS_OPERATIONS to TRUE. The audit records are sent to the same location as the operating system audit records; therefore, this location is operating system dependent. All SQL statements executed while using one of these privileges, as well as any SQL statements executed as the user SYS, are sent to the operating system audit location.
- Chapter 9: Database Security and Auditing 337Schema Object AuditingAuditing access to various schema objects looks similar to statement and privilege auditing:AUDIT schema_object_clause BY {SESSION | ACCESS} WHENEVER [NOT] SUCCESSFUL; The schema_object_clause specifies a type of object access and the object being accessed.Fourteen different types of operations on specific objects can be audited; they are listed inTable 9-19. If we wish to audit all insert and update commands on the HR.JOBS table, regardless of whois doing the update, and every time the action occurs, we can use the audit command as follows:SQL> audit insert, update on hr.jobs by access whenever successful;Audit successful. The user KSHELTON decides to add two new rows to the HR.JOBS table:SQL> insert into hr.jobs (job_id, job_title, min_salary, max_salary) 2 values (IN_CFO,Internet Chief Fun Officer, 7500, 50000);1 row created.SQL> insert into hr.jobs (job_id, job_title, min_salary, max_salary) 2 values (OE_VLD,Order Entry CC Validation, 5500, 20000);1 row created. Object Option Description ALTER Alters a table, sequence, or materialized view AUDIT Audits commands on any object COMMENT Adds comments to tables, views, or materialized views DELETE Deletes rows from a table, view, or materialized view EXECUTE Executes a procedure, function, or package FLASHBACK Performs flashback operation on a table or view GRANT Grants privileges on any type of object INDEX Creates an index on a table or materialized view INSERT Inserts rows into a table, view, or materialized view LOCK Locks a table, view, or materialized view READ Performs a read operation on the contents of a DIRECTORY object RENAME Renames a table, view, or procedure SELECT Selects rows from a table, view, sequence, or materialized view UPDATE Updates a table, view, or materialized viewTABLE 9-19 Object Auditing Options
- 338 Oracle Database 11g DBA Handbook Looking in the DBA_AUDIT_TRAIL view, we see the two insert commands in KSHELTON’s session: USERNAME TIMESTAMP OWNER OBJ_NAME ACTION_NAME SQL_TEXT ---------- -------------- -------- ---------- --------------- --------------------------------------------------------------- KSHELTON 08/12/07 22:54 HR JOBS INSERT insert into hr.jobs (job_id, job_title, min_salary, max_salary) values (IN_CFO,Internet Chief Fun Officer, 7500, 50000); KSHELTON 08/12/07 22:53 HR JOBS INSERT insert into hr.jobs (job_id, job_title, min_salary, max_salary) values (OE_VLD,Order Entry CC Validation, 5500, 20000); KSHELTON 08/12/07 22:51 LOGON 3 rows selected. Fine-Grained Auditing Starting with Oracle9i, auditing became much more focused and precise with the introduction of fine-grained object auditing, or FGA. FGA is implemented by a PL/SQL package called DBMS_FGA. With standard auditing, you can easily find out what objects were accessed and by whom, but you don’t know which columns or rows were accessed. Fine-grained auditing addresses this problem by not only specifying a predicate, or where clause, for which rows need to be accessed, but also by specifying a column or columns in the table being accessed. This can dramatically reduce the number of audit table entries by only auditing access to the table if it accesses certain rows and columns. The package DBMS_FGA has four procedures: ADD_POLICY Adds an audit policy using a predicate and audit column DROP_POLICY Drops the audit policy DISABLE_POLICY Disables the audit policy but keeps the policy associated with the table or view ENABLE_POLICY Enables a policy The user TAMARA usually accesses the HR.EMPLOYEES table on a daily basis to look up employee e-mail addresses. The system administrators suspect that TAMARA is viewing salary information for managers, so they set up an FGA policy to audit any access to the SALARY column for anyone who is a manager: begin dbms_fga.add_policy( object_schema => HR, object_name => EMPLOYEES, policy_name => SAL_SELECT_AUDIT, audit_condition => instr(job_id,_MAN) > 0, audit_column => SALARY ); end;
- Chapter 9: Database Security and Auditing 339 Audit records for fine-grained auditing can be accessed with the data dictionary view DBA_FGA_AUDIT_TRAIL. If you typically need to see both standard audit rows and fine-grainedauditing rows, the data dictionary view DBA_COMMON_AUDIT_TRAIL combines rows fromboth types of audits. To continue our example, the user TAMARA runs two SQL queries as follows:SQL> select employee_id, first_name, last_name, email from hr.employees 2 where employee_id = 114;EMPLOYEE_ID FIRST_NAME LAST_NAME EMAIL----------- -------------------- ------------------------- -------------- 114 Den Raphaely DRAPHEAL1 row selected.SQL> select employee_id, first_name, last_name, salary from hr.employees 2 where employee_id = 114;EMPLOYEE_ID FIRST_NAME LAST_NAME SALARY----------- -------------------- ------------------------- ---------- 114 Den Raphaely 110001 row selected. The first query accesses a manager, but not the SALARY column. The second query is thesame as the first, but does access the SALARY column and therefore triggers the FGA policy, thusgenerating one, and only one, row in the audit trail:SQL> select to_char(timestamp,mm/dd/yy hh24:mi) timestamp, 2 object_schema, object_name, policy_name, statement_type 3 from dba_fga_audit_trail 4 where db_user = TAMARA;TIMESTAMP OBJECT_SCHEMA OBJECT_NAME POLICY_NAME STATEMENT_TYPE-------------- -------------- -------------- ---------------- --------------08/12/07 18:07 HR EMPLOYEES SAL_SELECT_AUDIT SELECT1 row selected. Because we set up fine-grained access control in our VPD example earlier in this chapter toprevent unauthorized use of the SALARY column, we need to double-check our policy functionsto make sure that SALARY information is still being restricted correctly. Fine-grained auditing,along with standard auditing, is a good way to ensure that our authorization policies are set upcorrectly in the first place.Auditing-Related Data Dictionary ViewsTable 9-20 contains the data dictionary views related to auditing.
- 340 Oracle Database 11g DBA Handbook Data Dictionary View Description AUDIT_ACTIONS Contains descriptions for audit trail action type codes, such as INSERT, DROP VIEW, DELETE, LOGON, and LOCK. DBA_AUDIT_OBJECT Audit trail records related to objects in the database. DBA_AUDIT_POLICIES Fine-grained auditing policies in the database. DBA_AUDIT_SESSION All audit trail records related to CONNECT and DISCONNECT. DBA_AUDIT_STATEMENT Audit trail entries related to GRANT, REVOKE, AUDIT, NOAUDIT, and ALTER SYSTEM commands. DBA_AUDIT_TRAIL Contains standard audit trail entries. USER_AUDIT_TRAIL contains audit rows for connected user only. DBA_FGA_AUDIT_TRAIL Audit trail entries for fine-grained auditing policies. DBA_COMMON_AUDIT_TRAIL Combines standard and fine-grained auditing rows into one view. DBA_OBJ_AUDIT_OPTS Auditing options in effect for database objects. DBA_PRIV_AUDIT_OPTS Auditing options in effect for system privileges. DBA_STMT_AUDIT_OPTS Auditing options in effect for statements. TABLE 9-20 Auditing-Related Data Dictionary Views Protecting the Audit Trail The audit trail itself needs to be protected, especially if non-system users must access the table SYS.AUD$. The built-in role DELETE_ANY_CATALOG is one of the ways that non-SYS users can have access to the audit trail (for example, to archive and truncate the audit trail to ensure that it does not impact the space requirements for other objects in the SYS tablespace). To set up auditing on the audit trail itself, connect as SYSDBA and run the following command: SQL> audit all on sys.aud$ by access; Audit succeeded. Now, all actions against the table SYS.AUD$, including select, insert, update, and delete, will be recorded in SYS.AUD$ itself. But, you may ask, what if someone deletes the audit records identifying access to the table SYS.AUD$? The rows in the table are deleted, but then another row is inserted, recording the deletion of the rows. Therefore, there will always be some evidence of activity, intentional or accidental, against the SYS.AUD$ table. In addition, if AUDIT_SYS_ OPERATIONS is set to true, any sessions using as sysdba, as sysoper, or connecting as SYS itself will be logged in the operating system audit location, which presumably even the Oracle DBAs would not have access to. As a result, we have many safeguards in place to ensure that we record all privileged activity in the database, along with any attempts to hide this activity! Enabling Enhanced Auditing As of Oracle Database 11g, the Database Configuration Assistant (DBCA) makes it easy to enable default (enhanced) auditing. Although there is some overhead to record auditing
- Chapter 9: Database Security and Auditing 341information, compliance requirements such as those defined in the Sarbanes-Oxley actrequire strict monitoring of all business operations, including security-related operationsin the database. You can use DBCA to configure default auditing either when you create a database or afterthe database is already created. Using DBCA to configure default auditing after a database hasalready been created is useful if you’ve changed many of your auditing settings and want to resetauditing options to baseline values. In addition to setting the value of the initialization parameter AUDIT_TRAIL to DB, thedefault auditing settings audit the audit role command itself. In addition, you can see theprivileges audited by default in the Oracle Enterprise Manager Audit Settings page on the AuditedPrivileges tab; Figure 9-9 shows the default audited privileges plus two others created earlier inthis chapter.FIGURE 9-9 Displaying audited privileges using OEM
- 342 Oracle Database 11g DBA Handbook Data Encryption Techniques Data encryption can enhance security both inside and outside the database. A user may have a legitimate need for access to most columns of a table, but if one of the columns is encrypted and the user does not know the encryption key, the information is not usable. The same concern is true for information that needs to be sent securely over a network. The techniques I presented so far in this chapter, including authentication, authorization, and auditing, ensure legitimate access to data from a database user but do not prevent access to an operating system user that may have access to the operating system files that compose the database itself. Users can leverage one of two methods for data encryption: using the package DBMS_ CRYPTO, an Oracle Database 10g replacement for the package DBMS_OBFUSCATION_ TOOLKIT found in Oracle9i, and transparent data encryption, which stores encryption keys globally and includes methods for encrypting entire tablespaces. DBMS_CRYPTO Package New to Oracle 10g, the package DBMS_CRYPTO replaces the DBMS_OBFUSCATION_TOOLKIT and includes the Advanced Encryption Standard (AES) encryption algorithm, which replaces the Data Encryption Standard (DES). Procedures within DBMS_CRYPTO can generate private keys for you, or you can specify and store the key yourself. In contrast to DBMS_OBFUSCATION_TOOLKIT, which could only encrypt RAW or VARCHAR2 datatypes, DBMS_CRYPTO can encrypt BLOB and CLOB types. Transparent Data Encryption Transparent data encryption is a key-based access control system that relies on an external module for enforcing authorization. Each table with encrypted columns has its own encryption key, which in turn is encrypted by a master key created for the database and stored encrypted within the database; the master key is not stored in the database itself. The emphasis is on the word transparent—authorized users do not have to specify passwords or keys when accessing encrypted columns in a table or in an encrypted tablespace. ■ Although transparent data encryption has been significantly enhanced in Oracle Database 11g, there are still a few restrictions on its use; for example, you cannot encrypt columns using foreign key constraints, since every table has a unique column encryption key. This should typically not be an issue, since keys used in foreign key constraints should be system-generated, unique, and unintelligent. Business keys and other business attributes of a table are more likely candidates for encryption and usually do not participate in foreign key relationships with other tables. Other database features and types are also not eligible for transparent data encryption: ■ Index types other than B-tree ■ Range-scan searching of indexes ■ BFILEs (external objects) ■ Materialized view logs ■ Synchronous Change Data Capture
- Chapter 9: Database Security and Auditing 343 ■ Transportable tablespaces ■ Original import/export utilties (Oracle9i and earlier)Alternatively, you can use DBMS_CRYPTO to manually encrypt these types and features. NOTE As of Oracle Database 11g, internal large objects such as BLOB and CLOB types can now be encrypted.Creating an Oracle WalletYou can create a wallet for Transparent Data Encryption using Oracle Enterprise Manager. Selectthe Server tab, and then click the Transparent Data Encryption link under the Security Heading.You will see the page in Figure 9-10. In this example, there is no wallet created yet. The filesqlnet.ora stores the location of the wallet using the ENCRYPTION_WALLET_LOCATIONvariable. If this variable does not exist in sqlnet.ora, the wallet is created in $ORACLE_HOME/admin/database_name/wallet, which in this example is /u01/app/oracle/admin/dw/wallet. To create the encryption key and place it in the wallet, create a wallet password that is at leastten characters long, a mix of upper- and lowercase letters, numbers, and punctuation. ClickingOK creates the wallet, and you see the page in Figure 9-11.FIGURE 9-10 Transparent Data Encryption: creating a wallet
- 344 Oracle Database 11g DBA Handbook FIGURE 9-11 Transparent Data Encryption: wallet is open If your master key becomes compromised, you can use the page in Figure 9-10 to recreate the master key. You can also close the wallet—disabling Transparent Data Encryption—and prevent access to any encrypted table columns or tablespaces. The equivalent SQL commands to create, open, and close a wallet are very straightforward and probably take less time to type than using Oracle Enterprise Manager! To create a new key, and create the wallet if it does not already exist, use the alter system command as follows: SQL> alter system set encryption key identified by "Uni123#Lng"; System altered. SQL> Note the importance of putting the wallet key within double quotes; otherwise, the password will map all lowercase characters and the wallet will not open. After the database instance is shut down and restarted, you need to open the wallet with the alter system command if this task is not automated otherwise: SQL> alter system set encryption wallet open identified by "Uni123#Lng"; System altered. SQL> Finally, you can easily disable access to all encrypted columns in the database at any time by closing the wallet:
- Chapter 9: Database Security and Auditing 345SQL> alter system set encryption wallet close;System altered.SQL> Make frequent backups of your wallet and don’t forget the wallet key (or the securityadministrator—which can be a separate role from the DBA’s role—should not forget the walletkey), because losing the wallet or the password to the wallet will prevent decryption of anyencrypted columns or tablespaces.Encrypting a TableYou can encrypt a column or columns in one or more tables simply by adding the encryptkeyword after the column’s datatype in a create table command or after the column name inan existing column. For example, to encrypt the SALARY column of the EMPLOYEES table, usethis command:SQL> alter table employees modify (salary encrypt);Table altered.SQL> Any users who had the privileges to access this column in the past still have the same accessto the SALARY column—it’s completely transparent to the users. The only difference is that theSALARY column is indecipherable to anyone accessing the operating system file containing theEMPLOYEES table.Encrypting a TablespaceTo encrypt an entire database, the COMPATIBLE initialization parameter must be set to11.1.0.0.0—the default for Oracle Database 11g. If the database has been upgraded froman earlier release, and you change the COMPATIBLE parameter to 11.1.0.0.0, the changeis irreversible. An existing tablespace cannot be encrypted; to encrypt the contents of an existing tablespace,you must create a new tablespace with the ENCRYPTION option and copy or move existingobjects to the new tablespace. Oracle Enterprise Manager makes it easy to create a new encryptedtablespace. In Figure 9-12, you create a new tablespace called USERS_CRYPT with a size of500MB, located in an ASM disk group. Clicking the Encryption Options button, you see the status of the wallet you created earlier (itmust be open to create an encrypted tablespace), and you can select the encryption algorithmyou want to use for the tablespace. After you click Continue, as shown in Figure 9-13, you returnto the Create Tablespace page. Clicking Show SQL, you can see the SQL command Oracle Enterprise Manager will use tocreate the tablespace:CREATE SMALLFILE TABLESPACE "USERS_CRYPT"DATAFILE+DATA SIZE 500M LOGGING EXTENT MANAGEMENT LOCALSEGMENT SPACE MANAGEMENT AUTO NOCOMPRESS ENCRYPTIONUSING AES256 DEFAULT STORAGE(ENCRYPT)Click Return and then OK; Oracle Enterprise Manager creates the tablespace.
- 346 Oracle Database 11g DBA Handbook FIGURE 9-12 Creating an encrypted tablespace FIGURE 9-13 Specifying encrypted tablespace options
- PART IIIHigh Availability
- This page intentionally left blank
- CHAPTER 10Real Application Clusters 349
- 350 Oracle Database 11g DBA Handbook n Chapter 4, we presented an overview of Automatic Storage Management (ASM) I and Oracle Managed Files (OMF) and how they can ease administration, enhance performance, and improve availability. You can add one or more disk volumes to a rapidly growing VLDB without bringing down the instance. In Chapter 6, we talked about bigfile tablespaces and how they not only allow the total size of the database to be much larger than in previous versions of Oracle, but also ease administration by moving the maintenance point from the datafile to the tablespace. Chapter 15 will focus on Oracle Net, providing you with the basics for ensuring that your clients can reach the database servers in an efficient and prompt manner. Chapter 16 will expand our coverage of bigfile tablespaces in addition to presenting other tools to make large database management easier, such as partitioned table support, transportable tablespaces, and new to Oracle 10g, Oracle Data Pump. As your databases get larger, and the number of users increases, the need for availability becomes even more critical. Real Application Clusters (RAC) will tie together OMF, bigfile tablespaces, a robust network infrastructure, and ASM into key elements of the RAC architecture. In this chapter, we will revisit many of these database features, but with an emphasis on how they can be leveraged in a RAC environment. This chapter focuses on a number of RAC topics, including how to set up your operating system environment—kernel parameters, network configuration, and user accounts. You will perform the requisite installations to support RAC, such as Cluster Ready Services (CRS) for creating a clustered environment, along with the various installation options within the Oracle Universal Installer (OUI) to configure your network, shared storage, and database software installation for both CRS and the Oracle 11g database itself. During the installation of a RAC, you can configure the Enterprise Manager agent and Enterprise Manager Database Control to manage your cluster. EM Database Control extends the functionality available to manage a single instance by providing a cluster-aware layer; you can manage both the Oracle instances and the underlying cluster configuration from a single web interface. In subsequent chapters, we will present other ways to ensure high database availability and recoverability: Chapter 13 will give a detailed look at Oracle Data Guard for near-real-time failover capabilities, and Chapter 17 will cover Oracle Streams for advanced replication. In Chapter 14, we’ll finish up our discussion on Flashback options started in Chapter 7 by showing you how to perform Flashback Drop and Flashback Database as well as how to use LogMiner to undo individual transactions. Overview of Real Application Clusters A Real Application Cluster is highly available and scalable. The failure of one node in the cluster does not affect client sessions or the availability of the cluster itself until the last node in the cluster fails; the only impact a lost node has on the cluster is a slight degradation in response time, depending on the total number of nodes in the cluster. A RAC database has a few disadvantages. Licensing costs are higher, because each node in the cluster has to have its own Oracle license. The close physical proximity of the nodes in the cluster due to the high-speed requirements of the cluster interconnect means that a natural disaster can take out the entire cluster; using a remote standby database can help alleviate some of these concerns. You will have to weigh the cost of high availability (or the lack thereof) compared to the increased cost and slight increase in maintenance of a RAC.
- Chapter 10: Real Application Clusters 351 NOTE A “stretch cluster”, or a cluster using RAC technology over a wide-area network (WAN), protects against the loss of an entire data center, but it increases the cost of the infrastructure, since the already-redundant storage systems must be duplicated across the sites and the network bandwidth must be high enough to keep up with synchronization tasks during peak transaction periods. In the next few sections, we’ll cover some of the hardware and software requirements for aRAC database as well as detail the network configuration and disk storage requirements to builda successful cluster.Hardware ConfigurationA complete discussion of all possible RAC hardware configurations is beyond the scope of thisbook. You want to have at least two and preferably three nodes for a RAC, each with redundantpower supplies, network cards, dual CPUs, and error-correcting memory; these are desirablecharacteristics for any type of server, not just an Oracle server! The higher the number of nodesconfigured in the cluster, the lower the performance hit you will take when one of the cluster’snodes fails. The shared disk subsystem should also have hardware redundancy built in—multiple powersupplies, RAID-enabled disks, and so forth. You will balance the redundancy built into the shareddisk with the types of disk groups you will create for the RAC. The higher redundancy built intothe disk subsystem hardware can potentially reduce the amount of software redundancy youspecify when you create the database’s disk groups.Software ConfigurationAlthough Oracle clustering solutions have been available since version 6, not until version 10ghas there been a native clusterware solution that more tightly couples the database to the volumemanagement solution. Cluster Ready Services (CRS) is the clustering solution that can be used onall major platforms instead of an OS vendor or third-party clusterware. CRS is installed before the RDBMS and must be in its own home directory, referred to as theCRS_HOME. If you are only using a single instance in the near future but plan to cluster at a laterdate, it is useful to install CRS first so that the components of CRS that are needed for ASM andRAC are in the RDBMS directory structure. If you do not install CRS first, you will have to performsome extra steps later to remove the CRS-related process executables from the RDBMS homedirectory. After CRS is installed, you install the database software in the home directory, referred to asthe ORACLE_HOME. On some platforms, such as Microsoft Windows, this directory can be adirectory common to all nodes, whereas other platforms, such as Linux, require OCFS version2.x or later. Otherwise, each node will have its own copy of the binary executables.Network ConfigurationEach node in a RAC has a minimum of three IP addresses: one for the public network, one for theprivate network interconnect, and a virtual IP address to support faster failover in the event of anode failure. As a result, a minimum of two physical network cards are required to support RAC;
- 352 Oracle Database 11g DBA Handbook additional network cards are used to provide redundancy on the public network and thus an alternate network path for incoming connections. For the private network, additional network cards can boost performance by providing more total bandwidth for interconnect traffic. Figure 10-1 shows a two-node RAC with one network card on each node for the private interconnect and one network card on each node to connect to the public network. The public network is used for all routine connections to and from the server; the interconnect network, or private network, supports communication between the nodes in the cluster, such as node status information and the actual data blocks shared between the nodes. This interface should be as fast as possible, and no other types of communication between the nodes should occur on the private interface; otherwise, the performance of the RAC may suffer. The virtual IP address is the address assigned to the Oracle listener process and supports rapid connect-time failover, which is able to switch the network traffic and Oracle connection to a different instance in the RAC much faster than a third-party high-availability solution. Disk Storage The shared disk drive may or may not be a RAID device to support redundancy; more importantly the disk controllers and connections to the shared storage should be multiplexed to ensure high availability. If the disks in the shared drive are not mirrored, you can use the mirroring capabilities of ASM to provide performance and availability benefits. For the purposes of the examples in this chapter, I will use a Linux server with the device configuration listed in Table 10-1. These disks reside on a shared SCSI storage device and have the same device name on each node in the cluster. There are five raw disks that are 512MB in size reserved for the voting disk, the OCR disk, and their mirrors (one mirror for the OCR disk and two mirrors for the voting disk); I will present the uses for these disks in the section “Cluster Ready Services.” The shared file system /u01 uses Oracle Cluster File System (OCFS2) to share the Oracle executable files among all nodes in the FIGURE 10-1 RAC network configuration
- Chapter 10: Real Application Clusters 353 Raw Device, ASM, Physical Device Name Capacity Purpose or File System Name DVOL1 /dev/sdc1 10GB ASM Disk #1: +DATA1 DVOL2 /dev/sdd1 10GB ASM Disk #1: +DATA1 RVOL1 /dev/sde1 10GB ASM Disk #2: +RECOV1 RVOL2 /dev/sdf1 10GB ASM Disk #2: +RECOV1 /dev/raw/raw5 /dev/sdg1 512MB OCR Disk /dev/raw/raw6 /dev/sdh1 512MB Voting Disk /dev/raw/raw7 /dev/sdi1 512MB OCR Disk Mirror /dev/raw/raw8 /dev/sdj1 512MB Voting Disk Mirror /u01 /dev/sdk1 8GB Shared Oracle binaries /dev/raw/raw9 /dev/sdl1 512MB Second Voting Disk MirrorTABLE 10-1 Raw Disks for ASM Disk Groups, the Voting Disk, and the OCR Diskcluster, saving installation time and duplication of the same Oracle executables on each node inthe cluster.Installation and SetupFor the examples in this chapter, we will use Oracle Enterprise Linux (based on Red Hat EnterpriseLinux) to install the RAC and demonstrate its features. However, most, if not all, the installationtips, techniques, and methods presented in this chapter will be applicable to other Unix-likeplatforms and even Windows-based installations. TIP Oracle Enterprise Linux bundles many features not automatically available with the corresponding Red Hat distributions, such as OCFS2 and the ASMlib library. More importantly, Oracle Enterprise Linux is supported and tightly integrated with Oracle Unbreakable Linux, a support program for Oracle on Linux solutions through Oracle MetaLink. We will show you how to set up a three-node RAC; although a two-node RAC candemonstrate most the features of a RAC, you will need a three-node RAC to see how theremaining nodes in the cluster can still operate as a RAC and recover from the loss of a singlenode in the cluster. In practice, the more nodes in the cluster, the less impact there is tothroughput when one node in the cluster fails. On each node, the Oracle software will reside in a shared ORACLE_HOME; the database andrecovery files will use ASM disks configured with Oracle ASMLib, and the OCR and voting diskswill use raw devices.
- 354 Oracle Database 11g DBA Handbook NOTE As an alternative to ASM and raw disks, Oracle Cluster File System (OCFS) version 2.x, available at http://oss.oracle.com, can be used to store both database files and Oracle executables on a common, shared file system. Finally, I will assume that the shared disks are accessible via the same node name in the /dev directory and that each node in the cluster can access the shared disk simultaneously; the ASM instance on each node will automatically coordinate access to the shared disk. Operating System Configuration The first step is to prepare the operating system. Install Oracle Enterprise Linux, and install every option! The small amount of disk space you might save otherwise is quickly offset when you are missing a component later and must find the installation CDs to obtain the missing component. Once everything is installed, be sure to apply all patches from the Oracle Unbreakable Linux Network to take advantage of all security and performance enhancements, although Oracle 11g will run as advertised on Red Hat Enterprise Linux versions 4 and 5. Memory and Disk Requirements For each node in the cluster, a minimum of 1GB is recommended. The swap space should be at least twice this value, or 2GB. For a successful installation, there should be at least 400MB free in the /tmp file system. The Oracle software itself requires approximately 4GB of disk space, and the default database files require another 1.5GB; the growth of your database depends, of course, on the applications you use. On your shared disk subsystem, you need two special partitions: one for a voting disk and one for the Oracle Cluster Registry (OCR). The voting disk is used by Oracle’s clustering software, Cluster Ready Services (CRS), to arbitrate ownership of the cluster in case of a private network failure. The OCR disk is used to maintain all metadata about the cluster: the cluster configuration and the cluster database configuration. Kernel Parameters Most of the “out of the box” kernel parameters are set correctly for Oracle except a few; ensure that the kernel parameters in Table 10-2 are set to the values provided in the table. NOTE For 64-bit platforms, if your SGA will be larger than 2GB, the value for kernel.shmall should be at least as large as the value of the initialization parameter SGA_MAX_SIZE.
- Chapter 10: Real Application Clusters 355 You can confirm that these values are in effect using the following command:[root@oc1 ~]# /sbin/sysctl -a | egrep sem|shm|file-max|ip_local|rmem|wmemnet.ipv4.ip_local_port_range = 1024 65000net.core.rmem_default = 4194304net.core.wmem_default = 262144net.core.rmem_max = 4194304net.core.wmem_max = 262144vm.hugetlb_shm_group = 0kernel.sem = 250 32000 100 128kernel.shmmni = 4096kernel.shmall = 2097152kernel.shmmax = 2147483648fs.file-max = 65536[root@oc1 ~]# In a default Oracle Enterprise Linux installation, some of these parameters are already set. Forthose values that vary from Table 10-2, simply append the parameter name and the value fromthe previous sample output to the file /etc/sysctl.conf and then run the /sbin/sysctl -p commandto change the values immediately. After the next reboot, the values specified in /etc/sysctl.confwill be set automatically. Kernel Parameter Value kernel.shmall 2097152 kernel.shmmax Minimum of half the size of physical memory and 4GB kernel.shmmni 4096 kernel.sem 250 32000 100 128 fs.file-max Minimum of 512 * PROCESSES net.ipv4.ip_local_port_range 1024 65000 rmem_default 4194304 rmem_max 4194304 wmem_default 262144 wmem_max 262144TABLE 10-2 Oracle Database 11g Minimum Kernel Parameter Values
- 356 Oracle Database 11g DBA Handbook Network Configuration Each node in a RAC requires at least two network cards; one card is to connect to the public network for client communication, and the other is used for private network traffic between the nodes in the cluster. For the examples in this chapter, I will use the following /etc/hosts file: # Do not remove the following line, or various programs # that require network functionality will fail. 127.0.0.1 localhost.localdomain localhost 192.168.2.95 dw 192.168.2.91 oe4 # Oracle Linux Enterprise 4 192.168.2.81 asmw 192.168.2.82 asinfra 192.168.2.68 phpxe # with Oracle Database XE 192.168.2.65 officedesktop # some good shares are here 192.168.2.101 oc1 #public1 192.168.1.101 poc1 #private1 192.168.2.176 voc1 #virtual1 192.168.2.102 oc2 #public2 192.168.1.102 poc2 #private2 192.168.2.177 voc2 #virtual2 192.168.2.103 oc3 #public3 192.168.1.103 poc3 #private3 192.168.2.178 voc3 #virtual3 A couple things are worth noting at this point. I only need two network cards on each server; why is there a “virtual” address for each node? The virtual addresses support rapid connect-time failover, a concept I will explore in more detail later in this chapter. All client connections use these virtual addresses for their connections, and each RAC node’s listener will be listening on the virtual nodes instead of the public node names. Note also that each virtual address must be on the same subnet as the public address; the private interconnect network, however, is on its own private subnet. TIP Before proceeding with any Oracle software installations, be sure that you can connect from each node in the cluster to every other node using the ssh command that does not prompt for a password for the oracle user; in addition, ensure that ssh <hostname> <command> does not return a login banner. User Accounts Other than the root account, the only other account needed on your Linux server is the oracle account; in fact, in a production environment, you may not want any other user accounts on the server to prevent any inadvertent or intentional access of critical database files, control files, executables, or password files.
- Chapter 10: Real Application Clusters 357 The groups oinstall and dba must exist on each node in the cluster, in addition to the oracleuser. Use the following commands to create these if they do not already exist, and assign theoracle user to both groups, with oinstall as the primary group:[root@oc1 ~]# /usr/sbin/groupadd oinstall[root@oc1 ~]# /usr/sbin/groupadd dba[root@oc1 ~]# /usr/sbin/useradd -g oinstall -G dba oracle[root@oc1 ~]# passwd oracleChanging password for user oracle.New password:Retype new password:passwd: all authentication tokens updated successfully.[root@oc1 ~]# For the oracle user, set up the default environment in the logon script; this sample logon scriptassumes the bash shell (Bourne Again Shell) on Oracle Enterprise Linux:# .bash_profile# Get the aliases and functionsif [ -f ~/.bashrc ]; then . ~/.bashrcfi# User specific environment and startup programsPATH=$PATH:$HOME/binexport PATHunset USERNAMEumask 022ORACLE_BASE=/u01/app/oracle# ORACLE_HOME is set after installation with OUI.# ORACLE_HOME=$ORACLE_BASE/product/11.1.0/db_1# ORACLE_SID different on each node;# same database, different instance.ORACLE_BASE=/u01/app/oracleORACLE_HOME=$ORACLE_BASE/product/11.1.0/db_1ORACLE_SID=rac1PATH=$ORACLE_HOME/bin:$PATHexport ORACLE_BASE ORACLE_HOME ORACLE_SID PATH Make sure that the value for ORACLE_SID is unique on each node! As I install additionalproducts such as CRS and create the RAC instances, I will make changes to this logon script asappropriate. To set up user equivalence between nodes in the cluster, use either the .rhosts or /etc/hosts.equiv file to support the rsh and rcp commands; better yet, and more secure, ensure that ssh andscp are configured for all nodes in the cluster. Starting with Oracle 10g, the OUI will use ssh andscp if possible, and fall back to rsh and rcp if necessary. Configuring ssh using the ssh-keygenutility is beyond the scope of this book; consult with your Unix or Linux system administratorto configure ssh and scp.
- 358 Oracle Database 11g DBA Handbook Software Directories Because I am using ASM in these examples for RAC storage, only one directory, /u01/app/oracle, needs to be created on the local storage to hold the Oracle Database and the CRS software. The disk volume on which this directory resides must have at least 4GB of space for the database and CRS software. Use these commands to create this directory and assign the correct permissions: [root@oc1 ~]# mkdir -p /u01/app/oracle [root@oc1 ~]# chown -R oracle:oinstall /u01/app /u01/app/oracle [root@oc1 ~]# chmod -R 775 /u01/app/oracle [root@oc1 ~]# chown –R oracle:oinstall /u01/app ASMLib Library The ASMLib library for Linux is a support library for ASM instances in Oracle Database 10g and later. Although you can reference raw disks directly when creating ASM diskgroups within an ASM instance, ASMLib provides a number of benefits: ■ You can manage ASM disks at the operating system level; you don’t have to refer to raw disks from installer. ■ Using ASMLib reduces ASM instance startup time. ■ Volume names are consistent across servers, whereas raw device names can differ from server to server; a volume name more easily identifies the disk device on a given node. ■ Performance of ASM diskgroups is improved. After installation of the ASMLib oracleasm packages, configure each node in your cluster using the oracleasm command as follows: [root@oc1 ~]# /etc/init.d/oracleasm configure Configuring the Oracle ASM library driver. This will configure the on-boot properties of the Oracle ASM library driver. The following questions will determine whether the driver is loaded on boot and what permissions it will have. The current values will be shown in brackets ([]). Hitting <ENTER> without typing an answer will keep that current value. Ctrl-C will abort. Default user to own the driver interface []: oracle Default group to own the driver interface []: oinstall Start Oracle ASM library driver on boot (y/n) [n]: y Fix permissions of Oracle ASM disks on boot (y/n) [y]: y Writing Oracle ASM library driver configuration: [ OK ] Loading module "oracleasm": [ OK ] Mounting ASMlib driver filesystem: [ OK ] Scanning system for ASM disks: [ OK ] [root@oc1 ~]# Be sure to remove or comment out the raw disk definitions on each node of the cluster from / etc/sysconfig/rawdevices for the raw disks that will be used for ASM disk groups: # raw device bindings # format: <rawdev> <major> <minor> # <rawdev> <blockdev>
- Chapter 10: Real Application Clusters 359# example: /dev/raw/raw1 /dev/sda1# /dev/raw/raw2 8 5#/dev/raw/raw1 /dev/sdc1#/dev/raw/raw2 /dev/sdd1#/dev/raw/raw3 /dev/sde1#/dev/raw/raw4 /dev/sdf1/dev/raw/raw5 /dev/sdg1/dev/raw/raw6 /dev/sdh1/dev/raw/raw7 /dev/sdi1/dev/raw/raw8 /dev/sdj1/dev/raw/raw9 /dev/sdl1The remaining raw devices will be used for the OCR disk, voting disk, and mirrors for each andare not managed through the oracleasm library. On any node in the cluster, mark the disks using the oracleasm createdisk command; use theoracleasm listdisks command to see the available ASM disks:[root@oc1 ~]# /etc/init.d/oracleasm createdisk DVOL1 /dev/sdc1Marking disk "/dev/sdc1" as an ASM disk: [ OK ][root@oc1 ~]# /etc/init.d/oracleasm createdisk DVOL2 /dev/sdd1Marking disk "/dev/sdd1" as an ASM disk: [ OK ][root@oc1 ~]# /etc/init.d/oracleasm createdisk RVOL1 /dev/sde1Marking disk "/dev/sde1" as an ASM disk: [ OK ][root@oc1 ~]# /etc/init.d/oracleasm createdisk RVOL2 /dev/sdf1Marking disk "/dev/sdf1" as an ASM disk: [ OK ][root@oc1 ~]# /etc/init.d/oracleasm listdisksDVOL1DVOL2RVOL1RVOL2[root@oc1 ~]# For the remaining nodes in the cluster, you can automatically detect and register the ASMdisks using the ASMLib oracleasm scandisks command:[root@oc2 ~]# /etc/init.d/oracleasm scandisksScanning system for ASM disks: [ OK ][root@oc2 ~]# /etc/init.d/oracleasm listdisksDVOL1DVOL2RVOL1RVOL2[root@oc2 ~]#The ASMLib driver automatically scans the available devices for ASM-registered disks when theoracleasm service starts during system boot. Here is a short summary of the oracleasm command options: ■ start, stop, restart Start, stop, or restart the oracleasm service. ■ enable, disable Enable or disable automatic loading of the oracleasm driver at system boot. ■ configure Reconfigure the startup options or oracleasm driver owner.
- 360 Oracle Database 11g DBA Handbook ■ createdisk Mark a disk device for use with the oracleasm driver. ■ deletedisk Unmark a disk device. Do not unmark a device that is currently in an ASM disk group! ■ querydisk Determine if a specific disk is marked by the oracleasm driver. ■ listdisks List all disks attached to the server that are marked for use by oracleasm. ■ scandisks Identify disks marked for use by the cluster as oracleasm disks. Software Installation Whether you are creating a 2-node or a 16-node cluster, the procedure is the same; if you have configured your servers as detailed in the previous sections, the installations you will perform in the following sections will automatically push to each node you specify in the configuration screens for Cluster Ready Services and the Oracle Database software itself. Therefore, the following discussion is divided into three parts: CRS to prepare the clustering environment, Oracle Database 11g software installation, and creating an instance of the database on each node in the cluster. As I review each screen of each installation, I will provide background and explanation as required so that you’re prepared to make adjustments to your environment once the installations are complete. In many cases, the installation steps for the database software, the database itself, and ASM are similar or identical to what you’ve already seen in Chapters 1 and 4, and will find detailed in the appendix. In the following sections, we’ll focus on the differences you’ll see for a RAC installation. Cluster Ready Services As mentioned earlier in this chapter, CRS should be installed in its own home directory called CRS_HOME. As part of the CRS installation, you will have to configure two particular locations that are not specific to any instance but are used by the cluster itself: the Oracle Cluster Registry and the voting disk. The Oracle Cluster Registry (OCR) is the location where the cluster stores its metadata, and 256MB is the minimum amount of disk space required to hold the cluster metadata. The voting disk is used by the cluster to resolve situations where one or more nodes in the cluster lose contact with other nodes in the cluster over the private interconnect. In this way, you have a way to shut off one node or one group of nodes from writing to the shared disk files because it assumes it is in control of the shared storage. As with the OCR disk, the voting disk requires a minimum of 256MB of free disk space on the device. The locations of the OCR disk and the voting disk must be on separate raw devices, even when you are using ASM for your other database files; however, if you are using OCFS, the OCR disk and the voting disk can exist as files on an OCFS volume. In the examples that follow, I will use raw devices for the OCR and voting disks; this is the Oracle-recommended method. As of Oracle Database 10g Release 2, the runcluvfy.sh command verifies that the server memory, user equivalence, network interfaces, required packages, and connectivity among the nodes in the cluster are configured correctly for a CRS installation. Run the command as follows, substituting a list of your cluster’s node names for oc1,oc2,oc3: ./runcluvfy.sh stage -pre crsinst -n oc1,oc2,oc3 -verbose The CRS software on the CD or DVD or in the downloadable installation archive is approximately 250MB. After you mount the CD or expand the ZIP file, run the script ./runInstaller as the oracle user. The first screen you will see after the welcome screen and the Oracle inventory location screen is shown in Figure 10-2.
- Chapter 10: Real Application Clusters 361FIGURE 10-2 Executable file locations The installation for CRS is similar to that for a database install; you specify a home directoryfor the executables. In this case, you will use a home directory variable called CRS_HOME (witha default OUI name of OraCrs11g_home and a pathname of /u01/app/11.1.0/crs), which must bedifferent from the Oracle Database home. After OUI performs a number of prerequisite checks, such as memory, network connectivity,and old versions of CRS, you provide a name for the cluster along with the public, private, andvirtual node names. As you can see in Figure 10-3, you specify the cluster name as shc1 andprovide the public and private node names as defined in the /etc/hosts file I provided earlier inthis chapter. If you plan to manage multiple clusters using Enterprise Manager Grid Control, besure to assign a unique name to each cluster. On the next installation screen, shown in Figure 10-4, you specify which of your networkdevices is to be used as the public interface (to connect to the public network) and which willbe used for the private interconnect to support cache fusion and the cluster heartbeat. As notedearlier, you can have more than one public and more than one private interface; on this screenyou can also mark an interface to not be used at all by CRS. In Figure 10-5, you specify /dev/raw/raw5 as the raw disk for the Oracle Cluster Registry and /dev/raw/raw7 as the mirror location; as of Oracle Database 10g Release 2, you can use CRS (insteadof an external disk management system such as RAID) to mirror your OCR disk to further enhanceavailability. The OCR is a metadata repository for the cluster configuration, keeping track of thingslike where a particular service is running, if it is running, and so forth.
- 362 Oracle Database 11g DBA Handbook FIGURE 10-3 Cluster configuration FIGURE 10-4 Private interconnect enforcement
- Chapter 10: Real Application Clusters 363FIGURE 10-5 Oracle Cluster Registry In a similar fashion, you specify the location of the voting disk for CRS. In Figure 10-6, youspecify /dev/raw/raw6 and /dev/raw/raw8 as the raw disks for the voting disk. You can specifyup to two additional mirror devices for the voting disk using OUI. The processes known asCluster Synchronization Services (CSS) use the voting disk to arbitrate cluster ownership andinterprocess communications in a cluster environment. In a single-instance environment, CSSfacilitates communications between the ASM instance and the RDBMS instance. After the pre-installation summary screen shown in Figure 10-7 appears, you click the Installbutton and the installation begins. In addition to installing the software on the node where youinitiated the installation, the installed directory structure is copied to every node on the cluster,or to a shared disk location if you are using a file system such as OCFS2 for the shared Oraclebinaries.
- 364 Oracle Database 11g DBA Handbook FIGURE 10-6 Voting disk location FIGURE 10-7 Pre-installation summary
- Chapter 10: Real Application Clusters 365 After installation is complete, you are prompted to run two scripts as root on each node of thecluster:/u01/app/oraInventory/orainstRoot.sh/u01/app/11.1.0/crs/root.sh Here is the output from running the commands on the first node:[root@oc1 ~]# /u01/app/oraInventory/orainstRoot.shChanging permissions of /u01/app/oraInventory to 770.Changing groupname of /u01/app/oraInventory to oinstall.The execution of the script is complete[root@oc1 ~]# /u01/app/11.1.0/crs/root.shWARNING: directory /u01/app/11.1.0 is not owned by rootWARNING: directory /u01/app is not owned by rootChecking to see if Oracle CRS stack is already configured/etc/oracle does not exist. Creating it now.Setting the permissions on OCR backup directorySetting up Network socket directoriesOracle Cluster Registry configuration upgraded successfullyThe directory /u01/app/11.1.0 is not owned by root. Changing owner to rootThe directory /u01/app is not owned by root. Changing owner to rootSuccessfully accumulated necessary OCR keys.Using ports: CSS=49895 CRS=49896 EVMC=49898 and EVMR=49897.node <nodenumber>: <nodename> <private interconnect name> <hostname>node 1: oc1 poc1 oc1node 2: oc2 poc2 oc2node 3: oc3 poc3 oc3Creating OCR keys for user root, privgrp root..Operation successful.Now formatting voting device: /dev/raw/raw6Now formatting voting device: /dev/raw/raw8Now formatting voting device: /dev/raw/raw9Format of 3 voting devices complete.Startup will be queued to init within 30 seconds.Adding daemons to inittabExpecting the CRS daemons to be up within 600 seconds.Cluster Synchronization Services is active on these nodes. oc1Cluster Synchronization Services is inactive on these nodes. oc2 oc3Local node checking complete. Run root.sh on remaining nodes to start CRS daemons.[root@oc1 ~]# The voting and OCR disks are initialized the first time this script is run. When you run thescript on the other two nodes, you see similar results, except for the voting disk and OCR diskinitialization; here is the output for the second node, oc2:[root@oc1 ~]# ssh oc2root@oc2s password:Last login: Sat Aug 18 23:29:06 2007 from oc1
- 366 Oracle Database 11g DBA Handbook [root@oc2 ~]# /u01/app/oraInventory/orainstRoot.sh Changing permissions of /u01/app/oraInventory to 770. Changing groupname of /u01/app/oraInventory to oinstall. The execution of the script is complete [root@oc2 ~]# /u01/app/11.1.0/crs/root.sh WARNING: directory /u01/app/11.1.0 is not owned by root WARNING: directory /u01/app is not owned by root Checking to see if Oracle CRS stack is already configured . . . node <nodenumber>: <nodename> <private interconnect name> <hostname> node 1: oc1 poc1 oc1 node 2: oc2 poc2 oc2 node 3: oc3 poc3 oc3 clscfg: Arguments check out successfully. NO KEYS WERE WRITTEN. Supply -force parameter to override. -force is destructive and will destroy any previous cluster configuration. Oracle Cluster Registry for cluster has already been initialized Startup will be queued to init within 30 seconds. Adding daemons to inittab Expecting the CRS daemons to be up within 600 seconds. Cluster Synchronization Services is active on these nodes. oc1 oc2 Cluster Synchronization Services is inactive on these nodes. oc3 Local node checking complete. Run root.sh on remaining nodes to start CRS daemons. [root@oc2 ~]# On the third and final node of our three-node cluster, you see similar messages with a confirmation that the CRSD and EVMD processes have started, along with the VIP, GSD, and ONS resources on all nodes in the cluster: [root@oc2 ~]# ssh oc3 root@oc3s password: Last login: Sat Aug 18 23:31:29 2007 from oc2 [root@oc3 ~]# /u01/app/oraInventory/orainstRoot.sh Changing permissions of /u01/app/oraInventory to 770. Changing groupname of /u01/app/oraInventory to oinstall. The execution of the script is complete [root@oc3 ~]# /u01/app/11.1.0/crs/root.sh . . . Cluster Synchronization Services is active on these nodes. oc1 oc2 oc3 Cluster Synchronization Services is active on all the nodes. Waiting for the Oracle CRSD and EVMD to start Waiting for the Oracle CRSD and EVMD to start Oracle CRS stack installed and running under init(1M)
- Chapter 10: Real Application Clusters 367Running vipca(silent) for configuring nodeappsCreating VIP application resource on (3) nodes....Creating GSD application resource on (3) nodes....Creating ONS application resource on (3) nodes....Starting VIP application resource on (3) nodes....Starting GSD application resource on (3) nodes....Starting ONS application resource on (3) nodes....Done.[root@oc3 ~]# NOTE A discussion of CRSD, EVMD, and clustering application resources is beyond the scope of this book; see the Oracle Press book Oracle Database 11g High Availability with RAC, Flashback & Data Guard, by Hart and Jesse (McGraw-Hill, forthcoming). After you run the root-related scripts, OUI runs the cluster verification utility (as I did manuallybefore the installation) to verify that the cluster is operating correctly. You can verify that CRS isactive and configured correctly at any time by running the cluvfy command:[oracle@oc1 oracle]$ cd /u01/app/11.1.0/crs/bin[oracle@oc1 bin]$ cluvfy comp crs -n oc1,oc2,oc3Verifying CRS integrityChecking CRS integrity...Checking daemon liveness...Liveness check passed for "CRS daemon".Checking daemon liveness...Liveness check passed for "CSS daemon".Checking daemon liveness...Liveness check passed for "EVM daemon".Checking CRS health...CRS health check passed.CRS integrity check passed.Verification of CRS integrity was successful.[oracle@oc1 ~]$ The output from cluvfy shows that the cluster composed of oc1, oc2, and oc3 is healthy with allservices running. The crs_stat command can also provide a good summary of the cluster’s status:[oracle@oc1 ~]$ crs_stat –tName Type Target State Host------------------------------------------------------------ora.oc1.gsd application ONLINE ONLINE oc1
- 368 Oracle Database 11g DBA Handbook ora.oc1.ons application ONLINE ONLINE oc1 ora.oc1.vip application ONLINE ONLINE oc1 ora.oc2.gsd application ONLINE ONLINE oc2 ora.oc2.ons application ONLINE ONLINE oc2 ora.oc2.vip application ONLINE ONLINE oc2 ora.oc3.gsd application ONLINE ONLINE oc3 ora.oc3.ons application ONLINE ONLINE oc3 ora.oc3.vip application ONLINE ONLINE oc3 [oracle@oc1 ~]$ Database Software Install Once you have the cluster software running successfully on each node, you are ready to install the database software into the same directory on each node. In this section, we’ll primarily focus on the parts of the database software install that differ from the single-instance installation you performed in Chapter 1. Although you can create a database at the same time you install the Oracle software, you will only install the software now and run the Database Configuration Assistant later to create the database. From the root directory of the database installation files, run the script ./runInstaller as the oracle user, just as you did for the CRS install. The first screen you will see after the welcome screen, the Oracle inventory location screen, and the Installation Type screen is shown in Figure 10-8. FIGURE 10-8 Oracle database file locations
- Chapter 10: Real Application Clusters 369 Although you can install the software in any directory, make sure that this directory is availableto the user oracle on all nodes in the cluster. In addition, make sure that this directory is not thesame as the CRS installation directory. As shown in Figure 10-9, if the installer detects clustering software running on the node, itgives you the option to install the software on the entire cluster or to perform a single-instanceinstall. In this case, you select all the nodes you configured earlier as part of the cluster. After you select the nodes for your RAC database instances, the installer confirms that theenvironment for the Oracle Database software is configured correctly, as you can see in Figure 10-10. The screen in Figure 10-11 gives you the option to create the database immediately, configureASM, or install the database software only. As I mentioned earlier in this chapter, I’m going toinstall the software first, and then use the Database Configuration Assistant (DBCA) to configurean ASM instance on each node and create the shared database. After clicking Next, you select the operating system groups you use for creating andmaintaining a database using operating system authentication: ■ Database Administrator (OSDBA) Group: dba ■ Database Operator (OSOPER) Group: oinstall ■ ASM administrator (OSASM) Group: oinstall The summary screen you see in Figure 10-12 is nearly identical to the one you see in a single-instance installation, except that you are installing the software on more than one node in thecluster.FIGURE 10-9 Hardware cluster node locations
- 370 Oracle Database 11g DBA Handbook FIGURE 10-10 Platform configuration checks FIGURE 10-11 Database configuration options
- Chapter 10: Real Application Clusters 371FIGURE 10-12 Database pre-installation summary The subsequent screens detail the progress of the installation. Upon completion, you areprompted to run a new root.sh script on each node in the cluster. Here are the results of runningthe script on the first node (you must be logged on as root to run this script):[root@oc1 ~]# /u01/app/oracle/product/11.1.0/db_1/root.shRunning Oracle 11g root.sh script...The following environment variables are set as: ORACLE_OWNER= oracle ORACLE_HOME= /u01/app/oracle/product/11.1.0/db_1Enter the full pathname of the local bin directory: [/usr/local/bin]: Copying dbhome to /usr/local/bin ... Copying oraenv to /usr/local/bin ... Copying coraenv to /usr/local/bin ...Creating /etc/oratab file...Entries will be added to the /etc/oratab file as needed byDatabase Configuration Assistant when a database is createdFinished running generic part of root.sh script.Now product-specific root actions will be performed.Finished product-specific root actions.[root@oc1 ~]#
- 372 Oracle Database 11g DBA Handbook Creating the RAC Database with the Database Creation Assistant Launching the Database Creation Assistant (DBCA) for creating a RAC database is much the same as launching DBCA for a single instance database; if DBCA detects cluster software installed, it gives you the option to install a RAC database or a single instance database, as you can see in Figure 10-13, after DBCA is launched: [oracle@oc1 ~] dbca & After selecting the option to create a database, you see the dialog shown in Figure 10-14; select the nodes that will participate in the cluster. In this case, you select all nodes. On the next screen, choose the type of database: data warehouse, general purpose or transaction processing, or custom. For the purposes of creating a RAC, the type of database you select will not change the configuration of the cluster. On step 4 of DBCA, you give the cluster database a name and a SID prefix, just as you would with a standalone database installation. Step 5 asks you if you want to configure your RAC to use EM Database Control, and whether to configure the database with Enterprise Manager or Grid Control. Specify your mail server and e-mail notification address. In step 6, you specify the password for the privileged accounts in the database: SYS, SYSTEM, DBSNMP, and SYSMAN. In step 7, you specify ASM as your database file storage method. Finally, in step 8 you specify the parameters for the ASM instance, as you did in Chapter 4. Automatic Storage Management (ASM) instances, although available for storage management with standalone Oracle instances, are ideal for use with RAC. ASM eliminates both the need to FIGURE 10-13 DBCA cluster type options
- Chapter 10: Real Application Clusters 373FIGURE 10-14 Nodes to include for RAC installationconfigure raw devices (raw devices are mapped once within an ASM instance and subsequentlyare available for all nodes in the cluster) and the need for a cluster file system for database files.Cluster file systems such as Oracle Cluster File System (OCFS) are still available if you want yourORACLE_HOME on a cluster file system instead of a copy on each node in the cluster. However,Oracle best practices recommends that each node have its own local copy of the Oracle software.More details on how to configure and use ASM can be found in Chapter 4. If you use ASM, it onlyneeds to be configured once, during these steps. NOTE OCFS version 2.x supports a shared Oracle Home. The next few screens track the progress of the creation of the ASM instance. After this processis completed, you are prompted to create the first ASM disk group, as you can see in Figure 10-15.You choose two of the raw devices available to be the DATA1 disk group using normal redundancy.Notice that I had to specify /dev/oracleasm/disks/* as the Disk Discovery Path for OUI to recognizethe ASMLib disk groups I created earlier in this chapter. Additionally, you create the RECOV1 diskgroup using the remaining two disk groups; this disk group will be used to mirror the control fileand redo log files as well as to host the Flash Recovery Area. In Figure 10-16, you specify DATA1as the disk group for database storage. In Figure 10-17, you specify RECOV1 for the FlashRecovery Area.
- 374 Oracle Database 11g DBA Handbook FIGURE 10-15 Creating ASM raw disk #1 FIGURE 10-16 Selecting the ASM disk group for storage
- Chapter 10: Real Application Clusters 375FIGURE 10-17 Selecting the ASM disk for Flash Recovery Area As part of the database creation process, OUI creates several services in tnsnames.ora, one forthe cluster database (with load balancing enabled) and one for each instance, as you can see inthis listing:# Generated by Oracle configuration tools.RAC = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = voc1)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = voc2)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = voc3)(PORT = 1521)) (LOAD_BALANCE = yes) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = rac.world) ) )LISTENERS_RAC = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = voc1)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = voc2)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = voc3)(PORT = 1521)) )
- 376 Oracle Database 11g DBA Handbook RAC3 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = voc3)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = rac.world) (INSTANCE_NAME = rac3) ) ) RAC2 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = voc2)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = rac.world) (INSTANCE_NAME = rac2) ) ) RAC1 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = voc1)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = rac.world) (INSTANCE_NAME = rac1) ) ) Notice that each node in the RAC database has its own entry so that you may connect to a specific node when necessary. Note also that the hostnames for each node are using the virtual node names instead of the physical node names. Running the Oracle Network Configuration Assistant (netca) on a RAC node gives you many more options for service failover. In this example, I create a service called racsvc with rac1 as the preferred node for all connections but failing over to node rac2 or rac3 if rac1 goes down, as you can see in the resulting entry in tnsnames.ora:racsvc: (description = (address = (protocol = tcp)(host = voc1)(port = 1521)) (address = (protocol = tcp)(host = voc2)(port = 1521)) (address = (protocol = tcp)(host = voc3)(port = 1521)) (load_balance = yes) (connect_data = (server = dedicated) (service_name = racsvc.world) (failover_mode = (type = select) (method = basic) (retries = 180) (delay = 5) ) )
- Chapter 10: Real Application Clusters 377 The entry for racsvc has a few additional parameters for FAILOVER_MODE; these modes andtheir values are defined in the following list: ■ type The type of failover. Specifying session creates a new session for the client, but this does not preserve the position in a cursor when you are running a SELECT statement. Specifying select preserves the state of the cursor during a SELECT, but it involves extra overhead on the client side. The default, none, disables failover functionality. ■ method How fast failover occurs. Using a value of basic establishes connections when the failover occurs, and this incurs no overhead on the backup server(s). A value of preconnect provides faster failover, but as the name implies, it uses resources on the backup server(s) even when no failover scenario is active. ■ retries The number of times to attempt to connection after a failover. ■ delay The amount of time, in seconds, to wait between connection attempts when a failover scenario is active. Later in this chapter, I will show you how connecting to the racsvc service ensures highavailability for client connections when the client connects to a node and the node fails. The next few screens are the same as for a single-instance database installation; see theappendix for the options available on these screens. Figure 10-18 summarizes the cluster databaseinstallation, which includes the location of the database’s SPFILE on the DATA1 disk group.FIGURE 10-18 DBCA RAC database creation complete
- 378 Oracle Database 11g DBA Handbook Once the installation is complete, EM Database Control is automatically configured and started, just as it is with a single-instance installation; however, you can manage the entire cluster and not just individual nodes. NOTE Installing and configuring Enterprise Manager Grid Control 11g is beyond the scope of this book; see the book Oracle Database 11g High Availability with RAC, Flashback & Data Guard for more information. In Figure 10-19, you see the characteristics of one of the redo log members for the cluster; note that I placed one of the group’s members on the DATA1 disk group and the other on the RECOV1 disk group. Because each disk group is mirrored on two different raw devices, you have the equivalent of four-way redundancy for the members of your redo log group. RAC Characteristics A RAC instance is different in many ways from a standalone instance; in this section, I will show you the initialization parameters that are specific to a RAC database. In addition, we’ll show you some of the data dictionary views and dynamic performance views that are either unique to a RAC or have columns that are only populated when the instance is part of a RAC. FIGURE 10-19 EM DB Control RAC redo log group members
- Chapter 10: Real Application Clusters 379Server Parameter File CharacteristicsAs you saw previously in the section “Creating the RAC Database with the Database ConfigurationAssistant,” the server parameter file (SPFILE) resides on the DATA1 disk group and therefore isshared by each node in the cluster. Within the SPFILE, you can assign different values for givenparameters on an instance-by-instance basis; in other words, the value for an initialization parametercan differ between instances. If an initialization parameter is the same for all nodes in the cluster,it is prefixed with “*.”; otherwise, it is prefixed with the node name. In this example, the physical memory on the cluster server oc2 is temporarily reduced dueto other applications that are currently running on the server (ideally, though, you have no otherapplications running on the server except for Oracle!). Therefore, to reduce the demands of theinstance on the server, you will change the value of MEMORY_TARGET for the instance rac2:SQL> select sid, name, value 2 from v$spparameter where name = memory_target;SID NAME VALUE---------- -------------------- ----------------* memory_target 423624704SQL> alter system set memory_target = 256m sid=rac2;System altered.SQL> select sid, name, value 2 from v$spparameter where name = memory_target;SID NAME VALUE---------- -------------------- ----------------* memory_target 423624704rac2 memory_target 268435456 Once the memory issue has been resolved, you can restore the size of the shared pool on therac2 instance as follows:SQL> alter system set memory_target = 404m sid=rac2;System altered.SQL> Alternatively, and usually more simply, you want to reset the value to the same value for therest of the cluster; in this situation, you can use the reset option of the alter system command:SQL> alter system reset memory_target sid = rac2;System altered.SQL> select sid, name, value 2 from v$spparameter where name = memory_target;
- 380 Oracle Database 11g DBA Handbook SID NAME VALUE ---------- -------------------- ---------------- * memory_target 423624704 SQL> RAC-related Initialization Parameters A number of initialization parameters are used only in a RAC environment. Although these initialization parameters exist in any instance, in a single-instance environment they are either null or have a value of 1 (for example, INSTANCE_NUMBER). In Table 10-3, I give you an overview of some of the key RAC-related initialization parameters. Dynamic Performance Views In a single-instance environment, all dynamic performance views that begin with V$ have a corresponding view beginning with GV$, with the additional column INST_ID always set to 1. For a RAC environment with two nodes, the GV$ views have twice as many rows as the corresponding V$ views; for a three-node RAC, there are three times as many rows, and so forth. In the sections that follow, we’ll review some of the V$ dynamic performance views that show the same contents regardless of the node you are connected to, along with some of the GV$ views that can show you the contents of the V$ views on each node without connecting to each node explicitly. Initialization Parameter Description INSTANCE_NUMBER Unique number identifying this instance in the cluster. INSTANCE_NAME The unique name of this instance within the cluster; typically the cluster name with a numeric suffix. CLUSTER_DATABASE This parameter is TRUE if this instance is participating in a RAC environment. CLUSTER_DATABASE_INSTANCES The number of instances configured for this cluster, whether each instance is active or not. ACTIVE_INSTANCE_COUNT Specifies the primary instance in a two-node cluster; otherwise, it is the number of instances in the cluster. CLUSTER_INTERCONNECTS Specifies the network used for the cluster’s IPC traffic. MAX_COMMIT_PROPAGATION_DELAY Controls how fast committed transactions are propagated to other nodes. This value is deprecated as of Oracle Database 11g. TABLE 10-3 RAC-related Initialization Parameters
- Chapter 10: Real Application Clusters 381Common Database File ViewsSome dynamic performance views are the same whether you’re in a RAC environment or asingle-instance environment; the ASM configuration is a perfect example of this. In this query runon any database instance in the cluster, you want to verify that all your database files are stored inone of the two ASM disk groups, +DATA1or +RECOV1:SQL> select name from v$datafile union 2 select name from v$tempfile union 3 select member from v$logfile union 4 select name from v$controlfile union 5 select name from v$flashback_database_logfile;NAME---------------------------------------------------------+DATA1/rac/controlfile/current.260.631034951+DATA1/rac/datafile/example.264.631035151+DATA1/rac/datafile/sysaux.257.631034659+DATA1/rac/datafile/system.256.631034649+DATA1/rac/datafile/undotbs1.258.631034665+DATA1/rac/datafile/undotbs2.265.631035931+DATA1/rac/datafile/undotbs3.266.631035935+DATA1/rac/datafile/users.259.631034665+DATA1/rac/onlinelog/group_1.261.631034959+DATA1/rac/onlinelog/group_2.262.631034973+DATA1/rac/onlinelog/group_3.269.631036295+DATA1/rac/onlinelog/group_4.270.631036303+DATA1/rac/onlinelog/group_5.267.631036273+DATA1/rac/onlinelog/group_6.268.631036281+DATA1/rac/tempfile/temp.263.631035129+RECOV1/rac/controlfile/current.256.631034953+RECOV1/rac/onlinelog/group_1.257.631034965+RECOV1/rac/onlinelog/group_2.258.631034977+RECOV1/rac/onlinelog/group_3.261.631036301+RECOV1/rac/onlinelog/group_4.262.631036307+RECOV1/rac/onlinelog/group_5.259.631036277+RECOV1/rac/onlinelog/group_6.260.63103628522 rows selected.SQL> show parameter spfileNAME TYPE VALUE--------------------- ----------- --------------------------spfile string +DATA1/rac/spfilerac.oraSQL>
- 382 Oracle Database 11g DBA Handbook Cluster-Aware Dynamic Performance Views The GV$ views make it easy to view each instance’s characteristics in a single SELECT statement, while at the same time filtering out nodes that you do not want to see; these views also make it easier to aggregate totals from some or all of the nodes in the cluster, as in this example: SQL> select nvl(to_char(inst_id),TOTAL) INST#, 2 count(inst_id) sessions from gv$session 3 group by rollup(inst_id) 4 order by inst_id; INST# SESSIONS -------- ---------- 1 48 2 48 3 44 TOTAL 140 4 rows selected. From this query, you can see the number of sessions per instance and the total number of instances for the cluster using the view GV$SESSION. RAC Maintenance Most of the maintenance operations you perform on a single-node instance apply directly to a multiple-node RAC environment. In this section, I will review the basics for maintaining a RAC— including starting up a RAC and discussing how redo logs and undo tablespaces work—and then work through an example of an instance failure scenario using Transparent Application Failover (TAF) as well as rebuilding a failed node and adding it back to the cluster. Starting Up a RAC Starting up a RAC is not much different from starting up a standalone instance; the nodes in a RAC can start up in any order, and they can be shut down and started up at any time with minimal impact to the rest of the cluster. During database startup, first the ASM instance starts and mounts the shared disk groups; next, the RDBMS instance starts and joins the cluster. On Unix, the file /etc/oratab can be modified to auto-start the instances (both the ASM instance and the RDBMS instance) on each cluster: # This file is used by ORACLE utilities. It is created by root.sh # and updated by the Database Configuration Assistant when creating # a database. # A colon, :, is used as the field terminator. A new line terminates # the entry. Lines beginning with a pound sign, #, are comments. # # Entries are of the form: # $ORACLE_SID:$ORACLE_HOME:<N|Y>: # # The first and second fields are the system identifier and home # directory of the database respectively. The third filed indicates
- Chapter 10: Real Application Clusters 383# to the dbstart utility that the database should , "Y", or should not,# "N", be brought up at system boot time.## Multiple entries with the same $ORACLE_SID are not allowed.##+ASM1:/u01/app/oracle/product/11.1.0/db_1:Yrac:/u01/app/oracle/product/11.1.0/db_1:YRedo Logs in a RAC EnvironmentAs with a single-node instance, online redo logs are used for instance recovery in a RACenvironment; each instance in a RAC environment has its own set of online redo log files thatare used to roll forward all information in the redo logs and then roll back any uncommittedtransactions initiated on that node using the undo tablespace. Even before the failed instance has restarted, one of the surviving instances detects the instancefailure and uses the online redo log files to ensure that no committed transactions are lost; if thisprocess completes before the failed instance restarts, the restarted instance does not need instancerecovery. Even if more than one instance fails, all that is required for instance recovery is oneremaining node. If all instances in a RAC fail, the first instance that starts up will perform instancerecovery for the database using the online redo log files from all instances in the cluster. If media recovery is required and the entire database must be recovered, all instances exceptfor one must be shut down and media recovery is performed from a single instance. If you arerecovering noncritical database files, all nodes may be up as long as the tablespaces containingthe files to be recovered are marked as OFFLINE.Undo Tablespaces in a RAC EnvironmentAs with redo logs, each instance in a RAC environment must have its own undo tablespace ona shared drive or disk group. This undo tablespace is used for rolling back transactions duringnormal transactional operations or during instance recovery. In addition, the undo tablespace isused by other nodes in the cluster to support read consistency for transactions that are readingrows from a table on node rac2 while a data-entry process on node rac1 makes updates to thesame table and has not yet committed the transaction. The user on rac2 needs to see the before-image data stored in rac1’s undo tablespace. This is why all undo tablespaces must be visible toall nodes in the cluster.Failover Scenarios and TAFIf you have configured your client correctly and the instance to which the client is connected tofails, the client connection is rapidly switched to another instance in the cluster and processingcan continue with only a slight delay in response time. Here is the tnsnames entry for the service racsvc I created earlier:racsvc = (description = (address = (protocol = tcp)(host = voc1)(port = 1521)) (address = (protocol = tcp)(host = voc2)(port = 1521)) (address = (protocol = tcp)(host = voc3)(port = 1521)) (load_balance = yes) (connect_data = (server = dedicated)
- 384 Oracle Database 11g DBA Handbook (service_name = racsvc.world) (failover_mode = (type = select) (method = basic) (retries = 180) (delay = 5) ) ) ) I will show you what happens and how you will know if a session is connected to the cluster and its instance fails. First, you connect to the cluster via racsvc and find out the node and instance that you are connected to: SQL> connect rjb/rjb@racsvc; Connected. SQL> select instance_name, host_name, failover_type, 2 failover_method, failed_over 3 from v$instance 4 cross join 5 (select failover_type, failover_method, failed_over 6 from v$session 7 where username = RJB); INSTANCE_NAME HOST_NAME FAILOVER_TYPE FAILOVER_METHOD FAILED_OVER ------------- --------- ------------- --------------- ----------- rac1 oc1 SELECT BASIC NO SQL> You are using the columns from V$INSTANCE to give you the instance name and host name that you are connected to and then joining this to V$SESSION and retrieving the columns related to failover, which are only populated in a RAC environment. In this case, the session has not yet failed over, and the failover type is BASIC, as I specified when I created the service. Next, you will shut down instance rac1 from another session while you are still connected to the first session: SQL> connect system/manager@rac1 Connected. SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. SQL> Back at your user session, you rerun the query to find out what node you are connected to: SQL> select instance_name, host_name, failover_type, 2 failover_method, failed_over 3 from v$instance 4 cross join 5 (select failover_type, failover_method, failed_over
- Chapter 10: Real Application Clusters 385 6 from v$session 7 where username = RJB);INSTANCE_NAME HOST_NAME FAILOVER_TYPE FAILOVER_METHOD FAILED_OVER------------- --------- ------------- --------------- -----------rac3 oc3 SELECT BASIC YESSQL> If you were running a query at the time the instance was shut down, your query would pausefor a second or two and then continue as if nothing happened. If your result set is quite large andyou already retrieved most of the result set, the pause will be slightly longer since the first part ofthe result set must be re-queried and discarded.RAC Node Failure ScenarioOne of the benefits of a RAC environment is your ability to add or remove nodes to meet changingresource demands. One server that is underutilized in one business unit may be needed in anotherbusiness unit that is entering its peak processing period. Adding or removing a node in a RACenvironment may also be driven by a failure of a node; while the remaining nodes in the clusterservice ongoing requests, you will have to repair or replace the missing node and add it back tothe cluster without bringing down the rest of the cluster. In this section, we’ll show you the steps required to remove a node’s metadata from thecluster registry and then rebuild a node and add it back to the cluster. The assumption in thisscenario is that the local hard disk of the third cluster node is damaged beyond repair; therefore,you will rebuild the node from scratch and add it to the cluster registry. After this step, you willreinstall the Oracle software and create the instance as part of the database cluster.Remove the InstanceEven if the instance on the failed server is not available, you still want to remove any traces of theinstance from the remaining nodes in the cluster. You can use the srvctl command to removethe instance from the cluster, as in this example:[oracle@oc1 ~]$ srvctl remove instance -d rac -i rac3Remove instance rac3 for the database rac? (y/[n]) y[oracle@oc1 ~]$ The parameter -d rac specifies the database to be modified, and -i rac3 specifies the instanceto be removed from the RAC.Remove the Node from the ClusterTo remove the server itself from the cluster, execute the rootdeltetenode.sh command from theCRS_HOME directory, specifying both the node name and the CRS-assigned node number, as inthe following example:[root@oc1 root] # cd /u01/app/11.1.0/crs/bin[root@oc1 bin]# ./olsnodes -noc1 1oc2 2oc3 3[root@oc1 bin]# cd ../install
- 386 Oracle Database 11g DBA Handbook [root@oc1 install]# ./rootdeletenode.sh oc3,3 clscfg: EXISTING configuration version 4 detected. . . . Successfully deleted 13 values from OCR. Key SYSTEM.css.interfaces.nodeoc3 marked for deletion is not there. Ignoring. Successfully deleted 5 keys from OCR. Node deletion operation successful. oc3,3 deleted successfully [root@oc1 install]# cd ../bin [root@oc1 bin]# ./olsnodes -n oc1 1 oc2 2 [root@oc1 bin]# You also need to remove the node from the list of node locations maintained by the Oracle Universal Installer (OUI); in the directory $ORACLE_BASE/oraInventory/ContentsXML, identify any files that reference the deleted node, such as this example in the file inventory.xml: <HOME NAME="OraCrs11g_home" LOC="/u01/app/11.1.0/crs" TYPE="O" IDX="1" CRS="true"> <NODE_LIST> <NODE NAME="oc1"/> <NODE NAME="oc2"/> <NODE NAME="oc3"/> </NODE_LIST> </HOME> NOTE See MetaLink for other procedures specific to your environment that may need to be performed to remove a node from a cluster. Note that you have specified the node name of the server that hosts the instance. There are now only two nodes in your CRS clusterware environment. Install Operating System Software The next step is to reinstall the server software and prepare the environment as you did in the examples earlier in this chapter, in the section “Operating System Configuration.” At the end of this process, you will have the Oracle directories created along with the oracle user account, but without the CRS and database software installed. You will also assign the public, private, and virtual IP addresses using the same addresses you used when this node was first created. As a result, you will not have to change the /etc/hosts file on the remaining nodes in the cluster. Add the Node to the Cluster with CRS The node is ready to add to the cluster at the clusterware layer so that the other nodes in the cluster consider it to be a part of the cluster again. From one of the remaining nodes in the cluster, change to $CRS_HOME/oui/bin and run the addNode.sh command, which launches OUI and prompts you for the new node as if you were specifying a third node during the initial installation.
- Chapter 10: Real Application Clusters 387 After presenting a summary of the existing nodes and the node to be added, you click Nextand the CRS files are copied to the new node. To start the services on the new node, you areprompted to run rootaddnode.sh on the active node and root.sh on the new node; the outputis very similar to what you saw when you ran /u01/app/oraInventory/orainstRoot.sh and /u01/app/11.1.0/crs/root.sh during initial installation of the cluster.Install Oracle Software on the New NodeIn this step, you will copy the Oracle software from one of the existing nodes in the cluster tothe new node. From $ORACLE_HOME/oui/bin run the addNode.sh script. Make sure you arein $ORACLE_HOME and not $CRS_HOME. The OUI will start in Add Node mode, and after the startup screens, you will see the SpecifyCluster Nodes screen, where you add the new node oc3. After you see the summary screen, similar to the screen you saw for the CRS install, click Nextto copy the Oracle software to the new node. After this step completes, you will be prompted torun the root.sh script on the new node. In the final step of the procedure, the updated clusterinformation is saved to the OCR disk.Create a New Oracle InstanceTo create the Oracle instance on the new node, follow these steps: 1. Run DBCA from an existing node and choose a RAC database. 2. On the next screen, choose Instance Management and then add an instance to the existing cluster. 3. Next, choose which cluster database to add the node to. As you can see, the only option available is the database from this chapter. Provide an Oracle username and password with SYSDBA privileges to proceed, as shown here.
- 388 Oracle Database 11g DBA Handbook 4. Confirm the existing instances in the cluster, and click Next. 5. On the next screen, you are prompted for the new instance name. OUI makes its best guess based on the existing cluster configuration, as you can see here. 6. In step 6, you will see the existing cluster services; update the services with the new node name as appropriate. 7. On the last step, step 7, specify the tablespaces, datafiles, and redo log groups that will be added for this instance; in this case, an undo tablespace, the datafile for the tablespace, and two redo log groups, shown here.
- Chapter 10: Real Application Clusters 389 8. A confirmation screen appears when the instance is up and running; the cluster once again has three nodes: SQL> select inst_id from gv$instance; INST_ID ------- 1 2 3Tuning a RAC NodeThe first step in tuning a RAC is to tune the instance first. If an individual instance is not tunedcorrectly, the performance of the entire RAC will not be optimal. You can use the AutomaticWorkload Repository (AWR) to tune an instance as if it was not part of a cluster. Using EM Database Control, you can further leverage the statistics from the AWR to producereports on a RAC-wide basis. In Figure 10-20, you can see how EM Database Control makes iteasy to analyze the performance of the shared global cache as well as the cache performance onan instance-by-instance basis.FIGURE 10-20 EM Database Control RAC cache statistics
- 390 Oracle Database 11g DBA Handbook Tablespace Management In a RAC environment, tablespace management is much the same as in a single-instance environment. There is still only one database and one set of tablespaces to manage; it’s just that there is more than one instance accessing the tablespaces. Automatic Segment Space Management (ASSM), introduced in Oracle9i, enhances the usability of tablespaces in a RAC environment. Because you no longer have to worry about more freelists and freelist groups to support multiple instances, and therefore more concurrent writers to a table, adding more instances to the cluster does not necessarily require table reorganizations.
- CHAPTER 11Backup and Recovery Options 391
- 392 Oracle Database 11g DBA Handbook racle provides a variety of backup procedures and options that help protect an O Oracle database. If they are properly implemented, these options will allow you to effectively back up your databases and recover them easily and efficiently. Oracle’s backup capabilities include logical and physical backups, both of which have a number of options available. This chapter will not detail every possible option and recovery scenario; rather, I will focus on using the best options in the most effective manner possible. You will see how to best integrate the available backup procedures with each other and with the operating system backups. You will also see details on the options for Data Pump Export and Import, which were introduced in Oracle Database 10g. Capabilities There are three standard methods of backing up an Oracle database: exports, offline backups, and online backups. An export is a logical backup of the database; the other two backup methods are physical file backups. In the following sections, you will see each of these options described. The standard (and preferred) tool for physical backups is Oracle’s Recovery Manager (RMAN) utility; see Chapter 12 for details on the implementation and usage of RMAN. A robust backup strategy includes both physical and logical backups. In general, production databases rely on physical backups as their primary backup method, and logical backups serve as the secondary method. For development databases and for some small data movement processing, logical backups offer a viable solution. You should understand the implications and uses of both physical and logical backups in order to develop the most appropriate solution for your applications. Logical Backups A logical backup of a database involves reading a set of database records and writing them to a file. These records are read independently of their physical location. In Oracle, the Data Pump Export utility performs this type of database backup. To recover using the file generated from a Data Pump Export, you use Data Pump Import. NOTE Oracle’s Import and Export utilities, available prior to Oracle Database 10g, are still provided as part of the Oracle 11g installation. Users of the old Export and Import utilities are encouraged to replace their usage with Data Pump Export and Data Pump Import. Oracle’s Data Pump Export utility queries the database, including the data dictionary, and writes the output to an XML file called an export dump file. You can export the full database, specific users, tablespaces, or specific tables. During exports, you may choose whether or not to export the data dictionary information associated with tables, such as grants, indexes, and constraints. The file written by Data Pump Export will contain the commands necessary to completely re-create all the chosen objects and data. Once data has been exported via Data Pump Export, it may be imported via the Data Pump Import utility. Data Pump Import reads the dump file created by Data Pump Export and executes the commands found there. For example, these commands may include a create table command, followed by an insert command to load data into the table.
- Chapter 11: Backup and Recovery Options 393 NOTE Data Pump Export and Import can use a network connection for a simultaneous export and import operation, avoiding the use of intermediate operating system files and reducing total export and import time. The data that has been exported does not have to be imported into the same database, or thesame schema, as was used to generate the export dump file. You may use the export dump file tocreate a duplicate set of the exported objects under a different schema or in a separate database. You can import either all or part of the exported data. If you import the entire export dump filefrom a full export, then all the database objects, including tablespaces, datafiles, and users, willbe created during the import. However, it is often useful to precreate tablespaces and users inorder to specify the physical distribution of objects in the database. If you are only going to import part of the data from the export dump file, the tablespaces,datafiles, and users that will own and store that data should be set up prior to the import.Physical BackupsPhysical backups involve copying the files that constitute the database. These backups are alsoreferred to as file system backups because they involve using operating system file backupcommands. Oracle supports two different types of physical file backups: offline backups and theonline backups (also known as cold and hot backups, respectively). You can use the RMAN utility(see Chapter 12) to perform all physical backups. You may optionally choose to write your ownscripts to perform physical backups, but doing so will prevent you from obtaining many of thebenefits of the RMAN approach.Offline BackupsConsistent offline backups occur when the database has been shut down normally (that is, notdue to instance failure) using the normal, immediate, or transactional option of the shutdowncommand. While the database is “offline,” the following files should be backed up: ■ All datafiles ■ All controlfiles ■ All archived redo log files ■ The init.ora file or server parameter file (SPFILE) CAUTION You should never, ever, want or need to back up online redo log files. Although there is a slight time-savings for restoring from a cold backup after a clean shutdown, the risk of losing committed transactions outweighs the convenience. Your online redo logs should be mirrored and multiplexed so that you (virtually) never will lose the current online log file.
- 394 Oracle Database 11g DBA Handbook Having all these files backed up while the database is closed provides a complete image of the database as it existed at the time it was closed. The full set of these files could be retrieved from the backups at a later date, and the database would be able to function. It is not valid to perform a file system backup of the database while it is open unless an online backup is being performed. Offline backups that occur following database aborts will also be considered inconsistent and may require more effort to use during recoveries if they are usable. Online Backups You can use online backups for any database that is running in ARCHIVELOG mode. In this mode, the online redo logs are archived, creating a log of all transactions within the database. Oracle writes to the online redo log files in a cyclical fashion: After filling the first log file, it begins writing to the second, until that one fills, and then it begins writing to the third. Once the last online redo log file is filled, the LGWR (Log Writer) background process begins to overwrite the contents of the first redo log file. When Oracle is run in ARCHIVELOG mode, the ARCH (Archiver) background process makes a copy of each redo log file before overwriting it. These archived redo log files are usually written to a disk device. The archived redo log files may also be written directly to a tape device, but disk space is getting cheap enough that the additional cost of archiving to disk is offset by the time and labor savings when a disaster recovery operation must occur. NOTE Most production databases, particularly those that support transaction- processing applications, must be run in ARCHIVELOG mode. You can perform file system backups of a database while that database is open, provided the database is running in ARCHIVELOG mode. An online backup involves setting each tablespace into a backup state, backing up its datafiles, and then restoring the tablespace to its normal state. NOTE When using the Oracle-supplied Recovery Manager (RMAN) utility, you do not have to manually place each tablespace into a backup state. RMAN reads the data blocks in the same manner Oracle uses for queries. The database can be fully recovered from an online backup, and it can, via the archived redo logs, be rolled forward to any point in time before the failure. When the database is then opened, any committed transactions that were in the database at the time of the failure will have been restored, and any uncommitted transactions will have been rolled back. While the database is open, the following files can be backed up: ■ All datafiles ■ All archived redo log files ■ One control file, via the alter database backup controlfile ■ The server parameter file (SPFILE)
- Chapter 11: Backup and Recovery Options 395 NOTE RMAN automatically backs up the control file and SPFILE whenever the entire database or the SYSTEM tablespace are backed up. Online backup procedures are very powerful for two reasons. First, they provide full point-in-time recovery. Second, they allow the database to remain open during the file system backup.Even databases that cannot be shut down due to user requirements can still have file-systembackups. Keeping the database open also keeps the System Global Area (SGA) of the databaseinstance from being cleared when the database is shut down and restarted. Keeping the SGAmemory from being cleared will improve the database’s performance because it will reduce thenumber of physical I/Os required by the database. NOTE You can use the flashback database option, introduced in Oracle Database 10g, to roll the database backward in time without relying on physical backups. To use the flashback database command, you must have a Flash Recovery Area defined, be running in ARCHIVELOG mode, and must have issued the alter database flashback on command while the database was mounted but not open. Logs written to the Flash Re
Subscribe to:
Posts (Atom)