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  

ORA-29786 eliminando un Diskgroup

Hoy vamos a ver un error que puede ser bastante común si creamos las cosas a mano » a la antigua usanza».

Veamos algo que puede ocurrirnos cuando intentamos eliminar un diskgroup en nuestro ASM

[oracle@test]$ sqlplus "/as sysasm"
SQL*Plus: Release 11.2.0.3.0 Production on Fri Apr 09 21:10:38 2015
Copyright (c) 1982, 2011, Oracle.  All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Automatic Storage Management option
SQL> DROP DISKGROUP TEMP INCLUDING CONTENTS;
DROP DISKGROUP TEMP INCLUDING CONTENTS
*ERROR at line 1:
ORA-15039: diskgroup not dropped
ORA-29786: SIHA attribute GET failed with error [Attribute 'SPFILE' sts[200]lsts[0]]

Este error nos va a dar tanto si está montado, desmontado, tiene ficheros, o está vacío, y , el problema es el modo de creacion.

Desde la versión 11gr2 el ASM es un recurso mas del CRS, por lo cual, para poder llevar a cabo determinadas operaciones como create/drop diskgroup, create pfile/spfile es necesario que el ASM esté registrado como un recurso del cluster.

La solucion para poder llevar a cabo estas acciones es añadir el ASM al repositorio del cluster

srvctl add asm -h
Adds an ASM configuration to be managed by Oracle Restart.
Usage: srvctl add asm [-l ] [-p ] [-d ]
    -l            Listener name
    -p               Server parameter file path
    -d       ASM diskgroup discovery string
    -h                       Print usage


srvctl add asm  -p $GRID_HOME/dbs/init+ASM.ora 
srvctl status asm

Más informacion como siempre en metalink en la nota

Uso de mayúsculas/minúsculas en ASM

Vamos a ver una entrada muy cortita sobre el uso del ASM.

¿Son los ficheros/directorios del ASM sensibles a las mayúsculas y minúsculas?

Si miramos la documentación del ASM de Oracle nos dice una frase algo enigmática
«Only the forward slash (/) is supported by ASMCMD. Filenames are not case sensitive, but are case retentive. If you type a path name as lowercase, ASMCMD retains the lowercase. «

Lo que quiere decir es que, los nombres de los ficheros (y directorios) de ASM no son case sensitive, pero, las cadenas de texto con la que nos lo muestra si.

Vamos a verlo con un ejemplo:

Supongamos tenemos ASM con una base de datos llamada SID.
He creado dos tablespaces con datafiles en SID y siD y no me ha dado error en ninguno de los dos

create tablespace prueba1 datafile '+DATA/SID/prueba1.dbf' size 3m;
create tablespace prueba2 datafile '+DATA/siD/prueba2.dbf' size 3m;

Sin embargo, si intento crear

create tablespace prueba3 datafile '+DATA/SID/prueba2.dbf' size 3m;

Me da error por que ya existe el mismo fichero con el directorio siD

Conclusión: ASM no es «case sensitive», pero hemos de ser muy cuidadosos a la hora de elegir una política para la notación de los ficheros ya que el uso indiscriminado de unos y otros puede provocarnos errrores.

Oracle cluster registry OCR (componentes del grid)

Oracle cluster registry ( OCR)

El Oracle cluster registry (OCR) mantiene los metadata y los wallets para todos los recursos que maneja el clusterware , al contrario de lo que ocurría en las versiones previas, solamente se requiere para administrar los recursos que están bajo la CRSD stack and its agents.
En la versión 11gR2 el l OCR incluye el Oracle Local Registry (OLR)

En esta versión el OCR no es necesario para unirse al cluster,ya que la información necesaria para unirse al cluster está en el OLR and GPnP, la información que maneja el OCR si que incluye aquella que requiere el agente para crear ,comprobar el estado,parar o arrancar un recurso así como la de las dependencias de un recurso ante un cambio de estado (Por ejemplo qué hacer con un listener si la IP sobre la que está desaparece)

Como mínimo debe de existir un OCR, sin embargo es posible tener hasta 5 copias, el OCR puede estar (desde 11gR2) en los discos ASM, pero a diferencia del voting disk puedes tener un OCR en los mismos discos que datos o copias.
La localización de los OCR (en un sistema linux) se encuentra en /etc/oracle/ocr.loc

[grid@rac1 oracle]$ cat /etc/oracle/ocr.loc
ocrconfig_loc=+OCRQUORUM
local_only=FALSE

La variable local_only puede tener dos valores:

  • FALSE: Estamos en un RAC
  • TRUE: estamos en una single instance

Mediante el comando ocrconfig se pueden llevar acciones de añadir , eliminar y reemplazar ubicaciones del OCR, sin embargo , si hay solamente una localización e OCR no se puede hacer un replace, hay que añadir uno nuevo y eliminar el viejo.
La información del OCR se guarda cada 4 horas en el $GI_HOME/cdata de uno de los nodos, desde la versión 11gR2 se reparten por todos los nodos (donde está instalado). Habitualmente se guarda los últimos 3 backups horarios ( 12 horas), 1 backup con un día de antigüedad y otro con una semana de antigüedad.
Cuando el OCR se almacena en ASM hace que la instancia de ASM y los diskgroups en los que está ubicado el OCR se monten antes de que el CRSD sea arrancado. Igualmente, si hay que detener el ASM hay que parar toda la pila del CRSD mediante el comando crscrtl stop crs ya que, sino la parada del ASM dará el error

 “ORA-15097: cannot SHUTDOWN ASM instance with connected client.”

por supuesto ni se te ocurra para el asm de manera forzada.

Los comandos para interactuar con el OCR son:

[grid@rac1 oracle]$ ocrcheck
Status of Oracle Cluster Registry is as follows :
	 Version                  :          3
	 Total space (kbytes)     :     262120
	 Used space (kbytes)      :       2644
	 Available space (kbytes) :     259476
	 ID                       :  165462643
	 Device/File Name         : +OCRQUORUM
                                    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


Añadir un disco

[grid@rac1 oracle]$ ocrconfig -add +DATA

reemplazarlo

[grid@rac1 oracle]$ ocrconfig -replace +DATA  -replacement +DATA2

O eliminarlo

[grid@rac1 oracle]$ ocrconfig -delete +DATA2

La documentación del ocrconfig podemos encontrarla en http://docs.oracle.com/cd/E11882_01/rac.112/e16794/ocrsyntax.htm#CWADD92022

Crear un diskgoup desde asmca

Nos hemos mudado a bloger!
El contenido actualizado de esta entrada lo tienes en:

http://dba.pamplona.name/2013/12/crear-un-diskgoup-desde-asmca.html

Vamos a ver como crear un diskgroup en nuestro grid.

Lo primero que haremos será conectarnos como el usuario propietario del grid control (grid) y cargar las variables de entorno.

[oracle@rac1 grid]$ . oraenv
ORACLE_SID = [oracle] ? +ASM1
The Oracle base has been set to /oracle/11.2.0/grid
[oracle@rac1 grid]$ 

Una vez tenemos cargadas las variables, ejecutaremos el comando que lanza la interfaz gráfica asmca

Nosotros iremos a la pestaña de grupo de discos y pulsaremos en crear . Para este ejemplo crearemos el grupo DATA con los dos primeros discos con redundancia normal. tras esto, haremos lo mismo con los dos últimos (los mas pequeños) y llamaremos a el grupo INDICES

Como podemos ver, el uso de la herramienta gráfica que gestiona el ASM es bastante sencilla, en la siguiente entrada crearemos un grupo y le asignaremos discos desde la línea de comandos.