Envío de Correos con PLSQL desde Base de Datos Oracle

Raúl Antonio Molina Alvarenga

26 de abril de 2023

#OracleTipsSV

#OracleACE

El envío de correos desde la base de Datos Oracle usando PLSQL es algo común, y en cierta medida necesario, mucha tarea o control de actividades puede desenvolverse con el envío de un correo oportuno orquestado desde la base de datos.

Vamos a comenzar indicando que prefiero usar un PLSQL que complicarme la existencia usando Java para esta tarea, siendo así, hay que indicar que los paquetes de BD  necesarios para el mismo antes en algunas versiones viejas era requerido instalarlos.

sqlplus /nolog

connect / as sysdba

@?/rdbms/admin/utlmail.sql

@?/rdbms/admin/prvtmail.plb

grant execute on utl_mail to public; --> puede ser o debería 
ser a un usuario particular

Debemos definir los datos de nuestro SMTP, y si la bd es 11.1 o superior, debemos configurar las reglas de salida o trafico de salida de la BD con las ACLs y si es 19c las ACE.

alter system set smtp_out_server = 'TuSMTP' scope=both;

select * from dba_network_acls;

Si hubieran borra los que hayan, si no ignora, 

BEGIN

DBMS_NETWORK_ACL_ADMIN.DROP_ACL(

acl => 'mail_access.xml');

END;

/

BEGIN

DBMS_NETWORK_ACL_ADMIN.CREATE_ACL (

acl          => 'mail_access.xml',

description  => 'Permissions to access e-mail server.',

principal    => 'PUBLIC',

is_grant     => TRUE,

privilege    => 'connect');

COMMIT;

END;

/

BEGIN

DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL (

acl          => 'mail_access.xml',

host         => 'TUSMTP'

);

COMMIT;

END;

/

 

Luego preparamos las unidades PLSQL que permitirán el envío de los correos, totalmente personalizables, permiten hasta envio de adjuntos,  formateo HTML para los visores de correo mas modernos, etc.

 

CREATE OR REPLACE PROCEDURE send_mail (p_to        IN VARCHAR2,

                                       p_from      IN VARCHAR2,

                                       p_subject   IN VARCHAR2,

                                       p_message   IN VARCHAR2,

                                       p_smtp_host IN VARCHAR2,

                                       p_smtp_port IN NUMBER DEFAULT 25)

AS

  l_mail_conn   UTL_SMTP.connection;

BEGIN

  l_mail_conn := UTL_SMTP.open_connection(p_smtp_host, p_smtp_port);

  UTL_SMTP.helo(l_mail_conn, p_smtp_host);

  UTL_SMTP.mail(l_mail_conn, p_from);

  UTL_SMTP.rcpt(l_mail_conn, p_to);

  UTL_SMTP.open_data(l_mail_conn);

  

  UTL_SMTP.write_data(l_mail_conn, 'Date: ' || TO_CHAR(SYSDATE, 'DD-MON-YYYY HH24:MI:SS') || UTL_TCP.crlf);

  UTL_SMTP.write_data(l_mail_conn, 'To: ' || p_to || UTL_TCP.crlf);

  UTL_SMTP.write_data(l_mail_conn, 'From: ' || p_from || UTL_TCP.crlf);

  UTL_SMTP.write_data(l_mail_conn, 'Subject: ' || p_subject || UTL_TCP.crlf);

  UTL_SMTP.write_data(l_mail_conn, 'Reply-To: ' || p_from || UTL_TCP.crlf || UTL_TCP.crlf);

  

  UTL_SMTP.write_data(l_mail_conn, p_message || UTL_TCP.crlf || UTL_TCP.crlf);

  UTL_SMTP.close_data(l_mail_conn);

  UTL_SMTP.quit(l_mail_conn);

END;

/

Ejemplo para probarlo con cualquier usuario,  por ejemplo enviando correos desde tu ID de correo.

 create user ssa identified by admin;

 grant connect,resource,dba to admin;

grant execute on sys.send_mail to admin;

BEGIN

  sys.send_mail(p_to        => 'correo@dominio',

            p_from      => 'correo1@dominio',

            p_subject   => 'Test Message',

            p_message   => 'This is a test message.',

            p_smtp_host => 'mail.ssasis.com');

END;

/

/  2    3    4    5    6    7    8  

PL/SQL procedure successfully completed.

Pudiendo tener resultados como el siguiente:

DR SYNC STATUS REPORT FOR DATABASE: db
INST_NAME LOG_ARCHIVED LOG_APPLIED TIME_APPLIED LOG_GAP
bd1 302281 302279 26-Apr, 05:49:20 2
bd2 300298 300297 26-Apr, 05:53:55 1
bd3 290118 290117 26-Apr, 05:53:53 1

 

Espero les sea de utilidad!!.

Saludos

Como agregar un nodo a un Cluster de Oracle Database, en modo silencioso.

Raúl Antonio Molina Alvarenga

23 de Abril de 2023

#OracleTipsSV

#OracleACEAssociate

Es de lo más común  en proyectos de Alta Disponibilidad de Oracle Database, que los Clusters  nazcan con la cantidad requerida de Nodos de computo que albergaran a las instancias de Base de Datos, es lo de más común; pero eso no significa, que ante la necesidad, no podamos agregar o remover un nodo de un cluster activo.

Hay una master Note de MOS que nos hace un resumen de dicho procedimiento para todas las versiones actuales y anteriores de Software Oracle, y es que aunque en las ultimas versiones el procedimental sea de lo mas parecido, debemos ser conscientes que la infraestructura interna del software las cosas si han cambiado bastante.

El DOCID:

How to Add Node/Instance or Remove Node/Instance with Oracle Clusterware and RAC (Doc ID 1332451.1)

Nos enfocaremos en la guia Oficial de 11.2:

https://docs.oracle.com/cd/E14795_01/doc/rac.112/e10717/adddelclusterware.htm#CHDFIAIE

Nuestro ambiente:

NOTA:Omito temas de configuraciones, así como salidas de comandos, en esencia la guía, muestra la sintaxis valida de los comandos para agregar un nodo.

Nodos: sa-nodo01, sa-nodo02

Nuestros pasos:

Debemos validar que la equivalencia de usuarios( oracle y grid si es que así lo hemos aplicado el role separation), esta correctamente configurado

./sshUserSetup.sh -user grid -hosts “sa-nodo01 sa-nodo02” -advanced -noPromptPassphrase

./sshUserSetup.sh -user oracle -hosts "sa-nodo01 sa-nodo02" -advanced -noPromptPassphrase

Debemos validar que contamos con todos los discos de preferencia con los mismos nombres de dispositivos:

ASMCMD [+] > lsdsk -G dggrid

/dev/rdsk/c1d12s0

/dev/rdsk/c1d13s0

/dev/rdsk/c1d14s0

ASMCMD [+] > lsdsk -G dgnada

/dev/rdsk/c1d10s0

/dev/rdsk/c1d11s0

/dev/rdsk/c1d4s0

/dev/rdsk/c1d5s0

/dev/rdsk/c1d6s0

/dev/rdsk/c1d7s0

/dev/rdsk/c1d8s0

/dev/rdsk/c1d9s0

ASMCMD [+] > lsdsk -G dgarch

/dev/rdsk/c1d18s0

/dev/rdsk/c1d19s0

/dev/rdsk/c1d20s0

mid

ASMCMD [+] > lsdsk -G dgarch

/dev/rdsk/c1d23s0

/dev/rdsk/c1d24s0

/dev/rdsk/c1d25s0 —> 

ASMCMD [+] > lsdsk -G dggrid

/dev/rdsk/c1d10s0

/dev/rdsk/c1d11s0

/dev/rdsk/c1d9s0

ASMCMD [+] > lsdsk -G dgnada

/dev/rdsk/c1d12s0

/dev/rdsk/c1d13s0

/dev/rdsk/c1d14s0

/dev/rdsk/c1d15s0

/dev/rdsk/c1d16s0

/dev/rdsk/c1d18s0

/dev/rdsk/c1d19s0

/dev/rdsk/c1d20s0

/dev/rdsk/c1d21s0

/dev/rdsk/c1d22s0

meta

ASMCMD [+] > lsdsk -G dgnada

/dev/rdsk/c1d10s0

/dev/rdsk/c1d11s0

/dev/rdsk/c1d7s0

/dev/rdsk/c1d8s0

/dev/rdsk/c1d9s0

ASMCMD [+] > lsdsk -G dggrid

/dev/rdsk/c1d4s0

/dev/rdsk/c1d5s0

/dev/rdsk/c1d6s0

ASMCMD [+] > lsdsk -G dgarch

/dev/rdsk/c1d12s0

/dev/rdsk/c1d13s0

/dev/rdsk/c1d14s0

ASMCMD [+] >

chmod 660 /dev/rdsk/c1d10s0

chmod 660 /dev/rdsk/c1d11s0

chmod 660 /dev/rdsk/c1d7s0

chmod 660 /dev/rdsk/c1d8s0

chmod 660 /dev/rdsk/c1d9s0

chmod 660 /dev/rdsk/c1d4s0

chmod 660 /dev/rdsk/c1d5s0

chmod 660 /dev/rdsk/c1d6s0

chmod 660 /dev/rdsk/c1d12s0

chmod 660 /dev/rdsk/c1d13s0

chmod 660 /dev/rdsk/c1d14s0

chown grid:asmadmin /dev/rdsk/c1d10s0

chown grid:asmadmin /dev/rdsk/c1d11s0

chown grid:asmadmin /dev/rdsk/c1d7s0

chown grid:asmadmin /dev/rdsk/c1d8s0

chown grid:asmadmin /dev/rdsk/c1d9s0

chown grid:asmadmin /dev/rdsk/c1d4s0

chown grid:asmadmin /dev/rdsk/c1d5s0

chown grid:asmadmin /dev/rdsk/c1d6s0

chown grid:asmadmin /dev/rdsk/c1d12s0

chown grid:asmadmin /dev/rdsk/c1d13s0

chown grid:asmadmin /dev/rdsk/c1d14s0

También debemos entender y  contemplar que la infraestructura de red este en correcto funcionamiento, podemos usar la siguiente DOCID de MOS:

How to Validate Network and Name Resolution Setup for the Clusterware and RAC (Doc ID 1054902.1)

Si cuando se instalo el o los nodos originales se ignoro alguna revision, y no sabemos dicho resultado, podemos de antemano, obviar dichas validaciones estableciendo esta variable de ambiente en Y:

export IGNORE_PREADDNODE_CHECKS=Y

Una vez todo esta revisado y validado procedemos a desplegar 
el nodo nuevo agregandolo a la capa de GI
cd $ORACLE_HOME/oui/bin

./addNode.sh -silent "CLUSTER_NEW_NODES={sa-nodo02}" "CLUSTER_NEW_VIRTUAL_HOSTNAMES={sa-nodo02-vip}"

Ahora, debemos agregar la capa de software del RDBMS, usualmente con el usuario oracle.

##oracle

cd $ORACLE_HOME/oui/bin

./addNode.sh -silent "CLUSTER_NEW_NODES={sa-nodo02}"

Ahora debemos agregar la siguiente instancia que se ejecutara en el nodo recién agregado, vamos a extender la BD o las BDs en 1 instancia adicional:

dbca -silent -addInstance -nodeList sa-nodo02 -gdbName osmdata -instanceName osmdata2 -sysDBAUserName sys -sysDBAPassword oracle11g

dbca -silent -addInstance -nodeList sa-nodo02 -gdbName ocpdb -instanceName ocpdb2 -sysDBAUserName sys -sysDBAPassword oracle11g

dbca -silent -addInstance -nodeList sa-nodo02 -gdbName cepdb -instanceName cepdb2 -sysDBAUserName sys -sysDBAPassword oracle11g

dbca -silent -addInstance -nodeList sa-nodo02 -gdbName osmdata -instanceName osmdata2 -sysDBAUserName sys -sysDBAPassword oracle11g

dbca -silent -addInstance -nodeList sa-nodo02 -gdbName load -instanceName load2 -sysDBAUserName sys -sysDBAPassword oracle11g

El resultado final, un cluster con 2 nodos:

grid@sa-nodo02:~$ crs_stat -t

Name           Type           Target    State     Host        

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

ora.DGARCH.dg  ora....up.type ONLINE    ONLINE    sa-nodo01

ora.DGGRID.dg  ora....up.type ONLINE    ONLINE    sa-nodo01

ora.DGnada.dg  ora....up.type ONLINE    ONLINE    sa-nodo01

ora....ER.lsnr ora....er.type ONLINE    ONLINE    sa-nodo01

ora....N1.lsnr ora....er.type ONLINE    ONLINE    sa-nodo02

ora....N2.lsnr ora....er.type ONLINE    ONLINE    sa-nodo01

ora....N3.lsnr ora....er.type ONLINE    ONLINE    sa-nodo01

ora.asm        ora.asm.type   ONLINE    ONLINE    sa-nodo01

ora.cepdb.db   ora....se.type ONLINE    ONLINE    sa-nodo01

ora.cvu        ora.cvu.type   ONLINE    ONLINE    sa-nodo02

ora.esbdata.db ora....se.type ONLINE    ONLINE    sa-nodo01

ora.gsd        ora.gsd.type   OFFLINE   OFFLINE               

ora....network ora....rk.type ONLINE    ONLINE    sa-nodo01

ora.oc4j       ora.oc4j.type  ONLINE    ONLINE    sa-nodo02

ora.ocpdb.db   ora....se.type ONLINE    ONLINE    sa-nodo01

ora.ons        ora.ons.type   ONLINE    ONLINE    sa-nodo01

ora.osmdata.db ora....se.type ONLINE    ONLINE    sa-nodo01

ora....ry.acfs ora....fs.type ONLINE    ONLINE    sa-nodo01

ora....SM1.asm application    ONLINE    ONLINE    sa-nodo01

ora....01.lsnr application    ONLINE    ONLINE    sa-nodo01

ora....b01.gsd application    OFFLINE   OFFLINE               

ora....b01.ons application    ONLINE    ONLINE    sa-nodo01

ora....b01.vip ora....t1.type ONLINE    ONLINE    sa-nodo01

ora....SM2.asm application    ONLINE    ONLINE    sa-nodo02

ora....02.lsnr application    ONLINE    ONLINE    sa-nodo02

ora....b02.gsd application    OFFLINE   OFFLINE               

ora....b02.ons application    ONLINE    ONLINE    sa-nodo02

ora....b02.vip ora....t1.type ONLINE    ONLINE    sa-nodo02

ora.scan1.vip  ora....ip.type ONLINE    ONLINE    sa-nodo02

ora.scan2.vip  ora....ip.type ONLINE    ONLINE    sa-nodo01

ora.scan3.vip  ora....ip.type ONLINE    ONLINE    sa-nodo01

ps -fea | grep pmon

    grid 21207     1   0 21:47:06 ?           0:01 asm_pmon_+ASM2

  oracle  5566     1   0 22:25:00 ?           0:00 ora_pmon_osmdata2

  oracle  7364     1   0 22:29:42 ?           0:00 ora_pmon_ocpdb2

  oracle  9184     1   0 22:34:28 ?           0:00 ora_pmon_cepdb2

  oracle  9886     1   0 22:35:42 ?           0:00 ora_pmon_esbdata2

    grid 10189  9429   0 22:36:31 pts/1       0:00 grep pmon

grid@sa-nodo02:~$ crs_stat -t

Name           Type           Target    State     Host        

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

ora.DGARCH.dg  ora....up.type ONLINE    ONLINE    sa-nodo01

ora.DGGRID.dg  ora....up.type ONLINE    ONLINE    sa-nodo01

ora.DGnada.dg  ora....up.type ONLINE    ONLINE    sa-nodo01

ora....ER.lsnr ora....er.type ONLINE    ONLINE    sa-nodo01

ora....N1.lsnr ora....er.type ONLINE    ONLINE    sa-nodo02

ora....N2.lsnr ora....er.type ONLINE    ONLINE    sa-nodo01

ora....N3.lsnr ora....er.type ONLINE    ONLINE    sa-nodo01

ora.asm        ora.asm.type   ONLINE    ONLINE    sa-nodo01

ora.cepdb.db   ora....se.type ONLINE    ONLINE    sa-nodo01

ora.cvu        ora.cvu.type   ONLINE    ONLINE    sa-nodo02

ora.esbdata.db ora....se.type ONLINE    ONLINE    sa-nodo01

ora.gsd        ora.gsd.type   OFFLINE   OFFLINE               

ora....network ora....rk.type ONLINE    ONLINE    sa-nodo01

ora.oc4j       ora.oc4j.type  ONLINE    ONLINE    sa-nodo02

ora.ocpdb.db   ora....se.type ONLINE    ONLINE    sa-nodo01

ora.ons        ora.ons.type   ONLINE    ONLINE    sa-nodo01

ora.osmdata.db ora....se.type ONLINE    ONLINE    sa-nodo01

ora....ry.acfs ora....fs.type ONLINE    ONLINE    sa-nodo01

ora....SM1.asm application    ONLINE    ONLINE    sa-nodo01

ora....01.lsnr application    ONLINE    ONLINE    sa-nodo01

ora....b01.gsd application    OFFLINE   OFFLINE               

ora....b01.ons application    ONLINE    ONLINE    sa-nodo01

ora....b01.vip ora....t1.type ONLINE    ONLINE    sa-nodo01

ora....SM2.asm application    ONLINE    ONLINE    sa-nodo02

ora....02.lsnr application    ONLINE    ONLINE    sa-nodo02

ora....b02.gsd application    OFFLINE   OFFLINE               

ora....b02.ons application    ONLINE    ONLINE    sa-nodo02

ora....b02.vip ora....t1.type ONLINE    ONLINE    sa-nodo02

ora.scan1.vip  ora....ip.type ONLINE    ONLINE    sa-nodo02

ora.scan2.vip  ora....ip.type ONLINE    ONLINE    sa-nodo01

ora.scan3.vip  ora....ip.type ONLINE    ONLINE    sa-nodo01

Espero les sea de utilidad.

Saludos!!

De la guia:

Adding a Cluster Node on Linux and UNIX Systems

This procedure describes how to add a node to your cluster. This procedure assumes that:

  • There is an existing cluster with a node named node1
  • You are adding a node named node2
  • You have successfully installed Oracle Clusterware on node1 in a nonshared home, where Grid_home represents the successfully installed home

To add a node:

  1. Ensure that you have successfully installed Oracle Clusterware on at least one node in your cluster environment. To perform the following procedure, Grid_home must identify your successfully installed Oracle Clusterware home.

    See Also:

    Oracle Grid Infrastructure Installation Guide for Oracle Clusterware installation instructions

  2. Verify the integrity of the cluster and node2:
    $ cluvfy stage -pre nodeadd -n node2 [-fixup [-fixupdir fixup_dir]] [-verbose]
    

    You can specify the -fixup option and a directory into which CVU prints instructions to fix the cluster or node if the verification fails.

  3. Navigate to the Grid_home/oui/bin directory on node1 and run the addNode.sh script using the following syntax, where node2 is the name of the node that you are adding and node2-vip is the VIP name for the node:If you are using Grid Naming Service (GNS):
    $ ./addNode.sh -silent "CLUSTER_NEW_NODES={node2,node3}"
    

    If you are not using GNS:

    $ ./addNode.sh -silent "CLUSTER_NEW_NODES={node2,node3}""CLUSTER_NEW_VIRTUAL_HOSTNAMES={node2-vip,node3-vip}" 
    

    Alternatively, you can specify the entries shown in Example 4-1 in a response file, where file_name is the name of the file, and run the addNode.sh script, as follows:

    $ addNode.sh -silent -responseFile file_name
    

    When prompted, run root.sh before the addNode.sh script completes.

 

Historial del Crecimiento del Tamaño de la Base de Datos Oracle

Raúl Antonio Molina Alvarenga

19 de Abril de 2023

#OracleACE

#OracleTipsSV

A veces nos hacen la pregunta, cuanto espacio debemos reservar para el crecimiento a futuro de la base de datos, o cuanto espacio hemos consumido en un año anterior.

Esa información de forma natural en la base de datos, sin precalcularlo es un poco complejo obtenerla, especialmente si no tenemos vistas históricas que se obtienen con EE y Packs de diagnóstico y tuneo.

Aquí un pequeño TIP para poder calcular dicha información y almacenarlo, no considera el UNDO  y TEMP, solo Información real de usuario.

Crear Tabla que almacenara la información histórica.

create table db_space_hist (

timestamp    date,

total_space  number(8),

used_space   number(8),

free_space   number(8),

        pct_inuse    number(5,2),

        num_db_files number(5)

);

 

Crear procedimiento de colección de Información:

CREATE OR REPLACE PROCEDURE db_space_history AS

BEGIN

   INSERT INTO db_space_hist 

SELECT SYSDATE, total_space,

        total_space-NVL(free_space,0) used_space,

        NVL(free_space,0) free_space,

        ((total_space - NVL(free_space,0)) / total_space)*100 pct_inuse,

        num_db_files

 FROM ( SELECT SUM(bytes)/1024/1024 free_space

        FROM   sys.DBA_FREE_SPACE WHERE tablespace_name NOT LIKE '%UNDO%') FREE,

      ( SELECT SUM(bytes)/1024/1024 total_space,

               COUNT(*) num_db_files

        FROM   sys.DBA_DATA_FILES WHERE tablespace_name NOT LIKE '%UNDO%') FULL;

   COMMIT;

END;

/

Crear el JOB que calculara la información, la Frecuencia puede ser la deseada, o necesitada, diaria, semanal , mensual.(Puede usarse o mejor dicho usar Scheduler JOBS).

DECLARE

  X NUMBER;

BEGIN

  SYS.DBMS_JOB.SUBMIT

    (

      job        => X

     ,what       => 'OBS.DB_SPACE_HISTORY;'

     ,next_date  => sysdate+1

     ,INTERVAL   => 'TRUNC(SYSDATE+7)'

     ,no_parse   => FALSE

    );

END;

La información se consulta asi:

select * from db_space_hist order by timestamp desc;

Espero les sea de Utilidad

Saludos.

 

Oracle Database 19c : Demo Construcción de un Data Guard Fácil .

Raúl Antonio Molina Alvarenga

18 de Abril de 2023

#OracleACEAssociate

#OracleTipsSV

Vamos a ver una guía para poder construir rápidamente un Oracle Data Guard en versión 19c.

Para lograrlo use 2 maquinas Compute Instance en una de mis cuentas Always Free Tier.

Host Origen: linux7

Host Destino: standbylinux7

Version Software Oracle Database: 19c (19.3)

Clusterware: No

Multitenant: No

Asumpciones:

  • No es detallado en algunos elementos como Preparación de maquinas Virtuales
  • Instalación de Software Oracle
  • Explicación detallada de Oracle Data Guard

Rápidamente, use la guía de instalación de Oracle 19c con el formato RPM:

https://docs.oracle.com/en/database/oracle/oracle-database/19/ladbi/running-rpm-packages-to-install-oracle-database.html#GUID-BB7C11E3-D385-4A2F-9EAF-75F4F0AACF02

Installing Oracle Database RPM Manually

Esto debe realizarse en los N Nodos que formaran el Conjunto Data Guard, para mi ejemplo 2 Nodos.

  1. Log in as root. 
  2. Download and install the Oracle Database Preinstallation RPM:
    1. Descargar el rpm de 
      https://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/getPackage/oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm
    2. Instalar el software con el rpm 
      # yum -y localinstall oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm

La instalación del Software esta ahora completa.

Creación de la Base de datos

Puede hacerse la creación de la Base de Datos en el Servidor Origen, usando el tool del rpm de instalación o lanzar el dbca de forma normal, pongo los 2 ejemplos.

  1. Conectarse con root
  2. To configure a sample Oracle Database instance, run the following service configuration script:
    # /etc/init.d/oracledb_ORCLCDB-19c configure

Usando el metodo silencioso tipico con dbca:

nohup dbca -silent -createDatabase                                                    \

     -templateName General_Purpose.dbc                                          \

     -gdbname emcdb -sid emcdb -responseFile NO_VALUE                           \

     -characterSet AL32UTF8                                                     \

     -sysPassword syspassword1                                                  \

     -systemPassword syspassword1                                               \                                           \

     -databaseType MULTIPURPOSE                                                 \

     -totalMemory 388                                                          \

     -storageType FS                                                            \

     -datafileDestination /u01/app/oracle/oradata                                          \

     -redoLogFileSize 600                                                       \

     -emConfiguration NONE                                                      \

     -ignorePreReqs &

-bash-4.2$ cat nohup.out 

[WARNING] [DBT-11205] Specified shared pool size does not meet the recommended minimum size requirement. This might cause database creation to fail.

   ACTION: Specify at least (481 MB) for shared pool size.

[WARNING] [DBT-06208] The 'SYS' password entered does not conform to the Oracle recommended standards.

   CAUSE: 

a. Oracle recommends that the password entered should be at least 8 characters in length, contain at least 1 uppercase character, 1 lower case character and 1 digit [0-9].

b.The password entered is a keyword that Oracle does not recommend to be used as password

   ACTION: Specify a strong password. If required refer Oracle documentation for guidelines.

[WARNING] [DBT-06208] The 'SYSTEM' password entered does not conform to the Oracle recommended standards.

   CAUSE: 

a. Oracle recommends that the password entered should be at least 8 characters in length, contain at least 1 uppercase character, 1 lower case character and 1 digit [0-9].

b.The password entered is a keyword that Oracle does not recommend to be used as password

   ACTION: Specify a strong password. If required refer Oracle documentation for guidelines.

Prepare for db operation

10% complete

Copying database files

40% complete

Creating and starting Oracle instance

42% complete

46% complete

50% complete

54% complete

60% complete

Completing Database Creation

66% complete

69% complete

70% complete

Executing Post Configuration Actions

100% complete

Database creation complete. For details check the logfiles at:

 /opt/oracle/cfgtoollogs/dbca/emcdb.

Database Information:

Global Database Name:emcdb

System Identifier(SID):emcdb

Look at the log file "/opt/oracle/cfgtoollogs/dbca/emcdb/emcdb.log" for further details.

-bash-4.2$ 

A este punto tenemos correctamente configurada una Base de Datos 19c en el servidor Origen.

Asumiremos, que logramos

  • Configuramos la maquina virtual correctamente
  • Instalar en el servidor Destino o nodo2 el Software Oracle Database
  • Tenemos reglas de transferencia y comunicación entre los nodos (firewall y access list en la VCN).

Ademas, debemos

  • Trasladado el Password file de la BD creada , así como  el init (mejor spfile) , el tnsnames.ora hacia el servidor destino.
  • Con el spfile, iniciamos la instancia en el nodo2

Ahora vamos a Crear la replica, que método usaremos, bueno el ahora método preferido para mi, duplicación via el servicio:

Nota: Durante la clonación,  me percate que no tenia en Modo archive la BD Origen.

-bash-4.2$ rman target  sys/syspassword1

RMAN> restore standby controlfile from service emcdb;

Starting restore at 18-APR-23

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: SID=255 device type=DISK

channel ORA_DISK_1: starting datafile backup set restore

channel ORA_DISK_1: using network backup set from service emcdb

channel ORA_DISK_1: restoring control file

channel ORA_DISK_1: restore complete, elapsed time: 00:00:01

output file name=/u01/app/oracle/oradata/EMCDB/control01.ctl

output file name=/u01/app/oracle/oradata/EMCDB/control02.ctl

Finished restore at 18-APR-23

RMAN> 

 restore database from service emcdb;

Starting restore at 18-APR-23

allocated channel: ORA_DISK_1

channel ORA_DISK_1: SID=255 device type=DISK

channel ORA_DISK_1: starting datafile backup set restore

channel ORA_DISK_1: using network backup set from service emcdb

channel ORA_DISK_1: specifying datafile(s) to restore from backup set

channel ORA_DISK_1: restoring datafile 00001 to /u01/app/oracle/oradata/EMCDB/system01.dbf

RMAN-00571: ===========================================================

RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============

RMAN-00571: ===========================================================

RMAN-03002: failure of restore command at 04/18/2023 21:12:45

ORA-19845: error in backupDataFile while communicating with remote database server

ORA-17628: Oracle error 19602 returned by remote Oracle server

ORA-19602: cannot backup or copy active file in NOARCHIVELOG mode

ORA-19660: some files in the backup set could not be verified

ORA-19661: datafile 1 could not be verified

ORA-19845: error in backupDataFile while communicating with remote database server

ORA-17628: Oracle error 19602 returned by remote Oracle server

ORA-19602: cannot backup or copy active file in NOARCHIVELOG mode

SQL> shutdown immediate

startup mount;

ORACLE instance started.

Total System Global Area  524285856 bytes

Fixed Size     8898464 bytes

Variable Size   285212672 bytes

Database Buffers   222298112 bytes

Redo Buffers     7876608 bytes

Database mounted.

SQL> alter database archivelog;

Database altered.

SQL> alter database open;

Database altered.

restore database from service emcdb;

Starting restore at 18-APR-23

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: SID=256 device type=DISK

channel ORA_DISK_1: starting datafile backup set restore

channel ORA_DISK_1: using network backup set from service emcdb

channel ORA_DISK_1: specifying datafile(s) to restore from backup set

channel ORA_DISK_1: restoring datafile 00001 to /u01/app/oracle/oradata/EMCDB/system01.dbf

channel ORA_DISK_1: restore complete, elapsed time: 00:00:25

channel ORA_DISK_1: starting datafile backup set restore

channel ORA_DISK_1: using network backup set from service emcdb

channel ORA_DISK_1: specifying datafile(s) to restore from backup set

channel ORA_DISK_1: restoring datafile 00003 to /u01/app/oracle/oradata/EMCDB/sysaux01.dbf

channel ORA_DISK_1: restore complete, elapsed time: 00:00:16

channel ORA_DISK_1: starting datafile backup set restore

channel ORA_DISK_1: using network backup set from service emcdb

channel ORA_DISK_1: specifying datafile(s) to restore from backup set

channel ORA_DISK_1: restoring datafile 00004 to /u01/app/oracle/oradata/EMCDB/undotbs01.dbf

channel ORA_DISK_1: restore complete, elapsed time: 00:00:07

channel ORA_DISK_1: starting datafile backup set restore

channel ORA_DISK_1: using network backup set from service emcdb

channel ORA_DISK_1: specifying datafile(s) to restore from backup set

channel ORA_DISK_1: restoring datafile 00007 to /u01/app/oracle/oradata/EMCDB/users01.dbf

channel ORA_DISK_1: restore complete, elapsed time: 00:00:01

Finished restore at 18-APR-23

RMAN> 

recover database from service emcdb;

Starting recover at 18-APR-23

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: SID=255 device type=DISK

skipping datafile 1; already restored to SCN 2065656

skipping datafile 3; already restored to SCN 2065666

skipping datafile 4; already restored to SCN 2065672

skipping datafile 7; already restored to SCN 2065675

starting media recovery

RMAN-08187: warning: media recovery until SCN 2064663 complete

Finished recover at 18-APR-23

Continuamos, ya tenemos la replica, ahora hay que configurar el paso del Broker, es demasiado util para dejar de usarlo:

dgmgrl /  –>  a veces es necesario para algunas tareas usar sys y su password.

Me di cuenta que me falto encender el parámetros de broker en ambos sitios

CREATE CONFIGURATION emcdbdrp as primary database is emcdb connect identifier is emcdb;

Error: 

ORA-16525: The Oracle Data Guard broker is not yet available.

DGMGRL> 

SQL> alter system set dg_broker_start=true;

System altered.

SQL> 

DGMGRL> enable configuration;

Enabled.

DGMGRL> show configuration;

Configuration - emcdbdrp

  Protection Mode: MaxPerformance

  Members:

  emcdb  - Primary database

    Warning: ORA-16789: standby redo logs configured incorrectly

    emcdbr - Physical standby database 

      Warning: ORA-16809: multiple warnings detected for the member

Fast-Start Failover:  Disabled

Configuration Status:

WARNING   (status updated 36 seconds ago)

DGMGRL> show database emcdbr

Database - emcdbr

  Role:               PHYSICAL STANDBY

  Intended State:     APPLY-ON

  Transport Lag:      1 minute 58 seconds (computed 46 seconds ago)

  Apply Lag:          1 minute 58 seconds (computed 46 seconds ago)

  Average Apply Rate: 18.95 MByte/s

  Real Time Query:    OFF

  Instance(s):

    emcdb

  Database Warning(s):

    ORA-16853: apply lag has exceeded specified threshold

    ORA-16855: transport lag has exceeded specified threshold

    ORA-16857: member disconnected from redo source for longer than specified threshold

    ORA-16789: standby redo logs configured incorrectly

Database Status:

WARNING

 

Como PLUS, vamos a activar Active Data Guard (ADG) , en el sitio alterno, o nodo 2 , o sitio secundario:

SQL> alter database open;

Database altered.

DGMGRL> 

Database - emcdbr

  Role:               PHYSICAL STANDBY

  Intended State:     APPLY-ON

  Transport Lag:      8 minutes 1 second (computed 59 seconds ago)

  Apply Lag:          8 minutes 1 second (computed 59 seconds ago)

  Average Apply Rate: 18.95 MByte/s

  Real Time Query:    ON

  Instance(s):

    emcdb

  Database Warning(s):

    ORA-16853: apply lag has exceeded specified threshold

    ORA-16855: transport lag has exceeded specified threshold

    ORA-16857: member disconnected from redo source for longer than specified threshold

    ORA-16789: standby redo logs configured incorrectly

Database Status:

WARNING

DGMGRL> 

 edit database emcdbr set state=apply-on;

Succeeded.

DGMGRL> show configuration;

Configuration - emcdbdrp

  Protection Mode: MaxPerformance

  Members:

  emcdb  - Primary database

    emcdbr - Physical standby database 

      Warning: ORA-16809: multiple warnings detected for the member

Fast-Start Failover:  Disabled

Configuration Status:

WARNING   (status updated 47 seconds ago)

DGMGRL> show database emcdbr;

Database - emcdbr

  Role:               PHYSICAL STANDBY

  Intended State:     APPLY-ON

  Transport Lag:      50 minutes 18 seconds (computed 17 seconds ago)

  Apply Lag:          50 minutes 18 seconds (computed 17 seconds ago)

  Average Apply Rate: 18.95 MByte/s

  Real Time Query:    ON

  Instance(s):

    emcdb

  Database Warning(s):

    ORA-16853: apply lag has exceeded specified threshold

    ORA-16855: transport lag has exceeded specified threshold

Database Status:

WARNING

DGMGRL> sql ' alter system switch logfile'

Succeeded.

DGMGRL> 

DGMGRL> show database emcdbr;

Database - emcdbr

  Role:               PHYSICAL STANDBY

  Intended State:     APPLY-ON

  Transport Lag:      0 seconds (computed 1 second ago)

  Apply Lag:          0 seconds (computed 1 second ago)

  Average Apply Rate: 553.00 KByte/s

  Real Time Query:    ON

  Instance(s):

    emcdb

Database Status:

SUCCESS

DGMGRL> 

Voy a intentar la validación de configuración y sitios antes de intentar el switchover,  previo a esto recordé que debo  configurar el Flashback, Necesario para FSFO y otros beneficios.

SQL> alter database flashback on;

alter database flashback on

*

ERROR at line 1:

ORA-38706: Cannot turn on FLASHBACK DATABASE logging.

ORA-38707: Media recovery is not enabled.

SQL> alter database archivelog;

alter database archivelog

*

ERROR at line 1:

ORA-01126: database must be mounted in this instance and not open in any

instance

SQL> archive log list;

Database log mode       No Archive Mode

Automatic archival       Enabled

Archive destination       /opt/oracle/product/19c/dbhome_1/dbs/arch

Oldest online log sequence     1

Current log sequence       2

SQL> select status,open_mode from v$database,v$instance;

STATUS     OPEN_MODE

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

OPEN     READ ONLY WITH APPLY

SQL> 

La validación me indica debo cubrir las entradas estáticas que el broker requiere , esto debido que no hay srvctl , o Oracle Restart.

Ademas tenemos otro punto a cubrir, los Standby RedoLogs o SRL.

Recordemos que tenemos dos tipos de Redologs , Online, y Standby.

DGMGRL>validate database emcdb;

  Database Role:    Primary database

  Ready for Switchover:  Yes

  Managed by Clusterware:

    emcdb:  NO             

    Validating static connect identifier for the primary database emcdb...

Unable to connect to database using (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=linux7.subnet.vcn.oraclevcn.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=emcdb_DGMGRL)(INSTANCE_NAME=emcdb)(SERVER=DEDICATED)(STATIC_SERVICE=TRUE)))

ORA-12514: TNS:listener does not currently know of service requested in connect descriptor

Failed.

    Warning: Ensure primary database's StaticConnectIdentifier property

    is configured properly so that the primary database can be restarted

    by DGMGRL after switchover

DGMGRL>  validate database emcdbr;

  Database Role:     Physical standby database

  Primary Database:  emcdb

  Ready for Switchover:  Yes

  Ready for Failover:    Yes (Primary Running)

  Managed by Clusterware:

    emcdb :  NO             

    emcdbr:  NO             

    Validating static connect identifier for the primary database emcdb...

Unable to connect to database using (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=linux7.subnet.vcn.oraclevcn.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=emcdb_DGMGRL)(INSTANCE_NAME=emcdb)(SERVER=DEDICATED)(STATIC_SERVICE=TRUE)))

ORA-12514: TNS:listener does not currently know of service requested in connect descriptor

Failed.

    Warning: Ensure primary database's StaticConnectIdentifier property

    is configured properly so that the primary database can be restarted

    by DGMGRL after switchover

  Log Files Cleared:

    emcdb Standby Redo Log Files:   Cleared

    emcdbr Online Redo Log Files:   Not Cleared

    emcdbr Standby Redo Log Files:  Available

  Current Log File Groups Configuration:

    Thread #  Online Redo Log Groups  Standby Redo Log Groups Status       

              (emcdb)                 (emcdbr)                             

    1         3                       2                       Insufficient SRLs

  Future Log File Groups Configuration:

    Thread #  Online Redo Log Groups  Standby Redo Log Groups Status       

              (emcdbr)                (emcdb)                              

    1         3                       0                       Insufficient SRLs

    Warning: standby redo logs not configured for thread 1 on emcdb

DGMGRL> exit

sql-bash-4.2$ dgmgrl /

DGMGRL for Linux: Release 19.0.0.0.0 - Production on Tue Apr 18 22:36:07 2023

Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

Welcome to DGMGRL, type "help" for information.

Connected to "emcdb"

Connected as SYSDG.

DGMGRL> validate database emcdr;

Object "emcdr" was not found

DGMGRL> validate database emcdbr;

  Database Role:     Physical standby database

  Primary Database:  emcdb

  Ready for Switchover:  Yes

  Ready for Failover:    Yes (Primary Running)

  Managed by Clusterware:

    emcdb :  NO             

    emcdbr:  NO             

    Validating static connect identifier for the primary database emcdb...

Unable to connect to database using (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=linux7.subnet.vcn.oraclevcn.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=emcdb_DGMGRL)(INSTANCE_NAME=emcdb)(SERVER=DEDICATED)(STATIC_SERVICE=TRUE)))

ORA-12514: TNS:listener does not currently know of service requested in connect descriptor

Failed.

    Warning: Ensure primary database's StaticConnectIdentifier property

    is configured properly so that the primary database can be restarted

    by DGMGRL after switchover

  Log Files Cleared:

    emcdb Standby Redo Log Files:   Cleared

    emcdbr Online Redo Log Files:   Not Cleared

    emcdbr Standby Redo Log Files:  Available

  Current Log File Groups Configuration:

    Thread #  Online Redo Log Groups  Standby Redo Log Groups Status       

              (emcdb)                 (emcdbr)                             

    1         3                       2                       Insufficient SRLs

  Future Log File Groups Configuration:

    Thread #  Online Redo Log Groups  Standby Redo Log Groups Status       

              (emcdbr)                (emcdb)                              

    1         3                       0                       Insufficient SRLs

    Warning: standby redo logs not configured for thread 1 on emcdb
Las entradas estáticas en el listener.ora quedo dela siguiente manera, 
recordemos que debemos reiniciar el listener para que ese cambio tome efecto.
No usar reload.

LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = TCP)(HOST = linux7.subnet.vcn.oraclevcn.com)(PORT = 1521))

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

    )

  )

SID_LIST_LISTENER=

  (SID_LIST=

    (SID_DESC=

      (SID_NAME=emcdb)

      (GLOBAL_DBNAME=emcdb_DGMGRL)

      (ORACLE_HOME=/opt/oracle/product/19c/dbhome_1)

    )

  )

-bash-4.2$ 
Ajustaremos la entrada estatica mas simple en el broker:

DGMGRL>

edit database emcdb set property staticconnectidentifier='(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(PORT=1521)(HOST=10.0.0.3))(CONNECT_DATA=(SERVICE_NAME= emcdb_DGMGRL)(INSTANCE_NAME=emcdb)(SERVER=DEDICATED)))';

edit database emcdbr set property staticconnectidentifier='(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(PORT=1521)(HOST=10.0.0.4))(CONNECT_DATA=(SERVICE_NAME= emcdbr_DGMGRL)(INSTANCE_NAME=emcdb)(SERVER=DEDICATED)))';
Intentaremos nuevamente la validación:


DGMGRL> validate database emcdb;

  Database Role:    Primary database

  Ready for Switchover:  Yes

  Managed by Clusterware:

    emcdb:  NO             

    Validating static connect identifier for the primary database emcdb...

    The static connect identifier allows for a connection to database "emcdb".

DGMGRL> validate database emcdbr;

  Database Role:     Physical standby database

  Primary Database:  emcdb

  Ready for Switchover:  Yes

  Ready for Failover:    Yes (Primary Running)

  Managed by Clusterware:

    emcdb :  NO             

    emcdbr:  NO             

    Validating static connect identifier for the primary database emcdb...

    The static connect identifier allows for a connection to database "emcdb".

  Log Files Cleared:

    emcdb Standby Redo Log Files:   Cleared

    emcdbr Online Redo Log Files:   Not Cleared

    emcdbr Standby Redo Log Files:  Available

  Current Log File Groups Configuration:

    Thread #  Online Redo Log Groups  Standby Redo Log Groups Status       

              (emcdb)                 (emcdbr)                             

    1         3                       2                       Insufficient SRLs

  Future Log File Groups Configuration:

    Thread #  Online Redo Log Groups  Standby Redo Log Groups Status       

              (emcdbr)                (emcdb)                              

    1         3                       0                       Insufficient SRLs

    Warning: standby redo logs not configured for thread 1 on emcdb

Vamos a corregir el tema de los standby redologs en ambos sitios, borramos los que están mal ( quedaron con thread 0), y los agregamos de forma correcta.

Por defecto el dbca crea 3 Online redologs, en este caso de 600mb, y para seguir la regla de la documentacion, debemos crear N+1 standby Redologs, donde N es la cantidad de Online Redologs x Thread, en el caso es un solo thread, porque es SingleInstance.

SQL> select thread#, group#, sequence#, status, bytes from v$standby_log;

   THREAD#     GROUP#  SEQUENCE# STATUS  BYTES

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

0    4       0 UNASSIGNED  629145600

0    5       0 UNASSIGNED  629145600

0    6       0 UNASSIGNED  629145600

0    7       0 UNASSIGNED  629145600

alter database add standby logfile thread 1   size 600m;

Volvemos a intentar la validación:

 

-bash-4.2$ dgmgrl sys/syspassword1

DGMGRL for Linux: Release 19.0.0.0.0 - Production on Tue Apr 18 23:23:34 2023

Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

Welcome to DGMGRL, type "help" for information.

Connected to "emcdb"

Connected as SYSDBA.

DGMGRL> sql ' alter system switch logfile';

Succeeded.

DGMGRL> validate database emcdb;

  Database Role:    Primary database

  Ready for Switchover:  Yes

  Managed by Clusterware:

    emcdb:  NO             

    Validating static connect identifier for the primary database emcdb...

    The static connect identifier allows for a connection to database "emcdb".

DGMGRL> validate database emcdbr;

  Database Role:     Physical standby database

  Primary Database:  emcdb

  Ready for Switchover:  Yes

  Ready for Failover:    Yes (Primary Running)

  Managed by Clusterware:

    emcdb :  NO             

    emcdbr:  NO             

    Validating static connect identifier for the primary database emcdb...

    The static connect identifier allows for a connection to database "emcdb".

  Log Files Cleared:

    emcdb Standby Redo Log Files:   Cleared

    emcdbr Online Redo Log Files:   Not Cleared

    emcdbr Standby Redo Log Files:  Available

DGMGRL> 

Intentemos el Swicthover:

DGMGRL> switchover to emcdbr;

Performing switchover NOW, please wait...

Operation requires a connection to database "emcdbr"

Connecting ...

Connected to "emcdbr"

Connected as SYSDBA.

New primary database "emcdbr" is opening...

Operation requires start up of instance "emcdb" on database "emcdb"

Starting instance "emcdb"...

Connected to an idle instance.

ORACLE instance started.

Connected to "emcdb"

Database mounted.

Database opened.

Connected to "emcdb"

Switchover succeeded, new primary is "emcdbr"

DGMGRL> 

Del log, en la secuencia de tiempo, podemos notar que demoro menos de 2 Minutos:

SWITCHOVER VERIFY COMPLETE

2023-04-18T23:27:09.914922+00:00

Additional information: 7

2023-04-18T23:27:14.836244+00:00

 rfs (PID:8201): Selected LNO:5 for T-1.S-11 dbid 888512743 branch 1134441066

2023-04-18T23:27:15.108620+00:00

PR00 (PID:7203): Resetting standby activation ID 888530151 (0x34f5e4e7)

2023-04-18T23:27:15.126778+00:00

Media Recovery End-Of-Redo indicator encountered

....

TMI: kcv_commit_to_so_to_primary Switchover from physical END 2023-04-18 23:28:06.692280

SWITCHOVER: completed request from primary database.

2023-04-18T23:28:12.732013+00:00

ALTER SYSTEM SET fal_server='' SCOPE=BOTH;

2023-04-18T23:28:12.735019+00:00

Starting background process NSV1

2023-04-18T23:28:12.749558+00:00

NSV1 started with pid=26, OS id=8428 

2023-04-18T23:28:14.946580+00:00

ARC0 (PID:5163): Becoming the 'no SRL' ARCH

2023-04-18T23:28:16.040815+00:00

RSM0 (PID:5182): Using STANDBY_ARCHIVE_DEST parameter default value as /opt/oracle/product/19c/dbhome_1/dbs/arch [krsd.c:18141]

2023-04-18T23:28:16.049990+00:00

ALTER SYSTEM SET log_archive_dest_2='service="emcdb"','ASYNC NOAFFIRM delay=0 optional compression=disable max_failure=0 reopen=300 db_unique_name="emcdb" net_timeout=30','valid_for=(online_logfile,all_roles)' SCOPE=BOTH;

2023-04-18T23:28:16.109045+00:00

ALTER SYSTEM SET log_archive_dest_state_2='ENABLE' SCOPE=BOTH;

ALTER DATABASE OPEN

Validamos el cambio correcto:

DGMGRL> show database emcdb;

Database - emcdb

  Role:               PHYSICAL STANDBY

  Intended State:     APPLY-ON

  Transport Lag:      0 seconds (computed 0 seconds ago)

  Apply Lag:          1 second (computed 0 seconds ago)

  Average Apply Rate: 5.00 KByte/s

  Real Time Query:    ON

  Instance(s):

    emcdb

Database Status:

SUCCESS

DGMGRL> show database emcdbr;         

Database - emcdbr

  Role:               PRIMARY

  Intended State:     TRANSPORT-ON

  Instance(s):

    emcdb

Database Status:

SUCCESS

DGMGRL> 

Con este tutorial, vamos a terminar de complementarlo, cuando se hace cambio  de rol, debe considerarse si las Apps lograran conectarse a un nuevo HOST, IP, datos de otro sitio, otro servicio, etc, etc; Oracle provee una solución para garantizar la menor intervención de DBA, de SYSADMIN, de NetworkAdmin, etc: Client failover connectivity .

De La documentacion:

Pre 11.2 Configuration:

Recordemos que en este ejemplo no tenemos SIHA ni Clusterware, entonces debemos considerar que el usuario el servicio debe manejarse solo por funcionamiento de la DB, y eso lo lograremos con un trigger en la misma DB.

La idea es, intervenir lo menos posible en un evento de switchover o Failover, esto es requerido, porque el servicio default de BD, de PBD, no funciona correctamente.

Crear en la primaria los servicios para ser usados por el respectivo rol:

+ On the current primary, create 2 services, one to connect to the primary (prim_db) and another (stby_db) to connect to the read only standby:

SQL> exec dbms_service.create_service('prim_db','prim_db');
SQL> exec dbms_service.create_service('stby_db','stby_db');

Iniciar el servicio en la primaria:

+ On the current primary, start the service that is needed to connect to primary:

SQL> exec dbms_service.start_service('prim_db');

+ Now, on the current primary, create the trigger to manage these services accordingly:

CREATE OR REPLACE TRIGGER startDgServices after startup on database

DECLARE

  db_role VARCHAR(30);

  db_open_mode VARCHAR(30);

BEGIN

  SELECT DATABASE_ROLE, OPEN_MODE INTO db_role, db_open_mode FROM V$DATABASE;

  IF db_role = 'PRIMARY' THEN DBMS_SERVICE.START_SERVICE('prim_db'); END IF;

  IF db_role = 'PHYSICAL STANDBY' AND db_open_mode LIKE 'READ ONLY%' THEN DBMS_SERVICE.START_SERVICE('stby_db'); END IF;

END;

/ 

El tnsnames a usar:

PRIM_DB =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (FAILOVER = ON)

      (LOAD_BALANCE = OFF)

      (ADDRESS = (PROTOCOL = TCP)(HOST = primary.oracle.com)(PORT = 1521))

      (ADDRESS = (PROTOCOL = TCP)(HOST = standby.oracle.com)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = prim_db)

    )

  )

  

STBY_DB =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (FAILOVER = ON)

      (LOAD_BALANCE = OFF)

       (ADDRESS = (PROTOCOL = TCP)(HOST = standby.oracle.com)(PORT = 1521))

       (ADDRESS = (PROTOCOL = TCP)(HOST = primary.oracle.com)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = stby_db)

    )

  )  


Complementaremos este tutorial, con un Video de las pruebas de switchover y un cliente conectandose para validar la cadena de conexión unificada sin intervención manual para ajustar dicha cadena.

Espero les sea de utilidad.

Saludos!!!

Como reducir el tamaño de un Tablespace UNDO y que no libera el espacio.

Raul Antonio Molina Alvarenga
12 de Abril de 2023
#OracleTIPSSV
#OracleACE
NOTA:REQUIERE INDISPONIBLIDAD.
1. Con la BD encendida, cambie el parametro  undo _management de  AUTO a  MANUAL ( Es estatico, requiere reinicio).
— alter system set undo_management=manual scope=spfile;
Consulte los segmentos de rollback que permanecen en el tablespace UNDO y que no permiten redimensionarlo a menos tamaño
1.1 SELECT SEGMENT_NAME,OWNER,TABLESPACE_NAME,STATUS FROM DBA_ROLLBACK_SEGS WHERE TABLESPACE_NAME LIKE ‘%UND%’;
SEGMENT_NAME       OWNER  TABLESPACE_NAME     STATUS

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

_SYSSMU1_2287069710$       PUBLIC UNDOTBS1     ONLINE

_SYSSMU2_1428768168$       PUBLIC UNDOTBS1     ONLINE

_SYSSMU3_1956277333$       PUBLIC UNDOTBS1     ONLINE

_SYSSMU4_2809192227$       PUBLIC UNDOTBS1     ONLINE

_SYSSMU5_1081917160$       PUBLIC UNDOTBS1     ONLINE

_SYSSMU6_615989371$       PUBLIC UNDOTBS1     ONLINE

_SYSSMU7_3192789434$       PUBLIC UNDOTBS1     ONLINE

_SYSSMU8_1508326656$       PUBLIC UNDOTBS1     ONLINE

_SYSSMU9_4053710062$       PUBLIC UNDOTBS1     ONLINE

_SYSSMU10_1046413189$       PUBLIC UNDOTBS1     ONLINE



10 rows selected.
1.2 crear el pfile
   create pfile from spfile;
   shutdown immediate;
1.3 Modificar el init
   vi initBAODI.ora
2.Agregue la siguiente linea al archivo pfile:
_OFFLINE_ROLLBACK_SEGMENTS=(_SYSSMU10_1046413189$)  – agregar al final del archivo de init segun el listado del select anterior
( queda asi: )
*.undo_tablespace=’UNDOTBS1′
_OFFLINE_ROLLBACK_SEGMENTS=(_SYSSMU10_1046413189$)
3. Reinicie la BD con el pfile generado en el paso previo:
   startup nomount pfile=’/u01/app/oracle/product/11.1.0/db_1/dbs/initODI.ora’;
4. Borraremos el segmento de rolback o deshacer “_SYSSMU10_1046413189$”  se genera el script debe de quedar asi:drop rollback segment ” “_SYSSMU10_1046413189$”;
    SELECT ‘drop rollback segment “‘||SEGMENT_NAME||” FROM DBA_ROLLBACK_SEGS WHERE TABLESPACE_NAME LIKE ‘_SYSSMU10_1046413189$‘;
5. ejecutamos el script
6. Reiniciamos la BD
startup ;
7. Retornamos el parametro undo _management de  MANUAL a  AUTO
    alter system set undo_management=AUTO scope=spfile;
8. Reiniciamos la instancia
   shutdown immediate; y luego startup (normal)
Listo, para  nuestro ejemplo solo use un segmento de  rollback, pero puede crearse el listado de borrado de todos los segmentos de rollback necesarios.
Espero les sea de Utilidad
Saludos!!

Como monitorear Respaldos o Restauraciones de RMAN

Raúl Antonio Molina Alvarenga

10 de Abril de 2023

#OracleACE

#OracleTipsSV

A veces necesitamos ( lo más usual en la via de un DBA), monitorear una actividad de respaldo o restauración, esto porque siempre nos están preguntando, cual es el avance, como vamos, como va el respaldo.

Y a simple vista, responder a dicha pregunta no es tan fácil, especialmente si son restauraciones o respaldo de bases de datos de gran tamaño.

Pero los scripts construidos con el poderoso SQL nunca nos abandonan, en este caso traemos uno utilísimo (a mi modo de ver), que permite contestar de gran manera (es una aproximación) las preguntas planteadas arriba.

El query a usar, que es totalmente personalizable se basa en la session longops:

Pasted Graphic 3.png

El resultado seria similar a la siguiente salida, indicando, la Sesión o SID, la hora de inicio, el Porcentaje de avance, usualmente del Hilo o Sesión el restante en Segundos, Minutos y Horas, para aquello de los impacientes:

Pasted Graphic.png

Y la forma de Invocación:

Pasted Graphic 2.png

Espero les sea de Utilidad.

Saludos

Instalación y Configuración de Oracle RAC sin usar modo grafico, Manoss a la Obraaa!!!

 

ORACLE RAC 11GR2 (2 Nodes) Completamente en modo Silencioso, sin usar interfaz grafica.

San Salvador, 25 de Marzo de 2023

#OracleACE

#OracleTipsSV

Hace algún tiempo, me enfrente a una situación de instalación de un producto Oracle llamado OAS, para los que lo conocieron fue el Servidor de Aplicaciones Caballo de Batalla de Oracle Corp, malo para mi modo de ver, Weblogic le gana por mucho.

Centrándose en la situación vivida, estaba instalando via VPN (2011), con un acceso a internet algo lento, y recuerdo que cuando lanzaba el modo gráfico de la instalación demoraba mucho tiempo en hacerme caso, y el proceso era lento en su totalidad, quede frustrado, después de horas y horas de búsqueda y nada.

Tiempo después, cuando me dio curiosidad el Examen de OCM, lei un tópico o requisito, saber Instalar todo producto Oracle involucrado en el examen en modo silencioso, sin uso de interfaz gráfica, y pensé que ser eso, y comencé a investigar y descubrí eso que tiempo tras me pudo haber permitido instalar el OAS sin complicación.

Oracle Corp, para todo producto, permite instalarlo de 2 formas, en modo interactivo en sus típicos instaladores bajo el estándar Oracle Universal Installer, que es un Tool creado en Java con toda una pila de subutilerias internas y scripts que se ejecutan cuando una persona lo esta utilizando, no es particularmente lento pero, al cargarlo de forma remota se complica la existencia.

El otro modo, el modo silencioso, particularmente complejo dado que la persona que lo use, debe saber rellenar las respuestas a las preguntas que el Wizard de Instalación o OUI realiza para poder completar una instalación. Todo producto Oracle viene con una plantilla que puede ser rellenada, en la mayoría de los mismos viene una sección de explicación para cada item a completar su valor.

Entrando en materia, vamos a ver los comandos necesarios para instalar un Oracle RAC de 2 nodos en version 11g( en realidad todas las versiones en esencia son iguales), usando el modo silencioso.

Vamos a asumir algunas consideraciones:

  • Tenemos el Hardware adecuado y correctamente configurado
  • Sistema operativo adecuado y correctamente configurado en los nodos involucrados
  • La mayoría o todos los elementos requisitos correctamente configurados, esto porque nunca es correcto dejando elementos con warning (para producción esto puede provocar fallas posteriores), o Error ( error ni siquiera se puede terminar la instalación)
  • Tenemos el Software correcto descargando y copiado al nodo inicial , también desempacado.

Hay que definir una variable para evitar errores durante la instalación:

export IGNORE_PREADDNODE_CHECKS=Y

Configuramos la equivalencia de usuarios entre los nodos:

./sshUserSetup.sh -user oracle  -hosts "racprod01 racprod02" -advanced -noPromptPassphrase
./sshUserSetup.sh -user grid  -hosts "racprod01 racprod02" -advanced -noPromptPassphrase

Validamos la correcta ejecución del túnel entre equipos con el usuario oracle y grid

con ssh racpro01 date; ssh racprod02 date

Si no solicita contraseña, la  configuración es correcta, de o contrario debemos hacerlo de nuevo corrigiendo fallas.

Iniciamos el instalador, moviéndonos al folder donde desempacamos el producto:

./runInstaller -silent -ignoreSysPrereqs -ignorePrereq -ignoreInternalDriverError -force use_prereq_checker=false        \

-responseFile $HOME/grid/response/grid_install.rsp        \

INVENTORY_LOCATION=/u01/app/oraInventory         \

SELECTED_LANGUAGES=en                                   \

oracle.install.option=CRS_CONFIG                        \

ORACLE_BASE=/u01/app/oracle/                             \

ORACLE_HOME=/u01/11.2.0/grid/                      \

oracle.install.asm.OSDBA=asmdba                            \

oracle.install.asm.OSOPER=asmoper                           \

oracle.install.asm.OSASM=asmadmin                            \

oracle.install.crs.config.gpnp.scanName=mvascan \

oracle.install.crs.config.gpnp.scanPort=1521            \

oracle.install.crs.config.clusterName=mvcluster            \

oracle.install.crs.config.gpnp.configureGNS=false       \

oracle.install.crs.config.clusterNodes=racprod01:racprod01-vip,racprod02:

racprod02-vip \

oracle.install.crs.config.networkInterfaceList=xnf1:172.16.10.0:1,xnf0:10

.10.10.0:2 \

oracle.install.crs.config.storageOption=ASM_STORAGE     \

oracle.install.crs.config.useIPMI=false                 \

oracle.install.asm.SYSASMPassword=oracle01              \

oracle.install.asm.diskGroup.diskDiscoveryString=/u01/oradata/* \

oracle.install.asm.diskGroup.name=CRS                  \

oracle.install.asm.diskGroup.disks=/u01/oradata/crs1,/u01/oradata/crs2,/u

01/oradata/crs3       \

oracle.install.asm.diskGroup.redundancy=EXTERNAL        \

oracle.install.asm.monitorPassword=oracle01

$GRID_HOME/oui/bin/runInstaller -updateNodeList ORACLE_HOME="/u01/app/11.2.0.2/grid" CRS=true


Al iniciar nos indica el log donde se ve el avance, el mismo log nos indica que hay que ejecutar los scripts de root ( 2 el del inventario y el del OracleHome),  también nos indicara cualquier error que haya que corregir, etc.

El mismo nos indicara cuando el proceso haya finalizado.

El OUI inicial solo crea y configura el diskgroup de ASM donde el OCR y los voting files son creados por lo cual cualquier diskgroup de ASM adicional debe configurarse posterior a dicho paso, aqui creamos un diskgroup de ASM:

asmca -silent -createDiskGroup \

-diskGroupName DATA \

-diskList '/u01/oradata/asm1,/u01/oradata/asm2' \

-redundancy external \

-au_size 4  \

-sysAsmPassword oracle01

Creamos otro diskgroup, uno para el FRA

asmca -silent -createDiskGroup \

-diskGroupName FRA \

-diskList '/u01/oradata/asm6,/u01/oradata/asm7' \

-redundancy external \

-au_size 4  \

-sysAsmPassword oracle01

Una vez el GI ha sido configurado de forma correcta, validamos su funcionamiento, apagando, encendiendo, reiniciando equipos, podemos parcharlo, etc , etc.

En este ejemplo usamos, separación de soles, por lo cual el Software de RDBMS se ejecuta con usuario oracle, solo instalaremos el RDBMS, no crearemos la BD, eso sera en un paso posterior:

./runInstaller -silent -ignoreSysPrereqs -ignorePrereq -ignoreInternalDriverError \

-force use_prereq_checker=false \

-responseFile /u01/stage/database/response/db_install.rsp      \

oracle.install.option=INSTALL_DB_SWONLY             \

CLUSTER_NODES=racprod01,racprod02                     \

UNIX_GROUP_NAME=oinstall                            \

INVENTORY_LOCATION=/u01/app/oraInventory     \

SELECTED_LANGUAGES=en                               \

ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1   \

ORACLE_BASE=/u01/app/oracle                         \

oracle.install.db.InstallEdition=SE                 \

oracle.install.db.isCustomInstall=false             \

oracle.install.db.DBA_GROUP=dba                     \

oracle.install.db.OPER_GROUP=dba                    \

SECURITY_UPDATES_VIA_MYORACLESUPPORT=false          \

DECLINE_SECURITY_UPDATES=true


En caso de ser necesario, puede actualizarse el inventario con este comando:

./runInstaller -updateNodeList ORACLE_HOME="/u01/app/oracle/product/11.2.0/db_1" CRS=true

El proceso  de instalación completo la instalación y al finalizar debió ejecutarse el script de root del mismo Home, con esto podríamos crear la BD del mismo modo silencioso:

dbca -silent -createDatabase -templateName 'General_Purpose.dbc' -adminManaged \

-emConfiguration NONE -gdbName 'mvadb'  -sysPassword oracle01 -systemPassword oracle01 \

-asmSYSPassword oracle01  -storageType ASM -diskGroupName DATA \

-datafileJarLocation /u01/app/oracle/product/11.2.0/db_1/assistants/dbca/templates \

-nodelist 'racprod01,racprod02' -characterset WE8ISO8859P1 -obfuscatedPasswords false -sampleSchema false


Incluyo el output:

Copying database files

1% complete

3% complete

9% complete

15% complete

21% complete

27% complete

30% complete

Creating and starting Oracle instance

32% complete

36% complete

40% complete

44% complete

45% complete

48% complete

50% complete

Creating cluster database views

52% complete

70% complete

Completing Database Creation

73% complete

76% complete

85% complete

94% complete

100% complete

Look at the log file "/u01/app/oracle/cfgtoollogs/dbca/mvadb/mvadb.log" for further details.

Validación del listener

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))

STATUS of the LISTENER

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

Alias                     LISTENER

Version                   TNSLSNR for Solaris: Version 11.2.0.3.0 - Production

Start Date                12-APR-2014 23:53:51

Uptime                    0 days 2 hr. 50 min. 10 sec

Trace Level               off

Security                  ON: Local OS Authentication

SNMP                      OFF

Listener Parameter File   /u01/11.2.0/grid/network/admin/listener.ora

Listener Log File         /u01/11.2.0/grid/log/diag/tnslsnr/racprod01/listener/alert/log.xml

Listening Endpoints Summary...

(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=172.16.10.102)(PORT=1521)))

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=172.16.10.105)(PORT=1521)))

Services Summary...

Service "+ASM" has 1 instance(s).

Instance "+ASM1", status READY, has 1 handler(s) for this service...

Service "mvadb" has 1 instance(s).

Instance "mvadb1", status READY, has 1 handler(s) for this service...

Service "mvadbXDB" has 1 instance(s).

Instance "mvadb1", status READY, has 1 handler(s) for this service...

The command completed successfully







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

Alias                     LISTENER

Version                   TNSLSNR for Solaris: Version 11.2.0.3.0 - Production

Start Date                12-APR-2014 23:53:51

Uptime                    0 days 2 hr. 50 min. 26 sec

Trace Level               off

Security                  ON: Local OS Authentication

SNMP                      OFF

Listener Parameter File   /u01/11.2.0/grid/network/admin/listener.ora

Listener Log File         /u01/11.2.0/grid/log/diag/tnslsnr/racprod02/listener/alert/log.xml

Listening Endpoints Summary...

(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=172.16.10.104)(PORT=1521)))

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=172.16.10.106)(PORT=1521)))

Services Summary...

Service "+ASM" has 1 instance(s).

Instance "+ASM2", status READY, has 1 handler(s) for this service...

Service "mvadb" has 1 instance(s).

Instance "mvadb2", status READY, has 1 handler(s) for this service...

Service "mvadbXDB" has 1 instance(s).

Instance "mvadb2", status READY, has 1 handler(s) for this service...

The command completed successfully


Validación completa del cluster:

-bash-3.2$ crs_stat -t

Name           Type           Target    State     Host

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

ora.CRS.dg     ora....up.type ONLINE    ONLINE    racprod01

ora.DATA.dg    ora....up.type ONLINE    ONLINE    racprod01

ora.FRA.dg     ora....up.type ONLINE    ONLINE    racprod01

ora....ER.lsnr ora....er.type ONLINE    ONLINE    racprod01

ora....N1.lsnr ora....er.type ONLINE    ONLINE    racprod02

ora....N2.lsnr ora....er.type ONLINE    ONLINE    racprod01

ora....N3.lsnr ora....er.type ONLINE    ONLINE    racprod01

ora.asm        ora.asm.type   ONLINE    ONLINE    racprod01

ora.cvu        ora.cvu.type   ONLINE    ONLINE    racprod01

ora.gsd        ora.gsd.type   OFFLINE   OFFLINE

ora.mvadb.db   ora....se.type ONLINE    ONLINE    racprod01

ora....network ora....rk.type ONLINE    ONLINE    racprod01

ora.oc4j       ora.oc4j.type  ONLINE    ONLINE    racprod01

ora.ons        ora.ons.type   ONLINE    ONLINE    racprod01

ora....SM1.asm application    ONLINE    ONLINE    racprod01

ora....01.lsnr application    ONLINE    ONLINE    racprod01

ora....d01.gsd application    OFFLINE   OFFLINE

ora....d01.ons application    ONLINE    ONLINE    racprod01

ora....d01.vip ora....t1.type ONLINE    ONLINE    racprod01

ora....SM2.asm application    ONLINE    ONLINE    racprod02

ora....02.lsnr application    ONLINE    ONLINE    racprod02

ora....d02.gsd application    OFFLINE   OFFLINE

ora....d02.ons application    ONLINE    ONLINE    racprod02

ora....d02.vip ora....t1.type ONLINE    ONLINE    racprod02

ora....ry.acfs ora....fs.type ONLINE    ONLINE    racprod01

ora.scan1.vip  ora....ip.type ONLINE    ONLINE    racprod02

ora.scan2.vip  ora....ip.type ONLINE    ONLINE    racprod01

ora.scan3.vip  ora....ip.type ONLINE    ONLINE    racprod01







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

NAME           TARGET  STATE        SERVER                   STATE_DETAILS

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

Local Resources

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

ora.CRS.dg

ONLINE  ONLINE       racprod01

ONLINE  ONLINE       racprod02

ora.DATA.dg

ONLINE  ONLINE       racprod01

ONLINE  ONLINE       racprod02

ora.FRA.dg

ONLINE  ONLINE       racprod01

ONLINE  ONLINE       racprod02

ora.LISTENER.lsnr

ONLINE  ONLINE       racprod01

ONLINE  ONLINE       racprod02

ora.asm

ONLINE  ONLINE       racprod01                Started

ONLINE  ONLINE       racprod02                Started

ora.gsd

OFFLINE OFFLINE      racprod01

OFFLINE OFFLINE      racprod02

ora.net1.network

ONLINE  ONLINE       racprod01

ONLINE  ONLINE       racprod02

ora.ons

ONLINE  ONLINE       racprod01

ONLINE  ONLINE       racprod02

ora.registry.acfs

ONLINE  ONLINE       racprod01

ONLINE  ONLINE       racprod02

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

Cluster Resources

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

ora.LISTENER_SCAN1.lsnr

1        ONLINE  ONLINE       racprod02

ora.LISTENER_SCAN2.lsnr

1        ONLINE  ONLINE       racprod01

ora.LISTENER_SCAN3.lsnr

1        ONLINE  ONLINE       racprod01

ora.cvu

1        ONLINE  ONLINE       racprod01

ora.mvadb.db

1        ONLINE  ONLINE       racprod01                Open

2        ONLINE  ONLINE       racprod02                Open

ora.oc4j

1        ONLINE  ONLINE       racprod01

ora.racprod01.vip

1        ONLINE  ONLINE       racprod01

ora.racprod02.vip

1        ONLINE  ONLINE       racprod02

ora.scan1.vip

1        ONLINE  ONLINE       racprod02

ora.scan2.vip

1        ONLINE  ONLINE       racprod01

ora.scan3.vip

1        ONLINE  ONLINE       racprod01


Podemos agregar servicios:

srvctl add service -d mvadb -s mvaha -r mvadb1,mvadb2 -P basic -e select -m basic -z 10 -w 2

Agregar mas nodos:

Primero el GI

cd $ORACLE_HOME/oui/bin

export IGNORE_PREADDNODE_CHECKS=Y

./addNode.sh -silent "CLUSTER_NEW_NODES={tcigesdb2}" "CLUSTER_NEW_VIRTUAL_HOSTNAMES={tcigesdb2-vip}"


Si fuera necesario alguna manipulación del inventario en el mismo modo:

$./runInstaller -silent -detachHome -invPtrLoc </etc>/oraInst.loc ORACLE_HOME="/u01/app/11.2.0/grid"
./runInstaller -silent -ignoreSysPrereqs -attachHome ORACLE_HOME="/u01/app/11.2.0/grid" ORACLE_HOME_NAME="Ora11g_gridinfrahome1" LOCAL_NODE="tcigesdb1" CLUSTER_NODES="tcigesdb1" CRS=true

Agregamos el RBDMS al nuevo nodo:

##oracle

cd $ORACLE_HOME/oui/bin

./addNode.sh -silent "CLUSTER_NEW_NODES={sa-midbn2}”

Espero les sea de Utilidad.

Oh No!!, perdi el spfile!!

Oh No!!, perdi el spfile!!

Raul Antonio Molina Alvarenga – Oracle ACE Associate

04-dec-2022

No se si alguna vez les ha pasado que por algún error involuntario o una falla han perdido el spfile, pfile, o init temporal, representando alguna que otra sudoración por no poder encender la instancia y que la base de datos de servicio.

En este articulo vamos a simular una falla frecuente en el mundo de los dbas, que también puede venir acompañada de la ejecución de un establecimiento  de parámetros  que imposibilita el arranque de la instancia.

Primero validamos que tenemos nuestro spfile  configurado y utilizado:

NAME     TYPE VALUE

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

spfile    
 string /opt/oracle/product/19c/dbhome_1/dbs/spfileORCLCDB.ora

SQL> 

SQL> show parameter name

NAME     TYPE VALUE

db_name      string ORCLCDB

SQL> 

Crearemos una copia del spfile como pfile.

Recordemos la definición:

pfile: archivo de parámetros en texto

spfile: archivo de parámetros en formato binario.

 

SQL> create pfile from spfile;

File created.

También crearemos un archivo de parámetros alterno, con nombre alterno.
SQL> create pfile='noperderpfile.ora' from spfile;

File created.

Es importante observemos donde esta el diag, la ruta de archivos de log y traces de la bd y el estado de la instancia:

SQL> show parameter diag

NAME     TYPE VALUE

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

diagnostic_dest      string /opt/oracle

SQL> 

 select status from v$instance;
STATUS

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

OPEN

Comenzamos apagando la instancia:

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> 

Ahora vamos a simular la falla de perder el spfileSID, borramos el spfileSID, note que hay  un initSID, el archivo alterno de parámetros que nosotros creamos.

cd $ORACLE_HOME

[oracle@instance-20221204-1045 dbhome_1]$ cd dbs

[oracle@instance-20221204-1045 dbs]$ ls -lrt

total 28

-rw-r--r--. 1 oracle oinstall 3079 May 14  2015 init.ora

-rw-r-----. 1 oracle oinstall   24 Dec  4 21:42 lkORCLCDB

-rw-r-----. 1 oracle oinstall 2048 Dec  4 21:47 orapwORCLCDB

-rw-r-----. 1 oracle oinstall 3584 Dec  4 22:35 spfileORCLCDB.ora

-rw-r--r--. 1 oracle oinstall 1037 Dec  4 22:36 initORCLCDB.ora

-rw-r--r--. 1 oracle oinstall 1037 Dec  4 22:36 noperderpfile.ora

-rw-rw----. 1 oracle oinstall 1544 Dec  4 22:40 hc_ORCLCDB.dat

[oracle@instance-20221204-1045 dbs]$ rm spfileORCLCDB.ora 

[oracle@instance-20221204-1045 dbs]$ 

SQL> 

SQL> startup

ORACLE instance started.

Total System Global Area  473953632 bytes

Fixed Size     8897888 bytes

Variable Size   222298112 bytes

Database Buffers   234881024 bytes

Redo Buffers     7876608 bytes

Database mounted.

Database opened.

SQL> show parameter pfile
NAME     TYPE VALUE

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

spfile     string --> esta vacio, arranco con init

SQL> 


Notese que la instancia arranco, sin spfile, porque por default en el orden de precedencia al no encontrar spfileSID, busca initSID

y para el caso lo encontró en el directorio $ORACLE_HOME/dbs.

Vamos a provocar la falla , borrando el initSID

[oracle@instance-20221204-1045 dbs]$ ls

hc_ORCLCDB.dat  init.ora  initORCLCDB.ora  lkORCLCDB  noperderpfile.ora  orapwORCLCDB

[oracle@instance-20221204-1045 dbs]$ rm initORCLCDB.ora 

[oracle@instance-20221204-1045 dbs]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Sun Dec 4 22:46:21 2022

Version 19.3.0.0.0

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

Connected to an idle instance.

SQL> startup 

ORA-01078: failure in processing system parameters

LRM-00109: could not open parameter file '/opt/oracle/product/19c/dbhome_1/dbs/initORCLCDB.ora'

SQL> 

Puede observarse que al no encontrar spfile ni init, no arranco la instancia

[oracle@instance-20221204-1045 dbs]$ ls

hc_ORCLCDB.dat  init.ora  lkORCLCDB  noperderpfile.ora  orapwORCLCDB

Vamos a reconstruir nuestro spfile del init que guardamos previamente con nombre personalizado.

[oracle@instance-20221204-1045 dbs]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Sun Dec 4 22:46:44 2022

Version 19.3.0.0.0

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

Connected to an idle instance.

SQL> create spfile from pfile='noperderpfile.ora';

File created.

SQL> startup

ORACLE instance started.

Total System Global Area  473953632 bytes

Fixed Size     8897888 bytes

Variable Size   222298112 bytes

Database Buffers   234881024 bytes

Redo Buffers     7876608 bytes

Database mounted.

Database opened.

SQL> 


Esto creo el spfile y se puede observar en el $OH/dbs

 dbs]$ ls -lrt

total 31272

-rw-r--r--. 1 oracle oinstall     3079 May 14  2015 init.ora

-rw-r-----. 1 oracle oinstall       24 Dec  4 21:42 lkORCLCDB

-rw-r-----. 1 oracle oinstall     2048 Dec  4 21:47 orapwORCLCDB

-rw-r--r--. 1 oracle oinstall     1037 Dec  4 22:36 noperderpfile.ora

-rw-r-----. 1 oracle oinstall     3584 Dec  4 22:50 spfileORCLCDB.ora

-rw-rw----. 1 oracle oinstall     1544 Dec  4 22:50 hc_ORCLCDB.dat

-rw-r-----. 1 oracle oinstall 10682368 Dec  4 22:57 011eiomb_1_1

-rw-r-----. 1 oracle oinstall 10600448 Dec  4 22:57 snapcf_ORCLCDB.f

-rw-r-----. 1 oracle oinstall 10715136 Dec  4 22:57 c-2893648571-20221204-00

[oracle@instance-20221204-1045 dbs]$ 

Otra forma utilísima de regenerar el init o spfile es usando los valores impresos en el alert en el diag repository.

[oracle@instance-20221204-1045 dbs]$ adrci

ADRCI: Release 19.0.0.0.0 - Production on Sun Dec 4 22:59:57 2022

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

ADR base = "/opt/oracle"

adrci> show alert

Choose the home from which to view the alert log:

1: diag/rdbms/orclcdb/ORCLCDB

2: diag/rdbms/dummy/ORCLCDB

3: diag/tnslsnr/instance-20221204-1045/listener

Q: to quit

Please select option: 1

El contenido se observa:

Using parameter settings in server-side spfile /opt/oracle/product/19c/dbhome_1/dbs/spfileORCLCDB.ora

System parameters with non-default values:

  processes                = 300

  nls_language             = "AMERICAN"

  nls_territory            = "AMERICA"

  sga_target               = 452M

  control_files            = "/opt/oracle/oradata/ORCLCDB/control01.ctl"

  control_files            = "/opt/oracle/oradata/ORCLCDB/control02.ctl"

  db_block_size            = 8192

  compatible               = "19.0.0"

  undo_tablespace          = "UNDOTBS1"

  remote_login_passwordfile= "EXCLUSIVE"

  dispatchers              = "(PROTOCOL=TCP) (SERVICE=ORCLCDBXDB)"

  local_listener           = "LISTENER_ORCLCDB"

  audit_file_dest          = "/opt/oracle/admin/ORCLCDB/adump"

  audit_trail              = "DB"

  db_name                  = "ORCLCDB"

  open_cursors             = 300

  pga_aggregate_target     = 150M

  diagnostic_dest          = "/opt/oracle"



Guardamos un archivo editable

vi pfile.ora

processes=300

nls_language="AMERICAN"

nls_territory="AMERICA"

sga_target=452M

control_files="/opt/oracle/oradata/ORCLCDB/control01.ctl"

control_files="/opt/oracle/oradata/ORCLCDB/control02.ctl"

db_block_size=8192

compatible="19.0.0"

undo_tablespace="UNDOTBS1"

remote_login_passwordfile= "EXCLUSIVE"

dispatchers="(PROTOCOL=TCP) (SERVICE=ORCLCDBXDB)"

local_listener="LISTENER_ORCLCDB"

audit_file_dest="/opt/oracle/admin/ORCLCDB/adump"

audit_trail="DB"

db_name="ORCLCDB"

open_cursors=300

pga_aggregate_target=150M

diagnostic_dest="/opt/oracle"

Ahora generamos el spfile del contenido del archivo editable que previamente creamos e iniciamos la instancia:


SQL> create spfile from pfile='pfile.ora';

File created.

SQL> startup

ORACLE instance started.

Total System Global Area  473953632 bytes

Fixed Size     8897888 bytes

Variable Size   180355072 bytes

Database Buffers   276824064 bytes

Redo Buffers     7876608 bytes

Database mounted.

Database opened.

SQL>  

Espero les sea de utilidad.

Saludos

#OracleTipsSV

Multitenant, Acceso Fácil a PDBs.

Por Raúl Antonio Molina Alvarenga

07 de Octubre de 2022

Cuando Comenzó la tecnología de Multitenant, fue como un giro de timón, algo complejo de entender, y para mi existía una analogía que encontraba algo cierta, comparaba Multitenant como SQL Server, algo que un sostengo, aquí les explico mi analogía:

  • la CDB$ROOT, es como la master y msdb del SQLSERVER,
  • La instancia de la base de datos es como el motor en los Servicios de Windows ejecutandose si se apaga  ninguna Base de Datos atachada se puede acceder
  • Las bases de datos , pueden desconectarse y posteriormente pegarse o atacharse, a la misma Instancia Principal o otra en otro servidor
  • Pueden crearse backups de las bases de datos
  • No deben existir Objetos de usuario en la CDB$ROOT y/o la master o msdb.

Habiendo aclarado mi analogía, expongo el acceso.

Parecía complejo y tedioso el conectarse a una PDB en el mismo servidor de Base de datos al inicio, pues si no usábamos  TNSNAMES o easy connect, solo podíamos cambiándonos de contenedor en la sesión así:

[oracle@nodo1 ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Fri Oct 7 15:57:33 2022

Version 19.15.0.0.0

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

Connected to:

Oracle Database 19c EE Extreme Perf Release 19.0.0.0.0 - Production

Version 19.15.0.0.0

SQL> show pdbs;

    CON_ID CON_NAME   OPEN MODE  RESTRICTED

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

2 PDB$SEED  READ ONLY  NO

3 MYPLUGDB3_NEW  READ WRITE NO

SQL> 
SQL> show con_name

CON_NAME

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

CDB$ROOT

SQL> 




SQL> show pdbs;

    CON_ID CON_NAME   OPEN MODE  RESTRICTED

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

2 PDB$SEED  READ ONLY  NO

3 MYPLUGDB3_NEW  READ WRITE NO

SQL> alter session set container=MYPLUGDB3_NEW;

Session altered.

SQL> show con_name

CON_NAME

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

MYPLUGDB3_NEW

SQL>

Ahora bien, desde 18c, es posible definir una nueva variable de ambiente, que permita conectarse directamente a una Base de Datos sin necesidad de pasar primero por el contenedor raíz, así:

[oracle@nodo1 ~]$ export ORACLE_PDB_SID=MYPLUGDB3_NEW

[oracle@nodo1 ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Fri Oct 7 16:19:03 2022

Version 19.15.0.0.0

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

Connected to:

Oracle Database 19c EE Extreme Perf Release 19.0.0.0.0 - Production

Version 19.15.0.0.0

SQL> show con_name

CON_NAME

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

MYPLUGDB3_NEW

SQL>

Este formato permite, inclusive ejecutar expdp directamente en la PDB o Base de Datos pluggable sin necesidad de usar tnsnames.

Espero les sirva.

#OracleTipsSV

Saludos.