Cuando nos encontramos trabajando en un entorno RAC de Oracle, surge un nuevo concepto que debemos conocer: ASM (Automatic Storage Management). En esta entrada no voy a explicar en que consiste, dado que es una entrada muy teórica y creo que no tendría cabida en este portal. Quizás en un futuro lo explique en mi web personal.
Hoy solo nos atañe una cosa: el manejo de discos en ASM. Es decir: añadirlos o quitarlos de un diskgroup.
¿Qué es un diskgroup?
Quizás este término si que nos interese mencionarlo, dado que para entender las operaciones que vamos a realizar, debemos conocerlo.
Un diskgroup es, tal como su nombre indica, un grupo de discos, el cual Oracle maneja como una única unidad de almacenamiento donde tener los archivos. Este grupo de discos puede estar formado por:
- Un disco duro completo o una partición del mismo
- Un disco o una partición de un array
- Volúmenes lógicos
- NFS
Al principio suele costar entender el concepto, dado que las rutas de localización no funcionan como en un filesystem, pero rápidamente te harás a ello.
Oracle distribuye los datos de forma equitativa entre los discos, facilitando la administración de los mismos, ya que si decides añadir o quitar una nueva unidad, los datos se balancearan entre los disponibles.

Variables de entorno
Al trabajar con instancias de +ASM, debemos tener en cuenta que las variables de entorno son distintas que las usadas para las bases de datos. Un ejemplo de variables necesarias serían:
export ORACLE_BASE=/oracle/app/base
export ORACLE_HOME=/oracle/app/grid/19300
export GRID_HOME=/oracle/app/grid/19300
export ORACLE_SID=+ASM1
export PATH=$ORACLE_HOME/bin:$PATH
Fíjate que el $ORACLE_HOME apunta a la misma ruta de $GRID_HOME, además de que el SID utiliza la instancia +ASM. Estas variables puedes almacenarlas en un fichero .profile para incorporarlas rápidamente a tu entorno.
Sentencias para el manejo de discos en ASM
Ahora que ya sabemos que las variables de entorno son distintas a la hora de manejar una instancia +ASM, vamos a detallar algunas sentencias para el manejo de discos en ASM.
Debemos tener en cuenta que las instancias de +ASM se manejan desde el perfil de sysasm, lanzando SQL Plus así:
bash-4.2$ sqlplus "/as sysasm"
Ver los diskgroups de ASM
Para ver los diskgroups que tenemos en nuestro ASM, utilizamos la siguiente query:
SQL> set lines 2000 pages 99
SQL> select group_number, name, state, type, total_mb, free_mb from v$asm_diskgroup;
GROUP_NUMBER NAME STATE TYPE TOTAL_MB FREE_MB
------------ ------------------------------ ----------- ------ ---------- ----------
1 DATA MOUNTED NORMAL 2861625 533030
Aunque en este caso nos aparece solo un diskgroup, habrá otras máquinas que tengan varios:
SQL> set lines 2000 pages 99
select group_number, name, state, type, total_mb, free_mb from v$asm_diskgroup;
GROUP_NUMBER NAME STATE TYPE TOTAL_MB FREE_MB
------------ ------------------------------ ----------- ------ ---------- ----------
1 DATA MOUNTED EXTERN 409600 353196
2 FRA MOUNTED EXTERN 204800 192892
3 OCR MOUNTED EXTERN 30720 30328
Ver los discos de ASM
Para ver los discos que forman parte de los diskgroups, lanzamos la siguiente query:
SQL> set linesize 300
col path format a40
select group_number,name,DISK_NUMBER,mount_status,header_status,mode_status,state,path, OS_MB from v$asm_disk;
GROUP_NUMBER NAME DISK_NUMBER MOUNT_S HEADER_STATU MODE_ST STATE PATH OS_MB
------------ -------------------- ----------- ------- ------------ ------- -------- ------------------------- ----------
2 FRA_0001 1 CACHED MEMBER ONLINE NORMAL /dev/mapper/asm_fra2 102400
2 FRA_0000 0 CACHED MEMBER ONLINE NORMAL /dev/mapper/asm_fra1 102400
1 DATA_0003 3 CACHED MEMBER ONLINE NORMAL /dev/mapper/asm_data4 102400
1 DATA_0002 2 CACHED MEMBER ONLINE NORMAL /dev/mapper/asm_data3 102400
1 DATA_0001 1 CACHED MEMBER ONLINE NORMAL /dev/mapper/asm_data2 102400
1 DATA_0000 0 CACHED MEMBER ONLINE NORMAL /dev/mapper/asm_data1 102400
3 OCR_0002 2 CACHED MEMBER ONLINE NORMAL /dev/mapper/asm_ocr3 10240
3 OCR_0001 1 CACHED MEMBER ONLINE NORMAL /dev/mapper/asm_ocr2 10240
3 OCR_0000 0 CACHED MEMBER ONLINE NORMAL /dev/mapper/asm_ocr1 10240
Una de las columnas más importantes de esta query es HEADER_STATUS, ya que nos indica si el disco ya forma parte del +ASM (MEMBER) o, en el caso de querer añadirlo, aparece como CANDIDATE.
Añadir disco al ASM
Tal como hemos mencionado justo arriba, para poder añadir un disco al ASM debe aparecernos como CANDIDATE al listar. Por lo tanto, antes de esto, el departamento responsable deberá añadir el nuevo disco al sistema. Una vez esté disponible, es importante que revises los permisos del mismo. En un entorno Unix, por ejemplo, deberá pertenecer al usuario oracle y al grupo dba (suele ser usuario y grupo por defecto en las instalaciones Oracle, pero revisa tu sistema por si acaso).
Una vez comprobado lo anterior, deberás lanzar primero la query de los discos, para que te devuelva que hay un nuevo disco candidato para ser añadido al ASM:
SQL> set linesize 300
col path format a40
select group_number,name,DISK_NUMBER,mount_status,header_status,mode_status,state,path, OS_MB from v$asm_disk;
GROUP_NUMBER NAME DISK_NUMBER MOUNT_S HEADER_STATU MODE_ST STATE PATH OS_MB
------------ -------------------- ----------- ------- ------------ ------- -------- ------------------------- ----------
0 0 CLOSED CANDIDATE ONLINE NORMAL /dev/rhdisk5 572325
1 ORADATA_0000 0 CACHED MEMBER ONLINE NORMAL /dev/rhdisk2 572325
1 ORADATA_0001 4 CACHED MEMBER ONLINE NORMAL /dev/rhdisk3 572325
1 ORADATA_0002 1 CACHED MEMBER ONLINE NORMAL /dev/rhdisk4 572325
1 ORADATA_0004 3 CACHED MEMBER ONLINE NORMAL /dev/rhdisk6 572325
Como podemos apreciar, el disco cuya ruta es /dev/rhdisk5 está disponible para añadirlo al ASM, dado que aparece como candidato. El siguiente paso es lanzar la query para añadirlo:
SQL> ALTER DISKGROUP ORADATA ADD DISK '/dev/rhdisk5' NAME ORADATA_0003;
Diskgroup altered.
Cuando añadimos un disco al ASM, el sistema comienza de manera automática el rebalanceo de datos entre los propios discos, por lo que es aconsejable aumentar el nº de hilos de este proceso:
SQL> alter diskgroup ORADATA rebalance power 1000;
Diskgroup altered.
Aunque lancemos esta sentencia con un valor de 1000 en power, el máximo que usará Oracle será 11. Para ver como avanza el proceso de rebalanceo, podemos lanzar la siguiente query:
SQL> select state,power,group_number,EST_MINUTES from v$asm_operation;
STAT POWER GROUP_NUMBER EST_MINUTES
---- ---------- ------------ -----------
RUN 11 1 203
Aunque nos indique que le faltan 203 minutos, este tiempo estimado suele ser muy cambiante. Es aconsejable repetir la query varias veces, donde comprobarás como baja drásticamente o vuelve a aumentar. Si mientras se realiza esta operación, comprobamos los discos del ASM, veremos que el nuevo ya forma parte:
SQL> set linesize 300
col path format a40
select group_number,name,DISK_NUMBER,mount_status,header_status,mode_status,state,path, OS_MB from v$asm_disk;
GROUP_NUMBER NAME DISK_NUMBER MOUNT_S HEADER_STATU MODE_ST STATE PATH OS_MB
------------ -------------------- ----------- ------- ------------ ------- -------- ------------------------- ----------
1 ORADATA_0000 0 CACHED MEMBER ONLINE NORMAL /dev/rhdisk2 572325
1 ORADATA_0001 4 CACHED MEMBER ONLINE NORMAL /dev/rhdisk3 572325
1 ORADATA_0002 1 CACHED MEMBER ONLINE NORMAL /dev/rhdisk4 572325
1 ORADATA_0003 2 CACHED MEMBER ONLINE NORMAL /dev/rhdisk5 572325
1 ORADATA_0004 3 CACHED MEMBER ONLINE NORMAL /dev/rhdisk6 572325
Como vemos, el disco ya aparece como miembro aunque el proceso de rebalanceo sigua avanzando.
Eliminar disco del ASM
De manera más o menos similar a la anterior, podremos dar de baja un disco de nuestro ASM. El motivo más frecuente suele ser porque el disco está presentando fallos y debemos sustituirlos. La query que debemos lanzar es la siguiente:
SQL> alter diskgroup ORADATA drop disk ORADATA_0003 rebalance power 100;
Como vemos, la sentencia es muy parecida a la de añadir disco e, incluso, hemos lanzado el rebalanceo en la misma sentencia.
Es posible que al intentar eliminar un disco, nos lance un error como este:
SQL> alter diskgroup ORADATA drop disk ORADATA_0003 rebalance power 100;
alter diskgroup ORADATA drop disk ORADATA_0003 rebalance power 100
*
ERROR at line 1:
ORA-15032: not all alterations performed
ORA-15250: insufficient diskgroup space for rebalance completion
Analizando los dos ORA que arroja, está claro el motivo: los discos que quedarían tras eliminarlo no tienen espacio suficiente para albergar los datos que están en dicho disco tras hacer el balanceo. Por ello, primero debemos hacer limpieza. Como consejo, seguramente tengas la FRA hasta arriba de archivelogs y con tres sentencias lo dejes niquelado.
Una vez liberado espacio, prueba a relanzar el dropeo del disco. Una vez termine el proceso (que puedes comprobar con la misma query que lanzamos al añadir el disco, para ver cuanto queda), si lanzas el listado verás que el disco te aparece con el estado FORMER. Eso significa que ese disco ha formado parte del ASM pero que ya no está incluido en el diskgroup.
Es posible que una vez sacado del ASM, los compañeros que se encarguen de sacar el disco físico nos avisen de que les aparece como si estuviesen aún en uso. Para eso, aunque no sea competencia nuestra, podemos lanzar un comando a nivel de sistema operativo para ver que procesos están usándolo:
bash-4.2$ fuser /dev/rhdisk5
/dev/rhdisk5: 24838272 28115022
Como vemos, lanzamos el comando fuser seguido de la ruta del disco a comprobar, lo cual nos devuelve dos pid’s, que son los procesos que están usando el disco. Si hacemos uso ahora del comando ps, veremos si el proceso es de Oracle o no:
bash-4.2$ ps -fea | grep 24838272
oracle 22085884 25886860 0 11:43:25 pts/1 0:00 grep 24838272
oracle 24838272 1 0 May 09 - 0:00 oracleNA1 (LOCAL=NO)
bash-4.2$ ps -fea | grep 28115022
oracle 28115022 1 0 May 09 - 0:00 oracleNA1 (LOCAL=NO)
oracle 37421268 25886860 0 11:43:33 pts/1 0:00 grep 28115022
Si los procesos encontrados tienen la nomenclatura (LOCAL=NO), podemos matarlos con un kill -9:
bash-4.2$ kill -9 24838272
bash-4.2$ kill -9 28115022
Si volvemos a comprobar con fuser el uso del disco, veremos que ya nada lo bloquea:
bash-4.2$ fuser /dev/rhdisk5
/dev/rhdisk5:
En otras ocasiones, puede ser necesario parar/reiniciar los servicios del clúster para poder liberar el disco completamente.
Conclusión
En esta entrada nos hemos adentrado en la opción que ofrece Oracle para manejar discos como si fuesen uno solo, llamado ASM.
Hemos explicado el concepto de diskgroup dado que se trata de una de las bases del +ASM. Además, hemos explicado varias sentencias para el manejo de discos, como: listar los diskgroups, listar los discos que los forman, añadir un disco o eliminarlo.
Y como extra, un par de comandos de Unix para convertirnos en unos cracks.
Cuéntame que te ha parecido este proceso en la caja de comentarios que tienes abajo. Y si ya compartes la entrada en redes sociales, me haces un gran favor para que más gente conozca este portal.
Recuerda que puedes suscribirte a la newsletter de Como ser DBA justo en el pie de página. Solo te mandaremos un correo para avisarte de que hemos publicado una nueva entrada.
Hasta la próxima, ¡un saludo!