Los datafiles son los ficheros f�sicos 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 ubicaci�n o directorio, el tama�o que va a tener y el tablespace al que va a pertenecer. Adem�s, al crearlos, ocupan ya ese espacio aunque se encuentran totalmente vac�os, es decir, Oracle reserva el espacio para poder ir llen�ndolo poco a poco con posterioridad. Por supuesto, si no hay sitio suficiente para crear un fichero f�sico del tama�o indicado, se producir� un error y no se crear� dicho fichero.
Cuando se van creando objetos en un tablespace, �stos f�sicamente 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 f�sicos o datafiles que forman parte del tablespace. No se puede controlar en qu� fichero f�sico 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 almacenar�n 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 l�gicamente la suma de los tama�os que ocupan los ficheros f�sicos o datafiles que lo forman. Como hemos indicado estos datafiles, al crearlos, est�n totalmente vac�os, 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.
�Creaci�n y Manipulaci�n
La creaci�n 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. Tambi�n se pueden a�adir 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 m�xima. Al a�adir un datafile a un tablespace, se aumenta el espacio disponible en dicho tablespace en tantos megabytes como tenga el datafile nuevo reci�n creado.
Creaci�n 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 a�adirle espacio, lo podemos hacer creando un nuevo datafile y asign�ndoselo 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 informaci�n. Este espacio est� formado f�sicamente por dos ficheros llamados nombre_datafile.dbf y nombre_datafile2.dbf que se encuentran en el directorio /users/oracle/orcl de nuestra m�quina 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 f�sico 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 vac�o. Este dato indica la cantidad de espacio que ocupa el fichero f�sico, la cantidad de informaci�n que podremos introducir en �l.
select tablespace_name, file_name, bytes /1024/1024 from dba_data_files;
Tenemos tambi�n la posibilidad de aumentar el tama�o de un datafile, es decir, podemos conseguir que un tablespace tenga m�s sitio vac�o aumentando uno o varios de los ficheros f�sicos que lo forman, en lugar de a�adi�ndole un nuevo fichero f�sico. Para aumentar el tama�o de un datafile, podremos utilizar la siguiente instrucci�n:
alter database datafile '/users/oracle/orcl/nombre_datafile.dbf' resize 100M;
Esta instrucci�n deja el datafile indicado con un tama�o de 100M, no es que se aumente en 100Mbytes. Esto es f�cil de recordar, vale con pensar en que esta instrucci�n se utiliza tambi�n para disminuir el tama�o de un datafile que en un primer lugar lo creamos excesivamente grande. En esta instrucci�n no se pueden utilizar n�meros negativos, por lo que parece claro que si ponemos un n�mero queremos indicar que ser� el tama�o que queremos que tenga nuestro datafile. Es importante tener en cuenta que no siempre podemos disminuir el tama�o de un datafile. Los motivos ser�n explicados en temas m�s 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 autom�ticamente el tama�o de sus datafiles cuando �stos se est�n llenando, para evitar as� la intervenci�n manual del administrador de la base de datos. Se puede hacer de varias formas, al crear el tablespace con el datafile, al a�adir un nuevo datafile al tablespace o incluso en cualquier otro momento.
Para indicar que queremos que un datafile aumente autom�ticamente cuando a�adimos 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 instrucci�n lo que estamos haciendo es a�adir un nuevo datafile llamado nombre_datafile a nuestro tablespace nombre_tablespace con 100Mbytes de tama�o. Adem�s, 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 tama�o total que queremos que tenga nuestro datafile con la instrucci�n maxsize, por lo que una vez que llegue a 200 Mbytes, si se llena, no volver� a crecer m�s.
Para indicar en cualquier momento que queremos que un datafile no crezca m�s autom�ticamente, podemos utilizar:
alter database datafile nombre_datafile autoextend off;
Y para indicar en cualquier momento que un determinado datafile crezca autom�ticamente, la instrucci�n 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 m�ximo. Esto lo conseguimos con "maxsize unlimited", pero es muy peligroso porque por alg�n problema descontrolado, nos puede crecer tanto que nos quedemos si disco en la m�quina y luego es muy complicado restaurar un tama�o normal.
�Renombrando Datafiles
Existe la posiblidad de cambiarle el nombre a un datafile o de cambiarlo de directorio. Esta operaci�n no consiste simplemente en ir al sistema operativo y cambiarle el nombre, ya que si hici�ramos eso, Oracle no se da cuenta de que hemos movido de sitio un datafile y cuando intenta acceder a informaci�n 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 dem�s.
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 comprobaci�n 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 adem�s vemos cuanto ocupa. El campo status podremos comprobar si el datafile est� disponible (available).
Nota: No se debe mover el datafile f�sico sin antes poner el tablespace offline.
Hay que se�alar 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 est�tico. 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 informaci�n de cualquier tablespace que no sea el que estamos manipulando, en el cual, solamente podr�n 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 ubicaci�n. Una vez copiado, comprobamos tambi�n desde el sistema operativo que el nuevo datafile ocupa el mismo espacio que el antiguo, para estar seguros de que no ha habido ning�n problema en la copia.
Hasta ahora, no le hemos indicado a Oracle que hemos movido de ubicaci�n o de nombre a uno de sus datafiles, para poder indic�rselo, debemos asegurarnos que no hay ning�n 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 ubicaci�n:
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 informaci�n 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 informaci�n 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 operaci�n que implique modificaci�n 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 operaci�n tambi�n se recomienda hacer un nuevo backup.
Nota: hay que resaltar una vez m�s, 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 pr�ctica 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 tambi�n 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 indicar�n las instrucciones.
Primeramente se debe apagar o, m�s 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;
Despu�s de esperar a que se terminen las transacciones activas, las base de datos se apaga y podemos volver a levantarla, tambi�n desde el Sever Manager, pero sin abrirla, solamente mont�ndola.
startup mount;
Con esta instrucci�n 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 tama�o y a continuaci�n 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: Despu�s de comprobar que la base de datos se levanta correctamente, se pueden borrar los ficheros f�sicos o datafiles viejos de su ubicaci�n antigua ya que Oracle est� utilizando solamente los nuevos.
�Temas Relacionados
Relacionado directamente con este tema, se pueden estudiar tambi�n los siguientes temas:
- �Es mejor crear pocos datafiles grandes o muchos peque�os?.
- �Cu�ntos datafiles creamos para nuestra base de datos?.
- �Se deben crear los datafiles en cualquier disco de nuestra m�quina?.
- Los links de sistema operativo, �qu� son y c�mo nos ayudan a la hora de mover datafiles de ubicaci�n?.
- �Interesa crear datafiles con autoextent? �y con maxsize unlimited?.
- �C�mo conocer el espacio libre que tenemos en el datafile?.
- �Qu� es la fragmentaci�n de los datafiles y tablespaces? �C�mo evitarla?.
- �C�mo se puede verificar la escritura de los datafiles?.
- �C�mo se aplica la normativa O.F.A. de Oracle a los datafiles?.