Como crear una estructura básica en una base de datos Oracle (I)

Este es mi primer artículo en este blog y en esta ocasión va a tratar sobre bases de datos.

Muchas veces me han preguntado cómo crear la estructura básica en una base de datos Oracle recién instalada, donde solo tenemos el usuario SYSTEM, así que con esta serie de artículos explicaremos de forma sencilla como configurar una base de datos para empezar a trabajar.

Una base de datos se compone principalmente de las siguientes estructuras internas que iremos describiendo en este y en los siguientes articulos:

– Tablespace

– Usuario

– Tablas

– Procedimientos

– Funciones

– Paquetes

– Índices

– Foreign Keys

– Triggers

– Secuencias

Para poder realizar todas estas operaciones, necesitamos tener privilegios de SYSTEM en una base de datos y tener instalado el cliente en nuestro ordenador, si no trabajamos directamente sobre el servidor:

sqlplus user/pass@bbdd

  • user : usuario de la base de datos, en este caso debe ser system
  • pass : password del usuario
  • bbdd : base de datos donde vamos a operar

1.Tablespace

Una base de datos se divide en unidades lógicas denominadas TABLESPACES. No es un fichero físico en el disco, simplemente es el nombre que tiene un conjunto de propiedades de almacenamiento que se aplican a los objetos (tablas, secuencias…) que se van a crear en la base de datos bajo el Tablespace indicado.

Un objeto en base de datos debe estar almacenado obligatoriamente dentro de uno.

Existen tres tipos:

· Almacenamiento: Almacena todos los objetos de la base de datos, es el tipo por defecto.

· Temporal: Se utiliza para la creación de objetos temporales en las operaciones internas de Oracle.

· Undo: Se utiliza para almacenar las transacciones que realiza Oracle hasta la realización del commit (insert, delete).

 

1.1. Datafile

Un datafile es la representación física de un tablespace. Son los “ficheros de datos” donde se almacena la información físicamente. Puede tener cualquier nombre y extensión (siempre dentro de las limitaciones del sistema operativo), y puede estar localizado en cualquier directorio del disco duro, aunque su localización típica suele ser $ORACLE_HOME/Database.

Está asociado a un solo tablespace y, a su vez, un tablespace está asociado a uno o varios datafiles. Es decir, la relación lógica entre tablespaces y datafiles es de 1-N, maestro-detalle.

 

En el esquema podemos ver como el “Tablespace A” está compuesto (físicamente) por tres datafiles (DATOS_1.ORA, DATOS_2.ORA y DATOS_3.ORA). Estos tres son los ficheros físicos que soportan los objetos contenidos dentro del tablespace A. Aunque siempre se dice que los objetos están dentro del tablespace, en realidad las tablas están dentro del datafile.

1.2. Creación de un tablespace

Cuando creamos una tablespace por defecto tiene que tener asignado al menos un datafile. El tamaño máximo que se recomienda son 6GB, aunque Oracle no pone límites en ese tema, más que lo que permita el SO o el particionamiento del disco. Puede ser ampliado en cualquier momento. Cuando creemos uno, este ocupará tanto espacio en disco como hayamos indicado en su creación, aunque internamente esté vacío.

– Almacenamiento:

CREATE TABLESPACE nombre_tablespace

LOGGING

DATAFILE ‘/directorio/fichero.dbf’

SIZE 32(m/g)

AUTOEXTEND (ON/OFF);

– Temporal:

CREATE TEMPORARY TABLESPACE nombre_tablespace

TEMPFILE ‘/directorio/fichero.dbf’

SIZE 32(m/g)

AUTOEXTEND (ON/OFF);

– Undo:

CREATE UNDO TABLESPACE nombre_tablespace

DATAFILE ‘/directorio/fichero.dbf’

SIZE 100 (m/g);

Aclaración:

AUTOEXTEND: Activa o desactiva el crecimiento automático de los archivos de datos del tablespace. Cuando un tablespace se llena se puede usar esta opción, para que el tamaño del archivo o archivos de datos asociados crezca automáticamente. No suele recomendarse esta opción al dificultar el control del espacio ocupado.

1.2.1. Crear un datafile y anexarselo a un tablespace existente

Puede ocurrir que nuestro tablespace se haya ido llenando y no tengamos espacio suficiente, entonces necesitaremos crear un nuevo datafile y anexarlo al tablespace (si no tenemos activado el autoextend).

ALTER TABLESPACE nombre_tablespace

ADD DATAFILE ‘/directorio/fichero.dbf’ SIZE 10(m/g)

AUTOEXTEND (ON/OFF);

 

Agente Java para conocer el tamaño de un objeto

Seguro que alguna vez habéis necesitado conocer el tamaño de un objeto en un programa Java…

Hasta ahora me había servido con el conocimiento extraído de la lectura de este artículo:

http://www.javaworld.com/javaworld/javatips/jw-javatip130.html

Pero esta vez necesitaba algo más preciso y configurable, necesitaba conocer el tamaño de un objeto concreto.

Googleando (sí, yo uso el Google para buscar, aunque eso sí con el Opera) he visto que la clase Instrumentation tiene un getObjectSize:

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/instrument/Instrumentation.html#getObjectSize(java.lang.Object)

pero para poder usar esta clase es necesario que esté en un agente (cargado con la opción –javaagent)

El Agente sería este:

import java.lang.instrument.Instrumentation;

public class MyBasicProfiler {

private static Instrumentation instrumentation;

public static void premain(String args, Instrumentation inst) {

instrumentation = inst;

}

public static Long getSizeInBytes(Object o) {

if (o == null)

return null;

return new Long(instrumentation.getObjectSize(o));

}

public static String getSize(Object o) {

try {

if (o == null)

return “Referencia nula”;

long size = instrumentation.getObjectSize(o);

if (size < 1024)

return size + ” Kbytes”;

return size / 1024 + ” Mbytes”;

} catch (Throwable e) {

error(e);

return “Tamaño desconocido”;

}

}

public static String getHeapSize() {

return Runtime.getRuntime().totalMemory()/1024 + ” Kbytes”;

}

public static String getHeapMaxSize() {

return Runtime.getRuntime().maxMemory()/1024 + ” Kbytes”;

}

public static String getHeapFreeSize() {

return Runtime.getRuntime().freeMemory()/1024 + ” Kbytes”;

}

public static String getUsedMemory() {

return (Runtime.getRuntime().totalMemory() – Runtime.getRuntime().freeMemory())/1024 + ” Kbytes”;

}

public static void invokeGarbageCollector() {

try {

System.gc();

Thread.currentThread().sleep(100);

System.runFinalization();

Thread.currentThread().sleep(100);

} catch (InterruptedException e) {

error(e);

}

}

private static boolean firstTime = true;

private static void error(Throwable e) {

if (firstTime) {

System.err.println(“***********************”);

System.err.println(“Error al inicializar Agente”);

e.printStackTrace();

System.err.println(“***********************”);

firstTime=false;

}

}

}

El Agente debe estar dentro de un JAR

en cuyo MANIFEST.MF (carpeta META-INF/MANIFEST.MF) irá:

MANIFEST.MF:

Premain-Class: MyBasicProfiler

La forma de usarlo es muy sencilla:

public class TestBasicProfiler {

public static void main(String[] args) {

TestBasicProfiler test = new TestBasicProfiler();

System.out.println(“Memoria usada al comienzo:”+MyBasicProfiler.getUsedMemory());

Object object = new Object();

Integer i = new Integer(10);

Long l = new Long(10L);

String s = new String(“Cadena de texto”);

System.out.println(“Tamaño s antes for:”+MyBasicProfiler.getSize(s));

System.out.println(“Tamaño Clase antes for:”+MyBasicProfiler.getSize(test));

System.out.println(“Memoria usada al inicializar:”+MyBasicProfiler.getUsedMemory());

for (int j = 0; j < 1000; j++) {

s = s+ “_”+j;

}

System.out.println(“Tamaño s tras for:”+MyBasicProfiler.getSize(s));

System.out.println(“Tamaño Clase tras for:”+MyBasicProfiler.getSize(test));

System.out.println(“Memoria usada tras for:”+MyBasicProfiler.getUsedMemory());

MyBasicProfiler.invokeGarbageCollector();

System.out.println(“Memoria usada tras Garbage Collector:”+MyBasicProfiler.getUsedMemory());

}

}

Como se ve el Agente permite:

– Ver la memoria usada:

– Conocer el tamaño de un objeto:

– Invocar el Garbage Collector.

Para poder ejecutar el Test en el java de arranque de este debo cargar el Agente.

Por ejemplo en Eclipse pondría el JAR del Agente en la carpeta del proyecto Eclipse y en su configuración::

New report on cloud performance

Interesante análisis del rendimiento en cloud computing de diferentes plataformas:

http://www.bitcurrent.com/new-report-on-cloud-performance/

Ellison consigue en tres meses que Sun sea rentable

Curiosa noticia http://www.elpais.com/articulo/tecnologia/Ellison/consigue/meses/Sun/sea/rentable/elpeputec/20100625elpeputec_2/Tes

¿Qué se echa de menos desde la compra por parte de Oracle?

iPhone… ¿Para diestros?

Jejeje, ya han salido las primeras pegas al iPhone 4.0 y es que según parece al sujetarlo con la mano izquierda (normal si eres zurdo ¿no?) se toca también el marco metálico y provoca que éste se quede sin cobertura.

Ante esta situación la respuesta de los chicos de la manzanita es clara: “sujétalo con la otra mano”

Podemos leer esta curiosa respuesta del CEO de Apple en: http://www.engadget.com/2010/06/24/apple-responds-over-iphone-4-reception-issues-youre-holding-th/

HTML 5 Rocks!

Google ha lanzado una web donde podremos encontrar todo tipo de referencias sobre HTML5, tutoriales, ejemplos, …

http://www.html5rocks.com/