RMAN-03002: failure of restore command at 03/21/2006 21:41:34 ORA-01180: can not create datafile 1 ORA-01110: data file 1: ‘+DATA/pzrsa/datafile/system.288.585590761’

Elementos que tenemos que comprobar:
1. Listar los backups:

 rman target=/
 list backup of database;

2. Comporbar que el backup está accesible.

crosscheck backupset <n backup set>

3. Comprobar que el backup existe en el disco

4. Mostrar las incarnation

 list incarnation of database;

5. Debugear el restore

C:\>rman target / log=rmanLog.txt trace=rmanTrace.txt
 RMAN> debug on;
 RMAN> restore datafile 1;
 RMAN> debug off;
 RMAN> exit;
 Buscar este error
 DBGRCVMAN: CheckRecAction:belongs to orphan branch of this incarnation:

Este error es frecuente cuando tenemos activada la flash recovery area. Es necesario limpiar la FRA antes de comenzar el proceso de restore/recover.

Anuncios

RMAN-06059: expected archived log not found

RMAN intentado hacer un backup de un fichero de archive log, pero es incapaz de encontrarlo. Este error puede estar provocado por varias razones, que alguien haya movido el fichero manualmente, o que se haya perdido o que haya sido borrado, vamos que se haya perdido el fichero por lo que sea.

 RMAN-00571: ===========================================================
 RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
 RMAN-00571: ===========================================================
 RMAN-03002: failure of backup plus archivelog command at 10/29/2012 18:11:02
 RMAN-06059: expected archived log not found, lost of archived log compromises recoverability
 ORA-19625: error identifying file +RECOVERY/pepe/archivelog/2012_07_19/thread_2_seq_33745.4767.123321123
 ORA-17503: ksfdopn:2 Failed to open file +RECOVERY/pepe/archivelog/2012_07_19/thread_2_seq_33745.4767.123321123
 ORA-15012: ASM file '+RECOVERY/pepe/archivelog/2012_07_19/thread_2_seq_33745.4767.123321123' does not exist
Recovery Manager complete.

Hay dos soluciones a este problema o restaurar el fichero perdido, o ejecutar un crosscheck:

rman target /
change archivelog all crosscheck;

Es recomendable hacer un backup completo de la base de datos después de ejecutar este comando.

Cuando se realiza un crosscheck,  RMAN comprueba todos los archive log y se asegura de que existen. Aquellos que han desaparecido los maca como no disponibles. No es que los recupere es que permite hacer un backup de la base de datos a pesar de que esos ficheros no estén disponibles:

Flashback Table Query

Conceptualmente hacer flasback sobre una tabla  es sencillo, solo volvemos a la información del UNDO y  luego se ejecuta y se construyen las sentencias que harán los cambios inversos. En realidad no estamos haciendo una operación de rollback estamos haciendo una nueva transacción, Los constraints están activos y los índices se mantienen. La única excepción son los triggers que se deshabilitan en la operación de flashback (aunque se pueden habilitar con una sintaxis diferente). La sintaxis es la siguiente:

flashback table departamentos to timestamp to_timestamp(’26-11-07 25:42:30′,’dd-mm-yy hh24:mi:ss’);

Esto que conceptualmente es simple puede provocar diferentes errores:

1. ORA-08189: cannot flashback the table because row movement is not enabled. Es necesario antes de hacer un flashback de una tabla habilitar el movimiento de filas de las tablas involucradas, esto se hace de la siguiente manera:

SQL > alter table departamentos enable row movement;

2. ORA-02291: integrity constraint (FK_DEPTNO) violated parent key not found. Cuando se intenta recuperar un registro de una tabla, cuya referencia padre también ha sido borrada. En esto caos deberemos recuperar ambas tablas, la padre y la hija:

SQL> flashback table empleados,departamentos to timestamp to_timestamp(’26-11-07 25:42:30’,’dd-mm-yy hh24:mi:ss’);

3. Puede fallar porque no sé respeta la llave primaria, ya que el valor de la llave ha sido reutilizado entre el borrado y flashback.

4 ORA-08180, “No snapshot found based on specified time,” No hay suficiente información de undo para regresar en el tiempo deseado.

5.ORA-00054: “Resource busy and acquire with NOWAIT specified.” Si el registro está bloqueado por otro usuario

6. La definición de la tabla no debe haber cambiado durante ese periodo, si no generará el ORA-01466: “Unable to read data—table definition has changed.”

5. No se puede ejecutar el Flashback sobre las tablas del SYS, este es por lógica puede ser peligrosísimo hacer marcha atrás en el diccionario

Si el flashback de una tabla falla por cualquier razón, se cancelará la operación de flashback y se realizara rollback sobre las partes que haya podido ir bien, se dejará todo como estaba entes del comando de flashback

 

Flashback Query

Las opciones básicas están disponibles desde la versión 9i de Oracle: se puede consultar la base de datos en punto específico del pasado. El principio de flashback query es especificar en la consulta un momento específico en el tiempo, el cual se mapea en el sistema en un SCN (system change number) y siempre que la consulta encuentre un bloque que ha sido cambiado desde ese SCN, se irá al segmento de UNDO para extraer el dato de uno necesario para hacer el cambio de rollback. Este rollaback es totalmente temporal, y es solo accesible en la sesión que está ejecutando el flashback query. Para que el Flashback query tenga éxito es necesario el dato de undo este disponible. En las últimas versiones de Oracle está funcionalidad se ha ido incrementando, ahora se puede utilizar para recuperar transacciones individuales, o revertir cambios en la base de datos y devolver todas las versiones de un registro. Es posible garantizar que flashback siempre se podrá hacer, pero esto implica que pueden fallar otras transacciones.

Consultas Básicas de Flasckback

Cualquier sentencia de select puede obtener la versión de de la tabla

Partiendo de este ejemplo:

SQL> select to_char(sysdate,'dd-mm-yy hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'
-----------------
02-02-12 10:08:56
SQL> delete from provincias where  descripcion = 'Lerida';
1 rows deleted.
SQL> commit;
Commit complete.
SQL> select * from provincias;
ID_PROVINCIA DESCRIPCIO
------------ ----------
           1 Tarragona
           2 Gerona
           3 Barcelona
 SQL> select * from provincias as of timestamp to_timestamp('02-02-12 10:08:56','dd-mm-yy hh:mi:ss');
ID_PROVINCIA DESCRIPCIO
------------ ----------
           1 Tarragona
           2 Gerona
           3 Barcalona
           4 Lerida
SQL> select * from provincias as of timestamp to_timestamp('02-02-12 10:08:56','dd-mm-yy hh24:mi:ss') minus select * from provincias;
ID_PROVINCIA DESCRIPCIO
------------ ----------
           4 Lerida

Primero  obtenemos el tiempo. Luego borramos un registro y guardamos los cambios. La consulta nos confirma que solo existen 3 columnas en la tabla. El siguiente query se hace directamente contra la tabla para saber cómo era en un lugar en el tiempo determinado, vemos que tenía cuatro registros. Para hacer este select se utiliza los datos de undo. El último query combina datos de históricos con actuales. Estos queries se utilizan para reparar errores,; se obtiene los datos anteriores y se actualizan en la tabla. También  existe la opción volver a tras toda la sesión utilizando el paquete DBMS_FLASHBACK:

SQL> execute dbms_flashback.enable_at_time( to_timestamp('02-02-12 14:43:57','dd-mm-yy hh24:mi:ss'));
PL/SQL procedure successfully completed.
SQL>

Esto regresa LA SESIÓN y solo sesión al momento de tiempo determinado. Las demás sesiones verán los datos anteriores, esto se mantendrá hasta que se cancele el flashback:

SQL> execute dbms_flashback.disable;
PL/SQL procedure successfully completed.
SQL>

Mientras que está en modo flashback, es imposible ejecutar comandos  DML, si se intenta  se provocará un error. Solamente se puede ejecutar comandos SELECT. De el tamaño de los segmentos de Undo y el contenido de estos dependerá cuánto se pude retroceder en el tiempo (ya sea con consultas o con DBMS_FLASHBACK). Si el dato no existe en el segmento de undo dará el error:

 ORA-08180, “No snapshot found based on specified time,”

La sintaxis para activar el flashback acepta como parámetro o el SCN o el timestamp.  Si se expecifica el SCN, el punto es en el tiempo que se traslada el query es preciso, si no es tiempo se mapeara la un SCN con un precisión de tres segundos.

Data Pump versus Import Export

Oracle recomienda que a partir de Oracle 10 se utilice data pump en las utilidades de import y export. Data pump soporta todas las nuevas funcionalidades de Oracle 10 excepto los esquemas XML. También el diseño de Data Pump permite mayores prestaciones en el movimiento de datos que el import o export.

De hecho en Oracle 11 los export y imports originales están de soportados. Solo se recomienda la utilización de export original para una migración de datos XMLType a un versión 10g (10.2) o anterior. Es más, Oracle recomienda el uso de Data Pump excepto en las siguientes situaciones:

 • Se necesita importar archives creados con un export.

 • Se quiere importar datos en una versión anterior de la base de datos, para eso deberemos utilizar el export original ya que los archivos generados con el import no son compatible con data pump.

 Componentes de Data Pump.

Oracle Data Pump se compone de tres partes distintas:

• Línea de comandos expdp y impdp

• El paquete PL/SQL DBMS_DATAPUMP (también conocido como la API de Data Pump)

• El paquete de PL/SQL DBMS_METADATA (también conocido como el API de Metadata).

• Los clientes de data pump, expdm y impdp, invoca las utilidades de Data Pump export y data pump import respectivamente. Esta interfaz es muy similar la export e import originales.

• Los clientes expdp y impdp utilizan el procedimiento del paquete PL/SQL DBMS_DATAPUMP para ejecutar los comandos de import y export, utilizando los parámetros que se pasan en la línea de comandos. Esto parámetros permiten exportar e importar datos y metadatos de una base de datos completa o partes de esta

Las nuevas facilidades de Data Pump export e import

Los nuevos ejecutables de Data Pump son muy parecidos a los anteriores import y export, pero son herramientas completamente diferentes. Los archivos .dmp generados por ambas herramientas no son compatibles entre sí. Con lo cual no se puede importar con data pump un archivo generado con el export tradicional, ni viceversa.

Permite especificar un máximo número de threads que ejecutan lo trabajo de Data Pump. Esto permite jugar entre el tiempo que tarda el export y los recursos consumidos.

Permite reanudar los trabajos de Data Pump

Permite hacer import y export a través de la red, la instancia remota es fuente de datos

Permite re mapear los tablespaces en la operación de import

Permite filtrar los metadatas exportados e importados, basándose en objetos y tipos de objetos

Tiene la habilidad de calcular el espacio que consumirá el trabajo de export, sin ejecutar el export previamente.

Permite especificar la versión de los objetos de base de datos a mover.

La mayor parte de las operaciones de export import tienen lugar en el servidor de oracle.

El Data Pump Export y Import trabaja con un grupo de ficheros (“dump file set”) en vez de un único archivo dump.

Data pump Export y Import utiliza ejecuciones paralelas en vez de un sola ejecución, lo que permite mejorar el rendimiento.

Data Pump Exxport y Import incluye los metadatos del archivo dmp como documentos XML, en vez de cómo sentencias DDL. Esto permite más flexibilidad a la hora de transformar los metadatos en la importación.

El objeto directorio

Lo primero que se necesita para utilizar Datapump es un objeto directorio. Este tipo de objeto se corresponde a un directorio de sistema operativo y es donde Datapump dejara todos los ficheros.

Cómo crear un directorio:

sqlplus ‘/ as sysdba’
SQL> create directory prueba as ‘/users/orace/export’;
 Directory created.

 Si no es un usuario con privilegios de DBA, debe tener privilegios de CREATE ANY DIRECTORY

Para conceder los privilegios de lectura y escritura sobre el directorio:

SQL> GRANT READ,WRITE ON DIRECTORY prueba to usuario;
Grant succeeded.

Comprobación de que el directorio existe:

SQL> desc dba_directories;
Name          Null?       Type
—————————————– ——–        —————————-
OWNER          NOT NULL   VARCHAR2(30)
DIRECTORY_NAME NOT NULL   VARCHAR2(30)
DIRECTORY_PATH            VARCHAR2(4000)
SQL> select * from dba_directories where DIRECTORY_NAME like ‘%PRUEBA%’;
OWNER DIRECTORY_NAME DIRECTORY_PAT
—————————— ————————————————————————
SYS    PRUEBA /users/orace/export

Una vez que se ha creado el directorio, se puede utilizar el parámetro DIRECTORY utilizando el nombre del objeto directorio, en vez de la ruta del OS. Si se ha creado el directorio con el nombre por defecto de DATA_PUMP_DIR, no se necesita especificar el parámetro DIRECTORY en el comando export/import Oracle automáticamente buscará el directorio especificado para el valor DATA_PUMP_DIR.

$expdp priya/passwd tables=emp.
$expdp priya/passwd tables=emp dumpfile= prueba:emp.dmp logfile=prueba:emp.log
 

Prueba es el directoio y emp.dmp y emp.log son los nombres de los archivos.

Algunos ejemplos prácticos:

 1) Importar tablas del esquema scott al esquema admunsen:

 Con las antiguas utilidades de export e import se hacia los siguiente:

$imp username/password FILE=scott.dmp FROMUSER=scott TOUSER=admunsen
 

Con el Data Pump Import se hace así:

$impdp username/password DIRECTORY=test_dir1 DUMPFILE=scott.dmp TABLES=scott.emp REMAP_SCHEMA=scott:admunsen
 

Se sustituye fromuser/touser por remap_schema, con lo cual una la Tabla EMP de scott se importará en el esquema admunsen..

 2) Export de toda la base de datos incluidos grants, indices y datos.

 Con la antigua utilidad del export se hacía así:

$exp username/password FULL=y FILE=dba.dmp GRANTS=y INDEXES=y ROWS=y
 

Con la nueva utilidad se hace:

$expdp username/password FULL=y INCLUDE=GRANT INCLUDE= INDEX DIRECTORY=test_dir1 DUMPFILE=dba.dmp CONTENT=ALL
 

El parámetro INCLUDE permite especificar los objetos que queremos export y EXLUDE indica los que queremos excluir. Ambos parámetro no se pueden utilizar ambos parámetros en una misma sentencia de import.

 3). Importar un esquema:

impdp hr SCHEMAS=hr DIRECTORY=dpump_dir1 DUMPFILE=expschema.dmp
EXCLUDE=CONSTRAINT,REF_CONSTRAINT,INDEX TABLE_EXISTS_ACTION=REPLACE

 4). Opciónes curiosas:

Permite renombrar el tablespace y los datafiles. Esto permite importar fácilmente las tablas en nuevo tablespace. Aparece a partir de Oracle 10.1.

Ejemplo:

 impdp username/password REMAP_TABLESPACE=data_1:data_2 DIRECTORY=dprueba DUMPFILE=datos.dmp
 

Funcionamiento de DataPump:

Para realizar un trabajo de datapump se utilizan diferentes procesos de background en nuestra base de datos (Master process,worker process,shadow processes)

Master Process:(MCP) El proceso master se puede localicar entre los porceso de base de datos con este nombre _DMnn_. MCP

1) Crea los trabajos y los controlas.

2) Crea y maneja los worker processes

3) Monitorea los jobs y los procesos de log

 4) Mantiene el trabajo de los jobs y restaura la informacion de la table Maestra

 5) Maneja los archivos necesarios, incluido el set de archivos dump.

Flashback Drop y Recycle Bin

Cuando se borra una tabla, la base de datos no libera inmediatamente el espacio asociado con la tabla. La base de datos renombra la tabla y la coloca junto sus objetos asociados en el recycle bin, donde en caso de que se haya borrado por error, puede ser recuperada posteriormente. Esta opción se llama Flasback Drop y se utiliza la sentencia FLASBACK TABLE para restaurar la tabla.
El recycle bin es una tabla del diccionario de datos que contienen información sobre objetos borrados. Las tablas borradas y sus objetos asociados como índices, constrains y tablas anidadas no se borran y siguen ocupando espacio. Solo liberan el espacio si se purga la recycle bin.
Cada usuario  puede consultar sus objetos en recycle  bin utilizando el siguiente comando: 

SELECT * FROM RECYCLEBIN;

Cuando se borra un tablespace y su contenido, los objetos del tablespace no se colocan en el recycle bin, lo mismo ocurre cuando se borra un usuario,  un cluster, o un tipo todos los objetos dependientes de este último tampoco se colocan en el recycle bin. 

 Los nombre de objetos en el Recycle Bin 

 Cuando se borra una tabla esta y a todos sus objetos asociados se les otorga un nombre generado por el sistema, esto se hace para evitar los conflictos que se puedan producir cuando diferentes tablas tiene el mismo nombre, por ejemplo: Un usuario borra una tabla, la recrea con el mismo nombre y la vuelve a borrar. Dos usuarios tienen una tabla con el mismo nombre y ambos la borran El nombre generado por el sistema tendrá el siguiente formato: BIN$unique_id$version

Donde:

¦ unique_id es un identificador único de 26 caracteres.

¦ versión es un número de versión asignado por la base de datos      

Habilitar y deshabilitar la Recycle Bin      

Se realiza mediante el parámetro de inicialización recyclebin.  Cuando el parámetro  esta enable, las tablas borradas y sus objetos dependientes se colocan en el recycle bin. Cuando el recycle bin esta deshabilitado las tablas borradas y sus objetos dependientes no se colocan en el reycle bin, simplemente se borran, y se deben utilizar otros medios para recuperarlos. El recycle bin está habilitado por defecto.

 Para deshabilitarlo:                  

ALTER SESSION SET recyclebin = OFF;
ALTER SYSTEM SET recyclebin = OFF;

Para habilitarlo:   

ALTER SESSION SET recyclebin = ON;
ALTER SYSTEM SET recyclebin = ON;

La habilitación y des habilitación de recycle bin con alter system o con alter session es inmediata. La des habilitación no implica que se purguen los objetos en el recycle bin.
Existen dos vistas de donde obtener información sobre los objetos en el recycle bin:
Una de los usos de estas vistas es identificar el nombre que la base de datos ha asignado a los objetos borrados, como se muestra en el siguiente ejemplo:   

SELECT object_name, original_name FROM dba_recyclebin
WHERE owner = 'HR';
OBJECT_NAME ORIGINAL_NAME
------------------------------ --------------------------------
BIN$yrMKlZaLMhfgNAgAIMenRA==$0 EMPLOYEES
Otro de los comandos que se puede utilizar
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
EMPLOYEES BIN$yrMKlZaVMhfgNAgAIMenRA==$0 TABLE 2003-10-27:14:00:19

Si se decide que no va restaurar los elementos que están situados en el reycle bin, puedes utilizar la sentencia purge para borrar todos los elementos y sus objetos asociados. Se necesitan los mismos privilegios que se utilizaron para borrar el objeto.
Cuando se utiliza el comando PURGE para borrar una taba, se puede utilizar el nombre que utiliza en en recycle bin o el nombre original de la tabla.
Para consultar los objetos que hay en la recycle bin: USER_RECYCLEBIN y  DBA_RECYCLEBIN
Se pueden purgar todos los objetos de un tablespace específico o de un usuario y tablespace especifico:   

PURGE TABLESPACE data;
PURGE TABLESPACE data USER scott;

Los usuarios pueden purgar sus objetos del recycle bin con el siguiente comando:   

PURGE RECYCLEBIN;

Si tienes privilegios de SYSDBA se puede purgar toda la reyclebin utilizando
DBA_RECYCLEBIN, en vez de  RECYCLEBIN en la sentencia anterior.   

Restaurando tablas del Recycle Bin   

Se utiliza  FLASHBACK TABLE … TO BEFORE DROP para recuperar tablas, se puede especificar el nombre original de la tabla o el nombre de la recycle bin. Existe la opción RENAME  TO para cambiar el nombre tabla en el momento que se recupera. El nombre del recycle bin se puede obtener de las vistas DBA_ o USER_RECYCLEBIN.
Para utilizar el comando FLASHBACK TABLE … TO BEFORE DROP se necesitan los mismos privilegios que para borrar una tabla.
Restaurar los objetos Dependientes.
Cuando se restaura una tabla del recycle bn, lo objetos dependietnes como los índices no recuperan sus nombres originales, si no que mantienes los que tenían en el recycle bin

Configurar LogMiner

Hoy voy a describir cómo utilizar LogMiner para revisar lo que hay dentro de los archive en una base de datos diferente a la que generó le archived log (basado en la nota How to Setup LogMiner [ID 111886.1] de metalink)
Lo primero que necesitamos de la base de datos original:

1. El archivo Archive
2. El diccionario de la base de datos, para obtenerlo haremos esto:

          2.1 Asegurarnos que existe un directorio definido en el UTL_FILE_DIR y que tenemos permisos de escritura.                

               Vamos a utilizar este ejemplo:
                   UTL_FILE_DIR = /oracle/logs
         2.2 Ejecutar el procedimiento DBMS_LOGMNR_D.BUILD, para generar el diccionario de la base de datos de la cual queremos ver el contenido de sus archives. Le tenemos que pasar dos       parámetro  el nombre del fichero y el directorio en el que queremos que se genere:
          Por ejemplo:

       EXECUTE DBMS_LOGMNR_D.BUILD( -
       DICTIONARY_FILENAME =>'dictionary.ora', -
       DICTIONARY_LOCATION => '/oracle/logs');

(No os olvidéis de poner el guión ‘-‘ al final de cada línea cuando se ejecuta un comando PL/SQL de más de una línea en SQL*PLUS)

Una vez que tenemos los dos archivos, el archived log y el diccionario nos vamos a una instancia Oracle 8.1.X o superior.

Especificar los ficheros en la base de datos donde los vamos a analizar (diferente de la original). Lo primero que hay que hacer es lo siguiente:
1. Crear una lista con los archive a analizar. Con el primer archivo se debe especificar tenemos que añadir la opción NEW (crea un nueva lista). Ejemplo:

           EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
           LOGFILENAME => '/oracle/logs/log1.f', -
           OPTIONS => dbms_logmnr.NEW);

2. Si se van  a añadir más archivos:

            EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
            LOGFILENAME => '/oracle/logs/log2.f', -
            OPTIONS => dbms_logmnr.ADDFILE);
   

3. Para borrar uno de la lista:

    
          EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
          LOGFILENAME => '/oracle/logs/log2.f', -
          OPTIONS => dbms_logmnr.REMOVEFILE);

4. Empezar a utilizar logminer, con el diccionario que se ha creado en la anterior base de datos:

           EXECUTE DBMS_LOGMNR.START_LOGMNR( -
           DICTFILENAME =>'/oracle/dictionary.ora');

                       Empezar a utilizarlo para una fecha en concreto:

           EXECUTE DBMS_LOGMNR.START_LOGMNR( -
           DICTFILENAME => '/oracle/dictionary.ora', -
           STARTTIME => to_date('01-Jan-1998 08:30:00', 'DD-MON-YYYY HH:MI:SS'), -
           ENDTIME => to_date('01-Jan-1998 08:45:00', 'DD-MON-YYYY HH:MI:SS'));

                       Para un SCN en concreto:

          EXECUTE DBMS_LOGMNR.START_LOGMNR( -
          DICTFILENAME => '/oracle/dictionary.ora', -
          STARTSCN => 100, -
          ENDSCN => 150);

5. El contenido de los archive se encuentrará en la tabla  V$LOGMNR_CONTENTS ordenado por SCN.