Oracle database FAQ

From Oracle FAQ
Jump to: navigation, search

Oracle database FAQ:

How does one create a new database?[edit]

One can create and modify Oracle databases using the Oracle DBCA (Database Configuration Assistant) utility. The dbca utility is located in the $ORACLE_HOME/bin directory. The Oracle Universal Installer (oui) normally starts it after installing the database server software to create the starter database.

One can also create databases manually using scripts. This option, however, is falling out of fashion as it is quite involved and error prone. Look at this example for creating an Oracle 9i or higher database:

CONNECT SYS AS SYSDBA
ALTER SYSTEM SET DB_CREATE_FILE_DEST='/u01/oradata/';
ALTER SYSTEM SET DB_CREATE_ONLINE_LOG_DEST_1='/u02/oradata/';
ALTER SYSTEM SET DB_CREATE_ONLINE_LOG_DEST_2='/u03/oradata/';
CREATE DATABASE;

Also see Creating a New Database.

What database block size should I use?[edit]

Oracle recommends that your database block size match, or be multiples of your operating system block size. One can use smaller block sizes, but the performance cost is significant. Your choice should depend on the type of application you are running. If you have many small transactions as with OLTP, use a smaller block size. With fewer but larger transactions, as with a DSS application, use a larger block size.

If you are using a volume manager, consider your "operating system block size" to be 8K. This is because volume manager products use 8K blocks and this is not configurable.

What database aspects should be monitored?[edit]

One should implement a monitoring system to constantly monitor the following aspects of a database. This can be achieved by writing custom scripts, implementing Oracle's Enterprise Manager, or buying a third-party monitoring product. If an alarm is triggered, the system should automatically notify the DBA (e-mail, text, etc.) to take appropriate action.

Infrastructure availability:

  • Is the database up and responding to requests
  • Are the listeners up and responding to requests
  • Are the Oracle Names and LDAP Servers up and responding to requests
  • Are the Application Servers up and responding to requests
  • Etc.

Things that can cause service outages:

  • Is the archive log destination filling up?
  • Objects getting close to their max extents
  • Tablespaces running low on free space / Objects that would not be able to extend
  • User and process limits reached
  • Etc.

How does one rename a database?[edit]

Follow these steps to rename a database:

  • Start by making a full database backup of your database (in case you need to restore if this procedure is not working).
  • Execute this command from sqlplus while connected to 'SYS AS SYSDBA':
ALTER DATABASE BACKUP CONTROLFILE TO TRACE RESETLOGS;
  • Locate the latest dump file in your USER_DUMP_DEST directory (show parameter USER_DUMP_DEST) - rename it to something like dbrename.sql.
  • Edit dbrename.sql, remove all headers and comments, and change the database's name. Also change "CREATE CONTROLFILE REUSE ..." to "CREATE CONTROLFILE SET ...".
  • Shutdown the database (use SHUTDOWN NORMAL or IMMEDIATE, don't ABORT!) and run dbrename.sql.
  • Rename the database's global name:
ALTER DATABASE RENAME GLOBAL_NAME TO new_db_name;

Can one rename a database user (schema)?[edit]

No, this is listed as Enhancement Request 158508. Workaround (including 9i):

  • Do a user-level export of user A
  • create new user B
  • import the user while renaming it
import system/manager fromuser=A touser=B
  • drop user A

Workaround (starting 10g)

  • Do a data pump schema export of user A
expdp system/manager schemas=A [directory=... dumpfile=... logfile=...]
  • import the user while renaming it
impdp system/manager schemas=A remap_schema=A:B [directory=... dumpfile=... logfile=...]
  • drop user A


Can one rename a tablespace?[edit]

From Oracle 10g Release 1, users can rename tablespaces. Example:

ALTER TABLESPACE ts1 RENAME TO ts2;

However, you must adhere to the following restrictions:

  • COMPATIBILITY must be set to at least 10.0.1
  • Cannot rename SYSTEM or SYSAUX
  • Cannot rename an offline tablespace
  • Cannot rename a tablespace that contains offline datafiles

For older releases, use the following workaround:

  • Export all of the objects from the tablespace
  • Drop the tablespace including contents
  • Recreate the tablespace
  • Import the objects

How does one see the uptime for a database?[edit]

Look at the following SQL query:

SELECT to_char(startup_time,'DD-MON-YYYY HH24:MI:SS') "DB Startup Time"
FROM   sys.v_$instance;

Can one resize tablespaces and data files?[edit]

Add more files to tablespaces

To add more space to a tablespace, one can simply add another file to it. Example:

ALTER TABLESPACE USERS ADD DATAFILE '/oradata/orcl/users1.dbf' SIZE 100M;

Resize datafiles

One can manually increase or decrease the size of a datafile from Oracle 7.2 using the following command:

ALTER DATABASE DATAFILE 'filename2' RESIZE 100M;

Because you can change the sizes of datafiles, you can add more space to your database without adding more datafiles. This is beneficial if you are concerned about reaching the maximum number of datafiles allowed in your database.

Manually reducing the sizes of datafiles allows you to reclaim unused space in the database. This is useful for correcting errors in estimations of space requirements.

Extend datafiles

Also, datafiles can be allowed to automatically extend if more space is required. Look at the following commands:

CREATE TABLESPACE pcs_data_ts
       DATAFILE 'c:ora_appspcspcsdata1.dbf' SIZE 3M
                AUTOEXTEND ON NEXT 1M  MAXSIZE UNLIMITED
       DEFAULT STORAGE (  INITIAL 10240
                          NEXT 10240
                          MINEXTENTS 1
                          MAXEXTENTS UNLIMITED
                          PCTINCREASE 0)
       ONLINE
       PERMANENT;
ALTER DATABASE DATAFILE 1 AUTOEXTEND ON NEXT 1M  MAXSIZE UNLIMITED;

How do I find the overall database size?[edit]

The biggest portion of a database's size comes from the datafiles. To find out how many megabytes are allocated to ALL datafiles:

select sum(bytes)/1024/1024 "Meg" from dba_data_files;

To get the size of all TEMP files:

select nvl(sum(bytes),0)/1024/1024 "Meg" from dba_temp_files;

To get the size of the on-line redo-logs:

select sum(bytes)/1024/1024 "Meg" from sys.v_$log;

Putting it all together into a single query:

select a.data_size+b.temp_size+c.redo_size "total_size"
from ( select sum(bytes) data_size
         from dba_data_files ) a,
     ( select nvl(sum(bytes),0) temp_size
         from dba_temp_files ) b,
     ( select sum(bytes) redo_size
         from sys.v_$log ) c;

Another query ("Free space" reports data files free space):

col "Database Size" format a20 
col "Free space" format a20 
select round(sum(used.bytes) / 1024 / 1024 ) || ' MB' "Database Size" 
,      round(free.p / 1024 / 1024) || ' MB' "Free space" 
from (select bytes from v$datafile 
      union all 
      select bytes from v$tempfile 
      union all 
      select bytes from v$log) used 
,    (select sum(bytes) as p from dba_free_space) free 
group by free.p 
/

How do I find the used space within the database size?[edit]

Select from the DBA_SEGMENTS or DBA_EXTENTS views to find the used space of a database. Example:

SELECT SUM(bytes)/1024/1024 "Meg" FROM dba_segments;

Where can one find the high water mark for a table?[edit]

There is no single system table which contains the high water mark (HWM) for a table. A table's HWM can be calculated using the results from the following SQL statements:

SELECT BLOCKS
FROM   DBA_SEGMENTS
WHERE  OWNER=UPPER(owner) AND SEGMENT_NAME = UPPER(table);

ANALYZE TABLE owner.table ESTIMATE STATISTICS;

SELECT EMPTY_BLOCKS
FROM   DBA_TABLES
WHERE  OWNER=UPPER(owner) AND TABLE_NAME = UPPER(table);

Thus, the tables' HWM = (query result 1) - (query result 2) - 1

NOTE: You can also use the DBMS_SPACE package and calculate the HWM = TOTAL_BLOCKS - UNUSED_BLOCKS - 1.

How do I find used/free space in a TEMPORARY tablespace?[edit]

Unlike normal tablespaces, true temporary tablespace information is not listed in DBA_FREE_SPACE. Instead use the V$TEMP_SPACE_HEADER view:

SELECT tablespace_name, SUM(bytes_used), SUM(bytes_free)
FROM   V$temp_space_header
GROUP  BY tablespace_name;

To report true free space within the used portion of the TEMPFILE:

SELECT   A.tablespace_name tablespace, D.mb_total,
         SUM (A.used_blocks * D.block_size) / 1024 / 1024 mb_used,
         D.mb_total - SUM (A.used_blocks * D.block_size) / 1024 / 1024 mb_free
FROM     v$sort_segment A,
         (
         SELECT   B.name, C.block_size, SUM (C.bytes) / 1024 / 1024 mb_total
         FROM     v$tablespace B, v$tempfile C
         WHERE    B.ts#= C.ts#
         GROUP BY B.name, C.block_size
         ) D
WHERE    A.tablespace_name = D.name
GROUP by A.tablespace_name, D.mb_total;

How can one see who is using a temporary segment?[edit]

For every user using temporary space, there is an entry in SYS.V_$LOCK with type 'TS'.

All temporary segments are named 'ffff.bbbb' where 'ffff' is the file it is in and 'bbbb' is first block of the segment.

If your temporary tablespace is set to TEMPORARY, all sorts are done in one large temporary segment. For usage stats, see SYS.V_$SORT_SEGMENT

From Oracle 8, one can just query SYS.v$sort_usage. Look at these examples:

select s.username, u."USER", u.tablespace, u.contents, u.extents, u.blocks
from   sys.v_$session s, sys.v_$sort_usage u
where  s.saddr = u.session_addr
/

select s.osuser, s.process, s.username, s.serial#,
       sum(u.blocks)*vp.value/1024 sort_size
from   sys.v_$session s, sys.v_$sort_usage u, sys.v_$parameter vp
where  s.saddr = u.session_addr
  and  vp.name = 'db_block_size'
  and  s.osuser like '&1'
group  by s.osuser, s.process, s.username, s.serial#, vp.value
/

Who is using which UNDO or TEMP segment?[edit]

Execute the following query to determine who is using a particular UNDO or Rollback Segment:

SQL> SELECT TO_CHAR(s.sid)||','||TO_CHAR(s.serial#) sid_serial,
  2         NVL(s.username, 'None') orauser,
  3         s.program,
  4         r.name undoseg,
  5         t.used_ublk * TO_NUMBER(x.value)/1024||'K' "Undo"
  6    FROM sys.v_$rollname    r,
  7         sys.v_$session     s,
  8         sys.v_$transaction t,
  9         sys.v_$parameter   x
 10   WHERE s.taddr = t.addr
 11     AND r.usn   = t.xidusn(+)
 12     AND x.name  = 'db_block_size'

SID_SERIAL ORAUSER    PROGRAM                        UNDOSEG         Undo
---------- ---------- ------------------------------ --------------- -------
260,7      SCOTT      sqlplus@localhost.localdomain  _SYSSMU4$       8K
                      (TNS V1-V3)

Execute the following query to determine who is using a TEMP Segment:

SQL> SELECT b.tablespace,
  2         ROUND(((b.blocks*p.value)/1024/1024),2)||'M' "SIZE",
  3         a.sid||','||a.serial# SID_SERIAL,
  4         a.username,
  5         a.program
  6    FROM sys.v_$session a,
  7         sys.v_$sort_usage b,
  8         sys.v_$parameter p
  9   WHERE p.name  = 'db_block_size'
 10     AND a.saddr = b.session_addr
 11  ORDER BY b.tablespace, b.blocks; 

TABLESPACE SIZE    SID_SERIAL USERNAME PROGRAM
---------- ------- ---------- -------- ------------------------------
TEMP       24M     260,7      SCOTT    sqlplus@localhost.localdomain
                                       (TNS V1-V3)

How does one get the view definition of fixed views/tables?[edit]

Query v$fixed_view_definition. Example:

SELECT * FROM v$fixed_view_definition WHERE view_name='V$SESSION';

How full is the current redo log file?[edit]

Here is a query that can tell you how full the current redo log file is. Handy for when you need to predict when the next log file will be archived out.

SQL> SELECT le.leseq                  "Current log sequence No",
  2         100*cp.cpodr_bno/le.lesiz "Percent Full",
  3         cp.cpodr_bno              "Current Block No",
  4         le.lesiz                  "Size of Log in Blocks"
  5    FROM x$kcccp cp, x$kccle le
  6   WHERE le.leseq =CP.cpodr_seq
  7     AND bitand(le.leflg,24) = 8
  8  /
Current log sequence No Percent Full Current Block No Size of Log in Blocks
----------------------- ------------ ---------------- ---------------------
                    416   48.6669922            49835                102400

Tired of typing sqlplus '/as sysdba' every time you want to do something?[edit]

If you are tired of typing sqlplus "/as sysdba" every time you want to perform some DBA task, implement the following shortcut:

On Unix/Linux systems:

Add the following alias to your .profile or .bash_profile file:

alias sss='sqlplus "/as sysdba"'

On Windows systems:

Create a batch file, sss.bat, add the command to it, and place it somewhere in your PATH. Whenever you now want to start sqlplus as sysdba, just type "sss". Much less typing for ya lazy DBA's.

Note: From Oracle 10g you don't need to put the "/AS SYSDBA" in quotes anymore.

What patches are installed within an Oracle Home?[edit]

DBA's often do not document the patches they install. This may lead to situations where a feature works on machine X, but not on machine Y. This FAQ will show how you can list and compare the patches installed within your Oracle Homes.

All patches that are installed with Oracle's OPatch Utility (Oracle's Interim Patch Installer) can be listed by invoking the opatch command with the lsinventory option. Here is an example:

$ cd $ORACLE_HOME/OPatch

$ opatch lsinventory
Invoking OPatch 10.2.0.1.0

Oracle interim Patch Installer version 10.2.0.1.0
Copyright (c) 2005, Oracle Corporation.  All rights reserved..
...
Installed Top-level Products (1):

Oracle Database 10g                                           10.2.0.1.0
There are 1 products installed in this Oracle Home.
There are no Interim patches installed in this Oracle Home.

OPatch succeeded.

NOTE: If OPatch is not installed into your Oracle Home ($ORACLE_HOME/OPatch), you may need to download it from Metalink and install it yourself.

How does one give developers access to trace files (required as input to tkprof)?[edit]

The alter session set sql_trace=true command generates trace files in USER_DUMP_DEST that can be used by developers as input to tkprof. On Unix the default file mask for these files are "rwx r-- ---".

There is an undocumented INIT.ORA parameter that will allow everyone to read (rwx r-- r--) these trace files:

_trace_files_public = true

Include this in your INIT.ORA file and bounce your database for it to take effect.

FAQ contributed by Erlie Flynn