Manejo de discos en ASM

Nivel del post no aplicainicialintermedioavanzado
SGBD oraclemysqlmariadbMySQL/MariaDBpostgresqlno aplica
Tiempo de lectura aproximado 8min

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.

Manejo de discos en asm
Esquema de ejemplo para diskgroups (fuente: ulimadba20-01)

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!

Compartir entrada en RRSS

SUSCRÍBETE A NUESTRA NEWSLETTER

Si quieres estar al tanto de todas las nuevas publicaciones, suscríbete a esta lista de correo para recibir en tu mail los nuevos posts publicados. ¡Así no te pierdes nada!

pablo_delgado_avatar.jpg

Pablo Delgado Flores

Auténtico apasionado por la informática, especialmente por las bases de datos, administración de sistemas y desarrollo web.

Empecé a trabajar como técnico informático mucho antes de obtener una titulación oficial (sysadmin). Actualmente trabajo como DBA Oracle, aunque manejo otros motores como MySQL/MariaDB, PostgreSQL y Amazon Redshift.

También escribo sobre informática en general en mi web Pablo Delgado Flores, la terminal de Linux/Unix en #Sudosu y  desarrollo web con Woocoomerce/WordPress en DesarrolloWoo.

Subscribirse
Notificar de
guest
0 Comentarios
Comentarios en línea
Ver todos los comentarios