Registrando una BBDD Oracle SEHA sobre ACFS vinculado al montaje de los FileSystem en el nodo activo

Photo by Jess Bailey on Unsplash

Registrando una BBDD Oracle SEHA sobre ACFS vinculado al montaje de los FileSystem en el nodo activo

Configuración y pruebas

El escenario que se ha planteado en este caso a la hora de hacer una configuración de BBDD Oracle Standard Edition 2 (SE2) SEHA es poder tener los volúmenes donde residen los datafiles de la BBDD montados únicamente en el nodo en el que da servicio a ésta.

En este artículo partiremos de una BBDD SINGLE que creamos de prueba, denominada dummy, la cual estará desplegada sobre un volumen ACFS que crearemos para dicha prueba de configuración en un cluster de dos nodos. Detallaré pruebas, chequeos y problemas que han surgido en el proceso.

ComponenteVersiónRU/RUR/Release
Grid19.1419.14.0.0.220118
BBDD19.1419.14.0.0.220118
SOOracle Linux Server7.9

Para ello comenzaremos con la creación del volumen. Partimos de un Diskgroup con espacio suficiente para tal tarea por lo que no realizaré la comprobación previa.

ASMCMD [+] > volcreate -G data -s 5G VOLPRUHA

Comprobamos que el volumen está creado.

ASMCMD [+] > volinfo -G data VOLPRUHA
Diskgroup Name: DATA

         Volume Name: VOLPRUHA
         Volume Device: /dev/asm/volpruha-359
         State: ENABLED
         Size (MB): 5120
         Resize Unit (MB): 64
         Redundancy: UNPROT
         Stripe Columns: 8
         Stripe Width (K): 1024
         Usage:
         Mountpath:

Creamos el filesystem utilizando el volumen existente del paso anterior y lo registramos para dar servicio en el nodo activo en éste caso (oracle01). El directorio /dbvolumenes/pruebaha ha sido creado previamente en ambos nodos.

[grid@oracle01 ~]$ /sbin/mkfs -t acfs /dev/asm/volpruha-359
mkfs.acfs: version                   = 19.0.0.0.0
mkfs.acfs: on-disk version           = 46.0
mkfs.acfs: volume                    = /dev/asm/volpruha-359
mkfs.acfs: volume size               = 5368709120  (   5.00 GB )
mkfs.acfs: Format complete.

[root@oracle01 ~]# export ORACLE_HOME=/u01/app/19.3.0/grid
[root@oracle01 ~]# $ORACLE_HOME/bin/srvctl add filesystem -device /dev/asm/volpruha-359 -path /dbvolumenes/pruebaha -node oracle01 -user oracle -mountowner oracle -mountgroup oinstall -fstype ACFS -autostart ALWAYS

[root@oracle01 ~]# $ORACLE_HOME/bin/srvctl status filesystem -d /dev/asm/volpruha-359
El sistema de archivos de ACFS /dbvolumenes/pruebaha no está montado

[root@oracle01 ~]# $ORACLE_HOME/bin/srvctl start filesystem -d /dev/asm/volpruha-359

[root@oracle01 ~]# $ORACLE_HOME/bin/srvctl status filesystem -d /dev/asm/volpruha-359
El sistema de archivos de ACFS /dbvolumenes/pruebaha está montado en los nodos oracle01

Comprobamos el registro del volumen ACFS y el recurso :

[grid@oracle01 ~]$ crsctl  stat res -w "TYPE = ora.acfs_cluster.type"
NAME=ora.data.volpruha.acfs
TYPE=ora.acfs_cluster.type
TARGET=ONLINE
STATE=ONLINE on oracle01

[grid@oracle01 ~]$  /sbin/acfsutil registry
Mount Object:
  Device: /dev/asm/volpruha-359
  Mount Point: /dbvolumenes/pruebaha
  Disk Group: DATA
  Volume: VOLPRUHA
  Options: none
  Nodes: oracle01 
  Accelerator Volumes:

Ya tendríamos el almacenamiento preparado para nuestra BBDD, por lo que procedemos en éste caso a crearla con DBCA:

[oracle@oracle01 ]$ dbca -silent -createDatabase        \
     -databaseConfigType SINGLE                         \
     -templateName General_Purpose.dbc                  \
     -gdbname dummy -sid  dummy                         \
     -characterSet AL32UTF8                             \
     -sysPassword dummy                                 \
     -systemPassword dummy                              \
     -createAsContainerDatabase false                   \
     -totalMemory 2000                                  \
     -storageType FS                                    \
     -datafileDestination /dbvolumenes/pruebaha              \
     -emConfiguration NONE

La creación arroja el siguiente error, el cual investigaremos a continuación.

Database: 19c Release 1
Error code: DBT-06305
Description: The location is not registered as a resource in the Oracle Grid Infrastructure.
Cause: The specified location (%s) is detected as an Oracle ACFS location that is not registered as a resource in the Oracle Grid Infrastructure.
Action: Register the ACFS location as a resource in the Oracle Grid Infrastructure. *FQN: oracle.assistants.common.resource.AssistantErrorCode.ACFS_UNREGISTERED_WITH_SRVCTL

El recurso de ACFS ha sido creado, por lo que revisamos el log de creación de DBCA en detalle para ver qué chequeo realiza:

[main] [ 2023-02-06 06:28:35.521 EST ] [CRSCTLUtil.isACFSReg4MountPoint:1301]  Canonical mount point /dbvolumenes/pruebaha
[main] [ 2023-02-06 06:28:35.521 EST ] [CRSCTLUtil.isACFSReg4MountPoint:1325]  Command to execute: stat resource -w (TYPE = ora.acfs.type)||(TYPE = ora.dbaasfs.type) -attr MOUNTPOINT_PATH -p
[main] [ 2023-02-06 06:28:35.521 EST ] [CmdToolUtil.doexecuteLocally:1497]  OS Name is...Linux
[main] [ 2023-02-06 06:28:35.521 EST ] [CmdToolUtil.enforceEnglishVars:1692]  Set environment for English language
[main] [ 2023-02-06 06:28:35.521 EST ] [CmdToolUtil.enforceEnglishVars:1693]  OS Name is...Linux
[Thread-94] [ 2023-02-06 06:28:35.522 EST ] [StreamReader.run:62]  In StreamReader.run
[main] [ 2023-02-06 06:28:35.522 EST ] [RuntimeExec.runCommand:305]  runCommand: Waiting for the process

Nuestro recurso es un recurso de tipo acfs_cluster. Concluímos que para DBCA no es una configuración válida atendiendo al chequeo que realiza, donde espera un recurso de ora.acfs.type. ¿Posible BUG?

[grid@oracle01 ~]$ crsctl  stat res -w "TYPE = ora.acfs_cluster.type"
NAME=ora.data.volpruha.acfs
TYPE=ora.acfs_cluster.type
TARGET=ONLINE
STATE=ONLINE on oracle01

[grid@oracle01 ~]$  crsctl stat resource -w "TYPE = ora.acfs.type" -attr /dbvolumenes/pruebaha -p
CRS-4412: Attribute '/dbvolumenes/pruebaha' does not exist.

En este caso he optado por registrar el volumen en ambos nodos, crear la BBDD y una vez desplegada registrar el volumen como recurso de cluster en únicamente un nodo, con posibilidad de moverse al otro nodo cuando movamos la BBDD.

Comenzamos por el FS:

-- Eliminamos el FS como recurso de cluster vinculado a un nodo
[root@oracle01 ~]# export ORACLE_HOME=/u01/app/19.3.0/grid
[root@oracle01 ~]# $ORACLE_HOME/bin/srvctl status filesystem -d /dev/asm/volpruha-359
El sistema de archivos de ACFS /dbvolumenes/pruebaha está montado en los nodos oracle01 

[root@oracle01 ~]# $ORACLE_HOME/bin/srvctl stop filesystem -d /dev/asm/volpruha-359

[root@oracle01 ~]# $ORACLE_HOME/bin/srvctl status filesystem -d /dev/asm/volpruha-359
El sistema de archivos de ACFS /dbvolumenes/pruebaha no está montado

[root@oracle01 ~]# $ORACLE_HOME/bin/srvctl remove filesystem -d /dev/asm/volpruha-359


-- Regitrar FS para ser montado en ambos nodos
[root@oracle01 ~]# export ORACLE_HOME=/u01/app/19.3.0/grid

[root@oracle01 ~]# $ORACLE_HOME/bin/srvctl add filesystem -device /dev/asm/volpruha-359 -volume VOLPRUHA -diskgroup data -path /dbvolumenes/pruebaha -user oracle -mountowner oracle -mountgroup oinstall -autostart ALWAYS

[root@oracle01 ~]# $ORACLE_HOME/bin/srvctl status filesystem -d /dev/asm/volpruha-359

-- Chequeamos que aparece como recurso válido para DBCA
[grid@oracle01 ~]$ crsctl stat resource -w "((TYPE = ora.acfs.type) or (TYPE = ora.dbaasfs.type))"

NAME=ora.data.volpruha.acfs 
TYPE=ora.acfs.type
TARGET=OFFLINE, OFFLINE
STATE=OFFLINE, OFFLINE

[grid@oracle01 ~]$  crsctl stat resource -w "TYPE = ora.acfs_cluster.type"

Creamos la BBDD, ahora no encontramos errores y dispondremos de nuestra BBDD de prueba operativa.

[oracle@oracle01 ]$ dbca -silent -createDatabase        \
     -databaseConfigType SINGLE                         \
     -templateName General_Purpose.dbc                  \
     -gdbname dummy -sid  dummy                         \
     -characterSet AL32UTF8                             \
     -sysPassword dummy                                 \
     -systemPassword dummy                              \
     -createAsContainerDatabase false                   \
     -totalMemory 2000                                  \
     -storageType FS                                    \
     -datafileDestination /dbvolumenes/pruebaha         \
     -emConfiguration NONE

A nivel de BBDD realizamos la siguiente configuración, con las que buscamos que la BBDD se registre en el nodo en el que esté operativa y que tenga un spfile centralizado (ubicado en el FS que movemos)

-- Listener 

SQL> show parameter local_listener

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
local_listener                       string      LISTENER_DUMMY


SQL> alter system reset local_listener scope=both;

System altered.

SQL> show parameter local_listener

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
local_listener                       string


-- Movemos el spfile al volumen. Dejo una copa del pfile en el FS

[oracle@oracle01 ~]$ mkdir /dbvolumenes/pruebaha/DUMMY/spfile

create pfile='/dbvolumenes/pruebaha/DUMMY/spfile/initdummy.ora' from spfile;
create spfile='/dbvolumenes/pruebaha/DUMMY/spfile/spfiledummy.ora' from pfile='/dbvolumenes/pruebaha/DUMMY/spfile/initdummy.ora';

Llegamos al punto inicial: registrar el FS como recurso de clúster que se ejecute en únicamente un nodo, con posibilidad de montaje en el nodo pasivo.

-- Desregistramos BBDD. La registraremos posteriormente
[oracle@oracle01 ~]$ srvctl stop database -d dummy
[oracle@oracle01 ~]$ srvctl remove database -d dummy
¿Desea eliminar la base de datos dummy? (y/[n]) y

-- Desregistrar FS 
[root@oracle01 ~]# export ORACLE_HOME=/u01/app/19.3.0/grid
[root@oracle01 ~]# $ORACLE_HOME/bin/srvctl status filesystem -d /dev/asm/volpruha-359
El sistema de archivos de ACFS /dbvolumenes/pruebaha está montado en los nodos oracle01,oracle02

[root@oracle01 ~]# $ORACLE_HOME/bin/srvctl stop filesystem -device /dev/asm/volpruha-359

[root@oracle01 ~]#  $ORACLE_HOME/bin/srvctl remove filesystem -device /dev/asm/volpruha-359

[root@oracle01 ~]#  $ORACLE_HOME/bin/srvctl status filesystem -device /dev/asm/volpruha-359
PRCA-1070 : El recurso del sistema de archivos no existe para el dispositivo de volumen "/dev/asm/volpruha-359"

-- Registrar FS como recurso
[root@oracle01 ~]# $ORACLE_HOME/bin/srvctl add filesystem -device /dev/asm/volpruha-359 -path /dbvolumenes/pruebaha -node oracle01 -user oracle -mountowner oracle -mountgroup oinstall -fstype ACFS -autostart ALWAYS

[root@oracle01 ~]# $ORACLE_HOME/bin/srvctl status filesystem -device /dev/asm/volpruha-359
El sistema de archivos de ACFS /dbvolumenes/pruebaha no está montado

[root@oracle01 ~]# $ORACLE_HOME/bin/srvctl start filesystem -device /dev/asm/volpruha-359

[root@oracle01 ~]# $ORACLE_HOME/bin/srvctl status filesystem -device /dev/asm/volpruha-359
El sistema de archivos de ACFS /dbvolumenes/pruebaha está montado en los nodos oracle01

Registramos la BBDD como recurso:


[oracle@oracle01 ~]$ srvctl add database -db dummy -oraclehome /u01/app/oracle/product/19.0.0/dbhome_1 -dbtype SINGLE -spfile /dbvolumenes/pruebaha/DUMMY/spfile/spfiledummy.ora -node oracle01 

[oracle@oracle01 ~]$ srvctl modify database -db dummy -node oracle01,oracle02   -acfspath "/dbvolumenes/pruebaha"

Realizamos pruebas de relocate

[oracle@oracle01 ~]$  srvctl relocate database -db dummy -node oracle02
PRCR-1105 : Fallo al reubicar el recurso ora.dummy.db en el nodo oracle02
PRCR-1089 : Fallo al reubicar el recurso ora.dummy.db.
CRS-2527: No se ha podido iniciar ''ora.dummy.db'' porque tiene una dependencia ''hard'' en ''ora.data.volpruha.acfs''
CRS-2718: El servidor ''oracle02'' no es un miembro de alojamiento del recurso ''ora.data.volpruha.acfs''

Ups! hay que tener en cuenta que el FS puede ser montado en cualquiera de los nodos

-- Modifico el recurso
[root@oracle01 ~]# export ORACLE_HOME=/u01/app/19.3.0/grid
[root@oracle01 ~]# $ORACLE_HOME/bin/srvctl modify filesystem -device /dev/asm/volpruha-359 -node oracle01,oracle02

Volvemos a lanzar el relocate y funciona perfectamente. La forma de actuar será parando ordenadamente la BBDD en el nodo activo, desmonta el volumen, monta en el nodo pasivo y levanta la BBDD en éste.


-- Vuelvo a lanzar relocate
[oracle@oracle01 ~]$  srvctl relocate database -db dummy -node oracle02

[root@oracle01 ~]# $ORACLE_HOME/bin/srvctl status filesystem -device /dev/asm/volpruha-359
El sistema de archivos de ACFS /dbvolumenes/pruebaha está montado en los nodos oracle01 

-- Volvemos a ubicar el recurso en el nodo activo
[oracle@oracle01 ~]$  srvctl relocate database -db dummy -node oracle01 

[root@oracle01 ~]# $ORACLE_HOME/bin/srvctl status filesystem -device /dev/asm/volpruha-359
El sistema de archivos de ACFS /dbvolumenes/pruebaha está montado en los nodos oracle02

Pregunta del millón: Qué pasaría si tenemos dos bases de datos vinculadas y registradas en el mismo volumen?

He realizado una prueba creando la BBDD dummy2 sobre el mismo volumen, y el resultado es el esperado al tener dependencias sobre el volumen de ACFS. Al realizar el relocate de una de ellas la otra se mueve también sin tener que especificarlo, parando de forma ordenada como la que ha recibido la orden inicialmente.