Create and manage an ASM instance

1. Create and Manage an ASM Instance
Documentación en Tahiti -> Masters Book List -> Database Installation Guide for Linux -> 3 Oracle Grid Infrastructure

2. En Oracle 11gR2, la instancia de ASM se instala con Grid Infrastructure. Normalmente siempre escogeremos la opción de instalar y configurar Grid Infrastructure cuando lanzamos el ejecutable “./runInstaller”. No practicaremos este ejercicio de momento porque ya hemos visto un procedimiento más completo en el tutorial “Install Oracle Grid Infrastructure

3. Manage an ASM Instance
Documentación en Tahiti -> Masters Book List -> Automatic Storage Management Administrator’s Guide -> 3 Administering Oracle ASM Instances

4. Mostramos información de los distintos Disk Groups y discos de ASM

. profile_grid
 sqlplus / as sysasm
-- Información de los Disk Groups configurados en ASM
col name format a10
col path format a15
select group_number,
name,
state,
type,
total_mb,
free_mb,
usable_file_mb,
offline_disks
from v$asm_diskgroup;

-- Información acerca de los discos de ASM
col name format a10
col path format a15
select name, path, header_status, mode_status, total_mb, free_mb
from v$asm_disk;

5. Veamos los parámetros más destacables de una instancia ASM. Empezamos por el parámetro ASM_DISKGROUP

-- Parámetro ASM_DISKGROUPS
-- Controla que Disk Groups que monstan al iniciar una instancia de ASM
show parameter asm_diskgroups

-- Si creamos un diskgroup automáticamente lo añade al parámetro (porque estamos usando SPFILE)
CREATE DISKGROUP TEST EXTERNAL REDUNDANCY DISK 'ORCL:TEST01' NAME TEST01;

-- Ahora deberiamos ver el nuevo DG TEST
show parameter asm_diskgroups

-- Borramos el DG TEST y veremos como se modifica el parámetro
DROP DISKGROUP TEST;

-- Comprobamos de nuevo la modificación del parámetro
show parameter asm_diskgroups

6. El segundo parámetro que veremos, ASM_DISKTRING, es necesario para utilizar discos en ASM fuera de ASMLib

-- Parámetro ASM_DISKSTRING
-- Se utiliza para limitar que discos pueden formar parte de ASM
-- En nuestro caso, por defecto no está configurado ya que estamos usando ASMLib
show parameter asm_diskstring

Vamos a hacer una prueba configurando discos en NFS y luego modificando ASM_DISKSTRING para crear un Disk Group

# Creamos la ubicación para alojar los discos NFS. Para ello hacemos los siguientes pasos como root en RAC1:
mkdir -p /u01/nfs_storage
vi /etc/exports

# Añadimos la siguiente linea a /etc/exports
/u01/nfs_storage *(rw,sync,no_wdelay,insecure_locks,no_root_squash)

# Arrancamos el servicio nfs
chkconfig nfs on
service nfs restart
# Ahora debemos configurar el acceso a los discos NFS
# Ejecutamos estas instrucciones en ambos nodos RAC1 y RAC2
mkdir -p /u01/nfs_disks
chown oracle:oinstall /u01/nfs_disks

# Configuramos el fichero /etc/fstab para poder montar el recurso NFS
vi /etc/fstab

# Añadimos la siguiente linea
rac1:/u01/nfs_storage /u01/nfs_disks nfs rw,bg,hard,nointr,tcp,vers=3,timeo=600,rsize=32768,wsize=32768,actimeo=0 0 0

# Montamos el filesystem y damos los permisos adecuados
mount /u01/nfs_disks
chown -R oracle:oinstall /u01/nfs_disks
# Creamos un par de discos
su - oracle
dd if=/dev/zero of=/u01/nfs_disks/nfs_disk01 bs=1024 count=100000
dd if=/dev/zero of=/u01/nfs_disks/nfs_disk02 bs=1024 count=100000
-- Modificamos el parámetro ASM_DISKSTRING para poder usar estos discos
. profile_grid
sqlplus / as sysasm
ALTER SYSTEM SET ASM_DISKSTRING='ORCL:*','/u01/nfs_disks/nfs_disk??';
-- Comprobamos el listado de discos presentes en ASM
col name format a10
col path format a25
select name, path, header_status, mode_status, total_mb, free_mb
from v$asm_disk;

-- Creamos un DG de ejemplo con estos discos
CREATE DISKGROUP NFS NORMAL REDUNDANCY
FAILGROUP FG1 DISK '/u01/nfs_disks/nfs_disk01' NAME NFS01
FAILGROUP FG2 DISK '/u01/nfs_disks/nfs_disk02' NAME NFS02;

-- Limpiamos el entorno. Primero borramos el Disk Group.
DROP DISKGROUP NFS;
ALTER SYSTEM SET ASM_DISKSTRING='';
# Desmontamos el FS, Paramos el servicio NFS y borramos los directorios
# En el nodo RAC2
umount /u01/nfs_disks
rm -Rf /u01/nfs_disks

# En el nodo RAC1
umount /u01/nfs_disks
service nfs stop
chkconfig nfs off
rm -Rf /u01/nfs_storage
rm -Rf /u01/nfs_disks

# Borramos las lineas añadidas a /etc/fstab (RAC1 y RAC2) y /etc/export (este último solo en RAC1)

7. El parámetro ASM_POWER_LIMIT controla el nivel por defecto de rebalanceo de los Disk Groups
En versiones 11.2.0.2 (COMPATIBLE.ASM) y superiores este valor puede estar entre 0 y 1024
En versiones 11.2.0.1 e inferiores el valor oscila entre 1 y 11 (que es nuestro caso)

-- Vemos el valor actual del parámetro
show parameter asm_power_limit

-- Podemos lanzar un rebalancelo manual de un DG indicando la clausula POWER
ALTER DISKGROUP RECO REBALANCE POWER 4;

-- Mientras se hace el rebalanceo podemos ver el estado actual en V$ASM_OPERATION
SELECT * FROM V$ASM_OPERATION;

8. Otro parámetro interesante es ASM_PREFERRED_READ_FAILURE_GROUPS
Este parámetro es útil, por ejemplo, en clusters extendidos para tener afinidad de operciones I/O sobre la cabina más cercana a cada cluster
Supongamos que cada nodo (RAC1 y RAC2) están en dos CPDs distintos y hemos creado un un disco en cada CPD para garantizar la disponibilidad.

-- El disco TEST01 suponemos que se encuentra en la cabina de RAC1
-- El disco TEST02 suponemos que se encuentra en la cabina de RAC2
-- Creamos el DISKGROUP TEST
CREATE DISKGROUP TEST NORMAL REDUNDANCY
FAILGROUP FG1 DISK 'ORCL:TEST01' NAME TEST01
FAILGROUP FG2 DISK 'ORCL:TEST02' NAME TEST02;

-- Modificamos el parámetro ASM_PREFERRED_READ_FAILURE_GROUPS
ALTER SYSTEM SET ASM_PREFERRED_READ_FAILURE_GROUPS='TEST.FG1' sid='+ASM1';
ALTER SYSTEM SET ASM_PREFERRED_READ_FAILURE_GROUPS='TEST.FG2' sid='+ASM2';

-- Limpiamos el entorno
DROP DISKGROUP TEST;
ALTER SYSTEM RESET ASM_PREFERRED_READ_FAILURE_GROUPS sid='+ASM1';
ALTER SYSTEM RESET ASM_PREFERRED_READ_FAILURE_GROUPS sid='+ASM2';

9. Vamos a parar y levantar la instancia de ASM.
En nuestro caso, como tenemos los discos OCR y Voting Disk en ASM, debemos hacer una parada ordenada con crsctl (nota Metalink 984663.1). Podríamos usar SHUTDOWN ABORT, pero no lo hagáis.
El procedimiento correcto es utilizar el comando crsctl.

# Paramos ASM y todos los recursos del CRS (usuario root)
su - root
/u01/app/11.2.0/grid/bin/crsctl stop crs

# Una vez parado, el SO nos devuelve el prompt, así que levantamos de nuevo el CRS y ASM
/u01/app/11.2.0/grid/bin/crsctl start crs

10. En esta versión podemos utilizar la vista V$ACTIVE_SESSION_HISTORY
En este vista se guarda la actividad de las sesiones activas cada segundo. (Jugaremos con ella en la sección de Performance)

-- Veamos un listado de los porcentajes de actividad de las sesiones de la última hora
select
session_id,
sql_id,
session_state,
event,
count(*),
round(ratio_to_report(count(*)) over() * 100,1) pct
from
v$active_session_history
where
sample_time > sysdate-1/24
group by
session_id,
sql_id,
session_state,
event
order by
count(*) desc
/