viernes, 1 de diciembre de 2023

Instalar Oracle 19C en Red Hat Linux 8

 Saludos,

Este blog explicare paso a paso los requisitos e instalación de la base de datos Oracle 19C para Red Hat Linux 8 (RHL8).

Recursos

  • IP:192.168.20.23
  • HOST:oracledb01
  • SO RHL8
  • 10G Ram 4Cpus y 200GB de disco
  • Usuario:root


Pre-Requisitos y Configuraciones

1.     Preparar Sistema Operativo

Vemos la versión

sudo subscription-manager list

 

sudo yum update



Instalar editor nano

sudo yum install nano



2.     Instalar componente para la instalación grafica

En mi caso tengo RHL sin la interfaz grafica por lo que necesito instalar este componente pero Si tiene GUI(escritorio con interfaz gráfica GNOME o KDE) no es necesario realizar esta instalación.



En mi caso no tengo GUI ni X11-forwarding, X11-forwarding este componente nos permitirá vía shh ejecutar la instalación grafica de Oracle con el cliente MobaXTerm sin necesidad de un escritorio  y luego de la instalación necesitamos reiniciar.

sudo yum install xterm* xorg*

sudo reboot


Nota: Debes de tener la suscripción activa o crear una cuenta gratis en redhat para que puedas registrar. https://access.redhat.com/discussions/6394941

3.     Desactivar Firewalld

Para nuestro ejercicio vamos a desactivar el firewall de redhat pero en un escenario real es mejor agregar las reglas de input a los puertos que usa oracle

sudo systemctl stop firewalld

sudo systemctl disable firewalld




4.     Nombre del servidor

Editar el archivo /etc/hosts, vamos a indicar el nombre del servidor el cual será oracledb01.endara.com.ec para que resuelva la ip 192.168.20.23

sudo nano /etc/hosts



También lo realizamos con el comando hostnamectl

sudo hostnamectl set-hostname oracledb01.endara.com.ec

sudo reboot


Nota: Si la instalación la realizas sobre instancias en la nube debe de validar los parámetros de initcloud para que el nombre no cambie.

5.     Prerequisitos Oracle

Instalar desde yum en linea

sudo yum install -y oracle-database-preinstall-19c


O descarga el oracle-database-preinstall-19c-1.0-2.el8.x86_64.rpm de los pre requisitos y lo instalamos de forma local

Bounce | Red Hat Customer Portal

curl -o /tmp/oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm https://public-yum.oracle.com/repo/OracleLinux/OL8/appstream/x86_64/getPackage/oracle-database-preinstall-19c-1.0-2.el8.x86_64.rpm

yum -y localinstall /tmp/oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm





6.     Usuario oracle y parametros

Setear la clave del Usuario oracle

sudo passwd oracle



Modificar archivo /etc/selinux/config y cambiar el parámetro SELINUX=disabled

sudo nano /etc/selinux/config



7.     Crear oracle home y dar los permisos

Vamos a crear todo el directorio requerido para la instalación de los archivos binarios de Oracle y donde se alojaran los archivos de la base de datos.

mkdir -p /u01/app/oracle/product/19.3/db_home
mkdir -p /u02/oradata
chown -R oracle:oinstall /u01
chown -R oracle:oinstall /u02
chmod -R 775 /u01
chmod -R 775 /u02



1.     Variables de ambiente

Crear las variables de ambiente para que se carguen en la sesión del usuario oracle.

su - oracle

 Creamos directorio donde alojaremos el script

mkdir /home/oracle/scripts

 Creamos archivo setEnv.sh para establecer las variables

nano /home/oracle/scripts/setEnv.sh

 Pegamos la configuración

export TMP=/tmp
export TMPDIR=$TMP
export ORACLE_HOSTNAME=oracledb01.mavesa.com.ec
export ORACLE_UNQNAME=orcldb
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/19.3/db_home
export ORA_INVENTORY=/u01/app/oraInventory
export ORACLE_SID=orcldb
export PDB_NAME=noracle
export DATA_DIR=/u02/oradata
export PATH=/usr/sbin:/usr/local/bin:$PATH
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib

 Agregamos la linea en el bash profile del usuario oracle para que al iniciar sesión cargue las variables

echo ". /home/oracle/scripts/setEnv.sh" >> /home/oracle/.bash_profile
echo "export PATH" >> /home/oracle/.bash_profile

 

Con Usuario root cambiamos los permisos de /home/oracle/scripts/setEnv.sh

sudo chown -R oracle:oinstall /home/oracle/scripts
sudo chmod u+x /home/oracle/scripts/setEnv.sh


Para comprobar que las variables cargan correctamente iniciamos como usuario oracle y vemos la variable ORACLE_HOME, si muestra valor esta todo OK

su oracle
echo $ORACLE_HOME


9.     Descargar el instalador de oracle, subirlo al servidor y descomprimir

Descargar en la siguiente dirección

https://www.oracle.com/dz/database/technologies/oracle19c-linux-downloads.html


En una sesión del usuario oracle


Una vez descargado lo subimos al servidor con la ayuda del MobaXterm o un winscp


Nos dirigimos a la ruta del oracle home : /u01/app/oracle/product/19.3/db_home





Descomprimimos el zip

cd /u01/app/oracle/product/19.3/db_home
unzip -oq LINUX.X64_193000_db_home.zip


Editamos el archivo cvu_config y cambiamos el parámetro CV_ASSUME_DISTID=OEL8.9

nano $ORACLE_HOME/cv/admin/cvu_config


Instalacion

 

1.     Habilitar permisos X11


Con el usuario oracle realizaremos la instalación, pero antes vamos a con validemos si tenemos acceso a la opción grafica X11 que en unos de los primeros paso hablitamos.

xhost +

En el mensaje anterior indica que ninguna ip esta habilitada para ejecutar el xhost, la procederemos agregar

DISPLAY=192.168.20.29:0.0; export DISPLAY
echo $DISPLAY
xhost +

 


2.     Ejecutar asistente de instalación

Ahora si, empezamos la ejecución de la instalación desde la ruta /u01/app/oracle/product/19.3/db_home

cd /u01/app/oracle/product/19.3/db_home
./runInstaller


3.     Tipo de instalación de base de datos

Vamos a instalar el software y crear la base de datos


4.     Seleccionar clase de la instancia.

Pueden seleccionar la Desktop class si están haciendo una practica en su lapto o desktop, en mi caso usar la Server Class(Mas pasos de instalación)


5. Seleccionar la edición. 


6.     Seleccionar el directorio base de oracle. 



7.     Tipo de configuración

Dependiendo del tipo de transacciones seleccionamos Genera / Transaccional o Data Warehousing

8.     DBName y  SID


 9.     Configuración instancia

Seleccionamos la memoria recomendada, charset (en mi caso uso WE8MSWIN1252) e instalo el esquema de ejemplo.


 

10.     Configuración almacenamiento

Es una buena practica separa la unidad de binarios oracle y datos.



 11.     Credenciales y seguridades



 

12.     Ejecuciones desde el root

Se necesitaran realizar ejecuciones via ssh con privilegios root


13.     Validaciones antes de la instalación

En mi caso me sale alerta de memoria, pero en este caso omitiré


14.     Instalación en progreso

Previo a esto ingresamos las credenciales de root, damos click en yes para que se ejecuten los scripts ssh con privilegios root


Instalación finalizada



Probar la conexión 


Listo, todo funcionando!!!

sábado, 20 de noviembre de 2021

Consumir Servicios Web desde la base de datos Oracle (Webservice)

Desde la version 10g Oracle permite desde la base de datos poder consumir servicios web con el paquete utl_http .

Esto es una gran utilidad y tiene mucha utilidad, vamos a realizar un ejemplo en el que vamos a consultar un listado de paises en formato JSON desde esta dirección:

Para empezar vamos a tener que :
  • Dar los permisos necesarios utl_http  de ejecución 
  • Crear la reglas de ACL para consumir la pagina

Permiso UTL_HTTP usuario VICTOR
GRANT EXECUTE ON UTL_HTTP TO VICTOR;

Regla ACL
--CREAR ACL ACL_WEBSERVICE_TEST
begin
    DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(acl => 'acl_webservice_test.xml',
    description => 'pruebas de consumos de servicios web',
    principal => 'PUBLIC',
    is_grant => true,
    privilege => 'connect'
    );
end;
--Dar permiso para consumir la direccion COUNTRY.IO por el puerto 80
BEGIN
DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(acl => 'acl_webservice_test.xml',
host => 'country.io',
lower_port => 80);
commit;
END;


Ahora si, procedamos a realiza la rutina para la lectura de los datos, se puede traer todo de una sola o por partes, pero es preferible por parte ya que el request puede devolver un valor muy grande y resultado se cortará.

--De una sola
SELECT UTL_HTTP.REQUEST('http://country.io/names.json') FROM DUAL;

--Por partes
DECLARE
   L_HTML    UTL_HTTP.HTML_PIECES;
BEGIN
   L_HTML := UTL_HTTP.REQUEST_PIECES ( 'http://country.io/names.json', 100 );
   DBMS_OUTPUT.PUT_LINE ( L_HTML.COUNT || ' piezas.' );
   IF L_HTML.COUNT < 1 THEN
      DBMS_OUTPUT.PUT_LINE ( 'SIN DATOS' );
   ELSE
      FOR i IN 1 .. L_HTML.COUNT LOOP
         DBMS_OUTPUT.PUT_LINE ( L_HTML ( i ) );
      END LOOP;
   END IF;
END;

Ahora el mismo ejemplo pero ahora lo enviamos a una tabla, para ello crearemos una tabla para almacenarlo.

CREATE TABLE HTTP_PAISES 
(
    DATO CLOB
);
--Almacenar el resultado en la tabla HTTP_PAISES
DECLARE
   L_HTML   UTL_HTTP.HTML_PIECES;
   L_DATO   CLOB;
BEGIN
   L_HTML := UTL_HTTP.REQUEST_PIECES ( 'http://country.io/names.json', 100 );
   DBMS_OUTPUT.PUT_LINE ( L_HTML.COUNT || ' piezas.' );
   IF L_HTML.COUNT < 1 THEN
      DBMS_OUTPUT.PUT_LINE ( 'SIN DATOS' );
   ELSE
      FOR i IN 1 .. L_HTML.COUNT LOOP
         L_DATO:=L_DATO||L_HTML ( i );
         DBMS_OUTPUT.PUT_LINE ( L_HTML ( i ) );
      END LOOP;
      INSERT INTO HTTP_PAISES(DATO)VALUES(L_DATO);
      COMMIT;
   END IF;
END;
--LISTA LOS PAISES
SELECT PAIS
FROM   HTTP_PAISES t
       CROSS JOIN
       JSON_TABLE(
         t.DATO,
         '$.*'
        COLUMNS (PAIS PATH '$')
       )T_LIST;


Tienes in ejemplo sencillo de como consumir servicios web desde la base y espero te sirva.

Si quieres ver el uso de JSON en Oracle mira el siguiente blog.

https://oracle-y-yo.blogspot.com/2021/04/leer-datos-json-como-tabla-en-oracle.html


jueves, 18 de noviembre de 2021

Oracle Tablespaces Smallfile y Bigfile

Saludos,  

Como ya sabemos los tablespaces son parte de la estructura lógica de la base de datos que puede tener 1 o mas datafiles. Los datafiles son parte de la estructura física de la base de datos que puede estar asignado a 1 tablespace.

Hasta antes de la versión 10g solo existía 1 tipo de Tablespaces conocidó como SmallFile. El nuevo tipo de Tablespaces incluido desde la versión 10g es BigFile.



TABLESPACES SMALLFILE.- Tablespaces tradicional por defecto de Oracle y podrá tener uno o varios Datafile. El Datafile su tamaño será limitado por el parámetro db_block_size(2k, 4k, 8k, 16k y 32k) que se define al crear la base de datos.


TABLESPACES BIGFILE.- Este tipo de tablespace aparece de la versión de la 10g y  presentan la ventaja de tener datafiles de mayor tamaño de hasta 128Tb(Dependera sistema de archivos) pero con la restricción que el tablespace solo puede tener 1 datafile.


Habiendo dicho esto cual seria la ventaja entre SMALLFILE y BIGFILE?

SmallFile fue la primera versión para los Tablespaces y se recomienda su uso para sistemas de archivos que manejan tamaños limitados.

BigFile fue introducido desde la versión 10g y solo puede contener un solo datafile que puede tener un gran tamaño.

Por ejemplo si tenemos una base de datos db_block_size de 8k y necesitamos un tablespace de de tamaño de 1Tb  usando SmallFile vamos a tener que asignar 32 datfiles de 32Gb para poder alcanzar la capacidad de 1Tb mientras que con BigFile solo necesitamos agregar 1 solo de 1Tb el cual puede seguir aumentando de tamaño.

Tablespaces SmallFile

CREATE TABLESPACE TS_SMALLFILE DATAFILE 
  '/u01/app/dbfiles/orcl/ts_smallfile01.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile02.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile03.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile04.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile05.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile06.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile07.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile08.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile09.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile10.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile11.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile12.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile13.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile14.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile15.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile16.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile17.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile18.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile19.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile20.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile21.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile22.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile23.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile24.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile25.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile26.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile27.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile28.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile29.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile30.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile31.dbf' SIZE 32G,
  '/u01/app/dbfiles/orcl/ts_smallfile32.dbf' SIZE 32G   
EXTENT MANAGEMENT LOCAL AUTOALLOCATE;

Tablespaces BigFile

CREATE BIGFILE TABLESPACE TS_BIGFILE DATAFILE 
  '/u01/app/dbfiles/orcl/ts_bigfile.dbf' SIZE 1024G AUTOEXTEND ON NEXT 100M
EXTENT MANAGEMENT LOCAL AUTOALLOCATE;


Si bien es cierto ambos van a tener la capacidad de crecer pero para la gestión de un DBA va hacer mas fácil gestionar tablespace con 1 solo datafile que con muchos datafile. Está bastante claro que los Tablespaces Bigfile ayudan en la transparencia de los datos, ya que cada Tablespaces tiene solo un archivo de datos, por lo que parece muy claro dónde pueden estar nuestros datos. Además, la base de datos se vuelve más fácil de administrar, ya que tiene que administrar una menor cantidad de archivos de datos. Entonces, si cree que tiene espacio de base de datos para administrar, simplemente hágalo

No existe limitantes para el uso de tablas, índices u otro objeto de base que haga uso de Tablespace.

 

Limitaciones y consideraciones Tablespaces BigFile:

  • Los tablespaces Bigfile deben crearse administrados localmente y con administración automática del espacio de segmento. Éstas son las especificaciones predeterminadas. Oracle devolverá un error si se especifica DEXTENT MANAGEMENT DICTIONARY o SEGMENT SPACE MANAGEMENT MANUAL. Pero hay dos excepciones cuando los segmentos de tablespaces de bigfile se administran manualmente:
    • Undo tablespace administrado localmente
    • Espacio de tabla temporal
  • Los tablespaces Bigfile deben dividirse para que las operaciones en paralelo no se vean afectadas negativamente. Oracle espera que los tablespaces de bigfile se utilice con Automatic Storage Management (ASM) u otros administradores de volúmenes lógicos que admitan la creación de bandas o RAID.
  • Los tablespaces Bigfile no deben usarse en plataformas con restricciones, lo que limitaría la capacidad del tablespaces.
  • Evite el uso de tablespaces de archivos grandes si es posible que no haya espacio libre disponible en un grupo de discos y la única forma de ampliar un tablespaces es agregar un nuevo archivo de datos en un grupo de discos diferente.


Referencias

https://docs.oracle.com/cd/E18283_01/server.112/e17120/tspaces002.htm

https://docs.oracle.com/database/121/VLDBG/GUID-7B764F63-C4B4-4D30-9E96-2D6D73CB4122.htm


jueves, 3 de junio de 2021

Querying DBA_JOBS encounter ORA-01873

En la versión de Oracle 19c se me presentó error al tratar de realizar la consulta haca la vista DBA_JOBS.

select * from dba_jobs;
ORA-01873: the leading precision of the interval is too small


Revisando en la documentación de Oracle "Querying DBA_JOBS Encounter ORA-01873 (Doc ID 2710794.1)" se indica que


CAUSA:

Lista de verificación de la herramienta de actualización previa de la base de datos. (ID de documento 2380601.1)A partir de Oracle Database 19c, los trabajos creados y administrados a través del paquete DBMS_JOB en versiones anteriores de la base de datosse volverán a crear utilizando la arquitectura Oracle Scheduler. Es posible que los trabajos que no se hayan vuelto a crear correctamente no funcionen correctamente después de la actualización.

SOLUCION

Ignore la columna TOTAL_TIME y seleccione otras columnas para obtener la información de la consulta DBA_JOBS.

O

Consultando dba_scheduler_jobs y verá todos los trabajos  que fueron creados usando dbms_job. 
select *  from dba_scheduler_jobs;


Como vemos la solución esta en omitir de la consulta el campo TOTAL_TIME de la vista DBA_JOBS o usar DBA_SCHEDULER_JOBS.

Como en mi caso esta solución no me ayudaba de mucho por que no pdodia editar el programa que hacia uso de esa vista lo que realice es editar la vista DBA_JOBS. Si ya se que me diran que no debemos hacaerlo ya que es un objeto del SYS, pero les comento que no todo esta escrito en piedra asi que lo hice y me funcionó.

Deben de conectarse con el SYS para poder realizar la modificación.

CREATE OR REPLACE FORCE VIEW SYS.DBA_JOBS
(
   JOB,
   LOG_USER,
   PRIV_USER,
   SCHEMA_USER,
   LAST_DATE,
   LAST_SEC,
   THIS_DATE,
   THIS_SEC,
   NEXT_DATE,
   NEXT_SEC,
   TOTAL_TIME,
   BROKEN,
   INTERVAL,
   FAILURES,
   WHAT,
   NLS_ENV,
   MISC_ENV,
   INSTANCE
)
   BEQUEATH DEFINER AS
   SELECT m.dbms_job_number                                                                JOB,
          j.creator                                                                        LOG_USER,
          u.name                                                                           PRIV_USER,
          u.name                                                                           SCHEMA_USER,
          j.last_start_date                                                                LAST_DATE,
          SUBSTR ( TO_CHAR ( j.last_start_date, 'HH24:MI:SS' ), 1, 8 )                     LAST_SEC,
          DECODE ( BITAND ( j.job_status, 2 ), 2, j.last_start_date, NULL )                THIS_DATE,
          DECODE ( BITAND ( j.job_status, 2 ), 2, SUBSTR ( TO_CHAR ( j.last_start_date, 'HH24:MI:SS' ), 1, 8 ), NULL )
             THIS_SEC,
          j.next_run_date                                                                  NEXT_DATE,
          SUBSTR ( TO_CHAR ( j.next_run_date, 'HH24:MI:SS' ), 1, 8 )                       NEXT_SEC,
          ( CASE
              WHEN j.last_end_date > j.last_start_date THEN
                 --EXTRACT (
                 --DAY FROM (j.last_end_date - j.last_start_date) * 86400)
          (CAST(j.last_end_date AS DATE)-CAST(j.last_start_date AS DATE)) * 86400
              ELSE
                 0
           END )
             TOTAL_TIME,                                                          -- Scheduler does not track total time
          DECODE ( BITAND ( j.job_status, 1 ), 0, 'Y', 'N' )                               BROKEN,
          DECODE ( BITAND ( j.flags, 1024 + 4096 + 134217728 ), 0, j.schedule_expr, NULL ) INTERVAL,
          j.failure_count                                                                  FAILURES,
          j.program_action                                                                 WHAT,
          j.nls_env                                                                        NLS_ENV,
          j.env                                                                            MISC_ENV,
          NVL ( j.instance_id, 0 )                                                         INSTANCE
     FROM sys.scheduler$_dbmsjob_map m
          LEFT OUTER JOIN sys.obj$ o ON ( o.name = m.job_name )
          LEFT OUTER JOIN sys.user$ u ON ( u.name = m.job_owner )
          LEFT OUTER JOIN sys.scheduler$_job j ON ( j.obj# = o.obj# )
    WHERE o.owner# = u.user#;

Se marca con rojo lo que viene por defecto y genera el error y se marca con azul con lo que se remplazó y funcionó.


Espero les sirva.