10 dic 2009

Por que los Archived logs estan tambien en mi Flash recovery area !!!

En este post dejo el problema que nació cuando el alertlog marcaba lo siguiente:
>Sun Dec  6 22:21:51 2009
Errors in file $ORACLE_BASE/admin/SID/bdump/SID_arc0_21083.trc:
ORA-19815: Message 19815 not found; No message file for product=RDBMS, facility=ORA; arguments: [db_recovery_file_dest_size] [2147483648] [100.00] [0]
Sun Dec  6 22:21:51 2009
************************************************************************
You have following choices to free up space from flash recovery area:
1. Consider changing RMAN RETENTION POLICY. If you are using Data Guard,
   then consider changing RMAN ARCHIVELOG DELETION POLICY.
2. Back up files to tertiary device such as tape using RMAN
   BACKUP RECOVERY AREA command.
3. Add disk space and increase db_recovery_file_dest_size parameter to
   reflect the new space.
4. Delete unnecessary files using RMAN DELETE command. If an operating
   system command was used to delete files, then use RMAN CROSSCHECK and
   DELETE EXPIRED commands.
************************************************************************
Sun Dec  6 22:21:51 2009
Errors in file /u01/app/oracle/admin/rpi10g2/bdump/SID_arc0_21083.trc:
ORA-19809: Message 19809 not found; No message file for product=RDBMS, facility=ORA
ORA-19804: Message 19804 not found; No message file for product=RDBMS, facility=ORA; arguments: [43593728] [2147483648]
ARC0: Error 19809 Creating archive log file to '$ORACLE_BASE/flash_recovery_area/SID/archivelog/2009_12_06/o1_mf_1_482_0_.arc'
Investigando un poco me encontré que el área de flash_recovery estaba llena por lo que decidi agrandarla pasa solucionar el problema momentaneamente.
SQL> alter system set DB_RECOVERY_FILE_DEST_SIZE= 3000M;
Al no haber setado ninguna politica de RMAN debia encontrar a que se debia esto
SQL> select * from V$FLASH_RECOVERY_AREA_USAGE;



FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
------------ ------------------ ------------------------- ---------------
CONTROLFILE 0 0 0
ONLINELOG 0 0 0
ARCHIVELOG 60.16 0 62
BACKUPPIECE 0 0 0
IMAGECOPY 0 0 0
FLASHBACKLOG 0 0 0


Efectivamente RMAN estaba backpeando los arclogs. Esto se refleja en LOG_ARCHIVE_DEST_10.

select dest_name,destination from V$ARCHIVE_DEST
where status ='VALID'

LOG_ARCHIVE_DEST_1 $ORACLE_BASE/backup/arc
LOG_ARCHIVE_DEST_10 USE_DB_RECOVERY_FILE_DEST
Para resolver esta situación solo hay que setear lo siguiente:

SQL> alter system set log_archive_dest_10='' scope=spfile;

Como el alcance es el spfile debemos reiniciar la base para que tome el cambio. Una vez reiniciada veremos que el  log_archive_dest_10 es vacio y que los arclog se guardan en la unibicacion que seteamos en el  log_archive_dest. 
Esto no es todo, ¿ como libero el area de flash_recovery que ya ha sido utilizada?
Pues asi:

#>rman target sys/password@SID

RMAN> delete noprompt archivelog all;

Si hemos borrado archivos desde el sistema operativo de la area flash_recovery RMAN nos avisara que no puede borrar estos ya que no existe. Para sincronizar lo que hay en el filesystem con RMAN procedemos asi:
RMAN> crosscheck archivelog all;

Una vez realizado este paso vemos los resultados:

SQL> select * from V$FLASH_RECOVERY_AREA_USAGE;

FILE_TYPE    PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
------------ ------------------ ------------------------- ---------------
CONTROLFILE
     0
0
0
ONLINELOG      0 0
0
ARCHIVELOG
     0
0
0
BACKUPPIECE      0 0
0
IMAGECOPY
     0
0
0
FLASHBACKLOG
     0
0
0

6 rows selected.
Y listo problema resuelto.






Referencias:


Oracle Comunidad Hispana

Archived Redo Log Creation in the Flash Recovery Area































5 dic 2009

EM database console not start

Acabo de trasladar una base de datos de un server virtual (Vmware) a uno fisico, por el problema de hora que comentaba mi post anterior. Como siempre, estas cosas son a las apuradas, por lo que solo instale el motor base de datos Oracle10g con todas las opciones necesarias y me traje todos los datafiles , controfiles, arclogs de la otra base. Si, a lo mejor no es el mejor método perooo funciona, copy y paste a full. La base funciona de maravillas pero, siempre hay peros, me olvide de cambiar el hostname del serve. Cuando corrijo el mismo y quiero iniciar el DBControl (EM) me figura lo siguiente.

[oracle@servidor]$ emctl start dbconsole

TZ set to Chile/Continental
OC4J Configuration issue. $ORACLE_HOME/oc4j/j2ee/OC4J_DBConsole_servidor_10g2 not found.

La solución es simple debemos reconstruir el repositorio para el nuevo hostname, para lo cual de antemano deberemos saber las password de los usuarios SYS,SYSMAN y DBSNMP. Con esos datos hacemos:

[oracle@servidor]$ emca -config dbcontrol db -repos recreate

Vamos contestando las preguntas que nos va suministrando y esperamos un par de minutitos y nuestro repositorio se vuelve a crear para el nuevo hostname.

Espero que sirva.

20 nov 2009

Linux NTP Server + SO Time Zone + Oracle Time Zone.

Tengo el siguiente dilema

Tengo un servidor Linux con DB Oracle 10g en el cual la fecha y hora son extremadamente criticas. Debido a algunas inconsistencias ( entre el soft de virtualización, la bios virtual y el server virtual) he decidido conectarlo a un NTP server de internet. Otro factor que afecta, es el cambio horario de forma no uniforme en distintas regiones de Argentina.

La pregunta es:

¿ Existe un método para cambiar el time zone del sistema operativo mediante NTP ?
¿ Como afecta el cambio de time zone del sistema operativo a Oracle ?

Después de investigar un rato encuentro este FAQ el cual explica que el protocolo NTP es independiente de la zona horaria (time zone); brinda siempre la hora en UTC/GTM +00:00. Por lo que la hora del equipo depende no solamente del servicio NTP sino tambien del time zone que le setemos al equipo. Decido a comprobar esto armo mi propio servidor NTP.

 #>apt-get install ntpd ntpdate

El archivo de configuracion del servicio esta en /etc/ntp.conf y queda asi

#> vi /etc/ntp.conf


# /etc/ntp.conf, configuration for ntpd; see ntp.conf(5) for help

driftfile /var/lib/ntp/ntp.drift


# Enable this if you want statistics to be logged.
statsdir /var/log/ntpstats/

statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable


# You do need to talk to an NTP server or two (or three).
#server ntp.ubuntu.com
server time.sinectis.com.ar iburst
server tock.nap.com.ar iburst
server 0.ar.pool.ntp.org iburst
server 1.south-america.pool.ntp.org iburst
server 0.south-america.pool.ntp.org iburst

Un articulo muy lindo de como configurar esto, esta en este link, aqui obvie las configuraciones de seguridad. Los pools en mi caso Argentina los saque de aqui y de aquí, esto es por que la selección del servidor a utilizar por NTP viene dada por varios factores entre ellos la distancia. Reiniciamos el daemon para actualizar las configuraciones:

#>/etc/init.d/ntp restart

Luego chequeamos si nuestro servidor esta sincronizando con los que les detallamos en su configuración:

#> ntpq -np

     remote              refid                  st t when poll reach   delay   offset  jitter
==========   ===============================
+216.244.192.3   62.117.76.142    2  u  167  512  377   26.525   33.572   2.619
-200.10.140.1       192.5.41.41        2   u  122  512  377   26.534   44.511  45.921
-200.63.112.9       192.43.244.18    2 u  655  512  376   44.753   48.853  55.039
*187.49.33.13       200.20.186.75   2 u  162  512  377  326.558   35.854   4.766
+190.202.98.221  150.214.94.5     2 u  145  512  377  241.681   33.767  11.175
 192.168.65.255   .BCST.               16 u    -   64    0    0.000    0.000   0.002

Aqui solamente destaco, que el asterisco (*) indica el servidor al cual estamos sincronizando y con signo más (+) los servidores candidatos a sincronizar en caso del que el preferido falle.
Otras opciones interesantes para debugear en ntpq son:



ntpq> as

ind assID status  conf reach auth condition  last_event cnt
====================================
  1 57640  9144   yes   yes  none falsetick   reachable  4
  2 57641  9444   yes   yes  none  candidat   reachable  4
  3 57642  9444   yes   yes  none  candidat   reachable  4
  4 57643  8053   yes   yes  none    reject  lost reach  5
  5 57644  9644   yes   yes  none  sys.peer   reachable  4
  6 57645  9344   yes   yes  none   outlyer   reachable  4
  7 57646  8000   yes   yes  none    reject

ntpq> rv
assID=0 status=06f4 leap_none, sync_ntp, 15 events, event_peer/strat_chg,
version="ntpd 4.2.4p4@1.1520-o Wed May 13 21:05:42 UTC 2009 (1)",
processor="i686", system="Linux/2.6.28-16-generic", leap=00, stratum=3,
precision=-19, rootdelay=351.872, rootdispersion=56.283, peer=57644,
refid=187.49.33.13,
reftime=ceb188e9.25b15a51  Sat, Nov 21 2009  2:00:17.147, poll=10,
clock=ceb18b4f.39f3287e  Sat, Nov 21 2009  2:10:31.226, state=4,
offset=-4.565, frequency=9.125, jitter=4.385, noise=16.777,
stability=0.047, tai=0

ntpq> pe
     remote           refid      st t when poll reach   delay   offset  jitter
========================================
 xtime.windows.co 0.0.0.0          2 u  593 1024  377    0.530  32852.8   0.073
+ns2.sinectis.co 62.117.76.142    2 u  105 1024  277   26.006   -4.959   4.634
+200.10.140.1.ad 192.5.41.41      2 u  576 1024  377   26.477    0.399   6.288
 willie.norfe.ne 192.43.244.18    2 u 104m  512    0   44.753   48.853   0.000
*srv6.spbrasil.c 200.20.186.75    2 u  615 1024  377  329.167   -3.810   3.481
-190.202.98.221  150.214.94.5     2 u  599 1024  377  246.638  -18.083  25.978
 192.168.65.255  .BCST.          16 u    -   64    0    0.000    0.000   0.002

Bueno mi servidor NTP ya esta sincronizado y es stratum=3. Para demostrar que NTP solo provee UTC/GTM 00:00 sincronizo un cliente windows 2003 a este y cambio el time zone de mi server de -03:00 a -04:30. Y efectivamente mi server marca la 1am mientras que el cliente Windows dependiente de mi server NTP se mantiene en la misma hora, mas alla de haberse sincronizado manualmente y automáticamente. Lo que concluye que NTP brinda siempre la hora en UTC 00:00, independiente de donde estemos geográficamente, por lo que no es posible setear el time zone del sistema operativo mediante opciones o comandos del protocolo NTP. En este punto me doy cuenta que tendre que configurar en los cambios de horario invierno-verano la posición geográfica ( UTC/GTM) de cada uno de los servidores. Aunque lei que existe la opcion DTS para manejar las zonas horarias, la cual no me da mucha confianza ya que puede implicar cambios automaticos de time zone, pero la siguere analizando.


9 nov 2009

Integrando Apache2 + mod_jk + Tomcat Parte II

De mi entra anterior Integrando Apache2 + mod_jk + Tomcat me han surgido algunos inconvenientes que resolvere en este post. Además de aprovechar a plantear el ambiente y la necesidad que me lleva a realizar esta tarea.

Actualmente utilizo apache2 para el alojamiento de sitios con php, pero ha surgido el requerimiento de servir paginas jsp en el mismo server. Las antiguas paginas que contiene apache, en php deben seguir funcionando, como asi también los nuevos sitios jsp.

Siguiendo el post de instalacion de tomcat el cual fue bello, rápido, practico y demasiado automático se me crearon dos directorios para la administración de tomcat.

#ls -l /usr/share/tomcat5.5
    /usr/share/tomcat5.5/webapps2 --> /var/lib/tomcat5.5/

#ls -l /usr/share/tomcat5.5-webapps
    /usr/share/tomcat5.5-webapps/ROOT
    /usr/share/tomcat5.5-webapps/manager

Leyendo el archivo de configuración /etc/default/tomcat5  y de inicio /etc/init.d/tomcat podemos tener una buena vision sobre la instalación. Aunque la descompresion de archivos war se almacera en /var/lib/tomcat5.5/ en vez de /usr/share/tomcat5.5-webapps, cosa que no sucede  con los sites por default que estan en este ultimo directorio. Cosa que leyendo los scripts no pude descifrar (a lo mejor alguien pueda comentarlo), por lo opte por la desinstalación completa de tomcat 5.

# apt-get remove --purge tomcat5.5 tomcat5.5-admin tomcat5.5-webapps

 La instalacion de tomcat desde los binarios es muy sencilla, descargamos el archivo *.tar.gz desde tomcat, comprobamos que se haya descargado correctamente utilizando los hash md5 o gpg. Yo en mi caso los descomprimi en /usr/local/src

#tar xzvf apache-tomcat-6.0.20.tar.gz -C /usr/local/src
#ln -s /usr/local/src/apache-tomcat-6.0.20 /usr/local/apache-tomcat
Agregar las variables de entorno necesarias para la ejecucion de tomcat
JAVA_HOME = Directorio donde se encuentra la instalacion de java
CATALINA_HOME= Directorio donde se encuentra la instalación de tomcat

Una vez seteadas estas variables procedemos a inciar tomcat
#/usr/local/apache-tomcat/bin/start.sh
Chequeamos en el browser la pagina de inicio de tomcat, ingresando la dirección:
http://localhost:8080 ó http://localhost:8010

Instalamos el modulo libapache2-mod-jk
#apt-get install libapache2-mod-jk
Copiamos el archivo de ejemplo en mod-aviables
#cp /usr/share/doc/libapache2-mod-jk/httpd_example_apache2.conf /etc/apache2/mods-available/mod_jk.conf; cd /etc/apache2; ln -s mods-available/jk.conf mods-enabled/jk.conf; /etc/init.d/apache2 restart

Configuramos los worker's a los valores de las variables previamente configuradas.
#>vi /etc/libapache2-mod-jk/workers.properties

workers.tomcat_home=/usr/local/apache-tomcat #$CATALINA_HOME
workers.java_home=/usr/lib/jvm/java-6-sun #$JAVA_HOME
worker.list=ajp13_worker # El nombre de/los workes que utilizaremos.
worker.ajp13_worker.port=8009 # Puerto de comunicación apache - tomcat
worker.ajp13_worker.host=localhost #host
worker.ajp13_worker.type=ajp13 # Protocolo de comunicación

Configuramos el modulo de apache jk.conf. Aqui no hay demasiado de tocar, solamente el nivel de alerta y que directorio de $CATALINA_HOME/webapps sera mapeado de apache a tomcat.

#>vi /etc/apache2/mods-available/jk.conf

# Cambio a debug para chequear el funcionamiento lugo paso a error. Esto es
# debido que si los sitios que poseemos (en apache) generan demasiado trafico
#corremos el riesgo de que los logs nos llenen el disco/particion.
JkLogLevel      debug

#Aqui esta el quid de la cuestion, estas directivas le diran a apache que
#directorios seran mapeados a tomcat a traves del worker, en este caso
#ajp13_worker, usando el protocolo ajp3. Debido a un par de ensayos opte por deshabilitar esta opcion en este archivo y setearla en el virtualhost dentro de los sitios de apache, lo cual le ha dado mayor claridad al seteo de JkMount.

# send all requests ending in .jsp to ajp13_worker
#JkMount /*.jsp ajp13_worker
#JkMount /* ajp13_worker
#send all requests ending /servlet to ajp13_worker
#JkMount /*/servlet/ ajp13_worker

Con todo esto ya estoy en condiciones de volver a la configuración del post anterior, donde agregaba un virtualhost a apache para que fuese mapeado a tomcat. Obvio que tiene modificaciones tambien.

#>vi /etc/apache2/site-aviable/prueba

VirtualHost IP:80>


# No es necesario, JkMount determina el mapeo a $CATALINA_HOME/webapps
# y la expresion que le pasemos a JkMount
#DocumentRoot /usr/share/tomcat5.5/webapps 

ServerAdmin admin@midominio.com
ServerName  prueba.localdomain

#Los paths dentro de $CATALINA_HOME/webapps que serán manejados por el 
#protocolo ajp3.
JkMount /prueba/servlet/* ajp13_worker
JkMount /prueba/*.jsp ajp13_worker


/VirtualHost>

#> a2ensite prueba
#> /etc/init.d/apache2 restart

Y listo tenemos un nuevo sitio que servira paginas jsp en el mismo puerto que apache y el resto de los sitios.

Cabe destacar que se han obviado configuraciones de seguridad sobre tomcat, las cuales serán un próximo tema a tratar.

4 nov 2009

Integrando Apache2 + mod_jk + Tomcat

En este articulo voy a intentar un quick howto, de como configurar nuestro servidor web (Apache2) para que no solo atienda paginas html o php sino que tambien paginas JSP. Gracias a la modularidad de apache contamos con el modulo mod_jk, utilizare este, ya que es el proyecto con mayor actividad según dicen por ahi.
La idea es que apache pueda enviar las peticiones de paginas jsp  a un tomcat para que este ultimo las procese. Esta comunicacion entre apache y tomcat se logra a traves del modulo jk.

Lo necesario para instalar y configurar a secas apache2+mod_jk+tomcat esta en  esta pagina, bello, rapido y practico.  Con esto funcionando llaga la hora de decirle a apache que las paginas .jsp estan en $CATALINA_HOME/webapps y que utlice el worker ajp3_worker (worker.properties) para pasarle el trabajo a tomcat. Esto se logra mediante la utilizacion de virtualhosts dentro de apache (/etc/apache2/site-aviables/xxx) con el parametro jkMount como se muestra en el siguiente ejemplo:


<>
DocumentRoot /usr/share/tomcat5.5/webapps #El $catalina_home/webaaps
ServerAdmin admin@midominio.com
ServerName  asensos.localdomain
JkMount /*/servlet/* ajp13_worker #las llamadas que seran delegadas al protocolo ajp3

<>

Hasta el momento las pruebas han funcionado a la perfección, llamo tanto a paginas estáticas como a paginas jsp, todo desde el puerto 80 donde corre apache.

Fuentes:

28 sept 2009

Oracle Offline backup.

Estoy seguro que debe de haber muchos scripts en la web para hacer backup de base de datos, en frió. Pero decidí hacer el mio que dejo aquí.


#!/bin/bash
# Developer: Alejandro Andino
#+-----------------------------+
#| Backup en frio de DataFiles |
#+-----------------------------+


export ORACLE_SID="test"
export ORACLE_BASE="/u01/app/oracle"
export ORACLE_HOME="/u01/app/oracle/product/10.2.0/test"
export NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252
export NLS_DATE_FORMAT="DD-MON-YYYY HH24:MI:SS"
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export SQLPATH=/u01/app/oracle/product/10.2.0/test/sqlplus/admin
backup="/u01/app/oracle/backup/datafiles"
arc="/u01/app/oracle/backup/arc"
fecha=`date +"%d%m%y_%H%M"`
sequence=`sqlplus -s system/xxx @lastArcLog.sql|tr -d "[:blank:]"`
seq=$(($sequence-1))

#+-----------------+
#| FUNCTIONS |
#+-----------------+

#Function DEL_OldLogs: Borrar arc log archivados sin uso.
#Variables externas/globales: sequence, seq,arc

function DEL_OldLogs(){
list=`ls $arc | gawk -F "_" -v sq=$seq -v path=$arc '{ if($2 < sq) print path"/"$1"_"$2"_"$3 }'` for i in $list do if [ -f $i ]; then rm -f $i fi done }

# Se me ocurrio pensar que sucedería si se me rompe el disco que justamente guarda los backup. Asi que guardamos el backup en un almacenamiento
#externo también, con esta función.

function New_Backup(){
        rm -f $backup/*.tar.gz
        #Copy datafiles and archivelogs to backup.
        tar -czvf $backup/$file $ORACLE_BASE/oradata/db10g2 $arc &>/dev/null
        chmod +rw $backup/$file
#       Almecenando backup a ubicacion remota.
        smbclient //STORAGE/backup "" --user=backup%password --workgroup=dominio -c "lcd ${backup};cd Backup_DATA;put ${file};exit"

}


#+------------------------+
#| BEGIN SCRIPT |
#+------------------------+

sqlplus -s '/as sysdba' <<"EOF"
archive log all; --> produce ORA-00271: there are no logs that need archiving
ALTER SYSTEM ARCHIVE LOG CURRENT; --> Forzar el archivado de redologs.
shutdown immediate
exit
EOF
#Copiar datafiles y archivelogs al directorio backup .
tar -czvf $backup/DATAfiles$fecha.tar.gz $ORACLE_BASE/oradata/test $arc
 New_Backup #Reemplaza y mejora la funcionalidad de las lineas anteriores ;-)
#Ejecutamos la función.
DEL_OldLogs
#Levantamos la base de datos.
sqlplus -s '/as sysdba'<<"EOF"
startup
exit
EOF
#+------+
#| FIN |
#+------+

Por ultimo el pequeño script que uso para ver la ultima secuencia procesada por el proceso ARCx.

lastArcLog.sql

set echo off
set heading off
set flush off
set pause off
set feedback off
set pages 0
select MAX(sequence#) from v$archived_log;
exit


Este script se ejecuta diariamente, con lo que me deja el backup de los datafiles y los arclog generado por esta.

10 jun 2009

Chequeo de compatibilidades de SOURCE y TARGE Data Base

Estoy en la fase de acomodar la base de datos TARGET o destino, para
poder migrar los datos de otra db SOURCE o fuente. Esto lo voy a
realizar a través de las herramientas import / export de oracle 8i.


Siguiendo el documento
286775.1 voy realizando los siguiente chequeo entre las dos base de datos
  1. RDBMS 8.1.7.0 source databsae (produccion)
  2. RDBMS 8.1.7.4 target database ( a donde quiero migrar)

Source Database
---------------

3. In the source database, check which options were installed:
- Oracle Text - schema: CTXSYS
- Oracle OLAP - schema: OLAPSYS
- Oracle Spatial - schema: MDSYS
- Oracle Data Mining - schema: DMSYS
- Oracle Ultra Search - schema: WKSYS
- Oracle Label Security - schema: LBACSYS
- Oracle JVM ? - object_types: 'JAVA CLASS',
'JAVA DATA', 'JAVA RESOURCE'
- Oracle interMedia - schema: ORDSYS
- Oracle XML DB - schema: XDB


- run queries:

SELECT username FROM dba_users
WHERE username IN ('CTXSYS', 'OLAPSYS','MDSYS', 'DMSYS', 'WKSYS', 'LBACSYS', 'ORDSYS', 'XDB');

no rows selected

SELECT object_type, COUNT(*) FROM dba_objects
WHERE object_type LIKE 'JAVA%' GROUP BY object_type;

no rows selected

A simple vista observo que no existen tales properties mencionados anteriormente en la base de
datos fuente.

4. In the source database, check the characterset of the database:

SELECT * FROM nls_database_parameters
WHERE parameter LIKE '%SET' ORDER BY 1;

+--------+
| SOURCE |
+--------+

PARAMETER VALUE
------------------------------ ----------------------------------------
NLS_CHARACTERSET WE8ISO8859P1
NLS_NCHAR_CHARACTERSET WE8ISO8859P1

+--------+
| TARGET |
+--------+


PARAMETER VALUE
------------------------------ ----------------------------------------
NLS_CHARACTERSET WE8ISO8859P1
NLS_NCHAR_CHARACTERSET US7ASCII


Primer diferencia entre los dos RDBMS, siguiendo el documento llego al docId
77441.1
en donde uno de sus apartados dice:

"El character set es especificado durante la sesión de instalación o con la clasula CHARACTER
SET en la declaracion CREATE DATABASE. Para crear una nueva base de datos con un nuevo CHARACTER
SET, necesitas indicar el character set en el CREATE DATABASE script.
Este es el unico lugar,
por que el CHARACTER SET no puede ser indicado en el init.ora, este no es un parametro valido
del init.ora
"

NOTE: In Oracle 8.x.x there is a new NLS parameter called
NLS_NCHAR_CHARACTERSET. NLS_NCHAR_CHARACTERSET is National Character Set.
It specifies what languages can be used to name database objects. If you
already have a line for NLS_NCHAR_CHARACTERSET in your create database script,
you either need to indicate a character set value on that line in double
quotes as well, or take this line out because if NLS_NCHAR_CHARACTERSET is
not indicated in Create Database Script, it will just default to
NLS_CHARACTERSET value.

Estas es la nota al crear nuevamente la base de datos con este character set. Por lo que llamo al dbassist y
elimino la base de datos previamente creada en el TARGET database. Y la creo con este character set. Y
solucionado el problema.

Ya habiendo eliminado la base de datos, se me da por investigar un poco, y buscar una alternativa para no
eliminar la base de datos y setear nuevamente el character set. En el DocId
66320.1, las posibles
alternativas para realizar el cambio, este no realiza el cambio para los datos ya
existentes con distinto character set.
Sigo un poco mas, y en esta pagina encuentro la referencia a como cambiar el
NL_NCHAR_CHARACTERSET sin eliminar la base de datos en un ambiente de
migración, tal cual es mi caso. Por lo que concluyo que esta es la mejor opción
para mi ambiente.





1 jun 2009

Database "SID" warm started.

Utilizando los scripts start y shutdown (dbstart y dbshut) de base de datos provenientes con la instalación. La instancia no se inicia cuando lo hace el SO, cuando ejecuto el script manualmente /etc/init.d/dbora me surge el siguiente mensaje:
  • Database "" warm started.
La instancia como también la base, se encuentran arriba y los logs no señalan ningún error/alerta.

Investigando un poco en Metalink llego al DocId:
  • 98418.1 WARNING: "dbstart" does not work with 8.1.6 Instances.
  • 50508.1 ALERT: "CONNECT INTERNAL" Syntax to be DeSupported
Mas allá de ser mi RDBMS 8.1.7.4, veo que las condiciones son similares. De los dos documentos y despues de ver esto:

Description 
~~~~~~~~~~~
"CONNECT INTERNAL" will no longer be supported AFTER Oracle8i Release 3 (8.1.7)
Server Manager will no longer be supported AFTER Oracle8i Release 3 (8.1.7)

As part of planning for future releases users are advised to convert
administrative scripts to use SQLPLUS in place of SVRMGRL and to use the
SYSDBA or SYSOPER privileges instead of CONNECT INTERNAL.
These privileges have been available and fully documented since Oracle 7.1

llego a la conclusión que lo mas saludable es cambiar el script dbora creado durante el proceso de instalación. Este es el encargado de subir y bajar la instancia cuando lo hace el sistema operativo.
Así que en el /etc/init.d/dbora cambio:

  • su - $ORA_OWNER -c $ORA_HOME/bin/dbstart &
Por :
  • su - $ORA_OWNER -c "
$ORACLE_HOME/bin/sqlplus -s /nolog << EOF
connect / as sysdba
startup
exit
EOF"

Y listo, desaparece el warning.

28 may 2009

"ORA-03113: end-of-file on communication channel" after patch 2376472

Luego de aplicar el parche 8.1.7.4 al RDBMS 8.1.7.0 y seguir los pasos de post-instalacion del parche 2376472. Me surge el siguiente error al reiniciar la instancia

ORA-03113: end-of-file on communication channel"

En el tracefile observo lo siguiente:

Oracle8i Enterprise Edition Release 8.1.7.4.0 - Production
With the Partitioning option
JServer Release 8.1.7.4.0 - Production
ORACLE_HOME = /u01/app/oracle/product/8.1.7
System name: Linux
Node name: CentOS-XXXXX
Release: 2.4.9-e.74smp
Version: #1 SMP Thu Jan 22 10:28:33 EST 2009
Machine: i686
Instance name: xxxxx
Redo thread mounted by this instance: 1
Oracle process number: 15
Unix process pid: 19434, image: oracle@CentOS-XXXX

*** SESSION ID:(11.1) 2009-05-28 13:05:45.750
Exception signal: 11 (SIGSEGV)
*** 2009-05-28 13:05:45.854
ksedmp: internal or fatal error
Current SQL statement for this session:
BEGIN
dbms_java.server_startup
; END;
----- PL/SQL Call Stack -----
object line object
handle number name
51ea7318 0 package body SYS.DBMS_JAVA
51e99d34 2 anonymous block
----- Call Stack Trace -----
calling call entry argument values in hex
location type point (? means dubious value)

Es obvio que el error esta relacionado con JVM del RDBMS.

Buscando en metalink encuentro:

Full JVM removal on 8.1.7 (includes re-installation steps) Doc ID:
159801.1

Purpose
-------------------
Assist in accomplishing a clean removal of a complete JVM installation on 8.1.7.
In the 8.1.7 version of the rdbms server there exists the potential to have a
wide variety of "java-related" functionality introduced into the database.
For an overview and description of the functionality alluded to,
please see Note 156477.1 "JVM installation on 8.1.7".
In prior versions of 8i it may have been sufficient to simply execute the
$ORACLE_HOME/javavm/install/rmjvm.sql script to remove the JVM from the database.
This isn't the case in the 8.1.7 version.
If other java-related scripts were executed in 8.1.7, for example,
initrepapi.sql, initxml.sql, and init_jis.sql there are additional steps needed
for a complete JVM removal. If only the initjvm.sql script has been run on 8.1.7 and no
other java-related scripts have been run subsequent to it, then the rmjvm.sql
script by itself should still be sufficient for JVM removal.

Siguiendo todos los paso:
  • Elimino JVM del Oracle
  • Check the System Requirements for a JVM Installation DocId: 204935.1
  • Cambio _SYSTEM_TRIG_ENABLED=TRUE en el initXXX.ora,
  • Re-instalo la JVM.
  • Reinicio la base
Y listo. Oracle 8.1.7.4 funcionando a la perfección.

27 may 2009

Oracle 8i in CentOS 2

Estoy creando un ambiente de testing para un viejo sistema, asi que me encuentro con los siguientes ingredientes.

  • Sistema Oparativo: CentOS 2 kernel 2.4.9-e.74smp
  • Base de Datos: Oracle 8.1.7.0.1
  • VmWare Server 1.0.2

Los siguientes links me sirvieron de ayuda:

  • http://www.myoracleguide.com/Oracle.htm
  • http://www.idevelopment.info/data/Oracle/DBA_tips/Linux/LINUX_2.shtml
  • http://download.oracle.com/docs/pdf/A86017_02.pdf


Durante la instalación de la base cuando esta al 97% puede surgir el siguiente error que se resuelve aqui:

"Error iError invoking target install of makefile /XX/.../ctx/lib/ins_ctx.mknvoking target install of makefile /u01/app/oracle/product8/8.1.7/ctx/lib/ins_ctx.mk"

Como recomendación utilizar el jdk118_v3-glibc-2.1.3.tar.bz2 y no jdk1.2.2, ya que con este ultimo se colgo el runInstaller en el Netassist. Lo que llevo a realizar todo nuevamente.

26 may 2009

Instalacion facil de Oracle con Oracle-validated

Hasta el momento, instalar la base de datos Oracle me llevaba la tarea de acomodar el sistema operativo para la instalación de la base.
Acabo de leer este articulo "Prepare your Linux Server to install Oracle database using oracle-validated RPMen el cual oracle entrega un rpm que realiza todos los pasos previos a la instalación de la base. Un espectáculo, a probarlo se ha dicho.

21 abr 2009

ORA_ROWSCN Pseudocolumn

Después de leer un articulo en OTN "When a table was updated"

Me surge la duda sobre "scn_to_timestamp", en el manual de oracle figura lo siguiente sobre esta función y su seudo columna:

SCN_TO_TIMESTAMP

Purpose

SCN_TO_TIMESTAMP takes as an argument a number that evaluates to a system change number (SCN), and returns the approximate timestamp associated with that SCN. The returned value is of TIMESTAMP datatype. This function is useful any time you want to know the timestamp associated with an SCN. For example, it can be used in conjunction with the ORA_ROWSCN pseudocolumn to associate a timestamp with the most recent change to a row.

ORA_ROWSCN Pseudocolumn

Purpose

For each row, ORA_ROWSCN returns the conservative upper bound system change number (SCN) of the most recent change to the row. This pseudocolumn is useful for determining approximately when a row was last updated. It is not absolutely precise, because Oracle tracks SCNs by transaction committed for the block in which the row resides. You can obtain a more fine-grained approximation of the SCN by creating your tables with row-level dependency tracking. Please refer to CREATE TABLE ... NOROWDEPENDENCIES | ROWDEPENDENCIES for more information on row-level dependency tracking.

20 abr 2009

IMP-00061: Warning: Object type "X"."X" already exists with a different identifier

Estuve realizando una migración de Oracle 10gR2 de Windows a Oracle Linux 10gR2 también, y como no podía ser de otra forma surgieron problemas y errores. Me voy a detener solamente en este, que me resulto interesante, sobre todo por la poca info que encontré.

Comando de importación:

  • imp system/xxx IGNORE=Y FILE=$file LOG=Log.log SHOW=N BUFFER=100000 RECORDLENGTH=8192

Salida de log de importación:

IMP-00061: Warning: Object type "SYSTEM"."REPCAT$_OBJECT_NULL_VECTOR" already exists with a different identifier

.......................................................

IMP-00061: Warning: Object type "SYSMAN"."MGMT_BCN_THRESHOLD" already exists with a different identifier

......................................................

IMP-00061: Warning: Object type "SYSMAN"."MGMT_CRED_ROW_ARRAY" already exists with a different identifier

Causa: en la creación de las tablas se genera un chequeo de tipos de datos en donde el type id no coincide.

Solución: agregar en el parámetro del impor toid_novalidate con el nombre de los objetos que generan el problema.

Ej:

imp system/xxxxx IGNORE=Y FULL=Y FILE=$files LOG=impFull.log FEEDBACK=10000 SHOW=N ANALYZE=N BUFFER=100000 RECORDLENGTH=8192 toid_novalidate= OLAPSYS.ALL_OLAP2_AW_METADATA_O, OLAPSYS.ALL_OLAP2_AW_METADATA_T, OLAPSYS.OLAP_SYS_AW_ACCESS_OBJ, OLAPSYS.OLAP_SYS_AW_ACCESS_TBL, OLAPSYS.OLAP_SYS_AW_ENABLE_ACCESS_OBJ, OLAPSYS.OLAP_SYS_AW_ENABLE_ACCESS_TBL, OLAPSYS.O_MESG_ROW, ...,etc

25 feb 2009

Apache + Virtal Host's siempre al mismo VirtualHost

Esto es para tenerlo presente princiapalmente para mi, ya que soy de olvidarme la resolucion de alguno de mis problemas.

  • Problema: Tenemos varios virtualhost bien configurados, en mi caso use el site default como template para crear el resto. Pero cuando queremos acceder a uno de los sites virtuales siempre nos da el mismo.
  • Solucion: despues de estar renegando un rato largo, alguien por ahi dice que esto se debe a que apache esta listando en todas las interfaces y no logra identificar el virtualhost basado en nombres. Y por ende muestra el por default el primero de la lista de apache2/sites-enabled. Agregar al final del apache2.conf el ServerName con el nombre del host resuelve el problema.

18 feb 2009

[ERROR] /usr/sbin/mysqld: Incorrect information in file: './xxxxx.frm'

En la busqueda de la optimizacion de mi base he encontrado el siguiente error:

mysqld[10582]: 090218 7:58:13 [ERROR] /usr/sbin/mysqld: Incorrect information in file: './xxxxxx.frm'

Por lo que encontre en la web, googleando obvio, se debe aparentemente a corrupciones en las tablas, debido a un mal cierre de la base ya sea por fallo de energia, kill process,etc. 

En busqueda de solucionar mi problema he utilizado la herramienta mysqlcheck la que ha chequeado todas las tablas sin ningun problema.

Despues de unos dias nuevamente:

mysqld[10582]: 090218 7:58:13 [ERROR] /usr/sbin/mysqld: Incorrect information in file: './xxxxxx.frm' :( X(

Utilizo la misma tool y nada, algo no anda bien aparentemente. Asi que me decido utilizar myisamchk la cual se corre con la base de datos parada sobre los datafiles. Como la misma esta en produccion hago la copia de los archivos (/var/lib/mysql/dir) y pruebo correr la herramienta, y caramba aparece mas de un error. Myisamchk permite hacer reparaciones, asi que reparo y vuelvo a chequear y definitivamente ahora esta todo bien.

La pregunta del millon es: ¿ cual es la diferencia entre mysqlcheck y myisamchk ?

Segun el manual solo es el estado en el cual se encuentra la base, pero a lo mejor alguien mas me sepa responder.

Saludos.




17 feb 2009

MysqlTuner

Hace un par de dias que estoy con Joomla un CMS, muy bonito en lo que respecta a modulos, mambots y todo eso. Pero del lado de la base de datos (MySQL) un dolor de cabeza, en mi busqueda por optimizar el motor, a lo que de lugar, he encontrado un par de herrameintas bastante interesantes las que les comparto aqui.

  • mytop: un clon del comando top de Linux pero exclusivo para mysql. Su instalacion es mas que sencilla apt-get install mytop. Suele tirar el error "Use of uninitialized value in substitution (s///) at /usr/bin/ mytop line 958" que se resuelve muy bien aqui.
  • Otra herramienta y hasta el momento mi favorita es mysqltuner.pl, la corremos con los mismos paramtros que las demas herramientas ya integradas con el motor, y nos indica cuales son los parametros del /etc/mysql/my.cf que deberiamos optimizar. Un espectaculo :-)

Obvio que con eso no es suficiente, asi que seguire investigandoooo .........

Saludos.

13 feb 2009

Apt-Proxy

Hoy es el dia que he decidido hacer mis post mas que cortos y rapidos, cosa que no queden en un intento, como los otros tantos que tengo en mis borradores.

Tengo un server "A" front-end http  el cual tambien tiene habilitado en el firewall el uso de Apt, todo barbaro hasta ahi.  El problema que se me ha presentado es que existe otro server "B" back-end el cual necesito actualizar y cuya unica conexion es contra el server "A".  ¿Como dientres hago?   

Bueno gracias a debian exite apt-proxy, es muy facil, utilizamos los repositorios locales ("A") para proveer de paquetes de instalacion a otros servers ("B") y en caso de que no lo poseeamos en este server ("A") apt-proxy los busca desde los repositorios de la internet. No hay mucho que agregar esta mas que claro en Ubuntu.

Espero que a alguien mas le sirva.

Saludos.

Pd: Miren la seccion Troubleshooting si tienen algun problema.