Início / Trilha 2 / Conteúdo / Tópico 6
6

Gerenciamento de Tablespaces e Datafiles

Criar, expandir, mover tablespaces, OMF, bigfile

📚

Conceitos de Tablespaces e Datafiles

O que são Tablespaces?

Um tablespace é uma unidade lógica de armazenamento no Oracle Database. É a camada entre os objetos de banco de dados (tabelas, índices) e os arquivos físicos (datafiles).

Hierarquia de Armazenamento:

Database (contém múltiplos tablespaces)
Tablespace (contém múltiplos datafiles)
Datafile (arquivo físico no SO)
Segments (tabela, índice, etc.)
Extents (conjunto de blocos contíguos)
Blocks (menor unidade de I/O)

Tablespace (Lógico)

  • Abstração lógica
  • Pode ter múltiplos datafiles
  • Pode crescer adicionando datafiles
  • Unidade de backup/recovery

Datafile (Físico)

  • Arquivo físico no disco
  • Pertence a exatamente um tablespace
  • Pode crescer (AUTOEXTEND)
  • Pode ser movido/renomeado

Tablespaces Padrão do Oracle

SYSTEM

Contém o dicionário de dados (metadados) do banco. Essencial - sem ele o banco não funciona. Nunca armazene dados de usuário aqui.

SYSAUX

Tablespace auxiliar do SYSTEM. Contém componentes como AWR, APEX, Spatial, etc. Reduz a carga no tablespace SYSTEM.

USERS

Tablespace padrão para objetos de usuários. Pequeno, apenas para propósito de exemplo. Em produção, crie tablespaces específicos por aplicação.

TEMP

Tablespace temporário para operações de ordenação, hash joins, CREATE INDEX, etc. Usa TEMPFILEs (não datafiles) - mais leve, sem redo.

UNDOTBS1

Armazena informações de undo (desfazer) para rollback de transações e read consistency. Essencial para ACID.

Criando Tablespaces

Criação Básica

-- Criar tablespace simples com um datafile
CREATE TABLESPACE dados_app
  DATAFILE '/u02/oradata/ORCL/dados_app01.dbf' SIZE 100M;

-- Criar tablespace com AUTOEXTEND (crescimento automático)
CREATE TABLESPACE dados_vendas
  DATAFILE '/u02/oradata/ORCL/vendas01.dbf'
  SIZE 100M
  AUTOEXTEND ON
  NEXT 10M        -- Cresce em incrementos de 10MB
  MAXSIZE 2G;     -- Tamanho máximo

-- Criar tablespace com múltiplos datafiles
CREATE TABLESPACE dados_historico
  DATAFILE '/u02/oradata/ORCL/hist01.dbf' SIZE 500M,
           '/u03/oradata/ORCL/hist02.dbf' SIZE 500M,
           '/u04/oradata/ORCL/hist03.dbf' SIZE 500M;

-- Criar tablespace permanente com opções avançadas
CREATE TABLESPACE dados_producao
  DATAFILE '/u02/oradata/ORCL/prod01.dbf' SIZE 1G AUTOEXTEND ON
  EXTENT MANAGEMENT LOCAL        -- Gerenciamento local de extents (padrão)
  SEGMENT SPACE MANAGEMENT AUTO  -- Gerenciamento automático de espaço (ASSM)
  DEFAULT COMPRESS FOR OLTP;     -- Compressão OLTP padrão

Tablespace Temporário

-- Criar tablespace temporário
CREATE TEMPORARY TABLESPACE temp2
  TEMPFILE '/u02/oradata/ORCL/temp02.dbf' SIZE 500M
  AUTOEXTEND ON
  NEXT 50M
  MAXSIZE 2G;

-- Definir como default temp tablespace
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp2;

-- Ver tablespace temporário padrão
SELECT property_name, property_value
FROM database_properties
WHERE property_name = 'DEFAULT_TEMP_TABLESPACE';

Tablespace Undo

-- Criar tablespace undo
CREATE UNDO TABLESPACE undotbs2
  DATAFILE '/u02/oradata/ORCL/undotbs02.dbf' SIZE 500M
  AUTOEXTEND ON;

-- Trocar para novo undo tablespace (dinâmico)
ALTER SYSTEM SET undo_tablespace = undotbs2;

-- Verificar undo tablespace ativo
SHOW PARAMETER undo_tablespace;

-- Após migração bem-sucedida, pode-se dropar o antigo
DROP TABLESPACE undotbs1 INCLUDING CONTENTS AND DATAFILES;
📈

Expandindo Tablespaces

Três Formas de Expandir

1. Adicionar Novo Datafile

Forma mais comum. Distribui I/O entre múltiplos datafiles.

ALTER TABLESPACE dados_app
  ADD DATAFILE '/u02/oradata/ORCL/dados_app02.dbf' SIZE 200M
  AUTOEXTEND ON
  NEXT 10M
  MAXSIZE 1G;

2. Redimensionar Datafile Existente

Aumenta o tamanho de um datafile existente.

-- Aumentar para tamanho específico
ALTER DATABASE DATAFILE '/u02/oradata/ORCL/dados_app01.dbf' RESIZE 500M;

-- Ou redimensionar usando file_id
ALTER DATABASE DATAFILE 5 RESIZE 500M;

3. Habilitar/Modificar AUTOEXTEND

Permite crescimento automático quando necessário.

-- Habilitar autoextend em datafile existente
ALTER DATABASE DATAFILE '/u02/oradata/ORCL/dados_app01.dbf'
  AUTOEXTEND ON
  NEXT 50M
  MAXSIZE UNLIMITED;  -- Cuidado com UNLIMITED!

-- Desabilitar autoextend
ALTER DATABASE DATAFILE '/u02/oradata/ORCL/dados_app01.dbf'
  AUTOEXTEND OFF;

Monitorando Espaço

-- Ver uso de espaço por tablespace
SELECT
    t.tablespace_name,
    ROUND(SUM(d.bytes)/1024/1024, 2) AS total_mb,
    ROUND(SUM(CASE WHEN f.bytes IS NOT NULL THEN f.bytes ELSE 0 END)/1024/1024, 2) AS free_mb,
    ROUND((SUM(d.bytes) - SUM(CASE WHEN f.bytes IS NOT NULL THEN f.bytes ELSE 0 END))/1024/1024, 2) AS used_mb,
    ROUND(((SUM(d.bytes) - SUM(CASE WHEN f.bytes IS NOT NULL THEN f.bytes ELSE 0 END)) / SUM(d.bytes)) * 100, 2) AS pct_used
FROM dba_tablespaces t
LEFT JOIN dba_data_files d ON t.tablespace_name = d.tablespace_name
LEFT JOIN dba_free_space f ON d.file_id = f.file_id
WHERE t.contents = 'PERMANENT'
GROUP BY t.tablespace_name
ORDER BY pct_used DESC;

-- Ver datafiles e seu uso
SELECT
    file_name,
    tablespace_name,
    ROUND(bytes/1024/1024, 2) AS size_mb,
    ROUND(maxbytes/1024/1024, 2) AS maxsize_mb,
    autoextensible,
    status
FROM dba_data_files
ORDER BY tablespace_name, file_id;

-- Alertar sobre tablespaces com mais de 85% de uso
SELECT
    tablespace_name,
    ROUND((used_space/total_space) * 100, 2) AS pct_used
FROM (
    SELECT
        d.tablespace_name,
        SUM(d.bytes) AS total_space,
        SUM(d.bytes) - SUM(NVL(f.bytes, 0)) AS used_space
    FROM dba_data_files d
    LEFT JOIN dba_free_space f ON d.file_id = f.file_id
    GROUP BY d.tablespace_name
)
WHERE (used_space/total_space) > 0.85
ORDER BY pct_used DESC;
🚚

Movendo e Renomeando Datafiles

Movendo Datafiles (Banco Online)

A partir do Oracle 12c, é possível mover datafiles com o banco online.

-- Mover datafile (Oracle 12c+, banco ONLINE)
ALTER DATABASE MOVE DATAFILE '/u02/oradata/ORCL/dados_app01.dbf'
  TO '/u03/oradata/ORCL/dados_app01.dbf';

-- Oracle move automaticamente o arquivo e atualiza control file!

Movendo Datafiles (Banco Offline - 11g e anteriores)

-- 1. Fazer tablespace offline
ALTER TABLESPACE dados_app OFFLINE NORMAL;

-- 2. Mover arquivo fisicamente no SO (fora do SQL)
-- No Linux/Unix:
-- $ mv /u02/oradata/ORCL/dados_app01.dbf /u03/oradata/ORCL/dados_app01.dbf

-- 3. Atualizar control file
ALTER TABLESPACE dados_app
  RENAME DATAFILE '/u02/oradata/ORCL/dados_app01.dbf'
  TO '/u03/oradata/ORCL/dados_app01.dbf';

-- 4. Colocar tablespace online novamente
ALTER TABLESPACE dados_app ONLINE;

Movendo Tablespaces SYSTEM/SYSAUX

Tablespaces de sistema requerem que o banco esteja em modo MOUNT.

-- 1. Shutdown do banco
SHUTDOWN IMMEDIATE;

-- 2. Startup em modo MOUNT
STARTUP MOUNT;

-- 3. Copiar arquivo no SO
-- $ cp /u02/oradata/ORCL/system01.dbf /u03/oradata/ORCL/system01.dbf

-- 4. Renomear no control file
ALTER DATABASE RENAME FILE '/u02/oradata/ORCL/system01.dbf'
  TO '/u03/oradata/ORCL/system01.dbf';

-- 5. Abrir o banco
ALTER DATABASE OPEN;

-- 6. Remover arquivo antigo (após verificar que tudo está OK)
-- $ rm /u02/oradata/ORCL/system01.dbf
🤖

Oracle Managed Files (OMF)

O que é OMF?

Oracle Managed Files (OMF) permite que o Oracle gerencie automaticamente os nomes e localização de arquivos. Você não precisa especificar nomes de datafiles - o Oracle cria e exclui arquivos automaticamente.

Vantagens do OMF:

  • Simplifica criação de tablespaces e datafiles
  • Nomenclatura padrão e consistente
  • Exclusão automática de arquivos ao dropar tablespace
  • Reduz erros humanos com nomes de arquivo
-- Configurar localização padrão para OMF
ALTER SYSTEM SET db_create_file_dest = '/u02/oradata' SCOPE = BOTH;

-- Para arquivos de controle
ALTER SYSTEM SET db_create_online_log_dest_1 = '/u02/oradata' SCOPE = SPFILE;

-- Para recovery (FRA)
ALTER SYSTEM SET db_recovery_file_dest = '/u03/fra' SCOPE = BOTH;
ALTER SYSTEM SET db_recovery_file_dest_size = 50G SCOPE = BOTH;

Usando OMF

-- Criar tablespace SEM especificar datafile (usa OMF)
CREATE TABLESPACE dados_omf_test;
-- Oracle cria automaticamente algo como: /u02/oradata/ORCL/datafile/o1_mf_dados_om_k2h8xp6t_.dbf

-- Adicionar datafile sem especificar nome
ALTER TABLESPACE dados_omf_test ADD DATAFILE;
-- Oracle cria automaticamente o nome

-- Dropar tablespace (arquivos são excluídos automaticamente!)
DROP TABLESPACE dados_omf_test INCLUDING CONTENTS AND DATAFILES;
-- Com OMF, os datafiles são apagados do SO automaticamente

-- Ver arquivos criados via OMF
SELECT file_name, tablespace_name, bytes/1024/1024 AS size_mb
FROM dba_data_files
WHERE file_name LIKE '%o1_mf%'
ORDER BY tablespace_name;
📦

Bigfile Tablespaces

Smallfile vs Bigfile

Smallfile Tablespace (Padrão)

  • Pode ter até 1022 datafiles
  • Cada datafile até 4 milhões de blocos
  • Tamanho máximo datafile: ~32 GB (8KB blocos)
  • Melhor para ambientes tradicionais

Bigfile Tablespace

  • Tem apenas 1 datafile
  • Datafile pode ter até 4 bilhões de blocos
  • Tamanho máximo: ~128 TB (32KB blocos)
  • Ideal para very large databases (VLDB)

Quando Usar Bigfile?

  • Very Large Databases (VLDB) com tablespaces > 100 GB
  • Ambientes com Automatic Storage Management (ASM)
  • Reduzir quantidade de arquivos a gerenciar
  • Simplificar administração em ambientes muito grandes

Criando Bigfile Tablespace

-- Criar bigfile tablespace
CREATE BIGFILE TABLESPACE dados_big
  DATAFILE '/u02/oradata/ORCL/dados_big01.dbf' SIZE 10G
  AUTOEXTEND ON
  NEXT 1G
  MAXSIZE 100G;

-- Definir tipo padrão (BIGFILE ou SMALLFILE)
ALTER DATABASE SET DEFAULT BIGFILE TABLESPACE;

-- Verificar tipo de um tablespace
SELECT tablespace_name, bigfile
FROM dba_tablespaces
ORDER BY tablespace_name;

-- Expandir bigfile tablespace (apenas resize, não pode adicionar datafile!)
ALTER DATABASE DATAFILE '/u02/oradata/ORCL/dados_big01.dbf' RESIZE 50G;

Alterando Tablespace para Bigfile

⚠️ Atenção

Não é possível converter um tablespace SMALLFILE para BIGFILE diretamente! É necessário criar um novo tablespace BIGFILE e mover os objetos.

-- Processo para "converter" (na verdade, migrar):

-- 1. Criar novo tablespace BIGFILE
CREATE BIGFILE TABLESPACE dados_app_big
  DATAFILE '/u02/oradata/ORCL/dados_app_big01.dbf' SIZE 5G
  AUTOEXTEND ON;

-- 2. Mover tabelas para novo tablespace
ALTER TABLE minha_tabela MOVE TABLESPACE dados_app_big;

-- 3. Reconstruir índices (ficam inválidos após MOVE)
ALTER INDEX idx_minha_tabela REBUILD TABLESPACE dados_app_big;

-- Ou script para mover todos os objetos:
BEGIN
  FOR rec IN (SELECT table_name FROM dba_tables
              WHERE tablespace_name = 'DADOS_APP'
              AND owner = 'MYUSER') LOOP
    EXECUTE IMMEDIATE 'ALTER TABLE myuser.' || rec.table_name ||
                      ' MOVE TABLESPACE dados_app_big';
  END LOOP;
END;
/

-- 4. Após migração completa, dropar tablespace antigo
DROP TABLESPACE dados_app INCLUDING CONTENTS AND DATAFILES;
🔧

Operações Adicionais

Gerenciamento de Tablespaces

-- Colocar tablespace OFFLINE
ALTER TABLESPACE dados_app OFFLINE NORMAL;
-- OFFLINE NORMAL: checkpoint + close files (mais seguro)
-- OFFLINE TEMPORARY: close files sem checkpoint (rápido, requer recovery)
-- OFFLINE IMMEDIATE: força offline imediatamente (requer recovery)

-- Colocar tablespace ONLINE
ALTER TABLESPACE dados_app ONLINE;

-- Fazer tablespace READ ONLY (útil para dados históricos)
ALTER TABLESPACE dados_historico READ ONLY;

-- Voltar para READ WRITE
ALTER TABLESPACE dados_historico READ WRITE;

-- Dropar tablespace (sem remover arquivos)
DROP TABLESPACE dados_app INCLUDING CONTENTS;
-- Arquivos ficam no disco - você precisa apagá-los manualmente

-- Dropar tablespace (removendo arquivos do SO)
DROP TABLESPACE dados_app INCLUDING CONTENTS AND DATAFILES;
-- Remove arquivos automaticamente do SO

-- Dropar tablespace com constraints referenciando objetos nele
DROP TABLESPACE dados_app INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS;

-- Alterar default tablespace de usuário
ALTER USER myuser DEFAULT TABLESPACE dados_app QUOTA UNLIMITED ON dados_app;

-- Definir quota (limite de espaço) para usuário
ALTER USER myuser QUOTA 500M ON dados_app;

-- Ver quotas de usuários
SELECT username, tablespace_name, bytes/1024/1024 AS used_mb, max_bytes/1024/1024 AS quota_mb
FROM dba_ts_quotas
ORDER BY username, tablespace_name;

-- Listar todos os tablespaces
SELECT tablespace_name, status, contents, extent_management, segment_space_management
FROM dba_tablespaces
ORDER BY tablespace_name;

-- Ver objetos em um tablespace
SELECT owner, segment_name, segment_type, bytes/1024/1024 AS size_mb
FROM dba_segments
WHERE tablespace_name = 'DADOS_APP'
ORDER BY bytes DESC;
🎯

Resultado Esperado

O que você deve dominar após este tópico:

Criar tablespaces

Permanentes, temporários, undo, com opções avançadas

Expandir tablespaces

Adicionar datafiles, resize, autoextend

Monitorar espaço

Consultar uso, identificar tablespaces cheios

Mover datafiles

Online (12c+) e offline (11g)

Usar OMF

Configurar e criar tablespaces com Oracle Managed Files

Entender bigfile

Diferenças, quando usar, criar bigfile tablespaces

Gerenciar tablespaces

Online/offline, read only, drop, quotas

Consultar dicionário de dados

DBA_TABLESPACES, DBA_DATA_FILES, DBA_FREE_SPACE

Anterior: Parâmetros de Inicialização Voltar ao Índice