Hola a todos, hoy enseñaremos cómo renombrar un datafile que se creó por error en Oracle 19c. Podemos encontrar varios escenarios para renombrar este datafile. Usaremos para este caso la opción de hacer un ALTER MOVE de los datos a otro TBs y luego varios pasos para después renombrar. Lo importante es saber identificar esos datos y recordar que esto pasos pueden ser muy delicados. Para esto, tomar muchas precauciones al ejecutar los comandos, y si es posible hacer una prueba en un entorno de TEST y después hacerlo en PROD.
Mover los datos de un tablespace a otro en Oracle
Primero simularemos un nuevo datafile en un tablespace existente. En este caso, no coincide el nombre del datafile con el del tablespace. Las mejores prácticas de un DBA es ser organizado.
ALTER TABLESPACE TBS_USER_PRUEBA_DATA ADD DATAFILE '/datos/oracle/oradata/ORCL2/ORCL2/datafile/tbs_USER_TEST_data_002.dbf' SIZE 1G;
Tablespace modificado.
set pages 200
set lines 200
col FILE_NAME for a100
col TABLESPACE_NAME for a30
select FILE_NAME, TABLESPACE_NAME from DBA_DATA_FILES where TABLESPACE_NAME like 'TBS_USER_PRUEBA_DATA';
FILE_NAME TABLESPACE_NAME
---------------------------------------------------------------------------------------------------- ---------------------------
/datos/oracle/oradata/ORCL2/ORCL2/datafile/TBS_USER_PRUEBA_DATA_001.dbf TBS_USER_PRUEBA_DATA
/datos/oracle/oradata/ORCL2/ORCL2/datafile/tbs_USER_TEST_data_002.dbf TBS_USER_PRUEBA_DATA
Chequear si el datafile creado tiene objetos almacenados
Validaremos si el datafile que deseamos borrar tiene algunos objetos. Es decir: tablas, índices, particiones, etc. Para ello ejecutaremos una serie de comandos SQL.
SELECT DISTINCT segment_name, owner, segment_type,TABLESPACE_NAME
FROM dba_extents
WHERE file_id = (
SELECT file_id FROM dba_data_files
WHERE file_name = '/datos/oracle/oradata/ORCL2/ORCL2/datafile/tbs_USER_TEST_data_002.dbf'
) order SQL> by 3 desc;
SEGMENT_NAME OWNER SEGMENT_TYPE TABLESPACE_NAME
-------------------- -------------------- -------------------- ------------------------------
PRUEBA_LOG_2 USER_PRUEBA TABLE TBS_USER_PRUEBA_DATA
PRUEBA_LOG_3 USER_PRUEBA TABLE TBS_USER_PRUEBA_DATA
INX_PRUEBA_LOG_2_001 USER_PRUEBA INDEX TBS_USER_PRUEBA_DATA
INX_PRUEBA_LOG_3_001 USER_PRUEBA INDEX TBS_USER_PRUEBA_DATA
Aplicaremos un move y rebuild para renombrar el datafile
Tras analizar el resultado del paso anterior, nos dimos cuenta que el datafile tiene 2 tablas y 2 índices creados. Esos objetos se los asignaremos a un tablespace existente que está relacionado con el schema o usuario.
SQL> ALTER TABLE USER_PRUEBA.PRUEBA_LOG_2 MOVE TABLESPACE TBS_USER_TEST_DATA;
Table altered.
SQL> ALTER TABLE USER_PRUEBA.PRUEBA_LOG_3 MOVE TABLESPACE TBS_USER_TEST_DATA;
Table altered.
SQL> ALTER INDEX USER_PRUEBA.INX_PRUEBA_LOG_2_001 REBUILD TABLESPACE TBS_USER_TEST_DATA;
Index altered.
SQL> ALTER INDEX USER_PRUEBA.INX_PRUEBA_LOG_3_001 REBUILD TABLESPACE TBS_USER_TEST_DATA;
Index altered.
SQL> SELECT DISTINCT segment_name, owner, segment_type,TABLESPACE_NAME
FROM dba_extents
WHERE file_id = (
SELECT file_id FROM dba_data_files
SQL> WHERE file_name = '/datos/oracle/oradata/ORCL2/ORCL2/datafile/tbs_USER_TEST_data_002.dbf'
) order by 3 desc;
no rows selected
SQL>
Renombrar el datafile
Después de esto, realizaremos varios pasos para renombrar el datafile. Debemos recordar que los pasos son muy delicados y debemos tener mucha precaución para aplicar los comandos.
SQL> ALTER DATABASE DATAFILE '/datos/oracle/oradata/ORCL2/ORCL2/datafile/tbs_USER_TEST_data_002.dbf' OFFLINE;
Database altered.
SQL> exit
[oracle@TEST ~]$ mv /datos/oracle/oradata/ORCL2/ORCL2/datafile/tbs_USER_TEST_data_002.dbf /datos/oracle/oradata/ORCL2/ORCL2/datafile/TBS_USER_PRUEBA_DATA_002.dbf
[oracle@ TEST ~]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Tue Feb 25 13:53:31 2025
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> ALTER DATABASE RENAME FILE '/datos/oracle/oradata/ORCL2/ORCL2/datafile/tbs_USER_TEST_data_002.dbf' TO '/datos/oracle/oradata/ORCL2/ORCL2/datafile/TBS_USER_PRUEBA_DATA_002.dbf';
Database altered.
SQL> select tablespace_name,file_name from DBA_DATA_FILES
where tablespace_name = ('TBS_USER_PRUEBA_DATA')
group by tablespace_name,file_name;
FILE_NAME TABLESPACE_NAME
---------------------------------------------------------------------------------------------------- ------------------------------
/datos/oracle/oradata/ORCL2/ORCL2/datafile/TBS_USER_PRUEBA_DATA_001.dbf TBS_USER_PRUEBA_DATA
/datos/oracle/oradata/ORCL2/ORCL2/datafile/TBS_USER_PRUEBA_DATA_002.dbf TBS_USER_PRUEBA_DATA
SQL>
Este tipo de tareas pueden resultar complejas si se realiza sin el conocimiento adecuado. Si necesitas contar con expertos en bases de datos Oracle, para que realicen este tipo de operativas y puedan reaccionar a posibles problemas, puedes contar con nosotros. Contacta con nosotros sin compromiso y valoramos tu caso.
¿Aún no conoces Query Performance? Descubre cómo puede ayudarte en tu entorno Oracle. Más información en su página de LinkedIn.
Sígue a GPS en LinkedIn

