Posts

OPatch: Error occurred during initialization of VM

Image
Sintoma: Luego de actualizar el OPatch da el siguiente error.   [oracle@servertest OPatch]$ ./opatch version  Error occurred during initialization of VM  Could not reserve enough space for 3145728KB object heap  OPatch failed with error code 1  Diagnostico: Todo software en Oracle que se descarga esta construido para un versión especifica de sistema operativo, se debe estar atento de descargar la versión adecuada en tu caso. El OPatch que se descargó y utilizó fue diferente a la versión del sistema operativo en el cual se esta trabajando, en este caso se trato de utilizar una versión para linux-32 bit cuando realmente el sistema operativo es linux-64bit.   Solución:  Descargar y subir la versión correcta del OPatch.  Nota: 293369.1

Analytic functions LEAD y LAG- Example

Las funciones LAG y LEAD te permiten obtener el valor siguiente o anterior respectivamente al registro actual considerando un orden definido. Explicarlo quizás no es tan sencillo como con un ejemplo, imaginemos que tenemos una tabla donde está el resumen de un estados de cuenta bancario donde podemos ver el saldo que tenía el cliente al cierre de cada mes. create table Edo_Cta (Mes date, Saldo number) tablespace users; insert into Edo_Cta (mes, Saldo) values (to_date('1-Jan-2019','dd-Mon-yyyy'), 1000); insert into Edo_Cta (mes, Saldo) values (to_date('1-Feb-2019','dd-Mon-yyyy'), 1200); insert into Edo_Cta (mes, Saldo) values (to_date('1-Mar-2019','dd-Mon-yyyy'), 2000); insert into Edo_Cta (mes, Saldo) values (to_date('1-Apr-2019','dd-Mon-yyyy'), 2500); insert into Edo_Cta (mes, Saldo) values (to_date('1-May-2019','dd-Mon-yyyy'), 2800); insert into Edo_Cta (mes, Saldo) values (to_date('1-Jun-2019'

Analytic functions RANK - Example

Funciones analíticas como dba utilizamos muy poco esta consulta un poco más complejas sin embargo son muy poderosas, aquí un ejemplo sencillo de la función RANK. Con la función RANK podemos numerar o jerarquizar un subconjunto de registros según sus valores, cada subconjunto de valores diferentes la numeración o jerarquía se reinicia. create table entradas (nombre varchar2(32), fec_entrada date) tablespace users; INSERT INTO entradas (nombre, fec_entrada) SELECT chr(mod(LEVEL,10)+65),(sysdate+LEVEL) FROM dual CONNECT BY LEVEL <= 100; Hacemos la magia con la función RANK y veremos que los ordena según la fecha de entrada y les da un número según su jerarquía de menor a mayor. SQL> select * from (select nombre,fec_entrada, rank() over (partition by nombre order by fec_entrada) as myrank from entradas); NOMBRE FEC_ENTRA MYRANK -------------------------------- --------- ---------- A 22-MAR-20 1 A

ORA-16072 - Levantar una BD luego de remover la configuración de Dataguard

Después de restaurar y recuperar un respaldo de una base de datos que estaba en DATAGUARD, al tratar de levantarla muestra el siguiente error: SQL> alter database open; alter database open * ERROR en l▒nea 1: ORA-03113: fin de archivo en el canal de comunicaci▒n Identificador de Proceso: 42290 Identificador de Sesi▒n: 146 N▒mero de Serie: 3 El mensaje que mostraba en el alert log LGWR: Primary database is in MAXIMUM AVAILABILITY mode LGWR: Primary database is in MAXIMUM AVAILABILITY mode LGWR: Destination LOG_ARCHIVE_DEST_1 is not serviced by LGWR LGWR: Minimum of 1 LGWR standby database required Errors in file /u01/app/oracle/diag/rdbms/test/TEST1/trace/TEST1_lgwr_42219.trc: ORA-16072: a minimum of one standby database destination is required ARC1 started with pid=25, OS id=42309 LGWR (ospid: 42219): terminating the instance due to error 16072 System state dump requested by (instance=1, osid=42219 (LGWR)), summary=[abnormal instance termination]. System State dumped to

ORA-00201 version 11.2.0.4.0 del archivo de control incompatible con ORACLE version 11.2.0.0.0

Hace unos días restaure un controlfile, al tratar de levantar la base de datos presento el siguiente error: SQL> startup mount; Instancia ORACLE iniciada. Total System Global Area 8551575552 bytes Fixed Size 2270360 bytes Variable Size 8489274216 bytes Database Buffers 50331648 bytes Redo Buffers 9699328 bytes ORA-00201: version 11.2.0.4.0 del archivo de control incompatible con ORACLE version 11.2.0.0.0 ORA-00202: archivo de control: '+DGDATA/test/controlfile/controlfile_test_01.ctl' El problema: El parámetro "compatible" estaba configurado en una versión inferior “11.2.0.0.0" a la que tiene registrado el controlfile. Solución: alter system set compatible='11.2.0.4.0' scope=spfile; Bajamos y subimos la base de datos

ALTER SYSTEM ARCHIVE LOG CURRENT vs ALTER SYSTEM SWITCH LOGFILE

Ambos comandos forzan el Switch de los grupos de Redo Log Online, pero ALTER SYSTEM SWITCH LOGFILE: Es asíncrono, no espera la confirmación que los archivos de redolog online se hayan sido archivados, mientras que ALTER SYSTEM ARCHIVE LOG CURRENT: Es síncrono y espera la confirmación que los Redo Log Online fueron archivados por el ARCHIVER. 00.- Nuestro ambiente: Un RAC de 2 nodos con 3 grupos de Redo Log Online en cada Instancia de Base de Datos. SQL> select inst_id, instance_name from gv$instance; INST_ID INSTANCE_NAME ---------- ---------------- 1 CURSO1 2 CURSO2 select thread#, group#, status,bytes/1024/1024 size_mb from v$log order by thread#, group#; THREAD# GROUP# STATUS ---------- ---------- ---------------- 1 1 INACTIVE 1 2 INACTIVE 1 3 CURRENT <---Grupo que esta siendo escrito por el Log Writter. 2 4 INACTIVE 2

ORA-20005 Estadisticas bloqueadas.

El error ORA-20005 significa que las estadísticas fueron bloqueadas y estas tratando de colectarlas BEGIN dbms_stats.gather_table_stats(ownname=> 'ESQUEMA', tabname=> 'TABLE_TEST',Degree=> 8, cascade=>false, estimate_percent=> DBMS_STATS.auto_sample_size); END; / ERROR at line 1: ORA-20005: object statistics are locked (stattype = ALL) ORA-06512: at "SYS.DBMS_STATS", line 34634 ORA-06512: at line 1 Verificamos que las estadísticas están bloqueadas. col owner for a24 col table_name for a32 select owner,table_name,STATTYPE_LOCKED from dba_tab_statistics where table_name='TABLE_TEST' and owner='ESQUEMA'; OWNER TABLE_NAME STATT ------------------------ -------------------------------- ----- ESQUEMA TABLE_TEST ALL Los posible valores para el campo STATTYPE_LOCKED son :NULL, DATA, CACHE y ALL. Si esta en NULL significa que no esta bloqueada. Para desblqu

Datapump 06 - Como respaldar el AWR con export datapump

Este es el sexto artículo sobre datapump, igualmente este pudiera ser un post referente a AWR. Vamos a ver como respaldar los datos del AWR (Automatic Workload Repository) con el Oracle Datapump. Como sabemos el AWR tiene una retención definida, por defecto solo guarda los últimos 8 días. Si queremos preservar un periodo en particular o llevarlo a otro ambiente para su posterior análisis podemos respaldarlo con un export datapump, Oracle trae un script que simplifica esta tarea. Paso 01.- Creamos el objeto directorio. sqlplus / as sysdba CREATE OR REPLACE DIRECTORY DPUMP_AWR AS '/home/oracle/dbprocs/awr'; Paso 02.- Exportamos el AWR con el script awrextr.sql. El script va a requerir que ingresemos 4 datos. sqlplus / as sysdba @?/rdbms/admin/awrextr.sql Paso 02.1.- database id, el script te sugiere uno. The default database id is the local one: '3645396109'. To use this database id, press to continue, otherwise enter an alternative. Enter value f

FULL TABLE SCAN-Oracle no quiere utilizar mi índice

Image
Quizás esta imagen les sea conocida, 7 ó 12 personas apiladas detrás del DBA de turno viendo su pantalla, preguntando que sucede o haciendo suposiciones, te llaman para que apoyes, llegas, te abres paso entre la multitud de jefes y lo primero que vez es una gran franja azul en el Cloud Control (OEM), luego de dos clic en el OEM o tres consultas al ASH, es evidente que una consulta SQL está realizando muchísimas lecturas a disco. Un desarrollador refuta que la tabla tiene un índice por el campo búsqueda en el WHERE, sin embargo, la Base de Datos decide hacer Table Full Scan. ¿Por qué está pasando esto? Comencemos: Consulta SQL que está generando afectación: SELECT ID_EMBRQ FROM DIST_EMBARQUE_OPER WHERE ID_EMBRQ =:1; Podemos observar que el campo "ID_EMBRQ" es de tipo VARCHAR2 Column Type Name Data DATA_LENGTH N POS -------------------------------- ------------ ----------- - ---- ID_EMBRQ

Datapump 05 - Cómo funcionan los parámetros DUMPFILE, FILESIZE Y PARALLEL en un expdp.

DUMPFILE, FILESIZE y PARALLEL son parámetros dentro de la herramienta expdp, los cuales tienen una estrecha relación y se llegan afectar entre sí. En este post vamos a descubrir esa relación. Comencemos: DUMPFILE indica el nombre del archivo o los archivos generados (dump file), incluso también se puede definir la ruta donde se van a almacenar a través de un objeto directorio. Tenemos el comodín “%U” si lo colocamos en el nombre del archivo va a sustituir ese comodín por un valor entero de forma consecutiva desde el 01 hasta el 99 según lo requiera. PARALLEL indica cuántos procesos van a trabajar simultáneamente para cargar los datos en los archivos (dump file). (Nota: El paralelismo únicamente funciona en la versión Enterprise Edition) FILESIZE especifica el tamaño máximo que pueden alcanzar los archivos generados (dump file) Ejemplos: Supongamos vamos a exportar una tabla de aproximadamente 240MB, veamos que sucede en diferentes casos: Caso 01: En el siguiente ejemplo

Datapump - 04 Export con flashback time

Image
Cuando escucho la palabra "Flashback" lo primero que pienso es el video juego de los años 90, muy divertido y adelantado para su época. Sin embargo, en esta oportunidad vamos a hablar de Oracle Flashback en el Datapump y como nos permite hacer viajes en el tiempo. Flashback es una tecnología que comenzó con Oracle 9i y sigue evolucionando. Esta herramienta permite a los administradores y usuarios ver y manipular estados pasados de los datos sin necesidad de recuperar toda la base de datos a un punto de tiempo en especifico. Vamos a crear un respaldo de una tabla pero con su imagen de hace 30 minutos y no con la imagen actual. Comencemos: 01.- Insertamos 5 registros a la 14:00, la tabla tiene un campo llamado "fecha" donde vamos a insertar la hora actual a través de la función SYSDATE. 14:00:33 SQL> INSERT INTO test.tab01 (ID,NOMBRE,FECHA) SELECT level, 'First Load', sysdate FROM dual CONNECT BY level <= 5; 5 rows created. 14:00:46 SQL>

Datapump – 03 Directorios

Una diferencia obvia entre Datapump y el export/import tradicional es el uso de objetos Directorio, lo cual algunas personas les causa un poco de confusión. Son objetos de base de datos que apuntan a un directorio específico en el sistema operativo, estos permiten flexibilidad en el manejo de códigos y script, a diferencia de poner explícitamente la ruta del directorio, lo que se conoce como *"quemar" o "harcodear",  solo utilizas este alias, es decir si la ruta cambia no afecta al código. Comencemos: Como crear un directorio: CREATE OR REPLACE DIRECTORY EXP_DIR AS '/u01/workarea'; Si requerimos que otros usuarios tengan acceso de lectura y/o escritura: GRANT READ, WRITE ON DIRECTORY EXP_DIR TO otro_usuario; Chequear quienes tienen permisos sobre el directorio: COL TABLE_NAME FOR A32 COL GRANTEE FOR A24 COL OWNER FOR A16 COL GRANTOR FOR A16 COL PRIVILEGE FOR A12 SELECT * FROM DBA_TAB_PRIVS WHERE TABLE_NAME='EXP_DIR'; Revisar los directori

Datapump – 02 ¿Por qué falla el comando el Export Datapump con la opción Parallel en Oracle RAC?

Teníamos un script para un export/import datapump que funcionaba cuando la BD era single y ahora que fue llevada a Oracle RAC está fallando. ¿Qué sucedió? Cuando se activa la opción de PARALLEL el datapump va a invocar varios trabajadores para separar el trabajo y así optimizar el proceso, sin embargo hay que tener en cuenta un detalle cuando estamos en una configuración de Oracle RAC. Estos trabajadores van a estar en cada nodo del RAC, entonces el dumpfile debe estar ubicado en un almacenamiento compartido como ASM o un Clustered-filesystem, sino va a suceder el siguiente error. ORA-31693: Table data object "TEST"."TEST_15" failed to load/unload and is being skipped due to error: ORA-31617: unable to open dump file "/datadir/temp_expdp /TEST_test_03.dmp" for write ORA-19505: failed to identify file "/datadir/temp_expdp /TEST_test_03.dmp" ORA-27037: unable to obtain file status Como conclusión, Datapump(PARALLEL) en Oracle RAC el d

Datapump - 01 Extraer sentencias DDL de un export Datapump

Saludos, estoy comenzando el día de hoy con una serie de al menos 10 artículos relacionados con la herramienta de datapump, esta apareció con oracle 10g como la evolución del export/import. Datapump trae mejoras e interesantes funcionalidades con cada nueva versión de Oracle. Si solo lo has usado para mover y hacer un respaldo lógico de una tabla o esquema, quizás te estás perdiendo de algunas utiles caracteristicas que pueden simplificar tu vida. Si deseamos extraer en un archivo el script de creación y carga de un export datapump que realizamos previamente. impdp  DUMPFILE=EXP_DIR:expADM_ADMIN.dmp sqlfile=EXP_DIR:sqlADM_ADMIN.sql

Excluir los usuarios por defecto en Oracle

Las bases de datos tienen varios usuarios por defecto, por ejemplo el más conocido es SYSTEM y otros que se crean al activar o instalar una opción adicional como “Oracle Application Express”. En muchas ocasiones no estamos interesados en conocer los detalles de ellos cuando hacemos consultas al diccionario de la base de datos. Por ejemplo si quieres conocer un resumen por tipo de objetos pero solo te interesan los usuarios propios del negocio, entonces debemos excluir los esquemas que crea Oracle por defecto o para sus funcionalidades. Revisando la documentación en línea de Oracle se pueden conseguir varios ejemplos de los usuarios que deberíamos excluir en nuestras consultas sino queremos verlos. A continuación les muestro la  lista de los usuarios que excluyo en mis consultas de monitoreo: owner not in ('ANONYMOUS','AUDSYS','CTXSYS','DBSNMP','LBACSYS','MDSYS','OLAPSYS','ORDDATA','ORDPLUGINS','ORDSYS

Como encontrar el nombre y la versión del cluster de Oracle RAC.

Hay momentos que preguntas sencillas se convierten en difíciles , y más cuando se esta comenzando. Uno de esos casos puede ser cuando te preguntan el nombre o la versión del cluster de un RAC. * Obtener el nombre del cluster: cd $GRID_HOME/bin cemutlo -n ó cd $GRID_HOME/bin olsnodes -c * Para obtener la versión del cluster. crsctl query crs softwareversion [node_name] Si se omite [node_name]  se muestra la versión del nodo local.

NULLIF, NVL, NVL2, COALESCE Functions

create table hr . dummy (id number , name varchar2 ( 32 ), bdate date ) tablespace users; insert into hr . dummy (id,name, bdate ) values ( 3 , 'Carl' ,SYSDATE); insert into hr . dummy (id,name, bdate ) values ( 7 , 'Gary' ,SYSDATE); insert into hr . dummy (id,name, bdate ) values ( 2 ,NULL,SYSDATE); insert into hr . dummy (id,name, bdate ) values ( 6 ,NULL,SYSDATE); insert into hr . dummy (id,name, bdate ) values ( 1 , 'Anna' , SYSDATE); insert into hr . dummy (id,name, bdate ) values ( 5 , 'Fitzgerald' ,SYSDATE); insert into hr . dummy (id,name, bdate ) values ( 4 ,NULL,SYSDATE); insert into hr . dummy (id,name, bdate ) values ( 0 ,NULL,SYSDATE); commit; NVL2  lets you determine the value returned by a query based on whether a specified expression is null or not null NVL just return something whether expression is NULL. SELECT NAME, NVL2(NAME, 'Registered' , 'Pen