Em termos simples, uma tablespace é uma estrutura de armazenamento lógica dentro do Oracle Database. Pense nela como um contêiner virtual que agrupa segmentos de dados, como tabelas, índices e outros objetos de banco de dados. É fundamental entender que a tablespace é uma entidade lógica, enquanto o datafile (arquivo de dados) é a entidade física. Uma tablespace é composta por um ou mais datafiles.
Analogia: Imagine seu disco rígido (o hardware físico). Você pode criar várias pastas (como “Documentos”, “Imagens”, “Projetos”). Cada pasta é um local lógico para agrupar arquivos relacionados. No Oracle, a tablespace é como essa “pasta”, e os datafiles são os arquivos físicos que realmente ocupam espaço no disco.
Qual a Função de uma Tablespace?
As tablespaces desempenham várias funções vitais no Oracle Database:
- Organização Lógica: Permitem agrupar objetos de banco de dados relacionados. Por exemplo, você pode ter uma tablespace para dados de vendas (SALES_DATA), outra para índices (SALES_IDX) e outra para objetos do sistema (SYSTEM). Essa segregação ajuda na administração e otimização.
- Gerenciamento de Espaço: Você pode alocar e controlar o espaço em disco para diferentes tipos de dados. Se uma tablespace está ficando cheia, você pode adicionar um novo datafile a ela, sem precisar criar uma nova tabela ou mover dados.
- Performance: Ao separar tabelas de seus índices em tablespaces diferentes (que podem estar em discos físicos distintos), é possível reduzir contenção de I/O (Input/Output) e melhorar a performance das operações de leitura e escrita.
- Recuperação e Backup: Você pode realizar operações de backup e recuperação em nível de tablespace. Isso significa que, em caso de falha, você pode restaurar apenas as tablespaces afetadas, minimizando o tempo de inatividade.
- Segurança: Embora não seja seu objetivo principal, você pode atribuir cotas de espaço para usuários em tablespaces específicas, controlando o consumo de recursos.
Gerenciamento Básico de Tablespaces
O gerenciamento de tablespaces envolve várias operações, desde a criação até a modificação e monitoramento. Vamos explorar as mais comuns.
1. Verificando as Tablespaces Existentes
Para ver as tablespaces que já existem no seu banco de dados, você pode consultar a data dictionary view DBA_TABLESPACES:
SELECT tablespace_name, status, contents, logging
FROM dba_tablespaces
ORDER BY tablespace_name;

Você notará tablespaces como SYSTEM, SYSAUX, UNDOTBS e TEMP. Estas são tablespaces essenciais criadas por padrão pelo Oracle.
- SYSTEM: Contém o dicionário de dados (metadados do banco). É crucial e não deve ser utilizada para objetos de aplicação.
- SYSAUX: Uma tablespace auxiliar para o SYSTEM, contendo componentes como AWR, Optimizer Statistics, etc.
- UNDOTBS: Armazena dados de undo, essenciais para consistência de leitura e operações de rollback.
- TEMP: Utilizada para operações temporárias de SQL (ex: ORDER BY, GROUP BY, JOIN grandes) que não cabem na memória.
2. Criando uma Nova Tablespace
Criar uma tablespace é uma das operações mais comuns. É recomendado usar Tablespaces Gerenciadas Localmente (Locally Managed Tablespaces), que são o padrão e a melhor prática.
Sintaxe Básica:
CREATE TABLESPACE nome_da_tablespace DATAFILE 'caminho/para/datafile.dbf' SIZE 100M
AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED;
Exemplo:
CREATE TABLESPACE CUSTOMER_DATA
DATAFILE '/u01/app/oracle/oradata/CDBORG/PDB1/customer_data01.dbf' SIZE 100M
AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED;

- DATAFILE: Especifica o nome e o caminho físico do arquivo de dados. É crucial que este diretório exista e que o usuário Oracle tenha permissões de escrita.
- SIZE: Define o tamanho inicial do datafile.
- AUTOEXTEND ON NEXT … MAXSIZE …: Permite que o datafile cresça automaticamente quando o espaço estiver acabando. UNLIMITED significa que ele pode crescer até o limite do sistema de arquivos ou do tamanho máximo suportado pelo Oracle.
- LOGGING: Indica que todas as operações DML (INSERT, UPDATE, DELETE) nesta tablespace serão registradas nos redo logs, permitindo a recuperação em caso de falha. NOLOGGING é usado para operações massivas onde a recuperação não é crítica ou para melhorar a performance.
3. Adicionando um Datafile a uma Tablespace Existente
Se uma tablespace está ficando cheia e você não usou AUTOEXTEND ou ela atingiu seu MAXSIZE, você pode adicionar um novo datafile:
ALTER TABLESPACE CUSTOMER_DATA
ADD DATAFILE '/u01/app/oracle/oradata/CDBORG/PDB1/customer_data02.dbf' SIZE 50M
AUTOEXTEND ON NEXT 10M MAXSIZE 500M;

4. Redimensionando um Datafile
Você também pode redimensionar um datafile existente, caso precise de mais ou menos espaço:
ALTER DATABASE DATAFILE'/u01/app/oracle/oradata/CDBORG/PDB1/customer_data01.dbf' RESIZE 200M;
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/CDBORG/PDB1/customer_data01.dbf' RESIZE 150M;

5. Colocando uma Tablespace Offline/Online
Para manutenção ou backup em modos específicos, você pode colocar uma tablespace offline. CUIDADO: Isso torna os objetos da tablespace inacessíveis!
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/CDBORG/PDB1/customer_data01.dbf' RESIZE 200M;
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/CDBORG/PDB1/customer_data01.dbf' RESIZE 150M;

6. Deletando uma Tablespace
Para remover uma tablespace e todos os seus datafiles associados.
CUIDADO: Esta é uma operação destrutiva! Todos os objetos dentro da tablespace serão removidos.
DROP TABLESPACE CUSTOMER_DATA INCLUDING CONTENTS AND DATAFILES;

- INCLUDING CONTENTS: Remove todos os segmentos (tabelas, índices, etc.) dentro da tablespace.
- AND DATAFILES: Remove os arquivos físicos do sistema operacional. Se você não usar AND DATAFILES, os datafiles serão mantidos no disco, mas não associados ao banco de dados.
7. Monitoramento Básico de Espaço em Tablespaces
É vital monitorar o espaço para evitar problemas de “tablespace cheia”.
Esta query te dará uma visão clara do espaço total, espaço livre, espaço usado e a porcentagem de uso de cada tablespace.
SELECT
df.tablespace_name,
df.total_space_mb,
fs.free_space_mb,
df.total_space_mb - fs.free_space_mb AS used_space_mb,
ROUND(((df.total_space_mb - fs.free_space_mb) / df.total_space_mb) * 100, 2) AS percent_used
FROM
(SELECT tablespace_name, SUM(bytes) / 1024 / 1024 AS total_space_mb
FROM dba_data_files
GROUP BY tablespace_name) df,
(SELECT tablespace_name, SUM(bytes) / 1024 / 1024 AS free_space_mb
FROM dba_free_space
GROUP BY tablespace_name) fs
WHERE df.tablespace_name = fs.tablespace_name(+)
ORDER BY percent_used DESC;

Para finalizar:
As tablespaces são a espinha dorsal do armazenamento de dados dentro do Oracle Database. Entender sua função e como gerenciá-las é um conhecimento fundamental para qualquer DBA Oracle, garantindo que o banco de dados esteja organizado, performático e resiliente. Com as práticas básicas de criação, modificação e monitoramento, você estará apto a manter seus ambientes Oracle funcionando de forma eficiente.
Eu vejo você no próximo post, tchau!