jueves, enero 24, 2013

Error Oracle ORA-00257

ORA-00257: error del proceso de archivado. Sólo conexión interna hasta liberación.

Causa: No se han podido generar nuevos archivados. Probablemente se ha llenado el filesystem.

Efecto: No se pueden insertar ni modificar registros. Oracle no deja conectarse remotamente. Desde el propio servidor sí podemos conectarnos.

Solución: Hacer sitio en el filesystem. Lanzar el script de llamada a Rman que salva los archives y después los elimina. Si no se sabe dónde están buscarlos en el crontab del usuario oracle.

martes, enero 22, 2013

Ulises, condición para aprender

Capitulo II (Néstor).
Página 115 en Editorial Lumen, primera edición.

Para aprender hay que ser humilde, pero la vida es la gran maestra.

Más recursos para sumergirse en la obra de Joyce:

Recorre los lugares descritos en el libro:
http://ulysses.bc.edu/



domingo, enero 20, 2013

Leyendo Ulises en la era Internet

La semana pasada compré un comic excepcional sobre la vida de James Joyce. Es DUBLINES de Alfonso Zapico (editorial Astiberri), que recibió el Premio Nacional de Comic 2012. 100% recomendable.


Me lo leí en un par de sesiones y me entraron unas ganas tremendas de leer la obra cumbre de Joyce, considerada por muchos una de las obras fundamentales del siglo XX. Sabía que es un libro muy especial que no tiene nada que ver con lo publicado hasta entonces.

Las dificultades para seguir el pensamiento de Joyce es enorme. Sólo llevo 5 páginas leídas y he encontrado un montón de palabras metafóricas, una frase de misa en latín, una palabra en gaélico, los nombres de los personajes con significados claros, dáctilos, un arzobispo griego que no aparece ni en la wikipedia (en la inglesa sí está), una expresión de una obra griega (en perfecto griego), una descripción del mar de Homero (en griego también), el nombre de pila de una escritora en su diminutivo familiar, una frase de su obra cambiando un termino (que cambia el significado oculto por supuesto), unas iniciales de una enfermedad, el nombre de un manicomio que debía existir en la época, el nombre de un pub, una sibilina referencia a un movimiento literario irlandes, etc. etc. Y eso que las dificultades de verdad deben aparecer a partir del tercer capítulo.

Se dice que Joyce bromeaba conque los lectores dedicaran toda su vida a leer sus obras, y que los críticos tuvieran que invertir 300 años en descubrir sus secretos. Con lo que no contaba es con una cosa llamada Internet que va a permitir que un informático puede leer el libro en un tiempo razonable.

Algunos recursos útiles que he encontrado:




domingo, enero 06, 2013

Entre otras cosas los recortes son para comprar armas???

Fuente: Diario de noticias de Álava, el 6 de enero.

sábado, enero 05, 2013

Corrupción II: cobra dietas que no te correspondan

Cobrar dietas por residencia fuera de la comunidad, mientras vives en el Palacio de La Moncloa (Madrid), es una forma curiosa de sacrificio y apretarse el cinturón.

Fuente: Diario de Noticias de Álava el 5 de enero.

Corrupción I: Cuando un político no quiere pagar

Le ponen una multa, no paga y alguien intenta perjudicar a la Agente.

viernes, diciembre 14, 2012

Oracle, error ORA-00942 en el acceso a tablas del diccionario

Hace más de 2 años, explicaba cómo habilitar las trazas de acceso en Oracle, y más tarde, cómo analizar cómodamente esas trazas.

El análisis de las trazas requería el acceso a una tabla del diccionario que se encuentra en el esquema SYS: tabla AUD$.

Lo lógico es que con el tiempo vayamos mejorando nuestro sistema e incorporemos trazas de otros sistemas diferentes. Así pues terminaremos creando un nuevo usuario Oracle que accederá a sus propios objetos, además de a la citada tabla SYS.AUD$.

Si hacemos algo así como SELECT * FROM SYS.AUD$ nos dará el siguiente error: "ORA-00942: table or view does not exist".

El problema se soluciona asignándole al nuevo usuario el privilegio del sistema:

GRANT SELECT ANY DICTIONARY TO "USUARIO"

Saludos.

miércoles, diciembre 05, 2012

Oracle, el fichero spfile


Desde Oracle9 este es el fichero de inicialización de parámetros que se debe que utilizar. spfile es un fichero binario que no puedes editar, a diferencia del pfile que es de texto. Aquí tienes unas buenas razones para utilizar el spfile.

Para saber si la base de datos utiliza spfile o pfile:


SQL> SELECT DECODE(value, NULL, 'PFILE', 'SPFILE') "Init File Type" 
       FROM sys.v_$parameter WHERE name = 'spfile';

Para saber dónde está el fichero spfile:

SQL> show parameter spfile;


Arrancar la base de datos con otro pfile:

SQL> STARTUP PFILE='/oradata/fichero'

Saludos.

lunes, diciembre 03, 2012

UNIX, destrucción de metadata en un LV (Logical Volume)


A veces tienes que eliminar datos de un filesystem y quieres hacer algo más que el típico rm -R.
Esto dificultará un poco más una hipotética recuperación de datos:

Necesitamos un fichero algo grande como puede ser el kernel de UNIX:
ll /stand/vmunix

Escribimos los bloques del fichero elegido sobre el RLV (Raw Device del Logical Volume).
Si en el vgdatos tenemos un lvdatos por ejemplo:

dd if=/stand/vmunix of=/dev/vgdatos/rlvdatos bs=1024

Nota: En el comando dd indico el raw device rlvdatos y no el block device lvdatos.

Saludos.

viernes, noviembre 30, 2012

Reiniciar servicio Dataprotector


Cuando lanzas un backup con el software de HP Dataprotector y te ves obligado a cancelarlo, un error frecuente es matar la sesión desde el propio GUI. Digo esto porque los devices siguen con la recuperación y si necesitas repetir el restore puedes tener problemas.

Consejo:
Reiniciar el servicio Dataprotector.

#/opt/omni/sbin/omnisv -stop
#/opt/omni/sbin/omnisv -start

Para ver los servicios arrancados:


# /opt/omni/sbin/omnisv -status

    ProcName  Status  [PID]    
===============================
    rds     : Active  [4975]
    crs     : Active  [4979]
    mmd     : Active  [4977]
    kms     : Active  [4978]
    omnitrig: Active
    uiproxy : Active  [4981]
    Sending of traps disabled.
===============================
Status: All Data Protector relevant processes/services up and running.



Aquí el enlace a un útil documento PDF de resolución de problemas con Dataprotector.

Saludos.

jueves, noviembre 29, 2012

Oracle: cambio de juego de caracteres


Hay un tipo de cambios de juego de caracteres muy sencillo: Ocurre cuando tenemos un juego de caracteres limitado y queremos cambiar a un superconjunto (superset) mayor. Si no es así, no emplear este método. Toca documentarse mejor.

Por ejemplo es habitual cambiar el clásico WE8ISO8859P1 que no soporta el símbolo del euro (€) por el juego de caracteres WE8MSWIN1252 que incorpora todos los caracteres del anterior más otros muchos más (entre ellos el del euro).

En este caso el cambio es muy sencillo.

$sqlplus "/as sysdba"

Primero comprobamos que estamos en el host y la instancia adecuada (host_name e instance_name):
SELECT * FROM V$INSTANCE;

Luego conviene que nos aseguremos del juego de caracteres actual. Nos fijamos en el parámetro NLS_CHARACTERSET:

SELECT * FROM V$NLS_PARAMETERS;

SHUTDOWN IMMEDIATE;
STARTUP RESTRICT;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
ALTER DATABASE CHARACTER SET WE8MSWIN1252;

Comprobación:
SELECT * FROM V$NLS_PARAMETERS;

Saludos,





miércoles, noviembre 28, 2012

Hoy otro más...

Cada vez ponen estas noticias en lugares menos destacados, y en la radio ni lo mencionan, pero el goteo es incesante. ¿Cuantos suicidios hay al día? Probablemente la cifra sea de asustar y por eso se silencia.


Noticia aquí.

sábado, noviembre 24, 2012

Ya está bien!!! Que la gente se está suicidando!!!

¡¡¡Pero qué es esto!!!
¡¡¡Que la gente se está suicidando!!!

¿¿¿QUE OS PASA A LOS POLÍTICOS QUE NO OS ENTERÁIS DE LO QUE PASA O ES QUE OS DA IGUAL TODO???

¿¿¿EN QUÉ ANDAN PENSANDO LOS SINDICATOS??? ¿¿¿LA EXTRA DE NAVIDAD??? ¿¿¿QUÉ IMPORTA ESO CUANDO LA GENTE SE SUICIDA??? ¿¿¿CUANDO EMPIEZAN LAS MANIFESTACIONES POR LO MUERTOS???

¡En un lugar civilizado no se deja a la gente en la intemperie sin techo!
¿Qué tipo de libertad es esa que disfrutamos?

Políticos, funcionarios instructores, inspectores, policía, ¡Dejad ya de abrasar a multas e inspecciones a los transportistas que están todos arruinados! No conocéis la realidad. Seguís pensando que los fontaneros están forrados. Vais a conseguir que se suiciden todos y luego ya no les podréis exprimir más. El sistema ahora mismo no se puede mantener a base de multas e impuestos.


Fuente aquí.



Fuente: aquí.

martes, noviembre 20, 2012

Actualidad. 20-11-2012

Aquí una buena noticia (¡increible!)

Fuente: elmundo.es

Aquí la mala: (¡menuda justicia/jueces tenemos! yo tampoco veo telebasura. Espero que no me demanden por decirlo en un blog, aunque todo es posible)

Fuente: elcorreo.com

La sorprendente:



La tecnológica:


Fuente: cotizalia.com

lunes, noviembre 19, 2012

Oracle, forzar la parada de la base de datos

Cuando hay usuarios conectados, o procesos Oracle lanzados en el servidor, la parada puede resultar problemática.

SQL> SHUTDOWN IMMEDIATE

Las sesiones no activas las va cerrando con esta orden, pero los procesos en ejecución continúan y hasta que terminen todos no va a hacer la parada.

Si nos vamos a casa al día siguiente podemos ver que la orden "shutdown immediate" se ha interrumpido y la base de datos no ha llegado a pararse.

Solución 1: NO HACER ESTO. Se trata de forzar la parada con un "shutdown abort". De esta forma fuerzas la parada, pero cuando vaya a arrancarlo te puedes encontrar todo tipo de sorpresas desagradables.

Solución 2: La buena:

El problema es que una vez que lanzas el "shutdown immediate", la base de datos no va a aceptar nuevas conexiones así que lo más limpio va a ser matar esos procesos que nos impiden parar la base de datos, desde la cuenta de root del sistema operativo.

El listado de procesos Oracle No locales a la máquina (procesos de usuarios) se obtiene así:
# ps -ef|grep oracle|grep LOCAL=NO

En la 2ª columna del listado tenemos el pid del proceso, por lo que podemos hacer esto para pasárselo al comando KILL:

#  ps -ef | grep oracle |grep LOCAL=NO | awk {'print "kill -9 " $2'}
kill -9 27964
kill -9 2093
kill -9 2347
kill -9 26055
kill -9 5591
kill -9 26051
kill -9 29097
kill -9 25591
kill -9 25587
kill -9 16100
kill -9 5005
kill -9 2095
kill -9 7202
kill -9 13927
kill -9 12817
kill -9 14659
kill -9 26049
kill -9 26053
kill -9 29095
kill -9 14558
kill -9 10754
kill -9 2605
...
...

Saludos.

pd: ¡Que bueno el awk!

sábado, noviembre 17, 2012

Juego sucio de Google???


Estaba leyendo el diario de hojas salmón "Expansión" de ayer, y me he encontrado un curioso anuncio: "En 2009, una penalización no especificada por parte de Google redujo nuestro tráfico de visitantes en más de un 90% de la noche a la mañana. Prácticamente, desaparecimos de Internet durante más de nueve meses".

Supuestamente son palabras del CEO de "One News Page": http://www.onenewspage.com/

El anuncio es de una iniciativa llamada ICOMP para defender el comercio online competitivo.

La verdad es que si lo que dice es cierto (leer los siguientes dos párrafos del anuncio), se trataría de un juego sucio que podría anular por invisibilidad cualquier sitio web de un plumazo. De momento veo que onenewspage tiene un pagerank de 5 que no está nada mal. Espero que la cosa tenga su explicación.

Por mirar algo he comprobado que en lo que llevamos de año, OneNewsPage ha recibido por parte de Google 7 peticiones de retirada de contenido por vulnerar derechos de autor. En principio no parecen muchas, y se supone que cuando recibes un aviso de esos, haces caso y lo retiras.


En todo caso, que todo el mundo utilice el mismo buscador siempre será "peligroso".

Saludos.

martes, noviembre 13, 2012

Calcular distancia entre dos ciudades con PERL

Como decía el otro día, necesito un programa que calcule distancias entre ciudades. No puedo ir a GOOGLE MAPS y hacerlo a mano porque hablamos de una tabla completa.

Hoy vamos a utilizar PERL.

Necesitamos descargar e instalar el módulo JSON. El sitio de descarga éste. Descargamos el fichero JSON-2.53.tar.gz. Con gunzip fichero.gz obtenemos el fichero JSON-2.53.tar. Luego con tar -xvf fichero.tar obtenemos el directorio que contiene los ficheros del módulo.

Luego compilamos el módulo:
  1. perl Makefile.PL
  2. make
  3. make test
  4. make install
 Y ahora podemos utilizarlo de la siguiente forma para acceder al API de GOOGLE MAPS:

#!/usr/bin/perl

use strict;
use warnings;

use JSON;

use LWP::UserAgent;
my $ua = LWP::UserAgent->new();

my $origin = "Vitoria-Gasteiz";
my $destination = "Bilbao";

my $site = 'http://maps.googleapis.com/maps/api/directions/';
my $mode = 'json';

my $page = $site . $mode . '?origin="' . $origin . '"&destination="' . $destination . '"&sensor=false';

my $response = $ua->get( $page );
my $json = $response->content();

my $data = decode_json $json;

my @legs = @{ $data->{'routes'}[0]{'legs'} };
my $distance_meters = 0;
foreach my $leg (@legs) {
    $distance_meters += $leg->{'distance'}{'value'};
}

my $distance_kilometers = $distance_meters / 1000;
print $distance_kilometers . " kilometros\n";

El resultado de la ejecución:

perl distancia.pl
65.311 kilometros



Código fuente descargado de aquí, aunque se han hecho un par de modificaciones.

Más información y ejemplos en la documentación de Google aquí.

Saludos,

lunes, noviembre 05, 2012

Problema del módulo Geo-Google (PERL)


CPAN es el repositorio de módulos de PERL (entre otras cosas). Ayer quería hacer un programita PERL que interrogue a Google Maps para calcular distancias entre dos ciudades.

Encontré un módulo que precisamente para hacer eso. Se llamaba GEO::GOOGLE

El caso es que para "coger destreza" en el desempaquetado (gunzip y tar), y el compilado de módulos:

perl Makefile.PL
make
make test
make install

Y sobre todo para saber identificar los errores y warnings que surgen a lo largo del proceso, decidí instalar cada dependencia a mano. En total instalé 23 módulos:

[root@xekun perl]# ls -la
total 100
drwxr-xr-x. 25 root  root  4096 Nov  5 09:04 .
drwxr-xr-x.  3 aitor aitor 4096 Nov  5 00:31 ..
drwxr-xr-x.  8 aitor aitor 4096 Nov  5 00:15 Compress-Raw-Bzip2-2.055
drwxr-xr-x.  9 aitor aitor 4096 Nov  5 00:06 Compress-Raw-Zlib-2.056
drwxr-xr-x.  5   501 games 4096 Nov  4 22:15 Digest-MD5-2.52
drwxr-xr-x.  5   501 games 4096 Nov  4 23:48 Encode-Locale-1.03
drwxr-xr-x.  5   501 games 4096 Nov  4 23:46 File-Listing-6.04
drwxr-xr-x.  5 root  root  4096 Nov  5 00:39 Geo-Google
drwxr-xr-x.  7   501 games 4096 Nov  5 00:22 HTML-Parser-3.69
drwxr-xr-x.  4   500   500 4096 Nov  4 23:08 HTML-Tagset-3.20
drwxr-xr-x.  5   501 games 4096 Nov  4 23:44 HTTP-Cookies-6.01
drwxr-xr-x.  5   501 games 4096 Nov  4 23:33 HTTP-Daemon-6.01
drwxr-xr-x.  5   501 games 4096 Nov  4 23:09 HTTP-Date-6.02
drwxr-xr-x.  5   501 games 4096 Nov  5 00:18 HTTP-Message-6.06
drwxr-xr-x.  5   501 games 4096 Nov  4 23:45 HTTP-Negotiate-6.01
drwxr-xr-x.  8 aitor aitor 4096 Nov  5 00:17 IO-Compress-2.055
drwxr-xr-x.  5 aitor aitor 4096 Nov  5 00:09 IO-HTML-0.04
drwx------.  5  1006   513 4096 Nov  5 00:27 JSON-1.12
drwxr-xr-x.  6   500   500 4096 Nov  5 00:29 JSON-2.53
drwxr-xr-x.  6   500   500 4096 Nov  5 00:32 JSON-PP-2.27200
drwxr-xr-x.  6   501 games 4096 Nov  4 23:47 libwww-perl-6.04
drwxr-xr-x.  5   501 games 4096 Nov  4 23:35 LWP-MediaTypes-6.02
drwxr-xr-x.  5   501 games 4096 Nov  4 23:46 Net-HTTP-6.03
drwxr-xr-x.  5   501 games 4096 Nov  5 00:19 URI-1.60
drwxr-xr-x.  5   501 games 4096 Nov  4 23:30 WWW-RobotRules-6.02


Bueno, total que quedó todo perfectamente instalado y funcionando, menos el dichoso módulo GEO::GOOGLE

Entonces se me ocurrió mirar los resultados de los testers del módulo y me encontré con esta desagradable sorpresa:



Como se puede ver en el enlace, no funciona prácticamente en ningun S.O. ni versión de PERL.

Lección aprendida: Antes de usar un módulo CPAN comprobar los resultados de los Testers.

Saludos,

viernes, octubre 26, 2012

Oracle, aumentar número de conexiones

Cómo se percibe este problema:
A veces ocurre algo extraño. Algunos usuarios trabajan sin problemas con la base de datos, pero hay usuarios que se quejan de errores en las aplicaciones. El mensaje "debidamente" o no traducido por la aplicación dirá algo así: "Oracle rechaza la conexión", "No se puede conectar a la base de datos", o lo que se la haya ocurrido al programador.

Consejo para desarrolladores: Estaría bien que cuando se captura un error provocado por otro sistema, además de la interpretación de lo que ocurre se ofrezca el error exacto que en caso de Oracle tiene que ser un error ORA-número.

Si nos conectamos sysdba el error en Oracle11.2 es el siguiente:

$sqlplus "/as sysdba"
Connected
SQL> ponemos cualquier sentencia válida
ERROR al line 1:
ORA-01012: not logged on

Lo que ocurre es que hemos llegado al número de procesos máximos definido en nuestra base de datos. La solución es ver los que tenemos y aumentarlos.

Nota: para poder conectarnos, cambiar el parámetro, y reiniciar la base de datos, tendremos que matar procesos desde el sistema operativo. Obtener los procesos Oracle de usuario haciendo:

ps -ef|grep LOCAL=NO

Para ver el valor del parámetro de procesos máximos:

SQL> show parameter processes;

Para aumentarlo (requiere reinicio):

SQL>alter system set processes=5000 scope=spfile;
SQL>shutdown immediate;
SQL>startup

Saludos.

miércoles, octubre 24, 2012

oracle, impdp error ORA-39070

A vece te ocurre un error en la import datapump de Oracle, que no identifica claramente lo que está ocurriendo.

Éste es el caso del error ORA-39070: Unable to open the log file.


ORA-39002: invalid operation
ORA-39070: Unable to open the log file.
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation

Antes de volverte loco examinando el paquete UTL_FILE, ten en cuenta lo siguiente:

ORACLE utiliza UTL_FILE para leer o escribir ficheros de texto. Cuando utilizas la import datapump (impdp) tienes que indicar el directorio con el parámetro DIRECTORY=

En DIRECTORY no se pone directamente el directorio, sino que antes de lanzar el impdp tiene que existir el objeto tipo directorio. Podemos crearlo con un fichero SQL como éste:

CREATE OR REPLACE DIRECTORY DATA_PUMP_DIR AS '/mis_exports/lunes/';
GRANT READ, WRITE ON DIRECTORY DATA_PUMP_DIR TO SYSTEM;
EXIT;

Pues si el directorio está mal indicado, o si no existe el objeto DATA_PUMP_DIR (en mi ejemplo), o no hemos dado el GRANT al usuario que lanza la import, ORACLE no será capaz de escribir el fichero de LOG y fallará el impdp dando el error indicado.

Saludos,