Agregar discos a un diskgroup en ASM. SQL*Plus VS asmca

El problema de esta semana ha venido a raíz de hacer el duplicado de una base de datos.
En un primer momento había pasado por alto que el problema fuera por el almacenamiento. ¿Quién se iba a imaginar que el estudio previo no era correcto?
Lanzo el duplicate, y después de haber copiado ya 20 datafiles, falla el proceso. ¡Qué raro! 🤨
Limpio todo bien, vuelvo a lanzar el proceso y vuelve a fallar, justo en el mismo punto, en el mismo datafile. Más raro aún.
Lo primero que llegué a pensar es que había algún problema con ese datafile en el origen, pero pronto me di cuenta que no había espacio suficiente para realizar el duplicado completo. Cuando se llenaba el diskgroup, fallaba.
El Error
input datafile file number=00056 name=/oracle/jaendb/datos/D_DATOS023.dbf
RMAN-03009: failure of backup command on prmy1 channel at 02/18/2025 16:43:27
ORA-17628: El servidor de Oracle remoto ha devuelto el error Oracle 19505
ORA-19505: fallo al identificar el archivo ""
channel prmy1 disabled, job failed on it will be run on another channel
RMAN-03009: failure of backup command on prmy2 channel at 02/18/2025 16:43:27
ORA-17628: El servidor de Oracle remoto ha devuelto el error Oracle 19505
ORA-19505: fallo al identificar el archivo ""
channel prmy2 disabled, job failed on it will be run on another channel
released channel: prmy1
released channel: prmy2
released channel: stby
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of Duplicate Db command at 02/18/2025 16:43:27
RMAN-05501: aborting duplication of target database
RMAN-03015: error occurred in stored script Memory Script
RMAN-03009: failure of backup command on prmy1 channel at 02/18/2025 16:43:27
ORA-17628: El servidor de Oracle remoto ha devuelto el error Oracle 19505
ORA-19505: fallo al identificar el archivo ""
RMAN-03009: failure of backup command on prmy2 channel at 02/18/2025 16:43:27
ORA-17628: El servidor de Oracle remoto ha devuelto el error Oracle 19505
ORA-19505: fallo al identificar el archivo ""
Un error un tanto genérico. Por más que mire trazas, alert log de la base de datos, del origen y del destino, del crs, del clúster… En ningún sitio encontré nada referente al llenado del diskgroup.
Me lo encontré tal que así
NAME TOTAL_MB FREE_MB % Libre TYPE
----------------- ---------- ---------- ---------- ------
DG_DATOS 827392 3579 ,432564008 EXTERN
DG_FRA 206848 206689 99,923132 EXTERN
La Teoría
En nuestros sistemas con ASM usamos ASMFD (ASM Filter Driver) que nos facilita bastante la vida.
Seguro que os ha pasado que tenéis discos asignados a un diskgroup, y cuando se reinicia el sistema pierden la vinculación que tenían. Es para volverse locos. Hay que tenerlo todo bien organizado y seteado, para no olvidar/perder esa relación.
Para esto tenemos ASMFD, para que un reinicio del servidor no nos afecte.
¿Qué es ASM Filter Driver?
Oracle ASMFD es una herramienta que simplifica y nos facilita la administración y configuración de los discos al eliminar la necesidad de volver a vincularlos con ASM cada vez que un servidor se reinicia.
Cuando etiquetamos un disco con ASMFD oracle inserta una información en las cabeceras de los discos para tener una referencia y aunque el disco cambie de punto de montaje al reiniciar el servidor, siempre va a saber donde localizarlo.
⚠️ A partir de Oracle Grid Infrastructure 12 c Release 2 (12.2), ASMFD y ASMLIB no son compatibles entre si. Si quieres usar ASMFD debes desinstalar ASMLIB.
Pasos Previos
¿Por qué te cuento todo esto sobre Filter Driver?
Porque antes de añadir los discos al diskgroup, vamos a necesitar varias tareas previas y te quiero poner un poco en contexto.
1. Localización y descubrimiento de los discos
El equipo de almacenamiento nos proporciona los discos, los descubre en el servidor y nos pasa la información de ellos.
ccm.1648-06.servidor1-jaendb-mdm12 214GB /dev/sdca
ccm.1648-06.servidor1-jaendb-mdm13 214GB /dev/sdcb
ccm.1648-06.servidor1-jaendb-mdm14 214GB /dev/sdcc
ccm.1648-06.servidor1-jaendb-mdm15 214GB /dev/sdcd
2. Etiquetado de discos con ASMFD
Teniendo identificados los discos y el punto de montaje que tienen dentro del servidor los vamos a etiquetar, para que tengan un nombre más reconocible.
Como anteriormente mencioné, esto hace que Oracle inserte unas marcas en las cabeceras de esos discos, para identificar qué punto de montaje corresponde a cada uno de sus discos. De ahí que sean reconocibles a pesar de un reinicio del servidor.
asmcmd afd_label JAENDB_DG_DATOS_DISCO9 /dev/sdca
asmcmd afd_label JAENDB_DG_DATOS_DISCO10 /dev/sdcb
asmcmd afd_label JAENDB_DG_DATOS_DISCO11 /dev/sdcc
asmcmd afd_label JAENDB_DG_DATOS_DISCO12 /dev/sdcd
Tras esta acción, ASMFD genera en un directorio estas relaciones que nosotros también podemos consultar en cualquier momento.
[root@servidor1 ~]# cd /dev/oracleafd/disks/
[root@servidor1 disks]# ls
JAENDB_DATOS_DISCO10 JAENDB_DATOS_DISCO3 JAENDB_DATOS_DISCO7 JAENDB_FRA_DISCO2
JAENDB_DATOS_DISCO11 JAENDB_DATOS_DISCO4 JAENDB_DATOS_DISCO8 JAENDB_FRA_DISCO3
JAENDB_DATOS_DISCO12 JAENDB_DATOS_DISCO5 JAENDB_DATOS_DISCO9 JAENDB_FRA_DISCO4
JAENDB_DATOS_DISCO1 JAENDB_DATOS_DISCO2 JAENDB_DATOS_DISCO6 JAENDB_FRA_DISCO1
[root@servidor1 disks]# cat JAENDB_DATOS_DISCO9
/dev/sdca
En caso de reinicio del servidor, el contenido de estos ficheros cambiará y se asocia al nuevo punto de montaje que el servidor haya asignado a cada disco durante el arranque.
El Procedimiento
Vamos ahora a meternos en faena. Ya tenemos los discos en el servidor y están etiquetados. Solo falta añadirlos al diskgroup. Pero hay varias formas de añadirlos… ¿Cómo lo hacemos?
Existen diferentes alternativas. Puedes elegir la que más fácil, sencilla o rápida te parezca.
1. SQL*Plus
Podemos agregar los discos mediante SQL*Plus de diferentes formas.
Usando el asterisco a modo de comodín para añadir varios discos en una sola sentencia.
Usar una sentencia para cada disco
O por último, en una sola instrucción añadir todos los discos que pretendemos agregar al diskgroup.
ALTER DISKGROUP DG_DATOS ADD DISK 'AFD:JAENDB_DATOS_DISCO*';
ALTER DISKGROUP DG_DATOS ADD DISK 'AFD:JAENDB_DATOS_DISCO9';
ALTER DISKGROUP DG_DATOS ADD DISK 'AFD:JAENDB_DATOS_DISCO10';
ALTER DISKGROUP DG_DATOS ADD DISK 'AFD:JAENDB_DATOS_DISCO11';
ALTER DISKGROUP DG_DATOS ADD DISK 'AFD:JAENDB_DATOS_DISCO12';
ALTER DISKGROUP DG_DATOS ADD DISK
'AFD:JAENDB_DATOS_DISCO9',
'AFD:JAENDB_DATOS_DISCO10',
'AFD:JAENDB_DATOS_DISCO11',
'AFD:JAENDB_DATOS_DISCO12';
2. asmca (linea de comando)
Otra forma de hacerlo es con la herramienta asmca en modo silencioso, sin necesidad de usar el entorno gráfico. (Importante hacerlo con el usuario GRID de sistema operativo)
asmca -silent -addDisk -diskGroupName DG_DATOS -disk 'AFD:JAENDB_DATOS_DISCO9'
asmca -silent -addDisk -diskGroupName DG_DATOS -disk 'AFD:JAENDB_DATOS_DISCO10'
asmca -silent -addDisk -diskGroupName DG_DATOS -disk 'AFD:JAENDB_DATOS_DISCO11'
asmca -silent -addDisk -diskGroupName DG_DATOS -disk 'AFD:JAENDB_DATOS_DISCO12'
3. asmca (entorno gráfico)
Tendremos que tener configuradas las X-Windows para poder lanzar esta aplicación de manera gráfica.
[grid@servidor1 ~]$ export DISPLAY=localhost:1.0
[grid@servidor1 ~]$ asmca
Cuando se abre la ventana, veremos la siguiente pantalla. Bastará con pulsar sobre «Grupos de Discos» en el panel izquierdo y sobre el diskgroup que queramos actuar, botón derecho del ratón para seleccionar la opción «Agregar Discos…«

Cargará esta nueva ventana, en la que podemos ver los discos que ya son miembros del diskgroup, y cuales son candidatos o elegibles para ser añadidos. Solamente tenemos que marcar los que queramos y pulsar abajo en el botón Aceptar.

Tanto desde SQL*Plus como con asmca, además de agregar discos, se pueden realizar otras muchas tareas, como el borrado de discos o diskgroups, modificación de tamaño, consultas de datos, etc.
Además, para administrar y gestionar todo lo referente a ASM, también podemos usar la consola de comandos, asmcmd.
¿Qué opción te parece mejor? ¿Cuál usas tu habitualmente? ¿SQL*Plus o asmca? ¿Por qué? 🤔