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%?
