miércoles, 17 de febrero de 2010

Obtener ficheros de un directorio y trabajar con ellos

Buenas,

Hay veces que necesitas obtener recurrentemente el contenido de un directorio para trabajar con los ficheros, aqui pongo un de las múltiples opciones posibles.

Yo he utilizado una tabla externa pues es recurrente y por que además me da mucha más flexibilidad para buscar más tarde sobre el contenido.

El contenido de lsora.sh es solamente el ls del directorio, si queremos obtener más información solo tenemos que utilizar las opciones de ls para tener esta info. Para poder verla en Oracle entonces añadir los nuevos campos a la tabla externa.

create or replace directory dir_ls as '/tmp';
create table contenido_directorio (fichero varchar2(500)) organization external (default directory dir_ls location('rdo.txt'));

begin
dbms_scheduler.create_job(job_name=>'LS',job_type=>'EXECUTABLE',job_action=>'/home/sh/lsora.sh',start_date=> systimestamp,enabled=>true);
for registro_cd in (select fichero from contenido_directorio)
loop
dbms_output.put_line(registro_cd.fichero);
end loop;
end;
/

lunes, 28 de diciembre de 2009

File system management (LVM, RAID, Swap, ...)

Bueno aqui va mi segundo PPT.

Este va sobre file system management a través de RAID y LVM en Linux.

Además hay una pequeña mención a swap y el failover con ella.

Saludos y espero que sirva.


Bounding - Failover

He decidido que poco a poco iré poniendo los PPT que me he hecho sobre todos los temas que trato, para así compartir lo poco que sé y sobre todo a la espera de comentarios para aprender mucho más.

El primero que voy a poner es uno de bounding, que espero que sirva de ayuda para alguien.

lunes, 2 de febrero de 2009

ORACLE. Cursor variables

Las variables implicitas dentro de un cursor son:

  1. cursor%ISOPEN -> True/False. Devuelve si el cursor está abierto, es decir, después de ejecutar open, y al contrario, es decir, después de ejecutar close.
  2. cursor%FOUND ->True/False. Después de ejecutar fetch, devuelve si el cursor contiene datos. Si se alcanza más allá del último registro después de fetch, la variable devuelve FALSE.
  3. cursor%NOTFOUND ->True/False. Contrario del FOUND.
  4. cursor%ROWCOUNT -> Número. Número de registros afectados en la selección. Después de open, equivale al número total, pero el número decrece después de cada fetch.
Hay que tener en cuenta que FOUND, NOTFOUND y ROWCOUNT no se pueden utilizar antes de abrir el cursor con open, ya que darían una excepción.

Suerte en el mundo Oracle!!!

domingo, 1 de febrero de 2009

ORACLE. Obtener plan de ejecución

Para poder obtener el plan de ejecución podemos utilizar básicamente 2 métodos:

  1. Si queremos obtener el plan pero no guardarlo, ejecutar SET AUTOTRACE ON EXPLAIN antes de ejecutar el SQL que queremos analizar. Una vez finalizado ejecutar SET AUTOTRACE OFF. Para poder obtener utilizar este comando, primero ejecutar $ORACLE_HOME/sqlplus/admin/plustrce.sql y dar el permiso plustrace al usuario ("grant plustrace to ;")
  2. Si queremos guardarlo utilizar EXPLAIN PLAN SET STATEMENT_ID='MI CODIGO' INTO PLAN_TABLE FOR y después ejecutar "SELECT OPERATION, OPTIONS, OBJECT_NAME FROM PLAN_TABLE WHERE STATEMENT_ID='MI CODIGO'. La tabla utilizada es la que definida por defecto pero podemos definir una propia nuestra.

Suerte en el mundo Oracle!!!!

miércoles, 14 de enero de 2009

ORACLE. Función de texto SUBSTR y INSTR

Ya sea dentro de PL/SQL o bien en el mismo SQL Plus las funciones de gestión de textos son muy utilizadas. Algunas con mayor o menor acierto.

Unas de las más utilizadas, sobre todo el tratamiento de flags, tenemos a:

SUBSTR(cadena,inicio,longitud) para extraer unas letras de un texto. Los parámetros:
  • cadena = Texto
  • inicio = Posición Inicial, por defecto 1. Si el valor es negativo, p.e. -1, la posición inicial es la longitud de la cadena -1. Si ponemos 0, Oracle pondrá 1.
  • longitud = Longitud del texto a extraer. En caso de omitirse se extrae todo el string.
Ejemplos

substr('abcdefg', 3, 2) = 'cd'
substr('abcdefg', 3) = 'cdefg'
substr('abcdefg', -3, 1) = 'e'

IN
STR(cadena,cadena_a_buscar, inicio, iteración) para buscar la posición donde se encuentra la cadena a buscar. Los parámetros:
  • cadena = Texto donde se buscará
  • cadena_a_buscar = Texto que se buscará
  • inicio = Posición Inicial, por defecto 1. Si el valor es negativo, p.e. -1, la posición inicial es la longitud de la cadena -1 y entonces la busqueda es modo reverso
  • iteración = Número de vez que buscamos.
En caso de encontrar se devuelve 0.

Ejemplos

instr('abcdeabcde', 'e') = 5
instr('abcdeabcde', 'e',1,1) = 5
instr('abcdeabcde', 'e',1,2) = 10
instr('abcdeabcde', 'e',-2,1) = 5
instr('abcdeabcde', 'a',-2,2) = 1

sábado, 27 de diciembre de 2008

ORACLE. Comandos Linu

Cualquier DBA sabe que necesita interaccionar con el sistema operativo tanto para el tuning de la base de datos, así como para administrarla.

Aquí pongo una lista de los comandos que yo utilizo, que seguro que son pocos y que espero con el tiempo de ampliar, así que cualquier comentario será bueno:

  • ps -fu oracle. Listado de los procesos pertenecientes al usuario oracle
  • ps -ef. Listado completo de los procesos actuales
  • sysctl -p. Carga los parámetros del Kernel definidos en /etc/sysctl.conf
  • sysctl -a. Lista de los parámetros actuales del kernel.
  • lsof -p . Listado de los ficheros actualmente en uso por un proceso PID
  • lsof -u oracle. Listado de los ficheros actualmente en uso por el usuario oracle
  • free -tlos 10 -c 15. Lista cada 10 segundos y 15 iteraciones el uso de la memoria (física y swap).

lunes, 24 de noviembre de 2008

ORACLE . Crear nuevo tablespace temporal (Temporary) por defecto

Para reducir un tablespace TEMPORAL por defecto (default temporary tablespace), los pasos son:
1. Crear un nuevo tablespace temporal

CREATE SMALLFILE TEMPORARY TABLESPACE "TEMP2" TEMPFILE '/mibd/temp03.dbf' SIZE 512M AUTOEXTEND ON NEXT 25M MAXSIZE 2G EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;

2. Establecer el nuevo tablespace como default temporary tablespace

ALTER DATABASE DEFAULT TEMPORARY TABLESPACE "TEMP2"

3. Poner todos los datafiles del tablespace original como OFFLINE.

ALTER DATABASE TEMPFILE '/mibd/temp01.dbf' OFFLINE;

4. Borrar tablespace anterior y los ficheros asociados

DROP TABLESPACE TEMP INCLUDING CONTENTS AND DATAFILES;

5. Realizar copia archivo de control a traza (opcional per muy recomendado)

ALTER DATABASE BACKUP CONTROLFILE TO TRACE;

Y ya está,
Juan

viernes, 14 de noviembre de 2008

ORACLE. Saber usuario conectado ( whoami )

Para saber el usuario conectado, algo como whoami de linux, podemos:
  1. select user from dual;
  2. show user;
y ya está !!!!!

miércoles, 12 de noviembre de 2008

LINUX. Gestión de Procesos en 2º plano (parar, continuar, eliminar)

Muchas veces enviamos un comando a 2º plano con & (command &) y va funcionando,
pero que pasa si queremos parar momentaneamente. Para hacerlo utilizaremos [kill].

Kill nos ofrece diferentes opciones:
  • kill -CONT => Continua con la ejecución
  • kill -STOP => Para la ejecución, pero no lo elimina
  • kill -9 => Eliminar la ejecución

Saludos,

Juan

lunes, 3 de noviembre de 2008

ORACLE. Cargar ficheros textos ASCII

Para cargar un fichero de texto ASCII en Oracle, utilizaremos sqlldr y:
  • Fichero de Entrada (Input file) que son los que contienen los datos,
  • Fichero de configuración (Control file, control= ) que son los que definen la estructura del fichero de entrada y que hacer con los registros
  • Fichero de resultado  y errores (Log file)
  • Fichero de registros erroneos (Bad File), es decir, registros que incumplen la integridad.
  • Fichero de registros rechazados (Reject file), es decir, registros que incumplen una cierta condición.
Ejemplos: Cargar los empleados en la tabla emp, siendo la longitud variables 
                                  y separados por coma

load data
infile 'datos.txt'
into table empleados
fields terminated by "," optionally enclosed by '"'   
( codigo, nombre, salario, departamento )

Ejemplos: Cargar los empleados en la tabla emp, siendo la longitud variables 
                                  y separados por coma

load data
infile 'datos.txt'
into table empleados
fields terminated by "," optionally enclosed by '"'   
( codigo, nombre, salario, departamento )

viernes, 31 de octubre de 2008

CRYSTAL REPORTS. Pasar valores de un subinforme a un informe

Para pasar valores de un subinforme a un informe lo que tenemos que hacer es:

1. Crear una fórmula en el subinforme llamada valor_a_pasar con el siguiente código:
WhileprintingRecords; //Es opcional
Shared Numbervar Valor;
Valor=;

2. Crear una fórmula en el informe principal llamada valor_a_recoger con el siguiente código;
WhileprintingRecords; //Es opcional
Shared Numbervar Valor;

Si queremos utilizar el valor, solo tenemos que utilizar la fórmula {@valor_a_recoger} y ya está.

Saludos,

Juan

CRYSTAL REPORTS. Gráficos multieje

En epocas como esta a lo mejor queremos tener un mismo gráfico la cotización del petroleo y la del dolar/euro. Ambos valores tienen diferente escala (petroleo>70, dolar<1,4) por lo que este último se verá como una línea casi sin movimientos.

Para verlo solo tenemos que seleccionar "Dual Axes" en "Chart Option Axes" y ya está !!!!

CRYSTAL REPORTS. Contador manual con ordenación Top N / Botton N

Muchas veces generamos grupos y lo que queremos es que nos diga SOLO los 5 mejores o peores y al pie la suma total.

Si nos fijamos la suma, es incorrecta ya que se realiza antes de que nos quedemos con los registros que queremos.

Para solucionarlo hay que crear un contador manual, siguiento los siguientes pasos:

1. Crear formula que nos sume:
Whileprintingrecords;
Local Numbervar Sumatorio;
if groupnumber <= 5 then Sumatorio:=Sumatorio+

2. Crear formula que nos muestre el valor y situarla en el pie del grupo:
Whileprintingrecords;
Local Numbervar Sumatorio;

3. Crear formula que nos resetee el valor y situarla en el encabezado de forma oculta:
Whileprintingrecords;
Local Numbervar Sumatorio:=0;

Y ya está!!!

sábado, 6 de septiembre de 2008

ORACLE. Como ejecutar un comando del S.O. desde SQLPLUS

Hay veces que hemos necesitado ejecutar un comando del s.o.
estando en sqlplus, podemos hacerlo de dos formas:

1. Dentro de sqlplus: host
2. Saliendo momentaneamente de sqlplus: ! + + + exit

Y ya está !!!!

miércoles, 3 de septiembre de 2008

ORACLE. MTTR y recuperación rápida

Es aconsejable para que la recuperación de nuestra instancia sea más rápida y sobre todo controlada, establecer un valor al parámetro FAST_START_MTTR_TARGET con un valor entre 1 y 3600 (1h).

Este parámetro establece el tiempo máximo de recuperación en segundos después de un inicio de recuperación de una instancia (http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/initparams068.htm#sthref192).

En mi caso yo lo tengo a 5 minutos, para tampoco no notarlo en el rendimiento:

alter system set fast_start_mttr_target = 300;

Este valor no debería de ser superior al que Oracle tiene estimado, pues entonces no se tendría en cuenta y no nos serviría de mucho. Ver ambos valores es facil con:

select target_mttr, estimated_mttr from v$instance_recovery;

Es aconsejable desactivar los antiguos parámetros que gestionaban el MTTR:

alter system set log_checkpoint_interval = 0;
alter system set log_checkpoint_timeout = 0;
alter fast_start_io_target = 0;



Más info también en http://www.akadia.com/services/ora_checkpoint_tuning.html

ORACLE. Variables de entorno

Dentro de cualquier entorno Oracle podemos encontrar algunas de las siguientes variables de entorno.
  1. ORACLE_HOME: Directorio raiz donde el software de Oracle está instalado.
  2. ORACLE_SID: Instancia a la que el usuario quiere conectarse.
  3. ORACLE_BASE: Directorio raiz donde se encuentran los diferentes software de Oracle se han instalado.
  4. ORA_NLS10 / ORA_NLS33: En entornos con multiples versiones de Oracle, directorio raiz donde se encuentran los ficheros NLS.
  5. TNS_ADMIN: Directorio raiz donde los ficheros de configuración de Oracle Net se encuentran.
  6. TWO_TASK: Cadena de conexión por defecto si el usuario no la define.
  7. LD_LIBRARY_PATH: Directorio raiz donde se encuentran las librerías compartidas de objetos.
  8. NLS_LANG: Define el idioma, territorio y el set de caracteres (substituye a las tres siguientes). Ver (http://www.oracle.com/technology/tech/globalization/htdocs/nls_lang%20faq.htm)
  9. NLS_LANGUAGE: Define el idioma
  10. NLS_TERRITORY: Define el territorio
  11. NLS_CHARACTERSET: Define el juego de caracteres.

lunes, 18 de agosto de 2008

ORACLE. Sizing Undo

Tamaño (en Kb): Undo Retention (en segundos) * Undo per second * DB_BLOCK_SIZE

Undo Retention = Tiempo de Undo necesario
Undo per second = Numéro de bloques undo generados por segundo ( SELECT (SUM(undoblks))/ SUM ((end_time - begin_time) * 86400) FROM v$undostat;)
DB_BLOCK_SIZE = Tamaño de bloque (show parameter DB_BLOCK_SIZE)

jueves, 7 de agosto de 2008

ORACLE. Mover datafile

Para mover un datafile que no pertenece ni ha SYSTEM ni a los redo log, los pasos a hacer es:

connect sys/password as sysdba
alter tablespace mi_tablespace offile;
alter tablespace mi_tablespace rename datafile 'path_anterior' to 'path_nuevo';
!mv 'path_anterior' 'path_nuevo'
alter tablespace mi_tablespace online;

Vistas interesantes
v$tablespace
v$datafile -> select df.name from v$datafile df, v$tablespace ts where df.ts#=ts.ts# and ts.name='mi_tablespace';