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