miércoles, 15 de febrero de 2012

RAC y como Crear Manualmente Una Base de Datos Oracle 11gR2

Una de mis entradas mas populares al dia de hoy, ha sido la de como crear una base de datos en 11g. Ahora lo que vamos a hacer es como crear una base de datos manualmente en un ambiente RAC en 11g

Verificar Variable de Ambiente

Aqui tenemos que decidir el nombre que va a tener nuestra instancia y base de datos,  aqui un ejemplo utilizando Korn shell, si utilizas C Shell, usa el comando setenv

  • variable ORACLE_SID
    export ORACLE_SID=TESTDB1
  • variable DB_NAME
    export DB_NAME=TESTDB
  • variable ORACLE_BASE
    export ORACLE_BASE='/mount/oracle'
  • variable ORACLE_HOME
    export ORACLE_HOME='/mount/oracle/product/11.2.0.2v3'
  • variable PATH
    export PATH=$ORACLE_HOME/bin:$PATH
Crear el archivo de parametros

Aqui esta un ejemplo de un archivo init para que arranques, este no es para nada uno a tener en produccion ya que ese tiene que ser revisado para las necesidades de la instancia, pero para nuestras pruebas, con este es mas que suficiente.Este archivo lo guarde en la siguiente ruta /mount/dba01/oracle/TESTDB/pfile/initTESTDB1.ora, tu lo puedes guardar en la ruta que a ti te sirva y lo puedas tener a la mano.

*.audit_file_dest ='/mount/oracle/dump01/TESTDB/adump'
*.audit_trail ='db'
*.compatible ='11.2.0'
*.control_files='+ASM_DATA/TESTDB/CONTROLFILE/control01.ctl','+ASM_DATA/TESTDB/CONTROLFILE/control02.ctl'
*.db_block_size =8192
*.db_name ='TESTDB'
*.db_recovery_file_dest='+FRA_DATA'
*.db_recovery_file_dest_size =2G
*.diagnostic_dest ='/mount/oracle/dump01'
*.cluster_database=FALSE
*.log_archive_dest_1='LOCATION=+ASM_DATA/TESTDB/ARCHIVELOG'
*.log_archive_format='%t_%s_%r.dbf'
*.memory_target =1G
*.open_cursors =300
*.processes =150
*.remote_listener='orclespdev1-scan.oracleenespanol.blogspot.com:1826'
*.remote_login_passwordfile ='EXCLUSIVE'
TESTDB1.instance_name = TESTDB1
TESTDB1.instance_number=1
TESTDB1.undo_tablespace='UNDOTBS1'

Conectarnos a la base de datos y crear el archivo de parametros binario a partir del archivo initTESTDB.ora

Nos vamos a conectar a la base de datos autenticandonos con el sistema operativo y una vez conectados vamos a crear el archivo binarios (spfile).


$ sqlplus /nolog
SQL> CONNECT / AS SYSDBA
SQL> CREATE SPFILE
FROM PFILE = '/mount/dba01/oracle/TESTDB/pfile/initTESTDB1.ora';

Crear Nuestra Base de Datos
Una vez que creamos nuestro archivo binario de parametros, vamos a levantar la base de datos en modo nomount

SQL> startup nomount;

Ahora vamos a correr el siguiente SQL para crear nuestra base de datos.Tomando en cuenta que en ASM ya existen los siguientes directorios:

ASMCMD> pwd
+ASM_DATA/TESTDB

ASMCMD> ls
ARCHIVELOG/
CONTROLFILE/
DATAFILE/
ONLINELOG/
PARAMETERFILE/
TEMPFILE/

 
CREATE database TESTDB
USER SYS IDENTIFIED BY sys_password
USER SYSTEM IDENTIFIED BY system_password
MAXINSTANCES 32
MAXLOGHISTORY 10000
MAXLOGMEMBERS 5
MAXDATAFILES 2024
MAXLOGFILES 64
ARCHIVELOG
LOGFILE   GROUP 1 (
    '+ASM_DATA/TESTDB/ONLINELOG/redo01a.log',
    '+ASM_DATA/TESTDB/ONLINELOG/redo01b.log'
  ) SIZE 100M,
  GROUP 2 (
    '+ASM_DATA/TESTDB/ONLINELOG/redo02a.log',
    '+ASM_DATA/TESTDB/ONLINELOG/redo02b.log'
  ) SIZE 100M,
  GROUP 3 (
    '+ASM_DATA/TESTDB/ONLINELOG/redo03a.log',
    '+ASM_DATA/TESTDB/ONLINELOG/redo03b.log'
  ) SIZE 100M
CHARACTER SET UTF8
NATIONAL CHARACTER SET AL16UTF16
DATAFILE '+ASM_DATA/TESTDB/DATAFILE/system01.dbf' size 500M autoextend on next 100M maxsize 2000M extent management local
SYSAUX datafile '+ASM_DATA/TESTDB/DATAFILE/sysaux01.dbf' size 100M autoextend on next 100M maxsize 2000M
UNDO tablespace UNDOTBS1 datafile '+ASM_DATA/TESTDB/DATAFILE/undotbs1_01.dbf' size 500M autoextend on next 100M maxsize 1000M
DEFAULT temporary tablespace TEMP tempfile '+ASM_DATA/TESTDB/TEMPFILE/temp01.dbf' size 100M autoextend on next 100M maxsize 1000M;


Correr scripts para crear las vistas del Diccionario de Datos

Una vez que la base de datos se haya creado, vamos a correr los siquientes cuatro scripts para crear las vistas y procedimientos del diccionario de datos, este es un paso obligatorio asi que no te lo saltes, catalog.sql,catproc.sql y catclust.sql deben de correr con el usuario sys y los encuentras en $ORACLE_HOME/rdbms/admin, el script pupbld.sql debe de correr con el usuario system y lo encuentras en el directorio $ORACLE_HOME/sqlplus/admin. Aqui un ejemplo de como correrlos:

TESTDB1 >CONNECT SYS AS SYSDBA
spool catalog.log
@/mount/oracle/product/11.2.0.2v3/rdbms/admin/catalog.sql
spool off

spool catproc.log
@/mount/oracle/product/11.2.0.2v3/rdbms/admin/catproc.sql
spool off 

spool catclust.log 
@/mount/oracle/product/11.2.0.2v3/rdbms/admin/catclust.sql
spool off

TESTDB1 >CONNECT SYSTEM
Enter password:
spool pupbld.log
@/mount/oracle/product/11.2.0.2v3/sqlplus/admin/pupbld.sql
spool off
 

Para asegurarme que los usuarios de sys y system usen a TEMP como su tablespace temporal , corro el siguiente comando

TESTDB1 >alter user sys temporary tablespace TEMP;
User altered.

TESTDB1 >alter user sys temporary tablespace TEMP;
User altered.

Hasta este momento, si seguiste mi previa entrada de como crear una base de Datos en Linux, todo es similar (hasta parte del mismo texto :) ), pero aqui es en donde empieza a cambiar la situacion.

Crear segundo hilo de Online Redo Logs y segundo Tablespace de Undo

En RAC, cada instancia necesita tener su propio set de online Redo logs y su propio tablespace de undo, por eso necesitamos crear para la segunda instancia este segundo set, y asi sucesivamente para cada instancia que vayas a tener en tu configuracion.

TESTDB1 > CREATE UNDO TABLESPACE UNDOTBS2 DATAFILE
2  '+ASM_DATA/TESTDB/DATAFILE/undotbs2_01.dbf' size 100M autoextend on next 100M maxsize 1000M
3 ONLINE
4 RETENTION NOGUARANTEE
5 BLOCKSIZE 8K
6 FLASHBACK ON;

Tablespace created.

TESTDB1 > ALTER DATABASE ADD LOGFILE THREAD 2
2 GROUP 4 (
3    '+ASM_DATA/TESTDB/ONLINELOG/redo04a.log',
4    '+ASM_DATA/TESTDB/ONLINELOG/redo04b.log'
5  ) SIZE 100M;

Database altered.

TESTDB1 > ALTER DATABASE ADD LOGFILE THREAD 2
2  GROUP 5 (
3    '+ASM_DATA/TESTDB/ONLINELOG/redo05a.log',
4    '+ASM_DATA/TESTDB/ONLINELOG/redo05b.log'
5  ) SIZE 100M;

Database altered.

TESTDB1 > ALTER DATABASE ADD LOGFILE THREAD 2
2  GROUP 6 (
3    '+ASM_DATA/TESTDB/ONLINELOG/redo06a.log',
4    '+ASM_DATA/TESTDB/ONLINELOG/redo06b.log'
5  ) SIZE 100M;

Database altered.

Archivo de Parametros en RAC

Otra de las cosas que cambia con respecto a una Base de Datos que no esta en RAC contra una que si esta en arquitectura RAC, es que hay ciertos parametros que es obligatorio que en todas las instancias sean iguales,en 11gR2 son los siguientes
COMPATIBLE
CLUSTER_DATABASE
CLUSTER_DATABASE_INSTANCES
CONTROL_FILES
DB_BLOCK_SIZE
DB_DOMAIN
DB_FILES
DB_NAME
DB_RECOVERY_FILE_DEST
DB_RECOVERY_FILE_DEST_SIZE
DB_UNIQUE_NAME
INSTANCE_TYPE (RDBMS or ASM)
PARALLEL_EXECUTION_MESSAGE_SIZE
REMOTE_LOGIN_PASSWORDFILE
UNDO_MANAGEMENT
Aqui un ejemplo del init que construi para este ejercicio, llamado /mount/dba01/oracle/TESTDB/pfile/pfileTESTDB_RAC.ora

*.audit_file_dest ='/mount/oracle/dump01/TESTDB/adump'
*.audit_trail ='db'
*.compatible ='11.2.0'
*.control_files='+ASM_DATA/TESTDB/CONTROLFILE/control01.ctl','+ASM_DATA/TESTDB/CONTROLFILE/control02.ctl'
*.db_block_size =8192
*.db_name ='TESTDB'
*.db_recovery_file_dest='+FRA_DATA'
*.db_recovery_file_dest_size =2G
*.diagnostic_dest ='/mount/oracle/dump01'
*.cluster_database=TRUE
*.log_archive_dest_1='LOCATION=+ASM_DATA/TESTDB/ARCHIVELOG'
*.log_archive_format='%t_%s_%r.dbf'
*.memory_target =1G
*.open_cursors =300
*.processes =150
*.remote_listener='orclespdev1-scan.oracleenespanol.blogspot.com:1826'
*.remote_login_passwordfile ='EXCLUSIVE'
TESTDB1.instance_name = TESTDB1
TESTDB2.instance_name = TESTDB2
TESTDB1.instance_number=1
TESTDB2.instance_number=2
TESTDB1.undo_tablespace='UNDOTBS1'
TESTDB2.undo_tablespace='UNDOTBS2'
TESTDB1.thread=1
TESTDB2.thread=2

Una de las cosas que te permite la arquitectura de RAC, es que cada instancia tenga su propio archivo de parametros.

Pero en mi caso, prefiero tener uno compartido, esto lo hago removiendo cualquier archivo de arranque que exista en $ORACLE_HOME/dbs/spfileTESTBn.ora (donde n es el numero de instancia)

Algo que debes de tener muy claro es que como vamos a tener un archivo de parametros compartido, la rutas fijas, (Que no pertenecen a ASM) tienen que ser iguales en todos tus nodos, como por ejemplo audit_file_dest. 

oracle@servidor1.oracleenespanol.blogspot.com [TESTDB1] /mount/oracle/product/11.2.0.2v3/dbs
oracle $ rm ./*TESTDB*.ora


Ya que removi cualquier archivo de parámetros que tenia, para cada instancia en su servidor en $ORACLE_HOME/dbs, voy a crear un archivo initTESTDBn.ora (n para el numero de instancia) que apunte a mi archivo de arranque binario compartido

oracle@servidor1.oracleenespanol.blogspot.com [TESTDB1] /mount/oracle/product/11.2.0.2v3/dbs
oracle $ cat initTESTDB1.ora
SPFILE='+ASM_DATA/TESTDB/PARAMETERFILE/spfileTESTDB.ora'

Ahora voy a bajar la instancia TESTDB1 para despues subirla con el archivo de parametros en RAC

oracle@servidor1.oracleenespanol.blogspot.com [TESTDB1] /mount/dba01/oracle/TESTDB/pfile
oracle $ sqlplus

SQL*Plus: Release 11.2.0.2.0 Production on Wed Feb 15 10:00:53 2012
Copyright (c) 1982, 2010, Oracle.  All rights reserved.
Enter user-name: /as sysdba

TESTDB1 >shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

TESTDB1 > SPFILE='+ASM_DATA/TESTDB/PARAMETERFILE/spfileTESTDB.ora' FROM PFILE = '/mount/dba01/oracle/TESTDB/pfile/pfileTESTDB_RAC.ora';

File created.

TESTDB1 >startup
ORACLE instance started.

Total System Global Area 1068937216 bytes
Fixed Size                  2233336 bytes
Variable Size             675286024 bytes
Database Buffers          369098752 bytes
Redo Buffers               22319104 bytes
Database mounted.
Database opened.
TESTDB1 >

Ya que levantamos la instancia con los parametros necesarios de RAC, vamos a habilitar el segundo hilo de los online Redo Log

TESTDB1 >ALTER DATABASE ENABLE PUBLIC THREAD 2;

Database altered.

Y ahora volvemos a bajar la instancia TESTDB1

TESTDB1 >shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

Añadir nuestra Base de Datos como Recurso al Clusterware
Si te has fijado, todo lo hemos trabajado en una sola instancia,para poder manejarlo con el Server Manager, vamos a utilizar una utileria llamada srvctl. En 11gR2 , se define una base de datos como un recurso en Oracle Clusterware, y cuando creamos una base de datos manual, esto se hace con la utileria srvctl.

oracle@servidor1.oracleenespanol.blogspot.com [TESTDB1] /mount/dba01/oracle/admin
oracle $ srvctl add database -d TESTDB -o "/mount/oracle/product/11.2.0.2v3"

oracle@servidor1.oracleenespanol.blogspot.com [TESTDB1] /mount/dba01/oracle/admin
oracle $ srvctl add instance -d TESTDB -i TESTDB1 -n servidor1.oracleenespanol.blogspot.com

oracle@servidor1.oracleenespanol.blogspot.com [TESTDB1] /mount/dba01/oracle/admin
oracle $ srvctl add instance -d TESTDB -i TESTDB2 -n servidor2.oracleenespanol.blogspot.com 
 
oracle@servidor1.oracleenespanol.blogspot.com [TESTDB1] /mount/dba01/oracle/admin
oracle $ srvctl start database -d TESTDB 
 
oracle@servidor1.oracleenespanol.blogspot.com [TESTDB1] /mount/dba01/oracle/admin
oracle $ srvctl status database -d TESTDB

Instance TESTDB1 is running on node servidor1
Instance TESTDB2 is running on node servidor2

Conclusion
Espero que estos pasos te sirvan el dia que no quieras utilizar el dbca para crear tu base de datos, esto te permite mas flexibilidad para la creacion de esta.

lunes, 30 de enero de 2012

Respaldando con RMAN 11gR2 y Netbackup sucede el error RMAN-10038 database session for channel CH1 terminated unexpectedly

Ahora que ando migrando bases de datos de un Nodo a un ambiente RAC, me volvi a topar con este error cuando corro un respaldo a Netbackup

connected to target database: TESTDB (DBID=1193295160)

RMAN> run
2> {
3> ALLOCATE CHANNEL CH1 DEVICE TYPE SBT PARMS 'BLKSIZE=262144';
4> BACKUP FORMAT '%d_%M_%D_%Y_%t.ctl' CURRENT CONTROLFILE;
5> }

using target database control file instead of recovery catalog
allocated channel: CH1
channel CH1: SID=548 instance=TESTDB1 device type=SBT_TAPE
channel CH1: Veritas NetBackup for Oracle - Release 6.5 (2007072323)

Starting backup at 29-JAN-12
channel CH1: starting full datafile backup set
channel CH1: specifying datafile(s) in backup set
including current control file in backup set
channel CH1: starting piece 1 at 29-JAN-12
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03009: failure of backup command on CH1 channel at 01/29/2012 20:21:16
RMAN-10038: database session for channel CH1 terminated unexpectedly

Lo que me di cuenta es que la instalacion del cliente que tenia era una version no compatible con 11gR2

oracle $ cat /usr/openv/netbackup/bin/version
NetBackup-RedHat2.6 6.5.1

Una vez que actualize a la version 6.5.6, todo funciono como deberia

oracle $ cat /usr/openv/netbackup/bin/version
NetBackup-RedHat2.6 6.5.6

RMAN> run
2> {
3> ALLOCATE CHANNEL CH1 DEVICE TYPE SBT PARMS 'BLKSIZE=262144';
4> BACKUP FORMAT '%d_%M_%D_%Y_%t.ctl' CURRENT CONTROLFILE;
5> }

using target database control file instead of recovery catalog
allocated channel: CH1
channel CH1: SID=814 device type=SBT_TAPE
channel CH1: Veritas NetBackup for Oracle - Release 6.5 (2007072323)

Starting backup at 30-JAN-12
channel CH1: starting full datafile backup set
channel CH1: specifying datafile(s) in backup set
including current control file in backup set
channel CH1: starting piece 1 at 30-JAN-12
channel CH1: finished piece 1 at 30-JAN-12
piece handle=TESTDB_01_30_2012_773976339.ctl tag=TAG20120130T012539 comment=API Version 2.0,MMS Version 5.0.0.0
channel CH1: backup set complete, elapsed time: 00:01:05
Finished backup at 30-JAN-12

Starting Control File and SPFILE Autobackup at 30-JAN-12
piece handle=c-2326906767-20120131-00 comment=API Version 2.0,MMS Version 5.0.0.0
Finished Control File and SPFILE Autobackup at 30-JAN-12
released channel: CH1

Puedes encontrar la informacion mas reciente en la pagina de Symantec (INGLES) en:
RMAN-10038 error when

martes, 24 de enero de 2012

Erro ORA-38856 cuando duplicas una base de datos en RAC 11gR2

En estos dias he estado clonando nuestras bases de datos en RAC 11gR2 para nuestro ambiente de desarrollo y con el siguiente script:

RUN
{
ALLOCATE AUXILIARY CHANNEL CH1  TYPE DISK ;
ALLOCATE AUXILIARY CHANNEL CH2  TYPE DISK ;
DUPLICATE DATABASE TO TESTDB
  BACKUP LOCATION '/mount/acfsfut1/copy01/ORIGINAL_GOLDCOPY/'
  DB_FILE_NAME_CONVERT '+DATA/ORIGINAL/DATAFILE','+DATA/TESTDB/DATAFILE'
  PFILE '/mount/dba01/oracle/TESTDB/pfile/initTESTDB1.ora'
  NOFILENAMECHECK
  NOREDO
LOGFILE
  GROUP 1 (
    '+DATA/TESTDB/ONLINELOG/redo01g1.log',
    '+DATA/TESTDB/ONLINELOG/redo02g1.log'
  ) SIZE 300M ,
  GROUP 2 (
    '+DATA/TESTDB/ONLINELOG/redo01g2.log',
    '+DATA/TESTDB/ONLINELOG/redo02g2.log'
  ) SIZE 300M
 ;
}


En el momento que estaba finalizando la clonacion,cuando RMAN estaba tratando de abrir la base de datos, sucedio el siguiente error:

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

alter database open resetlogs
*
ERROR at line 1:
ORA-38856: cannot mark instance UNNAMED_INSTANCE_2 (redo thread 2) as enabled


Buscando en MOS, encontre la nota 334899.1, en la que marca que podemos utilizar el siguiente parametro escondido

_no_recovery_through_resetlogs=TRUE


La misma nota menciona que es una situacion normal cuando tienes un respaldo y una clonacion en ambiente RAC.

Una vez que cambie el parametro, volvi a lanzar la clonacion de la base de datos, y esta vez acabo sin ningun problema

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

database opened
Finished Duplicate Db at 24-JAN-2012 19:37:18

Recovery Manager complete.


Lo ultimo que tenemos que hacer es remover este parametro del initTESTDB1.ora y apagar y reiniciar la instancia para que este parametro se remueva.

lunes, 16 de enero de 2012

Error ORA-01503 y ORA-12720 cuando clonas una BD en RAC

Cuando clonas una BD en un ambiente de RAC, si te topas con el siguiente error:
 
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of Duplicate Db command at 01/17/2012 23:29:05
RMAN-06136: ORACLE error from auxiliary database: ORA-01503: CREATE CONTROLFILE failed
ORA-12720: operation requires database is in EXCLUSIVE mode

Necesitas cambiar el parametro cluster_database a falso:


alter system set cluster_database=FALSE scope=spfile sid='INSTANCE_NAME';


Una vez que hayas terminado con el proceso de clonacion, tienes que regresar el parametro a verdadero para que esta instancia siga siendo parte de tu configuracion de RAC.

alter system set cluster_database=TRUE scope=spfile sid='INSTANCE_NAME';

jueves, 15 de septiembre de 2011

Datapump y el error ORA-06502

El otro dia tuvimos un requerimiento de exportar mas de 2000 tablas con un opcion de QUERY. Una vez que construimos nuestro archivo de parametros que contenia mas de 4000 caracteres y lo lanzamos y nos aparece el siguiente error

 ORA-06502 PL/SQL: numeric or value error: character string buffer too small

Lo que sucedio fue que Oracle tiene un bug interno, que por lo visto en 11.2.0.2 todavia no esta resuelto, en donde un buffer interno es excedido por los parametros INCLUDE or TABLES, falla con el error mencionado arriba. Lo que hicimos para corregir este error fue lo siguiente 1.- Creamos una tabla que tenga tres columnas, owner,object_name y object_type, y una vez creada, insertamos los valores de las tablas que queremos exportar.


DBATEST >CREATE TABLE expdp_tab (owner VARCHAR2(30), object_name VARCHAR2(128), object_type VARCHAR2(19));

Table created.

DBATEST >INSERT INTO expdp_tab VALUES ('HR','TEST_TABLE_1','TABLE');

1 row created.

DBATEST >INSERT INTO expdp_tab VALUES ('HR','TEST_TABLE_2','TABLE');

1 row created.

.
.
.

DBATEST >INSERT INTO expdp_tab VALUES ('HR','TEST_TABLE_N','TABLE');

1 row created.

DBATEST >commit;

Commit complete.

2.-Ya que finalizamos de insertar las tablas que queremos exportar a la tabla expdp_tab, vamos a crear un archivo de parametros para el export de datapump.


DIRECTORY=DATA_PUMP_DIR  
SCHEMAS=SYSADM
DUMPFILE=DUMP_FILE_NAME.dmp 
CONTENT=DATA_ONLY 
QUERY= "WHERE LOCATION='TEST'"
INCLUDE=TABLE:"IN (SELECT object_name FROM expdp_tab where owner='HR')"

3.-Correr el job de datapump expdp hr/hr_pass@DBATEST parfile=parameter_file_name.par


;;; 
Export: Release 11.2.0.2.0 - Production on Wed Sep 14 20:45:40 2011

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
;;; 
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
With the OLAP, Data Mining and Real Application Testing options
Starting "HR"."SYS_EXPORT_SCHEMA_01":  HR/******** parfile=parameter_file_name.par 
Estimate in progress using BLOCKS method...
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 230.1 MB
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/GRANT/OWNER_GRANT/OBJECT_GRANT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/INDEX/FUNCTIONAL_AND_BITMAP/INDEX
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/FUNCTIONAL_AND_BITMAP/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
. . exported "HR"."TEST_TABLE"                13.59 MB   64509 rows
.
.
. . exported "HR"."TEST_TABLE_N"                    10.96 KB      20 rows
Master table "SYSADM"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYSADM.SYS_EXPORT_SCHEMA_01 is:
  /mount/export01/DBATEST/DUMP_FILE_NAME.dmp
Job "SYSADM"."SYS_EXPORT_SCHEMA_01" successfully completed at 21:15:13

4.-Una vez finalizado el export, tiramos la tabla que creamos al principio

DBATEST >drop table expdp_tab;

Table dropped.

Conclusion
Aunque Oracle en MOS indica que este bug interno ya se encuentra arreglado, nosotros no lo topamos en la version 11.2.0.2.3, asi que si te lo llegas a topar, aqui esta la manera de como trabajar alrededor de el.

domingo, 28 de agosto de 2011

Como vincular los binarios de Oracle

En este cuarto de año, mi equipo y yo estamos aplicando una seria de parches y el PSU de Julio 2011 a nuestras bases de datos, decidimos que para reducir el tiempo de baja de las Bases de Datos, vamos a construir un nuevo ORACLE_HOME con estos parches y PSU, y solamente bajar la instancia,cambiar la variable de ambiente ORACLE_HOME a la nueva y empezar la instancia.

En este metodo, lo que hicimos fue construir un solo ORACLE_HOME y clonarlo a los demas servidores, pero en este proceso nos dimos cuenta que nuestra copia "base", habia sido borrado el archivo $ORACLE_HOME/network/admin/shrept.lst. Esto causaba que la clonacion a la hora de vincular los binarios de Oracle con el sistema operativo fallaba con el siguiente error:

INFO: Calling Action unixActions10.2.0.3.0 make
registerOnly = false
installMakePath = /usr/ccs/bin/make
installMakeFileName = /mount/oracle/product/11.2.0.2v2/rdbms/lib/ins_rdbms.mk
installTarget = client_sharedlib
undoMakeFileName =
installArguments = ORACLE_HOME=/mount/oracle/product/11.2.0.2v2
logFile = /mount/oracle/product/11.2.0.2v2/install/make.log
undoTarget =
progMsg = Building Client Shared Libraries

INFO: The output of this make operation is also available at: '/mount/oracle/product/11.2.0.2v2/install/make.log'
INFO:

INFO: Start output from spawned process:
INFO: ----------------------------------
INFO:

INFO: /mount/oracle/product/11.2.0.2v2/bin/genclntsh

INFO: genclntsh: Could not locate /mount/oracle/product/11.2.0.2v2/network/admin/shrept.lst
genclntsh: exiting ...

INFO: make: Fatal error: Command failed for target `client_sharedlib'

INFO: *** Error code 1

Para poder entender lo que hicimos para solucionar este problema, hay que entender que en cualquier distribucion de un sistema operativo basado en Unix, el software de Oracle viene como archivos tipo objeto (object files) o como archivos tipo fuente (source files), estos al ser instalados en Unix se vinculan con las librerias del sistema operativo para generar el ejecutable de oracle.

Lo primero que tuvimos que hacer es recrear el archivo, ya sea de otra instalacion de 11.2.0.2 que tuviera el archivo o lo puedes extraer del cd de instalacion (Metalink id 340978.1), en este caso el contenido de nuestro archivo, es como se menciona abajo:

oracle@localhost [DBATEST] /mount/oracle/product/11.2.0.2v2/network/admin
root $ cat shrept.lst
# function entry points for genclntsh.sh

network : snaumihi_inithostinfo
network : snaumbg_gmt
network : naedpwd_encrypt
network : naumbsb_bld_singlebyte
network : ztapis
network : nlgh

Una vez que reconstruimos el archivo con el usuario oracle y permisos 644, bajamos todas las instancias y listeners que estuvieran corriendo en el ORACLE_HOME donde fallo la instalacion, y utilizamos el comando $ORACLE_HOME/bin/relink all

oracle@localhost [DBATEST] /mount/oracle/product/11.2.0.2v2/bin
root $ ./relink all
writing relink log to: /mount/oracle/product/11.2.0.2v2/install/relink.log

Este comando no te regresa un mensaje de exito, es mas bien si ocurre un error durante esta fase te muestra el mensaje de falla, como por ejemplo

'Fatal error', 'Ld: fatal', 'Exit Code 1'

Si te llega a suceder un error, lo mas recomendable es buscar en metalink, si hay otro suceso de este error o abrir un SR con oracle para resolverlo.

Conclusion
El comando de relink all es una herramienta muy util, sobre todo cuando por alguna razon los vinculos se perdieron entre Oracle y las librerias del sistema operativo.

miércoles, 17 de agosto de 2011

Problema clonando un nuevo ORACLE_HOME bug 3823729 en 11.2.0.2

En estos dias estamos tratando de crear un nuevo ORACLE_HOME que contenga el PSU de Julio asi como unos parches que requerimos, para disminuir el tiempo que necesitamos bajar la base de datos al aplicar los parches al ORACLE_HOME actual, decidimos crear un nuevo ORACLE_HOME aplicar los parches en este nuevo ORACLE_HOME, clonar este ORACLE_HOME a los servidores necesarios y nada mas mover la base de datos al nuevo ORACLE_HOME. Todo iba bien, hasta que llego el punto de clonar el nuevo ORACLE_HOME, nos topamos con un bug en donde si ya tenemos un ORACLE_HOME previo, detecta procesos arriba y no te permite continuar con la clonacion


oracle@localhost /mount/oracle
oracle $ $ORACLE_HOME/perl/bin/perl clone.pl ORACLE_BASE="/mount/oracle" ORACLE_HOME="/mount/oracle/product/11.2.0.2v2" ORACLE_HOME_NAME=11gR202v2
.
.
.
oracle $ cat /mount/oracle/oraInventory/logs/silentInstall2011-08-15_02-12-06AM.log
silentInstall2011-08-15_02-12-06AM.log
Oracle Universal Installer has detected that there are processes running in the currently selected Oracle Home. The following processes need to be shutdown before continuing:
/mount/oracle/product/11.2.0.2v1/bin/tnslsnr PSAESRV PSDSTSRV PSMONITORSRV PSMSTPRC PSPRCSRV PSRUN ora_mman_DBATEST
Oracle Universal Installer has detected that there are processes running in the currently selected Oracle Home. The following processes need to be shutdown before continuing:
/mount/oracle/product/11.2.0.2v1/bin/tnslsnr PSAESRV PSDSTSRV PSMONITORSRV PSMSTPRC PSPRCSRV PSRUN ora_mman_DBATEST
This silent installation was unsuccessful.

Como al dia de hoy no existe un parche para este bug, hicimos los siquientes pasos para poder instalar el nuevo ORACLE_HOME Con el usuario de root

root@localhost /root
root $ which fuser
/sbin/fuser

root@localhost /root
root $ mv /sbin/fuser /sbin/fuser.18082011

root@localhost /root
root $ touch /sbin/fuser

root@localhost /root
root $ chmod +x /sbin/fuser

Una vez que hicimos los pasos anteriores como root, volvemos a intentar con el usuario de oracle la clonacion del nuevo ORACLE_HOME

oracle@localhost /mount/oracle
oracle $ $ORACLE_HOME/perl/bin/perl clone.pl ORACLE_BASE="/mount/oracle" ORACLE_HOME="/mount/oracle/product/11.2.0.2v2" ORACLE_HOME_NAME=11gR202v2
.
.
.
oracle $ cat silentInstall2011-08-16_06-56-02PM.log
silentInstall2011-08-16_06-56-02PM.log
WARNING:
The following configuration scripts need to be executed as the "root" user.
/mount/oracle/product/11.2.0.2v2/root.sh
To execute the configuration scripts:
1. Open a terminal window
2. Log in as "root"
3. Run the scripts

The cloning of 11gR202v2 was successful.

Ya terminada la clonacion, ahora nada mas regresamos el archivo fuser que movimos al principio a su locacion original

root@localhost /root
root $ mv /sbin/fuser.16082011 /sbin/fuser
mv: overwrite `/sbin/fuser'? y

Conclusion 
Espero que este bug con el me tope te sirva si te llegas a topar tu con el, segun oracle esto se va a corregir en la version 11.2.0.3.