Oracle FAQ (Curso DBA UTN)
Preguntas frecuentes
[editar]Esta es una lista de consultas frecuentes referidas a la base de datos Oracle.
Instalacion
[editar]Como saber que bases de datos estan instaladas en un servidor?
[editar]- La forma mas simple es mirar el archivo /etc/oratab (/var/opt/oracle/oratab en Solaris). Alli deberia listarse todas las instancias del equipo, su oracle home, y si se inicial automaticamente con el comando dbstart. Sin embargo, puede ocurrir que el DBA creo una base manualmente y se olvido de agregarla a este archivo. Otra manera es ir, en cada oracle home instalado, al directorio $ORACLE_HOME/dbs y buscar los initSID.ora (o spfileSID.ora).
Como verificar si la base de datos se encuentra configurada en modo ARCHIVELOG o en modo NOARCHIVELOG?
[editar]- Esto es posible verificarlo mediante las siguientes acciones:
- 1 - Comando ARCHIVE LOG LIST
SQL> ARCHIVE LOG LIST
Modo log de la base de datos Modo de No Archivado Archivado automatico Desactivado Destino del archivo C:\oracle\product\10.2.0\RDBMS Secuencia de log en linea mas antigua 3 Secuencia de log actual 5
SQL> ARCHIVE LOG LIST
Modo log de la base de datos Modo de Archivado Archivado automßtico Activado Destino del archivo C:\oracle\product\10.2.0\RDBMS Secuencia de log en lÝnea mßs antigua 3 Siguiente secuencia de log para archivar 5 Secuencia de log actual 5
- 2 - Ver el parametro LOG_MODE en V$DATABASE
SELECT LOG_MODE FROM V$DATABASE;
Donde puedo encontrar la URL para acceder a Enterprise Manager?
[editar]- Se puede consultar el archivo $ORACLE_HOME/install/readme.txt buscando la linea "Enterprise Manager Database Control URL - (ORACLE_SID) :".
- Alli se puede observar la URL correspondiente de la forma http://[HOST]:[PUERTO]/em
- Tambien es posible ver la URL al iniciarlo: export ORACLE_SID=XXX; emctl start dbconsole
Administración
[editar]Como determinar el tamaño general de una base de datos
[editar]La parte mas grande del la base de datos está compuesta por los datafiles. Para saber cuantos megabytes estan asignados a todos los datafiles:
select sum(bytes)/1024/1024 "Meg" from dba_data_files;
Para conocer el tamaño total de los archivos temporales:
select nvl(sum(bytes),0)/1024/1024 "Meg" from dba_temp_files;
Para conocer el tamaño de todos los redo-logs en linea:
select sum(bytes)/1024/1024 "Meg" from sys.v_$log;
Todo lo anterior en una única consulta:
select a.data_size+b.temp_size+c.redo_size "total_size" from ( select sum(bytes) data_size from dba_data_files ) a, ( select nvl(sum(bytes),0) temp_size from dba_temp_files ) b, ( select sum(bytes) redo_size from sys.v_$log ) c;
Otra consulta para concer el tamaño de la base de datos donde "Free space" indica la suma del espacio libre de todos los datafiles:
col "Database Size" format a20 col "Free space" format a20 select round(sum(used.bytes) / 1024 / 1024 ) || ' MB' "Database Size" , round(free.p / 1024 / 1024) || ' MB' "Free space" from (select bytes from v$datafile union all select bytes from v$tempfile union all select bytes from v$log) used , (select sum(bytes) as p from dba_free_space) free group by free.p
Para conocer el espacio libre y el espacio utilizado por cada tablespace de la base de datos:
SELECT Total.name "Tablespace Name", nvl(Free_space, 0) Free_space, nvl(total_space-Free_space, 0) Used_space, total_space FROM (select tablespace_name, sum(bytes/1024/1024) Free_Space from sys.dba_free_space group by tablespace_name ) Free, (select b.name, sum(bytes/1024/1024) TOTAL_SPACE from sys.v_$datafile a, sys.v_$tablespace B where a.ts# = b.ts# group by b.name ) Total WHERE Free.Tablespace_name(+) = Total.name ORDER BY Total.name
Para generar las sentencias ALTER que permitan hacer un RESIZE de los datafiles que tienen espacio libre, es posible utilizar la siguiente consulta:
select 'alter database datafile || file_name || resize ' || ceil( (nvl(hwm,1)*&&blocksize)/1024/1024 ) || 'm;' cmd from dba_data_files a, ( select file_id, max(block_id+blocks-1) hwm from dba_extents group by file_id ) b where a.file_id = b.file_id(+) and ceil( blocks*&&blocksize/1024/1024) - ceil( (nvl(hwm,1)*&&blocksize)/1024/1024 ) > 0
-- Es necesario especificar el tamaño del bloque en en parámetro &&blocksize
SQL Tuning
[editar]Como ver los SQL Profiles activos en una instancia?
[editar]- La siguiente es una lista de todas las vistas con incumbencia en el SQL Advisor:
* DBA_ADVISOR_TASKS * DBA_ADVISOR_FINDINGS * DBA_ADVISOR_RECOMMENDATIONS * DBA_ADVISOR_RATIONALE * DBA_SQLTUNE_STATISTICS * DBA_SQLTUNE_BINDS * DBA_SQLTUNE_PLANS * DBA_SQLSET * DBA_SQLSET_BINDS * DBA_SQLSET_STATEMENTS * DBA_SQLSET_REFERENCES * DBA_SQL_PROFILES * V$SQL * V$SQLAREA * V$ACTIVE_SESSION_HISTORY
¿Cómo uso DBMS_SQLTUNE para analizar un query y qué grants necesito para utilizarlo?
[editar]¿Cómo uso DBMS_UTILITY o ANALYZE para obtener estadísticas de los objetos de la base y qué grants necesito para utilizarlos?
[editar]¿ Cómo son las instrucciones para generar una vista materializada que se refresque automaticamente ante un insert, delete o update de las tablas que la conforman?
[editar]¿ Cuáles son las intrucciones para generar un link entre a distintas bases ?
[editar]- Para crear un Database Link es necesario, primero, tener el privilegio "CREATE DATABASE LINK" o ser un usuario DBA (notar sin embargo que un usuario DBA no puede crear un database link en el esquema de otro usuario).
- Ademas del privilegio es necesario conocer el usuario y contraseña de la base destino a donde deseamos conectarnos, asi como tambien su TNS STRING. El string usualmente es un alias (que tiene que estar definido en el tnsnames.ora del servidor). El comando final es:
SQL> CREATE [PUBLIC] DATABASE LINK <NOMBRE> CONNECT TO <USER> IDENTIFIED BY <PASSWD> USING '<TNSSTRING>';
- Nota: no es recomendable usar PUBLIC database links por cuestiones de seguridad. Cualquier usuario en la base puede ver y utilizar un database link publico.
RMAN
[editar]¿Como puedo duplicar una base de datos en otro servidor?
[editar]- En este ejemplo llamamos PROD y TEST a las bases origen y destino respectivamente. Como primera medida debemos tomar un backup full de la base y archive logs. Vamos a suponer que usamos catalogo de recuperacion y que podemos conectarnos al mismo desde ambos equipos. Es posible realizar el pasaje sin usar catalogo (transfiriendo un backup del control file tomado posteriormente a la toma del backup full).
- Con el backup listo (o en tramite ;) ) realizamos un backup del spfile de PROD:
SQL> create pfile=’/tmp/initPROD.ora’ from spfile;
- En nuestro equipo destino copiamos todo el backup de RMAN respetando la estructura de directorios donde fue tomada. Si no tenemos esa estructura, es posible restaurar recatalogando cada archivo de backup (CATALOG BACKUP PIECE '/new/path/to/backupfile';).
- Luego levantamos la base TEST (nomount) utilizando el pfile generado anteriormente. Recordar reemplazar los parametros del pfile necesarios:
$ cat /tmp/initPROM.ora | sed 's/PROD/TEST/g' > $ORACLE_HOME/dbs/initTEST.ora
- Si queremos restaurar los datafiles en otra estructura de directorios, entonces agregar estas lineas para convertir los nombres de los archivos durante el restore:
db_file_name_convert = ( /u01/oradata/PROD , /u01/oradata/TEST , /u02/oradata/PROD , /u02/oradata/TEST ) log_file_name_convert = ( '/u01/oradata/PROD' , '/u01/oradata/TEST' , '/u02/oradata/PROD' , '/u02/oradata/TEST' )
- Finalmente corremos el RMAN conectado como target a la base origen y como auxiliary a la base destino que queremos crear.
$ rman target sys/passwd@PROD catalog rman/passwd@catalog auxiliary sys/passwd@TEST
- Y finalmente ejecutamos el duplicate:
RMAN> duplicate target database to TEST2;
Vistas
[editar]¿Cuales son las vistas indispensables para la administración diaria de la base de datos?
[editar]ALL_VIEWS; USER_VIEWS;
ALL_OJECTS; USER_OBJECTS;
ALL_CATALOG; USER_CATALOG;
ALL_TABLES; USER_TABLES;
ALL_TAB_COLUMNS; USER_TAB_COLUMNS;
ALL_TAB_COMMENTS; USER_TAB_COMMENTS;
ALL_COL_COMMENTS; USER_COL_COMMENTS;
ALL_INDEXES; USER_INDEXES;
ALL_IND_COLUMNS; USER_IND_COLUMNS;
ALL_SEQUENCES; USER_SEQUENCES;
ALL_SYNONYMS; USER_SYNONYMS;
ALL_DEPENDENCIES; USER_DEPENDENCIES;