ORA-00959: el tablespace ‘_$deleted$82$0’ no existe durante un impdp

Nos hemos mudado a bloger!
El contenido actualizado de esta entrada lo tienes en:

    http://dba.pamplona.name/2013/08/ora-00959-el-tablespace-no-existe.html

    Hoy vamos a ver como solucionar los problemas ORA-00959 cuando van asociados a un tablespace borrado.
    Este error es bastante común y es un bug identificado de oracle que es facil que te encuentres cuando se usan tablas particionadas, y se elimina o se mueve el tablespace original de la tabla. Es muy habitual el rehacer los objetos indicando los tablespaces por defecto de las particiones, pero no cambiando el de la tabla original
    Esto hace que, cuando vayas a importar la tabla, el tablespace original de la tabla no exsista, recibiendo el error del enunciado.

    ¿Como lo solucionamos?

    Hay 2 maneras:

    1- Solucion en origen
    Esta es la solución correcta, y lo que hacemos es buscar que tablas tienen la sintaxsis de creacion en un tablespace inexistente y modificarlas.

    select distinct 'ALTER INDEX '||index_owner||'.'||index_name||' MODIFY DEFAULT ATTRIBUTES TABLESPACE '||tablespace_name||';' cmd from dba_ind_partitions where tablespace_name not in ('SYSTEM','SYSAUX') order by 1;
    
     select distinct 'ALTER INDEX '||index_owner||'.'||index_name||' MODIFY DEFAULT ATTRIBUTES FOR PARTITION '||partition_name||' TABLESPACE '||tablespace_name||';' cmd from dba_ind_subpartitions where tablespace_name not in ('SYSTEM','SYSAUX') order by 1;
    
     select distinct 'ALTER TABLE '||table_owner||'.'||table_name||' MODIFY DEFAULT ATTRIBUTES TABLESPACE '||tablespace_name||';' cmd from dba_tab_partitions where tablespace_name not in ('SYSTEM','SYSAUX') order by 1;
    
     select distinct 'ALTER TABLE '||table_owner||'.'||table_name||' MODIFY DEFAULT ATTRIBUTES FOR PARTITION '||partition_name||' TABLESPACE '||tablespace_name||';' cmd from dba_tab_subpartitions where tablespace_name not in ('SYSTEM','SYSAUX') order by 1;
    
     select 'alter user '||username||' default tablespace '||default_tablespace||' temporary tablespace '||temporary_tablespace||';' cmd from dba_users order by default_tablespace;
    

    Y ejecutamos la salida de estas consultas

    2- Solucion en destino

    Creamos a mano las tablas que dan el error e importamos con la opcion «truncate»

    NOTA:
    Indpendientemente de estas chapucillas, lo mejor será contactar con soporte oracle para identificar el bug que nos afecta y parchear la base de datos

RMAN por entorno de red de windows (ORA-27040 )

Hoy veremos un error bastante comun cuando intentamos hacer un rman remoto en un entorno windows

Supongamos tenemos un servidor windows A y queremos hacer un backup de RMAN depositado en otro servidor windows B

rman target / nocatalog cmdfile rman_windows.cmd

Donde el fichero rman_windows.cmd es

run {
  allocate channel c1 type disk format '\\B\BCKORACLE\rman_pruebas%U';
  backup database;
}

En función de los permisos que tengamos en el servidor B, obtendremos un error:

canal c1: iniciando parte 1 en 18/08/13
canal liberado: c1
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03009: fallo del comando backup en el canal c1 en 08/18/2013 09:12:55
ORA-19504: fallo al crear el archivo "\\B\BCKORACLE\rman_pruebas08OH_1"
ORA-27040: error de creacion de archivo, no se ha podido crear
OSD-04002: no se ha podido abrir el archivo
O/S-Error: (OS 5) Acceso denegado.
Recovery Manager terminado.

Como podemos ver en el error, leyendo siempre de abajo a arriba es un error de acceso de sistema operativo, tal y como indica la nota (Doc ID 145843.1) How to Configure RMAN to Write to Shared Drives on Windows NT/2000/2003 , Oracle necesita tener permisos de SYSTEM sobre el punto de red en el que va a escribir, por tanto tendremos que dar full control al usuario con el que se este ejecutando la base de datos ( o el script de lanzamiento) sobre el recurso remoto.

Un consejo para los windows 2003 en adelante es el no utilizar nombres locales de redes mapeadas, sino que es mas conveniente el uso de nombres de red genérico.

NOTA: En caso de ser una carpeta compartida por entorno de red de windows habrá que dar control total a el system de la máquina donde se ejecuta el Oracle, esto se puede haer con permisos a MI_DOMINIO\A$ donde MI_DOMINIO es el dominio y A el nombre del servidor