Acerca de admin

Tras más de 20 años trabajando con tecnologías Oracle, me decidí a recopilar en un Blog algunas de las cosillas útiles para el día a día.

Introducción al ADVM

ASM Dynamic volumen manager (ADVM) permite crear dispositivos para acceder a los sistemas de ficheros de Oracle.

Oracle Automatic Storage Management Cluster File System (Oracle ACFS) es un sistema de ficheros multiplataforma, escalable que extiende el ASM para ficheros de fuera de la base de datos.
http://docs.oracle.com/cd/E11882_01/server.112/e18951/asmfilesystem.htm#OSTMG94162
Captura de pantalla 2015-11-21 a las 19.49.43
Entre sus características están:

  • Requiere que el ASM tenga el atributo de ASM y ADVM a 11.2 o mayor
  • Permite redimensionamiento dinámico del FS
  • Maximiza el rendimiento mediante las ventajas de ASM
  • Mejora del IO mediante las ventajas del ASM
  • Mejora de seguridad ante fallos con las mejoras del asm
  • Desde la 11gr2 (11.2.0.3) permite backups de RMAN,ARCHIVELOG y DataPump
  • Oracle ACFS does not support files for the Oracle Grid Infrastructure home.
  • Oracle ACFS does not support Oracle Cluster Registry (OCR) and voting files.
  • Oracle recomienda que se monte bajo $ORACLE_BASE/acfsmounts
Publicado en 11g

Acciones comunes sobre el ASM

Hoy vamos a ver un ejemplo de los comando seas habituales que solemos hacer en un ASM

Nombre de los diskgroups

ASMCMD

ASMCMD> lsdg

SQLPLUS

SQL> column name format a20;
SQL>  select NAME,ALLOCATION_UNIT_SIZE,STATE,TYPE,TOTAL_MB,FREE_MB from v$asm_diskgroup
NAME           ALLOCATION_UNIT_SIZE STATE      TYPE     TOTAL_MB    FREE_MB
---------- -------------------- ---------- ------ ---------- ----------
ASMFS             1048576 	  MOUNTED    EXTERN    1019       403
DATA01_PRUEBA     1048576	  MOUNTED    EXTERN    2246       267
OCRVOTING         1048576	  MOUNTED    EXTERN    1019       623
REDO              1048576	  MOUNTED    EXTERN     499       404

Discos en un diskgroup

ASMCMD

ASMCMD> lsdsk -p -G DATA01_PRUEBA
Group_Num  Disk_Num      Incarn  Mount_Stat  Header_Stat  Mode_Stat  State   Path
       2         1  3915953579  CACHED      MEMBER       ONLINE     NORMAL  /dev/oracleasm/disks/ASM01
       2         0  3915953576  CACHED      MEMBER       ONLINE     NORMAL  /dev/oracleasm/disks/DATA_PRUEBA
ASMCMD> lsdsk -G DATA01_PRUEBA
Path
/dev/oracleasm/disks/ASM01
/dev/oracleasm/disks/DATA_PRUEBA

SQLPLUS

SQL> select PATH,STATE,NAME from v$asm_disk where name like '%PRUEBA%';
PATH                		    STATE       NAME
---------------------------------------- ---------- --------------------
/dev/oracleasm/disks/DATA_PRUEBA    NORMAL     DATA01_PRUEBA_0000
/dev/oracleasm/disks/ASM01          NORMAL     DATA01_PRUEBA_0001

Discos candidatos

ASMCMD

ASMCMD> lsdsk --candidate -p
Group_Num  Disk_Num      Incarn  Mount_Stat  Header_Stat  Mode_Stat  State   Path
       0         5  3915953571  CLOSED      FORMER       ONLINE     NORMAL  /dev/oracleasm/disks/ASM02
       0         4  3915953570  CLOSED      FORMER       ONLINE     NORMAL  /dev/oracleasm/disks/ASM03
       0         1  3915953567  CLOSED      PROVISIONED  ONLINE     NORMAL  /dev/oracleasm/disks/ASM04
       0         0  3915953566  CLOSED      PROVISIONED  ONLINE     NORMAL /dev/oracleasm/disks/ASM05

SQLPLUS

column state format a10;
column HEADER_STATUS format a20;
column path format a30;
SQL> select STATE,PATH,HEADER_STATUS from v$asm_disk where header_status !='MEMBER';
STATE    PATH                          	 HEADER_STATUS
-------- -------------------------------------------------- ------------
NORMAL    /dev/oracleasm/disks/ASM05               PROVISIONED
NORMAL    /dev/oracleasm/disks/ASM02               FORMER
NORMAL    /dev/oracleasm/disks/ASM03               FORMER
NORMAL    /dev/oracleasm/disks/ASM04               PROVISIONED

Eliminar un Diskgroup

Para poder eliminar un diskgroup este debe de estar montado.
En caso de querer eliminarlo desmontado deberemos de ponerel flag “forcé”

SQL> drop diskgroup FSARCHPRUEBA force including contents;
Diskgroup dropped.

Creación de Diskgroup

En este caso creamos un grupo de redundancia HIGH, por lo que necesitamos 3 failure groups
SQLPLUS

CREATE DISKGROUP DATA HIGH REDUNDANCY
 FAILGROUP controller1 DISK
   '/dev/oracleasm/disks/ASM01' NAME ASM01,
   '/dev/oracleasm/disks/ASM02' NAME ASM02
FAILGROUP controller2 DISK
   '/dev/oracleasm/disks/ASM03' NAME ASM03,
   '/dev/oracleasm/disks/ASM04' NAME ASM04
FAILGROUP controller3 DISK
   '/dev/oracleasm/disks/ASM05' NAME ASM05
 ATTRIBUTE 'au_size'='4M',
   'compatible.asm' = '11.2',
   'compatible.rdbms' = '11.2';

Ahora creamos un grupo con external

CREATE DISKGROUP REDO EXTERNAL REDUNDANCY
DISK  '/dev/oracleasm/disks/REDO01' NAME REDO01
ATTRIBUTE 'au_size'='4M',
  'compatible.asm' = '11.2',
  'compatible.rdbms' = '11.2';

ASMCMD
En asmcmd la creación del diskgroup se hace mediante el comando mkdg, pero los parámetros han de ser pasados en un fichero xml

Añadir un disco

ASMCMD (Se hace mediante la sintaxsis en xml)
Chdg fichero-cambios.xml
SQLPLUS

SQL> alter diskgroup DATA01_PRUEBA add disk '/dev/oracleasm/disks/ASM05';
Diskgroup altered.
SQL> select PATH,STATE,NAME from v$asm_disk where name like '%PRUEBA%';
PATH                        		  STATE    NAME
-------------------------------------------------- -------- ------------------------------
/dev/oracleasm/disks/DATA_PRUEBA        NORMAL   DATA01_PRUEBA_0000
/dev/oracleasm/disks/ASM05              NORMAL   DATA01_PRUEBA_0002
/dev/oracleasm/disks/ASM01              NORMAL   DATA01_PRUEBA_0001
Quitamos un disco 

ASMCMD (Se hace mediante la sintaxsis en xml)
chdg fichero-cambios.xml
SQLPLUS
Para eliminarse se usa la columna NAME y no PATH


SQL> alter diskgroup DATA01_PRUEBA drop disk DATA01_PRUEBA_0001;
Diskgroup altered.

Comprobar ficheros abiertos de en ASM

ASMCMD> lsof
DB_Name  Instance_Name  Path                                                     
+ASM     +ASM2          +ocrvoting.255.4294967295                                
asmvol   +ASM2          +asmfs/ADVMFS1.256.888838797                             
prueba   prueba2        +data01_prueba/prueba/controlfile/current.256.888313451  
prueba   prueba2        +data01_prueba/prueba/datafile/sysaux.260.888313489      
prueba   prueba2        +data01_prueba/prueba/datafile/system.259.888313463      
prueba   prueba2        +data01_prueba/prueba/datafile/undotbs1.261.888313519    
prueba   prueba2        +data01_prueba/prueba/datafile/undotbs2.267.888578953    
prueba   prueba2        +data01_prueba/prueba/datafile/users.263.888313549       
prueba   prueba2        +data01_prueba/prueba/onlinelog/group_1.257.888313455    
prueba   prueba2        +data01_prueba/prueba/onlinelog/group_2.258.888313459    
prueba   prueba2        +data01_prueba/prueba/onlinelog/group_3.264.888315899    
prueba   prueba2        +data01_prueba/prueba/onlinelog/group_4.265.888315903    
prueba   prueba2        +data01_prueba/prueba/tempfile/temp.262.888313531  

Script de arranque de ACFS

Hoy vamos a ver como llevar a cabo de manera automática la carga de los módulos de ACFS en un OEL6

Como vimos en la entrada anterior, no hay un script de arranque del ACFS, además de esto, los binarios están bajo la rama de directorios del GRID_HOME, por lo que es muy probable que no se encuentren si no se cargan las variables de entorno correctas.

Así pues, que vamos ha hacer nosotros es crear un script de inicio que arranque el ACFS.
El scritpt lo llamaremos acfsload y lo dejaremos bajo /etc/init.d.
El contenido será

#!/bin/sh

# chkconfig: 2345 30 21
# description: Load Oracle ACFS drivers at system boot
export GRID_HOME=/app/grid/11.2.0
export PATH=$PATH:$GRID_HOME/bin

case "$1" in
  start)
	$GRID_HOME/bin/acfsload start -s
	;;
 stop)
        $GRID_HOME/bin/acfsload stop -s
        ;;
status)
	echo " ACFS Soportado"
        $GRID_HOME/bin/acfsdriverstate  -orahome $GRID_HOME supported
	echo " ACFS Instalado"
        $GRID_HOME/bin/acfsdriverstate  -orahome $GRID_HOME installed
 	echo " ACFS Cargado"
        $GRID_HOME/bin/acfsdriverstate  -orahome $GRID_HOME loaded
       echo " ACFS Version"
        $GRID_HOME/bin/acfsdriverstate  -orahome $GRID_HOME version
	echo " Módulos cargados"
	lsmod|grep oracle
        ;;
 *)
	echo "Usage: $0 start|stop|status"
	                exit 1
	;;
esac

Y lo cargaremos :

 cd /etc/rc3.d/
 ln -s ../init.d/acfsload S99acfsload

Comprobación de la instalación de ACFS

Hoy vamos a ver la instalación de ACFS en Linux.

Lo primero de todo es que hay que tener en cuenta que ACFS no está soportada por defecto para todos los kernels, la manera de saber si tu kernel esta soportado por defecto o has de instalar algun tipo de parche es consultando la nota ACFS Support On OS Platforms (Certification Matrix). (Doc ID 1369107.1)

ACFS ( Oracle ASM Cluster File System ) es como el propio nombre indica una nueva funcionalidad de Oracle que nos va a permitir montar sistemas de ficheros sobre discos ASM. Esta nueva funcionalidad nos va a permitir entre otras cosas el beneficiarnos de todas las características de ASM ( redundancia,stripping,mirroring ) para los sistemas de ficheros compartidos en red.

La documentación de Oracle dice que está disponible para todos los sistemas operativos habituales (AIX,SOLARIS,Linux…) , pero nosotros nos centraremos en su instalación en Linux.

Lo primero que llama la atención es que la instalación no crea ficheros de arranque, incluso puede darse el caso de una instalación correcta del grid control en la que no se haya instalado el ADVM/ACFS y no lo sepamos.

La manera de comprobar el estado del ACFS es mediante el comando acfsdriverstate

[root@rac1 ~]# acfsdriverstate 
ACFS-9211: usage: acfsdriverstate [-h] [-orahome ] {installed | loaded | version | supported} [-s]

Ejecutaremos

En este caso podemos ver como si que tenemos un kernel soportado y lo tenemos cargado e instalado, pero ,veamos los siguientes casos con los que nos podemos encontrar:

ACFS no soportado

Puede darse el caso de que la version que tenemos de kernel no esté soportado para el ACFS.
En este caso obtendremos el error ACFS-9459

ACFS-9459: ADVM/ACFS is not supported on this OS version: '3.8.13-98.el6uek.x86_64'

Esto se puede probar también con el comando

[root@rac1 ~]# cd $GRID_HOME/bin/
[root@rac1 ~]# ./acfsdriverstate  -orahome $GRID_HOME supported

Y la solución a este problema será seguir las indicaciones de ACFS Support On OS Platforms (Certification Matrix). (Doc ID 1369107.1)

ACFS no instalado

Puede darse el caso de que tengamos una version correcta, pero no tengamos instalado los binarios en la distribución.

Esto podemos comprobarlo con

[root@rac1 ~]# cd $GRID_HOME/bin/
[root@rac1 ~]# ./acfsdriverstate  -orahome $GRID_HOME installed
ACFS-9204: false

En este caso deberemos de proceder a la instalacion mediante el comando:

[root@rac1 ~]# cd $GRID_HOME/bin/
./acfsload install

ACFS no cargado

Este es posiblemente el caso mas común que nos podamos encontrar, que es que esté instalado, pero que no haya arrancado con el sistema.

Esto lo comprobaremos con :

[root@rac1 ~]# cd $GRID_HOME/bin/
[root@rac1 ~]# ./acfsdriverstate  -orahome $GRID_HOME loaded
ACFS-9204: false

Y la carga es algo tan sencillo como el comando acfsload start -s
Podremos ver si está cargado mirando los moódulos del sistema operativo

root@rac1 ~]# lsmod |grep ora
oracleacfs           1990406  0 
oracleadvm            250040  0 
oracleoks             427672  2 oracleacfs,oracleadvm
oracleasm              54297  1 

Comprobacion de la version que tenemos

Si tenemos el AFS instalado y cargado, que menos que poder saber la version que tenemos, para ello usaremos la único flag que no hemos visto hasta ahora

[root@rac1 ~]# ./acfsdriverstate  -orahome $GRID_HOME version
ACFS-9325:     Driver OS kernel version = 2.6.32-279.el6.x86_64(x86_64).
ACFS-9326:     Driver Oracle version = 130707.

Hasta aquí lo más básico del ACFS, que es tenerlo listo en el sistema .

Más información en:

Redundancia de los votingdisk en ASM

Hoy vamos a ver un a entrada sencilla sobre la redundancia en los voting disk.
Supongamos tenemos un RAC con un votedisk en un grupo de ASM externo.

[grid@rac1 ~]$ crsctl query css votedisk
##  STATE    File Universal Id                File Name Disk group
--  -----    -----------------                --------- ---------
 1. ONLINE   9711d76755664f81bfeac1daf04aefcf (/dev/oracleasm/disks/OCRVOTING) [OCRVOTING]
Located 1 voting disk(s).

[grid@rac1 ~]$ ocrcheck
Status of Oracle Cluster Registry is as follows :
	 Version                  :          3
	 Total space (kbytes)     :     262120
	 Used space (kbytes)      :       2692
	 Available space (kbytes) :     259428
	 ID                       :  241611837
	 Device/File Name         : +OCRVOTING
                                    Device/File integrity check succeeded
                                    Device/File not configured
                                    Device/File not configured
                                    Device/File not configured
                                    Device/File not configured
	 Cluster registry integrity check succeeded
         Logical corruption check bypassed due to non-privileged user

Nosotros tenemos un DISKGROUP de ASM con redundancia HIGH , y queremos llevar nuestro votingdisk a este disco .

column name format a20;
column state format a20;
column type format a20;
select NAME,STATE,TYPE from v$asm_diskgroup;

NAME		     STATE		  TYPE
-------------------- -------------------- --------------------
OCRVOTING	     MOUNTED		  EXTERN
REDO		     DISMOUNTED
DATA		     MOUNTED		  HIGH
ACFS		     DISMOUNTED
OCRASM		     MOUNTED		  EXTERN

Ejecutamos el comando crsctl replace votedisk +DATA y recibiremos el siguiente error:

[grid@rac1 ~]$ crsctl replace votedisk +DATA
Failed to create voting files on disk group DATA.
Change to configuration failed, but was successfully rolled back.
CRS-4000: Command Replace failed, or completed with errors.

¿Como podemos saber mas de este error?

Vamos a mirar el alert.log del asm

tail -900 /u01/app/oracle/diag/asm/+asm/+ASM1/trace/alert_+ASM1.log
TE: [crsctl.bin@rac1.pamplona.name (TNS V1-V3) 20094] opening OCR file
Wed Aug 19 11:39:20 2015
NOTE: updated gpnp profile ASM diskstring: /dev/oracleasm/disks/*
Wed Aug 19 11:39:20 2015
NOTE: Creating voting files in diskgroup DATA
Wed Aug 19 11:39:20 2015
NOTE: Voting File refresh pending for group 3/0xe73953ba (DATA)
NOTE: Attempting voting file creation in diskgroup DATA
NOTE: voting file allocation on grp 3 disk DATA_0000
NOTE: voting file allocation on grp 3 disk DATA_0001
NOTE: voting file allocation on grp 3 disk DATA_0002
ERROR: Voting file allocation failed for group DATA
Errors in file /u01/app/oracle/diag/asm/+asm/+ASM1/trace/+ASM1_ora_20102.trc:

Y que error tenemos en este fichero de traza?

cat /u01/app/oracle/diag/asm/+asm/+ASM1/trace/+ASM1_ora_20102.trc
..
.

*** 2015-08-19 11:39:24.754
Updating headers of disk /dev/oracleasm/disks/ASM03 with 96 128
PST-new:0x7f6053f8fe60:0x9f1d9478:45:
  /dev/oracleasm/disks/ASM03:67f2cd24882e4f46bfe07f85554e0d33:
ORA-15274: Not enough failgroups (5) to create voting files

Como podemos ver, el GRID ha visto que nuestro grupo de ASM no cuenta con 5 failgroups ( solamente cuenta con 3 discos), con lo que ha echado atrás la operación.

Que pasaría si quisiesemos llevarlo a otro external?

Si queremos llevarlo a otro external veremos que funciona correctamente.

[grid@rac1 ~]$ crsctl replace votedisk  +OCRASM
Successful addition of voting disk 5f3f3404c2cd4f24bfa6ca5de9494bba.
Successful deletion of voting disk 9711d76755664f81bfeac1daf04aefcf.
Successfully replaced voting disk group with +OCRASM.
CRS-4266: Voting file(s) successfully replaced

Y si quisiéramos añadir otra ASM con redundancia external?

[grid@rac1 ~]$ crsctl add css votedisk +OCRVOTING
CRS-4671: This command is not supported for ASM diskgroups.
CRS-4000: Command Add failed, or completed with errors.

Vemos como tampoco nos permite el poner el voting disk en 2 ASM DISKGROUPS

Conclusiones

Podemos beneficiarnos (y es aconsejable) de la redundancia del ASM para el voting disk, pero, hay que tener en cuenta que :

  • No podemos mezclar voting disk en asm y no asm
  • Voting disk necesita unos determinados failugre groups en ASM
    • External: No ha dependencia ya que se gestiona externamente
    • Normal: Deberemos de tener un mínimo de 3 failgroups
    • External: deberemos de terner un mínimo de 5 failgroups
  • Si usamos ASM para los voting disk la redundancia la marca el ASM