Cómo renombrar un datafile que se creó por error en Oracle 19c

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.

renombrar un datafile

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

Deja una respuesta

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