Cómo agregar un Datafile a un Tablespace en Oracle Database

Cuando un tablespace de Oracle comienza a quedarse sin espacio, una de las alternativas disponibles para incrementar su capacidad es agregar un nuevo datafile.

Aunque el comando ALTER TABLESPACE ... ADD DATAFILE es sencillo, en producción no deberíamos ejecutarlo automáticamente al recibir una alerta de espacio. Primero debemos determinar por qué está creciendo el tablespace, cuánto espacio queda disponible y cuál es la mejor estrategia de expansión.

En esta guía veremos los comandos más utilizados.

Importante: Los ejemplos son educativos. Antes de agregar, redimensionar o modificar datafiles en producción, verifica la capacidad del filesystem o ASM, los estándares de tu organización, backups y procedimientos de Change Management.


1. Tablespace vs. Datafile

Recordemos la relación:

Oracle Database
       │
       ├── Tablespace APP_DATA
       │        │
       │        ├── app_data01.dbf
       │        ├── app_data02.dbf
       │        └── app_data03.dbf
       │
       └── Tablespace APP_INDEX
                │
                └── app_index01.dbf

El tablespace es una estructura lógica, mientras que los datafiles representan almacenamiento físico.

Un tablespace puede utilizar uno o varios datafiles.


2. Consultar los Tablespaces

Antes de modificar cualquier cosa:

SELECT    tablespace_name,    status,    contents,    extent_management,    segment_space_managementFROM dba_tablespacesORDERBY tablespace_name;

Para consultar uno específico:

SELECT    tablespace_name,    status,    contentsFROM dba_tablespacesWHERE tablespace_name ='APP_DATA';

Queremos confirmar que estamos trabajando con el tablespace correcto.


3. Consultar los Datafiles actuales

Uno de los comandos más importantes:

SELECT    file_id,    tablespace_name,    file_name,    ROUND(bytes/1024/1024/1024,2) AS size_gb,    autoextensible,    ROUND(maxbytes/1024/1024/1024,2) AS max_gbFROM dba_data_filesWHERE tablespace_name ='APP_DATA'ORDERBY file_id;

Podríamos encontrar:

FILE_ID  TABLESPACE  FILE_NAME                         SIZE_GB  AUTO  MAX_GB-------  ----------  --------------------------------  -------  ----  ------7        APP_DATA    /u01/oradata/PROD/app_data01.dbf   20.00   YES    30.008        APP_DATA    /u01/oradata/PROD/app_data02.dbf   20.00   YES    30.00

Esto nos permite conocer:

  • número de datafiles;
  • tamaño actual;
  • ubicación;
  • AUTOEXTEND;
  • capacidad máxima.

4. Consultar el espacio libre

SELECT    tablespace_name,    ROUND(SUM(bytes)/1024/1024/1024,2) AS free_gbFROM dba_free_spaceWHERE tablespace_name ='APP_DATA'GROUPBY tablespace_name;

Pero no deberíamos limitarnos únicamente al porcentaje utilizado.

También debemos revisar la capacidad máxima considerando AUTOEXTEND.


5. Identificar qué está consumiendo el espacio

Antes de agregar almacenamiento:

SELECT    owner,    segment_name,    segment_type,    ROUND(bytes/1024/1024/1024,2) AS size_gbFROM dba_segmentsWHERE tablespace_name ='APP_DATA'ORDERBY bytes DESCFETCHFIRST20ROWSONLY;

Esto puede revelar que el crecimiento proviene de:

TABLEINDEXLOBSEGMENTLOBINDEXTABLE PARTITIONINDEX PARTITION

La pregunta importante es:

¿Por qué está creciendo el tablespace?

Podría tratarse de crecimiento normal, cargas masivas, procesos batch, índices, LOBs, problemas de retención o un comportamiento anormal de la aplicación.


6. Verificar espacio físico disponible

Si utilizamos filesystem, debemos comprobar primero la capacidad disponible desde Linux:

df -h

Para una ubicación específica:

df -h /u01

También:

df -h /u01/oradata/PROD

No tiene sentido resolver un problema de tablespace provocando otro problema en el filesystem.

Conceptualmente:

Tablespace    ↓Datafile    ↓Filesystem / ASM    ↓Storage físico

7. Agregar un nuevo Datafile

Supongamos:

Tablespace: APP_DATANuevo archivo: app_data03.dbfTamaño: 10 GB

El comando básico sería:

ALTER TABLESPACE APP_DATAADD DATAFILE '/u01/oradata/PROD/app_data03.dbf'SIZE10G;

Después verificamos:

SELECT    file_id,    file_name,    ROUND(bytes/1024/1024/1024,2) AS size_gbFROM dba_data_filesWHERE tablespace_name ='APP_DATA'ORDERBY file_id;

8. Agregar Datafile con AUTOEXTEND

Una configuración más completa:

ALTER TABLESPACE APP_DATAADD DATAFILE '/u01/oradata/PROD/app_data03.dbf'SIZE10GAUTOEXTEND ONNEXT1GMAXSIZE 50G;

Significa:

SIZE 10G   │   └── Tamaño inicialAUTOEXTEND ON   │   └── Crecimiento automáticoNEXT 1G   │   └── Incrementos de 1 GBMAXSIZE 50G   │   └── Tamaño máximo

Esta configuración permite que Oracle amplíe automáticamente el datafile hasta el límite establecido.


9. Agregar un Datafile sin límite explícito

También existe:

ALTER TABLESPACE APP_DATAADD DATAFILE '/u01/oradata/PROD/app_data03.dbf'SIZE10GAUTOEXTEND ONNEXT1GMAXSIZE UNLIMITED;

Sin embargo, UNLIMITED no significa que exista almacenamiento infinito.

El crecimiento continúa dependiendo de límites de Oracle, filesystem, ASM y almacenamiento físico.

En producción suele ser preferible establecer límites deliberados y monitorearlos.


10. Agregar un Datafile utilizando ASM

Si Oracle utiliza ASM:

ALTER TABLESPACE APP_DATAADD DATAFILE '+DATA'SIZE10GAUTOEXTEND ONNEXT1GMAXSIZE 50G;

Cuando se utilizan Oracle Managed Files, Oracle puede generar automáticamente el nombre correspondiente.

La arquitectura podría verse así:

APP_DATA    │    ├── +DATA/PROD/DATAFILE/...    ├── +DATA/PROD/DATAFILE/...    └── +DATA/PROD/DATAFILE/...              │              ↓         ASM Disk Group

11. Verificar capacidad de ASM

Si utilizamos ASM podemos consultar, con los privilegios y contexto adecuados:

SELECT    name,    total_mb,    free_mb,    usable_file_mbFROM v$asm_diskgroup;

Es importante no limitarse a comprobar que +DATA existe.

Debemos verificar que tenga capacidad utilizable suficiente.


12. Agregar varios Datafiles

También podemos agregar varios archivos:

ALTER TABLESPACE APP_DATAADD DATAFILE'/u01/oradata/PROD/app_data03.dbf'SIZE10G,'/u02/oradata/PROD/app_data04.dbf'SIZE10G;

La conveniencia de distribuirlos entre diferentes ubicaciones depende de la arquitectura de almacenamiento.


13. ¿Agregar Datafile o hacer RESIZE?

Agregar otro datafile no siempre es la mejor opción.

Primero revisamos:

SELECT    file_name,    ROUND(bytes/1024/1024/1024,2) AS size_gb,    autoextensible,    ROUND(maxbytes/1024/1024/1024,2) AS max_gbFROM dba_data_filesWHERE tablespace_name ='APP_DATA';

Si un archivo puede crecer, podríamos hacer:

ALTER DATABASE DATAFILE'/u01/oradata/PROD/app_data01.dbf'RESIZE 30G;

Por tanto:

Tablespace casi lleno        │        ├── ¿Datafile puede crecer?        │        ↓        │      RESIZE        │        ├── ¿AUTOEXTEND puede ampliarse?        │        ↓        │   Modificar MAXSIZE        │        └── ¿Necesitamos capacidad adicional?                 ↓            ADD DATAFILE

14. Habilitar AUTOEXTEND en un Datafile existente

ALTER DATABASE DATAFILE'/u01/oradata/PROD/app_data01.dbf'AUTOEXTEND ONNEXT1GMAXSIZE 50G;

Comprobamos:

SELECT    file_name,    autoextensible,    ROUND(bytes/1024/1024/1024,2) AS size_gb,    ROUND(maxbytes/1024/1024/1024,2) AS max_gbFROM dba_data_filesWHERE tablespace_name ='APP_DATA';

15. Deshabilitar AUTOEXTEND

También podemos desactivarlo:

ALTER DATABASE DATAFILE'/u01/oradata/PROD/app_data01.dbf'AUTOEXTEND OFF;

Esto puede formar parte de determinadas políticas de capacity management.


16. TEMP utiliza TEMPFILE

Esta es una diferencia importante.

Para un tablespace permanente usamos:

ALTER TABLESPACE APP_DATAADD DATAFILE ...

Para un temporary tablespace:

ALTER TABLESPACE TEMPADD TEMPFILE '/u01/oradata/PROD/temp02.dbf'SIZE10GAUTOEXTEND ONNEXT1GMAXSIZE 50G;

Recuerda:

Permanent Tablespace        ↓DATAFILETemporary Tablespace        ↓TEMPFILE

Los tempfiles se consultan mediante:

SELECT    tablespace_name,    file_name,    ROUND(bytes/1024/1024/1024,2) AS size_gb,    autoextensibleFROM dba_temp_files;

17. Verificar inmediatamente después del cambio

Después de agregar un datafile:

SELECT    file_id,    tablespace_name,    file_name,    ROUND(bytes/1024/1024/1024,2) AS size_gb,    autoextensible,    ROUND(maxbytes/1024/1024/1024,2) AS max_gbFROM dba_data_filesWHERE tablespace_name ='APP_DATA'ORDERBY file_id;

También comprobamos nuevamente el espacio disponible.

Y desde el sistema operativo:

df -h /u01

No debemos considerar terminado el cambio simplemente porque Oracle respondió:

Tablespace altered.

Debemos validar el resultado.


18. Algunos errores que podemos encontrar

Cuando Oracle no puede extender un segmento podemos encontrar errores como:

ORA-01653:unable to extend table ...

Para índices:

ORA-01654:unable to extend index ...

Estos errores indican un problema para asignar nuevos extents, pero no significan automáticamente:

“Agrega un datafile.”

Debemos investigar la causa.


19. Comandos esenciales para memorizar

Ver datafiles

SELECT    file_id,    tablespace_name,    file_name,    bytes,    autoextensible,    maxbytesFROM dba_data_files;

Agregar Datafile

ALTER TABLESPACE APP_DATAADD DATAFILE '/u01/oradata/PROD/app_data03.dbf'SIZE10G;

Agregar con AUTOEXTEND

ALTER TABLESPACE APP_DATAADD DATAFILE '/u01/oradata/PROD/app_data03.dbf'SIZE10GAUTOEXTEND ONNEXT1GMAXSIZE 50G;

ASM

ALTER TABLESPACE APP_DATAADD DATAFILE '+DATA'SIZE10GAUTOEXTEND ONNEXT1GMAXSIZE 50G;

Resize

ALTER DATABASE DATAFILE'/u01/oradata/PROD/app_data01.dbf'RESIZE 30G;

Modificar AUTOEXTEND

ALTER DATABASE DATAFILE'/u01/oradata/PROD/app_data01.dbf'AUTOEXTEND ONNEXT1GMAXSIZE 50G;

TEMP

ALTER TABLESPACE TEMPADD TEMPFILE '/u01/oradata/PROD/temp02.dbf'SIZE10GAUTOEXTEND ONNEXT1GMAXSIZE 50G;

20. Flujo recomendado ante una alerta

Supongamos que recibimos:

“APP_DATA tablespace is 95% full.”

Una buena metodología sería:

Alerta: Tablespace 95%           
↓1. Verificar utilización real
↓2. Revisar Datafiles
↓3. Revisar AUTOEXTEND / MAXSIZE
↓4. Identificar segmentos que crecen
↓5. Revisar tendencia histórica
↓6. Verificar filesystem / ASM
↓7. Determinar acción
↙ ↓ ↘
RESIZE AUTOEXTEND ADD DATAFILE
↘ ↓ ↙
Ejecutar

Verificar

Monitoring

Capacity Planning / RCA

Buenas prácticas

Antes de agregar un nuevo datafile, conviene preguntarnos:

✓ ¿Cuál es la utilización real del tablespace?
✓ ¿Qué objetos están consumiendo espacio?
✓ ¿El crecimiento es normal o anormal?✓ ¿Los datafiles actuales tienen AUTOEXTEND?✓ ¿Cuál es su MAXSIZE?
✓ ¿Puedo ampliar un datafile existente?
✓ ¿Existe espacio suficiente en filesystem o ASM?
✓ ¿Cuál es la tendencia de crecimiento?
✓ ¿El nuevo datafile cumple los estándares de nombres?
✓ ¿Tenemos monitoring después del cambio?

El comando:

ALTER TABLESPACE APP_DATA ADD DATAFILE ...

puede resolver rápidamente un problema de capacidad.

Pero un administrador Oracle debería evitar convertirlo en una solución automática.

Si un tablespace aumenta 100 GB cada semana, agregar 100 GB adicionales solamente pospone el problema.

La verdadera administración comienza cuando preguntamos:

¿Por qué está creciendo?

Comprender la diferencia entre capacidad disponible, utilización, AUTOEXTEND, MAXSIZE, crecimiento de segmentos y almacenamiento físico nos permite resolver el problema actual y, al mismo tiempo, prevenir el siguiente.

¿Qué revisas primero cuando recibes una alerta indicando que un tablespace de Oracle está al 95%?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *