Estructuras de Oracle

Los datafiles son los ficheros fsicos en los que se almacenan los objetos que forman parte de un tablespace. Un datafile pertenece solamente a un tablespace y a una instancia de base de datos. Un tablespace puede estar formado por uno o varios datafiles. Cuando se crea un datafile, se debe indicar su nombre, su ubicacin o directorio, el tamao que va a tener y el tablespace al que va a pertenecer. Adems, al crearlos, ocupan ya ese espacio aunque se encuentran totalmente vacos, es decir, Oracle reserva el espacio para poder ir llenndolo poco a poco con posterioridad. Por supuesto, si no hay sitio suficiente para crear un fichero fsico del tamao indicado, se producir un error y no se crear dicho fichero.

Cuando se van creando objetos en un tablespace, stos fsicamente se van almacenando en los datafiles asignados a dicho tablespace, es decir, cuando creamos una tabla y vamos insertando datos en ella, estos datos realmente se reparten por los ficheros fsicos o datafiles que forman parte del tablespace. No se puede controlar en qu fichero fsico se almacenan los datos de un tablespace. Si un tablespace est formado por 2 datafiles y tenemos una tabla en ese tablespace, a medida que vamos insertando filas stas se almacenarn en cualquiera de los dos datafiles indistintamente, es decir, unas pueden estar en un datafile y otras en otro.

El espacio total disponible en un tablespace es lgicamente la suma de los tamaos que ocupan los ficheros fsicos o datafiles que lo forman. Como hemos indicado estos datafiles, al crearlos, estn totalmente vacos, simplemente es un espacio reservado y formateado por Oracle para su uso. A medida que se van creando objetos en ellos como tablas, ndices, etc y se van insertando registros en estas tablas, los datafiles se van llenando o, lo que es lo mismo, el tablespace se va llenando.

.Creacin y Manipulacin

La creacin de datafiles est estrechamente relacionada con el tablespace al que va a pertenecer. Tenemos varias formas de crear datafiles. Cada vez que se crea un tablespace nuevo, hay que indicar obligatoriamente cual es el datafile que va a pertenecer a dicho tablespace y, en ese momento, se crea tanto el tablespace como su datafile. Tambin se pueden aadir datafiles nuevos a un tablespace que ya existe. Esto se suele hacer cuando un tablespace se est llenando y est a punto de llegar a su capacidad mxima. Al aadir un datafile a un tablespace, se aumenta el espacio disponible en dicho tablespace en tantos megabytes como tenga el datafile nuevo recin creado.

Creacin de un nuevo datafile de 50 megabytes junto con un nuevo tablespace:

Create tablespace  nombre_tablespace datafile 
'/users/oracle/orcl/nombre_datafile.dbf' size 50M; 

Una vez creado este tablespace, si con el tiempo queremos aadirle espacio, lo podemos hacer creando un nuevo datafile y asignndoselo al tablespace:

Alter tablespace nombre_tablespace add datafile 
'/users/oracle/orcl/nombre_datafile2.dbf' size 100M; 

Con estas dos instrucciones hemos creado un tablespace nuevo en nuestra base de datos en el que caben 150 megabytes de informacin. Este espacio est formado fsicamente por dos ficheros llamados nombre_datafile.dbf y nombre_datafile2.dbf que se encuentran en el directorio /users/oracle/orcl de nuestra mquina y que ocupan 50 y 100 Mbytes respectivamente.

Para conocer los datafiles que forman parte de nuestra base de datos, podemos consultar la vista dba_data_files en la que se nos indica por cada datafile o fichero de datos, a qu tablespace pertenece y cuanto espacio total tiene reservado. Es importante recalcar que el espacio que aparece en esta vista es el espacio total que ocupa el fichero fsico y no el espacio utilizado de ese fichero, es decir, que si creamos un datafile de 50Mbytes y acto seguido consultamos esta vista, veremos que ocupa 50Mbytes a pesar de estar totalmente vaco. Este dato indica la cantidad de espacio que ocupa el fichero fsico, la cantidad de informacin que podremos introducir en l.

select tablespace_name, file_name, bytes /1024/1024 from dba_data_files; 

Tenemos tambin la posibilidad de aumentar el tamao de un datafile, es decir, podemos conseguir que un tablespace tenga ms sitio vaco aumentando uno o varios de los ficheros fsicos que lo forman, en lugar de aadindole un nuevo fichero fsico. Para aumentar el tamao de un datafile, podremos utilizar la siguiente instruccin:

alter database datafile '/users/oracle/orcl/nombre_datafile.dbf' resize 100M; 

Esta instruccin deja el datafile indicado con un tamao de 100M, no es que se aumente en 100Mbytes. Esto es fcil de recordar, vale con pensar en que esta instruccin se utiliza tambin para disminuir el tamao de un datafile que en un primer lugar lo creamos excesivamente grande. En esta instruccin no se pueden utilizar nmeros negativos, por lo que parece claro que si ponemos un nmero queremos indicar que ser el tamao que queremos que tenga nuestro datafile. Es importante tener en cuenta que no siempre podemos disminuir el tamao de un datafile. Los motivos sern explicados en temas ms avanzados y tienen que ver con la forma que tiene Oracle de reservar el espacio dentro de los tablespaces y datafiles.

Existe una posibilidad de que Oracle aumente automticamente el tamao de sus datafiles cuando stos se estn llenando, para evitar as la intervencin manual del administrador de la base de datos. Se puede hacer de varias formas, al crear el tablespace con el datafile, al aadir un nuevo datafile al tablespace o incluso en cualquier otro momento.

Para indicar que queremos que un datafile aumente automticamente cuando aadimos un nuevo datafile a un tablespace existente podemos utilizar:

alter tablespace nombre_tablespace add datafile nombre_datafile size 100M 
autoextend on next 250K maxsize 200M; 

Con esta instruccin lo que estamos haciendo es aadir un nuevo datafile llamado nombre_datafile a nuestro tablespace nombre_tablespace con 100Mbytes de tamao. Adems, estamos indicando que queremos que aumente por si mismo cada vez que se llene y que aumente en bloques de 250 Kbytes cada vez. Finalmente le ponemos un tope al tamao total que queremos que tenga nuestro datafile con la instruccin maxsize, por lo que una vez que llegue a 200 Mbytes, si se llena, no volver a crecer ms.

Para indicar en cualquier momento que queremos que un datafile no crezca ms automticamente, podemos utilizar:

alter database datafile nombre_datafile autoextend off; 

Y para indicar en cualquier momento que un determinado datafile crezca automticamente, la instruccin que ejecutaremos ser:

alter database datafile nombre_datafile autoextend on next 1 M maxize 300 M; 

Nota: en esta sentencia, se puede indicar que queremos que crezca indefinidamente, sin tome mximo. Esto lo conseguimos con "maxsize unlimited", pero es muy peligroso porque por algn problema descontrolado, nos puede crecer tanto que nos quedemos si disco en la mquina y luego es muy complicado restaurar un tamao normal.

.Renombrando Datafiles

Existe la posiblidad de cambiarle el nombre a un datafile o de cambiarlo de directorio. Esta operacin no consiste simplemente en ir al sistema operativo y cambiarle el nombre, ya que si hiciramos eso, Oracle no se da cuenta de que hemos movido de sitio un datafile y cuando intenta acceder a informacin de ese datafile muestra mensajes de error indicando que no lo encuentra.

Hay que distinguir entre los datafiles del tablespace SYSTEM y el resto. Los datafiles del tablespace SYSTEM son especiales y no se pueden mover con la misma facilidad que los dems.

Renombrando datafiles que no son del tablespace SYSTEM

En primer lugar, hay que comprobar cual es nombre y el path completo del fichero a mover y el estado en que se encuentra dicho fichero. Para realizar esta comprobacin podemos consultar la vista dba_data_files.

select file_name, status, bytes from dba_data_files; 

En file_name se nos indica cual es el nombre del datafile que nos interesa, con todo su path, y adems vemos cuanto ocupa. El campo status podremos comprobar si el datafile est disponible (available).

Nota: No se debe mover el datafile fsico sin antes poner el tablespace offline.

Hay que sealar que file_name es el nombre que Oracle cree en ese mismo instante que tiene su datafile. Si vamos al sistema operativo y movemos el datafile de sitio, Oracle no es consciente de lo que hemos hecho por lo que si volvemos ha realizar esta select nos seguir dando los mismos valores. Hay que conseguir decirle a Oracle que realmente hemos movido o renombrado el fichero.

Ahora que sabemos cual es el path y nombre completo de nuestro datafile, tenemos que evitar que se realicen operaciones que modifiquen los datos de los objetos de nuestro tablespace, para que as consigamos tener el contenido del datafile esttico. Esto se consigue poniendo el tablespace en estado read only, como se explic en el tema de los tablespaces.

alter tablespace nombre_tablespace read only; 

Para comprobar que realmente est nuestro tablespace en estado read only, podemos consultar la vista dba_tablespaces. En estos momentos, los usuarios de la base de datos, pueden acceder y modificar la informacin de cualquier tablespace que no sea el que estamos manipulando, en el cual, solamente podrn realizar operaciones de lectura, nunca inserciones ni modificaciones ni borrados de datos.

Es en este instante, cuando sabemos que no se est modificando el contenido de nuestro tablespace y, por lo tanto, de nuestro datafile, cuando debemos ir al sistema operativo y hacer una copia de nuestro datafile con el nuevo nombre y la nueva ubicacin. Una vez copiado, comprobamos tambin desde el sistema operativo que el nuevo datafile ocupa el mismo espacio que el antiguo, para estar seguros de que no ha habido ningn problema en la copia.

Hasta ahora, no le hemos indicado a Oracle que hemos movido de ubicacin o de nombre a uno de sus datafiles, para poder indicrselo, debemos asegurarnos que no hay ningn usuario utilizando el tablespace, ni siquiera en modo consulta. Por lo tanto, debemos deshabilitar el tablespace.

alter tablespace nombre_tablespace offline; 

Y una vez deshabilitado, indicamos a Oracle el cambio de nombre o de ubicacin:

alter database rename file 'viejo_datafile_con_path' to 'nuevo_datafile_con_path'; 

En estos momentos Oracle ya sabe que cuando tenga que buscar la informacin de ese datafile debe buscarlo en el nuevo path indicado y con el nuevo nombre. Por lo tanto, si lanzamos la select para ver los datafiles de la base de datos, es decir, la select de la vista dba_data_files, comprobaremos que ha cambiado la informacin antigua por la nueva. Ahora solamente nos queda activar el tablespace y permitir operaciones de lectura y escritura en l.

alter tablespace nombre_tablespace online; 
alter tablespace nombre_tablespace read write; 

Por supuesto, antes de realizar cualquier operacin que implique modificacin de las estructuras de la base de datos, como el renombrado de un datafile, se debe hacer un backup completo de la misma. Una vez realizada la operacin tambin se recomienda hacer un nuevo backup.

Nota: hay que resaltar una vez ms, que no se debe mover el datafile desde el sistema operativo sin haber puesto con anterioridad su tablespace offline. De no ser as, si alguien manipula datos durante el tiempo que tarda en hacerse la copia en el sistema operativo, Oracle detecta problemas e invalida el datafile, lo que va a provocar que haya que poner en prctica alguna estrategia de backup para recuperar el datafile invalidado.

Renombrando datafiles del tablespace SYSTEM

El tablespace SYSTEM es especial, por lo tanto, para manipular sus datafiles, hay que hacerlo tambin de manera especial. Nadie puede trabajar con la base de datos. Por ese motivo, se debe apagar la base de datos y levantarla pero sin abrirla. Los conceptos de apagar la base de datos y levantarla no son objeto de este manual por lo que simplemente se indicarn las instrucciones.

Primeramente se debe apagar o, ms coloquialmente, tirar abajo la base de datos. Esto lo hacemos desde el Server Manager, no desde SqlPlus. Nos conectamos al Server Manager como el usuario administrador y con privilegios especiales:

svrmgrl  
connect internal 
shutdown;

Despus de esperar a que se terminen las transacciones activas, las base de datos se apaga y podemos volver a levantarla, tambin desde el Sever Manager, pero sin abrirla, solamente montndola.

startup mount; 

Con esta instruccin hemos levantado la base de datos pero no la hemos abierto, por lo que nadie, excepto otro administrador, puede estar manipulando sus objetos. Ahora podemos realizar la copia de los datafiles del tablespace SYSTEM al nuevo directorio o con el nuevo nombre. Comprobamos que tanto el fichero nuevo como el antiguo tengan el mismo tamao y a continuacin indicamos a Oracle que hemos movido el datafile de la misma manera que en el apartado anterior:

alter database rename file 'viejo_datafile_con_path' to 'nuevo_datafile_con_path'; 

Finalmente podemos levantar la base de datos para que pueda volver a ser utilizada por todos los usuarios:

alter database open; 

Nota: Despus de comprobar que la base de datos se levanta correctamente, se pueden borrar los ficheros fsicos o datafiles viejos de su ubicacin antigua ya que Oracle est utilizando solamente los nuevos.

.Temas Relacionados

Relacionado directamente con este tema, se pueden estudiar tambin los siguientes temas:

  • Es mejor crear pocos datafiles grandes o muchos pequeos?.
  • Cuntos datafiles creamos para nuestra base de datos?.
  • Se deben crear los datafiles en cualquier disco de nuestra mquina?.
  • Los links de sistema operativo, qu son y cmo nos ayudan a la hora de mover datafiles de ubicacin?.
  • Interesa crear datafiles con autoextent? y con maxsize unlimited?.
  • Cmo conocer el espacio libre que tenemos en el datafile?.
  • Qu es la fragmentacin de los datafiles y tablespaces? Cmo evitarla?.
  • Cmo se puede verificar la escritura de los datafiles?.
  • Cmo se aplica la normativa O.F.A. de Oracle a los datafiles?.

COMPARTE ESTE ARTÍCULO

ENVIAR A UN AMIGO
COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN GOOGLE +
SIGUIENTE ARTÍCULO

¡SÉ EL PRIMERO EN COMENTAR!
Conéctate o Regístrate para dejar tu comentario.