SafeChildren Banner

Havoc Oracle Solaris Experts

jueves, 29 de octubre de 2009

Problemas y Limitaciones de Oracle en una Zona No-Global

Introducción
Una de las cosas más interesantes de Solaris es Dynamic Reconfiguration, esta característica nos permite "Reconfigurar Dinámicamente" muchos de los recursos de sistema. Además, los conceptos de Hot-Swap nos permiten tener un sistema 99.9 uptime aunque tengamos "problemillas" de Hardware.

En Solaris 10 se introdujeron las Zonas como un contenedor de Instancia de Solaris con sus propios parámetros de configuración con la idea de optimizar al máximo los recursos de los servidores. Hay que decir que yo soy un enamorado de las zonas, sin embargo, también veo que en la actualidad nos han hecho retroceder años, me explicaré mejor.

La configuración de una zona se establece con zonecfg y ésta sólo es leída cuando hacemos un boot de la zona, por lo tanto, aunque cambiemos dicha configuración, sólo será efectiva después de hacer un reboot. Qué supone esto? Pues bien, imaginemos el caso que, por el motivo que sea, necesitamos darle más IO a nuestro Oracle, así que nos conectamos a la SAN y creamos una nueva LUN/Array, la asignamos a nuestro Host y listo. Solaris, ve inmediatamente la nueva LUN y ... sorpresa! Si queremos asignarla a nuestra zona como raw device, podremos añadirla con zonecfg add device, pero no se verá hasta el siguiente reboot.

Es cierto que podemos crearnos una LUN en loopback e ir "añadiendo" puntos de montaje, pero el impacto en el rendimiento es muy grande.

Ahora bien, vamos a suponer que no tenemos impacto en IO y sí en CPU, nuestro pedido de SysB acaba de llegar, y abrimos nuestra máquina, pinchamos la SysB y Solaris la reconoce sin rebootar, pero ... sorpresa! Si tenemos configurado la propiedad capped-cpu en nuestra zona, aunque modifiquemos el valor, nos pasará lo mismo que antes.

Es cierto que podemos dejar la Zona sin el valor de capped-cpu, o a un valor de ncpu en vez de cpu, pero entonces de qué nos sirve la separación de recursos?

En definitiva, el uso de Non-Global Zones tiene algunos problemas en cuanto a Oracle y su configuración dinámica se refiere, pero si lo que deseas es tener un entorno estanco y limitado por recursos es una buena solución.

Conclusión
Antes de subirnos al carro de las Zonas en Solaris, hay que evaluar si los requisitos de reconfiguración en caliente son un valor añadido sobre nuestro sistema, además de analizar si las ventanas de mantenimiento son los suficientemente amplias para rebootar la zona, una y otra vez.

Referencias

miércoles, 28 de octubre de 2009

Mover DataFile en Caliente en Oracle Solaris

Introducción
Una de las tareas con las que nos encontramos en el mundo Oracle es el uso de I/O y como distribuir la carga entre diferentes LUNs. Para ello, podemos mover los datafiles que necesitemos de la siguiente manera:

Si nuestra base de datos está en ARCHIVE_MODE,
  1. Poner DataFile en Offline
  2. Mover/Copiar DataFile de Ubicación original a la nueva
  3. Recuperar DataFile
  4. Poner DataFile en Online

Debemos tener en cuenta que mientras dure esta tarea, los accesos al DataFile lanzarán una Excepción de "No se puede acceder al datafile /u0x/oradata/XYZ.dbf'

Veamos el ejemplo para mover el DataFile EXAD01.dbf de /u05 a /u02
SQL> ALTER DATABASE DATAFILE '/u05/oradata/OLTP1/EXAD01.dbf' OFFLINE;

Base de datos modificada.

SQL> !mv /u05/oradata/OLTP1/EXAD01.dbf /u02/oradata/OLTP1/EXAD01.dbf

SQL> ALTER DATABASE RENAME FILE '/u05/oradata/OLTP1/EXAD01.dbf' TO '/u02/oradata/OLTP1/EXAD01.dbf';

Base de datos modificada.

SQL> RECOVER DATAFILE '/u02/oradata/OLTP1/EXAD01.dbf';
Recuperacion del medio fisico terminada.

SQL> ALTER DATABASE DATAFILE '/u02/oradata/OLP1/EXAD01.dbf' ONLINE;

Base de datos modificada.

Como podéis ver, es un procedimiento muy sencillo aunque NO EXENTO DE PROBLEMAS, ya que si no hacemos el movimiento de forma atómica, podemos hacer que nuestra DB deje de funcionar

Y Si no está en Modo ARCHIVE?
Si la base de datos no está en modo Archive, no se puede hacer en caliente, y simplemente debemos hacer los siguientes pasos,
  1. Bajar la base de datos
  2. Mover/Copiar el DataFile
  3. Montar Base de Datos
  4. Lanzar el Rename
  5. Abrir Base de datos
Vemos los pasos con un ejemplo,
SQL> SHUTDOWN IMMEDIATE;
SQL> !mv /u05/oradata/OLTP1/EXAD01.dbf /u02/oradata/OLTP1/EXAD01.dbf
SQL> STARTUP MOUNT
SQL> ALTER DATABASE RENAME FILE '/u05/oradata/OLTP1/EXAD01.dbf' TO '/u02/oradata/OLTP1/EXAD01.dbf';
SQL> ALTER DATABASE OPEN;
Cómo sé si Oracle está en modo Archive?
Podemos lanzar la siguiente SQL
SQL> select log_mode from sys.v_$database;

LOG_MODE
------------
ARCHIVELOG
Referencias

lunes, 26 de octubre de 2009

Varias Bases de Datos en Oracle - Parte 2

Introducción
En la primera parte de Cómo Instalar varias bases de datos en un mismo motor, parece que llegamos a la conclusión de que con cuatro comandos y dos cosillas todo está hecho, ...., pues la verdad es que no.

Antes de dar el paso a "OnLine" hay que tener muy claro y definido todos aquellos puntos en los cuales podemos encontrar los problemas, y como en todas las puestas en producción de Sistemas, aquello que no esté totalmente planificado, no sólo fallará, sino que será con las peores consecuencias <leyes de Murphy>

Pasar de una arquitectura de una única base de datos por nodo a una configuración de varias, requiere el uso de gestores de recursos a nivel de Sistema Operativo, y por lo tanto, mayor control de las herramientas que Solaris nos ofrece. Pongamos un ejemplo sencillo, pasaremos del startup de Oracle a, primero asignar el resource, privilegios, etc para esa base de datos y posteriormente hacer el startup.

Dicho esto, vamos a ver como podemos verificar los recursos, rendimiento y dimensionado de nuestra máquina para definir un CheckList y de esta forma minimizar los errores del paso a producción.

Nº Usuarios, Conexiones Dedicated, Shared, Acceso WAN, LAN
Debemos tener en cuenta cuántos usuarios tenemos, las formas de acceso y nuestro soporte, es decir, Acceso LAN o WAN.

Para ello, empezaremos contestando a las siguientes preguntas:
  • Cuántos usuarios tengo con la DB de media?
  • Cuántos Usuarios tengo con Carga Máxima?
  • Cuándo son los picos máximos y mínimos de carga?
Cómo los medimos?
SQL> select count(1) from v$session;
Memoria, Ethernet y CPU
Debemos tener en cuenta que cuando consolidemos varias Oracles de diferentes máquinas en una única, los requisitos de Memoria, Ethernet y CPU serán más de la suma de ambas bases de datos. Por ello, debemos tener repuesta a las siguientes preguntas:
  • Cuanta memoria consume cada Base de Datos?
  • Cuanta memoria consumen las sesiones?
  • Cómo se distribuye la carga de CPU?
Cómo lo medimos?
Cada session consume entorno a 5Mb, por lo tanto podemos utilizar

SQL> show parameter sga;
SQL> show sga;
SQL> select 5*1024*count(1) as SESSION_SIZE from v$session;

Para la carga de CPU utilizaremos los comandos mpstat y prstat
HBA e incremento de IO
Será en esta parte donde tendremos los mayores problemas. Cuando las base de datos se encuentran separadas, cada una puede "campar a sus anchas", pero al consolidar los recursos de la máquina se comparte y por ello, debemos tener mucho cuidado con el incremento de IO, debiendo responder a las siguientes preguntas:
  • Están correctamente segmentados los TableSpace?
  • Está la instalación definida sobre OFA?
  • Están las LUNs esparcidas por la SAN?
Cómo lo medimos?
Podemos obtener la ubicación de nuestros DataFile y analizar si debemos mover algunos a otra LUN accesibe desde otra HBA, si nuestros n datafile más leidos están en la misma LUN tendremos un problema de IO, seguro.

SQL> select name from v$datafile;
SQL> desc DBA_HIST_FILESTATXS;
SQL> select filename as DataFile, phyrds as PhysicalReads from dba_hist_filestatxs;

Para el acceso a disco y latencia utilizaremos iostat y nos fijaremos en los valores de asvc_t y %b. Un valor de asvc_t > 8 significa que ese disco es lento.
Jobs de Oracle
Antes cada una de las Bases de datos, tenía su propio espacio de tiempo, ahora esta compartido, es decir, ahora las 24h deberán ser para todas las bases de datos y deberemos evitar que varios JOBs se lancen simultáneamente para evitar un colapso de IO y CPU
SQL> select job,last_date,interval,what from dba_jobs;
AWR, OSW y Herramientas de diagnóstico de Oracle
Es muy importante utilizar las herramientas de diagnóstico de Oracle para ver qué está sucediendo y qué partes de nuestro core SQL podemos optimizar.
  • Hemos hecho Tuning del SQL
  • Cuántos count(*) hay por el código?
  • Tenemos muchos Access Full?
Cómo lo hacemos?
Llegados a este punto, debemos utilizar AWR para obtener los resultados de rendimiento de nuestra Oracle en los puntos de uso de CPU, Usuarios, etc. para corregir los problemas que podamos ir observando. Nos es recomendable hacer reports de más de 1h de diferencia, ya que los picos se pueden difuminar.

SQL> @?/rdbms/admin/addmrpt.sql
SQL> @?/rdbms/admin/awrrpt.sql
Parametrización Oracle
Al consolidar, no podemos usar ResourceLimit ya que el planificador de Oracle no es capáz de ponerse en contacto con el del sistema <de momento> y por lo tanto, no puede optimizar los recursos. Oracle recomienda que si se está utilizando Gestión de Recursos a Nivel de Sistema Operativo, se desactive el de Oracle, ya que las consecuencias son impredecibles.

Además cuidado con el parámetro cursor_sharing='FORCE' ya que nos puede dar más de un susto, xD

Plan de Backup
Nuestros planes de backup va a suponer un punto muy importante en nuestro impacto de rendimiento. Lo más importante es saber que desde la versión 9i RMAN ya es "utilizable" y debe ser nuestra solución, lo demás, debemos ir poniendolo a EOL

Cómo lo hacemos?
RMAN> show all;
RMAN> configure backup optimization on;
RMAN> configure controlfile autobackup on;
Asignación de Límites de Recursos
Qué tipo de Resource Limits quiero asignar, memoria, cpu, IO. En nuestro sistema vamos a utilizar FSS y la propiedad cpu-shares para limitar el porcentaje de CPU que vamos a asignar, sin embargo, existen muchas otras opciones que podemos incluir, como por ejemplo, tiempo de CPU, Nº de Threads, ..., en nuestro caso el Nº Threads no será necesario.

Puede que tengamos nuestro sistema configurado con una precisión perfecta, pero debemos verificar el correcto funcionamiento, y poder ir adaptando nuestra configuración a los requisitos de nuestro core. Para ello, utilizaremos projmod, newtask -p <project> para hacer los cambios necesarios.

Cómo lo hacemos?
Debemos tener en cuenta que el mayor impacto en el rendimiento está establecido por los cambios de contexto involuntarios icsw del comando mpstat. Si tenemos un valor superior a 1000 debemos evaluar introducir más CPU o crear un PSET para limitar el máximo de cambios de contextos, también podemos utilizar los comando pbind para unir procesos a procesadores y así evitar los cambios de contexto.

No Saturar la vt102
En física cuántica, el mero hecho de observar supone alterar el sistema, .... pues en Solaris tambíen! No debemos estar con 100+1 terminales con prstat, mpstat, iostat, ... ya que ésto hará que las métricas varien y lo más importante, nuestra máquina se verá resentida....

Y entonces, cómo puedo obtener las métricas? Lo mejor es utilizar la herramienta OSWatch de Oracle que nos proporciona todas las métricas y además, nos permite hacer gráficas y ver el rendimiento de nuestra máquina. OSWatcher puedes descargarlo de Metalink ID 301137.1 pero para el rendimiento de Solaris en general, la herramienta que debemos utilizar es Solaris SE ToolKit

Conclusión
Aunque los preparativos sean comunes a todos, análisis de métricas, consumos y rendimientos la parametrización de Oracle y los recursos del Sistema son totalmente dependientes, es decir, los valores que a mí me funcionan, puede que no te sirvan para nada a ti, por ello, el tuning es una mezcla de arte y prueba-error.

En la siguiente entrega veremos cómo trabajar con varias bases de datos y cómo desenvolverse en este tipo de entornos, hasta entonces ... toca esperar.

Referencias

jueves, 22 de octubre de 2009

Redimensionar Disco UFS en Solaris 10

Introducción
Con el paso del tiempo, nuestras LUNs se van haciendo pequeñas (o tenemos muchos datos) y es necesario redimensionar los Arrays de las Cabinas. A continuación os muestro cómo redimensionar una partición UFS en Solaris después de haber cambiado el tamaño en nuestra SAN (en mi caso un IBM DS4800)

Asumo que sabes cómo incrementar el tamaño del array en tu SAN y por lo tanto, vamos a centrarnos en qué debemos hacer en Solaris.

Desmontar y Volver a configurar el Disco
Lo primero que debemos hacer es desmontar el disco para nuestro sistema de ficheros UFS se de cuenta que hemos ampliado el disco, para ello, utilizaremos el comando umount <mount point> y luego utilizaremos el comando format para hacer que Solaris vuelva a pedir la definición del disco a la cabina utilizando la opción type del comando, vamos a verlo con un ejemplo.
# umount /u01/app/oracle10g2/10.2/db/flash_recovery_area
# format
Searching for disks...done


AVAILABLE DISK SELECTIONS:
....
/scsi_vhci/ssd@g600a0b8000474bfa000014e549d48134
9. c3t600A0B8000474BFA0000116748AD0544d0 103_ORA_
/scsi_vhci/ssd@g600a0b8000474bfa0000116748ad0544
.....

Specify disk (enter its number): 9
selecting c3t600A0B8000474BFA0000116748AD0544d0: 103_ORA_
[disk formatted]


FORMAT MENU:
disk - select a disk
type - select (define) a disk type
partition - select (define) a partition table
current - describe the current disk
format - format and analyze the disk
repair - repair a defective sector
label - write label to the disk
analyze - surface analysis
defect - defect list management
backup - search for backup labels
verify - read and display labels
save - save new disk/partition definitions
inquiry - show vendor, product and revision
volname - set 8-character volume name
! - execute , then return
quit
format> type


AVAILABLE DRIVE TYPES:
0. Auto configure
1. Quantum ProDrive 80S
2. Quantum ProDrive 105S
3. CDC Wren IV 94171-344
4. SUN0104
5. SUN0207
6. SUN0327
7. SUN0340
8. SUN0424
9. SUN0535
10. SUN0669
11. SUN1.0G
12. SUN1.05
13. SUN1.3G
14. SUN2.1G
15. SUN2.9G
16. Zip 100
17. Zip 250
18. Peerless 10GB
19. SUN72G
20. IBM-1815 FAStT-0914
21. IBM-1815 FAStT-0914
22. IBM-1815 FAStT-0914
23. IBM-1815 FAStT-0914
24. IBM-1815 FAStT-0914
25. IBM-1815 FAStT-0914
26. IBM-1815 FAStT-0914
27. IBM-1815 FAStT-0914
28. IBM-1815 FAStT-0914
29. IBM-1815 FAStT-0914
30. IBM-1815 FAStT-0914
31. other
Specify disk type (enter its number)[26]: 0
c3t600A0B8000474BFA0000116748AD0544d0: configured with capacity of 499.98GB

selecting c3t600A0B8000474BFA0000116748AD0544d0: 103_ORA_
[disk formatted]
format> label
Ready to label disk, continue? yes

format> quit
Ampliar la partición UFS
Para poder ampliar la partición UFS, necesitamos utilizar el comando growfs y que la partición esté montada en su ubicación predefinida

El formato del comando growfs es el siguiente:
# growfs -M <mount point> <raw device>
Y debemos tener en cuenta que, sólo podemos ampliar la partición si no se solapa con la siguiente, por ejemplo, Si tenemos la partición s4 que empieza en el bloque 1000 y acaba en el 2000 y la partición s5 que empieza en el 2001 y acaba en el 4000, aunque ampliemos el disco, la partición s4 no se podrá ampliar en ningún bloque ya que al hacerlo finalizaría sobre la s5. Por eso, yo siempre utilizo la partición s6 y nunca asigno la s7.
# mount -F ufs /dev/dsk/c3t600A0B8000474BFA0000116748AD0544d0s6 /u01/app/oracle10g2/10.2/db/flash_recovery_area
# df -h
Sistema de archivos tamaño usados aprovechar capacidad Montado en
...
/dev/dsk/c3t600A0B8000474BFA0000116748AD0544d0s6
394G 42G 348G 11% /u01/app/oracle10g2/10.2/db/flash_recovery_area

# growfs -M /u01/app/oracle10g2/10.2/db/flash_recovery_area /dev/rdsk/c3t600A0B8000474BFA0000116748AD0544d0s6
/dev/rdsk/c3t600A0B8000474BFA0000116748AD0544d0s6: 1048018944 sectores en 63966 cilindros de 256 pistas, 64 sectores
511728,0MB en 10661 grupos de cilindros (6 c/g, 48,00MB/g, 5824 i/g)
copias de seguridad super-bloque (para fsck -F ufs -o b=#) en:
32, 98400, 196768, 295136, 393504, 491872, 590240, 688608, 786976, 885344,
Inicializando grupos de cilindros:
...............................................................................
...............................................................................
.......................................................
copias de seguridad del superbloque de los últimos 10 grupos de cilindros en:
1047045856, 1047144224, 1047242592, 1047340960, 1047439328, 1047537696,
1047636064, 1047734432, 1047832800, 1047931168
# df -h
Sistema de archivos tamaño usados aprovechar capacidad Montado en
...
/dev/dsk/c3t600A0B8000474BFA0000116748AD0544d0s6
492G 42G 446G 9% /u01/app/oracle10g2/10.2/db/flash_recovery_area

Conclusión
Solaris nos ofrece las herramientas para poder ampliar el espacio asignado a nuestras particiones, siempre que tengamos en cuenta las limitaciones de los slice y el tener que desmontar la LUN, a parte de este "problemilla", no es más complicado que otros comandos.


Referencias

martes, 20 de octubre de 2009

Cómo Verficar y Recrear /etc/shadow de Solaris

Introducción
Puede que en algún momento de la vida de nuestro hosts necesitemos limpiar los usuarios no válidos. Si son un par, tres no hay mucho problema y podemos utilizar un simple userdel [-r] pero si son unos cuantos?
La solución es simple, podemos editar nuestro archivo /etc/passwd eliminando los usuarios que no necesitemos y acto seguido recrearemos nuestro /etc/shadow utilizando pwconv

# useradd -s /bin/bash -d /export/home/test -m test
64 bloques
# passwd -l test
passwd: información de contraseña cambiada por test
# cat /etc/shadow |wc -l
21
# vi /etc/passwd
~
~
~
"/etc/passwd" 20 líneas, 806 caracteres
# cat /etc/passwd | wc -l
20
# cat /etc/shadow | wc -l
21
# pwconv
# cat /etc/shadow | wc -l
20
Como podéis ver, es sencillo y rápido.

Referencias

lunes, 19 de octubre de 2009

Problema de actualización de Solaris 10u8 con MultiPath Activado

Introducción
Hace un tiempo tuvimos un problema con una HBA en producción con Solaris 10. El tema es que se "caía" el link contra la SAN cuando se producía un FailOver en uno de los caminos pasados unos segundos.

Después de mucho investigar el problema era de la versión del Firmware de la Emulex y de un Parche de Solaris, así que actualizamos el Firmware y Solaris, pero a partir de entonces la configuración MultiPath no funcionaba.

Ya cansado de configuraciones y con el tiempo encima nuestro, tome la decisión de poner todo en MultiPath (ya sé que no es correcto, pero ...), y voila funcionó .... hasta hoy que he querido hacer un upgrade de Solaris 10u6 a Solaris 10u8

Mensaje de Error
La versión de Solaris (Solaris 10) del segmento c1t0d0s1 no
puede actualizarse.

No pudo montarse un sistema de archivos listado en la tabla de
sistemas de archivos (vfstab).
Mi Solución
Debemos tener en cuenta que el Instalador de Solaris arranca sin MultiPath (mpxio-disable=yes) y por lo tanto, no es capáz de montar las entradas de /etc/vfstab así que tenido que configurar correctamente Solaris para habilitar MPXIO sólo en las HBA y no en la controladora interna.

Este es el contenido de /etc/vfstab con MPXIO activado
fd - /dev/fd fd - no -
/proc - /proc proc - no -
/dev/dsk/c4t20000014C38A520Dd0s0 - - swap - no -
/dev/dsk/c4t20000014C38AFC43d0s0 - - swap - no -
/dev/dsk/c4t20000014C38A520Dd0s1 /dev/rdsk/c4t20000014C38A520Dd0s1 -
/dev/dsk/c4t20000014C38A520Dd0s6 /dev/rdsk/c4t20000014C38A520Dd0s6 -
/dev/dsk/c4t20000014C38A520Dd0s5 /dev/rdsk/c4t20000014C38A520Dd0s5 -
/dev/dsk/c4t20000014C38AFC43d0s6 /dev/rdsk/c4t20000014C38AFC43d0s6 -
/devices - /devices devfs - no -
ctfs - /system/contract ctfs - no -
objfs - /system/object objfs - no -
swap - /tmp tmpfs - yes -
Este es el contenido de /etc/vfstab con MPXIO desactivado
fd - /dev/fd fd - no -
/proc - /proc proc - no -
/dev/dsk/c1t0d0s0 - - swap - no -
/dev/dsk/c1t1d0s0 - - swap - no -
/dev/dsk/c1t0d0s1 /dev/rdsk/c1t0d0s1 / ufs 1 no -
/dev/dsk/c1t0d0s6 /dev/rdsk/c1t0d0s6 /export/home ufs 2 -
/dev/dsk/c1t0d0s5 /dev/rdsk/c1t0d0s5 /opt ufs 2 yes -
/dev/dsk/c1t1d0s6 /dev/rdsk/c1t1d0s6 /zones ufs 2 yes -
/devices - /devices devfs - no -
ctfs - /system/contract ctfs - no -
objfs - /system/object objfs - no -
swap - /tmp tmpfs - yes -
Conclusión
Hay que configurar bien MPXIO, xD

Referencias

viernes, 16 de octubre de 2009

Activar/Desactivar MultiPath en Solaris 10

Introducción
Solaris soporta MultiPath mediante MPXIO de forma nativa, y para activarlo deberemos editar los archivo /kernel/drv/fp.conf y /kernel/drv/scsi_vhci.conf

En el archivo fp.conf deberemos editar los dispositivos sobre los que queremos activar el MultiPath, por ejemplo, vamos a activar el MultiPath sobre la tarjeta QLogic 2GB FC-DC PCI-X que corresponde con el device /pci@8,600000/SUNW,qlc@1 y lo hacemos para los dos puertos ya que es una tarjeta dual. Así mismo, haremos que la controladora interna no active el multipath.
# vi /kernel/drv/fp.conf
## Global Disabled
mpxio-disable="yes";

## Enable Onto QLogic FC PCI-X Only
name="fp" parent="/pci@8,600000/SUNW,qlc@1" port=0 mpxio-disable="yes";
name="fp" parent="/pci@8,600000/SUNW,qlc@1" port=1 mpxio-disable="yes";

:wq
En el archivo scsi_vhci.conf deberemos incluir los valores de Vendedor ID/Product ID si, como dice el mensaje de ayuda, queremos soportar "3rd party symmetric device".
Así que
lo primero que debemos hacer es obtener Vendedor/Product de nuestros discos duros, en nuestro caso en una IBM DS4800
# vi /kernel/drv/scsi_vhci.conf
device-type-scsi-options-list =
"IBM 1815 FAStT",
"IBM 1815",
"symmetric-option";


symmetric-option = 0x1000000;

:wq
Nota: Nuestra Cabina IBM DS4800 su device-type es "IBM.....1815", donde los "." son espacios en blanco, esto es debido a que el VendedorID debe ser de 8 caracteres, y como IBM tiene 3, hacen falta 5 espacios en blanco, luego el MachineCode de 4 caracteres


Ya sólo nos queda hacer un reboot con reconfiguración y tendremos nuestro multipath activado, podemos comprobarlo Viendo la Información de las LUN asignadas a nuestras HBA, comprobando los caminos utilizando luxadm y sus LUNs


Activar *TODOS* los controladores con MultiPath

Si queremos activar el multipath en todos los devices que tenemos, podemos utilizar un scrip llamado stmsboot el cual nos permite hacerlo de forma sencilla. Como pequeña nota, el script hace las preguntas en castellano, sin embargo, espera las contestaciones en inglés, por eso utilizo "y" en vez de "s"

# stmsboot -e

ADVERTENCIA: stmsboot funciona en cada controlador compatible capaz de multirrua
detectado en un host. En el sistema, estos controladores son

/devices/pci@8,600000/SUNW,qlc@1/fp@0,0
/devices/pci@8,600000/SUNW,qlc@1,1/fp@0,0
/devices/pci@9,600000/SUNW,qlc@2/fp@0,0

Si NO desea operar con estos controladores, cierre stmsboot
y volver a ejecutar con -D { fp | mpt } para especificar qu controladores desea
para modificar la configuraci¢n de multirruta.

¨Desea continuar? [s/n] (predeterminado: s) y
Checking mpxio status for driver fp
Checking mpxio status for driver mpt
ADVERTENCIA: Esta operaci¢n precisa un rearranque del sistema.
¨Desea continuar? [s/n] (predeterminado: s) y
Los cambios surtir n efecto despus de rearrancar el sistema.
¨Desea rearrancar el sistema ahora? [s/n] (predeterminado: s) y
Oct 14 14:14:46 sol10-490v1.sfchildren.com reboot: rebooted by root
updating /platform/sun4u/boot_archive
Oct 14 14:14:55 sol10-490v1.sfchildren.com syslogd: going down on signal 15
Oct 14 14:14:55 /usr/lib/snmp/snmpdx: received signal 15
syncing file systems... done
rebooting...

Resetting ...

Desactivar *TODO* el MultiPath
Para desactivar el soporte de multipath sobre todos los devices, utilizaremos la opción -d del comando stmsboot
# stmsboot -d

ADVERTENCIA: stmsboot funciona en cada controlador compatible capaz de multirrua
detectado en un host. En el sistema, estos controladores son

/devices/pci@8,600000/SUNW,qlc@1/fp@0,0
/devices/pci@8,600000/SUNW,qlc@1,1/fp@0,0
/devices/pci@9,600000/SUNW,qlc@2/fp@0,0

Si NO desea operar con estos controladores, cierre stmsboot
y volver a ejecutar con -D { fp | mpt } para especificar qu controladores desea
para modificar la configuraci¢n de multirruta.

¨Desea continuar? [s/n] (predeterminado: s) y
Checking mpxio status for driver fp
Checking mpxio status for driver mpt
ADVERTENCIA: Esta operaci¢n precisa un rearranque del sistema.
¨Desea continuar? [s/n] (predeterminado: s) y
Los cambios surtir n efecto despus de rearrancar el sistema.
¨Desea rearrancar el sistema ahora? [s/n] (predeterminado: s) y
Oct 14 14:01:51 sol10-490v1.sfchildren.com reboot: rebooted by root
updating /platform/sun4u/boot_archive
Oct 14 14:02:00 sol10-490v1.sfchildren.com syslogd: going down on signal 15
Oct 14 14:02:00 /usr/lib/snmp/snmpdx: received signal 15
syncing file systems... done
rebooting...

Resetting ...

Nota Importante:
No es apropiado activar MultiPath sobre todos los devices, siempre y cuando exista uno que no lo soporte, por ejemplo, las controladoras Internas. Es más correcto activarlo en aquellas que realmente soportan MultiPath

Referencias

jueves, 15 de octubre de 2009

Cómo ver información de las LUNs de la SAN

Introducción
Si queremos obtener información de las LUNs que vemos a través de nuestras HBA, utilizaremos el comando luxadm con la opción probe, y para obtener un detalle la opción display {raw_device}, por ejemplo,
# luxadm probe
No Network Array enclosures found in /dev/es

Found Fibre Channel device(s):
Node WWN:200600a0b82af68e Device Type:Disk device
Logical Path:/dev/rdsk/c5t600A0B80002AF6180000050E4A125DF2d0s2
Node WWN:20000004cf7fe30e Device Type:Disk device
Logical Path:/dev/rdsk/c5t20000004CF7FE30Ed0s2
Node WWN:20000004cf8f7b64 Device Type:Disk device
Logical Path:/dev/rdsk/c5t20000004CF8F7B64d0s2
Y para ver la información de la LUN utilizaremos la opción display
# luxadm display /dev/rdsk/c5t600A0B80002AF6180000050E4A125DF2d0s2
DEVICE PROPERTIES for disk: /dev/rdsk/c5t600A0B80002AF6180000050E4A125DF2d0s2
Vendor: IBM
Product ID: 1814 FAStT
Revision: 0916
Serial Num: SN74905575
Unformatted capacity: 204800,000 MBytes
Write Cache: Enabled
Read Cache: Enabled
Minimum prefetch: 0x1
Maximum prefetch: 0x0
Device Type: Disk device
Path(s):

/dev/rdsk/c5t600A0B80002AF6180000050E4A125DF2d0s2
/devices/scsi_vhci/ssd@g600a0b80002af68e000007324a70f30e:c,raw
Controller /devices/pci@8,600000/pci@1/lpfc@5/fp@0,0
Device Address 200700a0b82af68f,5
Host controller port WWN 10000000c92d4459
Class secondary
State STANDBY
Controller /devices/pci@8,600000/pci@1/lpfc@5/fp@0,0
Device Address 200600a0b82af68f,5
Host controller port WWN 10000000c92d4459
Class primary
State ONLINE
Controller /devices/pci@8,600000/pci@1/lpfc@4/fp@0,0
Device Address 200700a0b82af68f,5
Host controller port WWN 10000000c92d4458
Class secondary
State STANDBY
Controller /devices/pci@8,600000/pci@1/lpfc@4/fp@0,0
Device Address 200600a0b82af68f,5
Host controller port WWN 10000000c92d4458
Class primary
State ONLINE
Referencias

miércoles, 14 de octubre de 2009

Cómo obtener el Vendedor y Modelo del disco duro (inquiry) en Solaris

Introducción
Para poder obtener el modelo y fabricante de los discos duros utilizaremos la opción inquiry del comando format

# format
Searching for disks...done


AVAILABLE DISK SELECTIONS:
...
13. c5t600A0B80002AF618000007E14A9CCB86d0 307_ORCL
....
Specify disk (enter its number): 13
selecting c5t600A0B80002AF618000007E14A9CCB86d0: 307_ORCL
[disk formatted]


FORMAT MENU:
disk - select a disk
type - select (define) a disk type
partition - select (define) a partition table
current - describe the current disk
format - format and analyze the disk
repair - repair a defective sector
label - write label to the disk
analyze - surface analysis
defect - defect list management
backup - search for backup labels
verify - read and display labels
save - save new disk/partition definitions
inquiry - show vendor, product and revision
volname - set 8-character volume name
! - execute , then return
quit
format> inquiry
Vendor: IBM
Product: 1814 FAStT
Revision: 0916
format> quit

En este caso, el disco 13 corresponde con un disco de la cabina IBM DS4800

Referencias

martes, 13 de octubre de 2009

Varias Bases de Datos Oracle en una misma máquina (Motor)

Introducción
En los post anteriores hemos visto cómo instalar Oracle 10g sobre Solaris y cómo podemos configurarlo para utilizar SMF en la gestión de los listener, en esta ocasión vamos a ver cómo podemos instalar varias bases de datos sobre un único motor.

Antes de ponernos manos a la obra, debemos tener en cuenta varios puntos:
  • No podemos, o mejor dicho no es útil, instalar nuestra base de datos principal y su stand by sobre el mismo motor, principalmente porque cuando queramos parchear Oracle, ambas deberán estar detenidas
  • Debemos tener definidas las prioridades de cada base de datos, por ejemplo, si compartimos nuestra base de datos transacional (OLTP) con el DatawareHouse, van a estar peleando por los recursos de la máquina?
  • Qué tipo de planificador vamos a usar, FX, TS, FSS. En este caso la mejor (única) opción será utilizar FSS y para ello deberemos definir los cpu-shares de cada project.
  • Cuánta memoria voy a asignar a cada instancia? Es muy importante dimensionar Oracle para que no tire de swap
Definición del planificador FSS y Sus Shares
En este punto, cuando tenemos que ejecutar diferentes bases de datos con diferentes prioridades, la mejor solución es utilizar el planificador FSS con división de cargas. Me explico, vamos a definir cuánta CPU puede utilizar cada proceso: listener, logwritter, archivelog, rman, etc. De esta forma, nos aseguraremos que un proceso no colapse a los demás

Lo primero que debemos hacer es asignar el planificador FSS como predeterminado (si no lo hemos hecho ya), aquí tienes cómo asignarlo

Una vez asignado, debemos definir los cpu-shares de cada proyecto, vamos a ver cómo podemos separarlos. En nuestro ejemplo, tenemos dos bases de datos, una OLTP pura, y otra dedicada a Internet, partiendo de esta base haremos la tabla de repartos contando con la siguiente fórmula:

Veamos un ejemplo, si tenemos tres projects: listener, database, rman y queremos que el reparto de uso de CPU sea: 40%, 50% y 10% tendremos el siguiente reparto:
  • Project Listener, cpu-shares = 40 --> 40/(40+50+10)*100
  • Project Database, cpu-shares = 50 --> 50/(50+40+10)*100
  • Project Rman, cpu-shares = 10 --> 10/(10+40+50)*100

En este ejemplo es fácil ver los valores ya que hemos utilizado unos "números sencillos", pero con este tipo de asignación, nos quedamos con un margen de maniobra mínimo. Por ejemplo, si necesitamos separar los procesos de la base de datos en: logwritter, archivelog, jobs, etc. tan sólo tenemos 10 cpu-shares libres porque nuestra escala es de 100. Vamos a ver un ejemplo con una escala de 1700 cpu-shares y añadiendo tres project más, nos quedaría el siguiente reparto:
  • Project Listener, cpu-shares=375 --> 375/1685*100=22,26% CPU
  • Project Database, cpu-shares=300 --> 300/1685*100=17,8% CPU
  • Project Rman, cpu-shares=100 --> 100/1685*100=5,93% CPU
  • Project LogWritter, cpu-shares=860 -> 860/1685*100=51,04% CPU
  • Project archivelog, cpu-shares=40 -> 40/1685*100=2,37% CPU
  • Project jobs, cpu-shares=10 -> 10/1685*100=0,59% CPU
Esto es un ejemplo de lo que podemos hacer y cómo calcular el valor de %CPU que estamos asignando a cada project y cada instalación es un mundo aunque intentaré hacerlo sencillo, xD

Uso de projecmod para modificar los cpu-shares
Una de las venatajas de utilizar projects es que nos permite modificar la parametrización dinámicamente (no confundir con Solaris Dynamic Reconfiguration u Oracle Dynamic Intimated Shared Memory) utilizando el comando projmod, por ejemplo, si queremos redistribuir la carga de cpu-shares entre nuestros projectos utilizaremos lo siguiente para asignar como nuevo cpu-shares 750 al project oltp2.dedicated
# projmod -sK "project.cpu-shares=(privileged,750,none)" oltp2.dedicated
Un Resultado Real usando projects
Aquí os muestro un de nuestras Oracle, en una M4000 sobre Solaris 10 con dos bases de datos y un único motor 10.2.0.4


Dimensionar la Memoria
Debemos tener en cuenta que la memoria asignada a Oracle no debe superar el 80% de la memoria del sistema. Como el dimensionado es algo muy particular yo utilizo una OO Calc para poder tener unos valores aproximados, puedes descargarte mi Super Oracle Calc desde aquí


Uso de OFA y separación de peticiones I/O
Es muy importante intentar separar los accesos I/O de las bases de datos en diferentes devices, de esta forma, el rendimiento no se verá tan afectado. Para ello, utilizaremos OFA ya que nos permite distribuir de una forma sencilla la estructura de Oracle, en la Instalación de Oracle Parte 2 hay una explicación más detallada sobre OFA, mira el siguiente ejemplo
$ iostat -xnpzm 6
extended device statistics
r/s w/s kr/s kw/s wait actv wsvc_t asvc_t %w %b device
0.3 0.2 2.8 0.2 0.0 0.0 1.0 11.5 0 0 sd0
0.3 0.2 2.8 0.2 0.0 0.0 1.0 11.5 0 0 sd0,a
0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.5 0 0 sd0,b
0.0 0.1 0.1 0.2 0.0 0.0 0.8 18.7 0 0 sd2
0.0 0.1 0.1 0.2 0.0 0.0 0.8 18.7 0 0 sd2,g
413.1 119.0 5553.3 889.4 0.0 0.4 0.0 0.7 0 22 ssd11
413.1 119.0 5553.3 889.4 0.0 0.4 0.0 0.7 0 22 ssd11,g
5.2 34.1 1303.1 482.0 0.0 0.1 0.0 2.8 0 3 ssd12
0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.9 0 0 ssd14
15.9 3.8 344.6 59.0 0.0 0.0 0.0 1.3 0 2 ssd15
15.9 3.8 344.6 59.0 0.0 0.0 0.0 1.3 0 2 ssd15,g
1.9 7.5 473.1 112.6 0.0 0.0 0.0 2.0 0 1 ssd16
1.9 7.5 473.1 112.6 0.0 0.0 0.0 2.0 0 1 ssd16,g
0.8 7.5 59.2 114.6 0.0 0.0 0.0 1.0 0 1 ssd18
0.8 7.5 59.2 114.6 0.0 0.0 0.0 1.0 0 1 ssd18,g
0.6 7.1 20.3 105.0 0.0 0.0 0.0 0.9 0 1 ssd19
0.6 7.1 20.3 105.0 0.0 0.0 0.0 0.9 0 1 ssd19,g
3.9 1.2 2926.1 628.9 0.0 0.0 0.0 7.9 0 3 ssd24
3.9 1.2 2926.1 628.9 0.0 0.0 0.0 7.9 0 3 ssd24,g
0.1 0.1 13.1 3.2 0.0 0.0 0.0 3.4 0 0 ssd33
0.1 0.1 13.1 3.2 0.0 0.0 0.0 3.4 0 0 ssd33,g
0.2 0.1 11.6 3.6 0.0 0.0 0.0 2.2 0 0 ssd34
0.2 0.1 11.6 3.6 0.0 0.0 0.0 2.2 0 0 ssd34,g
0.0 0.1 4.1 1.2 0.0 0.0 0.0 2.4 0 0 ssd35
0.0 0.1 4.1 1.2 0.0 0.0 0.0 2.4 0 0 ssd35
Instalación de nueva Base de datos Oracle sobre un motor único
Una vez definido todos los puntos necesarios, podemos comenzar con la instalación de la nueva base de datos, para ello, lo único que debemos hacer es asignar nuestro nuevo ORACLE_SID y comenzar con la instalación de forma normal, puedes encontrar los pasos en Referencias, pero ... si estás aquí es que ya sabes Instalar Oracle sin Ayuda :D

Conclusión
Hemos visto que antes de ponernos manos a la obra debemos tener en cuenta varios factores y planificar la instalación de forma detallada para evitar que colapsemos la máquina, sin embargo, el uso de Solaris projects, nos permite modificar la parametrización para hacerla dinámica y ajustada a las necesidades reales.

Espero no haberos aburrido,
ya sabéis que ante cualquier duda, podéis contactar conmigo.

Referencias

viernes, 9 de octubre de 2009

Cómo activar Intimated Shared Memory en Oracle

Introducción
Antes de explicar cómo activar Oracle ISM Daemon, vamos a comenzar explicando qué es Dynamic Intimated Shared Memory y Por qué nos Interesa, así que vamos a ver un poco de historia de Solaris

Intimitad Shared Memory
Es una característica que incorporó Solaris 2.2, aunque será a partir de la versión 2.4 cuando se puedan utilizar páginas de 4Mb en UltraSPARC. ISM, nos aporta las siguientes características
  • Permite a la aplicación compartir el segmento de memoria
  • Bloquea las páginas en memoria y hace que éstas estén fuere de los pageouts y por lo tanto no bajan a disco.
  • Comparte la PTEs (page table entries) entre los procesos, por lo tanto son necesarios menos búsquedas en la traducción de direcciones de memoria.
  • Usa 4 MB de tamaño de página, por lo tanto, disminuye el número de traducciones de memoria.
Traducido de http://www.adp-gmbh.ch/unix/solaris/ism.html

Pero no todo es perfecto, debemos tener en cuenta que ISM está diseñado para sistemas con tareas específicas, como Databases, WebServers, AppServer, ..., pero no para sistemas donde el usuario pueda lanzar cualquier applicación arbritaria. Además, usará páginas de 4MB tantas como sea posible, para el restro, utilizará páginas de 8KB disminuyendo su rendimiento.

Solaris 8 1/01 Dynamic Intimated Shared Memory
Como evolución a la tecnología ISM, se introduce la variante de configuración dinámica, pensada para Bases de Datos, aunque no será hasta Oracle 9i cuando se pueda aplicar dimensionado dinámico de la SGA

Solaris 9 y Dynamic Reconfiguration
En Solaris 9 se introduce la característica de Dynamic Reconfiguration que nos permite que los módulos de Memoria, CPU e I/O sean intercambiables en caliente y por lo tanto se elimina el downtime. Es a partir de Solaris 9 cuando se utiliza MPO

Solaris 10
Incorpora todas las evoluciones y mejoras de sus predecesores he incorpora mejoras en la gestión de Memoria y Zonas


Configurar Oracle 10g
Para activar Oracle DISM daemon, simplemente deberemos editar el archivo init$ORACLE_SID.ora y modificar el parámetro sga_max_size con un valor mayor al de sga_target, donde el valor de sga_max_size deberá ser el mayor tamaño que podamos asignar nunca superando TOTAL_MEM + TOTAL_SWAP, vamos a verlo con un ejemplo

$ cd $ORACLE_HOME/dbs/
$ vi init$ORACLE_SID.ora
*.sga_target=5000M
*.sga_max_size=6000M
:wq
Para que este cambio sea efectivo, es necesario reiniciar la base de datos, para ello simplemente bajaremos la base de datos y la iniciaremos con el nuevo pfile utilizando el siguiente comando:
$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.4.0 - Production on Thu Oct 8 20:23:30 2009

Copyright (c) 1982, 2007, Oracle. All Rights Reserved.

Connected to an idle instance.

SQL> startup pfile='?/dbs/initOLTP1.ora'
Si queremos que el cambio sea permanente, entonces crearemos el spfile desde el pfile, utilizando el siguiente comando:
SQL> create spfile from pfile;
Y con esto, la próxima vez que iniciemos nuestro Oracle tendrá los valores que hemos definido en nuestro pfile

Comprobar su funcionamiento

Para comprobar que el daemon DISM está en funcionamiento, simplemente debemos buscar el proceso ora_dism_$ORACLE_SID, de la siguiente forma
$ ps -ef|grep ora_dis|grep -v grep
root 24506 19564 0 06:14:18 ? 0:06 ora_dism_OLTP1
Ya tenemos nuestro Oracle utilizando DISM, pero ... y ahora qué?
Buena pregunta, hemos hecho esto para poder redimensionar nuestra SGA en caliente, y permitir a Oracle+Solaris gestionar mejor el uso de la memoria, por ejemplo, imaginemos la siguiente problemática:

Nuestro servidor de base de datos necesita ejecutar muchos Jobs que no estaban contenplados y estos hacen uso de mucho espacio de sort, shared, etc. sin embargo, nuestro tamaño de SGA está dimensionado para que pueda absorver los 500 clientes que se conectan de 09:00h a 15:00h contra la base de datos. Sin embargo, durante la noche no existen clientes y la carga de las conexiones dedicated es mínima. Nuestro DBA nos dice que necesita más SGA durante la noche y la que tiene durante el día (para no hacer swaping), qué hacemos?

Pues bien, una vez activado DISM, podemos utilizar la siguiente instrucción
SQL> alter system set db_cache_size=150M;

Sistema modificado.

SQL> show sga

Total System Global Area 578813952 bytes
Fixed Size 2042336 bytes
Variable Size 394270240 bytes
Database Buffers 176160768 bytes
Redo Buffers 6340608 bytes
SQL> show parameter db_cache_size

NAME TYPE
------------------------------------ --------------------------------
VALUE
------------------------------
db_cache_size big integer
152M
SQL>
Conclusión
Como hemos visto, DISM nos aporta una flexibilidad mayor a la hora de configurar nuestra base de datos y poder hacer frente a cambios en la arquitectura (memoria, I/O, CPU) en caliente.

Espero no haberos aburrido,

Referencias

miércoles, 7 de octubre de 2009

Cómo evitar los acentos cuando ssh añade un host nuevo

Introducción
Dependiendo del locale que tengamos asignado, cuando nos conectamos mediante ssh a un host nuevo (uno que no está en nuestro know_hosts) ssh nos pedirá confirmación para añadirlo.
$ ssh oracle@oracle.test.database.test.com
No se puede establecer la autenticidad del sistema 'oracle.test.database.test.com' (192.168.1.210).
RSA la firma de la clave es 8f:e0:43:56:e5:67:d4:fe:65:09:ff:0b:ca:3d:8e:45.
?Desea continuar con la conexi?n (s?/no)? sí
Escriba 's?' o 'no': ^C
Para evitarlo, simplemente deberemos desasignar la variable de entorno LC_MESSAGES y de esta forma, nuestro ssh utilizará los mensajes en Inglés, siguiendo con el mismo ejemplo,
$ echo $LC_MESSAGES
es
$ unset LC_MESSAGES
$ ssh oracle@oracle.test.database.test.com
The authenticity of host ''oracle.test.database.test.com (192.168.1.210)' can't be established.
RSA key fingerprint is 8f:e0:43:56:e5:67:d4:fe:65:09:ff:0b:ca:3d:8e:45.
Are you sure you want to continue connecting (yes/no)?
Referencias

martes, 6 de octubre de 2009

Instalar PostgreSQL en Solaris 10 - Parte 1

Introducción
Postgres es una gran base de datos, y como sucede con Oracle, un poco peculiar. Sin embargo, la instalación no es muy complicada asi que vamos a ver cómo podemos Instalar Postgres sobre Solaris 10

UPDATED: Si quieres puedes ir a Cómo Instalar PostgreSQL 9.x en OpenIndiana, un post más actualizado sobre el proceso de instalación en el nuevo sistema operativo sucesor de OpenSolaris

Nota Sobre Solaris 10 y usuario Postgres
En Solaris 10 ya existe una instalación de Postgres en el sistema, y por lo tanto el usuario postgres está creado. Éste utiliza pfexec (el sudo de Solaris) y aunque es muy útil, en nuestro caso puede complicar un poco la instalación, así que he decidido eliminarlo y crearlo desde cero, pero es por un tema de simplificación del post

Creación del Usuario postgres
Como hemos comentado, en Solaris 10, existe un usuario y grupo llamado postgres así que primero eliminaremos el usuario y lo crearemos de forma normal
# userdel postgres
# useradd -g postgres -s /bin/bash -d /export/home/postgres -m postgres
# passwd postgres
Nueva contraseña:
Vuelva a escribir la nueva contraseña:
passwd: la contraseña se ha cambiado para postgres satisfactoriamente
Creación del project
Como en Oracle, es necesario definir las dimensiones de max-shm-memory y max-sem-ids, max-shm-ids en un project (Los valores de max-shm-memory puedes ajustarlos a tu necesidad)

# projadd -c "Postgres Database" -G postgres group.postgres
# projmod -sK "process.max-sem-nsems=(priv,256,deny)" group.postgres
# projmod -sK "project.max-sem-ids=(priv,100,deny)" group.postgres
# projmod -sK "project.max-shm-ids=(priv,100,deny)" group.postgres
# projmod -sK "project.max-shm-memory=(priv,8G,deny)" group.postgres
Preparación del Profile
Una vez creado el nuevo usuario, vamos a crear un profile (al estilo de Oracle) para que nos precarge las diferentes variables de entorno. En postgres la variable PGDATA
es la que indica dónde se encuentran los archivos de datos (datafiles) en nuestro caso en /var/postgres/8.4/data y aunque no es necesario, voy a utilizar POSTGRES_HOME para la ruta de instalación. En nuestro caso, vamos a instalar Postgres en 64bits en la ruta /u01/app/postgres/8.4/db

Ahora crearemos la estructura de directorios para nuestra instalación de Postgres, es decir, /u01/app/postgres/8.4/db para el motor y /var/postgres/8.4/data para los datos (Estas son mis configuraciones, puedes cambiarlas si no te gustan, pero recuerda que en el profile utilizo $LOGNAME para las instalaciones, en mi caso postgres)

# mkdir -p /u01/app/postgres/8.4/db
# chown -R postgres:postgres /u01/app/postgres
# chmod 750 /u01/app/postgres
# mkdir -p /var/postgres/8.4/data
# chown -R postgres:postgres /var/postgres
# chmod 750 /var/postgres
# mkdir -p /var/log/postgres
# chown -R postgres:postgres /var/log/postgres
Y Creamos en archivo .profile del usuario postgres

# su - postgres
$ vi $HOME/.profile

#!/bin/bash
#####################################
## POSTGRES PROFILE LIKE ORACLE ONE
#####################################

# Postgres Type(32bits/64bits)
POSTGRES_ARCH=64
POSTGRES_VERSION=8.4
POSTGRES_HOME=/u01/app/${LOGNAME}/${POSTGRES_VERSION}/db
export POSTGRES_HOME POSTGRES_VERSION

# Path
if [ $POSTGRES_ARCH -eq 32 ]; then
PATH=${POSTGRES_HOME}/bin:$PATH:/usr/sfw/bin:/usr/local/bin
else
PATH=${POSTGRES_HOME}/bin/64:${POSTGRES_HOME}/bin:$PATH:/usr/sfw/bin:/usr/local/bin
fi
export PATH

# PreLoad LD

# PGDATA
PGDATA_32=/var/postgres/${POSTGRES_VERSION}/data
PGDATA_64=/var/postgres/${POSTGRES_VERSION}/data

if [ $POSTGRES_ARCH -eq 32 ]; then
PGDATA=${PGDATA_32}
else
PGDATA=${PGDATA_64}
fi

export PGDATA

# Simple Log
banner postgres
echo ""
echo ""
echo "POSTGRES VERSION: ${POSTGRES_VERSION}"
echo "POSTGRES HOME : ${POSTGRES_HOME}"
echo "PGDATA : ${PGDATA}"
echo "PGARCH : ${POSTGRES_ARCH}"
echo ""
# Mail
MAIL=/usr/mail/${LOGNAME:?}

:wq
Instalación de Postgres
Podemos obtener los binarios compilados para Solaris en la página principal de Postgres http://www.postgresql.org/download/, yo voy a descargarlos para Solaris SPARC en 32 y 64bits.
# su - postgres
Sun Microsystems Inc. SunOS 5.10 Generic January 2005


POSTGRES VERSION: 8.4
POSTGRES HOME : /u01/app/postgres/8.4/db
PGDATA : /var/postgres/8.4/data
PGARCH : 64

$ mkdir postgres-bin
$ cd postgres-bin/
$ wget http://wwwmaster.postgresql.org/redir/376/h/binary/v8.4.1/solaris/solaris10/sparc/postgresql-8.4.1-S10.sparc-32.tar.bz2
$ wget http://wwwmaster.postgresql.org/redir/376/h/binary/v8.4.1/solaris/solaris10/sparc/postgresql-8.4.1-S10.sparc-64.tar.bz2
$ ls -ltr
total 35184
-rw-r--r-- 1 postgres postgres 8842332 sep 8 13:58 postgresql-8.4.1-S10.sparc-32.tar.bz2
-rw-r--r-- 1 postgres postgres 9149287 sep 8 13:58 postgresql-8.4.1-S10.sparc-64.tar.bz2
Descomprimimos los bz2 utilizando GNU tar (gtar) que se encuentra en /usr/sfw/bin, si no tenemos GNU tar, siempre podemos utilizar bunzip2 y tar
$ gtar jxpf postgresql-8.4.1-S10.sparc-32.tar.bz2
$ gtar jxpf postgresql-8.4.1-S10.sparc-64.tar.bz2
Movemos los binarios de postgres a nuestro POSTGRES_HOME

$ pwd
/export/home/postgres/postgres-bin/postgres/8.4-community
$ mv * /u01/app/postgres/8.4/db/
Recargamos nuestro profile y ya tenemos nuestra instalación concluida ... al menos el primer paso.

$ . ~/.profile


POSTGRES VERSION: 8.4
POSTGRES HOME : /u01/app/postgres/8.4/db
PGDATA : /var/postgres/8.4/data
PGARCH : 64

$ which psql
/u01/app/postgres/8.4/db/bin/64/psql
Inicio de PGDATA
Una vez instalado nuestro POSTGRES_HOME, debemos iniciar nuestro PGDATA para ello, vamos a utilizar initdb ubicado en /u01/app/postgres/8.4/db/bin/64/initdb
Este binario nos va a crear toda las estructura necesaria para postgres y los archivos de configuración. Debemos tener en cuenta que esta estructura ha de iniciarse en un encoding específico, aunque mi recomendación es que sea siempre UTF8, por ello, debemos tener las variables LC_xxxx en formato compatible con UTF8 y como yo tengo mi instalación de Solaris en es_ES.ISO8859-15 tengo que hacer un cambio a UTF8@euro, vamos a ver un ejemplo de cómo iniciar PGDATA en UTF8

Cambiamos nuestras variables de entorno para hacerlo compatible con UTF8
$ export LC_COLLATE=es_ES.UTF-8@euro
$ export LC_CTYPE=es_ES.UTF-8@euro
$ export LC_MESSAGES=es_ES.UTF-8@euro
$ export LC_MONETARY=es_ES.UTF-8@euro
$ export LC_NUMERIC=es_ES.UTF-8@euro
$ export LC_TIME=es_ES.UTF-8@euro
Llamamos a initdb con encoding utf8 (-E utf8) configuración regional por defecto (--locale es.UTF8) super-usuario postgres (-U postgres) y que me pida la contraseña para el superusuario (-W)
$ initdb -E utf8 --locale=es.UTF-8 -U postgres -W
Si todo ha ido correctamente, podemos comprobar que ha creado una estructura parecida a la siguiente:
$ ls -l $PGDATA
total 62
drwx------ 7 postgres postgres 512 jul 2 11:23 base
drwx------ 2 postgres postgres 1024 jul 22 12:06 global
drwx------ 2 postgres postgres 512 jul 6 18:50 pg_clog
-rw------- 1 postgres postgres 541 jul 2 09:32 pg_hba.conf
-rw------- 1 postgres postgres 1631 jul 2 09:32 pg_ident.conf
drwx------ 4 postgres postgres 512 jul 2 09:32 pg_multixact
drwx------ 2 postgres postgres 512 jul 22 12:06 pg_stat_tmp
drwx------ 2 postgres postgres 512 jul 6 18:50 pg_subtrans
drwx------ 2 postgres postgres 512 jul 2 09:32 pg_tblspc
drwx------ 2 postgres postgres 512 jul 2 09:32 pg_twophase
-rw------- 1 postgres postgres 4 jul 2 09:32 PG_VERSION
drwx------ 3 postgres postgres 1024 jul 11 19:33 pg_xlog
-rw------- 1 postgres postgres 16701 jul 6 18:28 postgresql.conf
-rw------- 1 postgres postgres 41 jul 22 09:15 postmaster.opts
Configuración de Postgres
Postgres tiene dos archivos de configuración principales, postgresql.conf y pg_hba.conf.

pg_hba.conf, En este archivo definiremos qué hosts tienen acceso a nuestro postgres y cuál será el método de acceso y autenticación, por ejemplo, para permitir el acceso del host 192.168.1.201 a todas las bases de datos incluiremos la siguiente entrada:
###################################
## CONNECT TO ALL DATABASE
###################################
host all all 192.168.1.201/32 md5
postgresql.conf, En este archivo se encuentra prácticamente la totalidad de parámetros de configuración de nuestro servidor, en esta primera parte vamos a modificar los siguientes parámetros, listen_address y vamos a poner
listen_addresses = '*'
De esta forma, postgres escuchará en todos los interfaces, permitiendo conectarnos remotamente (si no queremos que haga bind en todos, podemos poner la IP en la que queremos que escuche)

Iniciar/Detener Postgres
Para iniciar/detener/recargar utilizaremos el comando pg_ctl con las opciones start, stop y reload en función de lo que queramos hacer, por ejemplo:

Para iniciar nuestro postgres haremos lo siguiente, -l hace que el log se escriba en /var/log/postgres
$ pg_ctl start -l /var/log/postgres/postgres.log
servidor iniciándose
Para ver si nuestro postgres está vivo utilizaremos el comando pg_ctl con la opción status
$ pg_ctl status
pg_ctl: el servidor está en ejecución (PID: 19517)
/u01/app/postgres/8.4/db/bin/64/postgres
Para detener nuestro servidor, utilizaremos la opción stop, con el argumento -m fast para un apagado correcto

$ pg_ctl stop -m fast
esperando que el servidor se detenga..... listo
servidor detenido
Las diferentes opciones del apagado son:
  • smart, Salir después que todos los clientes se hayan desconectado
  • fast, Salir directamente, con apagado apropiado
  • immediate, Salir sin apagado completo; se ejecutará recuperación en el próximo inicio

Haciendo un poco de analogía de Oracle quedaría algo así:
  • Posgres: smart, Oracle: normal
  • Postgres: fast, Oracle: immediate
  • Postgres: immediate, Oracle: abort
Para volver a cargar la configuración, debemos hacer un HUP al proceso de postgres utilizando el comando pg_ctl y la opción reload
$ pg_ctl reload
Conectarnos al Servidor
Ya tenemos nuestro servidor funcionando y vamos a conectarnos a él utilizando psql

$ psql -U postgres
Contraseña para usuario postgres:
psql (8.4.1)
Digite «help» para obtener ayuda.

postgres=# help
Está usando psql, la interfaz de línea de órdenes de PostgreSQL.
Digite: \copyright para ver los términos de distribución
\h para ayuda de órdenes SQL
\? para ayuda de órdenes psql
\g o punto y coma («;») para ejecutar la consulta
\q para salir
postgres=# \q
Sistema de Backup
Para nuestro sistema de backup, postgres nos proporciona una utilidad llamada pg_dump que nos permite hacer un volcado de nuestra base de datos, por ejemplo, si queremos exportar la base de datos postgres al archivo postgres-FULL.dump
$ pg_dump -U postgres posgres > /u07/backups/postgres/8.4/postgres-FULL.dump
Contraseña:


 
Conclusión
Hemos visto cómo la instalación de postgres sobre Solaris no tiene mayor problema, y cómo utilizando los project podemos optimizar al máximo el rendimiento de nuestro servidor.

Aunque no hemos entrado mucho en las opciones de postgres y sus comandos, es debido a que en esta primera parte el objetivo era la instalación y su inicio/parada, en las próximas entregas veremos cómo hacer de postgres una gran base de datos de producción.

Además veremos cómo hacer que postgres vuele en nuestra máquina y cómo proteger postgres, hasta entonces ... nos toca espera.

Referencias

Cómo asociar un proceso a un procesador

Introducción
Si queremos hacer que un proceso se ejecute en un procesador únicamente utilizaremos el comando pbind. Esto nos permite hacer que diferentes procesos estén asociados a diferentes CPU y por lo tanto, no estén luchando por los recursos comunes.

Vamos a ver un ejemplo de cómo asociar el PID 2124 a la CPU 0, y luego la desasociamos.
# pbind -b 0 2124
process id 2124: was not bound, now 0
Para comprobar que procesos se encuentran asociados y a qué CPU, utilizaremos pbind sin argumentos
# pbind
process id 2124: 0
Si queremos eliminar la asociación, utilizaremos la opción -u PID
# pbind -u 2124
process id 2124: was 0, now not bound
Referencias

lunes, 5 de octubre de 2009

Cómo crear el Indice de la Ayuda (Manpages)

Introducción
Puede que necesitemos buscar ayuda utilizando una palabra, para ello, man nos ofrece la opción -k TEXTO para realizar una búsqueda en las páginas de ayuda. Sin embargo, si no tenemos creado el índice, man nos devolverá el siguiente error:
$ man -k LD
/usr/share/man/windex: No existe tal archivo o directorio
Para solucionarlo, simplemente crearemos el índice ejecutando catman como root
# catman
# man -k LD
Referencias

viernes, 2 de octubre de 2009

Cómo saber los Locales Instalados en Solaris

Introducción
En las instalaciones de Oracle, Oracle BI, es necesario tener varios locales instalados, pero para saber cuáles tenemos utilizaremos el comando locale con la opción -a
$ locale -a
C
POSIX
ca
ca_ES
ca_ES.ISO8859-1
ca_ES.ISO8859-15
ca_ES.ISO8859-15@euro
ca_ES.UTF-8
el
el.sun_eu_greek
el_CY.UTF-8
el_GR
el_GR.ISO8859-7
el_GR.ISO8859-7@euro
el_GR.UTF-8
en
en_CA
en_CA.ISO8859-1
en_CA.UTF-8
en_MT.UTF-8
en_US
en_US.ISO8859-1
en_US.ISO8859-15
en_US.ISO8859-15@euro
en_US.UTF-8
es
es.ISO8859-15
es.UTF-8
es_ES
es_ES.ISO8859-1
es_ES.ISO8859-15
es_ES.ISO8859-15@euro
es_ES.UTF-8
es_ES.UTF-8@euro
es_MX
es_MX.ISO8859-1
es_MX.UTF-8
fr
fr_CA
fr_CA.ISO8859-1
fr_CA.UTF-8
iso_8859_1
it.ISO8859-15
it.UTF-8
it_IT.ISO8859-15
it_IT.ISO8859-15@euro
it_IT.UTF-8
it_IT.UTF-8@euro
mt_MT.UTF-8
pt
pt.ISO8859-15
pt_PT
pt_PT.ISO8859-1
pt_PT.ISO8859-15
pt_PT.ISO8859-15@euro
pt_PT.UTF-8
Referencias

jueves, 1 de octubre de 2009

Instalar MemCached en Solaris 10 64bits

AVISO ABR.2010: He detectado que "en ciertas arquitecturas" el proceso de MemCached sobre 64bis, no responde correctamente cuando se compila con GCC, por ello, os recomiendo inicialmente Instalar y Configurar MemCache(32bits) en Solaris 10


Introducción
MemCached es una caché distribuida de alto rendimiento cuyo principal uso es la aceleración de páginas web mediante cacheo en memoria de las SQL. De esta forma, evitamos tener que llamar a la base de datos.

Aunque pueda parecer una tontería no lo es ya que una cache bien implementada es muy eficiente, más que la de la base de datos. Si, es cierto, bien implementada, pero esto es un tema de programación y nosotros nos vamos a centrar en cómo instalarlo sobre Solaris 10 en 64bits.

Por que en 64bits?
Simple, de esta forma podemos tener un tamaño de caché superior a 4Gb. En la actualidad ya no es raro encontrar máquinas con 8,16,32Gb de RAM ( y de ahí en adelante), por ello, vamos a instalarlo en 64bits.

Nota: Si lo que queremos es que sea de 32bits, simplemente no deberemos exportar el flag de gcc -m64 y las bibliotecas serán /usr/lib y no /usr/lib/64


Compilación de LibEvent en 64bits
La compilación de LibEvent no tiene mucha complicación, simplemente utilizaremos el flag -m64 de gcc para hacerlo de 64bits y --prefix para situarlo en la ubicación /opt/memcached
$ export CFLAGS=-m64
$ export CXXFLAGS=-m64
$ ./configure --enable-static --prefix=/opt/memcached/libevent/64
$ make
# make install

Comprobación de la instalación
Si la instalación ha concluido sin errores, ahora tendremos instalado nuestro libevent en /opt/memcached/libevent/64, sin embargo, tenemos que indicarle dónde se encuentran las bibliotecas de acceso correcto para gcc (si no lo tenemos asignado ya), por ejemplo, si no tenemos asignado nuestro LD64, nos encontraremos con el siguiente error,
$ ldd libevent.so
libnsl.so.1 => /lib/64/libnsl.so.1
librt.so.1 => /lib/64/librt.so.1
libresolv.so.2 => /lib/64/libresolv.so.2
libsocket.so.1 => /lib/64/libsocket.so.1
libc.so.1 => /lib/64/libc.so.1
libgcc_s.so.1 => /usr/sfw/lib/libgcc_s.so.1 - clase ELF incorrecta: ELFCLASS32
libmp.so.2 => /lib/64/libmp.so.2
libmd.so.1 => /lib/64/libmd.so.1
libscf.so.1 => /lib/64/libscf.so.1
libaio.so.1 => /lib/64/libaio.so.1
libdoor.so.1 => /lib/64/libdoor.so.1
libuutil.so.1 => /lib/64/libuutil.so.1
libgen.so.1 => /lib/64/libgen.so.1
libm.so.2 => /lib/64/libm.so.2
/platform/SUNW,Sun-Fire-280R/lib/sparcv9/libc_psr.so.1
/platform/SUNW,Sun-Fire-280R/lib/sparcv9/libmd_psr.so.1
Esto es debido a que está intentando enalzarse con la versión de 32bits de libgcc y nuestro binario es de 64bits, así que, simplemente, la indicaremos que no busque ahí, sino en /usr/sfw/lib/64
$ export LD_LIBRARY_PATH_64=/opt/memcached/libevent/64/lib:/usr/sfw/lib/64
$ pwd
/opt/memcached/libevent/64/lib
$ ldd libevent.so
libnsl.so.1 => /lib/64/libnsl.so.1
librt.so.1 => /lib/64/librt.so.1
libresolv.so.2 => /lib/64/libresolv.so.2
libsocket.so.1 => /lib/64/libsocket.so.1
libc.so.1 => /lib/64/libc.so.1
libgcc_s.so.1 => /usr/sfw/lib/64/libgcc_s.so.1
libmp.so.2 => /lib/64/libmp.so.2
libmd.so.1 => /lib/64/libmd.so.1
libscf.so.1 => /lib/64/libscf.so.1
libaio.so.1 => /lib/64/libaio.so.1
libdoor.so.1 => /lib/64/libdoor.so.1
libuutil.so.1 => /lib/64/libuutil.so.1
libgen.so.1 => /lib/64/libgen.so.1
libm.so.2 => /lib/64/libm.so.2
/platform/SUNW,Sun-Fire-280R/lib/sparcv9/libc_psr.so.1
/platform/SUNW,Sun-Fire-280R/lib/sparcv9/libmd_psr.so.1
Aunque ld buscará en LD_LIBRARY_PATH las bibliotecas de 64 o 32 (en función de lo que necesite) es más correcto poner las bibliotecas de 32bits en LD_LIBRARY_PATH y las de 64bits en LD_LIBRARY_PATH_64

Compilación de MemCache en 64bits
En memcached no es necesario exportar los CFLAGS ya que se puede configurar utilizando --enable-64bit, además utilizaremos --with-libevent para indicarle dónde tenemos instalado nuestro LibEvent
$ ./configure --enable-64bit --with-libevent=/opt/memcached/libevent/64 --prefix=/opt/memcached
$ make
# make install

Comprobación de la instalación
Al igual que hemos hecho antes, comprobaremos que todas las dependencias se encuentran. Si faltase alguna, entonces tendríamos que exportar correctamente nuestro LD_LIBRARY_PATH_64
$ pwd
/opt/memcached/bin
$ ldd memcached
libumem.so.1 => /lib/64/libumem.so.1
libnsl.so.1 => /lib/64/libnsl.so.1
libsocket.so.1 => /lib/64/libsocket.so.1
libevent-1.4.so.2 => /opt/memcached/libevent/64/lib/libevent-1.4.so.2
libc.so.1 => /lib/64/libc.so.1
libmp.so.2 => /lib/64/libmp.so.2
libmd.so.1 => /lib/64/libmd.so.1
libscf.so.1 => /lib/64/libscf.so.1
librt.so.1 => /lib/64/librt.so.1
libresolv.so.2 => /lib/64/libresolv.so.2
libgcc_s.so.1 => /usr/sfw/lib/64/libgcc_s.so.1
libdoor.so.1 => /lib/64/libdoor.so.1
libuutil.so.1 => /lib/64/libuutil.so.1
libgen.so.1 => /lib/64/libgen.so.1
libaio.so.1 => /lib/64/libaio.so.1
libm.so.2 => /lib/64/libm.so.2
/platform/SUNW,Sun-Fire-280R/lib/sparcv9/libc_psr.so.1
/platform/SUNW,Sun-Fire-280R/lib/sparcv9/libmd_psr.so.1
Un pequeño Tuning: Uso de libumem
Como podéis ver, yo tengo una biblioteca llamada libumem que, según man es "una biblioteca rápida, escalable para la caché de objetos en memoria con soporte para multithread", entonces, si estoy ejecutando memcached y a la vez libumem qué pasa? Libumem es una versión mejorada de malloc, calloc, alloc con funcionalidades de debug y memory leaks, además está demostrado que es mucho más eficiente así que por qué no usarla.

Para que libumem se precarge simplemente deberemos establecer las variables de entorno LD_PRELOAD_32 y LD_PRELOAD_64 con las ubicaciones de libumem.
$ echo $LD_PRELOAD_32
/usr/lib/libumem.so.1:/usr/lib/extendedFILE.so.1:
$ echo $LD_PRELOAD_64
/usr/lib/sparcv9/libumem.so.1:
Si queremos que las configuraciones de LD_PRELOAD_32/64 y LD_LIBRARY_PATH se cargen por defecto a todos los usuarios (aunque no es muy recomendable) podemos incluirlo en /etc/profile
$ vi /etc/profile
LD_PRELOAD_32=/usr/lib/libumem.so.1:/usr/lib/extendedFILE.so.1:$LD_PRELOAD_32
LD_PRELOAD_64=/usr/lib/sparcv9/libumem.so.1:$LD_PRELOAD_64

:wq
Nota: Esto tiene "algún" problema con Oracle 9i

Puedes obtener más información desde el man de LibUmem
$ man libumem
Iniciar MemCached
La ejecución de memcached no es muy diferente a cualquier otro binario, sin embargo, los parámetros son muy numerosos, por ello, es necesario entender qué hace cada uno. Para ello, puedes ejecutar memcached con la opción -h que muestra la ayuda

Por ejemplo, si queremos que tenga 256 Mb de caché y un máximo de 2048 conexiones con 4 threads, ejecutaremos

$ ./memcached -m 256 -c 2048 -L -t 4
^CSIGINT handled.
Para detener el proceso, pulsamos Ctrl+C y saldrá.

Conclusiones
Hemos visto cómo podemos instalar sin mayores problemas memcached en 64bits sobre Solaris, ejecutarlo y tenerlo ahí a la espera, sin embargo, nuestro siguiente paso debe ser integrarlo con SMF para poder gestionarlo de igual forma que otros servicios.

Aunque no he podido preparar la configuración del archivo manifiest de memcached, espero que alguien se anime a crearlo y compartirlo con todos, no?

Nota sobre versiones instaladas
Alguna vez me he econtrado con problemas al compilar en los diferentes Solaris, esto es debido a que gmake suele ser una version antigua y tiende a fallar. Por eso, os pongo las versiones con las que suelo compilar las herramientas para los post
$ which make
/usr/local/bin/make
$ which gcc
/usr/sfw/bin/gcc
$ make -v
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for sparc-sun-solaris2.10
$ gcc -v
Reading specs from /usr/sfw/lib/gcc/sparc-sun-solaris2.10/3.4.3/specs
Configured with: /sfw10/builds/build/sfw10-patch/usr/src/cmd/gcc/gcc-3.4.3/configure --prefix=/usr/sfw --with-as=/usr/ccs/bin/as --without-gnu-as --with-ld=/usr/ccs/bin/ld --without-gnu-ld --enable-languages=c,c++ --enable-shared
Thread model: posix
gcc version 3.4.3 (csl-sol210-3_4-branch+sol_rpath)

Referencias