Categories: Oracle 11g, Oracle11gR2

Oracle11g : Paso a paso como utilizar el comando DUPLICATE ACTIVE DATABASE de RMAN



Esta es la situación :

JEFE : Debes generar una copia de la base de datos productiva que esta en Oracle11g desde la máquina A a la máquina B
DBA : Ok, sencillo , cuando comenzamos
JEFE : Ahora, la base de datos sólo pesa 4TB
DBA : Mmmm , que grande... bueno, donde dejamos el respaldo, en la máquina A o en la B?
JEFE : En ninguna
DBA : 0.o!!! de que me habla?
JEFE : En ninguna máquina, pues no hay espacio
DBA : ¿Nada de espacio?
JEFE : Nada.... sólo 1GB
DBA : Mmm , bueno, hacemos begin backup de los datafiles y los trasladamos de a poco
JEFE : Los datafiles, pesan mínimo 20GB
DBA : ¿Dónde firmo mi carta de renuncia?

Para que no suceda lo anterior, simplemente utilizamos un comando genial de Oracle11g, llamado el DUPLICATE ACTIVE DATABASE, que permite realizar la copia de una base de datos y generarla en la máquina que deseemos, sin necesidad de pasar por un respaldo.

Esto lo hace extremadamente poderoso y rápido.

A continuación los pasos.




1.- Se debe generar un listener, el cual contenga las entradas de la instancia nueva y claro, el origen de donde sacaremos los datos.

LISTER11G =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle11g.inmotion.cl)(PORT = 1521))
)

SID_LIST_LISTER11G =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = /u01/app/oracle/product/11.1.0/db_1)
(SID_NAME = orcl)
)
(SID_DESC =
(GLOBAL_DBNAME = copia)
(ORACLE_HOME = /u01/app/oracle/product/11.1.0/db_1)
(SID_NAME = copia)
)
)

2.- Al momento de levantar el listener, debe estar proporcionando disponibilidad a ambos servicios

[oracle@oracle11g admin]$ lsnrctl start LISTER11G

LSNRCTL for Linux: Version 11.1.0.6.0 - Production on 21-AUG-2009 12:00:03

Copyright (c) 1991, 2007, Oracle. All rights reserved.

Starting /u01/app/oracle/product/11.1.0/db_1/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 11.1.0.6.0 - Production
System parameter file is /u01/app/oracle/product/11.1.0/db_1/network/admin/listener.ora
Log messages written to /u01/app/oracle/diag/tnslsnr/oracle11g/lister11g/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle11g.inmotion.cl)(PORT=1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracle11g.inmotion.cl)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTER11G
Version TNSLSNR for Linux: Version 11.1.0.6.0 - Production
Start Date 21-AUG-2009 12:00:03
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/11.1.0/db_1/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/oracle11g/lister11g/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle11g.inmotion.cl)(PORT=1521)))
Services Summary...
Service "copia" has 1 instance(s).
Instance "copia", status UNKNOWN, has 1 handler(s) for this service...
Service "orcl" has 1 instance(s).
Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
[oracle@oracle11g admin]$

3.- Se debe añadir la siguiente entrada al archivo tnsnames.ora

copia =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle11g.inmotion.cl)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = copia)

)
)

4.- Necesitamos generar un archivo de inicialización pfile, el cual contenga sólo un parámetro, el db_name, el resto de los parámetros serán seteados con el DUPLICATE ACTIVE DATABASE

[oracle@oracle11g dbs]$ ls -ltr initcopia.ora
-rw-r--r-- 1 oracle oinstall 14 Aug 21 12:02 initcopia.ora
[oracle@oracle11g dbs]$ more initcopia.ora
db_name=copia

5. -Se debe generar un archivo de password, dado que el DUPLICATE ACTIVE DATABASE se conecta mediante SYSDBA a la instancia remota. Como observación , la password debe ser exactamente la misma , entre la instancia de origen y la de destino.

[oracle@oracle11g dbs]$ orapwd file=orapwcopia password=oracle entries=5
[oracle@oracle11g dbs]$ ls -ltr *copia*
-rw-r--r-- 1 oracle oinstall 14 Aug 21 12:02 initcopia.ora
-rw-r----- 1 oracle oinstall 2048 Aug 21 12:06 orapwcopia
[oracle@oracle11g dbs]$

6.- Se debe iniciar la instancia auxiliar en estado NOMOUNT , en esta instancia es donde quedarán los datos de la primaria

[oracle@oracle11g dbs]$ export ORACLE_SID=copia
[oracle@oracle11g dbs]$ sqlplus /nolog

SQL*Plus: Release 11.1.0.6.0 - Production on Fri Aug 21 12:07:52 2009

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

SQL> conn / as sysdba
Connected to an idle instance.
SQL> startup nomount
ORACLE instance started.

Total System Global Area 146472960 bytes
Fixed Size 1298472 bytes
Variable Size 92278744 bytes
Database Buffers 50331648 bytes
Redo Buffers 2564096 bytes
SQL>

7.- Nos conectamos a RMAN , con la instancia primaria , la base de datos debe estar abierta

[oracle@oracle11g dbs]$ rman target sys/oracle@orcl

Recovery Manager: Release 11.1.0.6.0 - Production on Fri Aug 21 12:09:22 2009

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

connected to target database: ORCL (DBID=1218194307)

RMAN>

8.- Nos conectamos a través de RMAN a la instancia auxiliar

RMAN> connect auxiliary sys/oracle@copia

connected to auxiliary database: COPIA (not mounted)

RMAN>

Se debe recordar que esta entrada (@copia) fue creada en el punto 3

9.- Se deben generar todos los directorios nuevos que vamos a utilizar en nuestra nueva instancia

10.- Ahora podemos ejecutar nuestro comando DUPLICATE DATABASE mediante RMAN , de la siguiente forma

run {
set newname for datafile '/u01/app/oracle/oradata/orcl/users01.dbf' to '/u01/app/oracle/oradata/copia1/users01.dbf';
set newname for datafile '/u01/app/oracle/oradata/orcl/undotbs01.dbf' to '/u01/app/oracle/oradata/copia2/undotbs01.dbf';
set newname for datafile '/u01/app/oracle/oradata/orcl/sysaux01.dbf' to '/u01/app/oracle/oradata/copia3/sysaux01.dbf';
set newname for datafile '/u01/app/oracle/oradata/orcl/system01.dbf' to '/u01/app/oracle/oradata/copia4/system01.dbf';

duplicate target database to copia
from active database
db_file_name_convert '/u01/app/oracle/oradata/orcl' , '/u01/app/oracle/oradata/copia'
spfile parameter_value_convert = '/u01/app/oracle/admin/orcl' , '/u01/app/oracle/admin/copia'
set log_file_name_convert = '/u01/app/oracle/oradata/orcl','/u01/app/oracle/oradata/copia'
set audit_file_dest='/u01/app/oracle/admin/copia/adump'
set log_archive_dest_1=''
set memory_target='183001600'
set dispatchers='(PROTOCOL=TCP) (SERVICE=copiaXDB)'
set control_files='/u01/app/oracle/oradata/copia1/control01.ctl','/u01/app/oracle/oradata/copia2/control02.ctl','/u01/app/oracle/oradata/copia3/control03.ctl'
set db_recovery_file_dest_size = '2294967296';
}

11.- Mediante el anterior script, se comienza a generar la copia de la base de datos.

executing command: SET NEWNAME
using target database control file instead of recovery catalog

executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME

Starting Duplicate Db at 22-AUG-09
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=97 device type=DISK

contents of Memory Script:
{
backup as copy reuse
file '/u01/app/oracle/product/11.1.0/db_1/dbs/spfileorcl.ora' auxiliary format '/u01/app/oracle/product/11.1.0/db_1/dbs/spfilecopia.ora' ;
sql clone "alter system set spfile= ''/u01/app/oracle/product/11.1.0/db_1/dbs/spfilecopia.ora''";
}
executing Memory Script

Starting backup at 22-AUG-09
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=154 device type=DISK
Finished backup at 22-AUG-09

sql statement: alter system set spfile= ''/u01/app/oracle/product/11.1.0/db_1/dbs/spfilecopia.ora''

contents of Memory Script:
{
sql clone "alter system set db_name = ''COPIA'' comment= ''duplicate'' scope=spfile";
sql clone "alter system set log_file_name_convert = ''/u01/app/oracle/oradata/orcl'', ''/u01/app/oracle/oradata/copia'' comment= '''' scope=spfile";
sql clone "alter system set audit_file_dest = ''/u01/app/oracle/admin/copia/adump'' comment= '''' scope=spfile";
sql clone "alter system set log_archive_dest_1 = '''' comment= '''' scope=spfile";
sql clone "alter system set memory_target = 183001600 comment= '''' scope=spfile";
sql clone "alter system set dispatchers = ''(PROTOCOL=TCP) (SERVICE=copiaXDB)'' comment= '''' scope=spfile";
sql clone "alter system set control_files = ''/u01/app/oracle/oradata/copia1/control01.ctl'', ''/u01/app/oracle/oradata/copia2/control02.ctl'', ''/u01/app/oracle/oradata/copia3/control03.ctl'' comment= '''' scope=spfile";
sql clone "alter system set db_recovery_file_dest_size = 2294967296 comment= '''' scope=spfile";
shutdown clone immediate;
startup clone nomount ;
}
executing Memory Script

sql statement: alter system set db_name = ''COPIA'' comment= ''duplicate'' scope=spfile
sql statement: alter system set log_file_name_convert = ''/u01/app/oracle/oradata/orcl'', ''/u01/app/oracle/oradata/copia'' comment= '''' scope=spfile
sql statement: alter system set audit_file_dest = ''/u01/app/oracle/admin/copia/adump'' comment= '''' scope=spfile
sql statement: alter system set log_archive_dest_1 = '''' comment= '''' scope=spfile
sql statement: alter system set memory_target = 183001600 comment= '''' scope=spfile
sql statement: alter system set dispatchers = ''(PROTOCOL=TCP) (SERVICE=copiaXDB)'' comment= '''' scope=spfile
sql statement: alter system set control_files = ''/u01/app/oracle/oradata/copia1/control01.ctl'', ''/u01/app/oracle/oradata/copia2/control02.ctl'', ''/u01/app/oracle/oradata/copia3/control03.ctl'' comment= '''' scope=spfile
sql statement: alter system set db_recovery_file_dest_size = 2294967296 comment= '''' scope=spfile

Oracle instance shut down

connected to auxiliary database (not started)
Oracle instance started

Total System Global Area 184127488 bytes

Fixed Size 1298752 bytes
Variable Size 142610112 bytes
Database Buffers 37748736 bytes
Redo Buffers 2469888 bytes

contents of Memory Script:
{
set newname for datafile 1 to "/u01/app/oracle/oradata/copia4/system01.dbf";
set newname for datafile 2 to "/u01/app/oracle/oradata/copia3/sysaux01.dbf";
set newname for datafile 3 to "/u01/app/oracle/oradata/copia2/undotbs01.dbf";
set newname for datafile 4 to "/u01/app/oracle/oradata/copia1/users01.dbf";
backup as copy reuse
datafile 1 auxiliary format
"/u01/app/oracle/oradata/copia4/system01.dbf" datafile auxiliary format
"/u01/app/oracle/oradata/copia3/sysaux01.dbf" datafile auxiliary format
"/u01/app/oracle/oradata/copia2/undotbs01.dbf" datafile auxiliary format
"/u01/app/oracle/oradata/copia1/users01.dbf" ;
sql 'alter system archive log current';
}
executing Memory Script
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME

Starting backup at 22-AUG-09
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
input datafile file number=00001 name=/u01/app/oracle/oradata/orcl/system01.dbf
output file name=/u01/app/oracle/oradata/copia4/system01.dbf tag=TAG20090822T205622 RECID=0 STAMP=0
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:01:07
channel ORA_DISK_1: starting datafile copy
input datafile file number=00002 name=/u01/app/oracle/oradata/orcl/sysaux01.dbf
output file name=/u01/app/oracle/oradata/copia3/sysaux01.dbf tag=TAG20090822T205622 RECID=0 STAMP=0
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:56
channel ORA_DISK_1: starting datafile copy
input datafile file number=00004 name=/u01/app/oracle/oradata/orcl/users01.dbf
output file name=/u01/app/oracle/oradata/copia1/users01.dbf tag=TAG20090822T205622 RECID=0 STAMP=0
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:25
channel ORA_DISK_1: starting datafile copy
input datafile file number=00003 name=/u01/app/oracle/oradata/orcl/undotbs01.dbf
output file name=/u01/app/oracle/oradata/copia2/undotbs01.dbf tag=TAG20090822T205622 RECID=0 STAMP=0
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:07
Finished backup at 22-AUG-09

sql statement: alter system archive log current
sql statement: CREATE CONTROLFILE REUSE SET DATABASE "COPIA" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 ( '/u01/app/oracle/oradata/copia/redo01.log' ) SIZE 50 M REUSE,
GROUP 2 ( '/u01/app/oracle/oradata/copia/redo02.log' ) SIZE 50 M REUSE,
GROUP 3 ( '/u01/app/oracle/oradata/copia/redo03.log' ) SIZE 50 M REUSE
DATAFILE
'/u01/app/oracle/oradata/copia4/system01.dbf'
CHARACTER SET WE8MSWIN1252

contents of Memory Script:
{
backup as copy reuse
archivelog like "/u01/app/oracle/product/11.1.0/db_1/dbs/arch1_25_690413581.dbf" auxiliary format
"/u01/app/oracle/flash_recovery_area/COPIA/archivelog/2009_08_22/o1_mf_1_25_%u_.arc" archivelog like
"/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2009_08_22/o1_mf_1_25_59154osg_.arc" auxiliary format
"/u01/app/oracle/flash_recovery_area/COPIA/archivelog/2009_08_22/o1_mf_1_25_%u_.arc" ;
catalog clone recovery area;
switch clone datafile all;
}
executing Memory Script

Starting backup at 22-AUG-09
using channel ORA_DISK_1
channel ORA_DISK_1: starting archived log copy
input archived log thread=1 sequence=25 RECID=19 STAMP=695595606
output file name=/u01/app/oracle/flash_recovery_area/COPIA/archivelog/2009_08_22/o1_mf_1_25_0lknbsj5_.arc RECID=0 STAMP=0
channel ORA_DISK_1: archived log copy complete, elapsed time: 00:00:01
channel ORA_DISK_1: starting archived log copy
input archived log thread=1 sequence=25 RECID=20 STAMP=695595606
output file name=/u01/app/oracle/flash_recovery_area/COPIA/archivelog/2009_08_22/o1_mf_1_25_0mknbsjs_.arc RECID=0 STAMP=0
channel ORA_DISK_1: archived log copy complete, elapsed time: 00:00:02
Finished backup at 22-AUG-09

searching for all files in the recovery area

List of Files Unknown to the Database
=====================================
File Name: /u01/app/oracle/flash_recovery_area/COPIA/archivelog/2009_08_22/o1_mf_1_25_0lknbsj5_.arc
File Name: /u01/app/oracle/flash_recovery_area/COPIA/archivelog/2009_08_22/o1_mf_1_25_0mknbsjs_.arc
File Name: /u01/app/oracle/flash_recovery_area/COPIA/archivelog/2009_08_22/o1_mf_1_23_0fkn9m61_.arc
File Name: /u01/app/oracle/flash_recovery_area/COPIA/archivelog/2009_08_22/o1_mf_1_23_0gkn9m6i_.arc
cataloging files...
cataloging done

List of Cataloged Files
=======================
File Name: /u01/app/oracle/flash_recovery_area/COPIA/archivelog/2009_08_22/o1_mf_1_25_0lknbsj5_.arc
File Name: /u01/app/oracle/flash_recovery_area/COPIA/archivelog/2009_08_22/o1_mf_1_25_0mknbsjs_.arc
File Name: /u01/app/oracle/flash_recovery_area/COPIA/archivelog/2009_08_22/o1_mf_1_23_0fkn9m61_.arc
File Name: /u01/app/oracle/flash_recovery_area/COPIA/archivelog/2009_08_22/o1_mf_1_23_0gkn9m6i_.arc

datafile 4 switched to datafile copy
input datafile copy RECID=1 STAMP=695595667 file name=/u01/app/oracle/oradata/copia1/users01.dbf
datafile 3 switched to datafile copy
input datafile copy RECID=2 STAMP=695595668 file name=/u01/app/oracle/oradata/copia2/undotbs01.dbf
datafile 2 switched to datafile copy
input datafile copy RECID=3 STAMP=695595668 file name=/u01/app/oracle/oradata/copia3/sysaux01.dbf

contents of Memory Script:
{
set until scn 1066933;
recover clone database delete archivelog ;
}
executing Memory Script

executing command: SET until clause

Starting recover at 22-AUG-09
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=153 device type=DISK

starting media recovery

archived log for thread 1 with sequence 25 is already on disk as file /u01/app/oracle/flash_recovery_area/COPIA/archivelog/2009_08_22/o1_mf_1_25_0mknbsjs_.arc
archived log file name=/u01/app/oracle/flash_recovery_area/COPIA/archivelog/2009_08_22/o1_mf_1_25_0mknbsjs_.arc thread=1 sequence=25
media recovery complete, elapsed time: 00:00:02
Finished recover at 22-AUG-09

contents of Memory Script:
{
shutdown clone immediate;
startup clone nomount ;
}
executing Memory Script

database dismounted
Oracle instance shut down

connected to auxiliary database (not started)
Oracle instance started

Total System Global Area 184127488 bytes

Fixed Size 1298752 bytes
Variable Size 146804416 bytes
Database Buffers 33554432 bytes
Redo Buffers 2469888 bytes
sql statement: CREATE CONTROLFILE REUSE SET DATABASE "COPIA" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 ( '/u01/app/oracle/oradata/copia/redo01.log' ) SIZE 50 M REUSE,
GROUP 2 ( '/u01/app/oracle/oradata/copia/redo02.log' ) SIZE 50 M REUSE,
GROUP 3 ( '/u01/app/oracle/oradata/copia/redo03.log' ) SIZE 50 M REUSE
DATAFILE
'/u01/app/oracle/oradata/copia4/system01.dbf'
CHARACTER SET WE8MSWIN1252

contents of Memory Script:
{
set newname for tempfile 1 to "/u01/app/oracle/oradata/copia/temp01.dbf";
switch clone tempfile all;
catalog clone datafilecopy "/u01/app/oracle/oradata/copia3/sysaux01.dbf";
catalog clone datafilecopy "/u01/app/oracle/oradata/copia2/undotbs01.dbf";
catalog clone datafilecopy "/u01/app/oracle/oradata/copia1/users01.dbf";
switch clone datafile all;
}
executing Memory Script

executing command: SET NEWNAME

renamed tempfile 1 to /u01/app/oracle/oradata/copia/temp01.dbf in control file

cataloged datafile copy
datafile copy file name=/u01/app/oracle/oradata/copia3/sysaux01.dbf RECID=1 STAMP=695595722

cataloged datafile copy
datafile copy file name=/u01/app/oracle/oradata/copia2/undotbs01.dbf RECID=2 STAMP=695595723

cataloged datafile copy
datafile copy file name=/u01/app/oracle/oradata/copia1/users01.dbf RECID=3 STAMP=695595724

datafile 4 switched to datafile copy
input datafile copy RECID=3 STAMP=695595724 file name=/u01/app/oracle/oradata/copia1/users01.dbf
datafile 3 switched to datafile copy
input datafile copy RECID=2 STAMP=695595723 file name=/u01/app/oracle/oradata/copia2/undotbs01.dbf
datafile 2 switched to datafile copy
input datafile copy RECID=1 STAMP=695595722 file name=/u01/app/oracle/oradata/copia3/sysaux01.dbf

contents of Memory Script:
{
Alter clone database open resetlogs;
}
executing Memory Script

database opened
Finished Duplicate Db at 22-AUG-09

RMAN>

Documentación sobre DUPLICATE ACTIVE DATABASE

by Ligarius
24.08.09. 11:31:00. 2640 words, 26775 views. Categories: Oracle 11g ,

Export Datapump : No tan maravilloso pero.... comprime :)



Hace un tiempo hice un comentario, en parte infundado , en parte con fundamento sobre el export datapump.



Pueden revisar la nota acá

Era el problema de no poder contar con PIPE , tuberías o como le quieran llamar, al momento de exportar, lo que hacía que todos esos queridos códigos de export que comprimían on-line los respaldos, ya no funcionan con la versión Export Datapump.

Pues realizando un pequeño ejemplo, me encontre con la siguiente tabulación de ejemplos de export y export datapump, incluso con tuberías de por medio.
Comando % Compresion Tamaño MB
exp sin compress 0 574
exp con compress 0 574
exp sin compress y PIPE 87.5 77.5
expdp sin compress 11 512
expdp con compress 83.5 95

Los comandos

exp sin compress
exp system/oracle file=FULLDB11g full=y buffer=1000000

exp con compress
exp system/oracle file=FULLDB11g full=y buffer=1000000 compress=y

Nota : El COMPRESS del export , no está relacionado a la compresión de bloques Oracle, sino, más bien, a la cantidad de extensiones que conformarán un segmento :) , pero como sonaba a compresión lo añadí :P

exp sin compress y con PIPE
mknod pipes p
gzip < pipes> FULDB11gPipes.dmp.gz &
exp system/oracle file=pipes full=y buffer=1000000

expdp sin compress
expdp system/oracle DIRECTORY=data_pump_dir FULL=y DUMPFILE=FULLDB11gexpdp.dmp

expdp con compress
expdp system/oracle DIRECTORY=data_pump_dir FULL=y DUMPFILE=FULLDB11gexpdp.dmp COMPRESSION=ALL

Como pueden ver el ya famoso PIPE con export tiene un grado de compresión altísimo cercano al 87,5% , o sea , de cada 100MB de tamaño, deja un archivo en 12,5MB aproximadamente :)

Pero el Export Datapump , no es tan malo después de todo , pues logra un óptimo 83,5% de compresión , o sea, de cada 100MB de tamaño generaría un archivo de 16,5MB

Todo esto es en base a una base de datos de pruebas, todo varía de acuerdo a la porosidad de la base de datos (fragmentación)

Espero les sirva y claro.. me forme una mala impresión sobre el nuevo y populoso Export DataPump

PD : Gracias Luis Farías y Waldo Rojas ;)

PPD : La compresión está disponible desde 10g, pero para esta versión sólo es medatada, para la compresión total se debe usar Oracle 11g, gracias a mi amigo Juan Díaz (jada) por el comentario


by Ligarius
15.07.09. 19:30:39. 400 words, 25628 views. Categories: Base de datos, Oracle 11g, Oracle 10g, Tuning / Performance ,

BBDD : Como tracear una sesión que se conecta/procesa/desconecta en 2 segundos



0.-Situación
La situación es que hay una sesión que está hecha en un programa (C) , este programa hace una conexión a la base de datos y ejecuta ciertas rutinas en Pro*C , y se desconecta, el inconveniente es que se demora entre que se conecta, procesa y desconecta , entre 3 a 5 segundos.
Por ende hacerle un trace es bastante complicado, ya que no se alcanza a conocer el SID ,SPID o #SERIAL para incluirlo en el package
DBMS_SYSTEM.SET_SQL_TRACE_IN_SESION(SID,#SERIAL,TRUE)

Tampoco podríamos utilizar el package DBMS_SUPPORT.START_TRACE_IN_SESSION() ya que también debiesemos conocer el SID y #SERIAL

Por ende se debe desarrollar algo alternativo para poder rescatar el proceso de esa sesión



1.-Solución
Crear un trigger on-logon para detectar cuando hace la conexión ese usuario a través de ese programa (Pro*C)

2.-Código
CREATE OR REPLACE TRIGGER
tracea_audit_trigger
AFTER LOGON ON DATABASE
DECLARE
var_session VARCHAR2(100);
var_module VARCHAR2(100);
BEGIN
SELECT sys_context('USERENV','SESSIONID')
INTO var_session
FROM dual
;


BEGIN
SELECT module
INTO var_module
FROM v$session
WHERE audsid = var_session;
EXCEPTION
WHEN OTHERS THEN
var_module := 'NO';
END;


IF UPPER(var_module) LIKE '%PROGRAMA%' THEN
EXECUTE IMMEDIATE 'ALTER SESSION SET SQL_TRACE=TRUE';
END IF;
END;
/


Hay que tener cuidado de dar los privilegios de select sobre la vista v$session, ya que un usuario que no posea los permisos de lectura no podrá realizar la conexión, por eso se recomienda que este código sea probado en ambientes de test, previo paso a producción

3.-Permisos necesarios

Grant select on v_$session to public;

¿Porque un privilegio a Public? Pues desde el momento en que se cree el trigger cualquier usuario que se conecte a la base de datos pasara por el trigger on-logon y si no tiene acceso a la vista v$session pues simplemente no se conectará y saldrá un error de privilegios.

Grant alter system to nombre_usuario;
Grant alter session to nombre_usuario;


Los permisos para alterar la sesión y el system debiesen ser revocados una vez finalizado el proceso de captura de estadísticas

Revoke alter system from ;
Revoke alter session from ;


4.-Si no esta activada la recolección de estadísticas
Si el parámetro TIMED_STATISTICS en la base de datos posee el valor FALSE, la traza no contendrá datos relevantes por ejemplo CPU, disk , etc.

Para ello se puede alterar el trigger y modificarlo de la siguiente forma

Código anterior
IF UPPER(var_module) LIKE '%PROGRAMA%' THEN
EXECUTE IMMEDIATE 'ALTER SESSION SET SQL_TRACE=TRUE';
END IF;


Código nuevo
IF UPPER(var_module) LIKE '%PROGRAMA%' THEN
EXECUTE IMMEDIATE 'ALTER SESSION SET SQL_TRACE=TRUE';
EXECUTE IMMEDIATE 'ALTER SYSTEM SET TIMED_STATISTICS=TRUE';
END IF;


5.-Si el archivo de trace generado es demasiado grande
Si el archivo de trace generado es demasiado grande, se puede disminuir su tamaño modificando el trigger

Código anterior
IF UPPER(var_module) LIKE '%PROGRAMA%' THEN
EXECUTE IMMEDIATE 'ALTER SESSION SET SQL_TRACE=TRUE';
END IF;


Código nuevo
IF UPPER(var_module) LIKE '%PROGRAMA%' THEN
EXECUTE IMMEDIATE 'ALTER SESSION SET SQL_TRACE=TRUE';
EXECUTE IMMEDIATE 'ALTER SYSTEM SET max_dump_file_size=5120';
END IF;


El tamaño asignado al parámetro max_dump_file_size está dado por Kb y el valor por defecto es UNLIMITED


6.- ¿Qué pasa si hay muchos usuarios, en la misma máquina, ejecutando el mismo Pro*C?
Pues una solución es realizar una copia de programa , por ejemplo si el programa se llama EjecutaProc, llamarlo de una forma que sea identificable , ejemplo , prueba_ejecucion y otorgar los permisos necesario para su ejecución

Con lo anterior , este programa va a ser inequivocamente ubicado en la vista v$session , bajo el campo module, y solamente a esta sesión le realizaremos un traceo

7.- Archivo de resultados
El archivo de resultados debe estar ubicado en la ruta que está predefinida en el parámetro de inicialización user_dump_dest

select value from v$parameter where name like 'user_dump_dest' , por defecto tiene el valor $ORACLE_HOME/rdbms/trace

El archivo de resultados del traceo , no es algo que sirva mucho a primera vista, a no ser que tengamos una memoria y ojos extraordinarios para hacer un formateo visual

Ejemplo del archivo :
PARSING IN CURSOR #6 len=67 dep=1 uid=0 oct=3 lid=0 tim=19191305310633 hv=2889900621 ad='f6f19668'
select pos#,intcol#,col#,spare1,bo#,spare2 from icol$ where obj#=:1
END OF STMT
PARSE #6:c=10000,e=9470,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=0,tim=19191305310617
EXEC #6:c=0,e=918,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,tim=19191305311971
FETCH #6:c=0,e=408,p=1,cr=3,cu=0,mis=0,r=1,dep=1,og=4,tim=19191305312494
FETCH #6:c=0,e=24,p=0,cr=1,cu=0,mis=0,r=0,dep=1,og=4,tim=19191305312632
FETCH #5:c=0,e=94,p=0,cr=0,cu=0,mis=0,r=1,dep=1,og=4,tim=19191305312816
EXEC #6:c=0,e=50,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,tim=19191305313060
FETCH #6:c=0,e=42,p=0,cr=3,cu=0,mis=0,r=1,dep=1,og=4,tim=19191305313186
FETCH #6:c=0,e=16,p=0,cr=1,cu=0,mis=0,r=0,dep=1,og=4,tim=19191305313283
FETCH #5:c=0,e=43,p=0,cr=0,cu=0,mis=0,r=1,dep=1,og=4,tim=19191305313402
EXEC #6:c=0,e=37,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,tim=19191305313660
FETCH #6:c=0,e=46,p=0,cr=3,cu=0,mis=0,r=1,dep=1,og=4,tim=19191305313788
FETCH #6:c=0,e=16,p=0,cr=1,cu=0,mis=0,r=0,dep=1,og=4,tim=19191305313888
FETCH #5:c=0,e=40,p=0,cr=0,cu=0,mis=0,r=1,dep=1,og=4,tim=19191305314015
EXEC #6:c=0,e=36,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,tim=19191305314229
FETCH #6:c=0,e=39,p=0,cr=3,cu=0,mis=0,r=1,dep=1,og=4,tim=19191305314347
FETCH #6:c=0,e=16,p=0,cr=1,cu=0,mis=0,r=0,dep=1,og=4,tim=19191305314452


8.- Formateo de archivo, salida de trace
Como es algo complicado el análisis del archivo anterior, existe un utilitario llamado tkprof que realiza el formateo de este archivo, para utilizarlo se debe ejecutar lo siguiente

tkprof [explain=usuario/password] [sys=no] [insert=archivo]

Con el parámetro "explain=usuario/password" indicamos que nos muestre el plan de ejecución de todas las instrucciones, conectándose para ello al usuario/password indicados.

Con el parámetro "sys=no" indicamos que no nos muestre las instrucciones realizadas por el usuario SYS.

Con el parámetro "insert=archivo" , dejamos toda la información mostrada por tkprof en el archivo de salida,como sentencias insert en una tabla llamada tkprof_table, con lo cual podemos realizar consultas de forma más óptima

Después de haber formateado nuestro archivo en user_dump_dest , se visualizaría de la siguiente forma

select USER into :b0
from
DUAL


call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 1 0.00 0.00 0 3 0 1
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 3 0.00 0.00 0 3 0 1


Misses in library cache during parse: 1
Optimizer goal: CHOOSE
Parsing user id: 30

Rows Row Source Operation
------- ---------------------------------------------------
1 TABLE ACCESS FULL DUAL


by Ligarius
26.06.09. 18:15:21. 1151 words, 6705 views. Categories: Base de datos, Oracle 11g, Oracle 10g, Tuning / Performance ,

Export DataPump, no tan maravilloso como se dice :(

Al leer esta nota quede impactado... de verdad impactado 88|

Simplemente no se pueden utilizar PIPEs en DataPump :'(:'(

Se acuerdan cuando en versiones anteriores de Oracle10g ocupabamos el export e import pero con las llamadas tuberías (mknod,pipe,etc), las usabamos pues el archivo dmp que se generaba era tan grande que obviamente había que comprimirlo en "caliente" pues no había espacio donde dejarlo.

Era un código más o menos así



mknod /u01/backup/exp/export_pipe p

nohup /usr/bin/gzip < /u01 /backup/exp/export_pipe> /u01/backup/exp/dbaceh.dmp.gz 2> /u01/backup/logs/gzip.log &

$ORACLE_HOME/bin/exp user/senha@dbaceh file=/u01/backup/exp/export_pipe buffer=40000000 log=/u01/backup/logs/dbaceh.log full=y >$ARQLOG 2>$ARQLOG
comprimiamos un archivo de muchos Gigas en algo de verdad mas razonable

Todo esto hasta que nacio Oracle10g, ¿por qué?, pues Oracle nos decía "Usen el export DataPump es mejor y más seguro" , la verdad es que sí, es más seguro, ya que no dependemos del cliente que está ejecutando el export, ahora todo es en el Servidor, incluso como Job.

Pero cual fue la sorpresa al saber que Oracle Export Datapump, no funciona con "tuberías", así de fuerte.

Lo anterior implica que el archivo de 300GB queda en 300GB , o sea, seguiremos utilizando export e import como siempre :(

En todo caso en Oracle dicen que la modificación al Datapump, ya viene... sería para Oracle12g u Oracle20g?, quien sabe...

Notas relacionadas

to use EXPDP directly with GZIP ? Doc ID: 463336.1

Oracle10g Export/Import DataPump Does Not Work with Tapes or UNIX Named Pipes Doc ID: 276521.1

Espero les sirva.


by Ligarius
23.06.09. 18:28:04. 287 words, 8311 views. Categories: Base de datos, Oracle 11g, Tuning / Performance ,

Aplicar parches en caliente mediante OPatch (hot patching)

En pocas palabras, que tan bueno es la aplicación de HotPatch en Oracle11g :roll:

Hasta el momento no le veo inconvenientes, quizás con los Patchset sea otra cosa.

Pues bien, acá un pequeño ejemplo del OPatch con comandos tales como query , lsinventory , apply y rollback

Cada vez que Oracle nos indica un parche a aplicar, por ejemplo el 5943776, tenemos que bajar el archivo *.zip desde Metalink, descomprimirlo, con lo cual genera una carpeta con el número 5943776 , ingresamos a esa carpeta y podemos comenzar con nuestra aplicación de parche .

Aquí vamos..

1.- Se valida que sea un parche online , comando opatch query -is_online_patch

[oracle@localhost hotpatch]$ pwd
/home/oracle/solutions/OP/hotpatch
[oracle@localhost hotpatch]$ /u01/app/oracle/product/11.1.0/db_1/OPatch/opatch query -is_online_patch
Invoking OPatch 11.1.0.6.0

Oracle Interim Patch Installer version 11.1.0.6.0
Copyright (c) 2007, Oracle Corporation. All rights reserved.

Oracle Home : /u01/app/oracle/product/11.1.0/db_1
Central Inventory : /u01/app/oracle/oraInventory
from : /etc/oraInst.loc
OPatch version : 11.1.0.6.0
OUI version : 11.1.0.6.0
OUI location : /u01/app/oracle/product/11.1.0/db_1/oui
Log file location : /u01/app/oracle/product/11.1.0/db_1/cfgtoollogs/opatch/opatch2009-06-21_10-47-12AM.log

--------------------------------------------------------------------------------
Patch is a online patch: true

OPatch succeeded.
[oracle@localhost hotpatch]$

2.- Validamos los parches instalados, mediante el comando opatch lsinventory

[oracle@localhost hotpatch]$ /u01/app/oracle/product/11.1.0/db_1/OPatch/opatch lsinventory
Invoking OPatch 11.1.0.6.0

Oracle Interim Patch Installer version 11.1.0.6.0
Copyright (c) 2007, Oracle Corporation. All rights reserved.

Oracle Home : /u01/app/oracle/product/11.1.0/db_1
Central Inventory : /u01/app/oracle/oraInventory
from : /etc/oraInst.loc
OPatch version : 11.1.0.6.0
OUI version : 11.1.0.6.0
OUI location : /u01/app/oracle/product/11.1.0/db_1/oui
Log file location : /u01/app/oracle/product/11.1.0/db_1/cfgtoollogs/opatch/opatch2009-06-21_10-49-13AM.log

Lsinventory Output file location : /u01/app/oracle/product/11.1.0/db_1/cfgtoollogs/opatch/lsinv/lsinventory2009-06-21_10-49-13AM.txt

--------------------------------------------------------------------------------
Installed Top-level Products (1):

Oracle Database 11g 11.1.0.6.0
There are 1 products installed in this Oracle Home.

There are no Interim patches installed in this Oracle Home.
--------------------------------------------------------------------------------

OPatch succeeded.
[oracle@localhost hotpatch]$

3.- Aplicamos el parche en caliente, mediante el comando opatch apply

[oracle@localhost hotpatch]$ /u01/app/oracle/product/11.1.0/db_1/OPatch/opatch apply /home/oracle/solutions/OP/hotpatch -connectString orcl::::
Invoking OPatch 11.1.0.6.0

Oracle Interim Patch Installer version 11.1.0.6.0
Copyright (c) 2007, Oracle Corporation. All rights reserved.

Oracle Home : /u01/app/oracle/product/11.1.0/db_1
Central Inventory : /u01/app/oracle/oraInventory
from : /etc/oraInst.loc
OPatch version : 11.1.0.6.0
OUI version : 11.1.0.6.0
OUI location : /u01/app/oracle/product/11.1.0/db_1/oui
Log file location : /u01/app/oracle/product/11.1.0/db_1/cfgtoollogs/opatch/opatch2009-06-21_10-53-02AM.log

The patch should be applied/rolled back in '-all_nodes' mode only.
Converting the RAC mode to '-all_nodes' mode.
ApplySession applying interim patch '5943776' to OH '/u01/app/oracle/product/11.1.0/db_1'

Running prerequisite checks...

OPatch detected non-cluster Oracle Home from the inventory and will patch the local system only.

Backing up files and inventory (not for auto-rollback) for the Oracle Home
Backing up files affected by the patch '5943776' for restore. This might take a while...
Backing up files affected by the patch '5943776' for rollback. This might take a while...

Patching component oracle.rdbms, 11.1.0.6.0...
The patch will be installed on active database instances.
Running mkpatch on 'bug5943776_1.pch' to make it compatible with the Oracle binary...

Installing and enabling the online patch 'bug5943776_1.pch', on database 'orcl'.

ApplySession adding interim patch '5943776' to inventory

Verifying the update...
Inventory check OK: Patch ID 5943776 is registered in Oracle Home inventory with proper meta-data.
Files check OK: Files from Patch ID 5943776 are present in Oracle Home.

OPatch succeeded.

4.- Verificamos nuevamente los parches aplicados, mediante el comando lsinventory

[oracle@localhost hotpatch]$ /u01/app/oracle/product/11.1.0/db_1/OPatch/opatch lsinventory
Invoking OPatch 11.1.0.6.0

Oracle Interim Patch Installer version 11.1.0.6.0
Copyright (c) 2007, Oracle Corporation. All rights reserved.

Oracle Home : /u01/app/oracle/product/11.1.0/db_1
Central Inventory : /u01/app/oracle/oraInventory
from : /etc/oraInst.loc
OPatch version : 11.1.0.6.0
OUI version : 11.1.0.6.0
OUI location : /u01/app/oracle/product/11.1.0/db_1/oui
Log file location : /u01/app/oracle/product/11.1.0/db_1/cfgtoollogs/opatch/opatch2009-06-21_10-56-34AM.log

Lsinventory Output file location : /u01/app/oracle/product/11.1.0/db_1/cfgtoollogs/opatch/lsinv/lsinventory2009-06-21_10-56-34AM.txt

--------------------------------------------------------------------------------
Installed Top-level Products (1):

Oracle Database 11g 11.1.0.6.0
There are 1 products installed in this Oracle Home.

Interim patches (1) :

Patch 5943776 : applied on Sun Jun 21 10:53:52 CLT 2009
Created on 26 Jul 2007, 13:29:43 hrs EST5EDT
Bugs fixed:
5943776

--------------------------------------------------------------------------------

OPatch succeeded.

5.- Si se requiere remover , ocupamos el comando opatch rollback

[oracle@localhost hotpatch]$ /u01/app/oracle/product/11.1.0/db_1/OPatch/opatch rollback -id 5943776 -connectString orcl
Invoking OPatch 11.1.0.6.0

Oracle Interim Patch Installer version 11.1.0.6.0
Copyright (c) 2007, Oracle Corporation. All rights reserved.

Oracle Home : /u01/app/oracle/product/11.1.0/db_1
Central Inventory : /u01/app/oracle/oraInventory
from : /etc/oraInst.loc
OPatch version : 11.1.0.6.0
OUI version : 11.1.0.6.0
OUI location : /u01/app/oracle/product/11.1.0/db_1/oui
Log file location : /u01/app/oracle/product/11.1.0/db_1/cfgtoollogs/opatch/opatch2009-06-21_11-15-57AM.log

RollbackSession rolling back interim patch '5943776' from OH '/u01/app/oracle/product/11.1.0/db_1'

The patch should be applied/rolled back in '-all_nodes' mode only.
Converting the RAC mode to '-all_nodes' mode.

Running prerequisite checks...

OPatch detected non-cluster Oracle Home from the inventory and will patch the local system only.

Backing up files affected by the patch '5943776' for restore. This might take a while...

Patching component oracle.rdbms, 11.1.0.6.0...
The patch will be removed from active database instances.
Disabling and removing online patch 'bug5943776_1.pch', on database 'orcl'

RollbackSession removing interim patch '5943776' from inventory

OPatch succeeded.

Mas información sobre OPatch en Oracle11g

Información de OPatch

by Ligarius
23.06.09. 11:43:21. 931 words, 30256 views. Categories: Base de datos, Oracle 11g ,

<< 1 2 3 4 5 6 7 8 9 10 >>