Check for database space issues


Find information about tablespace space

The DBA_FREE_SPACE data dictionary view shows the remaining space of a tablespace. This example shows the amount of free space for extents in tablespace 'EDACS01':

SELECT TABLESPACE_NAME, FILE_ID, BYTES, BLOCKS FROM DBA_FREE_SPACE
WHERE TABLESPACE_NAME = 'EDACS01';
TABLESPACE_NAME                   FILE_ID      BYTES     BLOCKS
------------------------------ ---------- ---------- ----------
EDACS01                                 5  396296192      48376

Check the segment size and number of used extends in a particular schema

The following query returns the name, size and number of extends of each table in schema 'EDACSADMIN'. It shows which table is extending most heavily.

SET LINE 120
COL TABLENAME FORMAT a20

SELECT SEGMENT_NAME "TABLENAME", TABLESPACE_NAME, BYTES, BLOCKS, EXTENTS FROM DBA_SEGMENTS
WHERE SEGMENT_TYPE = 'TABLE' AND OWNER='EDACSADMIN' ORDER BY EXTENTS DESC;
TABLENAME            TABLESPACE_NAME                     BYTES     BLOCKS    EXTENTS
-------------------- ------------------------------ ---------- ---------- ----------
EDACS_MAINLOG        EDACS01                          22020096       2688         21
EDACS_USERS          EDACS01                           1048576        128         16
EDACS_REMOTE         EDACS01                           1048576        128         16
EDACS_ROUTER         EDACS01                           1048576        128         16
EDACS_DAYSTATS       EDACS01                           1048576        128         16
EDACS_VERSION        EDACS01                           1048576        128         16
EDACS_MONSTATS       EDACS01                           1048576        128         16
EDACS_SERVICE        EDACS01                           1048576        128         16
EDACS_TEMPLOG        EDACS01                           2097152        256          2

The same request for indizes. It shows which index is extending most heavily.

SET LINE 120
COL INDEX FORMAT a20
SELECT SEGMENT_NAME "INDEX", TABLESPACE_NAME, BYTES, BLOCKS, EXTENTS FROM DBA_SEGMENTS
WHERE SEGMENT_TYPE = 'INDEX' AND OWNER='EDACSADMIN' ORDER BY EXTENTS DESC;

INDEX                TABLESPACE_NAME                     BYTES     BLOCKS    EXTENTS
-------------------- ------------------------------ ---------- ---------- ----------
MAINLOG_PK           EDACS01                          20971520       2560         20
TEMPLOG_PK           EDACS01                          20971520       2560         20
MONSTATS_PK          EDACS01                           1048576        128         16
VERSION_PK           EDACS01                           1048576        128         16
D_02                 EDACS01                          11534336       1408         11
D_01                 EDACS01                           9437184       1152          9
D_03                 EDACS01                           8388608       1024          8
USERS_PK             EDACS01                           5242880        640          5
REMOTE_PK            EDACS01                           5242880        640          5
ROUTER_PK            EDACS01                           5242880        640          5
SERVICE_PK           EDACS01                           5242880        640          5
DAYSTATS_PK          EDACS01                           2097152        256          2

The following script checksize.sql checks for the remaining free space in all tablespaces

select 
a.file_id,
substr(a.tablespace_name,1,14) tablespace_name,
trunc(decode(a.autoextensible,'YES',a.maxsize-a.bytes+b.free,'NO',b.free)/1024/1024) free_mb,
trunc(a.bytes/1024/1024) size_mb,
trunc(a.maxsize/1024/1024) maxsize_mb,
a.autoextensible ae,
trunc(decode (a.autoextensible,'YES', (a.maxsize-a.bytes+b.free)/a.maxsize*100,'NO',b.free/a.maxsize*100 ) ) free_pct
from
(select file_id,
tablespace_name,
autoextensible,
bytes,
decode(autoextensible,'YES',maxbytes,bytes) maxsize
from dba_data_files
group by file_id,
tablespace_name,
autoextensible,
bytes,
decode(autoextensible,'YES',maxbytes,bytes)) a,
(select file_id,
tablespace_name,
sum(bytes) free
from dba_free_space
group by file_id,
tablespace_name) b
where a.file_id=b.file_id(+)
and a.tablespace_name=b.tablespace_name(+)
order by a.tablespace_name asc;

SQL> @checksize.sql

   FILE_ID TABLESPACE_NAM    FREE_MB    SIZE_MB MAXSIZE_MB AE    FREE_PCT
---------- -------------- ---------- ---------- ---------- --- ----------
         5 EDACS01               377        500        500 NO          75
         3 SYSAUX              32636        150      32767 YES         99
         1 SYSTEM              32550        300      32767 YES         99
         2 UNDOTBS1            32761        125      32767 YES         99
         4 USERS               32767          5      32767 YES         99

Reorganizing Oracle Indizes


In order to reduce the number of extents, whe recreate the index by setting the initial extent to the current index size. The current index size is found by:

SELECT SUM(BYTES) FROM DBA_EXTENTS WHERE SEGMENT_NAME = 'D_01';

SUM(BYTES)
----------
9437184

DROP INDEX D_01;

create index d_01 on edacs_mainlog(service, start_date) tablespace edacs01
storage(initial 20m next 10m pctincrease 0);

Reorganising Oracle Tables


For reorganizing tables, it is best to use a new tablespace. Then using the MOVE clause in the ALTER TABLE allows to change the tablespace and/or storage parameters of an Oracle table. Add the word ONLINE to the syntax and the table can be moved even while users are updating it.

/* *******************************************************************
** cr_tblspc.sql: creates tablespace for e-dacs
**
** example:
** create tablespace edacs01 datafile '<path-to-dbfile>' size 500 M; */

create tablespace edacs02 datafile '/u02/oradata/work2/edacsdb02.dbf' size 500 M;

ALTER TABLE EDACS_USERS MOVE
TABLESPACE EDACS02
STORAGE (INITIAL 8m NEXT 8m PCTINCREASE 0);

Alternatively, by using the SQL statement 'CREATE TABLE AS SELECT' we can also change the storage parameters for a table (INITIAL, NEXT, FREELISTS) by making a table copy, then dropping the original and remaning the copy to original.

create table EDACS_USERS_NEW tablespace EDACS02 storage (initial 8m next 8m
 pctincrease 0) as select * from EDACSADMIN.EDACS_USERS order by USERNAME;

If the flashback feature was not disabled, dropping a table in Oracle 10g just renames and puts it into the recycle bin. The object is now visible as something like "BIN$P7xjEd08uMfgQFVGYRAoxw==$0". Remove it with 'purge dba_recyclebin;' forever. Dropping a table also drops dependent objects such as primary keys and indizes. They have to be rebuild. The oldfasioned way is to use export/import to rebuild the tables from scratch.

oracle@debbie:~$ exp edacsadmin/xxx@work2 file=edacs_user_tbl.dmp tables=edacs_users
Export: Release 10.1.0.2.0 - Production on Sun Nov 25 16:46:59 2007
Copyright (c) 1982, 2004, Oracle.  All rights reserved.
Connected to: Oracle Database 10g Release 10.1.0.2.0 - Production
           Export done in US7ASCII character set and AL16UTF16 NCHAR character set
           server uses WE8ISO8859P1 character set (possible charset conversion)
About to export specified tables via Conventional Path ...
           . . exporting table                    EDACS_USERS        740 rows exported
           EXP-00091: Exporting questionable statistics.
           EXP-00091: Exporting questionable statistics.
           Export terminated successfully with warnings.