Como limpiar datapump fallidos ORA-31633

Hoy vamos a ver como solucionar el problema de relanzar algunos datapumps fallidos cuando nos devuelven el error ORA-31633

Una de las principales diferencias entre el export tradicional y el nuevo expdp es que el expdp crea un job en la base de datos que es quien se encarga de la labor de sacar los datos.

Cuando detenemos esta exportación de manera no controlada, puede ser que la definición del trabajo creada por el export quede dentro de la base de datos, con lo que, al volver a lanzar el trabajo del export recibamos un error «ORA-31633: unable to create master table XXX»

ORA-31626: job does not exist
ORA-31633: unable to create master table "SYSTEM.EXPORT_DIAR"
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 95
ORA-06512: at "SYS.KUPV$FT", line 863
ORA-01031: insufficient privileges

Para solucionar este problema, lo primero que tenemos que hacer es comprobar que trabajos no se encuentran en estado RUNNING


SET lines 200
SELECT owner_name, job_name, operation, job_mode,
state, attached_sessions
FROM dba_datapump_jobs
ORDER BY 1,2;

Esta consulta nos devuelve la informacion de los trabajos de datapump que hay en la base de datos, el resultado es una tabla del tipo

OWNER_NAME JOB_NAME            OPERATION JOB_MODE  STATE       ATTACHED
———- ——————- ——— ——— ———– ——–
SCOTT      EXPORT_TABLA_1 EXPORT    TABLE     NOT RUNNING        0
SYSTEM     EXPORT_DIARIA  EXPORT    FULL      NOT RUNNING        0

Aquí podemos ver como tenemos dos trabajos, uno del usuario SCOTT y otro de SYSTEM que están en estado NOT RUNNING, con lo que podemos eliminarlos.

Ahora buscaremos cual es la «master table» del job con la consulta

SELECT o.status, o.object_id, o.object_type,
       o.owner||’.'||object_name “OWNER.OBJECT”
  FROM dba_objects o, dba_datapump_jobs j
 WHERE o.owner=j.owner_name AND o.object_name=j.job_name
   AND j.job_name NOT LIKE ‘BIN$%’ ORDER BY 4,2;

STATUS   OBJECT_ID OBJECT_TYPE  OWNER.OBJECT
——- ———- ———— ————————-
VALID        15223 TABLE        SCOTT. EXPORT_TABLA_1
VALID        15293 TABLE        SYSTEM.EXPORT_DIARIA

Ahora podemos eliminar las tablas de los trabajos con la consulta.

SQL> DROP TABLE SCOTT. EXPORT_TABLA_1;
SQL> DROP TABLE SYSTEM.EXPORT_DIARIA;

Con esto habremos limpiado la tabla de los jobs del datapump, con lo que podremos volver a lanzar nuestro script sin problemas

Recuperacion con RMAN desde Dataprotector desde linea de comandos

Muchas veces tenemos el backup integrado por scripts propietarios del software de backup.
Esta integración nos garantiza el pode recuperar con «botón derecho», pero , puede darse el caso de querer recuperar manualmente, bien por que queremos tener el control total sobre el proceso o bien por que es en otra maquina o por que queramos hacer una recuperación mas especifica del RMAN que la que nos ofrezcan los botones del software de backup.

En este caso vamos a hacer una recuperación total de una base de datos que se ha copiado con dataprotector. Entre las cosas que necesitaremos son:

  • Init.ora de la base de datos, deberíamos de hacer una copia del mismo junto con el backup,con lo que podemos sacarlo de ahi
  • DBID de la base de datos, este DBID aparece en el log de rman, con lo que podremos sacarlo del ultimo log del backup
  • Cadena de configuración de la cinta. Esta en las propiedades avanzadas de la política de backup que usamos para copiar nuestra base de datos

Además, necesitaremos ser capaces de llegar al log de la ultima copia de rman, esto se hace desde dataprotector, mirando en las siguientes pestañas

Internal Database
     -> "log del backup"  (tiene el formato fecha/backup)
           -> Propierties (boton derecho)
               --> Messages (el log completo del rman)

Para clarificar un poco los logs, tendremos en este caso:

  • instancia=pruebas
  • Servidor=serveroracle.pamplona.name
  • DBID=3751694031 (obtenido del log del backup desde dataprotector)

Si no tuviésemos el init.ora podríamos recuperarlo también del backup ya que la 11g hace copia del init.ora con el controlfile autobackup, pero, es una buena practica el tener una copia del init.ora en modo texto, ya que, nos evita uno de los pasos mas engorrosos.
Con estas 3 cosas, podemos comenzar la recuperación de la base de datos.

Lo primero que recuperaremos será el controlfile, para ello haremos un script al que llamaremos restore_controlfile.cmd tal que

startup nomount;
set DBID=3751694031
run {
allocate channel 'dev_0' type 'sbt_tape'
 parms 'ENV=(OB2BARTYPE=Oracle8,OB2APPNAME=pruebas,OB2BARLIST=Online Diaria)';
restore controlfile from autobackup;
}

Al que llamaremos con

rman target / cmdfile restore_controlfile.cmd

En este punto, podemos llevarnos la sorpresa de que obtenemos un RMAN-06172

Al igual que vimos en el post RMAN-06172: no AUTOBACKUP found or specified handle is not a valid copy or piece tendremos que decirle exactamente cual es el nombre del controlfile que queremos recuperar, para ello, nos iremos al dataprotector y exploramos el log hasta la última línea en la que encontremos la palabra controlfile

[Normal] From: OB2BAR_DMA@serveroracle.pamplona.name "pruebas"  Time: 06/03/2013 21:21:19
	Starting OB2BAR Backup:serveroracle.pamplona.name: pruebas DP Managed Control File Backup "Oracle8"

La línea que estamos buscando es pruebas DP Managed Control File Backup «Oracle8», que es el fichero dentro de dataprotector donde se encuentra nuestro controlfile.
Así pues, modificaremos el script de backup y ahora será:

startup nomount;
set DBID=3751694031
run {
allocate channel 'dev_0' type 'sbt_tape'
 parms 'ENV=(OB2BARTYPE=Oracle8,OB2APPNAME=pruebas,OB2BARLIST=Online Diaria)';
restore controlfile from 'pruebas DP Managed Control File Backup "Oracle8"';
}

Con esto conseguiremos tener nuestro controlfile restaurado. Ahora, ya tenemos una restauracion standard de RMAN típica de manual.

Error RMAN-06172 recuperando del autobackup

En la entrada anterior  vimos como recuperar un spfile desde el backup con rman.

Desgraciadamente no siempre todo funciona a la primera, y , como Murphy nunca falla, el error inusual siempre tiene que tocarnos a nosotros. La teoría nos dice que  para recuperar un spfile o un controlfile de rman solamente hay que hacer

RMAN> restore spfile from autobackup;

Pero que ocurre si no funciona?

La recuperacion tanto del controlfile como del spfile puede complicarse si recibimos un RMAN-06172 . La salida del comando será algo similar a esto :

Starting restore at 28/09/12
allocatedchannel: ORA_DISK_1
channel ORA_DISK_1: sid=85 instance=pruebas devtype=DISK
recovery area destination: +DG_FRA
database name (ordatabaseuniquename) used for search: PRUEBAS
channel ORA_DISK_1: no autobackupsfound in the recovery area
channel ORA_DISK_1: looking for autobackup on day: 20120928
channel ORA_DISK_1: looking for autobackup on day: 20120927
channel ORA_DISK_1: looking for autobackup on day: 20120926
channel ORA_DISK_1: looking for autobackup on day: 20120925
channel ORA_DISK_1: looking for autobackup on day: 20120924
channel ORA_DISK_1: looking for autobackup on day: 20120923
channel ORA_DISK_1: looking for autobackup on day: 20120922
Channel ORA_DISK_1: no autobackup in 7 daysfound
RMAN-00571:   =================================
RMAN-00569: == ERROR MESSAGE STACK FOLLOWS
RMAN-00571: ===================================
RMAN-03002: failure of restorecommand at 09/28/2012 11:40:37
RMAN-06172: no autobackup found or  specified handle is not a valid copy or piece

Llegados a este punto lo primero que tenemos que comprobar es si reamente tenemos algún backup de nuestro spfile.

RMAN por defecto hace una copia de controlfile y spfile cada vez que se lleva a backup el tablespace system, así pues, si tenemos un backup válido en cinta de este tablespace deberemos de tener un backup del spfile.  Para consultar donde está esta backup, nos conectaremos desde  rman y ejecutaremos la consulta

RMAN >List backup;

Este comando nos volcará mucha información ordenada cronológicamente, con lo que nosotros tendremos que buscar en la parte inferior el registro del último día de backup donde esté el spfile.

El registro dirá algo como:

BS Key  Type LV SizeDeviceTypeElapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
797503  Incr 0  5.44G      SBT_TAPE    00:03:52     27/09/12
        BP Key: 797556   Status: AVAILABLE  Compressed: NO  Tag: TAG20120926T210038
Handle: intranet_backup<pruebas_8084:795042038:1>.dbf   Media:
List of Datafiles in backup set 797503
  File LV TypeCkp SCN    Ckp Time Name
  ---- -- ---- ---------- -------- ----
  1    0  Incr 139540429  26/09/12 +DG_DAT/pruebas/datafile/system.257.713298945
  2    0  Incr 139540429  26/09/12 +DG_DAT/pruebas/datafile/undotbs1.262.713298945
  3    0  Incr 139540429  26/09/12 +DG_DAT/pruebas/datafile/sysaux.261.713298945
  4    0  Incr 139540429  26/09/12 +DG_DAT/pruebas/datafile/undotbs2.264.713298947
  5    0  Incr 139540429  26/09/12 +DG_DAT/pruebas/datafile/users.345.713298947
  6    0  Incr 139540429  26/09/12 +DG_DAT/pruebas/datafile/pruebas.260.730901167

BS Key  Type LV SizeDeviceTypeElapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
797504Incr 0  15.00M     SBT_TAPE    00:00:06     27/09/12
        BP Key: 797557   Status: AVAILABLE  Compressed: NO  Tag: TAG20120926T210038
Handle:pruebas_backup<pruebas_8085:795042273:1>.dbf   Media:
  Control File Included: Ckp SCN: 139541276    Ckp time: 27/09/12
SPFILE Included: Modification time: 27/09/12

Aquí podemos ver como el 27 del 9 hicimos backup del tablespace system en el backupset 797504 lo que provoca que el RMAN haga backup de el SPFILE en el backupset  797504 en un fichero que el software de backup tiene identificado como  “pruebas_backup<pruebas_8085:795042273:1>.dbf”

Luego, si que tenemos respaldado el spfile.

¿Que hacemos ahora para recuperarlo?

Simplemente tendremos que ejecutar el comando de restauración indicando exactamente desde el fichero en el que queremos hacer la copia.

Vamos a rizar un poco mas el rizo y hagamos que la copia no esté ya en  la FRA,sino que el contenido ya está en cinta. Lo primero que tendremos que hacer es localizar un canal a cinta, para ello lo más sencillo es buscar el script de backup y copiar los parámteros específicos de  la línea del allocate channel .

En nuestro caso el resultado será :

allocate channel 'dev_0' type 'sbt_tape'   
parms 'ENV=(OB2BARTYPE=Oracle8,OB2APPNAME=pruebas,OB2BARLIST=pruebas_backup)';

Así pues, ya tenemos la línea que nos conectará con el software de backup, ahora tenemos que indicarle el nombre del fichero del cual queremos sacar el spfile, en nuestro caso hemos visto  que era  “pruebas_backup<pruebas_8085:795042273:1>.dbf” .

Con esto solamente nos queda hacer un bloque run de RMAN que nos recupere el spfile a una ubicación alternativa:

run {
allocate channel 'dev_0' type 'sbt_tape'
parms 'ENV=(OB2BARTYPE=Oracle8,OB2APPNAME=pruebas,OB2BARLIST=pruebas_backup)';
restore  spfile to '/tmp/spfile_restaurado_cinta.ora' from 'pruebas_backup<pruebas_8085:795042273:1>.dbf';
 }

Nos conectaremos a  nuestra base de datos target  y catálogo y ejecutamos nuestro bloque run,con el resultado:

run {
allocate channel 'dev_0' type 'sbt_tape'
parms 'ENV=(OB2BARTYPE=Oracle8,OB2APPNAME=pruebas,OB2BARLIST=pruebas_backup)';
restore  spfile to '/tmp/spfile_restaurado_cinta.ora' from 'pruebas_backup<pruebas_8085:795042273:1>.dbf';
}
3>allocatechannel 'dev_0' type 'sbt_tape'
parms 'ENV=(OB2BARTYPE=Oracle8,OB2APPNAME=pruebas,OB2BARLIST=pruebas_backup)';
4>restorespfileto '/tmp/spfile_restaurado_cinta.ora' from 'pruebas_backup<pruebas_8085:795042273:1>.dbf';
5> }
allocatedchannel: dev_0
channel dev_0: sid=147 instance=pruebas1 devtype=SBT_TAPE
channel dev_0: Data Protector A.06.11/PHSS_40470/PHSS_40471/DPSOL_00391/DPLNX_
Startingrestore at 28/09/12
channel dev_0: autobackupfound: pruebas_backup<pruebas_8085:795042273:1>.dbf
[Normal] From: OB2BAR_SBT_CHANNEL@server.local "pruebas"  Time: 09/28/12 12:29:09
Starting OB2BAR Restore: server.local:pruebas_backup<pruebas_8085:795042273:1>.dbf "Oracle8"
[Normal] From: OB2BAR_SBT_CHANNEL@server.local "pruebas"  Time: 09/28/12 12:29:09
Starting OB2BAR Restore: server.local:pruebas_backup<pruebas_8085:795042273:1>.dbf "Oracle8"
[Normal] From: OB2BAR_SBT_CHANNEL@server.local "pruebas"  Time: 09/28/12 12:29:10
Completed OB2BAR Restore: server.local:pruebas_backup<pruebas_8085:795042273:1>.dbf "Oracle8"
[Normal] From: OB2BAR_SBT_CHANNEL@server.local "pruebas"  Time: 09/28/12 12:29:10
Completed OB2BAR Restore: server.local:pruebas_backup<pruebas_8085:795042273:1>.dbf "Oracle8"
channel dev_0: SPFILE restorefromautobackup complete
Finishedrestore at 28/09/12
releasedchannel: dev_0
Recovery Manager complete..

Ahora solamente tenemos que buscar el fichero /tmp/spfile_restaurado_cinta.ora donde tenemos la imagen del  spfile recuperada del backup.

 

 

 

Recuperar un spfile borrado

Hoy vamos a ver algo tan sencillo como el recuperar un fichero spfile.

El spfile es la «nueva» version del fichero de configuracion de parametros texto de toda la vida llamado pfile. La principal ventaja que obtenemos con tener un fichero de configuración binario sobre un fichero de texto es que la instancia puede ir actualizando los cambios de configuración que llevas a cabo en la base de datos sin necesidad de tener que actualizarlo manualmente. Hemos de tener en cuenta que, con los nuevos modos de gestión de memoria la configuracion del tamaño de los distintos pooles ya no es estático, con lo que es necesario tener un fichero de datos actualizable si quieres mantener esa informacion en el siguiente arranque.

El fichero spfile es necesario en el momento en el que arrancas la instancia, pero no lo es para el funcionamiento de la base de datos, si  borras este fichero cuando la base de datos esta en funcionamiento todo funcionará correctamente, solamente tendremos errores cuando intentemos modificar algo del spfile, y los errorres que tendremos serán errores de localizacionde fichero del sistema operativo

ORA-01565: error al identificar el archivo '/opt/oracle/product/11.2.0.3/dbhome_1/dbs/spfileorcl.ora'
ORA-27037: no se ha podido obtener el estado del archivo
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3

Pero la base de datos seguirá funcionando correctamente.

Para restaurar un spfile tenemos dos opciones:

1- Restauración desde RMAN

Rman hace una copia del controlfile y el spfile cada vez que llevas a cabo un backup del tablespace system.  Así pues, si hacemos backups full de nuestra base de datos, deberíamos de tener una copia del spfile en el backupset.

La recuperación del fichero es muy sencilla, simplemente hay que decirle que lo restaure del autobackup con el comando:

restore spfile from autobackup;

Si tenemos la base de datos en funcionamiento el comando fallará devolviendonos el error:

RMAN> restore spfile from autobackup;
Starting restore at 29/09/12
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=156 device type=DISK
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of restore command at 09/29/2012 21:58:30
RMAN-06564: must use the TO clause when the instance is started with SPFILE

la solución a este problema es muy sencilla,  vamos a engañar un poco a nuestra base de datos, vamos a recuperarlo a un lugar alternativo y luego lo moveremos con comandos del sistema operativo (o del asm).

RMAN> restore spfile to '?/dbs/spfile.backup' from autobackup;
Starting restore at 29/09/12
using channel ORA_DISK_1
recovery area destination: /opt/oracle/flash_recovery_area
database name (or database unique name) used for search: ORCL
channel ORA_DISK_1: restoring spfile from AUTOBACKUP /opt/oracle/flash_recovery_area/ORCL/autobackup/2012_09_29/o1_mf_s_795264706_86ffo3j0_.bkp
channel ORA_DISK_1: SPFILE restore from AUTOBACKUP complete
Finished restore at 29/09/12
RMAN> quit
$cd /opt/oracle/product/11.2.0.3/dbhome_1/dbs/
mv spfile.backup spfileorcl.ora

P.D en caso de que la instancia estuviese caída y no tuviesemos el spfile en el momento la base de datos deberá de estar en modo MOUNT

2-Creándolo a partir del alert.log

Cada vez que arrancamos y paramos la base de datos, toda la información del spfile es volcada en el fichero alert.log

Starting up:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
  processes                = 150
  memory_target            = 1536M
  control_files            = "/opt/oracle/oradata/orcl/control01.ctl"
  control_files            = "/opt/oracle/flash_recovery_area/orcl/control02.ctl"
  db_block_size            = 8192
  compatible               = "11.2.0.0.0"
  db_recovery_file_dest    = "/opt/oracle/flash_recovery_area"
  db_recovery_file_dest_size= 3882M
  undo_tablespace          = "UNDOTBS1"
  remote_login_passwordfile= "EXCLUSIVE"
  db_domain                = ""
  dispatchers              = "(PROTOCOL=TCP) (SERVICE=orclXDB)"
  local_listener           = "LISTENER_ORCL"
  audit_file_dest          = "/opt/oracle/admin/orcl/adump"
  audit_trail              = "DB"
  db_name                  = "orcl"
  open_cursors             = 300
  diagnostic_dest          = "/opt/oracle"
.
.
.

Asimismo, tambien deja reflejados los cambios que hacemos si ejecutamos

SQL> alter system set undo_retention=9000;

Y luego miramos el alert, vemos que

ALTER SYSTEM SET undo_retention=9001 SCOPE=BOTH;

Con lo que, podremos  regenerar nuestro spfile creando un fichero de texto con estos valores  (fichero parameter file de texto clásico) , y despues ejecutando el comando.

create spfile from pfile='/tmp/init_SID.ora'

P.D  si la isntancia está levantada, aqui tendremos el mismo problema que cuando intentamos recuperar de RMAn con autobackup, con lo que tendremos que aplicar la misma solución, engañar a oracle desde el sistema operativo

create spfile='?/dbs/spfile.backup' from pfile='/tmp/initSID.ora'
cd $ORACLE_PRODUCT/dbs
mv spfile.backup spfileorcl.ora