Monitor Golden Gate

Ingeniero informático, Oracle ACE, DBA y Arquitecto OCI, con más de 15 años de experiencia en plataformas Oracle. Certificado en OCI Certified Architect Professional y OCI Migration and Integration Certified Professional.
Search for a command to run...

Ingeniero informático, Oracle ACE, DBA y Arquitecto OCI, con más de 15 años de experiencia en plataformas Oracle. Certificado en OCI Certified Architect Professional y OCI Migration and Integration Certified Professional.
No comments yet. Be the first to comment.
En el artículo de hoy vamos a ver las Calendar functions en 26ai, diseñadas para simplificar la "vida" a los desarrolladores. Antes de su existencia, esto se resolvía con ingeniosas combinaciones usan
![[26ai] SQL: Calendar functions/Aggregation Filters "CALENDAR"](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fuploads%2Fcovers%2F65605419d28f19cc44df7ef1%2F587e3328-9877-4c7a-aad7-7811e251f81e.png&w=3840&q=75)
En el artículo de hoy vamos a ver como podemos recrear una PDB$Seed de manera fácil en caso que se quede corrupta y no tengamos backup. sys@> alter pluggable database PDB$SEED open read only; alter pl
![[OCI] Recreación PDB$SEED](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fuploads%2Fcovers%2F65605419d28f19cc44df7ef1%2F289ede5b-558c-4f93-b5c0-fa04680c91ca.png&w=3840&q=75)
El artículo también se encuentra publicado en Ingles English version. En el artículo de hoy vamos a ver como podemos clonar una PDB usando RMAN Active Duplicate o bien usando una instrucción DDL entre
![[OCI] Clone PDB](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fuploads%2Fcovers%2F65605419d28f19cc44df7ef1%2F8ce0c665-4a5d-459d-91cf-ffe3f47d8176.png&w=3840&q=75)
El artículo también se encuentra publicado en Ingles English version. En el artículo de hoy voy a compartir un sh que utilizo para ver de una manera rápida los jobs que se ejecutan desde Oracle Databa
![[OCI] Check Jobs DBCli](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fuploads%2Fcovers%2F65605419d28f19cc44df7ef1%2F1376a869-58fa-491e-926a-a6ead08f9c80.png&w=3840&q=75)
El artículo también se encuentra publicado en Ingles English version. En el artículo de hoy vamos a ver la nueva sintaxis introducida para simplificar aún más los joins evitando errores comunes, hacie
![[26ai] JOIN_TO_ME](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fuploads%2Fcovers%2F65605419d28f19cc44df7ef1%2F16a23f6e-ec4c-4f0a-9529-2c8a2af2ef5e.png&w=3840&q=75)
A continuación pongo un ejemplo de como realizo el monitoreo a nivel de golden gate, para avisarme en caso que un proceso este en estado stopped o abended.
Como podéis observar en un sh sencillo que lo que hace es enviarte una alerta al correo electrónico en caso que tengamos un proceso ko.
El sh lo que hace es obtener la información de los procesos de nuestro proceso ogg "info all" y leer esa información en busca de procesos que cumplan el criterio que buscamos "egrep 'STOP|ABEND'".
El script como podéis observar no utilizo mailx sino utiliza la api de Oracle utl_smtp por cuestiones de seguridad dentro del propio cliente.
#!/bin/sh
LOG=`date +"%d%m%y%H%M%S"`.log
EMAIL="XXXXXXX"
OIFS=$IFS
IFS="
"
NIFS=$IFS
function getInfo {
INFO=`$OGG_HOME/ggsci << EOF
info all
exit
EOF`
}
function readInfo {
for line in $INFO
do
if [[ $(echo "${line}"|egrep 'STOP|ABEND' >/dev/null;echo $?) = 0 ]]
then
NAME=$(echo "${line}" | awk -F" " '{print $3}')
STATS=$(echo "${line}" | awk -F" " '{print $2}')
TYPE=$(echo "${line}" | awk -F" " '{print $1}')
$ORACLE_HOME/bin/sqlplus -s ${VUSER}/${VPASS}@${LOCAL_SID} <<-EoLoad
Declare
AUTH_SENDER Varchar2(100) := XXXXX;
AUTH_ROBOT_USER Varchar2(100) := XXXX;
AUTH_ROBOT_PASS Varchar2(100) := XXXXXX;
AUTH_PORT Varchar2(100) := XXXXX;
AUTH_SMTP Varchar2(100) := XXXXX;
v_Username_B64 Varchar2(1000);
v_Password_B64 Varchar2(1000);
id_Smtp_Enel Utl_Smtp.Connection;
v_Replies Utl_Smtp.Replies;
l_Boundary Varchar2(50) := '----=*#abc1234321cba#*=';
Begin
v_Username_B64 := Utl_Raw.Cast_To_Varchar2(Utl_Encode.Base64_Encode(Utl_Raw.Cast_To_Raw(AUTH_ROBOT_USER)));
v_Password_B64 := Utl_Raw.Cast_To_Varchar2(Utl_Encode.Base64_Encode(Utl_Raw.Cast_To_Raw(AUTH_ROBOT_PASS)));
id_Smtp_Enel := Utl_Smtp.Open_Connection( AUTH_SMTP, AUTH_PORT );
v_Replies := Utl_Smtp.Ehlo(id_Smtp_Enel, AUTH_SMTP );
Utl_Smtp.command(id_Smtp_Enel,'AUTH', 'LOGIN');
Utl_Smtp.command(id_Smtp_Enel, v_Username_B64);
Utl_Smtp.command(id_Smtp_Enel, v_Password_B64);
Utl_Smtp.Mail(id_Smtp_Enel,AUTH_SENDER);
Utl_Smtp.rcpt(id_Smtp_Enel, '${EMAIL}');
Utl_Smtp.Open_Data(id_Smtp_Enel);
Utl_Smtp.Write_Data(id_Smtp_Enel, 'Date: ' || To_Char(Sysdate, 'DD-MON-YYYY HH24:MI:SS') || Utl_Tcp.Crlf);
Utl_Smtp.Write_Data(id_Smtp_Enel, 'To: '||AUTH_SENDER||' ' || Utl_Tcp.Crlf);
Utl_Smtp.Write_Data(id_Smtp_Enel, 'From: '||AUTH_SENDER||' ' || Utl_Tcp.Crlf);
Utl_Smtp.Write_Data(id_Smtp_Enel, 'Subject: '||'${TYPE}:${NAME} - STATUS: ${STATS}'||' '|| Utl_Tcp.Crlf);
Utl_Smtp.Write_Data(id_Smtp_Enel, 'Reply-To: ${EMAIL}' || Utl_Tcp.Crlf);
Utl_Smtp.Write_Data(id_Smtp_Enel, 'MIME-Version: 1.0' || Utl_Tcp.Crlf);
Utl_Smtp.Write_Data(id_Smtp_Enel,'Content-Type: multipart/alternative; boundary="' ||l_Boundary || '"' || Utl_Tcp.Crlf || Utl_Tcp.Crlf);
Utl_Smtp.Write_Data(id_Smtp_Enel, '--' || l_Boundary || Utl_Tcp.Crlf);
Utl_Smtp.Write_Data(id_Smtp_Enel,'Content-Type: text/html; charset="iso-8859-1"' ||Utl_Tcp.Crlf || Utl_Tcp.Crlf);
Utl_Smtp.write_data(id_Smtp_Enel, 'The process ${NAME} is ${STATS}');
Utl_Smtp.Write_Data(id_Smtp_Enel, Utl_Tcp.Crlf || Utl_Tcp.Crlf);
Utl_Smtp.Write_Data(id_Smtp_Enel, Utl_Tcp.Crlf || Utl_Tcp.Crlf);
Utl_Smtp.Write_Data(id_Smtp_Enel, '--' || l_Boundary || '--' || Utl_Tcp.Crlf);
Utl_Smtp.Close_Data(id_Smtp_Enel);
Utl_Smtp.Quit(id_Smtp_Enel);
End;
/
EoLoad
fi
done
}
export OGG_HOME=/ogg/19c
export ORACLE_HOME=/u01/app/oracle/product/19.0.0.0/dbhome_1
export LD_LIBRARY_PATH=/u01/app/oracle/product/19.0.0.0/dbhome_1/lib
getInfo
readInfo
El script lo programo vía crontab cada 5 minutos.
*/5 * * * * /home/ogguser/scripts/getinfo.sh > /home/ogguser/scripts/getinfo.log
Pongo un ejemplo de un envío de una alerta

¡Espero que os sirva!