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.

Apr 15, 2008

Truco: Simula un No a todo en Windows

Truco: Simula un No a todo en Windows
Seguro que conocéis está situación. Estamos copiando una serie de archivos y de repente nos avisa de que ya existen y si queremos sobreescribirlos. En el caso de que si tenemos dos opciones, incluida la del Si a todo, pero ¿y si no queremos? Tendremos que ir dándole todas las veces al No, ya que no existe la opción No a todo.

Sin embargo existe un pequeño truco muy sencillo. Para simular un No a todo simplemente deberemos pulsar la tecla Shift y mantenerla pulsada mientras le damos a No. Windows lo interpretará como un No a todo y no sobreescribirá los archivos que ya existan.

Fácil y rápido.

Vía | DownloadSquad

Mar 24, 2008

Rename Database name Oracle (db_name)

--para renombrar una base de datos

sql> alter system switch logfile;

sql> alter database backup controlfile to trace;

-- si la instancia está administrada por spfile
-- (show parameter pfile)
sql> create pfile from spfile;

sql> shutdown immediate


--luego abrimos el último trace generado en la carpeta udump:
hasta encontrar algo similar a lo siguiente:



--copiamos esa parte del archivo a un nuevo archivo *.sql
Cambiamos en el la línea CREATE CONTROLFILE REUSE DATABASE "xxxxx" RESETLOGS NOARCHIVELOG
a
CREATE CONTROLFILE SET DATABASE "xxx" RESETLOGS NOARCHIVELOG
--en el caso anterior esta base de datos se encuentra
--en modo noarchived log

-- el script luciria algo similar a (Sería bueno guardarlo
en un script y luego correrolo con @script.sql desde sqlplus "/as sysdba":

--esto lo añadimos nosotros, indicandole el nuevo pfile
--en ese pfile hay que modificar los parámetros:
--db_name, control_files, user_dump_dest, audit_file_dest, background_dump_dest y
--core_dump_dest con los nuevos valores.
STARTUP NOMOUNT PFILE=/u01/app/oracle/product/10.2.0/db_1/dbs/initlab.ora

--Cuando se setea un nuevo nombre de base de datos se deben
--resetear las secuencias de redolog
CREATE CONTROLFILE SET DATABASE "DUOC" RESETLOGS NOARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u02/oradata/duoc/redo01.log' SIZE 50M,
GROUP 2 '/u02/oradata/duoc/redo02.log' SIZE 50M,
GROUP 3 '/u02/oradata/duoc/redo03.log' SIZE 50M
-- STANDBY LOGFILE
DATAFILE
'/u02/oradata/duoc/system01.dbf',
'/u02/oradata/duoc/undotbs01.dbf',
'/u02/oradata/duoc/sysaux01.dbf',
'/u02/oradata/duoc/users01.dbf',
'/u02/oradata/duoc/example01.dbf'
CHARACTER SET WE8ISO8859P1
;

-- Database can now be opened normally.
ALTER DATABASE OPEN RESETLOGS;
--tempfile

ALTER TABLESPACE TEMP ADD TEMPFILE '/u02/oradata/duoc/temp01.dbf'
SIZE 22020096 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;

--creamos las nuevas rutas de los datafiles, redolog, bdump, udump, controlfiles, etc,
--editamos desde el .bash_profile el ORACLE_SID
--ahora corremos el script

sqlplus "/as sysdba" @script.sql

luego sólo nos queda eliminar las antiguas carpetas que estaban asociadas
al antiguo nombre.

Mar 10, 2008

Forms migration Application Server

Una Simple Receta en 4 simples pasos

Cuando tengamos que migrar una aplicación desarrollada con el modulo forms del Application Server de Oracle, hay que modificar los siguientes archivos en el nuevo servidor.

Primero que todo encargate de copiar todos los archivos relacionados con la aplicación (forms, imágenes, etc..) al nuevo servidor. Una herramienta bastante útil para estos casos es scp, siempre y cuando tengas el demonio arriba en el servidor:

scp -rp /tmp/carpeta_forms oracle@nuevo_servidor:/ruta_nuevos_forms

Los siguientes archivos que se deben tener en cuenta son:

1.- Fijarse en el archivo $ORACLE_HOME/forms/server/default.env en ella existe una línea FORMS_PATH ella es la que apunta a la dirección dónde están almacenados los forms en especial el forms que se utiliza en el paso 2 (Dentro de este archivo también es posible configurar el tipo de lenguaje).

2.- Revisar las últimas líneas del archivo $ORACLE_HOME/forms/server/formsweb.cfg. esto es para la ubicación de la url cuando se invoque desde http://host:puerto/forms/frmservlet?config=ejemplo

#son similares a estas
[ejemplo]
form=ejemplo01
#Probablemente ocupe alguna configuración de tnsnames para conectarse a alguna instancia
userid=ejemplo/ejemplo@ejemplo
separateframe=true
debug_messages=no
otherparams=term=/u01/app/oracle/product/ias10gR2/midtier/forms/admin/resource
/US/fmrpcweb.res

3.- Revisar los alias para las imágenes $ORACLE_HOME/forms/server/forms.conf
#esto es para cuando se invoca una imagen desde la url web
AliasMatch ^/forms/imagenes/(..*) "/ruta_nuevos_forms/imagenes/$1"

4.- Revisar el path de los iconos en $ORACLE_HOME/forms/java/oracle/forms/registry/Registry.dat la línea default.icons.iconpath, esta línea utilizará la url web completa.

Saludos.

Jan 9, 2008

Corromper bloque oracle y recuperarlo


Si deseas realizar un test de recovery sobre un bloque Oracle dañado, primero debes dañarlo, valga la redundancia. Para esto sigue estos pasos de prueba:

Obs.1 : Tenga en cuenta que se debe contar con un respaldo rman, de la máquina.

#Abrimos nuestra base de datos
newton:~/Conexiones Remotas # su - oracle oracle@newton:~> sqlplus "/as sysdba" SQL*Plus: Release 10.2.0.1.0 - Production on Wed Jan 9 09:28:44 2008 Copyright (c) 1982, 2005, Oracle. All rights reserved. Connected to an idle instance. SQL> startup ORACLE instance started. Total System Global Area 406847488 bytes Fixed Size 1219688 bytes Variable Size 125830040 bytes Database Buffers 276824064 bytes Redo Buffers 2973696 bytes Database mounted. Database opened. SQL> exit Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options oracle@newton:~>

Vamos a seleccionar algún bloque para dañar:
oracle@newton:~> sqlplus "/as sysdba"

SQL*Plus: Release 10.2.0.1.0 - Production on Wed Jan 9 11:11:39 2008

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


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> select tablespace_name, header_file, header_block
2 from dba_segments where
3 segment_name='EMP' and owner='SCOTT';

TABLESPACE_NAME HEADER_FILE HEADER_BLOCK
------------------------------ ----------- ------------
USERS 4 27

SQL> select file#, name from v$datafile where name like '%users%';

FILE#
----------
NAME
--------------------------------------------------------------------------------
4
/u02/oradata/newton/users01.dbf

Ahora bien a través del comando unix dd vamos a alterar algún bloque del datafile users01.dbf. Modificaremos el bloque a continaución del header_block o sea el bloque número 28. Con este comando dd también debemos utilizar el tamaño del bloque Oracle, en este caso estoy utilizando uno de 8 Kb.

oracle@newton:~> dd if=/dev/zero of=/u02/oradata/newton/users01.dbf bs=8192 conv=notrunc seek=28 count=1
1+0 records in
1+0 records out
8192 bytes (8.2 kB) copied, 0.0432926 s, 189 kB/s

En Este comando con la opción notrunc le decimos que no haga un truncado del archivo. Lo que hace el comando entero en realidad es leer desde /dev/zero y escribir 8 Kilobytes en el bloque 28, sólo en ese bloque ya que especificamos un count=1.

Ahora volvamos a realizar unas consultas y vean lo que sucede (limpiamos el buffer pool, para que oracle no recurra a eĺ frente a las consultas)

oracle@newton:~> sqlplus "/as sysdba"

SQL*Plus: Release 10.2.0.1.0 - Production on Wed Jan 9 11:29:37 2008

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


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> alter system flush buffer_cache;

System altered.

SQL> alter user scott account unlock;

User altered.

SQL> select * from emp;
select * from emp
*
ERROR at line 1:
ORA-08103: object no longer exists

-- Oracle no ha sido capaz de identificar la tabla. Ahora observen que de todas maneras si consulto por el count de filas Oracle si me entrega un resultado. Obviamente estamos frente a un problema de corrupción.

SQL> select count(*) from emp;

COUNT(*)
----------
14


Ahora bien desde sistema operativo comprobaremos a través del utilitario de Oracle dbv que el datafile tiene un bloque corrupto:

oracle@newton:~> dbv file=/u02/oradata/newton/users01.dbf blocksize=8192

DBVERIFY: Release 10.2.0.1.0 - Production on Wed Jan 9 11:38:47 2008

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

DBVERIFY - Verification starting : FILE = /u02/oradata/newton/users01.dbf
Page 28 is marked corrupt
Corrupt block relative dba: 0x0100001c (file 4, block 28)
Completely zero block found during dbv:



DBVERIFY - Verification complete

Total Pages Examined : 640
Total Pages Processed (Data) : 42
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 63
Total Pages Failing (Index): 0
Total Pages Processed (Other): 133
Total Pages Processed (Seg) : 0
Total Pages Failing (Seg) : 0
Total Pages Empty : 401
Total Pages Marked Corrupt : 1
Total Pages Influx : 0
Highest block SCN : 469302 (0.469302)

Bueno Ahora que ya sabemos que estamos frente a una corupción de bloque podemos recuperar esto con RMAN de la siguiente manera, utilizando el número de bloque y de datafile (Con la base de datos arriba):

oracle@newton:/u03> rman target /

Recovery Manager: Release 10.2.0.1.0 - Production on Thu Jan 10 17:56:20 2008

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

connected to target database: NEWTON (DBID=2708614694)

RMAN> blockrecover datafile 4 block 28;

Starting blockrecover at 10-JAN-08
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=137 devtype=DISK

channel ORA_DISK_1: restoring block(s)
channel ORA_DISK_1: specifying block(s) to restore from backup set
restoring blocks of datafile 00004
channel ORA_DISK_1: reading from backup piece /u03/db_bck_full_01j5ntk4_1_1
channel ORA_DISK_1: restored block(s) from backup piece 1
piece handle=/u03/db_bck_full_01j5ntk4_1_1 tag=BCK_DB_FULL
channel ORA_DISK_1: block restore complete, elapsed time: 00:00:01

starting media recovery
media recovery complete, elapsed time: 00:00:03

Finished blockrecover at 10-JAN-08

RMAN> exit

Ahora podemos hacer la siguiente prueba.

oracle@newton:/u03> sqlplus "scott/tiger"

SQL*Plus: Release 10.2.0.1.0 - Production on Thu Jan 10 18:04:23 2008

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


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> set pagesize 3000
SQL> set linesize 132
SQL> select * from emp;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10

14 rows selected.

SQL>


Corrupción de bloque solucionado.
Origen de la información:

FDB