martes 23 de junio de 2009

Arreglando el error: ORA-27102: out ot memory en Oracle y Solaris 10

Al cambiar los archivos de una base de datos Oracle en un servidor con Solaris 9 a uno con Solaris 10 y querer levantarla me encontré con el siguiente error
SQL> startup
ORA-27102: out of memory
SVR4 Error: 22: Invalid argument




según el mensaje de error el servidor no tiene memoria suficiente, veamos que dice la documentación al respecto
$ oerr ORA 27102
27102, 00000, "out of memory"
// *Cause: Out of memory
// *Action: Consult the trace file for details

nada alentador el panorama. Revisemos lo último que se registró en el archivo alert.log
$ cat alert.log
Fri Jun 5 18:19:45 2009
Starting ORACLE instance (normal)
Fri Jun 5 18:19:46 2009
WARNING: EINVAL creating segment of size 0x000000008c400000
fix shm parameters in /etc/system or equivalent

Oracle está tratando de crear un segmento de memoria compartida de 2G (dependiendo del tamaño de SGA/PGA), pero el sistema operativo respondió con un mensaje de error de argumento no válido (EINVAL). Se muestra además una pequeña pista sobre configurar los parámetros shm en /etc/system.

Antes de Solaris 10, se configuraba el parámetro shmsys:shminfo_shmmax en /etc/system con el tamaño máximo de segmento de memoria que puede crearse. El valor por default en Solaris 9 y versiones anteriores es de 8M; mientras que en Solaris 10 o superior es 1/4 de la memoria física. Lo puedes verificar de la siguiente manera:
$ prtconf | grep Mem
Memory size: 2048 Megabytes
$ id -p
uid=110(oracle) gid=201(dba) projid=3(default)
$ prctl -n project.max-shm-memory -i project 3
project: 3: default
NAME    PRIVILEGE       VALUE    FLAG   ACTION                       RECIPIENT
project.max-shm-memory
        privileged      479M        -   deny                                 -
        system          16.0EB    max   deny                                 -

He ahí el problema, el sistema está usando el valor por default de 479M para este caso, cuando Oracle está tratando de crear un segmento de memoria (2G) mayor a 479M.

La solución es configurar el sistema con un tamaño suficientemente grande para que el segmento de memoria compartida sea creado y Oracle pueda levantar la instancia.

En Solaris 9 y versiones anteriores, esto puede hacerse agregando la siguiente línea en /etc/system, teniendo que reiniciar el sistema para que tome el nuevo valor.
set shminfo_shmmax = 0x000000008c400000

En Solaris 10 el parámetro shminfo_shmmax es obsoleto y Sun no recomienda configurarlo en /etc/system aún a pesar de que funcione como se espera.

En Solaris 10 y posterior, este valor puede cambiarse dinámicamente por proyecto con la ayuda de los servicios de control de recursos. Así es como se hace en Solaris 10 y posterior
$ prctl -n project.max-shm-memory -r -v 2G -i project 3
$ prctl -n project.max-shm-memory -i project 3
NAME    PRIVILEGE       VALUE    FLAG   ACTION                       RECIPIENT
project.max-shm-memory
        privileged      2.0G        -   deny                                 -
        system          16.0EB    max   deny                                 -

Todos los cambios hechos con el comando prctl se aplican al sistema de manera temporal por lo que se perderán cuando se reinicie. Para hacerlo permanente, crea un proyecto con el comando projadd
$ projadd -p 200 -c 'Oracle config' -U oracle -G dba -K 'project.max-shm-memory=(privileged,2G,deny)' oracle

Finalmente cerciórate que fue creado con el comando projects -l ó cat /etc/project
$ projects -l
...
...
oracle
        projid : 200
        comment: "Oracle config"
        users  : oracle
        groups : dba
        attribs: project.max-shm-memory=(priv,2147483648,deny)
$ cat /etc/project
...
...
oracle:200:Oracle config:oracle:dba:project.max-shm-memory=(priv,2147483648,deny)

Con estos cambios, Oracle debería arrancar la base de datos de manera normal.
SQL> startup
ORACLE instance started.

Total System Global Area 2333054160 bytes
Fixed Size                   734416 bytes
Variable Size            1191182336 bytes
Database Buffers         1073741824 bytes
Redo Buffers               67395584 bytes
Database mounted.
Database opened.

Otro caso que puede presentar el mismo síntoma es cuando aumentas la SGA en la instancia resultado posiblemente de un tuning el cual si es mayor al segmento de memoria configurada para el sistema, cuando intentes levantar la instancia tendrá este mismo comportamiento.

Vía
Mandalika's scratchpad


Continuar leyendo...

lunes 22 de junio de 2009

Autenticación por base de datos en Apache 2.2.x usando mod_dbd, mod_authn_dbd y mod_auth_user en Windows 2003 Server

En un post anterior, explico cómo configurar el acceso a un directorio usando la utilería htpasswd el cual funciona para pocos usuarios ya que debe hacerse manualmente por cada uno. La autenticación por base de datos ofrece una configuación más flexible, menos laboriosa e ideal para ambientes donde la cantidad de usuarios es elevada.

Para este ejercicio usaré una base de datos Oracle 11g(11.1.0.7.0) el cual está soportado de acuerdo con la documentación de Apache que viene en el archivo [APACHE_HOME]\README-win32.txt. Es necesario tener instalado el cliente de Oracle y configurar adecuadamente una cadena de conexión(tnsnames) como la de la siguiente imagen


abre una sesión de sqlplus
C:\>sqlplus sys as sysdba

SQL*Plus: Release 11.1.0.7.0 - Production on Sun Jun 21 23:17:37 2009

Copyright (c) 1982, 2008, Oracle. All rights reserved.

Enter password:

Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL>

crea un usuario
SQL> create user apache identified by test account unlock;

User created

asígnale los correspondientes privilegios
SQL> grant create session to apache;

Grant succeeded.

SQL> grant resource to apache;

Grant succeeded.

conéctate con el usuario apache, crea la tabla e inserta un registro que servirá para las pruebas de conexión
SQL> conn apache/test
Connected.
SQL> create table users (
2 username varchar2(10 byte),
3 passwd varchar2(10 byte)
4 );

Table created.

SQL> insert into users(username, passwd) values ('sergio', 'test');

1 row created.

SQL> commit;

Commit complete.

Actualiza tu archivo de configuración de Apache [APACHE_HOME]\conf\httpd.conf para activar las siguientes líneas
LoadModule authn_dbd_module modules/mod_authn_dbd.so
LoadModule dbd_module modules/mod_dbd.so

y al final agrega lo siguiente. No olvides crear el directorio C:\Apache22\htdocs\private
# mod_dbd configuration
DBDriver oracle
DBDParams "host=testserver port=1521 user=apache pass=test dbname=testdb"

DBDMin 4
DBDKeep 8
DBDMax 20
DBDExptime 300

<Directory "C:/Apache22/htdocs/private">
# core authentication and mod_auth_basic configuration
# for mod_authn_dbd
AuthType Basic
AuthName "Private directory"
AuthBasicProvider dbd

# core authorization configuration
Require valid-user

# mod_authn_dbd SQL query to authenticate a user
AuthDBDUserPWQuery "SELECT passwd FROM users WHERE username = %s"
</Directory>

Levanta Apache, pero hazlo desde línea de comandos ya que si lo haces desde la consola no apreciarías algún mensaje de error que pudiera ocurrir.
C:\Apache22\bin>httpd -k start

si no se muestra ningún mensaje de error no está de más revisar el archivo [APACHE_HOME]\logs\error.log

Y finalmente hacer la prueba de conexión desde un navegador




Resolviendo problemas
P: Aparece el siguiente mensaje cuando trato de levantar Apache:
C:\Apache22\bin>httpd -k start
Syntax error on line 485 of C:/Apache22/conf/httpd.conf:
Invalid command 'DBDriver', perhaps misspelled or defined by a module not included in the server configuration

R: No has activado en tu archivo [APACHE_HOME]\conf\httpd.conf la línea
LoadModule dbd_module modules/mod_dbd.so


P: Aparece el siguiente mensaje cuando trato de levantar Apache:
C:\Apache22\bin>httpd -k start
Syntax error on line 498 of C:/Apache22/conf/httpd.conf:
Unknown Authn provider: dbd

R: No has activado en tu archivo [APACHE_HOME]\conf\httpd.conf la línea
LoadModule authn_dbd_module modules/mod_authn_dbd.so


P: Ya levantó Apache pero no se conecta con la base de datos, reviso el archivo [APACHE_HOME]\logs\error.log y aparece el siguiente error
(20014)Internal error: DBD: Can't connect to oracle
(20014)Internal error: DBD: failed to initialise

R: El mensaje de error es genérico y sólo te informa lo que sucedió sin ninguna pista de la causa, es aquí donde donde debes revisar lo que hiciste desde el principio para determinar qué sucede y cómo solucionarlo.
  1. Revisa el archivo [APACHE_HOME]\README-win32.txt y verifica que la versión del motor de base de datos que estás usando está soportada por la versión de Apache que instalaste.
  2. Revisa que los parámetros en DBDParams estén correctos. A este respecto, la documentación de Apache no es la correcta en cuanto a los de Oracle ya que especifica

    Oracle
    user, pass, dbname, server
    sin embargo, especificamente "server" no lo reconoce como válido y por lo tanto es necesario usar "host" y "port" en su lugar.


P: El navegador me pide el usuario y la contraseña pero después de escribirlos me aparece el mensaje de error "Internal Server Error"

R: Revisa tu archivo [APACHE_HOME]\logs\error.log en busca de detalles específicos. Te puedes encontrar, por ejemplo, con que el query que especificaste en el parámetro AuthDBDUserPWQuery no está correcto
(20014)Internal error: DBD: failed to prepare SQL statements: ORA-00904: "USER_NAME": invalid identifier
(20014)Internal error: DBD: failed to initialise


Referencia
http://httpd.apache.org/docs/2.2/mod/mod_authn_dbd.html

Continuar leyendo...

lunes 15 de junio de 2009

Instalando SSH en Windows 2003 Server

SSH o Secure Shell, es un protocolo de red que permite el intercambio de información usando un canal seguro entre el cliente y el servidor. SSH se usa comunmente para accesar de manera remota y ejecutar comandos, sin embargo, permite también crear túneles, rutear puertos TCP y conexiones X11, además de poder transferir archivos usando los protocolos SFTP y SCP. Usado principalmente en sistemas Unix y Linux, SSH fue diseñado como reemplazo de Telnet y otros shells remotos no confiables los cuales transfieren información -como contraseñas- en texto plano pudiendo ser interceptados por una tercera persona.

Aquí trataré de explicar como instalar este servicio en Windows 2003 Server usando Cygwin y OpenSSH.

Primero, te descargas el instalador de Cygwin:


lo ejecutas y sigues el asistente para descargar OpenSSH junto con las utilerías necesarias, ajustando por supuesto los parámetros que consideres necesario













Edita el archivo c:\cygwin\Cygwin.bat y añade lo siguiente


Abre una sesión de Cygwin -doble click al ícono creado en tu escritorio de Windows- ó desde una sesión de línea de comandos de Windows (cmd) ejecuta el archivo c:\cygwin\Cygwin.bat


ejecuta el siguiente comando para cambiar el prefijo de montaje de "/cygdrive" a "/". Cierras esta sesión y abres una nueva para resetear la variable de ambiente PATH.
$ mount -s --change-cygdrive-prefix /

crea el archivo de usuarios
$ mkpasswd -l > /etc/passwd

el archivo de grupos
$ mkgroup -l > /etc/group

asigna privilegio de lectura sobre ambos
$ chmod +r /etc/passwd
$ chmod +r /etc/group

asigna los siguientes privilegios sobre el directorio /var
$ chmod 755 /var

si no existe el directorio /home es recomendable que lo crees ya que ahí se guardarán los archivos de los usuarios, la ubicación por default es el directorio "Documents and Settings". Al crear el directorio /home usando la opción -p hará que cuando se cree un usuario su directorio de trabajo estará dentro del directorio c:\cygwin.
$ mkdir -p /home
$ mkdir /home/Administrator
$ cd

Hasta aquí tienes configurado tu ambiente, lo siguiente es instalar el servicio de ssh ejecutando el comando ssh-host-config el cual genera los archivos llave de ssh del host dentro de /etc. Nota que se crean dos usuarios, uno llamado sshd para manejar la separación de privilegios y otro llamado sshd_server requerido por Windows 2003 para correr el servicio y proveer de autenticación por llave pública. Tu salida debe ser algo parecida a esta
$ ssh-host-config
*** Info: Generating /etc/ssh_host_key
*** Info: Generating /etc/ssh_host_rsa_key
*** Info: Generating /etc/ssh_host_dsa_key
*** Info: Creating default /etc/ssh_config file
*** Info: Creating default /etc/sshd_config file
*** Info: Privilege separation is set to yes by default since OpenSSH 3.3.
*** Info: However, this requires a non-privileged account called 'sshd'.
*** Info: For more info on privilege separation read /usr/share/doc/openssh/README.privsep.
*** Query: Should privilege separation be used? (yes/no) yes
*** Info: Note that creating a new user requires that the current account have
*** Info: Administrator privileges. Should this script attempt to create a
*** Query: new local account 'sshd'? (yes/no) yes
*** Info: Updating /etc/sshd_config file


*** Warning: The following functions require administrator privileges!

*** Query: Do you want to install sshd as a service?
*** Query: (Say "no" if it is already installed as a service) (yes/no) yes
*** Info: Note that the CYGWIN variable must contain at least "ntsec"
*** Info: for sshd to be able to change user context without password.
*** Query: Enter the value of CYGWIN for the daemon: [ntsec] ntsec
*** Info: On Windows Server 2003, Windows Vista, and above, the
*** Info: SYSTEM account cannot setuid to other users -- a capability
*** Info: sshd requires. You need to have or to create a privileged
*** Info: account. This script will help you do so.

*** Info: You appear to be running Windows 2003 Server or later. On 2003
*** Info: and later systems, it's not possible to use the LocalSystem
*** Info: account for services that can change the user id without an
*** Info: explicit password (such as passwordless logins [e.g. public key
*** Info: authentication] via sshd).

*** Info: If you want to enable that functionality, it's required to create
*** Info: a new account with special privileges (unless a similar account
*** Info: already exists). This account is then used to run these special
*** Info: servers.

*** Info: Note that creating a new user requires that the current account
*** Info: have Administrator privileges itself.

*** Info: No privileged account could be found.

*** Info: This script plans to use 'cyg_server'.
*** Info: 'cyg_server' will only be used by registered services.
*** Query: Do you want to use a different name? (yes/no) yes
*** Query: Enter the new user name: sshd_server
*** Query: Reenter: sshd_server

*** Query: Create new privileged user account 'sshd_server'? (yes/no) yes
*** Info: Please enter a password for new user sshd_server. Please be sure
*** Info: that this password matches the password rules given on your system.
*** Info: Entering no password will exit the configuration.
*** Query: Please enter the password:
*** Query: Reenter:

*** Info: User 'sshd_server' has been created with password 'welcome'.
*** Info: If you change the password, please remember also to change the
*** Info: password for the installed services which use (or will soon use)
*** Info: the 'sshd_server' account.

*** Info: Also keep in mind that the user 'sshd_server' needs read permissions
*** Info: on all users' relevant files for the services running as 'sshd_server'
.
*** Info: In particular, for the sshd server all users' .ssh/authorized_keys
*** Info: files must have appropriate permissions to allow public key
*** Info: authentication. (Re-)running ssh-user-config for each user will set
*** Info: these permissions corrently. [Similary restrictions apply, for
*** Info: instance, for .rhosts files if the rshd server is running, etc].


*** Info: The sshd service has been installed under the 'sshd_server'
*** Info: account. To start the service now, call `net start sshd' or
*** Info: `cygrunsrv -S sshd'. Otherwise, it will start automatically
*** Info: after the next reboot.

*** Info: Host configuration finished. Have fun!

para levantarlo desde línea de comando ejecutas
$ net start sshd

ó
$ cygrunsrv -S sshd

o desde "Control Panel -> Administrative Tools -> Services" el servicio llamado "CYGWIN sshd".

Nunca está de más una prueba antes de avisar que ya lo configuraste. La salida debería parecerse a la siguiente:
$ ssh -v localhost
OpenSSH_5.1p1, OpenSSL 0.9.8k 25 Mar 2009
debug1: Reading configuration data /etc/ssh_config
debug1: Connecting to localhost [127.0.0.1] port 22.
debug1: Connection established.
debug1: identity file /home/Administrator/.ssh/identity type -1
debug1: identity file /home/Administrator/.ssh/id_rsa type -1
debug1: identity file /home/Administrator/.ssh/id_dsa type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.1
debug1: match: OpenSSH_5.1 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.1
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-cbc hmac-md5 none
debug1: kex: client->server aes128-cbc hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192)
Warning: Permanently added 'localhost' (RSA) to the list of known hosts.
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,password,keyboard-interacti
ve
debug1: Next authentication method: publickey
debug1: Trying private key: /home/Administrator/.ssh/identity
debug1: Trying private key: /home/Administrator/.ssh/id_rsa
debug1: Trying private key: /home/Administrator/.ssh/id_dsa
debug1: Next authentication method: keyboard-interactive
debug1: Authentications that can continue: publickey,password,keyboard-interacti
ve
debug1: Next authentication method: password
Administrator@localhost's password:
debug1: Authentication succeeded (password).
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.

Administrator@testserver ~
$


Fuente
http://ist.uwaterloo.ca/~kscully/CygwinSSHD_W2K3.html

Fuente con tips de solución a problemas en XP
http://pigtail.net/LRP/printsrv/cygwin-sshd.html

Continuar leyendo...

viernes 12 de junio de 2009

Sobre binarios de Apache 1.3.x

Los binarios aquí presentados son para fines educativos, de ninguna manera deben ser usados en servidores productivos. Se ofrecen COMO SON. El administrador no se responsabiliza por ningún daño que pueda causar en tu máquina el uso de este software el cual ha sido probado antes de estar disponible para su descarga.

Apache_1.3.41-mod_ssl_2.8.31-OpenSSL_0.9.8k-Win32.zip

Apache_1.3.41-mod_ssl_2.8.31-OpenSSL_0.9.8j-Win32.zip

Última actualización: 12-Jun-2009

Continuar leyendo...