ORA-01111, ORA-01110 (UNNAMED data file) - Oracle 10/11g e 12c

O erro ORA-01111 e ORA-01110 ocorre em ambientes Standby (Data Guard ou Manual Standby) quando é adicionado um datafile no servidor primário e o "caminho" do mesmo não está definido no parametro "db_filename_convert" ou quando o parameter "standby_file_mamagement" estiver definido como manual ao invés de auto.
Abaixo, segue um exemplo do erro que ocorre no cenário supracitado.
Tue Apr 04 09:04:32 2017
Errors in file /orabin01/app/oracle/diag/rdbms/lamimdg1/lamimprd1/trace/cdbprd1_mrp0_31106.trc:
ORA-01111: name for data file 20 is unknown - rename to correct file
ORA-01110: data file 20: '/orabin01/app/oracle/product/12.1.0.2/dbhome_1/dbs/UNNAMED00020'
ORA-01157: cannot identify/lock data file 20 - see DBWR trace file
ORA-01111: name for data file 20 is unknown - rename to correct file
ORA-01110: data file 20: '/orabin01/app/oracle/product/12.1.0.2/dbhome_1/dbs/UNNAMED00020'
Tue Apr 04 09:04:32 2017
O primeiro passo para a correção deste erro é identificar no servidor primário qual o datafile que esta como unammed. No exemplo acima, podemos ver que o erro se refere ao datafile 20. Então este é o datafile que precisams identificar. Estarei mostrando tanto como verificar em ambientes 10/11g e 12c non-cdb quanto para ambientes 12c cdb.
--Para ambientes 10/11g e 12c no CDB, podemos consultar conforme abaixo:
SQL> select file_name,file_id from dba_data_files where file_ID=20;

 FILE_NAME                                                       FILE_ID
 ------------------------------------------------------------ ----------
 +DGDATA/LAMIMPRD1/DATAFILE/sqltxadmin_data01.dbf                  20
 
-- Ambientes 12c CBD, podemos usar a consulta abaixo, nos trará a informação de qual pdb pertence o datafile 20
-- Deve ser executada conectado no CDB.
SET LINES 210
COLUMN PDB_ID FORMAT 999
COLUMN PDB_NAME FORMAT A15
COLUMN FILE_ID FORMAT 9999
COLUMN TABLESPACE_NAME FORMAT A20
COLUMN FILE_NAME FORMAT A60

SELECT p.PDB_ID, p.PDB_NAME, d.FILE_ID, d.TABLESPACE_NAME, d.FILE_NAME
  FROM DBA_PDBS p, CDB_DATA_FILES d
  WHERE p.PDB_ID = d.CON_ID
  ORDER BY p.PDB_ID;
  
PDB_ID PDB_NAME        FILE_ID TABLESPACE_NAME      FILE_NAME
------ --------------- ------- -------------------- ------------------------------------------------------------
     3 LAMIMPDB              7 SYSTEM               +DGDATA/LAMIMPRD1_system01.dbf
     3 LAMIMPDB              8 SYSAUX               +DGDATA/LAMIMPRD1_sysaux01.dbf
     3 LAMIMPDB              9 USERS                +DGDATA/LAMIMPRD1/protheus_users01.dbf
     3 LAMIMPDB             20 SQLTXADMIN_DATA      +DGDATA/LAMIMPRD1/DATAFILE/sqltxadmin_data01.dbf

4 rows selected.

lamimprd1@CDB$ROOT>
Apos identificar o datafile que não foi criado no standby. Vamos cria-lo através do comando abaixo.
--Para ambientes 10/11g e 12c no CDB, basta executar o comando abaixo
SQL> alter database create datafile '/orabin01/app/oracle/product/12.1.0.2/dbhome_1/dbs/UNNAMED00020' as '+DGDATA/LAMIMPRD1/DATAFILE/sqltxadmin_data01.dbf' size 100m;

Database altered.

SQL>
-- Ambientes 12c CBD, devemos conectar no respectivo PDB para então executar o comando de criação.
SQL> alter session set container=LAMIMPDB;
Session altered.

SQL> alter database create datafile '/orabin01/app/oracle/product/12.1.0.2/dbhome_1/dbs/UNNAMED00020' as '+DGDATA/LAMIMPRD1/DATAFILE/sqltxadmin_data01.dbf' size 100m;

Database altered.

SQL>
Realizada a criação do datafile podemos iniciar a atualização do standby que a mesma deverá ser executada com sucesso.
Afim de evitar que o problema se repita, faça a validação do parametro "standby_file_mamagement" se está definido como AUTO. Caso o mesmo esteja definido como AUTO é preciso validar os parametros "db_file_name_convert". É provavel que alggum valor nao esteja definido adequadamente e por isso esteja ocasionando o erro.
A sintaxe do parametro "db_file_name_convert" consiste em DB_FILE_NAME_CONVERT = 'string1' , 'string2' onde a string1 é o caminho do datafile no ambiente primário e a string2 é o caminho do datafile no standby.
Por exemplo, imaginando que estivessemos trabalhando com filesystem /u01/oraprd/datafiles como destino de produção e o filesystem /u01/standby/datafiles como destino do standby. O parametro pode ser definido da seguinte forma.

alter system set db_file_name_convert='/u01/oraprd/datafiles','/u01/standby/datafiles' scope=spfile;
SQL> alter system set db_file_name_convert='/u01/oraprd/datafiles','/u01/standby/datafiles' scope=spfile;

System altered.

SQL>
Por hoje, era isso. :)

Comentários