jueves, 28 de julio de 2011

Manejando Datafiles en Oracle

Para ver todos los datafiles de una base de datos:


SQL> desc dba_data_files
Name                                      Null?    Type
----------------------------------- -------- ------------------------
FILE_NAME                                    VARCHAR2(513)
FILE_ID                                      NUMBER
TABLESPACE_NAME                              VARCHAR2(30)
BYTES                                        NUMBER
BLOCKS                                       NUMBER
STATUS                                       VARCHAR2(9)



RELATIVE_FNO                                 NUMBER
AUTOEXTENSIBLE                               VARCHAR2(3)
MAXBYTES                                     NUMBER
MAXBLOCKS                                    NUMBER
INCREMENT_BY                                 NUMBER
USER_BYTES                                   NUMBER
USER_BLOCKS                                  NUMBER
ONLINE_STATUS                                VARCHAR2(7)


Seteamos la pantalla de SQLPLUS

SQL> col file_name format a60
SQL> set linesize 120


SQL> select file_name, file_id, relative_fno from dba_data_files;

FILE_NAME                                                       FILE_ID RELATIVE_FNO
------------------------------------------ ---------- ------------
C:\ORACLE\PRODUCT\10.2.0\ORADATA\DB00PRO\SYSTEM01.DBF                 1            1
C:\ORACLE\PRODUCT\10.2.0\ORADATA\DB00PRO\UNDOTBS01.DBF                2            2
C:\ORACLE\PRODUCT\10.2.0\ORADATA\DB00PRO\SYSAUX01.DBF                 3            3
C:\ORACLE\PRODUCT\10.2.0\ORADATA\DB00PRO\USERS01.DBF                  4            4
C:\ORACLE\PRODUCT\10.2.0\ORADATA\DB00PRO\TSEJEMPLOS1                  5            5
C:\ORACLE\PRODUCT\10.2.0\ORADATA\DB00PRO\PRUEBA1.DBF                  6            6
C:\ORACLE\PRODUCT\10.2.0\ORADATA\DB00PRO\BIG.DBF                      7         1024
C:\ORACLE\PRODUCT\10.2.0\ORADATA\DB00PRO\DF16K.DBF                    8            8

8 rows selected.


Todos los datafile de tipo Big tendran como nro relativo 1024
------------------------------------------------------------------
Saber el nro maximo de datafile que puede tener su base de datos

Parametro: DB_FILES
SQL> show parameter db_files


NAME                                 TYPE        VALUE
------------------------------ ----------- ----------------------
db_files                             integer     200



Para modificar este parametro debemos parar la instancia, modificarlo y volver a arrancar la instancia.
En el Control File tambien hay un parametro que es el MAX DataFILE que tambien influye en la cantidad de datafiles que puede tener la bd


Ubicar los datafiles

Tipos de Datafile
Datafile de Alta disponibilidad
Datafiles de Baja disponibilidad
Datafiles de Solo Lectura
Datafile del Sistema
Redo Log Files


Crear y Modificar Datafiles
Cuando creamos un tablespaces normal o temporal debemos especificar aunque sea un datafile, se puede crear mas de 1 datafile:
Create tablespace....
Create temporary tablespace....


Cuando deseamos añadir un datafile a un tablespaces regular y temporal usamos ésta sentencia:
Se usa cuando queremos ampliar el espacio de un tablespace y no podemos hacer crecer mas los datafiles existentes


Alter tablespace ... add datafile...
Alter tablespace .... add tempfile...


Cuando creamos la base de datos, se crean los datafiles iniciales, sin el datafile del sistema no hay base de datos:

Create Database....

Con esta sentencia se suelen crear datafiles que ya existian pero se perdieron y no hay copias, se recrea el datafile pero está vacio:

Alter Database .... create datafile....

Para crear un datafile hay que ver varias cosas:
Parametro: DB_CREATE_FILE_DEST
Si este parametro está vacio, siempre que creemos un datafiles tendremos que colocar la ruta completa de destino.
Lo mejor es siempre especificar su ruta y nombre al datafile
Tema tamaño del datafile, es decir su capacidad de crecimiento
Cuando lo creamos usamos el parametro size que dirá cual es el tamaño incial de ese datafile y se reservará en el disco ese tamaño. Cuando se llene el datafile, debemos especificar si queremos que crezca él solo o que no admita mas cambios.

Esto se consigue con la clausula AUTEXTEND ON NEXT, cuando un datafile esté lleno y quiera agregar una extension mas, se extenderá tanto como le pusimos
en AUTEXTEND ON NEXT para que pueda ser agregada la extension al datafile.

Tambien tenemos el MAXSIZE que sirve para dar limite al tamaño del datafile, por mas que le demos que crezca solo siempre puede tener un limite,
podemos poner un valor y sino inlimited que indica que puede crecer hasta que le de espacio el disco, osea su limite será la capacidad de disco


AÑADIR UN DATAFILES A UN TABLESPACES EXISTENTE:
PRIMERO:
Para ver qué datafiles tenemos y en qué tablespaces están:


SQL> col tablespace_name format a20
SQL> select file_name, tablespace_name from dba_data_files;


FILE_NAME                                                    TABLESPACE_NAME
--------------------------------------------------------- ---------
C:\ORACLE\PRODUCT\10.2.0\ORADATA\DB00PRO\SYSTEM01.DBF        SYSTEM
C:\ORACLE\PRODUCT\10.2.0\ORADATA\DB00PRO\UNDOTBS01.DBF       UNDOTBS1
C:\ORACLE\PRODUCT\10.2.0\ORADATA\DB00PRO\SYSAUX01.DBF        SYSAUX
C:\ORACLE\PRODUCT\10.2.0\ORADATA\DB00PRO\USERS01.DBF         USERS
C:\ORACLE\PRODUCT\10.2.0\ORADATA\DB00PRO\TSEJEMPLOS1         TSEJEMPLOS
C:\ORACLE\PRODUCT\10.2.0\ORADATA\DB00PRO\PRUEBA1.DBF         TBPRUEBA
C:\ORACLE\PRODUCT\10.2.0\ORADATA\DB00PRO\BIG.DBF             TBBIG
C:\ORACLE\PRODUCT\10.2.0\ORADATA\DB00PRO\DF16K.DBF           TB16KB

8 rows selected.


* Crear un datafile en el tablespace tbprueba
SQL> alter tablespace tbprueba
2    add datafile 'C:\Oracle\product\10.2.0\oradata\db00pro\prueba2.dbf'
3    size 5m
4    autoextend on next 1m
5    maxsize 100m;


-----------------------------------------------------------------
* Una pregunta se plantea, como hacemos crecer manualmente un datafile?

SQL> alter database datafile 'C:\Oracle\product\10.2.0\oradata\db00pro\prueba2.dbf' resize 10m;
Database altered.
------------------------------------------------------------------

* Modificar la disponibilidad de los datafiles.
Todo va a depender si nuestra base de datos esta trabajando en Archive log o no.
Si esta en modo ArchiveLog, no habra drama se puede poner offline:

SQL> alter database datafile ............. offline / online

Si esta en modo NoArchivelog no se puede poner offline a menos que sea para eliminarlo, porque una vez puesto offline no se podra poner online:

SQL> alter database datafile ............. offline for drop

Ejemplo:
Como nuestra base esta en modo archivelog:


SQL> alter database datafile 'C:\Oracle\product\10.2.0\oradata\db00pro\prueba2.dbf'
  2  offline;

Database altered.

SQL> alter database datafile 'C:\Oracle\product\10.2.0\oradata\db00pro\prueba2.dbf'
  2  online;
alter database datafile 'C:\Oracle\product\10.2.0\oradata\db00pro\prueba2.dbf'
*
ERROR at line 1:
ORA-01113: file 9 needs media recovery
ORA-01110: data file 9: 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\DB00PRO\PRUEBA2.DBF'


Como no esta sincronizado el datafile con el resto de los datafile da error y pide que se haga recovery
Para sincronizar un datafile que se quedo offline se hace el recover.

SQL> recover datafile 'C:\Oracle\product\10.2.0\oradata\db00pro\prueba2.dbf';
Media recovery complete.
Volvemos a poner el datafile online:
SQL> alter database datafile 'C:\Oracle\product\10.2.0\oradata\db00pro\prueba2.dbf'
  2  online;

Database altered.

Para tareas admin es recomendable poner TODO el tablespace offline y no solo por datafiles
-------------------------------------------------------------------
RENOMBRAR Y REUBICAR DATAFILES
PASOS:
1) PONER EL TABLESPACE OFFLINE
Si quiero mover un datafile, tengo que saber a que tablespace pertenece

Por ejemplo el datafile 'C:\Oracle\product\10.2.0\oradata\db00pro\prueba2.dbf' pertenece al Tablespace tbprueba


SQL> alter tablespace tbprueba offline;
Tablespace altered.

2) RENOMBRAR O REUBICAR EL ARCHIVO EN EL S.O.
Por ej: muevo desde el explorador el archivo y lo coloco dentro de la carpeta OtroDisco

3) alter tablespace .... rename datafile .... to .....
SQl> alter tablespace tbprueba rename datafile 'C:\Oracle\product\10.2.0\oradata\db00pro\prueba2.dbf' to 'C:\Oracle\product\10.2.0\oradata\db00pro\OtroDisco\prueba2.dbf';
Tablespace altered.
Con esto informo al controlfile que este datafile esta en la sig ubicacion

4) Poner el tablespace online y hacer un backup de la base de datos
SQL> alter tablespace tbprueba online;
Tablespace altered.
NO OLVIDAR DE HACER UNA COPIA DEL CONTROLFILE!!!!!!!!!!!!!

--------------------------------------------------------------

ELIMINAR DATAFILE
alter tablespace .... drop datafile -----> borra los archivos del SO
Alter tablespace ......... datafile .... drop including datafiles -----> sino coloco including no borra lo del SO

Requisitos para borrar:
El datafile tiene que estar abierto, tiene que estar online
Si no está vacío, no se puede borrar, si tiene extensiones no se puede borrar
No puede ser el unico datafile de un tablespace
No puede pertenecer a un tablespace en Read Only
no puede pertenecer al tablespace System ni Sysaux


Hasta aqui una breve reseña del manejo de Datafiles en Oracle, espero les sirva.


Licencia Creative Commons
Manejando Datafiles en Oracle por Clarisa Maman Orfali se encuentra bajo una Licencia Creative Commons Atribución-NoComercial-SinDerivadas 3.0 Unported.

11 comentarios:

  1. Hola Clarisa.
    Muchas gracias por tu aporte muy bueno..
    Y Felicitaciones por la manera tan clara de explicarnos.

    ResponderEliminar
  2. Gracias Juan por tu comentario, ya que cuando me escriben me motivan a seguir aportando mi granito de arena. Saludos.

    ResponderEliminar
  3. Muy buen aporte!! me sirvio mucho y aclaro algunas dudas que tenia..gracias!!!

    ResponderEliminar
  4. muy bien explicado! saludos desde cordoba

    ResponderEliminar
  5. Cómo saber en que tablespace me encuentro actualmente? y que datafile estoy ocupando

    gracias
    miguel

    ResponderEliminar
  6. Hola que tal?
    Puedes verlo en la consulta siguiente:

    SQL> Select default_tablespace, temporary_tablespace
    From user_users;

    Con respecto a que datafile estas ocupando, esto no puedes verlo ya que los datos se distribuyen uniformemente en todos los datafiles que componen un tablespace. Si tu pregunta apunta a saber los datafiles que componen tu tablespace actual, lo puedes ver en esta consulta:

    SQL> Select file_name
    From user_users, dba_data_files
    Where default_tablespace = tablespace_name;

    Espero haber respondido tus dudas!
    Saludos.

    ResponderEliminar
  7. Lo primero, gracias por una información muy útil.
    Ahora me surge una pregunta relativa a los ficheros ".dbf" que existen por ejemplo en c.\oracle\oracledata\orcl pero que no aparecen como resultado de la SQL:
    "select * from dba_data_files"
    De hecho corresponden a esquemas que se han borrado de base de datos.
    ¿Puedo borrarlos desde sistema operativo sin consecuencias para mi base de datos?
    Gracias por adelantado.

    ResponderEliminar
  8. Muchas gracias! Me ha sido muy útil

    ResponderEliminar
  9. Excelente información, saludos

    ResponderEliminar
  10. me podrias decir que sentencia puedo utilizar para mostrar todo el contenido de una tablaspace

    ResponderEliminar
  11. muy bueno todo,muy bien explicado gracias

    ResponderEliminar