Qué es Oracle Restart

Oracle Restart permite que en caso de caída de hardware o software o de reinicio del sistema, la base de datos de una sola instancia so levante automáticamente

Estos son los componentes que Oracle Restar levanta automáticamente:

  • La instancia de base de datos.
  • Listener
  • Los servicios de base de datos (No incluye los servicios por defecto porque estos los maneja la base de datos directamente)
  • La instancia de ASM
  • Diskgroup de ASM (se encarga de montar los discos)
  • ONS (Oracle Notification Service).

Oracle Restart hace monitorizaciones periódicas para ver el estado de los componentes que hemos listado anteriormente y caso de que alguno reporte un fallo lo para y lo reinicia.

Este software es solo para monohost . Para cluster esta funcionalidad la proporciona clusterware.

Oracle Restart maneja la dependencias entre los diferentes componentes a la hora de levantarse, por ejemplo primero monta los discos, luego levanta la instancia de ASM , la instancia de base de datos y el listener.

La manera de levantar y parar los componente con Oracle Restart es a través de Server Control (SRVCTL). Cuando se utiliza Oracle Restart Oracle recomienda que se utilice srvcctl para parar y levantar los componentes.

La principal diferencia de iniciar un componente con Oracle restar o con las utilidades de oracle como SQL*Plus o lsnrrctl es que el primero levantará todas las dependencias de manera ordenada.

Para parar o levantar Oracle Restart utilizaremos CRSCTL. Normalmente se utiliza crsctl para labores de mantenimiento o actualización del software.

Oracle Restart utiliza Oracle Notification Service (ONS) y Oracle Advance Queues para publicar eventos de disponibilidad de tipo Fast Application Notification (FAN)

Como simular con un mongodb de un solo nodo un Replica Set

A veces en entorno de desarrollo necesitamos simular que tenemos un replica para probar algunas de las opciones de este.

Existe una forma muy sencilla de  simularlo:

  • Modificar el mongod.conf se tiene que informar el replSetName
replication:  
   replSetName: "<replica-set name>"
  • Iniciar la réplica con el comando rs.initiate()
mongo <IP>:<PORT>/admin -u admin -p passadmin
rs.initiate()

Con esto conseguimos una réplica de un solo nodo.

Cambiar el hostname a una instancia de un solo nodo con Oracle Restart en Oracle 19

A lo largo de este post voy a explicar como cambiar el hostname y la ip de una instancia Oracle de un solo nodo, instalada con Oracle Restart. Lo primero es desconfigurar el el grid, para hacer esto tenemos que invocar a un perl como usuario root.

 export GRID_HOME=/opt/app/19.0.0/grid export ORACLE_SID=+ASM $GRID_HOME/perl/bin/perl -I $GRID_HOME/perl/lib -I $GRID_HOME/crs/install $GRID_HOME/crs/install/roothas.pl -deconfig 

Una vez desconfigurado el sistema es necesario cambiar el hostname en los siguientes ficheros y con el siguiente comando:

/etc/sysconfig/network
/etc/hosts 
hostname <nuevo hostname>

Una vez cambiado ejecutamos el siguiente comando

$GRID_HOME/perl/bin/perl -I $GRID_HOME/perl/lib -I /opt/app/19.0.0/grid/crs/install /opt/app/19.0.0/grid/crs/install/roothas.pl

 Como usuario propietario del grid modifica las propiedades del css (grid or oracle)

/opt/app/19.0.0/grid/bin/crsctl modify resource "ora.cssd" -init -attr "AUTO_START=1" -unsupported

Reinicia el OHAS como usuario dueño de la Infraestuctura Grid

$> $GRID_HOME/bin/crsctl stop has
$> $GRID_HOME/bin/crsctl start has

Comprueba el estado de CSS y OHAS :

$GRID_HOME/bin//bin/crsctl check has
$GRID_HOME/bin//bin/crsctl check css
$GRID_HOME//bin/ crsctl stat resource
$GRID_HOME/bin/crsctl stat res -t

Si el servicio CSS y OHAS no arranca, reinicia el servidor

Recrea el listener por defecto (LISTENER) , utiliza NETCAT GUI -silent si no tienes acceso gráfico. Lo primero es copiar el netcap.rsp que hay de ejemplo a un directorio local, modificarlo y luego ejecutar el netcap llamando a ese fichero.

copy $GRID_HOME/assistants/netca/netca.rsp local_directory

$GRID_HOME/bin/netca -silent -responsefile /local_directory/netca.rsp

Crea el fichero init+ASM.ora en de directorio /dbs con los siguiente parámetros:

more /tmp/initasm.ora
+ASM.__oracle_base='/opt/app/grid'#ORACLE_BASE set from in memory value
*.asm_diskstring='<asm_diskstring>
*.asm_power_limit=1
*.large_pool_size=12M
*.remote_login_passwordfile='EXCLUSIVE'

Añade la instancia ASM a la infraestructura Grid como el el usuario propietario de software:

$> $GRID_HOME/bin/srvctl add asm

Activa el Auto Start de la istancia ASM como usuario grid u oracle (dependiendo del usuario propietariod del software):

$> $GRID_HOME/bin/crsctl modify resource "ora.asm" -init -attr "AUTO_START=1" -unsupported

Asegúrate que los discos se pueden ver con kfod como usuario grid u oracle OS:

$>  $GRID_HOME/bin/kfod asm_diskstring='/dev/rdsk/data*' disks=all

Inicializa la instancia ASM como usuario grid u oracle OS:

$> export ORACLE_SID=+ASM
$> $GRID_HOME/bin/sqlplus "/as sysasm"
SQL> startup pfile=init+ASM.ora 
SQL> select name,state,type from v$asm_diskgroup;
NAME STATE TYPE

DATA DISMOUNTED
SQL> alter diskgroup data mount;
SQL> show parameter asm

Valida que los discos candidatos han sido descubiertos:

SQL> select path from v$asm_disk;

Crea un nuevo spfile para la instancia

SQL> create spfile='+DATA/ASM/PARAMETERFILE/spfile' from pfile;

Añade el listener y el spfile a la instancia de ASM.

$> $GRID_HOME/bin/srvctl modify asm -p '+DATA/ASM/PARAMETERFILE/spfile'
$> $GRID_HOME/bin/srvctl modify asm -l LISTENER

Reinicia y valida los el OHAS(Oracle Restart) :

$>  $GRID_HOME/bin/crsctl stop has
$>  $GRID_HOME/bin/crsctl start has
$>  $GRID_HOME/bin/crsctl stat res
$> $GRID_HOME/bin/crsctl stat res -t

Añade la base de datos como usuario oracle

srvctl add database -db cdb -oraclehome /opt/app/oracle/product/19.0.0/dbhome_1 -spfile '+DATA/CDB/PARAMETERFILE/spfile.270.1040152357' -instance CDB

Añade el servicio de la base de datos

/opt/app/oracle/product/19.0.0/dbhome_1/bin/srvctl add service -database CDB -service CLIDB_SERVICE -pdb CLIDB

Indicar read preference en mongo shell

 

Esto es un pequeño ejemplo de como indicar readpreference desde mongo shell. No se puede hacer directamente desde la Uri. Una vez que te conectas a la replica, existe un método para obteber un secundario.

./mongo «mongodb://<user>:<password>@<IP_NODE1>:<PORT>,<IP_NODE2>:<PORT>/<DB NAME>?w=1&maxPoolSize=100&waitQueueMultiple=5&replicaSet=<ReplicaSet Name>»
MongoDB shell version v4.0.9
connecting to:
2019-07-09T08:59:06.585+0200 I NETWORK [js] Starting new replica set monitor for <ReplicaSet Name>/<IP_NODE1>:<PORT>,<IP_NODE1>:<PORT>
2019-07-09T08:59:06.591+0200 I NETWORK [ReplicaSetMonitor-TaskExecutor] Successfully connected to <IP_NODE2>:<PORT> (1 connections now open to <IP_NODE2>:<PORT> with a 5 second timeout)

Implicit session: session { «id» : UUID(«6c221b5b-5d9a-463f-bb15-db832f5e14d3») }
MongoDB server version: 4.0.9
rs0:PRIMARY> db.getMongo().setReadPref(‘secondary’)
rs0:PRIMARY> db.USERS.count();
2019-07-09T08:59:25.155+0200 I NETWORK [js] Successfully connected to <IP_NODE1>:<PORT> (1 connections now open to <IP_NODE1>:<PORT> with a 0 second timeout)
291
rs0:PRIMARY> db.getMongo().setReadPref(‘secondary’,[{‘dc’:’CSCBackup’}])
rs0:PRIMARY> db.USERS.count();

Un vistazo a la tecnología Flashback

La tecnología flashback son un grupo de facilidades que permiten ver estados pasados de los objetos de la base de datos o regresar a estados previos de los objetos sin utilizar un punto de recuperación en el tiempo.

  • Con el flashback se puede hacer los siguiente:
  • Hacer consultas que devuelven datos pasados.
  • Hacer consultas que devuelven metadatos que muestran en detalle la historia de los cambios en la base de datos.
  • Recuperar tablas o filas a un punto previo en el tiempo.
  • Automáticamente seguir y archivas cambios transaccionales de datos.
  • Hacer roll back a una transacción y sus transacciones dependientes mientras la base de datos se mantiene online.

Flashback utiliza Automatic Undo Management (AUM) para obtener los metadatos y el histórico de las transacciones. Utilizan los datos de uno, que son registros de los efectos de las transacciones individuales. Por ejemplo, si un usuario ejecuta un update y cambia el salario de 1000 a 1100, oracle almacena 100 en el undo.

Estos datos son persistentes a un Undo y sobrevive a una parada de la base de datos. Utilizando flasback se pueden recuperar datos cuando se produce un daño lógico.

Facilidades para el desarrollo de aplicaciones

Oracle Flashback Query

Se utiliza para obtener datos en momento del pasado que se especifica con la sentencia AS OF en la select. Más información Using Oracle Flashback Query (SELECT AS OF).

Oracle Flashback Version Query

Esta opción se puede utilizar para recuperar metadatos y datos históricos de un intervalo especifico (por ejemplo, para ver que alguna vez han existido en un intervalo de tiempo). Los metadatos de cada registro incluyen el momento de creación y de finalización, el tipo de operación de cambio y  metadatos pata cada registro, tipo de operación de cambio y identificación de la transacción que ha creado la versión del registro. Para crear Oracle Flashback Version Query, utilice la clausula de   VERSIONS BETWEEN en la sentencia SELECT. Para más información, ver Using Oracle Flashback Version Query.

Flashback Transaction Query

Utilice esta utilidad para obtener metadatos y datos históricos para una transacción dada o para todas las transacciones en intervalo de tiempo. Para realizar un Oracle Flashback Transaction Query, consulte la vista FLASHBACK_TRANSACTION_QUERY. Para más información, ver  Using Oracle Flashback Transaction Query.

Normalmente se utiliza Oracle Flashback Transaction Query in conjunción con Oracle Flashback Version Query que proporciona el id de la transacción que estamos buscando (ver Using Oracle Flashback Transaction Query with Oracle Flashback Version Query).

DBMS_FLASHBACK Package

Permite cambiar el reloj interno de base de datos a un momento en el pasado,  de tal forma que se puede examinar los datos en ese momento del tiempo hacer un roll back a una transaccion y sus transacciones dependientes mientras que la base de datos permanece online (see Flashback Transaction). Para más información Using DBMS_FLASHBACK Package.

Flashback Transaction

Se utiliza para hacer roll back a una transacción y sus dependencias mientras la base de datos está online. Está operación de recovery usa undo data para crear y ejecutar el la transacción correspondiente de compensación ,para regresar los datos afectados a u situación original. (Flashback Transaction es parte de DBMS_FLASHBACK package.) Para más información, ver Using DBMS_FLASHBACK Package.

Flashback Data Archive (Oracle Total Recall)

Flashback Data Archive automáticamente archiva tanto las select como Oracle Flashback Query, asegurando el acceso si tener errores de snapshot-too-old. Para más información, mira Using Flashback Data Archive (Oracle Total Recall).

Facilidades para la administración de la base de datos.

Oracle Flashback Tabla

Permite Volver a un momento determinado de tiempo. Se puede recuperar mientras la base de datos está on line, los cambios de undo son para una tabla en concreto.

Oracle Flashback Drop

Permite recuperar una table borrada con DROP TABLE . Para más información, https://cajondesastreoracle.wordpress.com/category/oracle/flashback-drop/

Oracle Flashback Database

Utilice está opción para recuperar una base de datos en un momento determinado de tiempo, deshaciendo todos los cambios que han tenido lugar hasta ese momento. Es más rápido que recuperar un backup.

Toda está información es un traducción de:

https://docs.oracle.com/cd/B28359_01/appdev.111/b28424/adfns_flashback.htm#g1026131

Para ampliar más, buenísimo este documento de la Junta de Andalucía.

https://ws001.juntadeandalucia.es/unifica/documents/10156/6325545/InfV5_JASAS_Flashback_BestPractices_TestingEnv_v620.pdf/4f963794-4f55-486d-a3a6-1f6a5ffa12f8?version=1.0

Comparar Arrays en oracle

Nos hemos encontrado con la necesidad de comparar arrays en oracle, determinar que elementos están en un array y no se encuentran en el otro.

Nos hemos encontrado con MULTISET y os pasamos un ejemplo de código que igual os puede ser útil:

 

DECLARE

TYPE strings_nt IS TABLE OF VARCHAR2(100);
paquetes_baja strings_nt;
paquetes_viejos strings_nt;
paquetes_nuevos strings_nt;

PROCEDURE mostrar_paquetes (
paquetes IN strings_nt
)
IS
BEGIN

FOR indx IN paquetes.FIRST .. paquetes.LAST
LOOP
DBMS_OUTPUT.put_line (indx || ' = ' || paquetes (indx));
END LOOP;

DBMS_OUTPUT.put_line ('_');
END mostrar_paquetes;


BEGIN


paquetes_viejos := strings_nt ('Prueba1'
, 'Prueba4'
, 'Prueba2'
);
paquetes_nuevos := strings_nt ('Prueba1'
, 'Prueba3'
, 'Prueba2'
);

paquetes_baja := paquetes_viejos
MULTISET UNION DISTINCT paquetes_nuevos;

DBMS_OUTPUT.put_line (' MULTISET UNION DISTINCT');
mostrar_paquetes (paquetes_baja);

paquetes_baja := paquetes_viejos 
MULTISET UNION paquetes_nuevos;

DBMS_OUTPUT.put_line (' MULTISET UNION ');
mostrar_paquetes (paquetes_baja);

paquetes_baja := paquetes_viejos
MULTISET EXCEPT paquetes_nuevos;

DBMS_OUTPUT.put_line (' MULTISET EXCEPT');
mostrar_paquetes (paquetes_baja);

paquetes_baja := paquetes_viejos
MULTISET INTERSECT paquetes_nuevos;

DBMS_OUTPUT.put_line (' MULTISET INTERSECT');
mostrar_paquetes (paquetes_baja);
END;
/

Esta sería la salida del procedimiento:

MULTISET UNION DISTINCT
1 = Prueba1
2 = Prueba4
3 = Prueba2
4 = Prueba3
_
MULTISET UNION 
1 = Prueba1
2 = Prueba4
3 = Prueba2
4 = Prueba1
5 = Prueba3
6 = Prueba2
_
MULTISET EXCEPT
1 = Prueba4
_
MULTISET INTERSECT
1 = Prueba1
2 = Prueba2

 

Volcado del contenido de memcached sin utilizar telnet

Creo que es la forma más sencilla de monitorizar memcached, permite visualizar el contenido de memcached

echo -e ‘lru_crawler metadump all’ | nc <IP> <PUERTO>

Lo que hacemos es utilizar Netcat o nc, es una conocida herramienta para el análisis de red, para conectarnos al puerto de memcached. Y echo -e que permite  la interpretación de escapes de barra invertida.