viernes, 23 de febrero de 2024

Oracle Base de Datos y Listener Automatizar el inicio (Oracle Auto Start)

 Oracle Base de Datos y Listener Automatizar el inicio

 Ya sabemos que cada vez que enviamos reiniciar el servidor de la base de datos el servicio no levanta de forma automática por lo que es necesario realizarlo de forma manual. Este proceso se vuelve tedioso cuando están en ventanas de mantenimiento y tienes múltiples servidores de base de datos que reiniciar.

Aquí les comparto como lo pueden hacer que sea de forma automática el inicio, cabe indicar que este articulo aplica para a base de datos standalone.

Antes de empezar debemos de tener los siguientes datos:

 

ORACLE_HOME

/u01/app/oracle/product/19.3/db_home

DB Name

orcl

Nombre Listener

LISTENER

Archivo Oratab

/etc/oratab

 

1.      Editar archive /etc/oratab cambiar flag de :N a :Y

nano /etc/oratab

 Como debe de quedar

orcl:/u01/app/oracle/product/19.3/db_home:Y

 2.      Crear archivo dboracle

nano /etc/init.d/dboracle

 Pegar código reemplazado los valores según tu configuración

#!/bin/sh
# chkconfig: 345 99 10
# description: Oracle auto start-stop script.
#
# Set ORA_HOME to be equivalent to the $ORACLE_HOME
# from which you wish to execute dbstart and dbshut;
#
# Set ORA_OWNER to the user id of the owner of the 
# Oracle database in ORA_HOME.
 
 
ORA_HOME=/u01/app/oracle/product/19.3/db_home
ORA_OWNER=oracle
 
 
if [ ! -f $ORA_HOME/bin/dbstart ]
then
    echo "Oracle startup: cannot start"
    exit
fi
 
 
case "$1" in
    'start')
        # Start the Oracle databases:
        # The following command assumes that the oracle login 
        # will not prompt the user for any values
        # Remove "&" if you don't want startup as a background process.
        su - $ORA_OWNER -c "$ORA_HOME/bin/lsnrctl start LISTENER" &
        su - $ORA_OWNER -c $ORA_HOME/bin/dbstart &
        touch /var/lock/subsys/oracle
        ;;
    'stop')
        # Stop the Oracle databases:
        # The following command assumes that the oracle login 
        # will not prompt the user for any values
        Su - $ORA_OWNER -c $ORA_HOME/bin/dbshut
        Su - $ORA_OWNER -c "$ORA_HOME/bin/lsnrctl stop LISTENER"
        rm -f /var/lock/subsys/oracle
        ;;
esac
exit

 

3.      Permisos al archivo dboracle

chmod 750 /etc/init.d/dboracle

 

4.      Asociar  dboracle como servicio del sistema operativo

systemctl enable dboracle
chkconfig dboracle on
service dboracle start

 

 

5.      Reiniciar el sistema para probar

Init 6

 

Espero les sirva para optimizar sus tiempos de manteniento

jueves, 9 de abril de 2020

Comprimir tablas Oracle -Compress Table

Comprimir tablas es una forma eficiente de reducir espacio de almacenamiento utilizado por los segmentos de tablas, indices, particiones , etc.

Oracle ha introducido este concepto desde las 9i y conforme han salido las nueva versiones ha ido incluyendo mejoras, pero como toda buena característica de Oracle solo aplica para version enterprise.

Se puede aplicar según sea la necesidad y donde se pueda aplicar, como por ejemplo en datos que representen historia así como particiones.

La compresión de las tablas se puede realizar en la creación o después de la creación.

Creacion
Vamos a realizar el ejemplo de crear dos tabla una sin compresión y otra con compresión.
--SIN COMPRESION
CREATE TABLE TEST_TAB_NOCOMPRESS(    NUMERO  INTEGER,    DATO    VARCHAR2(600),    FECHA   DATE) TABLESPACE USERS;
--COMPRESA 
CREATE TABLE TEST_TAB_COMPRESS(    NUMERO  INTEGER,    DATO    VARCHAR2(600),    FECHA   DATE) TABLESPACE USERS COMPRESS;
Realizaremos la inserción de datos.
SET TIMING ON
insert into TEST_TAB_NOCOMPRESS (NUMERO,DATO,FECHA) SELECT ROWNUM, LPAD('X',500,'A'),SYSDATE FROM DUAL CONNECT BY LEVEL <=1000000;
1000000 rows created.
Elapsed: 00:01:01.05

insert into TEST_TAB_COMPRESS (NUMERO,DATO,FECHA) SELECT ROWNUM, LPAD('X',500,'A'),SYSDATE FROM DUAL CONNECT BY LEVEL <=1000000;
1000000 rows created.
Elapsed: 00:01:04.47
--actualizamos estadisticas
analyze table TEST_TAB_NOCOMPRESS compute statistics;analyze table TEST_TAB_COMPRESS compute statistics;

Revisemos el espacio usado y la cantidad de registros

Espacio usado
SELECT SEGMENT_NAME,  BYTES/(1024*1024)MB FROM DBA_SEGMENTS WHERE SEGMENT_NAME IN('TEST_TAB_NOCOMPRESS','TEST_TAB_COMPRESS') 

SEGMENT_NAME          MB 
TEST_TAB_NOCOMPRESS  610 
TEST_TAB_COMPRESS    528
Registros
SELECT TABLE_NAME, NUM_ROWS, COMPRESSION, COMPRESS_FOR  FROM DBA_TABLES WHERE TABLE_NAME IN('TEST_TAB_NOCOMPRESS','TEST_TAB_COMPRESS')
TABLE_NAME         NUM_ROWS COMPRESSION COMPRESS_FOR 
TEST_TAB_NOCOMPRESS 1000000         DISABLED  
TEST_TAB_COMPRESS 1000000         ENABLED          BASIC
Como nos hemos dado cuenta la tabla compresa tiene 82M menos que sin compresión un 13% menos.
No es mucho verdad? pues si por lo único que tiene la tabla TEST_TAB_COMPRESS  es un pctfree 0 que hace uso al máximo del bloque  para los registros.

Para poder hacer mas efectivo la compresión debemos hacer efectiva la compresión de los datos con un MOVE COMPRESS.

--COMPRIMIR
ALTER TABLE TEST_TAB_COMPRESS MOVE COMPRESS;
--Vemos el tamaño reducido 
SELECT SEGMENT_NAME,  BYTES/(1024*1024)MB FROM DBA_SEGMENTS WHERE SEGMENT_NAME IN('TEST_TAB_NOCOMPRESS','TEST_TAB_COMPRESS')
SEGMENT_NAME         MB 
TEST_TAB_COMPRESS    12 
TEST_TAB_NOCOMPRESS 610

Ahora si podemos ver que es mas efectiva la compresión de los datos de 12M llegando a un 98% de reducción de la tabla no compresa. Esta optimización dependerá de los datos y según  la empresa o negocio va a variar.

Alterar tabla para la compresion.

Si queremos comprimir una tabla lo hacemos con el MOVE COMPRESS.

--COMPRIMIR 
ALTER TABLE TEST_TAB_NOCOMPRESS MOVE COMPRESS;

SELECT SEGMENT_NAME,  BYTES/(1024*1024)MB FROM DBA_SEGMENTS WHERE SEGMENT_NAME IN('TEST_TAB_NOCOMPRESS','TEST_TAB_COMPRESS')

SEGMENT_NAME         MB 
TEST_TAB_COMPRESS 12 
TEST_TAB_NOCOMPRESS 12


Consideraciones

  • Solo para ediciones enterprise
  • No esta diseñada para base de datos OLTP(BD Transaccionales) sino para cargas directas de base de datos OLAP(BD para analitica de datos)
  • En version 11g o superior se implementa la compresion OLTP. Esto permite realizar transacciones DML.
  • La compresion de los datos varia según los datos.

viernes, 17 de mayo de 2019

Quest Spotight Oracle DB & OS Windows/Linux

Con Quest Spotlight puedes monitirear el estado actual de todos los componentes que conforman la base de datos asi como como los componentes del sistema operativo.

Spotlight es una gran herramienta para de forma proactiva ver el estado actual del rendimiento de nuestras bases de datos en entornos Single o RAC. Como sabemos las base de datos funcionan sobre un host con sistema operativo del cual tambien se depende que el motor de base de datos tenga un buen rendimiento, por ello es que el Spotlight tambien puede monitorear el rendimiento del host para los sistemas operativos Windows, Linux y Unix.

  • Spotlight Oracle
  • Spotlight Oracle Data Guard
  • Spotlight Oracle RAC
  • Spotlight UNIX
  • Spotlight Windows



SPOTLIGHT Oracle
Cuando monitoreamos la base de datos Oracle, vemos en tiempo real  el comportamiento de todos los componentes de procesos y memoria que conforman la arquitectura de base de datos Oracle.

Componentes de base de datos


Consola de monitor Spotlight Oracle

En la pantalla Spotlight Oracle vemos varios paneles que muestran información de los componentes de la arquitectura de base de datos, estos son:

  • Service Panel: El panel de Servicio indica el estado de las comunicaciones de Oracle entre el cliente y el servidor.
  • Host Panel: El panel del host muestra las siguientes métricas para la máquina que reside la base de datos Oracle como CPU Usage, Run Queue, etc.
  • Server Processes: Indica el estado de los procesos del servidor de Oracle que realizan actividades de la base de datos en nombre de los usuarios finales y que median las conexiones de la base de datos.
  • SGA Panel: Muestra detalles de áreas de memoria específicas dentro del área global del sistema (SGA). El SGA es un área de la memoria de proceso compartida o común que se utiliza para almacenar en caché los datos, sentencias de SQL, procedimientos y otras estructuras utilizadas con frecuencia.
  • Background Processes Panel: Monitorea los procesos Database Writer (DBWRn), The Recovery Writer (RVWRn), The Log Writer (LGWRn),  The Archiver (ARCHn),  Data Guard Overhead and Apply Lag y Predictive Diagnostics.
  • Disk Storage Panel: Comportamiento de la base de datos con el disco.


Cada unos de estos componentes tienen métricas predefinidos y dependiendo el valor capturado el color varia indicando una novedad, siendo verde normal, celeste mas arriba de lo normal, amarillo fuera de los normal, naranja casi critico  y rojo critico. Estas métricas son personalizables ya que que una base de datos no es igual a otra. Por ejemplo no vamos aplicar la misma métrica de BlockRead una base de datos OLTP que a una OLAP.

En este ejemplo podemos ver como podemos editar la métrica SQL Parse, 

SPOTLIGHT Windows
Aqui vamos a monitorea los componentes asociados al sistema operativo como memoria, procesador, disco, E/S, red entre otros.

Arquitectura de componentes de un sistema Windows


 Consola de monitor Spotlight Windows
En la pantalla Spotlight Windows vemos varios paneles que muestran información de los componentes de la arquitectura de base de datos, estos son:
System Panel: Muestra información sobre el sistema operativo de la máquina a la que está conectado actualmente.
  • Network Panel: Panel: muestra el número total de usuarios conectados y la velocidad a la que el sistema envía y recibe los paquetes (Usuarios de redes de Windows: muestra la cantidad de clientes conectados a este sistema)
  • Event Log: Proporciona un enlace al desglose del registro de eventos: Le alerta sobre los elementos que han alcanzado el estado de alarma según su configuración de alarmas del registro de eventos. El icono del botón muestra el número de alarmas del registro de eventos que se han activado pero que aún no se han eliminado. Puede reconocer y borrar alarmas a través del registro de eventos desplegable.
  • CPU Panel:  Muestra información de procesador y carga para el sistema Windows: CPUs, Speed, Type, Uptime, Total CPU Used, Threads
  • Memory Panel: Muestra información detallada sobre el sistema de Windows .: RAM total: muestra la cantidad de RAM real (memoria de acceso aleatorio) en la máquina. Libre (memoria física): muestra la cantidad de memoria física disponible para las aplicaciones. Pct libre (memoria física): muestra el porcentaje de memoria física que está actualmente disponible para las aplicaciones.
  • Paging Files Panel: Muestra información sobre el espacio de paginación para todos los archivos de paginación activos en el sistema.
  • Disks Panel: Muestra información para cada disco lógico en el sistema : La letra de unidad, El tamaño , el disco (MB), El espacio utilizado en el disco (MB).
  • Files Panel: Muestra la cantidad de archivos cuyo tamaño de archivo está siendo rastreado actualmente por Spotlight en Windows.
En cada uno de los componentes del panel podemos ver mas a detalle :

Actividad el Disco Físico

Actividad el Disco Lógicos

Actividad el Disco Fisico/Lógico


En la actividad del disco podemos ver el comportamiento tanto los discos lógicos como físicos. Dentro de este comportamiento vemos metricas como Disk Read, Disk Write, Disk IO, Disk Load, Disk Transfer Time.


Como vemos el Spotlight es uan herramiente muy útil no solo para motores de base de datos oracle, sino para servidores windows, linux y unix. Asi podemos ver un comportamiento en conjunto de todos los sistemas que conformar componen nuestro servicios de aplicaciones y base de datos.

martes, 18 de diciembre de 2018

Mejora el rendimiento PL/SQL con PLSQL_CODE_TYPE=NATIVE

En la base de datos Oracle desde la version 9i y 10g se incluyo el tipo  de compilación  Native, pero su implementación requería de la ayuda de un DBA para la incorporación de un compilador C externo y la configuración del repositorio donde se almacenarían estas compilaciones.

Interpreted: El codigo PL/SQL en su compilación es almacenado de forma intermedia y es necesario interpretarlo cada vez que se ejecute. Esta es una compilación no nativa del motor de base de datos la cual se almacena de forma intermedia.

Native: el codigo  PL / SQL en su compilación es almacenado en un código nativo que no necesita ser interpretado en tiempo de ejecución. En comparación, el código que no se compila de forma nativa se almacena en una forma intermedia que debe interpretarse en tiempo de ejecución.

Desde la version 11g el tipo Native se  simplifcó a tal punto que es implementado a nivel del sistema o sesión. El repositorio se lo incluyó dentro de la base de datos.

Debido a que el código compilado de forma nativa no necesita ser interpretado en tiempo de ejecución, la expectativa es que se ejecutará más rápido. Sin embargo, la compilación nativa solo se aplica al código de procedimiento en una unidad de programa PL/SQL, no a cualquier sentencia de SQL. Como resultado, las mejoras en el rendimiento que se deben realizar realmente dependen de la cantidad de código de procedimiento existente en relación con el código SQL. Como mínimo, una unidad de programa compilada de forma nativa que sea SQL pesada debe ejecutarse al menos tan rápido como su contraparte no compilada de forma nativa. A medida que aumenta el volumen de código de procedimiento, más rápido debería ser el código compilado de forma nativa.

Como se indico este parametro puede ser modificado a nivel del sistema "Alter system" o a nivel de la sesion "Alter session", cabe indicar que el parámetro por defecto de PLSQL_CODE_TYPE es "INTERPRETED", podemos cambiar el parametro en cualquier momento del tiempo, los PLSQL compilados antes de cambiar el parametro quedaran con el tipo que se compiló, para actualizar al tipo del parámetro establecido se deberá recompilar el PLSQL.

Ahora si explicado, realizaremos un ejemplo para comprar rendimientos. Vamos a crear dos funciones con el mismo contenido F_INTERPRETED_1 y F_NATIVE_1 pero se se compilaran con tipo Interpreted y Native respectivamente.

CREATE TABLE DATOS_TEST AS SELECT * FROM ALL_OBJECTS WHERE ROWNUM<=50;

--Objetos PL/SQL INTERPRETED
alter session set plsql_code_type=interpreted;

CREATE OR REPLACE FUNCTION F_INTERPRETED_1 (P_VALOR NUMBER,P_VALOR_2 NUMBER)RETURN NUMBER IS
L_VALOR_N  NUMBER;
L_VALOR_PROM_N  NUMBER;
BEGIN
    for i in 1..P_VALOR_2 loop
        L_VALOR_N:=L_VALOR_N+I;
        L_VALOR_PROM_N:=L_VALOR_N/I;
    end loop;
    RETURN L_VALOR_PROM_N;
END;
/

CREATE OR REPLACE FUNCTION F_INTERPRETED_2 RETURN NUMBER IS
L_VALOR_N  NUMBER;
L_VALOR_N2 NUMBER;
BEGIN
    FOR C_DAT IN (SELECT * FROM DATOS_TEST)LOOP
        IF MOD(C_DAT.OBJECT_ID,2)=0 THEN
            L_VALOR_N:=L_VALOR_N+C_DAT.OBJECT_ID+ C_DAT.DATA_OBJECT_ID;
        ELSE
            L_VALOR_N:=L_VALOR_N+C_DAT.OBJECT_ID+ C_DAT.DATA_OBJECT_ID-2;
        END IF;
        IF C_DAT.OBJECT_NAME LIKE '%AS%' THEN
            L_VALOR_N:=L_VALOR_N-5;
        END IF;        
        IF MOD(C_DAT.DATA_OBJECT_ID,2)=0 THEN
            SELECT AVG(OBJECT_ID) INTO L_VALOR_N2 FROM DATOS_TEST;
            L_VALOR_N:=L_VALOR_N+L_VALOR_N2;
        ELSE
            SELECT MIN(OBJECT_ID) INTO L_VALOR_N2 FROM DATOS_TEST;
            L_VALOR_N:=L_VALOR_N-L_VALOR_N2;
        END IF;         
    END LOOP;
    RETURN L_VALOR_N;
END;
/


--Objetos PL/SQL NATIVE
alter session set plsql_code_type=native;

CREATE OR REPLACE FUNCTION F_NATIVE_1 (P_VALOR INTEGER,P_VALOR_2 INTEGER)RETURN NUMBER IS
L_VALOR_N  NUMBER;
L_VALOR_PROM_N  NUMBER;
BEGIN
    for i in 1..P_VALOR_2 loop
        L_VALOR_N:=L_VALOR_N+I;
        L_VALOR_PROM_N:=L_VALOR_N/I;
    end loop;
    RETURN L_VALOR_PROM_N;
END;

CREATE OR REPLACE FUNCTION F_NATIVE_2 RETURN NUMBER IS
L_VALOR_N  NUMBER;
L_VALOR_N2 NUMBER;
BEGIN
    for c_dat in (select * from datos_test)loop
        if mod(c_Dat.OBJECT_ID,2)=0 then
            L_VALOR_N:=L_VALOR_N+c_dat.OBJECT_ID+ c_dat.DATA_OBJECT_ID;
        else
            L_VALOR_N:=L_VALOR_N+c_dat.OBJECT_ID+ c_dat.DATA_OBJECT_ID-2;
        end if;
        if c_Dat.OBJECT_NAME like '%AS%' then
            L_VALOR_N:=L_VALOR_N-5;
        end if;        
        if mod(c_Dat.DATA_OBJECT_ID,2)=0 then
            select avg(OBJECT_ID) into L_VALOR_N2 from datos_test;
            L_VALOR_N:=L_VALOR_N+L_VALOR_N2;
        else
            select min(OBJECT_ID) into L_VALOR_N2 from datos_test;
            L_VALOR_N:=L_VALOR_N-L_VALOR_N2;
        end if; 
        
    end loop;
    RETURN L_VALOR_N;
END;
/


Veamos ahora como quedo registro en la base de datos con el SQL "select name, type,plsql_code_type from USER_PLSQL_OBJECT_SETTINGS"

NAMETYPEPLSQL_CODE_TYPE
F_INTERPRETED_1FUNCTIONINTERPRETED
F_INTERPRETED_2FUNCTIONINTERPRETED
F_NATIVE_1FUNCTIONNATIVE
F_NATIVE_2FUNCTIONNATIVE

Como vemos se han copilado la funciones e identificamos que se compilaron con como INTERPETRED y NATIVE.

Ahora realizaremos el llamado a la funciones para ver los tiempos de ejecución.

Comparación F_INTERPRETED_1 con F_NATIVE_1
set timing on
declare
l_val   integer;
begin
  for n in 1..2000 loop
    l_val:=F_INTERPRETED_1  (12,100000);
  end loop;
end;
/
Procedimiento PL/SQL terminado correctamente.
Transcurrido: 00:00:18.64

declare
l_val   integer;
begin
  for n in 1..2000 loop
    l_val:=F_NATIVE_1       (12,100000);
  end loop;
end;
/
Procedimiento PL/SQL terminado correctamente.
Transcurrido: 00:00:14.12

Comparación F_INTERPRETED_2 con F_NATIVE_2
set timing on
declare
 l_val   integer;
begin
 for n in 1..9000 loop
   l_val:=F_INTERPRETED_2;
 end loop;
end;
/
Procedimiento PL/SQL terminado correctamente.
Transcurrido: 00:00:21.46

declare
l_val   integer;
begin
  for n in 1..9000 loop
    l_val:=F_NATIVE_2;
  end loop;
end;
/
Procedimiento PL/SQL terminado correctamente.
Transcurrido: 00:00:19.72

A simple vista los tiempos de ejecución disminuyen con la compilación tipo NATIVE. Ahora veamos el comparativo de la compilación INTERPRETED VS NATIVE.

FUNCIONTiempo Ejecucion Seg.Reducción
INTERPRETEDNATIVEINTERPRETEDNATIVESegundos%
F_INTERPRETED_1F_NATIVE_118,6414,124,5224,25 
F_INTERPRETED_2F_NATIVE_221,4619,721,748,11 





Como vemos en el comparativo, el tiempo de ejecución se reduce en la ejecución de los PLSQL compilados del tipo NATIVE.

La conclusión de este ejercicio que vamos a obtener un mejor rendimiento de nuestros PL/SQL si los compilamos de forma nativa. Para aplicar el cambio del parametro de forma global debemos configurar el parametro del system:
ALTER SYSTEM SET PLSQL_CODE_TYPE=NATIVE SCOPE=BOTH;

Deben de tener en cuenta que para que su código anterior al cambio del parametro quede establecido con el nuevo parámetro debemos de compilara de nuevo nuestros objetos PL/SQL.

lunes, 18 de septiembre de 2017

Oracle Lage Page Support - Para windows

Saludos,

Para los que se preguntan, que parametros del sistema operativo windows podemos modificar para mejorar el rendimiento de nuestras base de datos, pues aqui les va uno:

Large Page Support:
Large Pager suport (LPS) o Soporte de Paginas Largas  es una caracteristica implementada para versiones 10.1 o superior para versiones en sistemas operativos windows server 2003 o superior, esta caracteristica permite a la instancia de base de datos Oracle poder soportar manejo de paginas grandes en memoria. Cuando habilitamos LPS las n Cpu's podran acceder a el buffer de la base de datos Oracle en la RAM mas rapidamente, como lo hace? en si es por que los procesadores en vez de usar memorias pequeñas que van desde 4k, se le dice que maneje tamañoas de 2Mb a 4Mb de buffer para las base de datos.

Como se habilita?
Tenermos que seguir los siguientes pasos:
  1. Habilitar en el regedit ORA_LPENABLE 
  2. Otorgar el permiso al usuario "Lock pages in memory"
  3. Reiniciar todo el servidor

1 Habilitar en el regedit ORA_LPENABLE
Abrimos el regedit y nos vamos a la seccion donde esta el home de la instalacion de la base de datos Oracle HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDB12Home2 y agregamos un nuevo valor de cadena REG_SZ de nombre ORA_LPENABLE y valor 1



Nota: Para saber con seguirad donde agregar el parametro ORA_LPENABLE puden ver la dirección  viendo el archivo oracle.key ubicado en  ORACLE_HOME\BIN\oracle.key

2 Otorgar el permiso al usuario "Lock pages in memory"
  • En el panel de control hacemos click a Local Security Policy o Directiva de Seguirdad Local, de ahi ir a "Security Settings\Local Security\User Rights Assignment"
 

  • Hacer bloble click en Lock pages in memory, en la pestaña de "Local Security Settings window" damos click en add User o Group.Seleccionamos el usuario de inicio del servicio Oracle. En mi caso yo realice la instalacion con el usuario Oracle, otros podran haber establceido el system.
 
 Nota: El usuario que vamos a buscar es con quien configuramos el inicio de sesion de los servicios Oracle, por lo general en la instalación usamos el usuario oracle, pero pueden verificar viendo en la seccion de los servicio "services.msc" buscamos  Oracle y vemos  quien es el que inicia la sesion.

3 Reiniciar todo el servidor
Reiniciamos todo el servidor



Y listo, hemos configurado el LPS, con esto se ba a obtener un mejor rendimiento de nuestras instancias Oracle que corren sobre Windows, sobre todo en entornos de instancias de varios GB.

Precauciones:
No usar el parametro de base de datos LOCK_SGA cuando el LPS esta habilitado ya que esto genera error en el inicio de la base de datos.