May 13, 2008

Clonar base de datos con RMAN en Windows

Para duplicar o clonar una base de datos utilizando Recovery Manager dentro de una misma máquina, es requisito indispensable dejar esta base de datos en modo archived log a través de los siguientes pasos:

- Conectarse a la base de datos como usuario administrador (SYS o SYSTEM). Antes de hacer estos cambios es recomendable que se saquen respaldos a los archivos de PFILE y/o SPFILE.

-- Para saber si tu base de datos está en modo archived log,
-- puedes ejecutar lo siguiente:
archive log list;
(salida por pantalla)
Modo log de la base de datos Modo de No Archivado
Archivado automático Desactivado
Destino del archivo USE_DB_RECOVERY_FILE_DEST
Secuencia de log en línea más antigua 1
Secuencia de log actual 2
-- Si la salida por pantalla tiene archivado automático desactivado,
-- se debe seguir lo siguiente:

-- Debemos bajar la base de datos
SQL> shutdown immediate;

-- luego montarla

SQL>
startup mount;

-- Dejar la base en modo archive
SQL> alter database archivelog;

-- Volvemos a subir la base de datos
SQL> alter database open;

-- Creamos los destinos de archived (Esta carpeta debe existir)
SQL> alter system set log_archive_dest = 'C:\oracle\oradata\prod\arch' scope=spfile;

-- Damos un formato de nombre para los archivos de redolog
SQL> alter system set log_archive_format = 'prod_%s_%t_%r.arc' scope=spfile;

-- Bajamos y submis nuevamente la instancia:
SQL> shutdown immediate;

-- Luego subimos nuevamente la instancia
SQL> startup;

-- Creamos nuestro primer archive
SQL> alter system switch logfile;

- Desde fuera de la consola sqlplus hacemos un dir
al directorio recién creado y veremos nuevos archivos creados.

- Para el ejemplo estamos unsando como base de datos productiva a PROD
- Para el ejemplo estamos unsando como base de datos clon a CLON
- Una vez que la base de datos está en modo archive log es necesario crear un respaldo rman con el fin de utilizar esto para la base de datos clon. Para esto seguir los siguientes pasos:

- Crear un archivo (para este ejemplo llamado respaldo.rman) que contenga lo siguiente, como ejemplo se usa el destino C:\oracle\rman, esta carpeta debe existir:
RUN
{
CROSSCHECK BACKUP;
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE RETENTION POLICY TO REDUNDANCY 2;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO 'C:\oracle\rman\prod_%F.bck';
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT 'C:\oracle\rman\db_bck_full_%U';
backup device type disk filesperset = 10 tag 'BCK_DB_FULL' database include current controlfile;
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '
C:\oracle\rman\arch_bck_%U';
SQL "ALTER SYSTEM SWITCH LOGFILE";
backup device type disk filesperset = 100 tag 'BCK_ARCH' archivelog all;
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '
C:\oracle\rman\spfile_bck_%U';
backup device type disk filesperset = 1 tag 'BCK_SPFILE' spfile;
SQL "ALTER DATABASE BACKUP CONTROLFILE TO ''
C:\oracle\rman\cf_prod.bck''reuse";
}
delete noprompt obsolete device type disk;

- Luego de haber creado este archivo desde una consola de comandos ejecutar:
C:\oracle\rman>rman target / @respaldo.rman > respaldo.log

- Después de terminado el proceso podemos revisar el archivo respaldo.log en caso de errores
- Ingresamos a RMAN y ejecutamos lo siguiente comprobando el backup hecho:

C:\oracle\rman>rman target /
Recovery Manager : Release 10.2.0.1.0 - Production on MiÚ May 14 04:32:34 2008

Copyright (c) 1982, 2005, Oracle. All rights reserved.

conectado a la base de datos destino: PROD (DBID=66488671)
RMAN> list backup summary;

Lista de Copias de Seguridad
===============
Clave TY LV S Tipo de Dispositivo Hora de Finalizaci¾n N·mero de Parte N·mer
o de Copia Comprimido Etiqueta
------- -- -- - ----------- -------------------- ------- ------- ---------- ---
6 B F A DISK 14/05/08 1 1 NO BCK_
DB_FULL
7 B F A DISK 14/05/08 1 1 NO BCK_
DB_FULL
10 B A A DISK 14/05/08 1 1 NO BCK_
ARCH
12 B F A DISK 14/05/08 1 1 NO BCK_
SPFILE
13 B F A DISK 14/05/08 1 1 NO TAG2
0080514T042545

exit;

- Ahora comenzaremos con algunos procesos para la creacion de la base de datos clon.
- es necesario crear conectado desde la base de datos prod un archivo de parametros desde SPFILE, estos archivos serán creados en la carpeta dbs de ORACLE_HOME:

SQL> create pfile='
C:\oracle\product\10.2.0\db_1\dbs\initclon.ora' from spfile;

- Crearemos un nuevo archivo de password para la instancia clon:
C:\oracle\rman>orapwd file=C:\oracle\product\10.2.0\db_1\database\PWDclon.ora password=oracle

-- Editamos el archivo
C:\oracle\product\10.2.0\db_1\dbs\initclon.ora
background_dump_dest='C:\oracle\product\10.2.0/admin/clon/bdump'
compatible='10.2.0.1.0'
db_file_name_convert=('C:\oracle\oradata\prod', 'C:\oracle\oradata\clon')
log_file_name_convert=('C:\oracle\oradata\prod', 'C:\oracle\oradata\clon')
control_files='C:\oracle\oradata\clon\control01.ctl','C:\oracle\oradata\clon\control02.ctl','C:\oracle\oradata\clon\control03.ctl'
core_dump_dest='C:\oracle\product\10.2.0/admin/clon/cdump'
db_block_size=8192
db_domain='felipe.cl'
instance_name='clon'
db_file_multiblock_read_count=16
db_name='clon'
db_recovery_file_dest='C:\oracle\product\10.2.0/flash_recovery_area'
db_recovery_file_dest_size=2147483648
dispatchers='(PROTOCOL=TCP) (SERVICE=clonXDB)'
java_pool_size=4194304
job_queue_processes=10
large_pool_size=4194304
log_archive_dest='C:\oracle\oradata\clon\arch'
log_archive_format='clon_%s_%t_%r.arc'
open_cursors=300
pga_aggregate_target=96468992
processes=150
remote_login_passwordfile='EXCLUSIVE'
sga_target=290455552
service_names='clon.felipe.cl'
shared_pool_size=83886080
streams_pool_size=0
undo_management='AUTO'
undo_tablespace='UNDOTBS1'
user_dump_dest='C:\oracle\product\10.2.0/admin/clon/udump'

-- Creamos las siguientes ubicaciones

C:\>mkdir C:\oracle\product\10.2.0\admin\clon\adump

C:\>mkdir C:\oracle\product\10.2.0\admin\clon\bdump

C:\>mkdir C:\oracle\product\10.2.0\admin\clon\cdump

C:\>mkdir C:\oracle\product\10.2.0\admin\clon\dpdump

C:\>mkdir C:\oracle\product\10.2.0\admin\clon\pfile

C:\>mkdir C:\oracle\product\10.2.0\admin\clon\udump

C:\>mkdir C:\oracle\oradata\clon\arch

- Creamos el nuevo servicio windows
C:\>oradim -new -sid CLON -startmode auto
Instancia creada.

- Preparamos la base de datos con el pfile modificado
C:\>set ORACLE_SID=CLON

C:\>sqlplus "/as sysdba"

SQL*Plus: Release 10.2.0.1.0 - Production on MiÚ May 14 05:14:18 2008

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Conectado a una instancia inactiva.

SQL> startup nomount pfile='C:\oracle\product\10.2.0\db_1\dbs\initclon.ora';
Instancia ORACLE iniciada.

Total System Global Area 293601280 bytes
Fixed Size 1248624 bytes
Variable Size 92275344 bytes
Database Buffers 197132288 bytes
Redo Buffers 2945024 bytes
SQL> exit

- Modificamos el tnsnames:

PROD =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = leonardo)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = prod.felipe.cl)
)
)

CLON =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = leonardo)(PORT = 1526))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = clon.felipe.cl)
)
)

- También editamos el archivo listener.ora:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = C:\oracle\product\10.2.0\db_1)
(PROGRAM = extproc)
)
)

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
(ADDRESS = (PROTOCOL = TCP)(HOST = leonardo)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = leonardo)(PORT = 1526))
)
)

- Procedemos a hacer la clonación
- Tener presente que rman irá a la carpeta database cuando baje y monte la base de datos, por lo tanto se debe copiar el initclon.ora a esta carpeta de ORACLE_HOME

C:\>rman target /@prod auxiliary /

Recovery Manager : Release 10.2.0.1.0 - Production on MiÚ May 14 05:38:58 2008

Copyright (c) 1982, 2005, Oracle. All rights reserved.

conectado a la base de datos destino: PROD (DBID=66488671)
conectado a una base de datos auxiliar: CLON (no montada)

run{
allocate auxiliary channel ch1 type disk;
duplicate target database to CLON;
}

Eso es todo.
Felipe Donoso B.