viernes, 16 de agosto de 2013

Instalando Oracle 11g Release 2 bajo FreeBSD 9

English version: Install Oracle 11g Release 2 on FreeBSD 9

Continuamos dotando de funcionalidad a nuestra Jaula Debian GNU/Linux recién instalada. Para ello me he decidido por instalar Oracle 11gR2 para Linux, por tratarse de uno de los paquetes de software mas exigentes que se pueden encontrar; me parece que es una buena  forma de explorar los limites de la solución propuesta.

Otra motivación es el hecho de que en el Manual de FreeBSD el capítulo dedicado a la instalación de Oracle se refiere a la versión Oracle 8.0.5, que es bastante antigua, y esta circunstancia estimuló mi curiosidad.

Esta plataforma no resulta idónea para un entorno de producción ya que no está certificada por Oracle, lo cual no le resta utilidad como entorno de pruebas e incluso entorno de desarrollo para pequeños proyectos; depende de la aventurado que sea uno.

Las ventajas de emplear FreeBSD como infraestructura para entornos virtualizados son:
  1. Sistema de Ficheros ZFS.
  2. Pila de TCP/IP virtual.
  3. Seguridad de red con pf.
  4. Análisis de rendimiento con Dtrace.

Las ventajas de emplear Debian GNU/Linux dentro de una Jaula son:
  1. Debian GNU es una de las distribuciones Linux mas fiables y con un ciclo de lanzamiento de versiones muy previsible. 
  2. Utilizar una distribución completa nos ahorra bastante trabajo a la hora de instalar Oracle.
  3. Disponer de documentación técnica actualizada.
Como no soy partidario de instalar entornos gráficos en los servidores, especialmente si tienen que dar soporte a un motor de bases de datos tan pesado como lo es Oracle, voy a realizar una instalación en modo texto, empleado un fichero de respuestas para el instalador de Oracle.


Tareas previas a la instalación de Oracle

En todas las instalaciones de la base de datos Oracle hay que preparar el S.O para que se puede instalar y ejecutar correctamente. Estas tareas previas son específicas de cada S.O y la versión de Oracle.

Tareas específicas en FreeBSD

Las siguientes tareas se deben ejecutar como root:

1.-  Clonamos la Jaula deb-master previamente definida, utilizando la versión Lenny, para crear la Jaula debora:
root@morsa:/root # zfs clone fbsdzpool1/jailz/deb-master@deboostrap fbsdzpool1/jailz/debora
2.- Configuramos semáforos, memoria compartida y E/S asíncrona conforme a los requerimientos de Oracle 11gR2, para ello editamos /boot/loader.conf y /etc/sysctl.conf.

// Comienza  el fragmento de /boot/loader.conf
kern.ipc.shmmni=4096
kern.ipc.semmns=32000
kern.ipc.semmni=128
aio_load="YES"
// Fin del fragmento de /boot/loader.conf
 
// Comienza  el fragmento de /etc/sysctl.conf
security.jail.sysvipc_allowed=1
kern.ipc.shmall=2097152
kern.ipc.shmseg=128
kern.ipc.shmmin=1
kern.ipc.shmmax=1073741824
kern.ipc.semaem=16384
kern.ipc.semvmx=32767
kern.ipc.semusz=632
kern.ipc.semume=50
kern.ipc.semopm=100
kern.ipc.semmsl=340
kern.ipc.semmnu=150
// Fin del fragmento de /etc/sysctl.conf

3.- Habilitamos la memoria compartida en la Jaula debora.
// Comienza fragmento de /jailz/etc/jail.conf
debora {
  path = /jailz/debora;
  allow.mount;
  allow.sysvipc;
  host.hostname = debora;
  mount.devfs;
  mount.fstab="/jailz/etc/fstab.debora";
  ip4.addr = 127.0.0.25;
  interface = lo0;
  exec.start = "/etc/init.d/rc 3";
  exec.stop = "/etc/init.d/rc 0";
}
// Fin del fragmento de /jailz/etc/jail.conf


4.- Iniciamos la jaula y nos conectamos a ella.
root@morsa:/root # jail -f /jailz/etc/jail.conf -c debora
debora: created
Starting periodic command scheduler: crond.
root@morsa:/root # jls
   JID  IP Address      Hostname                      Path
     1  127.0.0.25      debora                        /jailz/debora
root@morsa:/root # jexec 1 /bin/bash
debora:/# uname -a
Linux debora 2.6.16 FreeBSD 9.1-RELEASE-p4 #0: Mon Jun 17 11:42:37 UTC 2013 i686
 GNU/Linux

Tareas específicas en Debian

Los siguientes pasos se ejecutan dentro de la Jaula debora como usuario root:

5 .- Instalamos los paquetes requeridos para Oracle 11gR2 en Debian:
debora:/# apt-get install gcc make binutils lesstif2 rpm libaio1 libdb4.6 libstdc++5 unzip openjdk-6-jdk
Nota: El paquete openjdk-6-jdk se instala para disponer un entorno jre alternativo al proporcionado por el instalador de Oracle.

6.- Creamos los siguientes enlaces simbólicos:
debora:/# ln -s /usr/bin/awk /bin/awk
debora:/# ln -s /usr/bin/rpm /bin/rpm
debora:/# ln -s /usr/bin/basename /bin/basename
7.- Creamos los grupos y usuarios dba, oinstall y oracle.
debora:/# groupadd oinstall -g 1000
debora:/# groupadd dba -g 1001
debora:/# useradd -m -g oinstall -G dba -p passwd -s /bin/bash -d /home/oracle -u 1000 oracle
debora:/# passwd oracle
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
8.- Creamos los directorios para el sofware y la base de datos y les asignamos como propietario el usuario oracle.
debora:/# mkdir -p /oracle/product/11.2.0
debora:/# mkdir -p /oracle/admin/ORATEST/create
debora:/# mkdir /oracle/admin/ORATEST/adump
debora:/# mkdir /oracle/admin/ORATEST/logbook
debora:/# mkdir /oracle/oraInventory
debora:/# mkdir /oracle/oradata
debora:/# mkdir /oracle/flash_recovery_area

debora:/# chown  oracle.oinstall /oracle
debora:/# chown -R oracle.oinstall /oracle/product
debora:/# chown oracle.oinstall /oracle/oraInventory
debora:/# chown -R oracle.dba /oracle/admin
debora:/# chown oracle.dba /oracle/oradata
debora:/# chown oracle.dba  /oracle/flash_recovery_area
9.- Añadimos el nombre de host al fichero /etc/hosts.
debora:/# echo '127.0.0.25 debora' >> /etc/hosts
10.-  Creamos el archivo /etc/oraInst.loc y le asignamos como propietario al usuario oracle:

 // Comienza /etc/oraInst.loc
inventory_loc=/oracle/oraInventory
inst_group=oinstall
 // Fin de  /etc/oraInst.loc

debora:/# chown oracle.oinstall /etc/oraInst.loc


Instalación del Software de Oracle

Los siguientes pasos se ejecutan dentro de la Jaula debora bajo el usuario oracle:

11.- Cambiamos el usuario root a oracle. 
debora:/# su - oracle
oracle@debora:~$ id
uid=1000(oracle) gid=1000(oinstall) groups=1000(oinstall),1001(dba)
oracle@debora:~$
12.- Copiamos al directorio /oracle (por ejemplo) los ficheros linux_11gR2_database_1of2.zip y linux_11gR2_database_2of2.zip que contienen el instalador y los descomprimimos:
oracle@debora:/oracle $ unzip linux_11gR2_database_1of2.zip
oracle@debora:/oracle $ unzip linux_11gR2_database_2of2.zip 
13.- Para realizar la instalación desatendida creamos el fichero de respuestas /oracle/database/response/install_debora.rsp. Están marcados en negrita los valores que puede resultar útil modificar, el resto del fichero debe dejarse inalterado, pues esta versión del instalador es problemática y este es el formato que debe mantener el fichero de respuestas.

// Comienza el fichero install_debora.rsp
oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v11_2_0
oracle.install.option=INSTALL_DB_SWONLY
ORACLE_HOSTNAME=debora
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/oracle/oraInventory
SELECTED_LANGUAGES=en
ORACLE_HOME=/oracle/product/11.2.0
ORACLE_BASE=/oracle
oracle.install.db.InstallEdition=SE
oracle.install.db.isCustomInstall=false
oracle.install.db.customComponents=
oracle.install.db.DBA_GROUP=dba
oracle.install.db.OPER_GROUP=dba
oracle.install.db.CLUSTER_NODES=
oracle.install.db.config.starterdb.type=GENERAL_PURPOSE
oracle.install.db.config.starterdb.globalDBName=
oracle.install.db.config.starterdb.SID=
oracle.install.db.config.starterdb.characterSet=AL32UTF8
oracle.install.db.config.starterdb.memoryOption=false
oracle.install.db.config.starterdb.memoryLimit=
oracle.install.db.config.starterdb.installExampleSchemas=false
oracle.install.db.config.starterdb.enableSecuritySettings=true
oracle.install.db.config.starterdb.password.ALL=
oracle.install.db.config.starterdb.password.SYS=
oracle.install.db.config.starterdb.password.SYSTEM=
oracle.install.db.config.starterdb.password.SYSMAN=
oracle.install.db.config.starterdb.password.DBSNMP=
oracle.install.db.config.starterdb.control=DB_CONTROL
oracle.install.db.config.starterdb.gridcontrol.gridControlServiceURL=
oracle.install.db.config.starterdb.dbcontrol.enableEmailNotification=false
oracle.install.db.config.starterdb.dbcontrol.emailAddress=
oracle.install.db.config.starterdb.dbcontrol.SMTPServer=
oracle.install.db.config.starterdb.automatedBackup.enable=false
oracle.install.db.config.starterdb.automatedBackup.osuid=
oracle.install.db.config.starterdb.automatedBackup.ospwd=
oracle.install.db.config.starterdb.storageType=
oracle.install.db.config.starterdb.fileSystemStorage.dataLocation=
oracle.install.db.config.starterdb.fileSystemStorage.recoveryLocation=
oracle.install.db.config.asm.diskGroup=
oracle.install.db.config.asm.ASMSNMPPassword=
MYORACLESUPPORT_USERNAME=username@mailaddress.com
MYORACLESUPPORT_PASSWORD=
SECURITY_UPDATES_VIA_MYORACLESUPPORT=false
DECLINE_SECURITY_UPDATES=true
PROXY_HOST=
PROXY_PORT=
PROXY_USER=
PROXY_PWD=
// Fin del fichero install_debora.rsp

14.- Ejecutamos  el instalador con las opciones indicadas tal y como están:
oracle@debora:~$ /oracle/database/runInstaller -silent  -ignorePrereq -jreloc /usr/lib/jvm/java-6-openjdk -responseFile /oracle/database/response/install_debora.rsp
Starting Oracle Universal Installer...

Checking Temp space: must be greater than 80 MB.   Actual -2147483648 MB    Passed
Checking swap space: must be greater than 150 MB.   Actual 4096 MB    Passed
Preparing to launch Oracle Universal Installer from /tmp/OraInstall2013-09-01_08-30-45PM. Please wait ...
[WARNING] [INS-32055] The Central Inventory is located in the Oracle base.
   CAUSE: The Central Inventory is located in the Oracle base.
   ACTION: Oracle recommends placing this Central Inventory in a location outside the Oracle base directory.
[WARNING] [INS-32055] The Central Inventory is located in the Oracle base.
   CAUSE: The Central Inventory is located in the Oracle base.
   ACTION: Oracle recommends placing this Central Inventory in a location outside the Oracle base directory.
You can find the log of this install session at:
 /oracle/oraInventory/logs/installActions2013-09-01_08-30-45PM.log
 
The following configuration scripts need to be executed as the "root" user.
 #!/bin/sh
 #Root scripts to run

/oracle/oraInventory/orainstRoot.sh
/oracle/product/11.2.0/root.sh
To execute the configuration scripts:
         1. Open a terminal window
         2. Log in as "root"
         3. Run the scripts
         4. Return to this window and hit "Enter" key to continue

Successfully Setup Software.
15.- Revisamos los logs del instalador.
debora:~# tail -10 /oracle/oraInventory/logs/installActions2013-09-01_08-30-45PM.log
INFO: Validating state <finish>
WARNING: Validation disabled for the state finish
INFO: Completed validating state <finish>
INFO: Terminating all background operations
INFO: Terminated all background operations
INFO: Successfully executed the flow in SILENT mode
INFO: Finding the most appropriate exit status for the current application
INFO: Exit Status is 0
INFO: Shutdown Oracle Database 11g Release 2 Installer
INFO: Unloading Setup Driver
16.- Si la instalación ha sido correcta, ejecutamos como usuario root los scripts orainstRoot.sh y root.sh :
oracle@debora:~$ logout
debora:~# id
uid=0(root) gid=0(root) groups=5(tty)
debora:~# /oracle/oraInventory/orainstRoot.sh
Changing permissions of /oracle/oraInventory.
Adding read,write permissions for group.
Removing read,write,execute permissions for world.

Changing groupname of /oracle/oraInventory to oinstall.
The execution of the script is complete.

debora:~# /oracle/product/11.2.0/root.sh
Check /oracle/product/11.2.0/install/root_debora_2013-09-01_20-39-01.log for the
 output of root script

debora:~# more /oracle/product/11.2.0/install/root_debora_2013-09-01_20-39-01.log

Running Oracle 11g root.sh script...

The following environment variables are set as:
    ORACLE_OWNER= oracle
    ORACLE_HOME=  /oracle/product/11.2.0

Creating /etc/oratab file...
Entries will be added to the /etc/oratab file as needed by Database Configuration Assistant when a database is created
Finished running generic part of root.sh script.
Now product-specific root actions will be performed.
Finished product-specific root actions.

Creación de una base de datos de Pruebas

Antes de crear una base de datos necesitamos  un fichero de parámetros init.ora y un script con los comandos SQL que ejecutan la creación de la base de datos.


17.- Creamos el fichero /oracle/admin/ORATEST/create/initORATEST.ora:

// Comienza el fichero initORATEST.ora
db_name='ORATEST'
db_domain=''
sga_target=512M
sga_max_size=1G
pga_aggregate_target=1G
processes = 150
audit_trail ='db'
db_block_size=8192
db_recovery_file_dest='/oracle/flash_recovery_area'
db_recovery_file_dest_size=2G
diagnostic_dest='/oracle/'
#dispatchers='(PROTOCOL=TCP) (SERVICE=ORCLXDB)'
open_cursors=300
remote_login_passwordfile='EXCLUSIVE'
undo_tablespace='UNDOTBS1'
compatible ='11.2.0'
db_create_file_dest='/oracle/oradata'
filesystemio_options = SETALL
disk_asynch_io = TRUE
// Fin del fichero initORATEST.ora

18.- Creamos los ficheros /oracle/admin/ORATEST/create/ORATEST.sh y /oracle/admin/ORATEST/create/cr_ORATEST.sh:
// Comienza el fichero ORATEST.sh
ORACLE_HOME=/oracle/product/11.2.0
ORACLE_SID=ORATEST

NLS_LANG=American_america.WE8ISO8859P15
ORA_NLS11=${ORACLE_HOME}/nls/data
PATH=$PATH:$ORACLE_HOME/bin
export PATH
export ORACLE_BASE
export ORACLE_HOME
export ORACLE_SID
export NLS_LANG
export ORA_NLS33

// Fin del fichero ORATEST.sh

// Comienza el fichero cr_ORATEST.sh
#!/bin/bash

. ./ORATEST.sh

rm ${ORACLE_HOME}/dbs/orapw${ORACLE_SID}
orapwd file=${ORACLE_HOME}/dbs/orapw${ORACLE_SID} password=diablo entries=2

rm -r /oracle/oradata/${ORACLE_SID}

sqlplus /nolog << EOF
spool ../logbook/cr_${ORACLE_SID}.log
conn / as sysdba;
CREATE SPFILE
FROM   PFILE='/oracle/admin/${ORACLE_SID}/create/init${ORACLE_SID}.ora';

DISCONNECT;

conn / as sysdba;

STARTUP NOMOUNT;
CREATE DATABASE ${ORACLE_SID}
CHARACTER SET WE8ISO8859P15
NATIONAL CHARACTER SET UTF8
USER SYS IDENTIFIED BY diablo
USER SYSTEM IDENTIFIED BY diablo
EXTENT MANAGEMENT LOCAL
DEFAULT TEMPORARY TABLESPACE temp
UNDO TABLESPACE undotbs1
DEFAULT TABLESPACE users;

@?/rdbms/admin/catalog.sql
@?/rdbms/admin/catproc.sql
@?/sqlplus/admin/pupbld.sql

SHUTDOWN IMMEDIATE;

EXIT
spool off

EOF

// Fin del fichero cr_ORATEST.sh

19.- Concedemos a los scripts los permisos de ejecución:

oracle@debora:/oracle/admin/ORATEST/create$ chmod 750 *.sh
oracle@debora:/oracle/admin/ORATEST/create$ ls -la
total 31
drwxr-xr-x 2 oracle dba   5 Sep  1 21:04 .
drwxr-xr-x 5 oracle dba   5 Sep  1 20:11 ..
-rwxr-x--- 1 oracle dba 258 Sep  1 21:02 ORATEST.sh
-rwxr-x--- 1 oracle dba 782 Sep  1 21:04 cr_ORATEST.sh
-rw-r--r-- 1 oracle dba 490 Sep  1 21:01 initORATEST.ora
20.- Iniciamos la creación de la base de datos:
oracle@debora:/oracle/admin/ORATEST/create$ nohup ./cr_ORATEST.sh &
21.- Comprobamos que la creación de la base de datos a concluido correctamente:
oracle@debora:/oracle/admin/ORATEST/create$ tail -10 nohup.out
SQL> CREATE PUBLIC SYNONYM PRODUCT_USER_PROFILE FOR SYSTEM.PRODUCT_PRIVS;

Synonym created.

SQL>
SQL> -- End of pupbld.sql
SQL> SQL> Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> SQL> Disconnected from Oracle Database 11g Release 11.2.0.1.0 - Production

22.- Arrancamos la base de datos y nos conectamos.
oracle@debora:/oracle/admin/ORATEST/create$  . ./ORATEST.sh
oracle@debora:/oracle/admin/ORATEST/create$ sqlplus /nolog

SQL*Plus: Release 11.2.0.1.0 Production on Sun Sep 1 22:09:58 2013

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

SQL>  conn / as sysdba;
Connected to an idle instance.

SQL> startup;
ORACLE instance started.

Total System Global Area 1071333376 bytes
Fixed Size                  1341312 bytes
Variable Size             750782592 bytes
Database Buffers          314572800 bytes
Redo Buffers                4636672 bytes
Database mounted.
Database opened.
SQL>
SQL> select * from v$instance;

INSTANCE_NUMBER INSTANCE_NAME
--------------- ----------------
HOST_NAME
----------------------------------------------------------------
VERSION           STARTUP_T STATUS       PAR    THREAD# ARCHIVE LOG_SWITCH_WAIT
----------------- --------- ------------ --- ---------- ------- ---------------
LOGINS     SHU DATABASE_STATUS   INSTANCE_ROLE      ACTIVE_ST BLO
---------- --- ----------------- ------------------ --------- ---
              1 ORATEST
debora
11.2.0.1.0        01-SEP-13 OPEN         NO           1 STOPPED
ALLOWED    NO  ACTIVE            PRIMARY_INSTANCE   NORMAL    NO


SQL> !uname -a
Linux debora 2.6.16 FreeBSD 9.1-RELEASE-p4 #0: Mon Jun 17 11:42:37 UTC 2013 i686
 GNU/Linux

SQL>


Conseguido.

Oracle 11gR2 ejecutándose en FreeBSD 9

23.- Paramos la base de datos ORATEST.
SQL> SHUTDOWN IMMEDIATE;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> SQL> Disconnected from Oracle Database 11g Release 11.2.0.1.0 - Production
24.- Paramos la jaula debora.
root@morsa:/root # jail -f /jailz/etc/jail.conf -r debora
Using makefile-style concurrent boot in runlevel 0.
Stopping device state change daemon: devd.
Asking all remaining processes to terminate...done.
All processes ended within 1 seconds....done.
Stopping enhanced syslogd: rsyslogd.
/etc/init.d/umountnfs.sh: 106: cannot open /etc/mtab: No such file
Deconfiguring network interfaces...done.
Cleaning up ifupdown....done.
Deactivating swap...done.
mount: /: unknown special file or file system
Will now halt.
ifdown: shutdown usbus0: Operation not permitted
ifdown: shutdown ath0: Operation not permitted
ifdown: shutdown usbus1: Operation not permitted
ifdown: shutdown lo0: Operation not permitted
ifdown: shutdown wlan0: Operation not permitted
startpar: service(s) returned failure: umountnfs.sh ... failed!
deb-master: removed
23.- Hacemos un snapshot de la jaula debora para así disponer de una plantilla de una jaula configurada para bases de datos Oracle.

root@morsa:/root # zfs snapshot fbsdzpool1/jailz/debora@oracle11gR2

 

Consideraciones finales

La decisión de instalar en la Jaula la versión Lenny de Debian GNU/Linux está motivada por dos razones; por una parte, la versión de kernel de Linux que requiere el instalador de Oracle como requisito previo es la 2.6.9 y por otro lado la versión de kernel mínima para squeeze es la 2.6.18, que es superior a la admitida por el módulo de compatibilidad para Linux de FreeBSD 9.

// Comienza el fragmento de installActions.log
INFO: *********************************************
INFO: OS Kernel Version: This is a prerequisite condition to test whether the system kernel version is at least "2.6.9".
INFO: Severity:CRITICAL
INFO: OverallStatus:SUCCESSFUL
INFO: -----------------------------------------------
INFO: Verification Result for Node:debora
INFO: Expected Value:2.6.9
INFO: Actual Value:2.6.16
INFO: -----------------------------------------------
INFO: *********************************************
// Fin del fragmento de installActions.log 

Durante el desarrollo de este Post, detecté un problema durante la ejecución del Instalador de Oracle, que de forma aleatoria fallaba en en arranque inicial. Una manera de evitar este problema consiste en utilizar un jre alternativo al suministrado con el instalador.

No he podido configurar la gestión automática de memoria (AMM) que es una de la nuevas características introducidas en la versión 11g. Esto es así por que no he conseguido configurar el dispositivo /dev/shm dentro de la Jaula.

En consecuencia, no queda mas remedio que emplear la gestión automática de memoria compartida (ASMM) dando valores a los parámetros SGA_TARGET y SGA_MAX_SIZE en el fichero initORATEST.ora.

El sistema de ficheros ZFS sobre el que se ha creado la base de datos no está optimizado para los ficheros de la base de datos, es un aspecto que debe mejorarse para un uso más intenso de la base de datos.

No hay comentarios:

Publicar un comentario en la entrada

Vuestros comentarios son bien recibidos, os animo a contribuir proponiendo temas que os interesen para desarrollar en este blog.