Errores Private strand flush not complete en el alert.log

Vamos a echar un vistazo rápido a un error bastante común en los alert.log

Una alerta bastante común que vemos en los alertlog es

Thread 1 cannot allocate new log, sequence 6180
Private strand flush not complete

Esta línea nos indica que, no hemos completado la operación de guardar todo el REDO cuando hacemos el switch.
El término strand es la palabra que utiliza Oracle para referrse a los latches de los redo log, lo que tenemos en este caso es un caso de este tipo, y lo que nos está indicando es qeu en ved de bajar el redo en tiempo real, lo «bajará» con el commit.

Este tipo de mensajes no es alarmante a no ser que haya mas mensajes del tipo «cannot allocate new log» o «advanced to log sequence»

En cualquier caso, pueden indicarnos que hay problemas con la velocidad de IO del almacenamiento donde se encuentran o en caso de ser logs remotos con la red

Manejo de ASM , Multipath y ASMLIB

Hoy vamos a ver la manera de crear discos con ASM en equipos linux con el multipath y ASMLIB.
La primera pregunta es ¿por que ASMLIB?

Al igual que en las versiones anteriores de Redhat o Oracle Linux donde mi opinión era usar el rawdevices de la manera clásica accediendo al dispositivo en crudo, con la llegada del systemd no me la jugaría en las secuencias de arranque y usaría siempre las librerías que nos proporcionan de manera soportada para ayudarnos con esto, y esa librería es el asmlinb

Multpath en Linux

Lo primero que tenemos que ver es como funciona el multipath en linux.
El «device Mapper Multipath» es una herramienta nativa de Linux para el manejo de múltiples caminos en los accesos a disco.
Resumiendo mucho, el multipath nos va a crear 3 devices:

  • /dev/dmX Dispositivo real
  • /dev/multipath/multipahX Alias del dispositivo para la facilitar la localizacion (formato humano)
  • /dev/mapper/multipathX Dispositivo de acceso al que deberemos apuntar nuestro ASM

Gran parte de los problemas que se tienen con el multipath es el uso de estos tres devices, ya que, es muy común el crear el disco en el dispositivo que no es correcto.

Primer paso, preparar el disco

El primer paso como siempre será la detección del disco. Este paso probablemente lo lleve a cabo el administrador del sistema operativo. Vamos a suponer que el dispositivo sobre el que queremos actuar es el /dev/mapper/mpath10

Lo primero que tendremos que hacer es crear una partición ( Oracle recomienda crear en raw sobre una particion)
para ello

fdisk /dev/mapper/mpath10
Command (m for help): n   
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1017, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-31455238, default 31455238):
Using default value 31455238
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.

Si os habeis fijado, hemos utilizado el dispositivo bajo /dev/mapper y no ninguno de los otros dos.
Con esto hemos creado la partición, pero no se ha grabado en la tabla de particiones del disco ya que hemos actuado sobre el multipath no sobre los discos físicos, para lo que tendremos que llamar el kpartx, y actualizar el kernel con partprobe.
Aquí es donde tenemos que tener mucho cuidado, ya que debemos de usar de nuevo el /dev/mapper

kpartx -a /dev/mapper/mpath10
partprobe

Estas acciones nos habrán creado un nuevo device en el /dev/mapper que se corresponderá con la primera partición de nuestro dispositivo multipath, es decir el /dev/mapper/mpath10p1

Segundo paso, mostrarlo al ASM

Una vez tenemos la partición creada, ya tendremos nuestro disco para añadir a ASM, esta partición se llamará DISKp1, por lo que para nuestro mpath10 será la mpath10p1
Así pues, llamamos al ASMLIB con

/etc/init.d/oracleasm createdisk DATAXX /dev/mapper/mpath10p1

ASMLIB nos habrá creado el dispositivo DATAXX en /dev/oracleasm/disks que será la ruta que usaremos en nuestra variable ASM_DISKSTRING del ASM y que ya tratará de manera indistinta el disco independientemente del camino por el que llegue.

Como siempre , mas información en

  • How To Setup ASM & ASMLIB On Native Linux Multipath Mapper disks? (Doc ID 602952.1)
  • How to Partition DM-Multipath Pseudo Devices (Doc ID 470913.1)

Localizar un disco entre ASM y el almacenamento con asmlib

Hoy vamos a ver una entrada muy sencilla en la que veremos la manera de correlar entre un disco de ASM y su dispositivo físico (usando multipah) .
Disponemos de un sistema Linux con multipath y asm donde los discos de ASM tienen una redundancia external, queremos saber que dispositivo físico en la cabina de almacenamiento es nuestro disco DATA01
La manera mas sencilla de hacerlo es obteniendo el World Wide Identifier (WWID) de ese disco, y esto lo haremos mediante el comando multipath de linux con los datos que obtenemos de la utilidad oracleasm .

Veamos cualess son los pasos.
Primero debemos de averiguar cual es el dispositivo de linux que se corresponde con nuestro disco DATA01

root@BBDD1 ~]# /etc/init.d/oracleasm querydisk -v -d -p  DATA01
Disk "DATA01" is a valid ASM disk on device [8,49]
/dev/sdd1: LABEL="DATA01" TYPE="oracleasm"
/dev/sdy1: LABEL="DATA01" TYPE="oracleasm"
/dev/mapper/mpath10p1: LABEL="DATA01" TYPE="oracleasm"

Con esto ya sabemos el /dev/mapper que le corresponde, y el numero de bloques.
Si ahora quisiésemos saber que dispositivo de cabina usaríamos el comando multipath -ll

[root@BBDD ~]# multipath -ll
.
.
mpath11 (3600a0b800050c7420000222a56728a6d) dm-3 IBM,1814      FAStT
size=30G features='1 queue_if_no_path' hwhandler='1 rdac' wp=rw
|-+- policy='round-robin 0' prio=6 status=active
| |- 1:0:0:104 sde  8:64   active ready running
| `- 2:0:1:104 sdz  65:144 active ready running
`-+- policy='round-robin 0' prio=1 status=enabled
  |- 1:0:1:104 sdl  8:176  active ghost running
  `- 2:0:0:104 sds  65:32  active ghost running
mpath10 (3600a0b800050c7420000222856728a54) dm-2 IBM,1814      FAStT
size=30G features='1 queue_if_no_path' hwhandler='1 rdac' wp=rw
|-+- policy='round-robin 0' prio=6 status=active
| |- 1:0:0:103 sdd  8:48   active ready running
| `- 2:0:1:103 sdy  65:128 active ready running
`-+- policy='round-robin 0' prio=1 status=enabled
  |- 1:0:1:103 sdk  8:160  active ghost running
  `- 2:0:0:103 sdr  65:16  active ghost running
.
.

En la salida de este comando veremos que coincide que el mpath10 contiene los discos sdd e sdy, por lo que, el World Wide Identifier (WWID) que buscamos sera el 3600a0b800050c7420000222856728a54

Problemas con minusculas en el resource manager desde OEM12c

Hoy vamos a ver un caso que puede volvernos un poco locos y que su solución es terriblemente sencilla.

Cuando intentamos usar el resource manager para mapear nuestros usuarios a un determinado grupo de consumidores nos encontramos que podemos intentar hacerlo por algun elemento que tenga mayusculas y minusculas.
Supongamos queremos añadir a el grupo DESARROLLO los usuarios que se conectan con el e toad y SQL Developer. Para ello ejecutaríamos

BEGIN
dbms_resource_manager.clear_pending_area();
dbms_resource_manager.create_pending_area();
dbms_resource_manager.set_consumer_group_mapping(dbms_resource_manager.client_program,'Sqldeveloper.exe','DESARROLLO');
dbms_rsource_manager.set_consumer_group_mapping(dbms_resource_manager.client_program, 'toad.exe','DESARROLLO');
dbms_resource_manager.submit_pending_area();
END; 
commit;

Pero si seguimos la pista a las sesiones de estos dos programas, veremos como no se mapean correctamente con el grupo de consumidores que queremos.
Ejecutando la siguiente consulta podemos ver la causa:

select * from DBA_RSRC_GROUP_MAPPINGS
   where attribute = 'CLIENT_PROGRAM';
ATTRIBUTE        VALUE               CONSUMER_GROUP 
------------------------------------------------------------------
CLIENT_PROGRAM    SQLDEVELOPER.EXE   DESARROLLO 
CLIENT_PROGRAM    TOAD.EXE           DESARROLLO 

¿Que es lo que ha ocurrido?

El problema que tenemos aquí es que las funciones dbms_resource_manager nos van a pasar a mayusculas los valores que le pasemos entre comillas simples.
Si nos fijamos en los comandos que hemos introducido antes vemos que el nombre del client_program lo hemos introducido entre comilla simple

dbms_rsource_manager.set_consumer_group_mapping(dbms_resource_manager.client_program, 'toad.exe','DESARROLLO');

Si lo que buscamos tiene mayusculas y minusculas o simplemente minusculas, deberemos pasarle el parámetro como un literal,es decir, entre comillas dobles

BEGIN
dbms_resource_manager.clear_pending_area();
dbms_resource_manager.create_pending_area();
dbms_resource_manager.set_consumer_group_mapping(dbms_resource_manager.client_program,'"Sqldeveloper.exe"','DESARROLLO');
dbms_rsource_manager.set_consumer_group_mapping(dbms_resource_manager.client_program, '"toad.exe"','DESARROLLO');
dbms_resource_manager.submit_pending_area();
END; 
commit;

Con esto nos cogerá la informacion correctamente.

select * from DBA_RSRC_GROUP_MAPPINGS
   where attribute = 'CLIENT_PROGRAM';
ATTRIBUTE        VALUE               CONSUMER_GROUP 
------------------------------------------------------------------
CLIENT_PROGRAM    SQLDEVELOPER.EXE   DESARROLLO 
CLIENT_PROGRAM    TOAD.EXE           DESARROLLO 
CLIENT_PROGRAM    Sqldeveloper.exe   DESARROLLO 
CLIENT_PROGRAM    toad.exe           DESARROLLO 

La información completa como siempre en metalink

  • Resource Manager Plan Is not Applied With Mixed or Lower Case Application Name (Doc ID 471173.1)
  • 11G: Oracle Resource Manager Client_program Mapping Not Working, Converted to Capital Letters (Doc ID 1586148.1)

Cambiar de Pfile a Spfile en Windows

Hoy vamos a ver una entrada que es muy básica en Unix pero que puede traer algún quebradero de cabeza en windows.

¿Que ocurre cuando queremos pasar de Pfile a Spfile en Windows?

La pregunta parece sencilla de resolver, y es que , simplemente tenemos que dejar un fichero llamado spfile_SID.ora en el directorio $ORACLE_HOME/database ( el equivalente a $ORACLE_HOME/dba de UNIX) pero, cuando hacemos esto en windows falla.

El problema se encuentra en el modo de arranque, a la hora de crear el servicio seguramente se creo con el parámetro «pfile=XXX» , con lo que el motor busca exactamente el fichero init_SID.ora y por eso no arranca con el nuevo spfile.

Para solucionarlo, abriremos el regedit e iremos a:
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME
Allí hay una entrada para cada instancia llamada ORA__PFILE. Lo que vamos ha hacer es eliminar esa entrada, haciendo que el motor busque el fichero de arranque por defecto.

Ah!, recordad que debería de existir el fichero SPFILE, para crearlo desde la 11g la manera mas sencilla es:

 create spfile  from memory;

Si estáis en alguna versión anterior siempre podéis seguir la entrada http://clemente.pamplona.name/dba/recuperar-un-spfile-borrado/

Como siempre, mas información en Soporte.

  • (Doc ID 378021.1) Oradim and Spfile
  • (Doc ID 232587.1) FAQ About Usage of Spfile and Pfile on Windows