You are on page 1of 11

Oracle database FAQ

Oracle database FAQ:


Contents
[hide]

1 How does one create a new database?


2 What database block size should I use?
3 What database aspects should be monitored?
4 How does one rename a database?
5 Can one rename a database user (schema)?
6 Can one rename a tablespace?
7 How does one see the uptime for a database?
8 Can one resize tablespaces and data files?
9 How do I find the overall database size?
10 How do I find the used space within the database size?
11 Where can one find the high water mark for a table?
12 How do I find used/free space in a TEMPORARY tablespace?
13 How can one see who is using a temporary segment?
14 Who is using which UNDO or TEMP segment?
15 How does one get the view definition of fixed views/tables?
16 How full is the current redo log file?
17 Tired of typing sqlplus '/as sysdba' every time you want to do something?
18 What patches are installed within an Oracle Home?
19 How does one give developers access to trace files (required as input to
tkprof)?

[edit]How

does one create a new database?

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.
[edit]What

database block size should I use?

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).
[edit]What

database aspects should be monitored?

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.

[edit]How

does one rename a database?

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;


[edit]Can

one rename a database user (schema)?

No, this is listed as Enhancement Request 158508. Workaround:

Do a user-level export of user A

create new user B

import system/manager fromuser=A touser=B

drop user A

[edit]Can

one rename a tablespace?

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

[edit]How

does one see the uptime for a database?

Look at the following SQL query:


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

one resize tablespaces and data files?

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;
[edit]How

do I find the overall database size?

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
/
[edit]How

do I find the used space within the database size?

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;
[edit]Where

can one find the high water mark for a table?

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.
[edit]How

do I find used/free space in a TEMPORARY tablespace?

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;
[edit]How

can one see who is using a temporary segment?

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
/
[edit]Who

is using which UNDO or TEMP segment?

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)
[edit]How

does one get the view definition of fixed views/tables?

Query v$fixed_view_definition. Example:


SELECT * FROM v$fixed_view_definition WHERE view_name='V$SESSION';
[edit]How

full is the current redo log file?

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
[edit]Tired

of typing sqlplus '/as sysdba' every time you want to do


something?

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.
[edit]What

patches are installed within an Oracle Home?

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
There are 1 products installed in this Oracle Home.
There are no Interim patches installed in this Oracle Home.

10.2.0.1.0

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.

[edit]How

does one give developers access to trace files (required as


input to tkprof)?
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.

You might also like