viernes, julio 29, 2005

Copiar una base de datos.


Últimamente he tenido la necesidad de copiar bases de datos.

La petición textual era la creación de una base de datos igual que otra, pero con otro nombre. En algunos casos se trataba de replicar el entorno de producción para usarlo como test. En otros, simplemente, testear que el backup permitía recuperar la base de datos sobre otra máquina y dejar esa base de datos operativa como entorno auxiliar.

Cuando la base de datos puede conservar el mismo nombre y mismo SID, es tan fácil como copiar datafiles, redolog, controlfiles y archivos ORA sobre los mismos directorios originales en una máquina con un servidor Oracle instalado*.
* Por supuesto, misma plataforma O.S., versión y release de Oracle.

No obstante, en los casos en los que el nombre debe ser diferente, hay que ser muy preciso con los pasos a seguir. Incluyo dos pasos previos como opcionales por si son de utilidad.

En este ejemplo se asume que disponemos de la posibilidad de hacer un backup en frío de la base de datos.

Pasos preliminares (recomendado):

  - Backup frío, backup caliente, export, Transport Tablespaces, backup del backup, backup de todo lo posible.
  - Reducción de tamaño de los datafiles. (Tom Kyte tiene un fabuloso script para ello). Y otra vez backup.

Pasos a seguir:

  1.- Backup en frío de la BBDD original
  2.- Generación del pfile para la nueva BBDD
  3.- Edición del pfile para sustituir: CONTROL_FILES, DB_NAME, y carpetas _DUMP_DEST,...
  4.- Definir el nuevo ORACLE_SID
  5.- Crear el nuevo servicio.
  6.- Creación del fichero de passwords (sólo si el pfile tiene REMOTE_LOGIN_PASSWORDFILE=exclusive)
  7.- Conexión a sqlplus como SYSDBA
  8.- Arranque de la instancia y creación del fichero de parámetros SPFILE
  9.- Backup del controlfile de la BBDD original a traza
  10.- Recreación del controlfile con la cláusula SET NAME.
  11.- Abrir la base de datos con modo OPEN RESETLOGS.




1.- Backup en frío de la BBDD original.
    Restauración del backup sobre nueva ubicación.


-- Ejecutar el resultado de la siguiente sentencia como script.
-- NOTA: cuidado con los nombres duplicados de fichero.
-------------------------------------------------------------
select 'shutdown immediate;' from dual
union all
select 'host copy '||name||' &&directorio_destino' from v$controlfile
union all
select 'host copy '||member||' &directorio_destino' from v$logfile
union all
select 'host copy '||name||' &directorio_destino' from v$datafile
union all
select 'startup' from dual;

-- copia de los ficheros a los directorios destino
---------------------------------------------------



2.- Generación del pfile para la nueva base de datos

SQL> create pfile='?\admin\sid\pfile\inittest.ora' from spfile;

Archivo creado.



3.- Edición del pfile para sustituir: CONTROL_FILES, DB_NAME, y carpetas _DUMP_DEST,...



4.- Definir el nuevo ORACLE_SID

    c:\>set ORACLE_SID=test



5.- Crear el nuevo servicio.

    c:\>oradim -NEW -SRVC OracleServicetest  -startmode auto



6.- Creación del fichero de passwords

    c:\>orapwd file=C:\orant\ora92\database\PWDtest.ora password=xxxxxxxxx



7.- Conexión a sqlplus como SYSDBA

    C:\>sqlplus

    SQL*Plus: Release 9.2.0.6.0 - Production on Vie Jul 29 16:41:22 2005

    Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

    Introduzca el nombre de usuario: sys/xxxxxxxxxx as sysdba
    Conectado a una instancia inactiva.



8.- Arranque de la instancia y creación del fichero de parámetros SPFILE

    SQL> STARTUP NOMOUNT PFILE='C:\DIRECTORIO_DESTINO\inittest.ora'
    Instancia ORACLE iniciada.

    Total System Global Area 1074866044 bytes
    Fixed Size                   456572 bytes
    Variable Size             905969664 bytes
    Database Buffers          167772160 bytes
    Redo Buffers                 667648 bytes
    SQL> create spfile from pfile='C:\DIRECTORIO_DESTINO\inittest.ora';

    Archivo creado.



9.- Backup del controlfile de PROD a trace.

    SQL> alter database backup controlfile to trace;

    Base de datos modificada.



10.- A partir de la traza del fichero de control.
     Recreación del controlfile con el SET NAME al nuevo nombre.

     CREATE CONTROLFILE SET DATABASE "TEST" RESETLOGS  NOARCHIVELOG REUSE
        MAXLOGFILES 50
        MAXLOGMEMBERS 5
        MAXDATAFILES 133
        MAXINSTANCES 1
        MAXLOGHISTORY 453
     LOGFILE
       GROUP 2 'C:\DATA\TEST\REDO\REDO02.LOG'  SIZE 100M,
       GROUP 3 'C:\DATA\TEST\REDO\REDO03.LOG'  SIZE 100M,
       GROUP 4 'C:\DATA\TEST\REDO\REDO04.LOG'  SIZE 150M,
       GROUP 5 'C:\DATA\TEST\REDO\REDO05.LOG'  SIZE 150M,
       GROUP 6 'C:\DATA\TEST\REDO\REDO06.LOG'  SIZE 200M
      -- STANDBY LOGFILE
     DATAFILE
        (... ficheros...)
        'C:\DATA\TEST\SYSTEM\SYSTEM01.DBF',
        'C:\DATA\TEST\DATA\DATA01.DBF'
     CHARACTER SET WE8MSWIN1252
     ;

     Archivo de control creado.



11.- Abrir la base de datos con modo OPEN RESETLOGS.

     SQL> alter database open resetlogs;

     Base de datos modificada.



12.- Verificación.

     SQL> select instance_name from v$instance;

     INSTANCE_NAME
     ----------------
     test

     SQL> select name from v$database;

     NAME
     ---------
     TEST

     SQL> select status from v$thread;

     STATUS
     ------
     OPEN



12.- Shutdown y Open de la base de datos.

     SQL> shutdown immediate;
     Base de datos cerrada.
     Base de datos desmontada.
     Instancia ORACLE cerrada.

     SQL> startup
     Instancia ORACLE iniciada.

     Total System Global Area 1074866044 bytes
     Fixed Size                   456572 bytes
     Variable Size             905969664 bytes
     Database Buffers          167772160 bytes
     Redo Buffers                 667648 bytes
     Base de datos montada.
     Base de datos abierta.

29 comentarios:

Marcos Mendez Mundiña dijo...

Hola Javier.

Me parece un articulo muy interesante, aunque probablemente me falte algun detalle o este implementando mal algun paso:

Al ejecutar el punto 9, una vez realizado los anteriores sin ningun error, me da lo siguiente:

SQL> alter database backup controlfile to trace;

ORA-01507: base de datos sin montar

La base de datos se habia arrancado en modo nomount en el punto 8 correctamente. Si pruebo a cerrarla y arrancarla directamente en modo mount a partir del pfile modificado (directorios y dbname) me da el siguiente error:

ORA-01103: el nombre de la base de datos 'PROD' del archivo de control no es 'TEST'

Lo he probado varias veces y no consigo ver donde me equivoco al seguir tu procedimiento ¿Tienes alguna idea?

Muchas gracias por anticipado,

Un saludo,

Marcos Mendez

Javier Morales dijo...

Hola Marcos,

Si sigo los pasos en orden, en el punto 9 la base de datos PROD (original) debería estar abierta después de haber hecho el backup en frío en el punto 1.

Por algún motivo tu bbdd PROD está en modo "NOMOUNT" (es decir, cerrada y sin montar el fichero de control) y por ello recibes ese error.

Si consultas el fichero de trazas que aparece cuando ejecutas correctamente alter database backup controlfile to trace; verás que en la cabecera menciona el nombre de la base de datos original.

En el punto 10 hay que corregir el nombre de esa base de datos y poner el definido en el servicio.

Suerte! y gracias!
Javier

Marcos Mendez Mundiña dijo...

Efectivamente Javier, lo estaba haciendo mal, lo puse en Test. Ahora ya va todo niquelado.

Muchas gracias por tu ayuda !!

Un saludo,

Marcos

Rafa dijo...

Hola Javier.

Este articulo es justo lo que andaba buscando, pues mi tarea consiste en recuperar una base de datos desde 0 cuando del disco duro tan solo se ha recuperado el archivo Oradata de la carpeta de oracle, por tanto, tengo los Controlfiles,los redo y los datafile...
he seguido la explicación al milimetro, pero me he encontrado con dos escollos:
1.- Se encuentra en el paso dos, pues no puedo generar un Pfile, dado que no tengo la base de datos original.
2.- por tanto, no consigo hacer el paso tercero que por otro lado al ser un neofito en esto, desconozco que valores nuevos tengo que situar.

Espero que me puedas echar una mano, muchas gracias por tu atencion.

Javier Morales dijo...

Hola Rafa,

Gracias por tu comentario y tu mail.

El PFILE es un fichero de parámetros en formato texto. Lo único que contiene son valores que parametrizan las áreas de memória, los procesos, etc. de la instancia de la base de datos. De este modo, podrías crearte un pfile sólo con el bloc de notas, introduciendo los cuatro parámetros principales para este caso, que son INSTANCE_NAME, DB_NAME, CONTROLFILES, y otros que quizás te interese parametrizar como SHARED_POOL_SIZE y DB_CACHE_SIZE (para "dimensionar" cuanta memoria consumirá tu base de datos).

Como crear un fichero PFILE es un rollazo, puedes usar el que hay por defecto en la instalación oracle dentro del directorio admin\pfile??? o por ahí... busca un fichero init*.ora en el directorio oracle y seguro que tienes uno por defecto. O, incluso, si instalaste el software Oracle creando una base de datos por defecto llamada, por ejemplo, orcl, seguro que hay por ahí un initorcl.ora que puedas "plagiar" para tu caso.

muy bien, en este punto QUIETO PARAO !!

tienes instalado el software Oracle, con una base de datos como ejemplo? pues, entonces, no "machaques" la carpeta oradata o te cargarás la otra base de datos (que no necesitas para nada, pero vaya tontería hacerlo! )
te cuento,
Instalas Oracle y estás instalando el "motor"
a partir de ahí, creas una base de datos con el asistente (si usas windows, está en Inicio/programas/Oracle_loquesea/configuration and migration tools/DataBase Configuration Assistant
en tu caso, estás creando una base de datos a partir de una existente!!
por lo tanto... olvídate (si quieres) de la carpeta ORADATA y vamos a instalar los ficheros de la bbdd en otro directorio llamado ORABBDD (por ejemplo, o ORAPEPITO, si quieres) a Oracle le da igual donde estan los ficheros.

ok

tienes una carpeta ORADATA que no te sirve para nada (para este ejemplo) y una llamada ORABBDD

en la carpeta ORABBDD tienes los datafiles, controlfiles y redologs, los tres tipos de ficheros imprescindibles en una bbdd Oracle

bien

en el artículo, hablo de crear el "servicio" de windows para gestionar esa bbdd. sigue los pasos y llama al servicio OracleServiceBBDD
porque, para no "liarnos" con la base de datos por defecto, a esta bbdd la llamaremos BBDD para no liarnos en ningún punto, ok?

en este punto, debes poder seguir con los siguientes pasos: arrancar el servicio, ejecutar el SQLPLUS, conectarte como sysdba
y
aquí
aparecerá un mensaje que dice "Conectado a una instancia inactiva".
Es decir
Estás conectado a algo que aun no está "montado" (tus datafiles, redolog y controlfiles)
en este momento tienes que "levantar la instancia", usando el PFILE que te has montado con los parámetros
DB_NAME=BBDD
INSTANCE_NAME=BBDD
CONTROLFILES=('c:\oracle\ora_directorioloquesea\ORABBDD\control01.ctl','c:\oracle\ora_directorioloquesea\ORABBDD\control02.ctl','c:\oracle\ora_directorioloquesea\ORABBDD\control03.ctl')

etc... (doy por supuesto que tienes tres controlfiles... como se trata de copias, sólo con uno para el ejemplo te bastaría)

SQL> startup nomount pfile='c:\oracle\ora_directorio\admin\pfile\initBBDD.ora'

y se "arrancará" el área de memoria y procesos que usará tu futura bbdd.

en el siguiente punto (más minucioso), deberías "montar" la base de datos usando ese controlfile, o crear uno de nuevo (el sqlplus de Oracle reemplazará los existentes) tal como continua el artículo.

montas la base de datos con el comando

SQL> alter database mount;

hasta aquí todo irá correcto si la base de datos que quieres recuperar se llama BBDD, o PEPITO. Si sigues estos pasos con el nombre de la base de datos (y se llamaba TEST, la original), la creación del controlfile funcionará. En caso contrario se quejará diciendo que la instancia tiene un DB_NAME que no coincide con el nombre de bbdd que tiene el controlfile. En ese caso, deberías RECREAR el controlfile de la siguiente forma:

CREATE CONTROLFILE SET DATABASE "TEST" RESETLOGS NOARCHIVELOG REUSE
MAXLOGFILES 50
MAXLOGMEMBERS 5
MAXDATAFILES 133
MAXINSTANCES 1
MAXLOGHISTORY 453
LOGFILE
GROUP 2 'C:\DATA\TEST\REDO\REDO02.LOG' SIZE 100M,
GROUP 3 'C:\DATA\TEST\REDO\REDO03.LOG' SIZE 100M,
GROUP 4 'C:\DATA\TEST\REDO\REDO04.LOG' SIZE 150M,
GROUP 5 'C:\DATA\TEST\REDO\REDO05.LOG' SIZE 150M,
GROUP 6 'C:\DATA\TEST\REDO\REDO06.LOG' SIZE 200M
-- STANDBY LOGFILE
DATAFILE
(... ficheros...)
'C:\DATA\TEST\SYSTEM\SYSTEM01.DBF',
'C:\DATA\TEST\DATA\DATA01.DBF'
CHARACTER SET WE8MSWIN1252
;

en LOGFILE pones los ficheros de redo y en DATAFILE los ficheros de datos.

ahora, si todo está correcto aquí, tienes tres sitios donde consultar qué datafiles y redolog CREE EL CONTROLFILE que hay.

select member from v$logfile;
select name from v$datafile;

con estas dos consultas en el sqlplus verás los ficheros en la ubicación que él los espera.

como, seguramente, están en ubicaciones distintas, deberás ejecutar

SQL> alter database rename file 'c:\oracle\ORADATA\system01.dbf' to 'c:\oracle\ORABBDD\system01.dbf';

y así con los datafiles y los logfiles

vuelve a consultar v$logfile y v$datafile para ver que todos los ficheros apuntan donde quieres...

en este punto, si el controlfile dirige los redolog y los datafiles a las ubicaciones donde efectivamente existen, todo estará perfecto para poder ejecutar:

SQL> alter database open;



y FIN DEL EJEMPLO!! :)

Un saludo y mucha suerte con tu tarea!

Anónimo dijo...

Javier,
Si quiero suspender momentaneamente las operaciones sobre una instancia que comando debo usar?

Javier Morales dijo...

Hola Anónimo.

Pues no sé bien qué quieres hacer, pero

ALTER DATABASE CLOSE;

Si lo que quieres es seguir trabajando como DBA, debes hacer un

ALTER DATABASE RESTRICTED;

y solamente los usuarios DBA's o con el privilegio RESTRICTED SESSION podrán conectarse.

Un saludo

Anónimo dijo...

Javier,
Con ALTER SYSTEM SUSPEND suspendo todas las operaciones de la sesión momementaneamente sobre la instancia que estoy administrando?

Anónimo dijo...

Javier,
Una pregunta la vista dinámica V$thread contiene información de thread del archivo de control, que es el Thread? es el trace?

Alexander dijo...

Javier, de antemano gracias por tu colaboracion. Al llegar al punto 7 y tratar e conectarme como SYSDBA obtengo un ORA-01031: insufficient privileges... que podra estar pasando.?
Alex.

Anónimo dijo...

Hola Javier,

Te cuento mi triste caso de novato.
Tengo instalado Oracle Express en dos equipos (misma plataforma, version oracle, etc...). En el servidor tengo una BD que quiero copiar al de pruebas, he copiado la carpeta oradata del servidor al de pruebas pero no funciona.

¿Alguna sugerencia?

Muchas gracias

Anónimo dijo...

MUY BUEN EJEMPLO, SOLO UNA PREGUNTA, como seria en el caso de que la base este es modo archive log, ya que en este ejemplo solo se copian , control files, redos y data files. que pasos se sequirian por favor escribirme o responderme al dany_tejadaaa@yahoo.es

Anónimo dijo...

hola Javier, ante todo muchas gracias por tu ayuda. Me surge una duda en el paso alter database open resetlogs;, ya que al hacerlo me dice que el archivo 1 necesita recuperación del medio fisico, en concreto SYSTEM.bdf.
Estoy intentando hacer recover database using backup controlfile;, pero claro no tenemos .ARC en nuestro backup, ya que la BBDD no está en modo archivelog.
Como podría hacer el open de la base de datos sin tener estos ARC?

Muchas gracias

Anónimo dijo...

hola javier, tengo una duda y tal vez me puedes ayudar, soy novata en oracle, quisiera que me expliques como crear una base de datos de forma manual, en realidad es como crear el servicio para la base da datos que originará el init.ora y luego la base de datos con el comando create database.... eso entiendo. Gracias por tu colaboracion

Javier Morales dijo...

Hola, a todos,

Podéis escribirme a mi mail, oraclexperto@gmail.com y podremos comentar las preguntas con más calma, si queréis...

básicamente, de fin a principio.

último anónimo. ¿De qué plataforma se trata? Usa el asistente si eres novata! la crearás con una definición por defecto bastante buena, y luego parametriza lo que quieras.

otro anónimo. Si un fichero necesita recuperación y no tienes archivelog, no hay nada que hacer... para eso sirve el modo archivelog!! :P

a Dany Tejada, pues los pasos están descritos, precisamente, en este artículo... si la base de datos está en modo archivelog, la única diferencia es que podrás hacer el backup en caliente... nada más!

Al otro anónimo: con ALTER SYSTEM SUSPEND; dejas la base de datos congelada para todo el mundo. Vuelves a recuperar la actividad de la base de datos con ALTER SYSTEM RESUME;


Espero haberos ayudado!
Un saludo,
Javier

rodrigo dijo...

muchas gracias javier, tu articulo me ayudo para levantar un servidor en produccion que se cayo y el backup tambien se rompio. Solo pudimos recuperar lo file de oracele.

GISman dijo...

si tengo dos instancias creadas como me conecto a la primera ?? sin necesidad deponer usuario@ierainstancia..

María dijo...

Hola ,
Necesito hacer una copia de una base de datos en otro equipo pero el backup fue realizado en caliente. Como debo espaificar el recover database ?? puedo usar el using backup control file si los files van a estar en otra ubicación??
Desde ya muchas gracias

Angelito dijo...

Buenas noches Sr. Javier!, solo necesito me responda una pregunta por mi tranquilidad, es posible levantar una base de datos solo con todos los ficheros dentro de oradata??

Si la respuesta es positva mi problema es el siguiente, por una falla electrica y base de datos nunca mas pudo arrancar dandome el siguiente error: ORA-01033: ORACLE initialization or shutdown in progress.

MI segunda pregunta! Que hago solucionar ese problema y levantar la base de datos en ese servidor o montar un servidor nuevo y pasar los dbf, controlfiles y todo lo demas?

Si puede ayudarme a solucionar el problema de ORA-01033: ORACLE initialization or shutdown in progress, perfecto, si no ayudeme a arracar el respaldo el frio el el servidor nuevo que lo monte en otro equipo con la misma configuracion, y crea la misma BD y el mismo sid y todo eso.


Usted dice como puede ayudarme, solo necesito montarla para sacar unos exports en dmp para salvar mi trabajo!!!.

Le agardezco su pronta respuesta y si tiene algun numero telefonico y no es molestia le juro que lo llamare soloo una vez para que me haga el favor de asesorarme.


Saludos y gracias de antemano

Maria Antonieta dijo...

hola javier

tengo un problema, tengo la base de produccion montada en modo noarchivelog,lleva 1 semana asi!!

no la puedo montar en modo archive, ya que alguien borro los archives,el archivo controlfile,el log,y aunque parezca increible aqui no tienen replica del servidor, osea solo tenemos lo que hay en produccion. al intentar levantar la base se truena porque no encuentra la ruta para escribir los archives... me puedes ayudar no tengo idea de que hacer!!!


gracias atte: Marian

Javier Morales dijo...

Hola Maria Antonieta,

Si tienes la base de datos montada (es decir, en modo MOUNT) quiere decir que los ficheros de control existen.

El modo ARCHIVELOG consiste en que cuando los ficheros de redo log online se llenan, se archivan en un directorio para realizar recuperaciones. Si lo único que te falta es una dirección para escribir los archives, créala.

Recopila todo lo que está dañado y muéstrame el error que recibes en el fichero alert.log.

¿Quien es el DBA? Quien sea responsable de la base de datos (quizás eres tú) debería tener claros estos conceptos básicos.

Anónimo dijo...

Hola Javier,
tengo los backups en frio en dos unidades D y E
cuando monto esto desde cero me dice que la base de datos esta inactiva

Javier Morales dijo...

Hola Anónimo,

¿Qué te parece si incluyes la sintaxis de lo que estás ejecutando.

La instancia está inactiva cuando aun no se ha arrancado (antes incluso de hacer NOMOUNT).

Un saludo,

Anónimo dijo...

Saludos Javier, Mi nombre Abel Morales, gracias por responder a parte de mi duda.
Pero el problema radica en que tengo las bases de datos en las unidades D y E, y el software oracle Instalado en la Unidad C. lo que no puedo realizar es conectarme con la BD,configure correctamente el TNS y el listener,hasta tengo el TNSping y hasta ahi llego mi restauracion.
Ahh no olvides que mis controlfiles y otros estan en la unidad D y E.
ESpero puedas ayudarme, Gracias de Antemano

Javier Morales dijo...

Hola Abel,

No importa cómo se llamen las unidades donde están los ficheros de la base de datos. Lo que tienes que tener claro es la secuencia de arranque.

Si te conectas como / as sysdba a una instancia inactiva:

1.- startup nomount buscará el fichero init.ora (el el directorio $ORACLE_HOME/dbs ó puedes especificar tú con PFILE="fichero" donde se encuentra) para arrancar la instancia (memoria y procesos) con los parámetros del fichero.

2.- alter database mount; irá a buscar los ficheros de control al valor que esté definido en el parámetro CONTROL_FILES del fichero init.ora. Con ello, montará la instancia.

3.- En el fichero de control se encuentran las ubicaciones de TODOS los ficheros de la base de datos (redo log y datafiles). Una vez la instancia esté montada, podrás consultar v$datafile y v$logfile para colocar esos ficheros en su ubicación y ejecutar alter database open;

No obstante, Abel, con todo mi aprecio, si tienes dudas con el proceso de arranque de una base de datos, yo confiaría la recuperación de ésta a algún DBA con más experiencia. Corres el riesgo de alterar las cabeceras de estos ficheros y dejar el backup inservible.

Espero haberte ayudado, un saludo,
Javier

oscar dijo...

Hola Javier,

Lo que yo necesito hacer es lo que mencionas en la primera parte del articulo:
Cuando la base de datos puede conservar el mismo nombre y mismo SID, es tan fácil como copiar datafiles, redolog, controlfiles y archivos ORA sobre los mismos directorios originales en una máquina con un servidor Oracle instalado*.
* Por supuesto, misma plataforma O.S., versión y release de Oracle.


tienes algun articulo que describa mas en detalle el procedimiento.

Javier Morales dijo...

Hola Oscar,

Los pasos serían los siguientes:

1.- Backup en frío de la BBDD original
2.- Definir el ORACLE_SID en la máquina destino.
3.- Crear el nuevo servicio en la máquina destino si se trata de Sistemas Windows.
4.- Copiar todos los ficheros (incluyendo todo lo que haya en $ORACLE_HOME/dbs y $ORACLE_HOME/network/admin y demás) a la máquina destino
5.- Conexión a sqlplus en la máquina destino como SYSDBA y abrir la base de datos destino con STARTUP (normal).

El punto 1 y el punto 3 son iguales a los del artículo. El resto es sólo parar la base de datos y copiar los ficheros de un host a otro.

Espero haberte ayudado,
Javier

Anónimo dijo...

Jorge Mtz

Mi punto es y si tengo un respaldo en frio y hare la recuperacion con controlfile's(binario) existentes y la recuperacion con archivelogs que pasos se seguirian?

gracias

Anónimo dijo...

cordial saludo Javier quisiera preguntarte si es posible teniendo toda la carpeta oradata con las dbf restaurar una base de datos

Amazon