Nothing Special   »   [go: up one dir, main page]

Curso DBA9i1 Practicas 2p

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 84

Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

Índice de contenido PRACTICAS TEMA 1.


ARQUITECTURA DE LA BASE DE DATOS...................................................................................2
ARRANQUE Y PARADA DE LA BASE DE DATOS......................................................................17 ARQUITECTURA DE LA BASE DE DATOS.
FICHERO DE CONTROL.................................................................................................................31
FICHEROS REDO LOG....................................................................................................................35
TABLESPACES.................................................................................................................................42 1.1. Comprobar las variables de entorno necesarias para conectarnos a la BD.
ESPACIO DE “UNDO”......................................................................................................................51
USUARIOS, PERFILES, PRIVILEGIOS Y ROLES........................................................................85 1.2. Identificar los procesos que componen instancia.
TRABAJOS (JOBS)..........................................................................................................................118
1.3. Ver el tamaño de la SGA de la BD.
AUDITORÍA....................................................................................................................................132
COPIAS DE SEGURIDAD..............................................................................................................153
1.4. Comprobar valores de parámetros del init relacionados con el tamaño de la SGA.

1.5. Comprobar ficheros que componen la BD y ubicarlos en la estructura OFA.

1.6. Identificar la estructura lógica de la BD: tablespaces, segmentos, extensiones.

1.7. Consultar información sobre la base de datos (v$database) y la instancia (v$instance).

1.8. Localizar el proceso “servidor” asociado a mi sesión (v$process y v$session). ¿Es un servidor dedicado o
compartido?

1.9. ¿Cuanto ocupa la Dictionary cache y la Library cache en tu BD? (v$sgastat)

1.10. Ver la actividad de la Library Cache (v$librarycache).

1.11. Ver las sentencias SQL que guarda la Shared-Pool (v$sqlarea).

1.12. Crear un fichero de autenticación y activar su uso.

1.13. ¿Qué ocurre si “quitamos” la variable LD_LIBRARY_PATH?

1.14. Asignar la variable NLS_LANG para nuestro país y comprobar el cambio en las respuestas de Oracle desde
sqlplus.

1.15. Subir el tamaño de la shared-pool de 8 a 12M y comprobar cómo aumenta el espacio libre.

1.16. Comprobar el funcionamiento de la caché de redolog, como protectora del contenido de la caché de datos.

1.17. Comprobar el funcionamiento de la caché de datos, en lo que se refiere a la mejora del rendimiento cuando se
repite una consulta.

Recursos.
- Máquina: cursos.atica.um.es
- Usuario unix: curso51 a curso70
- Conexión máquina unix: ssh con Secure Shell

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 1 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 2
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

- Bases de datos: CURSO51 a CURSO70 También lo podemos hacer consultando la vista dinámica V$PROCESS (o directamente en V$BGPROCESS),
- Conexión a bd: sqlplus desde sesión unix, usuario “/ as sysdba” en la BD en cuestión:

En primer lugar, si ya no lo está, hay que arrancar la base de datos. En el ejemplo vemos el arranque de la select * from v$process where background is not null;
base de datos CURSOxy, desde el usuario curso01 de la máquina mncs:
/home/DBA9i1/curso01 (CURSOxy)> sqlplus
o bien
SQL*Plus: Release 9.2.0.1.0 - Production on Wed Oct 20 12:39:05 2004
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. select * from v$process a, v$bgprocess b where a.ADDR=b.PADDR;
Enter user-name: / as sysdba
Connected to an idle instance.
Solución:
SQL> startup
ORACLE instance started.
Total System Global Area 34148352 bytes /home/DBA9i1/curso01 (CURSOxy)> ps -ef|grep CURSOxy
Fixed Size 450560 bytes oracle 30205 1 0 09:32 ? 00:00:00 ora_pmon_CURSOxy
Variable Size 29360128 bytes oracle 30207 1 0 09:32 ? 00:00:00 ora_dbw0_CURSOxy
Database Buffers 4194304 bytes oracle 30209 1 0 09:32 ? 00:00:00 ora_lgwr_CURSOxy
Redo Buffers 143360 bytes oracle 30211 1 0 09:32 ? 00:00:00 ora_ckpt_CURSOxy
Database mounted. oracle 30213 1 0 09:32 ? 00:00:00 ora_smon_CURSOxy
Database opened. oracle 30215 1 0 09:32 ? 00:00:00 ora_reco_CURSOxy
curso01 30528 30492 0 12:58 pts/11 00:00:00 grep CURSOxy

SQL> select username,program from v$process


1.1. Comprobar la asignación de variables de entorno necesarias para conectarnos a la where background is not null;
USERNAME PROGRAM
BD. --------------- ------------------------------------------------
curso01 oracle@cursos.atica.um.es (PMON)
Se trata de las variables $ORACLE_HOME, $ORACLE_SID, $LD_LIBRARY_PATH y $PATH. curso01 oracle@cursos.atica.um.es (DBW0)
curso01 oracle@cursos.atica.um.es (LGWR)
Nota: si no asignamos LD_LIBRARY_PATH en Linux, no podremos ejecutar sqlplus, obteniendo un error curso01 oracle@cursos.atica.um.es (CKPT)
similar a: curso01 oracle@cursos.atica.um.es (SMON)
sqlplus: error while loading shared libraries: libclntsh.so: cannot open shared curso01 oracle@cursos.atica.um.es (RECO)
object file: No such file or directory 6 rows selected.

SQL> select name,description from v$process a, v$bgprocess b


Solución: where a.ADDR=b.PADDR;
NAME DESCRIPTION
/home/DBA9i1/curso01 (CURSOxy)> echo $ORACLE_HOME ----- ----------------------------------------------------------------
/u01/app/oracle/product/9.2.0.1.0 PMON process cleanup
/home/DBA9i1/curso01 (CURSOxy)> echo $ORACLE_SID DBW0 db writer process 0
CURSO02 LGWR Redo etc.
/home/DBA9i1/curso01 (CURSOxy)> echo $PATH CKPT checkpoint
/u01/app/oracle/product/9.2.0.1.0/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr SMON System Monitor Process
/bin:/usr/X11R6/bin:/home/DBA9i1/curso02/bin RECO distributed recovery
/home/DBA9i1/curso01 (CURSOxy)> echo $LD_LIBRARY_PATH 6 rows selected.
/u01/app/oracle/product/9.2.0.1.0/lib

1.3. Ver el tamaño de la SGA de la BD.


1.2. Identificar los procesos que componen instancia.
Hay dos vistas dinámicas de la BD que nos dan información sobre el tamaño y la estructura de la SGA:
V$SGA y V$SGASTAT.
Los podemos identificar desde el S.O., por ejemplo, en Unix con el comando "ps -ef" que permite ver todos los
procesos en ejecución en el sistema, filtrando por el nombre de la instancia de BD:
select * from v$sga;
select * from v$sgastat;
ps -ef|grep curso01

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 3 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 4
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

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


Solución: buffer_cache 4194304
log_buffer 133120
SQL> select * from v$sga; shared pool sql area 2343928
NAME VALUE shared pool library cache 1834420
-------------------- ---------- shared pool dictionary cache 1610880
Fixed Size 450560
Variable Size 29360128
Database Buffers 4194304
Redo Buffers 143360 1.4. Comprobar valores de parámetros del init relacionados con el tamaño de la SGA.
SQL> select * from v$sgastat; Los parámetros de inicialización más importantes que afectan al tamaño de la SGA son: shared_pool_size,
POOL NAME BYTES
----------- -------------------------- ---------- db_cache_size, db_block_size, log_buffer, large_pool_size y java_pool_size.
fixed_sga 450560
buffer_cache 4194304
log_buffer 133120
Solución:
shared pool krvxrr 126528
shared pool KGK heap 1836 SQL> show parameter shared_pool_size
shared pool KQR M PO 214032 NAME TYPE VALUE
shared pool KQR S PO 10000 ------------------------------------ ----------- ------------------------------
shared pool KQR S SO 2304 shared_pool_size big integer 8388608
shared pool sql area 2343928
shared pool 1M buffer 2098176 SQL> show parameter db_cache_size
shared pool KGLS heap 287508 NAME TYPE VALUE
shared pool kglsim sga 134144 ------------------------------------ ----------- ------------------------------
shared pool parameters 1680 db_cache_size big integer 4194304
shared pool free memory 5534064
shared pool PL/SQL DIANA 406632 SQL> show parameter db_block_size
shared pool PL/SQL MPCODE 43652 NAME TYPE VALUE
shared pool library cache 1834420 ------------------------------------ ----------- ------------------------------
shared pool miscellaneous 1428188 db_block_size integer 2048
shared pool PLS non-lib hp 1808
shared pool UNDO STAT INFO 52416 SQL> show parameter log_buffer
shared pool joxs heap init 4220 NAME TYPE VALUE
shared pool kgl simulator 563372 ------------------------------------ ----------- ------------------------------
shared pool sim memory hea 71480 log_buffer integer 32768
shared pool trigger inform 64
shared pool Checkpoint queue 113344 SQL> show parameter large_pool_size
shared pool dictionary cache 1610880 NAME TYPE VALUE
shared pool SYSTEM PARAMETERS 96952 ------------------------------------ ----------- ------------------------------
shared pool sim trace entries 98304 large_pool_size big integer 0
shared pool trace events array 72000
shared pool ksm_file2sga region 148652 SQL> show parameter java_pool_size
shared pool network connections 48600 NAME TYPE VALUE
shared pool KSXR receive buffers 1032500 ------------------------------------ ----------- ------------------------------
shared pool character set object 300844 java_pool_size big integer 0
shared pool FileIdentificatonBlock 127884
shared pool KSXR large reply queue 166024
shared pool message pool freequeue 833032 1.5. Comprobar ficheros que componen la BD y ubicarlos en la estructura OFA.
shared pool KSXR pending reply queue 90292
shared pool KSXR pending messages que 840636
shared pool event statistics per sess 162624 Los ficheros que componen la BD los podemos consultar desde el propio S.O. o desde la BD. Desde el S.O.,
shared pool fixed allocation callback 180 y teniendo en cuenta la estructura OFA los encontraremos en /u0?/oradata/CURSOxy, dado que nuestros
shared pool latch nowait fails or sle 68320
41 rows selected. puntos de montaje son /u01, /u02, /u03 y /u04:

SQL> select * from v$sgastat


where name in ('library cache','dictionary cache','sql area',
ls -l /u0?/oradata/CURSOxy
'buffer_cache','log_buffer');
POOL NAME BYTES Podemos localizar cada tipo de fichero (datafile, control y redolog) por la extensión; por ejemplo: dbf, ctl y log.

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 5 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 6
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

¡¡¡ Ojo !!!, ésto no es más que una convención, las extensiones pueden ser otras, o incluso no existir. 1.6. Identificar la estructura lógica de la BD: tablespaces, segmentos, extensiones.
Otra opción es acceder a la información de los ficheros de control desde la propia BD, consultando las vistas En el DD de la BD tenemos vistas que nos permiten comprobar la estructura lógica de la BD:
dinámicas V$DATAFILE, V$TEMPFILE, V$CONTROLFILE y V$LOGFILE: DBA_TABLESPACES, DBA_DATA_FILES, DBA_SEGMENTS y DBA_EXTENTS.

select * from v$datafile; select * from dba_tablespaces;


select * from v$tempfile; select * from dba_datafiles;
select * from v$logfile; select * from dba_tempfiles;
select * from v$controlfile; select * from dba_segments;
select * from dba_extents;
Solución:
/home/DBA9i1/curso01 (CURSOxy)> ls -l /u0?/oradata/$ORACLE_SID
Solución:
/u02/oradata/CURSOxy:
total 279012 SQL> select tablespace_name from dba_tablespaces
-rw-rw---- 1 oracle dba 4384768 oct 20 13:28 ora_control1 order by tablespace_name;
-rw-rw---- 1 oracle dba 272631808 oct 20 13:04 system01.dbf TABLESPACE_NAME
-rw-rw---- 1 oracle dba 4196352 oct 20 09:28 tools01.dbf ------------------------------
-rw-rw---- 1 oracle dba 4196352 oct 20 09:28 users01.dbf SYSTEM
/u03/oradata/CURSOxy: TEMP
total 45376 TOOLS
-rw-rw---- 1 oracle dba 4384768 oct 20 13:28 ora_control2 UNDO_RBS1
-rw-rw---- 1 oracle dba 4196352 oct 20 13:26 rbs01.dbf USERS
-rw-rw---- 1 oracle dba 38799360 oct 20 08:36 temp01.dbf
/u04/oradata/CURSOxy:
total 1524
SQL> select tablespace_name,file_name from dba_data_files
-rw-rw---- 1 oracle dba 512512 oct 20 13:26 redo01.log order by tablespace_name, file_name;
-rw-rw---- 1 oracle dba 512512 oct 20 09:28 redo02.log TABLESPACE_NAME
-rw-rw---- 1 oracle dba 512512 oct 20 09:28 redo03.log ------------------------------
FILE_NAME
SQL> select name from v$datafile; --------------------------------------------------------------------------------
NAME SYSTEM
-------------------------------------------------------------------------------- /home/u02/oradata/CURSOxy/system01.dbf
/home/u02/oradata/CURSOxy/system01.dbf TOOLS
/home/u02/oradata/CURSOxy/tools01.dbf /home/u02/oradata/CURSOxy/tools01.dbf
/home/u03/oradata/CURSOxy/rbs01.dbf UNDO_RBS1
/home/u02/oradata/CURSOxy/users01.dbf /home/u03/oradata/CURSOxy/rbs01.dbf
USERS
SQL> select name from v$tempfile; /home/u02/oradata/CURSOxy/users01.dbf
NAME
-------------------------------------------------------------------------------- SQL> select tablespace_name,file_name from dba_temp_files
/home/u03/oradata/CURSOxy/temp01.dbf order by tablespace_name, file_name;
TABLESPACE_NAME
SQL> select member from v$logfile; ------------------------------
MEMBER FILE_NAME
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
/home/u04/oradata/CURSOxy/redo01.log TEMP
/home/u04/oradata/CURSOxy/redo02.log /home/u03/oradata/CURSOxy/temp01.dbf
/home/u04/oradata/CURSOxy/redo03.log
SQL> select tablespace_name,segment_type,count(*) segmentos
SQL> select name from v$controlfile; from dba_segments
NAME group by tablespace_name,segment_type;
-------------------------------------------------------------------------------- TABLESPACE_NAME SEGMENT_TYPE SEGMENTOS
/home/u02/oradata/CURSOxy/ora_control1 ------------------------------ ------------------ ----------
/home/u03/oradata/CURSOxy/ora_control2 USERS TABLE 1
SYSTEM CACHE 1

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 7 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 8
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

SYSTEM INDEX 442


SYSTEM TABLE 369
SYSTEM CLUSTER 10
1.8. Localizar el proceso “servidor” asociado a mi sesión (v$process y v$session). ¿Es
SYSTEM LOBINDEX 49 un servidor dedicado o compartido?
SYSTEM ROLLBACK 1
SYSTEM LOBSEGMENT 49
SYSTEM INDEX PARTITION 24 Toda sesión tiene dos vertientes: cliente y servidor. En el cliente tenemos el proceso de usuario que inicia la
SYSTEM TABLE PARTITION 27 sesión y en el servidor de base de datos tendremos el proceso que sirve las peticiones de dicha sesión; que
UNDO_RBS1 TYPE2 UNDO 5
11 rows selected. puede ser un servidor dedicado o compartido. En las vistas V$SESSION y V$PROCESS tenemos toda la
información relativa a sesiones y procesos, respectivamente.
SQL> select tablespace_name,segment_type,count(*)
from dba_extents
group by tablespace_name,segment_type;
Solución:
TABLESPACE_NAME SEGMENT_TYPE EXTENSIONES
------------------------------ ------------------ ----------- SQL> show user
USERS TABLE 1 USER is "SYSTEM"
SYSTEM CACHE 1 SQL> select a.SERVER, a.username dbuser,a.OSUSER, a.PROCESS user_process,
SYSTEM INDEX 605 a.machine, a.terminal, a.program user_program,
SYSTEM TABLE 750 b.spid server_process, b.program server_program
SYSTEM CLUSTER 51 from v$session a, v$process b
SYSTEM LOBINDEX 49 where a.username=USER and a.PADDR=b.ADDR;
SYSTEM ROLLBACK 27 SERVER DBUSER OSUSER
SYSTEM LOBSEGMENT 60 --------- ------------------------------ ------------------------------
SYSTEM INDEX PARTITION 24 USER_PROCESS MACHINE
SYSTEM TABLE PARTITION 27 ------------ ----------------------------------------------------------------
UNDO_RBS1 TYPE2 UNDO 10 TERMINAL USER_PROGRAM
11 rows selected. ------------------------------ ------------------------------------------------
SERVER_PROCE SERVER_PROGRAM
------------ ------------------------------------------------
DEDICATED SYSTEM curso01
1.7. Consultar información sobre la base de datos (v$database) y la instancia 30580 cursos.atica.um.es
(v$instance). pts/11 sqlplus@cursos.atica.um.es (TNS V1-V3)
30581 oracle@cursos.atica.um.es (TNS V1-V3)

Podemos obtener información de la base de datos y de la instancia, de las vistas V$DATABASE y SQL> !ps -fp 30581
UID PID PPID C STIME TTY TIME CMD
V$INSTANCE, respectivamente. oracle 30581 30580 0 13:36 ? 00:00:01 oracleCURSOxy
(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq))
Solución:
El proceso servidor asociado a mi sesión es un servidor DEDICADO.
SQL> select name,created,log_mode,checkpoint_change#,open_mode
from v$database;
NAME CREATED LOG_MODE CHECKPOINT_CHANGE# OPEN_MODE 1.9. ¿Cuanto ocupa la Dictionary cache y la Library cache en tu BD? (v$sgastat)
--------- --------- ------------ ------------------ ----------
CURSOxy 13-AUG-04 NOARCHIVELOG 753958 READ WRITE
En la vista V$SGASTAT hay información detallada sobre las partes de la SGA.
SQL> select instance_name,host_name,version,startup_time,
status,archiver,logins,database_status from v$instance;
INSTANCE_NAME Solución:
----------------
HOST_NAME
SQL> select * from v$sgastat where name like '%cache';
----------------------------------------------------------------
POOL NAME BYTES
VERSION STARTUP_T STATUS ARCHIVE LOGINS DATABASE_STATUS
----------- -------------------------- ----------
----------------- --------- ------------ ------- ---------- -----------------
buffer_cache 4194304
CURSOxy
shared pool library cache 1567084
cursos.atica.um.es
shared pool dictionary cache 1610880
9.2.0.1.0 20-OCT-04 OPEN STOPPED ALLOWED ACTIVE

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 9 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 10
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

Solución:
1.10. Ver la actividad de la Library Cache (v$librarycache).
$ orapwd file=$ORACLE_HOME/dbs/orapwCURSOxy password=miclave entries=5
$ chmod g+w orapwCURSOxy
En la vista V$LIBRARYCACHE podemos ver los ratios (en “tantos por uno”).
$ echo "remote_login_passwordfile=EXCLUSIVE" >>
Solución: /u01/app/oracle/admin/CURSOxy/pfile/initCURSOxy.ora
$ echo >> /u01/app/oracle/admin/CURSOxy/pfile/initCURSOxy.ora

SQL> select namespace,gethitratio from v$librarycache; SQL> CONNECT / AS SYSDBA


NAMESPACE GETHITRATIO SQL> SHUTDOWN IMMEDIATE
--------------- ----------- SQL> exit
SQL AREA .806060606
TABLE/PROCEDURE .713888889 SQL> CONNECT SYS AS SYSDBA
BODY 0 Enter password: miclave
TRIGGER 1 SQL> STARTUP
INDEX .46969697
CLUSTER .953020134
OBJECT 1 1.13. ¿Qué ocurre si “quitamos” la variable LD_LIBRARY_PATH?
PIPE 1
JAVA SOURCE 1
JAVA RESOURCE 1 ! Comprobar su valor y dejarla en blanco.
JAVA DATA 1
11 rows selected.
! Ejecutar sqlplus.
! Volver a asignar el valor original y ejecutar de nuevo sqlplus.

1.11. Ver las sentencias SQL que guarda la Shared-Pool (v$sqlarea). Solución:

En la vista V$SQLAREA tenemos el contenido del “área SQL” de la sharedpool. $ echo $LD_LIBRARY_PATH
/u01/app/oracle/product/9.2.0.1.0/lib
$ unset LD_LIBRARY_PATH
Solución: $ sqlplus
sqlplus: error while loading shared libraries: libclntsh.so: cannot open shared
object file: No such file or directory
SQL> select sql_text from v$sqlarea; $ export LD_LIBRARY_PATH=/u01/app/oracle/product/9.2.0.1.0/lib
SQL_TEXT $ sqlplus /nolog
-------------------------------------------------------------------------------- SQL*Plus: Release 9.2.0.1.0 - Production on Wed Feb 2 10:18:27 2005
commit Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
ALTER DATABASE OPEN SQL>
grant sysdba to system
ALTER DATABASE MOUNT
SELECT USER FROM DUAL
select o.owner#,o.obj#,decode(o.linkname,null, decode(u.name,null,'SYS',u.name), 1.14. Asignar la variable NLS_LANG para nuestro país y comprobar el cambio en las respuestas de
o.remoteowner), o.name,o.linkname,o.namespace,o.subname from user$ u, obj$ o whe Oracle desde sqlplus.
re u.user#(+)=o.owner# and o.type#=:1 and not exists (select p_obj# from depende
ncy$ where p_obj# = o.obj#) for update
... ! Comprobar el valor de NLS_LANG y ver la fecha del sistema desde sqlplus.
! Salir de sqlplus y asignar spanish_spain a NLS _LANG.
! Ejecutar sqlplus y comprobar que pide “usuario” y no “username”.
1.12. Crear el fichero de autenticación y activarlo (orapwd). ! Comprobar de nuevo la fecha del sistema desde sqlplus y verificar el cambio de formato.

Los pasos a seguir son: Solución:


! Crear fichero en $ORACLE_HOME/dbs con la utilidad orapwd.
! Añadir el parámetro remote_login_passwordfile al init.ora. $ echo $NLS_LANG
! Parar y arrancar la BD.
$ sqlplus

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 11 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 12
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

Enter user-name: / as sysdba NAME TYPE VALUE


SQL> select sysdate from dual; ------------------------------------ ----------- ------------------------------
SYSDATE shared_pool_size big integer 8388608
---------
02-FEB-05 SQL> select sum(bytes) from v$sgastat where pool='shared pool' and name like
SQL> exit '%free%';
SUM(BYTES)
$ export NLS_LANG=spanish_spain ----------
$ sqlplus 8922756
Introduzca el nombre de usuario: / as sysdba
SQL> select sysdate from dual;
SYSDATE
--------
1.16. Comprobar el funcionamiento de la caché de redolog, como protectora del contenido de la caché
02/02/05 de datos. Para ello iniciaremos una transacción y provocaremos una caída de la BD, comprobando
SQL> exit que al arrancarla de nuevo, se mantendrá la integridad de la misma.

1.15. Subir el tamaño de la shared-pool de 8 a 12M y comprobar cómo aumenta el ! Consultar el contenido y la estructura de la tabla BORRAME del usuario SYSTEM.
! Insertar una fila sin hacer commit y forzar la caída de la BD.
espacio libre.
! Arrancar de nuevo la BD y comprobar que la fila insertada no está (pues no se hizo commit).
! Repetir la inserción de la fila, esta vez haciendo commit; y forzar la caída de la BD otra vez.
! Comprobar el valor de shared_pool_size, así como el espacio libre en la shared_pool.
! Arrancar la BD una vez más y comprobar que ahora la fila si está (ya que se validó la transacción con
! Asignarle 12M y volver a comprobar el valor del parámetro, así como el espacio libre que tiene ahora la
commit).
shared-pool.
! Finalmente, volver a dejar la shared-pool con 8M y comprobar de nuevo los valores anteriores.
Solución:
Solución: SQL> select * from system.borrame;
C1
SQL> show parameter shared_pool_size ----------
NAME TYPE VALUE Primera
------------------------------------ ----------- ------------------------------
shared_pool_size big integer 8388608 SQL> desc system.borrame
Name Null? Type
SQL> select sum(bytes) from v$sgastat where pool='shared pool' and name like ----------------------------------------- -------- ----------------------------
'%free%'; C1 VARCHAR2(10)
SUM(BYTES)
---------- SQL> insert into system.borrame values ('Segunda');
8922756 1 row created.

SQL> alter system set shared_pool_size=12M; SQL> select * from system.borrame;


System altered. C1
----------
SQL> show parameter shared_pool_size Primera
NAME TYPE VALUE Segunda
------------------------------------ ----------- ------------------------------
shared_pool_size big integer 12582912 SQL> shutdown abort
ORACLE instance shut down.
SQL> select sum(bytes) from v$sgastat where pool='shared pool' and name like
'%free%'; SQL> connect / as sysdba
SUM(BYTES) Connected to an idle instance.
----------
13117060 SQL> startup
ORACLE instance started.
SQL> alter system set shared_pool_size=8M; Database mounted.
System altered. Database opened.
SQL> select * from system.borrame;
SQL> show parameter shared_pool_size C1

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 13 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 14
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

---------- Elapsed: 00:00:00.05


Primera

SQL> insert into system.borrame values ('Segunda');


1 row created.

SQL> commit;
Commit complete.

SQL> select * from system.borrame;


C1
----------
Primera
Segunda

SQL> shutdown abort


ORACLE instance shut down.

SQL> connect / as sysdba


Connected to an idle instance.

SQL> startup
ORACLE instance started.
Database mounted.
Database opened.

SQL> select * from system.borrame;


C1
----------
Primera
Segunda

1.17. Comprobar el funcionamiento de la caché de datos, en lo que se refiere a la mejora del


rendimiento cuando se repite una consulta. ¿Por qué la segunda vez que se lanza la misma consulta
tarda menos?

! Activar la medición de tiempos en sqlplus con SET TIMING ON.


! Lanzar la consulta SELECT COUNT(*) FROM IDL_UB1$.
! Volver a lanzar la misma consulta.
! Comprobar que la segunda ejecución tarda mucho menos, ya que los datos ya se cargaron en la caché de
datos al lanzarla la primera vez; y por tanto se acceden directamente en memoria y no en disco.

Solución:
SQL> set timing on
SQL> select count(*) from IDL_UB1$;
COUNT(*)
----------
3798
Elapsed: 00:00:02.65

SQL> r
COUNT(*)
----------
3798

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 15 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 16
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

2.1. Fichero init.ora. Arranque y parada de la BD.


PRACTICAS TEMA 2.
! Localiza el fichero init.ora de tu BD.
ARRANQUE Y PARADA DE LA BASE DE DATOS. La ubicación por defecto es $ORACLE_HOME/dbs; y para el caso de usar OFA,
$ORACLE_BASE/admin/$ORACLE_SID/pfile (que se suele asignar a la variable PFILE).
2.1. Fichero init.ora. Arranque y parada de la BD. /home/CURSO/curso23 (CURSO23)> ls -l
$ORACLE_HOME/dbs/init$ORACLE_SID.ora
! Localizar el fichero init.ora (y spfile si existe) de nuestra BD: lrwxrwxrwx 1 oracle dba 51 24 oct 08:42
! Anotar el valor de los parámetros: db_block_size, shared_pool_size, db_cache_size, log_buffer, processes. /u01/app/oracle/product/9.2.0.1.0/dbs/initCURSO23.ora ->
/u01/app/oracle/admin/CURSO23/pfile/initCURSO23.ora
! Crear fichero /home/CURSO/cursoxy/init01xy.ora, copia del initCURSOxy.ora, y modificar processes=9.
! Arrancar la BD y comprobar valor de parámetros, ¿ha tomado el nuevo valor? ¿por qué?. /home/CURSO/curso23 (CURSO23)> ls -l
! Parar la BD y arrancar con el init01xy.ora. Comprobar parámetro processes. Abrir otra conexión de sqlplus y ver qué $ORACLE_BASE/admin/$ORACLE_SID/pfile/init$ORACLE_SID.ora
ocurre. -rw-r--r-- 1 oracle oinstall 4413 24 oct 08:42
! Crear un spfile a partir del init.ora que hay en $ORACLE_HOME/dbs. ¿Donde está? ¿qué contiene? Modificar el /u01/app/oracle/admin/CURSO23/pfile/initCURSO23.ora
parámetro processes=9 en dicho spfile. Finalmente, dejar processes=10. En este caso el fichero init.ora original está bajo $PFILE y bajo $ORACLE_HOME/dbs hay un enlace a dicho
! Parar la BD de forma normal, estando conectado algún usuario y ver qué ocurre. Y qué sucede cuando todos los fichero.
usuarios se desconectan.
! Repetir la parada de la BD, estando conectado algún usuario, de forma que no espere a que se desconecten.
! Anota el valor de los parámetros: db_block_size, shared_pool_size, db_cache_size,
2.2. Arranque de la BD. Comprobar las diferentes fases en el arranque de la BD.
log_buffer, processes asignados en el init.ora de tu BD.
/home/CURSO/curso23 (CURSO23)> grep db_block_size
! Arranca sólo la instancia (NOMOUNT) y consulta algún parámetro (db_cache_size, shared_pool_size, log_buffer,
$PFILE/init$ORACLE_SID.ora
processes, etc). Qué ocurre al acceder a V$CONTROLFILE. *** db_blcck_size no está asignado, por tanto toma el valor por defecto 2048.
! Ahora monta la BD y vuelve a consultar V$CONTROLFILE. Qué sucede al leer DBA_USERS. /home/CURSO/curso23 (CURSO23)> grep db_cache_size
! Abre la BD en modo READ ONLY y crea una tabla. Activa el modo READ WRITE y vuelve a crear la tabla, $PFILE/init$ORACLE_SID.ora
observando qué sucede. db_cache_size = 1M
/home/CURSO/curso23 (CURSO23)> grep shared_pool_size
$PFILE/init$ORACLE_SID.ora
2.3. Fichero alert.log y ficheros de traza. Diccionario de datos. shared_pool_size = 8M
! Busca y consulta el fichero de alert de la BD. Comprueba el último arranque de la BD. /home/CURSO/curso23 (CURSO23)> grep log_buffer
! Busca si hay ficheros de traza, si son de usuario o de procesos background. Mira el contenido. $PFILE/init$ORACLE_SID.ora
! Saca la lista de vistas del DD y fíjate en los comentarios asociados a cada una. Consulta las columnas de dichas log_buffer = 32768
vistas. /home/CURSO/curso23 (CURSO23)> grep processes
! Consulta las vistas V$INSTANCE, V$DATABASE, V$SESSION, V$PROCESS, DBA_USERS. $PFILE/init$ORACLE_SID.ora
processes = 10

2.4. Impedir las conexiones de usuarios, de modo que el DBA sí pueda conectarse. Intenta conectarte como
scott/tiger. Volver a permitir conexiones de usuarios. ! Crea fichero /home/CURSO/cursoxy/init01xy.ora, copia del initCURSOxy.ora, y modifica
processes= 9.
2.5. Forzar un checkpoint y hacer un insert en la tabla SCOTT.DEPT. Inmediatamente después hacer Puedes editar el init.ora con el vi o también añadir al final del mismo una línea con el nuevo valor del
SHUTDOWN ABORT. Arrancar y comprobar SCOTT.DEPT. Volver a repetir el insert, haciendo commit antes parámetro (este segundo método es el usado en el ejemplo, usa tú el que quieras).
del SHUTDOWN ABORT; y comprueba el contenido de SCOTT.DEPT. /home/CURSO/curso01 (CURSOxy)> cp $PFILE/init$ORACLE_SID.ora
init0101.ora
2.6. Conéctate como SCOTT y haz update sobre DEPT (sin hacer commit). Desde otra sesión, cierra la BD /home/CURSO/curso01 (CURSOxy)> echo processes = 9 >> init0101.ora
/home/CURSO/curso01 (CURSOxy)> grep processes init0101.ora
con SHUTDOWN TRANSACTIONAL. ¿Qué pasa al hacer commit en la sesión de SCOTT? processes = 10
processes = 9
2.7. Conéctate como usuario scott/tiger. Activa la traza y haz una query con una join entre EMP y DEPT
(select a.ename, b.dname from emp a, dept b where a.deptno=b.deptno;). Desactiva la traza y analiza el ! Arranca la BD (sólo si está parada) y comprueba los parámetros anteriores.
fichero que se ha generado con el comando tkprof. SQL> connect / as sysdba

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 17 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 18
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

SQL> startup Introduzca su clave:


Instancia de ORACLE arrancada. ERROR:
Total System Global Area 24670100 bytes ORA-00020: maximum number of processes (9) exceeded
Fixed Size 73620 bytes
Variable Size 7647232 bytes
Database Buffers 16777216 bytes
! Crear un spfile a partir del init.ora que hay en $ORACLE_HOME/dbs. ¿Donde está? ¿qué
Redo Buffers 172032 bytes contiene? Modificar el parámetro processes=9 en dicho spfile. Finalmente, dejar
Base de datos montada.
Base de datos abierta. processes=10.
La ubicación por defecto tanto del init.ora como del spfile, es $ORACLE_HOME/dbs; por tanto crear el spfile
SQL> show parameter processes por defecto es muy sencillo:
NAME TYPE VALUE
------------------------------------ ------- ------------------------------
processes integer 10 SQL> create spfile from pfile;
File created.
SQL> show parameter shared_pool_size SQL> !cat $ORACLE_HOME/dbs/spfile$ORACLE_SID.ora
NAME TYPE VALUE ...
------------------------------------ ------- ------------------------------ *.processes=10
shared_pool_size string 4194304 ...
SQL> show parameter db_cache_size
NAME TYPE VALUE Este comando crea el spfile spfile$ORACLE_SID.ora en $ORACLE_HOME/dbs, de forma que en el siguiente
------------------------------------ ------- ------------------------------ arranque de la BD se usará (en lugar del init.ora). Contiene los mismo parámetros que tenía el init.ora a partir
db_cache_size integer 4194304 del cual se crea. Para modificar un parámetro en el spfile, no podemos editar el fichero (es binario), lo
haremos desde una sesión de la BD:
SQL> show parameter log_buffer
NAME TYPE VALUE Al visualizar el contenido del spfile directamente se pueden ver “caracteres extraños”, pues se trata de un
------------------------------------ ------- ------------------------------ fichero binario.
log_buffer integer 32768
SQL> alter system set processes=9 scope=spfile;
! Para la BD y arranca con el init01xy.ora. Comprueba el parámetro processes. Haz varias System altered.
conexiones con sqlplus y comprueba qué ocurre. SQL> !cat $ORACLE_HOME/dbs/spfile$ORACLE_SID.ora
SQL> shutdown immediate ²kA *.background_dump_dest='/u01/app/oracle/admin/CURSOxy/bdump'
Base de datos cerrada. ...
Base de datos desmontada. *.processes=9
Instancia de ORACLE cerrada. ...
SQL> startup pfile=init0101.ora
Instancia de ORACLE arrancada. *.user_dump_dest='/u01/app/oracle/admin/CURSOxy/udump'
Total System Global Area 22908820 bytes SQL> alter system set processes=10 scope=spfile;
Fixed Size 73620 bytes
Variable Size 5885952 bytes
Database Buffers 16777216 bytes
! Para la BD de forma normal, estando conectado un usuario (además del sys de tu sesión) y
Redo Buffers 172032 bytes mira qué ocurre. Y qué sucede cuando todos los usuarios se desconectan.
Base de datos montada. SQL> shutdown
Base de datos abierta.
SQL> show parameter processes Se queda esperando a que se desconecten los usuarios. Al cerrar la sesión del system que está abierta,
NAME TYPE VALUE termina de cerrar sin problemas. Se puede ver mirando las últimas líneas del alertSID.log.
------------------------------------ ------- ------------------------------ (estando conectado el system, además de la sesión del sys que está cerrando). El fichero de alert está en el
processes integer 9
directorio indicado por el parámetro BACKGROUND_DUMP_DEST; o por defecto en
Después de abrir una sesión como el usuario SYSTEM (además de la que tenía como SYS, $ORACLE_HOME/rdbms/log. Si se usa OFA lo habitual es ubicarlo en
de la conexión como “/ as sysdba”); si intentas abrir una más, da un error, ya que no puede $ORACLE_BASE/admin/$ORACLE_SID/bdump (indicado por la variable BDUMP).
abrir más de 9 procesos (6 background, 1 PSEUDO y 2 sesiones).
/home/CURSO/curso01 (CURSOxy)> sqlplus /home/CURSO/curso01 (CURSOxy)> tail -26f $BDUMP/alert_CURSOxy.log
SQL*Plus: Release 9.2.0.1.0 - Production on Jue oct 26 13:26:18 2004 ...
(c) Copyright 2000 Oracle Corporation. All rights reserved. Shutting down instance (normal)
Introduzca el nombre de usuario: system License high water mark = 3

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 19 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 20
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

(desconectándose el system) ERROR en línea 1:


Thu oct 26 14:08:23 2004 ORA-01219: b. de datos no abierta: solo se permiten consultas en tablas/vistas
ALTER DATABASE CLOSE NORMAL fijas
Thu oct 26 14:08:23 2004
SMON: disabling tx recovery
SMON: disabling cache recovery ! Ahora montar la BD y volver a consultar V$CONTROLFILE. Que sucede al leer
Thu oct 26 14:08:23 2004 DBA_USERS.
Thread 1 closed at log sequence 4199
Thu oct 26 14:08:23 2004 Al montar la BD, se abre el fichero de control leyendo su contenido, de forma que ya sabemos la ubicación y
Completed: ALTER DATABASE CLOSE NORMAL el nombre de cada uno de los ficheros que componen la BD.
Thu oct 26 14:08:23 2004 SQL> alter database mount;
ALTER DATABASE DISMOUNT Base de datos modificada.
Completed: ALTER DATABASE DISMOUNT
archiving is disabled
SQL> select name from v$controlfile;
NAME
! Repite la parada de la BD, estando conectado algún usuario, de forma que no espere a -----------------------------------
/u02/oradata/CURSOxy/control01.ctl
que se desconecten. /u03/oradata/CURSOxy/control02.ctl
SQL> shutdown immediate /u04/oradata/CURSOxy/control03.ctl
Base de datos cerrada.
Base de datos desmontada. SQL> select * from dba_users;
Instancia de ORACLE cerrada. select * from dba_users
*
ERROR en línea 1:
2.2. Arranque de la BD (STARTUP). Comprobar las diferentes fases en el arranque de la ORA-01219: b. de datos no abierta: solo se permiten consultas en
tablas/vistas
BD (nomount, mount y open). fijas

SQL> select count(*) from v$datafile;


! Arrancar sólo la instancia (NOMOUNT) y consultar algún parámetro. Qué ocurre al acceder COUNT(*)
a V$CONTROLFILE y por qué. ----------
5
Al arrancar sólo la instancia, podemos consultar los parámetros del init, ya que este fichero (o el spfile si exite)
se lee justo antes de arrancar la instancia. Pero, al indicar NOMOUNT, todavía no se ha abierto el fichero de SQL> select count(*) from v$logfile;
control, por lo que no tendremos acceso a su contenido. Y mucho menos a las tablas estáticas del DD que COUNT(*)
están almacenadas en la BD, cuyos ficheros tampoco se han abierto. ----------
SQL> startup nomount 3
Instancia de ORACLE arrancada.
Total System Global Area 24670100 bytes ! Cerrar la BD y abrirla en modo READ ONLY, y crear una tabla. Activar modo READ WRITE
Fixed Size 73620 bytes
Variable Size 7647232 bytes y volver a crear la tabla.
Database Buffers 16777216 bytes Para abrir la BD en modo read-only, primero debemos arrancar la BD sin abrirla (MOUNT).
Redo Buffers 172032 bytes SQL> startup mount
Instancia de ORACLE arrancada.
SQL> show parameter processes Total System Global Area 24670100 bytes
NAME TYPE VALUE Fixed Size 73620 bytes
------------------------------------ ------- ------------------------------ Variable Size 7647232 bytes
processes integer 150 Database Buffers 16777216 bytes
Redo Buffers 172032 bytes
SQL> select count(*) from v$controlfile; Base de datos montada.
COUNT(*)
---------- SQL> alter database open read only;
0 Base de datos modificada.
SQL> select * from dba_users; SQL> create table mitabla (c1 varchar2(2));
select * from dba_users create table mitabla (c1 varchar2(2))
* *

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 21 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 22
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

ERROR en línea 1: Undo Segment 3 Onlined


ORA-00604: error producido a nivel 1 de SQL recursivo Successfully onlined Undo Tablespace 2.
ORA-00372: el fichero 1 no puede ser modificado en este momento Tue Nov 2 09:44:59 2004
ORA-01110: fichero de datos 1: '/u02/oradata/CURSOxy/system01.dbf' SMON: enabling tx recovery
Tue Nov 2 09:44:59 2004
SQL> shutdown immediate Database Characterset is WE8ISO8859P15
Base de datos cerrada. replication_dependency_tracking turned off (no async multimaster replication
Base de datos desmontada. found)
Instancia de ORACLE cerrada. Completed: ALTER DATABASE OPEN
Tue Nov 2 09:45:22 2004
SQL> startup ALTER SYSTEM SET processes=20 SCOPE=SPFILE;
Instancia de ORACLE arrancada.
Total System Global Area 24670100 bytes
Fixed Size 73620 bytes ! Busca si hay ficheros de traza, si son de usuario o de procesos background. Mira el
Variable Size 7647232 bytes contenido.
Database Buffers 16777216 bytes
Redo Buffers 172032 bytes Los ficheros de traza de los procesos background y de usuario, se generarán en los directorios indicados en
Base de datos montada. los parámetros BACKGROUND_DUMP_DEST y USER_DUMP_DEST (o en la ubicación por defecto
Base de datos abierta.
$ORACLE_HOME/rdbms/log, si dichos parámetros no están asignados.
SQL> create table mitabla (c1 varchar2(2)); /home/CURSO/curso01 (CURSOxy)> grep -i dest $ORACLE_HOME/dbs/init$ORACLE_SID.ora
Tabla creada. # log_archive_dest = disk$rdbms:[oracle.archive]
background_dump_dest = /u01/app/oracle/admin/CURSOxy/bdump
Como hemos visto, en modo read-only no podemos crear una tabla pues los ficheros de la BD están en modo core_dump_dest = /u01/app/oracle/admin/CURSOxy/cdump
user_dump_dest = /u01/app/oracle/admin/CURSOxy/udump
de sólo lectura. Si abrimos la BD en modo normal (read-write), no tendremos problemas para crear la tabla.
/home/CURSO/curso01 (CURSOxy)> ls -lt /u01/app/oracle/admin/CURSOxy/udump
total 120
-rw-r----- 1 oracle dba 735 nov 2 09:44 curso01_ora_20604.trc
2.3. Fichero alert.log y ficheros de traza. Diccionario de datos. -rw-r----- 1 oracle oinstall 652 nov 2 09:35 curso01_ora_20448.trc
-rw-r----- 1 oracle oinstall 733 oct 29 13:42 curso01_ora_2792.trc
! Busca y consulta el fichero de alert de la BD. Comprueba el último arranque de la BD.
...
/home/CURSO/curso01 (CURSOxy)> ls -l -rw-rw---- 1 oracle dba 735 sep 28 13:21 curso01_ora_25508.trc
$ORACLE_HOME/rdbms/log/alert_$ORACLE_SID.log
ls: /u01/app/oracle/product/9.2.0.1.0/rdbms/log/alert_CURSOxy.log: No existe el
fichero o el directorio /home/CURSO/curso01 (CURSOxy)> ls -lt /u01/app/oracle/admin/CURSOxy/bdump
/home/CURSO/curso01 (CURSOxy)> ls -l $BDUMP/alert_$ORACLE_SID.log total 280
-rw-rw-r-- 1 oracle dba 144537 nov 2 09:45 -rw-rw-r-- 1 oracle dba 144537 nov 2 09:45 alert_CURSOxy.log
/u01/app/oracle/admin/CURSOxy/bdump/alert_CURSOxy.log -rw-r----- 1 oracle oinstall 614 nov 2 09:35 curso01_lgwr_2785.trc
En este caso el fichero de alert no está en su ubicación por defecto, pues se está usando OFA y se ha -rw-r----- 1 oracle oinstall 616 oct 29 13:19 curso01_lgwr_21906.trc
modificado el parámetro BACKGROUND_DUMP_DEST consecuentemente. ...
/home/CURSO/curso01 (CURSOxy)> grep -i background -rw-rw---- 1 oracle dba 657 ago 13 14:10 curso01_ora_13168.trc
$ORACLE_HOME/dbs/init$ORACLE_SID.ora
background_dump_dest = /u01/app/oracle/admin/CURSOxy/bdump Se puede ver el contenido de los ficheros usando el comando “more” de Linux, o “cat” si el fichero e corto.
Se pueden ver las últimas líneas del fichero de alert con el comando “tail” de Linux.
/home/CURSO/curso01 (CURSOxy)> tail -26
/u01/app/oracle/admin/CURSOxy/bdump/alert_$ORACLE_SID.log ! Saca la lista de vistas del DD y fíjate en los comentarios asociados a cada una. Consulta
Tue Nov 2 09:44:58 2004
Database mounted in Exclusive Mode. las columnas de dichas vistas.
Completed: ALTER DATABASE MOUNT SQL> select * from dictionary where table_name='DBA_TABLES';
Tue Nov 2 09:44:58 2004 TABLE_NAME
ALTER DATABASE OPEN ------------------------------
Tue Nov 2 09:44:58 2004 COMMENTS
Thread 1 opened at log sequence 556 --------------------------------------------------------------------------------
Current log# 1 seq# 556 mem# 0: /home/u04/oradata/CURSOxy/redo01.log DBA_TABLES
Successful open of redo thread 1. Description of all relational tables in the database
Tue Nov 2 09:44:58 2004
MTTR advisory is disabled because FAST_START_MTTR_TARGET is not set SQL> select * from dict_columns where table_name='DBA_TABLES';
Tue Nov 2 09:44:58 2004 TABLE_NAME COLUMN_NAME
SMON: enabling cache recovery ------------------------------ ------------------------------
Tue Nov 2 09:44:59 2004 COMMENTS
Undo Segment 1 Onlined --------------------------------------------------------------------------------
Undo Segment 2 Onlined DBA_TABLES DEGREE

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 23 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 24
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

The number of threads per instance for scanning the table


... SQL> connect / as sysdba
DBA_TABLES NUM_FREELIST_BLOCKS Conectado.
The number of blocks on the freelist SQL> alter system disable restricted session;
Sistema modificado.
46 rows selected.
SQL> connect scott/tiger
Conectado.
! Consulta algunas vistas estáticas (como DBA_USERS, DBA_TABLESPACES, DBA_TABLES, SQL> desc dept
DBA_ROLES), y algunas dinámicas (como V$INSTANCE, V$DATABASE, V$SESSION, Nombre Nulo? Tipo
V$PROCESS). ----------------------------------------- -------- ----------------------------
SQL> select username,ACCOUNT_STATUS,CREATED from dba_users; DEPTNO NOT NULL NUMBER(2)
USERNAME ACCOUNT_STATUS CREATED DNAME VARCHAR2(14)
------------------------------ -------------------------------- --------- LOC VARCHAR2(13)
SYS OPEN 13-AUG-04 SQL> disconnect
SYSTEM OPEN 13-AUG-04 Desconectado de Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
OUTLN OPEN 13-AUG-04 With the Partitioning option
DBSNMP OPEN 17-AUG-04 JServer Release 9.2.0.1.0 - Production
SCOTT OPEN 28-SEP-04

SQL> select
rpad(username,14),rpad(osuser,10),rpad(machine,15),rpad(terminal,10),
rpad(program,27) 2.5. Forzar un checkpoint y hacer un insert en la tabla SCOTT.DEPT. Inmediatamente después hacer
from v$session where username is not null SHUTDOWN ABORT. Arrancar y comprobar SCOTT.DEPT. Volver a repetir el insert, haciendo commit
order by username;
RPAD(USERNAME, RPAD(OSUSE RPAD(MACHINE,15 RPAD(TERMI RPAD(PROGRAM,27) antes del SHUTDOWN ABORT; y comprueba el contenido de SCOTT.DEPT.
-------------- ---------- --------------- ---------- ---------------------------
SYSTEM juanlu cursos.atica.um pts/2 sqlplus@cursos.atica.um.es Se trata de comprobar los mecanismos de recuperación de la instancia. Vamos a insertar una fila en
SCOTT.DEPT y a simular una caída de la BD con SHUTDOWN ABORT. Comprobaremos que, como no se
hizo COMMIT, los datos insertados no están, al arrancar de nuevo la BD. Si repetimos el experimento
2.4. Impedir las conexiones de usuarios, de modo que el DBA sí pueda conectarse.
haciendo COMMIT después del INSERT, comprobaremos que la información no se pierde; ya que al hacer
Intenta conectarte como scott/tiger. Volver a permitir conexiones de usuarios. commit estamos forzando el volcado a disco de los buffers redolog, que serán leídos en el siguiente
arranque al recuperarse la instancia.
En primer lugar vamos a parar la BD y a arrancarla en modo RESTRICT. Después intentaremos la
conexión como el usuario SCOTT. Finalmente desactivaremos el modo RESTRICT y podremos Recuerda que el checkpoint es el evento que fuerza la escritura de los bloques de datos q hay en la SGA, a
conectarnos como SCOTT. disco, por parte del DBWR (previo volcado de los buffer redo log, por parte del LGWR).
SQL> connect / as sysdba SQL> connect / as sysdba
Connected. Conectado.
SQL> shutdown immediate SQL> alter system checkpoint;
Database closed. Sistema modificado.
Database dismounted. SQL> insert into scott.dept values (99,'FORMACION','MURCIA');
ORACLE instance shut down. 1 fila creada.
SQL> SHUTDOWN ABORT
SQL> startup restrict Instancia de ORACLE cerrada.
Instancia de ORACLE arrancada.
Total System Global Area 24670100 bytes SQL> startup
Fixed Size 73620 bytes Instancia de ORACLE arrancada.
Variable Size 7647232 bytes ...
Database Buffers 16777216 bytes Base de datos abierta.
Redo Buffers 172032 bytes
Base de datos montada. SQL> select * from scott.dept;
Base de datos abierta. DEPTNO DNAME LOC
---------- -------------- -------------
SQL> connect scott/tiger 10 ACCOUNTING NEW YORK
ERROR: 20 RESEARCH DALLAS
ORA-01035: ORACLE only available to users with RESTRICTED SESSION privilege 30 SALES CHICAGO
Aviso: Ya no est conectado a ORACLE!

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 25 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 26
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

40 OPERATIONS BOSTON
SQL> commit;
SQL> alter system checkpoint; Validación terminada.
Sistema modificado.
SQL> insert into scott.dept values (99,'FORMACION','MURCIA'); SQL> !tail -10 $BDUMP/alert_CURSO22.log
1 fila creada. Mon Apr 26 09:24:55 2004
SQL> commit; SMON: enabling cache recovery
Validación terminada. SMON: enabling tx recovery
SQL> shutdown abort Mon Apr 26 09:24:57 2004
Instancia de ORACLE cerrada. Completed: ALTER DATABASE OPEN
Mon Apr 26 09:34:42 2004
SQL> startup Shutting down instance (transactional)
Instancia de ORACLE arrancada. Mon Apr 26 09:35:12 2004
Total System Global Area 24670100 bytes All transactions complete. Performing immediate shutdown
Fixed Size 73620 bytes License high water mark = 7
Variable Size 7647232 bytes
Database Buffers 16777216 bytes SQL> !tail -10 $BDUMP/alert_CURSO22.log
Redo Buffers 172032 bytes SMON: disabling tx recovery
Base de datos montada. SMON: disabling cache recovery
Base de datos abierta. Mon Apr 26 09:36:18 2004
Thread 1 closed at log sequence 191
SQL> select * from scott.dept; Mon Apr 26 09:36:18 2004
DEPTNO DNAME LOC Completed: ALTER DATABASE CLOSE NORMAL
---------- -------------- ------------- Mon Apr 26 09:36:18 2004
10 ACCOUNTING NEW YORK ALTER DATABASE DISMOUNT
20 RESEARCH DALLAS Completed: ALTER DATABASE DISMOUNT
30 SALES CHICAGO archiving is disabled
40 OPERATIONS BOSTON
99 FORMACION MURCIA (SESION DEL SYS)
Base de datos cerrada.
Base de datos desmontada.
2.6. Conéctate como SCOTT y haz update sobre DEPT (sin hacer commit). Desde otra sesión, cierra la Instancia de ORACLE cerrada.
BD con SHUTDOWN TRANSACTIONAL. ¿Qué pasa al hacer commit en la sesión de SCOTT?
2.7. Conéctate como usuario scott/tiger. Activa la traza y haz una query con una join entre EMP y DEPT
Recuerda que el SHUTDOWN TRANSACTIONAL espera a que terminen todas las transacciones en curso; (select a.ename, b.dname from emp a, dept b where a.deptno=b.deptno;). Desactiva la traza y
por tanto esperará hasta que SCOTT haga commit. Una vez que SCOTT ha hecho commit, el shutdown
analiza el fichero que se ha generado con el comando tkprof.
cerrará su sesión al cabo de unos minutos.

(SESION DE SCOTT) Desde sqlplus, el usuario conectado (p.e. SCOTT) puede activar la traza con ALTER SESSION SET
SQL> connect scott/tiger SQL_TRACE=TRUE. Esto se hace justamente antes de lanzar las sentencias que se quieren analizar. Una
Conectado.
SQL> update dept set deptno=88 where deptno=99;
vez terminadas las sentencias en cuestión, se vuelve a desactivar la traza con ALTER SESSION SET
1 fila actualizada. SQL_TRACE=FALSE. El fichero de traza se generará en el directorio indicado por el parámetro
USER_DUMP_DEST, que por defecto es $ORACLE_HOME/rdbms/log, y en caso de usar OFA será el
(SESION DEL SYS)
SQL> CONNECT / AS SYSDBA directorio $UDUMP, y será el fichero más reciente generado.
Conectado.
SQL> shutdown transactional SQL> connect scott/tiger
Conectado.
(SESION DE SCOTT) SQL> alter session set sql_trace=true;
SQL> !tail -7 $BDUMP/alert_CURSO22.log Sesión modificada.
Mon Apr 26 09:24:55 2004 SQL> select a.ename, b.dname from emp a, dept b where a.deptno=b.deptno;
SMON: enabling cache recovery ENAME DNAME
SMON: enabling tx recovery ---------- --------------
Mon Apr 26 09:24:57 2004 SMITH RESEARCH
Completed: ALTER DATABASE OPEN ...
Mon Apr 26 09:34:42 2004 MILLER ACCOUNTING
Shutting down instance (transactional) 14 filas seleccionadas.

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 27 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 28
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

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


SQL> alter session set sql_trace=false; Parse 13 0.00 0.00 0 0 0 0
Sesión modificada. Execute 23 0.00 0.00 0 0 0 0
Fetch 45 0.00 0.00 2 73 0 32
SQL> !ls -lt $UDUMP|head -2 ------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 24 total 81 0.00 0.00 2 73 0 32
-rw-r----- 1 oracle dba 11435 26 Oct 09:55 ora_150400_curso22.trc ...
SQL> exit

cursos (CURSO22):/home/CURSO/curso22 > tkprof $UDUMP/ora_150400_cursoxy.trc


salida_traza.txt explain=scott/tiger sys=no
TKPROF: Release 9.2.0.1.0 - Production on Lun Oct 26 09:56:31 2004
(c) Copyright 2000 Oracle Corporation. All rights reserved.

cursos (CURSO22):/home/CURSO/curso22 > cat salida_traza.txt


...
********************************************************************************
count = number of times OCI procedure was executed
cpu = cpu time in seconds executing
elapsed = elapsed time in seconds executing
disk = number of physical reads of buffers from disk
query = number of buffers gotten for consistent read
current = number of buffers gotten in current mode (usually for update)
rows = number of rows processed by the fetch or execute call
********************************************************************************
...
********************************************************************************
select a.ename, b.dname
from
emp a, dept b where a.deptno=b.deptno
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 2 0 2 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 2 0.00 0.00 3 18 4 14
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 4 0.00 0.00 5 18 6 14
...
Optimizer goal: CHOOSE
...
Rows Execution Plan
------- ---------------------------------------------------
0 SELECT STATEMENT GOAL: CHOOSE
14 NESTED LOOPS
15 TABLE ACCESS (FULL) OF 'EMP'
14 TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'
28 INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)
********************************************************************************
...
********************************************************************************
OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 2 0.00 0.00 2 0 2 0
Execute 3 0.00 0.00 0 0 0 0
Fetch 2 0.00 0.00 3 18 4 14
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 7 0.00 0.00 5 18 6 14
...
OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS
call count cpu elapsed disk query current rows

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 29 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 30
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

3.1.Localizar el fichero de control desde el SO y desde la BD.


PRACTICAS TEMA 3. ! En primer lugar buscaremos los ficheros desde el SO. El nombre no tiene por qué seguir un patrón
determinado, aunque en general se les suele poner la extensión “ctl” o se les incluye la palabra “control” en
FICHERO DE CONTROL. el nombre.
/home/CURSO/curso01 (CURSOxy)> ls -lat
/u0?/oradata/$ORACLE_SID/*control*
-rw-rw---- 1 oracle dba 4384768 nov 4 12:36 /u02/oradata/CURSOxy/ora_control1
-rw-rw---- 1 oracle dba 4384768 nov 4 12:36 /u03/oradata/CURSOxy/ora_control2
o Localizar el fichero de control desde el S.O y desde la propia BD. /home/CURSO/curso01 (CURSOxy)> ls -lat
/u0?/oradata/$ORACLE_SID/*.ctl
ls: /u0?/oradata/CURSOxy/*.ctl: No existe el fichero o el directorio
o Consultar la información de la BD relativa al contenido del fichero de control.
Forzar un checkpoint y volver a consultar. Consultar los registros que contiene el ! Ahora veremos como obtener la misma información desde la propia BD, de forma más directa.
fichero de control. SQL> select name from v$controlfile;
NAME
--------------------------------------------------------------------------------
/home/u02/oradata/CURSOxy/ora_control1
o Añade una copia al fichero de control de la BD en /home/u03/oradata/CURSOxy/ora_control2
“/home/u04/oradata/$ORACLE_SID”.

o Sacar una copia de seguridad del fichero de control. 3.2. Consultar la información de la BD relativa al contenido del fichero de control. Forzar
un checkpoint y volver a consultar. Consultar los registros que contiene el fichero de
control.

! En la vista V$DATABASE hay una serie de columnas, con el prefijo CONTROLFILE, que nos dan
información sobre el fichero de control, por ejemplo la fecha de creación del fichero de control
(CONTROLFILE_CREATED) o la última vez que se actualizó la copia del fichero de control
(!"#$%"&'(&)*$(+)).
SQL> select CONTROLFILE_TYPE type,
to_char(CONTROLFILE_CREATED,'dd/mm/yyyy hh24:mi') created,
CONTROLFILE_SEQUENCE# secuence,CONTROLFILE_CHANGE# change,
to_char(CONTROLFILE_TIME,'dd/mm/yyyy hh24:mi') time
from v$database
TYPE CREATED SECUENCE CHANGE TIME
------- ---------------- ---------- ---------- ----------------
CURRENT 13/08/2004 14:15 1805 1115572 04/11/2004 12:47

! Si hacemos un checkpoint, que se registra en el fichero de control, se actualiza la columna


V$DATABASE.CONTROLFILE_SEQUENCE#.
SQL> alter system checkpoint;
Sistema modificado.

SQL> select CONTROLFILE_TYPE type,


to_char(CONTROLFILE_CREATED,'dd/mm/yyyy hh24:mi') created,
CONTROLFILE_SEQUENCE# secuence,CONTROLFILE_CHANGE# change,
to_char(CONTROLFILE_TIME,'dd/mm/yyyy hh24:mi') time
from v$database
TYPE CREATED SECUENCE CHANGE TIME

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 31 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 32
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

------- ---------------- ---------- ---------- ---------------- /home/CURSO/curso01 (CURSOxy)> vi initxy02.ora


CURRENT 13/08/2004 14:15 1806 1115772 04/11/2004 12:57 control_files = (/home/u02/oradata/CURSOxy/ora_control1,
/home/u03/oradata/CURSOxy/ora_control2, /home/u04/oradata/CURSOxy/ora_control3)
En la vista V$CONTROLFILE_RECORD_SECTION se pueden ver las distintas secciones que componen el
fichero de control y los registros de los que consta cada una; así como el número de registros de cada tipo SQL> startup pfile=init0102.ora
ORACLE instance started.
usados hasta el momento. Total System Global Area 34148352 bytes
SQL> select TYPE,RECORDS_USED,RECORDS_TOTAL Fixed Size 450560 bytes
from v$controlfile_record_section; Variable Size 29360128 bytes
TYPE RECORDS_USED RECORDS_TOTAL Database Buffers 4194304 bytes
-------------------- ------------ ------------- Redo Buffers 143360 bytes
DATABASE 1 1 SQL> select name from v$controlfile;
CKPT PROGRESS 0 11 NAME
REDO THREAD 1 8 --------------------------------------------------------------------------------
REDO LOG 3 32 /home/u02/oradata/CURSOxy/ora_control1
DATAFILE 4 254 /home/u03/oradata/CURSOxy/ora_control2
FILENAME 8 319 /home/u04/oradata/CURSOxy/ora_control3
TABLESPACE 5 254
TEMPORARY FILENAME 1 254
RMAN CONFIGURATION 0 50 3.4. Sacar una copia de seguridad del fichero de control.
LOG HISTORY 560 843
OFFLINE RANGE 0 289
ARCHIVED LOG 0 800
BACKUP SET 0 303 ! En primer lugar sacaremos una copia sobre un fichero de traza, que contendrá las sentecias sql
BACKUP PIECE 0 508 necesarias para crear un nuevo fichero de control. Como estamos usando OFA la traza, al ser de usuario,
BACKUP DATAFILE 0 523
BACKUP REDOLOG 0 79 se generará en el directorio $ORACLE_BASE/admin/$ORACLE_SID/udump, posiblemente apuntado por
DATAFILE COPY 0 509 la variable UDUMP.
BACKUP CORRUPTION 0 276 SQL> alter database backup controlfile to trace;
COPY CORRUPTION 0 303 Base de datos modificada.
DELETED OBJECT 0 809 SQL> !ls -lt $UDUMP|head -2
PROXY COPY 0 572 total 140
BACKUP SPFILE 0 56 -rw-r----- 1 oracle dba 4851 nov 4 13:32 curso01_ora_31562.trc
DATABASE INCARNATION 1 36 SQL> !more $UDUMP/curso01_ora_31562.trc
23 rows selected.
! Después sacaremos una copia binaria del fichero de control que sólo utilizaremos en caso de emergencia
3.3. Añade una copia al fichero de control de la BD en (de perder el fichero de control y sus copias), para arrancar la BD y, posteriormente crear otro fichero de
control nuevo.
“/home/u04/oradata/$ORACLE_SID”. SQL> alter database backup controlfile to
'/home/u04/oradata/CURSOxy/ora_control4';
Base de datos modificada.
! Tenemos que cerrar la BD antes de crear la copia del fichero de control. Después, copiamos el fichero de
control en /home/u04/oradata/$ORACLE_SID. Añadimos el nuevo fichero en el parámetro control_files del SQL> select name from v$controlfile;
NAME
init. Arrancamos la BD. Y finalmente, comprobamos que el nuevo fichero aparezca en V$CONTROLFILE. --------------------------------------------------------------------------------
SQL> shutdown immediate /home/u02/oradata/CURSOxy/ora_control1.ctl
Base de datos cerrada. /home/u03/oradata/CURSOxy/ora_control2.ctl
Base de datos desmontada. /home/u04/oradata/CURSOxy/ora_control3.ctl
Instancia de ORACLE cerrada.
SQL> !ls -lt /u0?/oradata/$ORACLE_SID/*control*
/home/CURSO/curso01 (CURSOxy)> cp -p /home/u02/oradata/CURSOxy/ora_control1 -rw-rw---- 1 oracle dba 4384768 nov 4 13:40 /u02/oradata/CURSOxy/ora_control1
/home/u04/oradata/CURSOxy/ora_control3 -rw-rw---- 1 oracle dba 4384768 nov 4 13:40 /u03/oradata/CURSOxy/ora_control2
¡¡¡ OJO !!! hay que usr la opción “-p” para mantener los permisos del -rw-rw---- 1 curso01 dba 4384768 nov 4 13:40 /u04/oradata/CURSOxy/ora_control3
original. -rw-r----- 1 oracle dba 4384768 nov 4 13:39 /u04/oradata/CURSOxy/ora_control4
/home/CURSO/curso01 (CURSOxy)> ls -l /home/u04/oradata/CURSOxy/ora_control3
-rw-rw---- 1 curso01 dba 4384768 nov 4 13:15
/home/u04/oradata/CURSOxy/ora_control3tl
/home/CURSO/curso01 (CURSOxy)> cp $ORACLE_HOME/dbs/init$ORACLE_SID.ora
initxy02.ora

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 33 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 34
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

4.1. Localizar los ficheros redolog de la BD. ¿Cuántos grupos hay y cuántos miembros
PRACTICAS TEMA 4. tiene cada grupo? ¿están correctamente distribuidos?.

FICHEROS REDO LOG. Hay 3 grupos con 1 miembro cada uno. Están todos en el disco /u04. Podría ser interesante añadir un
miembro a cada grupo en el disco /u03.

/home/CURSO/curso01 (CURSOxy)> ls -lt /u0?/oradata/$ORACLE_SID/*.log


-rw-rw---- 1 oracle dba 512512 nov 8 11:18 /u04/oradata/CURSOxy/redo02.log
-rw-rw---- 1 oracle dba 512512 nov 8 09:32 /u04/oradata/CURSOxy/redo01.log
o Localizar los ficheros redolog de la BD. ¿Cuántos grupos hay y cuántos -rw-rw---- 1 oracle dba 512512 nov 8 09:32 /u04/oradata/CURSOxy/redo03.log
miembros tiene cada grupo? ¿están correctamente distribuidos?. SQL> select member from v$logfile;
MEMBER
--------------------------------------------------------------------------------
o Comprobar el fichero redo log activo. ¿Qué ocurre al forzar un "log switch"? ¿y /home/u04/oradata/CURSOxy/redo01.log
al forzar un checkpoint? /home/u04/oradata/CURSOxy/redo02.log
/home/u04/oradata/CURSOxy/redo03.log

o Añade un miembro más a cada grupo: /u03/oradata/$ORACLE_SID/redo11.log,


4.2. Comprobar el fichero redo log activo. ¿Qué ocurre al forzar un "log switch"? ¿y al
/u03/oradata/$ORACLE_SID/redo12.log,
/u03/oradata/$ORACLE_SID/redo13.log. forzar un checkpoint?

El fichero redolog activo nos los muestra V$LOG, con status CURRENT.
o Añade un grupo más (grupo 4), con dos miembros de 1M:
/u03/oradata/$ORACLE_SID/redo04.log y SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
/u04/oradata/$ORACLE_SID/redo14.log. Añade 2 grupos más (grupo 5 y 6), con ---------- ---------- ---------- ---------- ---------- --- ----------------
las mismas características. FIRST_CHANGE# FIRST_TIM
------------- ---------
1 1 562 512000 1 NO INACTIVE
o Elimina los miembros del grupo 1, de uno en uno. ¿Qué ocurre al eliminar el 1146778 05-NOV-04
2 1 563 512000 1 NO CURRENT
último?. Borrar los grupos 1, 2 y 3. ¡¡¡ Ojo con borrar el redo log activo !!! 1175473 08-NOV-04
3 1 561 512000 1 NO INACTIVE
1112763 04-NOV-04
o Cambiar el nombre de los miembros de redo de los grupos 4, 5 y 6; a
redo1a.log, redo1b.log, redo2a.log, redo2b.log, redo3a.log, redo3b.log. Al forzar un “log switch”, se provoca el cambio de fichero redo log (current)

SQL> ALTER SYSTEM SWITCH LOGFILE;


Sistema modificado.

SQL> SELECT * FROM V$LOG;


GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ----------------
FIRST_CHANGE# FIRST_TIM
------------- ---------
1 1 562 512000 1 NO INACTIVE
1146778 05-NOV-04
2 1 563 512000 1 NO ACTIVE
1175473 08-NOV-04
3 1 564 512000 1 NO CURRENT
1178187 08-NOV-04
Un Checkpoint NO supone un “log switch”. Podemos consultar el avance de los checkpoints en
V$DATABASE.CONTROLFILE_SECUENCE#.

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 35 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 36
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

SQL> select CONTROLFILE_SEQUENCE#,checkpoint_change#,LOG_MODE from v$database; SQL> alter database add logfile group 4
CONTROLFILE_SEQUENCE# CHECKPOINT_CHANGE# LOG_MODE ('/u03/oradata/CURSOxy/redo04.log',
--------------------- ------------------ ------------ '/u04/oradata/CURSOxy/redo14.log') size 1M;
1860 1178372 NOARCHIVELOG Base de datos modificada.
SQL> alter system checkpoint; SQL> alter database add logfile group 5
Sistema modificado.
('/u03/oradata/CURSOxy/redo05.log',
SQL> select CONTROLFILE_SEQUENCE#,checkpoint_change#,LOG_MODE from v$database; '/u04/oradata/CURSOxy/redo15.log') size 1M;
CONTROLFILE_SEQUENCE# CHECKPOINT_CHANGE# LOG_MODE Base de datos modificada.
--------------------- ------------------ ------------
1861 1178432 NOARCHIVELOG SQL> alter database add logfile group 6
('/u03/oradata/CURSOxy/redo06.log',
'/u04/oradata/CURSOxy/redo16.log') size 1M;
Base de datos modificada.
4.3. Añade un miembro más a cada grupo: “/u03/oradata/$ORACLE_SID/redo11.log”, SQL> select member from v$logfile;
“/u03/oradata/$ORACLE_SID/redo12.log”, “/u03/oradata/$ORACLE_SID/redo13.log”. MEMBER
--------------------------------------------------------------------------------
/home/u04/oradata/CURSOxy/redo01.log
Hasta ahora había 3 grupos redolog, con 1 miembro cada uno bajo /u04. Al añadir un miembro a cada grupo /home/u04/oradata/CURSOxy/redo02.log
/home/u04/oradata/CURSOxy/redo03.log
bajo /u03, pasarán a tener 2 miembros cada uno (consultar V$LOG y V$LOGFILE), en discos distintos. /u03/oradata/CURSOxy/redo11.log
/u03/oradata/CURSOxy/redo12.log
SQL> alter database add logfile member /u03/oradata/CURSOxy/redo13.log
'/u03/oradata/CURSOxy/redo11.log' to group 1, /u03/oradata/CURSOxy/redo04.log
'/u03/oradata/CURSOxy/redo12.log' to group 2, /u04/oradata/CURSOxy/redo14.log
'/u03/oradata/CURSOxy/redo13.log' to group 3; /u03/oradata/CURSOxy/redo05.log
Base de datos modificada. /u04/oradata/CURSOxy/redo15.log
/u03/oradata/CURSOxy/redo06.log
SQL> select member from v$logfile; /u04/oradata/CURSOxy/redo16.log
MEMBER 12 filas seleccionadas.
--------------------------------------------------------------------------------
/home/u04/oradata/CURSOxy/redo01.log SQL> select GROUP#,MEMBERS,STATUS from v$log;
/home/u04/oradata/CURSOxy/redo02.log GROUP# MEMBERS STATUS
/home/u04/oradata/CURSOxy/redo03.log ---------- ---------- ----------------
/u03/oradata/CURSOxy/redo11.log 1 2 INACTIVE
/u03/oradata/CURSOxy/redo12.log 2 2 INACTIVE
/u03/oradata/CURSOxy/redo13.log 3 2 CURRENT
6 filas seleccionadas. 4 2 UNUSED
5 2 UNUSED
SQL> select GROUP#,MEMBERS,STATUS from v$log; 6 2 UNUSED
GROUP# MEMBERS STATUS 6 filas seleccionadas.
---------- ---------- ----------------
1 2 INACTIVE Finalmente haremos seis “log switch” para que se usen los nuevos redolog que hemos creado:
2 2 INACTIVE
SQL> alter system switch logfile;
3 2 CURRENT System altered.
Repetirlo seis veces.
4.4. Añade un grupo más (grupo 4), con dos miembros de 1M:
/u03/oradata/$ORACLE_SID/redo04.log y /u04/oradata/$ORACLE_SID/redo14.log. Añade
4.5. Elimina los miembros del grupo 1, de uno en uno. ¿Qué ocurre al eliminar el
2 grupos más (grupo 5 y 6), con las mismas características.
último?. Borrar los grupos 1, 2 y 3. ¡¡¡ Ojo con borrar el redo log activo !!!
Tenemos ficheros redolog de 512Kb, y vamos a crearlos de 1M, para poder alargar el tiempo entre
checkpoints. Para cada nuevo grupo crearemos 2 miembros en discos físicos distintos. Vamos a ver cómo borrar miembros de redo, y también grupos redolog. No podemos borrar el redo log activo
(current).

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 37 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 38
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

Si intentamos borrar el 1er miembro de un grupo, no podremos hacerlo (aunque tenga más miembros). Los 4 2 INACTIVE
5 2 CURRENT
borrados son siempre a nivel de BD, no se borran los ficheros a nivel del SO (habría que borrarlos una vez 6 2 INACTIVE
que hayamos hecho el borrado a nivel de BD ¡¡¡ ojo con esta operación, y borremos un redolog de la BD !!!).
SQL> alter database drop logfile group 3;
SQL> alter database drop logfile member '/home/u04/oradata/CURSOxy/redo01.log'; Database altered.
ERROR en línea 1:
ORA-00362: se necesita un miembro para formar un logfile valido en el grupo 1 SQL> select member from v$logfile;
ORA-01517: miembro log: '/u04/oradata/CURSOxy/redo01.log' MEMBER
--------------------------------------------------------------------------------
SQL> alter database drop logfile member '/u03/oradata/CURSOxy/redo11.log'; /u03/oradata/CURSOxy/redo04.log
Base de datos modificada. /u04/oradata/CURSOxy/redo14.log
/u03/oradata/CURSOxy/redo05.log
/u04/oradata/CURSOxy/redo15.log
Vamos a borrar los 3 grupos que tienen miembros de 512Kb; para quedarnos sólo con los nuevos de /u03/oradata/CURSOxy/redo06.log
1M. /u04/oradata/CURSOxy/redo16.log
6 filas seleccionadas.
SQL> alter database drop logfile group 1;
Base de datos modificada.

SQL> alter database drop logfile group 2; 4.6. Cambiar el nombre de los miembros de redo de los grupos 4, 5 y 6; a redo1a.log,
Base de datos modificada.
redo1b.log, redo2a.log, redo2b.log, redo3a.log, redo3b.log.
SQL> alter database drop logfile group 3;
ERROR en línea 1:
ORA-01623: log 3 is current log for thread 1 - cannot drop
¡¡¡ OJO, la BD debe estar sólo montada !!! por tanto hay que cerrar la BD y después sólo montarla. Despues
ORA-00312: online log 3 thread 1: '/home/u04/oradata/CURSOxy/redo03.log' se cambia el nombre a los ficheros (desde el S.O.); y entonces cambiamos el nombre a los redolog (desde la
ORA-00312: online log 3 thread 1: '/u03/oradata/CURSOxy/redo13.log' BD). Si intentamos cambiar el nombre en la BD, antes de cambiarlo desde el SO, cascará. Finalmente
SQL> select GROUP#,MEMBERS,STATUS from v$log; abrimos la BD y veremos los nuevos nombres en V$LOGFILE.
GROUP# MEMBERS STATUS
---------- ---------- ---------------- SQL> shutdown immediate
3 2 CURRENT Base de datos cerrada.
4 2 INACTIVE Base de datos desmontada.
5 2 INACTIVE Instancia de ORACLE cerrada.
6 2 INACTIVE
SQL> startup mount
SQL> alter system switch logfile; Instancia de ORACLE arrancada.
Sistema modificado. Total System Global Area 34148352 bytes
Fixed Size 450560 bytes
SQL> alter database drop logfile group 3; Variable Size 29360128 bytes
ERROR at line 1: Database Buffers 4194304 bytes
ORA-01624: log 3 needed for crash recovery of thread 1 Redo Buffers 143360 bytes
ORA-00312: online log 3 thread 1: '/home/u04/oradata/CURSOxy/redo03.log' Base de datos montada.
ORA-00312: online log 3 thread 1: '/u03/oradata/CURSOxy/redo13.log'
SQL> select member from v$logfile;
SQL> select GROUP#,MEMBERS,STATUS from v$log; MEMBER
GROUP# MEMBERS STATUS --------------------------------------------------------------------------------
---------- ---------- ---------------- /u03/oradata/CURSOxy/redo04.log
3 2 ACTIVE /u04/oradata/CURSOxy/redo14.log
4 2 CURRENT /u03/oradata/CURSOxy/redo05.log
5 2 INACTIVE /u04/oradata/CURSOxy/redo15.log
6 2 INACTIVE /u03/oradata/CURSOxy/redo06.log
SQL> alter system switch logfile; /u04/oradata/CURSOxy/redo16.log
System altered. 6 filas seleccionadas.

SQL> select GROUP#,MEMBERS,STATUS from v$log; SQL> alter database rename file '/u03/oradata/CURSOxy/redo04.log' to
GROUP# MEMBERS STATUS '/u03/oradata/CURSOxy/redo1a.log';
---------- ---------- ---------------- ORA-01512: error renaming log file /u03/oradata/CURSOxy/redo04.log - new file
3 2 INACTIVE /u03/oradata/CURSOxy/redo1a.log not found

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 39 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 40
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

Linux Error: 2: No such file or directory

SQL> !mv /u03/oradata/CURSOxy/redo04.log /u03/oradata/CURSOxy/redo1a.log PRACTICAS TEMA 5.


SQL> alter database rename file '/u03/oradata/CURSOxy/redo04.log' to
'/u03/oradata/CURSOxy/redo1a.log';
Base de datos modificada.
TABLESPACES.
SQL> !mv /u04/oradata/CURSOxy/redo14.log /u04/oradata/CURSOxy/redo1b.log

SQL> alter database rename file '/u04/oradata/CURSOxy/redo14.log' to


'/u04/oradata/CURSOxy/redo1b.log'; o Consultar los tablespaces que componen la BD. Comprobar los ficheros que
Base de datos modificada.
tiene cada uno de ellos. ¿Cuáles son 'locales' y cuáles no?
SQL> !mv /u03/oradata/CURSOxy/redo05.log /u03/oradata/CURSOxy/redo2a.log
o Crea el tablespace DATACURSOxx, NO manejado localmente, con el fichero
SQL> alter database rename file '/u03/oradata/CURSOxy/redo05.log' to /u02/oradata/CURSOxx/datacursoxx01.dbf, con un tamaño de 1M. Crea 3 tablas
'/u03/oradata/CURSOxy/redo2a.log';
Base de datos modificada. (TABLA01, TABLA02, TABLA03) de 256K sobre dicho tablespace. Borra la tabla
TABLA02 y crea una tabla TABLA04 de 352K. ¿Qué ocurre y por qué?. Borra el
SQL> !mv /u04/oradata/CURSOxy/redo15.log /u04/oradata/CURSOxy/redo2b.log
tablespace DATACURSOxx y créalo de nuevo, manejado localmente. Vuelve a
SQL> alter database rename file '/u04/oradata/CURSOxy/redo15.log' to crear las tablas y repite el borrado de TABLA02; y la creación de TABLA04.
'/u04/oradata/CURSOxy/redo2b.log';
Base de datos modificada. ¿Qué ocurre esta vez y por qué?
SQL> !mv /u03/oradata/CURSOxy/redo06.log /u03/oradata/CURSOxy/redo3a.log o Pon el tablespace DATACURSOxx en modo READ-ONLY. Inserta una fila en
alguna de sus tablas, ¿qué ocurre y por qué?. Borra la tabla TABLA01, ¿por qué
SQL> alter database rename file '/u03/oradata/CURSOxy/redo06.log' to
'/u03/oradata/CURSOxy/redo3a.log'; se puede borrar?. Deja el tablespace DATACURSOxx en modo READ-WRITE.
Base de datos modificada. Repite el insert sobre TABLA02.
SQL> !mv /u04/oradata/CURSOxy/redo16.log /u04/oradata/CURSOxy/redo3b.log o Crea una tabla TABLA04 de 256K en el tablespace DATACURSOxx, ¿qué
SQL> alter database rename file '/u04/oradata/CURSOxy/redo16.log' to ocurre y por qué?. Activa el autoextend de su fichero, ajustando next 256K y
'/u04/oradata/CURSOxy/redo3b.log'; maxsize 2M. Vuelve a crear la tabla TABLA04.
Base de datos modificada.
o Crea el tablespace INDCURSOxx de 1M con el fichero
SQL> select group#,rpad(member,40) member from v$logfile;
GROUP# MEMBER '/u02/oradata/CURSOxx/indcursoxx01.dbf'. Muévelo al directorio
---------- ---------------------------------------- '/u03/oradata/CURSOxx'.
4 /u03/oradata/CURSOxy/redo1a.log
4 /u04/oradata/CURSOxy/redo1b.log o Redimensionar el tablespace DATACURSOxx a 1M ¿qué ocurre y por qué?.
5 /u03/oradata/CURSOxy/redo2a.log
5 /u04/oradata/CURSOxy/redo2b.log Redimensionar el tablespace INDCURSOxx a 512K, y añadirle otro fichero de
6 /u03/oradata/CURSOxy/redo3a.log 512K.
6 /u04/oradata/CURSOxy/redo3b.log
6 filas seleccionadas. o Crear un tablespace de “undo” UNDO_CURSOxx. Convertirlo en el tablespace
SQL> alter database open; de “undo” activo. Crear una tabla TABLA05 en el nuevo tablespace, ¿qué
Base de datos modificada. ocurre? Consultar la vista V$UNDOSTAT.
SQL> select GROUP#,MEMBERS,STATUS from v$log; o Crear un tablespace temporal TEMP_CURSOxx de 1M. ¿Qué ocurre al ponerlo
GROUP# MEMBERS STATUS
---------- ---------- ---------------- read-only? ¿y al moverlo? Haz que sea el tablespace temporal por defecto de la
4 2 INACTIVE base de datos ¿que pasa al ponerlo offline? ¿y si lo borramos?
5 2 CURRENT
6 2 INACTIVE

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 41 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 42
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

5.1. Consultar los tablespaces que componen la BD. Comprobar los ficheros que tiene
SQL> Create tablespace DATACURSOxy
cada uno. ¿Cuales son 'locales' y cuales no? datafile '/u02/oradata/CURSOxy/datacurso0101.dbf' size 1M
extent management dictionary;
Tablespace creado.
En el DD disponemos de vistas para consultar información sobre tablespaces (DBA_TABLESPACES,
V$TABLESPACE) y los ficheros que los componen (DBA_DATA_FILES, DBA_TEMP_FILES, V$DATAFILE, SQL> select tablespace_name,extent_management from dba_tablespaces
V$TEMPFILE) where tablespace_name='DATACURSOxy';
TABLESPACE_NAME EXTENT_MAN
------------------------------ ----------
SQL> select tablespace_name,extent_management from dba_tablespaces; DATACURSOxy DICTIONARY
TABLESPACE_NAME EXTENT_MAN
------------------------------ ---------- SQL> create table TABLA01 (C1 VARCHAR2(4000))
SYSTEM DICTIONARY tablespace DATACURSOxy storage (initial 256K minextents 1);
TOOLS LOCAL Tabla creada.
UNDO_RBS1 LOCAL
TEMP LOCAL SQL> create table TABLA02 (C1 VARCHAR2(4000))
USERS LOCAL tablespace DATACURSOxy storage (initial 256K minextents 1);
Tabla creada.
SQL> SELECT rpad(TABLESPACE_NAME,10) tablespace,rpad(FILE_NAME,40) fichero,
to_char(BYTES/1024/1024,'999.99') MB, SQL> create table TABLA03 (C1 VARCHAR2(4000))
to_char(increment_by*8/1024,'99.99') nextmb, tablespace DATACURSOxy storage (initial 256K minextents 1);
to_char(MAXBYTES/1024/1024,'9999.99') maxmb Tabla creada.
FROM DBA_DATA_FILES;
TABLESPACE FICHERO MB NEXTMB MAXMB SQL> drop table tabla02;
---------- ---------------------------------------- ------- ------ -------- Tabla borrada.
SYSTEM /home/u02/oradata/CURSOxy/system01.dbf 260.00 40.00 8192.00
TOOLS /home/u02/oradata/CURSOxy/tools01.dbf 4.00 1.25 8192.00 SQL> select bytes from dba_free_space where tablespace_name='DATACURSOxy';
UNDO_RBS1 /home/u03/oradata/CURSOxy/rbs01.dbf 4.00 .00 .00 BYTES
USERS /home/u02/oradata/CURSOxy/users01.dbf 4.00 5.00 8192.00 ----------
247808
SQL> select rpad(name,40) name,CHECKPOINT_CHANGE#, 266240
to_char(CHECKPOINT_TIME,'dd/mm/yyyy hh24:mi') CHECKPOINT_TIME
from v$datafile; SQL> create table TABLA02 (C1 VARCHAR2(4000))
NAME CHECKPOINT_CHANGE# CHECKPOINT_TIME tablespace DATACURSOxy storage (initial 352K minextents 1);
---------------------------------------- ------------------ ---------------- ORA-01658: no se ha podido crear extensión INITIAL para el segmento en el
/home/u02/oradata/CURSOxy/system01.dbf 1179986 08/11/2004 13:06 tablespace DATACURSOxy
/home/u02/oradata/CURSOxy/tools01.dbf 1179986 08/11/2004 13:06
/home/u03/oradata/CURSOxy/rbs01.dbf 1179986 08/11/2004 13:06
/home/u02/oradata/CURSOxy/users01.dbf 1179986 08/11/2004 13:06
No se puede crear la tabla porque el tablespace NO es 'local' y no hay una extensión libre mayor o igual a
352Kb. Vamos a borrar el tablespace y a crearlo de nuevo 'local'. Veremos como siendo 'local' no tendremos
problemas para crear la tabla de 352Kb.
5.2. Crea el tablespace DATACURSOxx, NO manejado localmente, con el fichero
SQL> ALTER TABLESPACE DATACURSOxy OFFLINE;
/u02/oradata/datacursoxx01.dbf, con un tamaño de 1M. Crea 3 tablas (TABLA01, Tablespace modificado.
TABLA02, TABLA03) de 256K sobre dicho tablespace. Borra las tabla TABLA02 y crea SQL> DROP TABLESPACE DATACURSOxy;
una tabla TABLA04 de 352K. ¿Qué ocurre y por qué?. Borra el tablespace ORA-01549: el tablespace no está vacío, use la opción INCLUDING CONTENTS
DATACURSOxx y créalo de nuevo, manejado localmente. Vuelve a crear las tablas y SQL> DROP TABLESPACE DATACURSOxy INCLUDING CONTENTS;
repite el borrado de TABLA02; y la creación de TABLA04. ¿Qué ocurre esta vez y por Tablespace borrado.

qué? SQL> Create tablespace DATACURSOxy


datafile '/u02/oradata/CURSOxy/datacurso0101.dbf' size 1M
Los tablespaces 'manejados localmente' gestionan mejor los huecos libres, eliminando la fragmentación que,
reuse
extent management local uniform size 128K;
en el caso de tablespaces tradicionales, provoca el borrado de objetos. El espacio libre inicial en los Tablespace creado.
'tablespaces locales' es algo menor que en los 'tradicionales', ya que se pierde espacio para el bitmap.

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 43 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 44
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

SQL> select tablespace_name,extent_management from dba_tablespaces SQL> DROP TABLE TABLA01;


where tablespace_name='DATACURSOxy'; Tabla borrada.
TABLESPACE_NAME EXTENT_MAN
------------------------------ ---------- SQL> alter tablespace DATACURSOxy read write;
DATACURSOxy LOCAL Tablespace modificado.

SQL> create table TABLA01 (C1 VARCHAR2(4000)) SQL> insert into tabla02 values ('PRIMERA FILA');
tablespace DATACURSOxy storage (initial 256K minextents 1); 1 fila creada.
Tabla creada.
SQL> commit;
SQL> create table TABLA02 (C1 VARCHAR2(4000)) Validación terminada.
tablespace DATACURSOxy storage (initial 256K minextents 1);
Tabla creada.
5.4. Crea una tabla TABLA04 en el tablespace DATACURSOxx, ¿qué ocurre y por qué?.
SQL> create table TABLA03 (C1 VARCHAR2(4000))
tablespace DATACURSOxy storage (initial 256K minextents 1); Activa el autoextend de su fichero, ajustando next 256K y maxsize 2M. Vuelve a crear
Tabla creada. la tabla TABLA06.
SQL> drop table tabla02;
Tabla borrada. Cuando el tablespace se llena no será posible crear más objetos, a no ser que esté activado el 'autoextend',
SQL> select bytes from dba_free_space where tablespace_name='DATACURSOxy'; de forma que permita la ampliación del tablespace lo suficiente para albergar el nuevo objeto.
BYTES
---------- SQL> select bytes from dba_free_space where tablespace_name='DATACURSOxy';
262144 no rows selected
131072
SQL> create table TABLA04 (C1 VARCHAR2(4000))
SQL> create table TABLA02 (C1 VARCHAR2(4000)) tablespace DATACURSOxy storage (initial 256K minextents 1);
tablespace DATACURSOxy storage (initial 352K minextents 1); ERROR en línea 1:
Tabla creada. ORA-01658: no se ha podido crear extensión INITIAL para el segmento en el
tablespace DATACURSOxy
SQL> select bytes from dba_free_space where tablespace_name='DATACURSOxy';
ninguna fila seleccionada SQL> alter database datafile '/u02/oradata/CURSOxy/datacurso0101.dbf'
autoextend on next 256K maxsize 2M;
Como se observa, siendo el tablespace local, se aprovechan los huecos que se generan con el borrado de Base de datos modificada.
tablas. La cuestión clave, en este caso, es encontrar un tamaño adecuado para “uniform size”. Una posibilidad SQL> create table TABLA04 (C1 VARCHAR2(4000))
es tener varios tablespaces: pequeño, mediano y grande con uniform size, por ejemplo, de 8K, 256K y 8M. tablespace DATACURSOxy storage (initial 256K minextents 1);
Tabla creada.

SQL> select bytes from dba_free_space where tablespace_name='DATACURSOxy';


ninguna fila seleccionada
5.3. Pon el tablespace DATACURSOxx en modo READ-ONLY. Inserta una fila en alguna
de sus tablas, ¿qué ocurre?. Borra la tabla TABLA01, ¿por qué se puede borrar?. Deja SQL> SELECT rpad(segment_name,20) segmento, segment_type tipo, bytes from
dba_extents
el tablespace DATACURSOxx en modo READ-WRITE. Repite el insert, ahora sobre where tablespace_name='DATACURSOxy';
SEGMENTO TIPO BYTES
TABLA02. -------------------- ------------------ ----------
TABLA04 TABLE 131072
TABLA04 TABLE 131072
En un tablespace read only no se pueden actualizar datos (insert, update, delete), pero sí se pueden borrar TABLA03 TABLE 131072
objetos (drop table), ya que el borrado de objetos sólo afecta al DD (y no al tablespace). TABLA03 TABLE 131072
TABLA02 TABLE 131072
SQL> alter tablespace DATACURSOxy read only; TABLA02 TABLE 131072
Tablespace modificado. TABLA02 TABLE 131072
5.33 TEMPORARY 131072
SQL> insert into tabla01 values ('PRIMERA FILA'); 5.33 TEMPORARY 131072
ORA-00372: el fichero 6 no puede ser modificado en este momento 9 filas seleccionadas.
ORA-01110: fichero de datos 6: '/u02/oradata/CURSOxy/datacurso0101.dbf'

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 45 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 46
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

Database altered.
5.5. Crea el tablespace INDCURSOxx de 1M con el fichero
'/u02/oradata/CURSOxx/indcursoxx01.dbf'. Muévelo al directorio
SQL> alter tablespace INDCURSOxy add datafile
'/u03/oradata/CURSOxx'. '/u03/oradata/CURSOxy/indcurso0102.dbf' size 512K;
Tablespace altered.
Para mover o renombrar un fichero de un tablespace, éste último debe estar OFFLINE. SQL> select rpad(file_name,50),bytes from dba_data_files where
tablespace_name='INDCURSOxy';
SQL> Create tablespace INDCURSOxy RPAD(FILE_NAME,50) BYTES
datafile '/u02/oradata/CURSOxy/indcurso0101.dbf' size 1M -------------------------------------------------- ----------
reuse /u03/oradata/CURSOxy/indcurso0101.dbf 524288
extent management local uniform size 64K; /u03/oradata/CURSOxy/indcurso0102.dbf 524288
Tablespace creado.

SQL> alter tablespace indcurso01 offline;


Tablespace modificado.
5.7. Crear un tablespace de “undo” UNDO_CURSOxx. Convertirlo en el tablespace de
SQL> !mv /u02/oradata/CURSOxy/indcurso0101.dbf
/u03/oradata/CURSOxy/indcurso0101.dbf “undo” activo. Crear una tabla TABLA05 en el nuevo tablespace, ¿qué ocurre?
Consultar la vista V$UNDOSTAT.
SQL> alter tablespace indcurso01
rename datafile '/u02/oradata/CURSOxy/indcurso0101.dbf' to
'/u03/oradata/CURSOxy/indcurso0101.dbf'; Podemos tener varios tablespaces de “undo”, pero sólo uno de ellos estará activo en un momento dado (el
Tablespace modificado.
indicado en el parámetro undo_tablespace). No se pueden crear objetos sobre un tablespace de “undo” (como
SQL> alter tablespace indcurso01 online; puede ser una tabla).
Tablespace modificado.
Al cambiar de tablespace “undo” activo (con undo_tablespace), los segmentos de rollback que contiene el
SQL> select file_name from dba_data_files; nuevo tablespace pasan a estar “online”, mientras que los del tablespace anterior se ponen offline.
FILE_NAME
--------------------------------------------------------------------------------
/home/u02/oradata/CURSOxy/system01.dbf SQL> create undo tablespace undo_curso01 datafile
/home/u02/oradata/CURSOxy/tools01.dbf '/u03/oradata/CURSOxy/undo_curso0101.dbf' size 1M;
/home/u03/oradata/CURSOxy/rbs01.dbf
/home/u02/oradata/CURSOxy/users01.dbf Tablespace created.
/u02/oradata/CURSOxy/datacurso0101.dbf
/u03/oradata/CURSOxy/indcurso0101.dbf
SQL> select * from dba_tablespaces where tablespace_name='UNDO_CURSOxy';
6 rows selected.
TABLESPACE_NAME BLOCK_SIZE INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS
------------------------------ ---------- -------------- ----------- -----------
5.6. Redimensionar el tablespace DATACURSOxx a 1M ¿qué ocurre y por qué? MAX_EXTENTS PCT_INCREASE MIN_EXTLEN STATUS CONTENTS LOGGING FOR EXTENT_MAN
Redimensionar el tablespace INDCURSOxx a 512K, y añadirle otro fichero de 512K. ----------- ------------ ---------- --------- --------- --------- --- ----------
ALLOCATIO PLU SEGMEN
--------- --- ------
Se puede redimensionar un fichero reduciendo su tamaño sólo si el espacio recortado está libre. En el caso
UNDO_CURSOxy 2048 65536 1
de DATACURSOxx no es posible reducirlo a 1M porque tiene espacio ocupado en el espacio recortado. Sin
2147483645 65536 ONLINE UNDO LOGGING NO LOCAL
embargo, INDCURSOxx sí que puede ser reducido a 512K porque está vacío.
SYSTEM NO MANUAL

SQL> alter database datafile '/u02/oradata/CURSOxy/datacurso0101.dbf' resize 1M; SQL> CREATE TABLE TABLA05 (C1 VARCHAR2(2)) TABLESPACE UNDO_CURSOxy;
ORA-03297: file contains used data beyond requested RESIZE value ORA-30022: Cannot create segments in undo tablespace

SQL> alter database datafile '/u03/oradata/CURSOxy/indcurso0101.dbf' resize SQL> SHOW PARAMETER UNDO_TABLESPACE
512K;
NAME TYPE VALUE

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 47 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 48
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

------------------------------------ ----------- ------------------------------ 21/02/2005 13:38 UNDO_RBS1 8 1096


undo_tablespace string UNDO_RBS1 21/02/2005 13:48 UNDO_CURSOxy 2 1108
21/02/2005 13:58 UNDO_CURSOxy 10 1130
SQL> SELECT SEGMENT_NAME,TABLESPACE_NAME,STATUS FROM DBA_ROLLBACK_SEGS; 21/02/2005 14:08 UNDO_CURSOxy 0 0
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ---------------- En la vista V$UNDOSTAT se guarda información valiosa cuando se usa “undo automático”, pues podemos ver
SYSTEM SYSTEM ONLINE estadísticas (cada 10 minutos) del tablespace de undo usado (UNDOTSN), bloques de rollback consumidos
_SYSSMU1$ UNDO_RBS1 ONLINE (UNDOBLKS) y el nº total de transacciones de dicho periodo (TXNCOUNT).
_SYSSMU2$ UNDO_RBS1 ONLINE
_SYSSMU3$ UNDO_RBS1 ONLINE
_SYSSMU4$ UNDO_CURSOxy OFFLINE 5.8. Crear un tablespace temporal TEMP_CURSOxx de 1M. ¿Qué ocurre al ponerlo read-
_SYSSMU5$ UNDO_CURSOxy OFFLINE only? Haz que sea el tablespace temporal por defecto de la base de datos ¿que pasa al
_SYSSMU6$ UNDO_CURSOxy OFFLINE ponerlo offline? ¿y si lo borramos?
_SYSSMU7$ UNDO_CURSOxy OFFLINE
_SYSSMU8$ UNDO_CURSOxy OFFLINE
Un tablespace temporal no puede ponerse en modo “read only”, y tampoco se puede poner offline.
9 rows selected.
El tablespace temporal por defecto de la BD, además, no puede ser borrado.
SQL> ALTER SYSTEM SET UNDO_TABLESPACE=UNDO_CURSOxy;
System altered. SQL> show parameter sort_area_size
NAME TYPE VALUE

SQL> SELECT SEGMENT_NAME,TABLESPACE_NAME,STATUS FROM DBA_ROLLBACK_SEGS; ------------------------------------ ----------- ------------------------------

SEGMENT_NAME TABLESPACE_NAME STATUS sort_area_size integer 65536

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


SYSTEM SYSTEM ONLINE SQL> create temporary tablespace temp_curso01 tempfile
'/u03/oradata/CURSOxy/temp_curso0101.dbf' size 1M extent management local
_SYSSMU1$ UNDO_RBS1 OFFLINE uniform size 64K
_SYSSMU2$ UNDO_RBS1 OFFLINE Tablespace created.
_SYSSMU3$ UNDO_RBS1 OFFLINE
_SYSSMU4$ UNDO_CURSOxy ONLINE SQL> alter tablespace temp_curso01 read only;
_SYSSMU5$ UNDO_CURSOxy ONLINE ORA-03217: invalid option for alter of TEMPORARY TABLESPACE
_SYSSMU6$ UNDO_CURSOxy ONLINE
_SYSSMU7$ UNDO_CURSOxy ONLINE SQL> alter tablespace temp_curso01 offline;
_SYSSMU8$ UNDO_CURSOxy ONLINE ORA-03217: invalid option for alter of TEMPORARY TABLESPACE
9 rows selected.
SQL> alter database default temporary tablespace temp_curso01;
SQL> select to_char(BEGIN_TIME,'dd/mm/yyyy hh24:mi') BEGIN_TIME,b.name Database altered.
TABLESPACE,
UNDOBLKS,TXNCOUNT SQL> drop tablespace temp_curso01;
from V$UNDOSTAT a, v$tablespace b ORA-12906: cannot drop default temporary tablespace
WHERE A.UNDOTSN=B.TS#
ORDER BY BEGIN_TIME; SQL> alter database default temporary tablespace temp;
BEGIN_TIME NAME UNDOBLKS TXNCOUNT Database altered.
---------------- ------------------------------ ---------- ----------
...

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 49 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 50
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

3 4194304

PRACTICAS TEMA 6.
4. Consultar el valor actualmente activo de los parámetros de “undo” en la base de datos.
ESPACIO DE “UNDO”.
SQL> show parameters undo

NAME TYPE VALUE


1. Consultar el fichero de inicialización de la base de datos y averiguar cuales de los parámetros de “undo” están ------------------------------------ ----------- ----------
definidos y su valor actual. undo_management string AUTO
undo_retention integer 900
undo_suppress_errors boolean FALSE
/home/oracle (CURSO01)> cd $ADMIN/pfile undo_tablespace string undo_rbs1

/u01/app/oracle/admin/CURSO01/pfile (CURSO01)> grep undo


initCURSO01.ora
5. Intentar asignar el segmento de “rollback” r01 a la transacción actual. ¿Se genera error?, en caso afirmativo ¿cuál?.
undo_management = auto ¿cuál es el valor de “undo_suppress_errors”?.
undo_tablespace = undo_rbs1
SQL> set transaction use rollback segment r01;
set transaction use rollback segment r01
*
2. Averiguar cuantos espacios de “undo” están definidos en la base de datos (nombre, características de ERROR at line 1:
almacenamiento, ...). ORA-30019: Illegal rollback Segment operation in Automatic Undo
mode
SQL> select tablespace_name, initial_extent, next_extent,
min_extents, max_extents, status, contents from dba_tablespaces
where contents='UNDO' 6. Modificar dinámicamente el valor del parámetro “undo_suppress_errors” y volver a realizar el ejercicio anterior.
¿cuál es el resultado?.
TABLESPACE_NAME INITIAL_EXTENT NEXT_EXTENT
MIN_EXTENTS MAX_EXTENTS STATUS CONTENTS SQL> alter system set undo_suppress_errors =TRUE;
------------------------------ -------------- -----------
----------- ----------- --------- --------- System altered.
UNDO_RBS1 65536
1 2147483645 ONLINE UNDO SQL> set transaction use rollback segment r01;

Transaction set.
3. ¿En qué sistema/s de ficheros están definidos los anteriores espacios de almacenamiento?, ¿cuál es su tamaño?.

SQL> select tablespace_name, file_name, file_id, bytes 7. Repetir el ejercicio número 4 y observar el cambio de valor de los parámetros.
2 from dba_data_files where tablespace_name='UNDO_RBS1';
SQL> show parameters undo
TABLESPACE_NAME
------------------------------ NAME TYPE VALUE
FILE_NAME ------------------------------------ ---------- ------------
----------------------------------------------------------- undo_management string AUTO
FILE_ID BYTES undo_retention integer 900
---------- ---------- undo_suppress_errors boolean TRUE
UNDO_RBS1 undo_tablespace string undo_rbs1
/home/u03/oradata/CURSO01/rbs01.dbf

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 51 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 52
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

SQL> show parameters undo


8. Crear un segundo espacio de almacenamiento de “undo” con las siguientes características:
undo_management string AUTO
Nombre ... UNDO02 undo_retention integer 900
Localización ... /home/u03/oradata/CURSOxx/undo02.dbf undo_suppress_errors boolean TRUE
Tamaño ... 1M undo_tablespace string undo_rbs1
Autoextensible ... 2M, hasta 3M

Comprobar su creación. SQL> alter system set undo_tablespace=undo02;

SQL> create undo tablespace undo02 System altered.


2 datafile '/home/u03/oradata/CURSO01/undo02.dbf'
3 size 1M
4 autoextend on next 2M maxsize 3M; SQL> show parameters undo

Tablespace created. undo_management string AUTO


undo_retention integer 900
undo_suppress_errors boolean TRUE
SQL> select tablespace_name, file_name undo_tablespace string UNDO02
2* from dba_data_files where tablespace_name like 'UNDO%'

UNDO_RBS1 11. Modificar el fichero de inicialización comentando la línea correspondiente a la variable “undo_tablespace”. ¿cuál es
/home/u03/oradata/CURSO01/rbs01.dbf el espacio de “undo” que se habilita? (recuerde que al cerrar la base de datos era UNDO02, ver ejercicio anterior).

UNDO02
/home/u03/oradata/CURSO01/undo02.dbf /u01/app/oracle/admin/CURSO01/pfile (CURSO01)> sqlplus /nolog

SQL*Plus: Release 9.2.0.1.0 - Production on Thu Nov 18 14:40:33


9. Crear un espacio de almacenamiento de “undo” con las siguientes características: 2004

Nombre ... UNDO03 Copyright (c) 1982, 2002, Oracle Corporation. All rights
Localización ... /home/u03/oradata/CURSOxx/undo03.dbf reserved.
Tamaño ... 1M
SQL> connect / as sysdba;
Definir la cláusula “storage” por defecto: initial 100k, next 100k y maxextents 50.
Connected.

SQL> shutdown immediate


SQL> create undo tablespace undo03 Database closed.
2 datafile '/home/u03/oradata/CURSO01/undo03.dbf' Database dismounted.
3 size 1M ORACLE instance shut down.
4* default storage (initial 100k next 100k maxextents 50) SQL>
default storage (initial 100k next 100k maxextents 50) SQL> startup
* ORACLE instance started.
ERROR at line 4:
ORA-30024: Invalid specification for CREATE UNDO TABLESPACE Total System Global Area 34148352 bytes
Fixed Size 450560 bytes
Variable Size 29360128 bytes
10. Modificar el espacio de “undo” por defecto, de forma que sea a partir de este momento UNDO02. Comprobarlo antes Database Buffers 4194304 bytes
y despues de hacerlo. Redo Buffers 143360 bytes
Database mounted.

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 53 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 54
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

Database opened. Database opened.

SQL> connect system


Enter password: SQL> connect system
Connected. Enter password:
Connected.
SQL> show parameters undo SQL> show parameters undo

NAME TYPE VALUE NAME TYPE VALUE


------------------------------------ ----------- ---------- ------------------------------------ --------- ---------
undo_management string AUTO undo_management string AUTO
undo_retention integer 900 undo_retention integer 900
undo_suppress_errors boolean FALSE undo_suppress_errors boolean FALSE
undo_tablespace string undo_rbs1 undo_tablespace string UNDO02

12. Modificar el fichero de inicialización y asignar a la variable “undo_tablespace” el valor “UNDO02”. Parar y arrancar la 13. Borrar el espacio de “undo” UNDO02.
base de datos.
SQL> show parameters undo
# Gestion Automatica de Rollback (UNDO).
undo_management = auto NAME TYPE VALUE
undo_tablespace = UNDO02 ------------------------------------ ---------- ---------
undo_management string AUTO
"initCURSO01.ora" 125L, 5655C escritos undo_retention integer 900
undo_suppress_errors boolean FALSE
/u01/app/oracle/admin/CURSO01/pfile (CURSO01)> sqlplus /nolog undo_tablespace string UNDO02

SQL*Plus: Release 9.2.0.1.0 - Production on Thu Nov 18 14:49:42


2004 SQL> drop tablespace undo02;
drop tablespace undo02
Copyright (c) 1982, 2002, Oracle Corporation. All rights *
reserved. ERROR at line 1:
ORA-30013: undo tablespace 'UNDO02' is currently in use
SQL> connect /as sysdba;
Connected.

SQL> shutdown immediate 14. Asignar “UNDO_RBS1” como nuevo espacio de “undo”. Borrar el espacio “UNDO02”.
Database closed.
Database dismounted. SQL> alter system set undo_tablespace='UNDO_RBS1';
ORACLE instance shut down. System altered.

SQL> startup SQL> show parameters undo


ORACLE instance started.
NAME TYPE VALUE
Total System Global Area 34148352 bytes ------------------------------------ ----------- -----------
Fixed Size 450560 bytes undo_management string AUTO
Variable Size 29360128 bytes undo_retention integer 900
Database Buffers 4194304 bytes undo_suppress_errors boolean FALSE
Redo Buffers 143360 bytes undo_tablespace string UNDO_RBS1
Database mounted.

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 55 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 56
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

SQL> drop tablespace undo02; Fixed Size 450560 bytes


Variable Size 29360128 bytes
Tablespace dropped. Database Buffers 4194304 bytes
Redo Buffers 143360 bytes
Database mounted.
15. Parar y arrancar la base de datos (debe recordarse que en el fichero initCURSOxx.ora el parámetro “undo_tablespace” tiene Database opened.
el valor “UNDO02”). SQL> show parameters undo

SQL> connect / as sysdba; NAME TYPE VALUE


Connected. ------------------------------------ --------- ----------
undo_management string AUTO
SQL> shutdown immediate undo_retention integer 900
Database closed. undo_suppress_errors boolean FALSE
Database dismounted. undo_tablespace string UNDO_RBS1
ORACLE instance shut down.

SQL> startup 17. Comentar todos los parámetros correspondientes a “undo” en el fichero de inicialización, parar y arrancar la base de
ORACLE instance started. datos. Comprobar los valores de “undo”, ¿qué observa?.

Total System Global Area 34148352 bytes


Fixed Size 450560 bytes # Gestion Automatica
Variable Size 29360128 bytes #undo_management = auto
Database Buffers 4194304 bytes #undo_tablespace = UNDO02
Redo Buffers 143360 bytes
Database mounted. /u01/app/oracle/admin/CURSO01/pfile (CURSO01)> sqlplus /nolog
ORA-01092: ORACLE instance terminated. Disconnection forced
SQL*Plus: Release 9.2.0.1.0 - Production on Fri Nov 19 09:41:09
2004
16. Comentar el parámetro “undo_tablespace” en el fichero de inicialización, y arrancar la base de datos. ¿Qué espacio
de “undo” tiene asignado?. Copyright (c) 1982, 2002, Oracle Corporation. All rights
reserved.
# Gestion Automatica
undo_management = auto SQL> connect /as sysdba;
#undo_tablespace = UNDO02 Connected.

/u01/app/oracle/admin/CURSO01/pfile (CURSO01)> sqlplus /nolog SQL> shutdown immediate


Database closed.
SQL*Plus: Release 9.2.0.1.0 - Production on Fri Nov 19 09:32:41 Database dismounted.
2004 ORACLE instance shut down.

Copyright (c) 1982, 2002, Oracle Corporation. All rights SQL> startup
reserved. ORACLE instance started.

SQL> connect / as sysdba; Total System Global Area 34148352 bytes


Connected to an idle instance. Fixed Size 450560 bytes
Variable Size 29360128 bytes
SQL> startup Database Buffers 4194304 bytes
ORACLE instance started. Redo Buffers 143360 bytes
Database mounted.
Total System Global Area 34148352 bytes Database opened.

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 57 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 58
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

SQL> show parameters undo

NAME TYPE VALUE # Gestion Automatica


------------------------------------ ----------- -------- undo_management = auto
undo_management string MANUAL #undo_tablespace = UNDO02
undo_retention integer 900
undo_suppress_errors boolean FALSE /u01/app/oracle/admin/CURSO01/pfile (CURSO01)> sqlplus /nolog
undo_tablespace string
SQL*Plus: Release 9.2.0.1.0 - Production on Fri Nov 19 09:49:03
2004
18. Borrar el espacio de “undo” UNDO_RBS1. Habilitar de nuevo la gestión automática de “undo” y, parar y arrancar la
base de datos. Comprobar los valores de “undo”, ¿qué espacio de “undo” se usa?. Copyright (c) 1982, 2002, Oracle Corporation. All rights
reserved.
SQL> c.form.from.
1* select * from dba_data_files where SQL> connect / as sysdba;
tablespace_name='UNDO_RBS1' Connected to an idle instance.
SQL> r SQL> startup
1* select * from dba_data_files where ORACLE instance started.
tablespace_name='UNDO_RBS1'
Total System Global Area 34148352 bytes
FILE_NAME Fixed Size 450560 bytes
------------------------------------------------------------------ Variable Size 29360128 bytes
--------- Database Buffers 4194304 bytes
FILE_ID TABLESPACE_NAME BYTES BLOCKS Redo Buffers 143360 bytes
STATUS Database mounted.
---------- ------------------------------ ---------- ---------- Database opened.
---------
RELATIVE_FNO AUT MAXBYTES MAXBLOCKS INCREMENT_BY USER_BYTES SQL> show parameters undo
USER_BLOCKS
------------ --- ---------- ---------- ------------ ---------- NAME TYPE VALUE
----------- ------------------------------------ --------------------
/home/u03/oradata/CURSO01/rbs01.dbf undo_management string AUTO
3 UNDO_RBS1 4194304 2048 undo_retention integer 900
AVAILABLE undo_suppress_errors boolean FALSE
3 NO 0 0 0 4128768 undo_tablespace string
2016

19. En el ejercicio anterior, ¿se genera algún mensaje de error en el fichero de alertas?.
SQL> drop tablespace UNDO_RBS1;

Tablespace dropped. Starting up ORACLE RDBMS Version: 9.2.0.1.0.


System parameters with non-default values:
SQL> connect / as sysdba; processes = 20
Connected. shared_pool_size = 8388608
sga_max_size = 34148352
SQL> shutdown immediate
Database closed. ...
Database dismounted.
ORACLE instance shut down. Fri Nov 19 09:49:12 2004
ALTER DATABASE MOUNT
Fri Nov 19 09:49:17 2004

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 59 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 60
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

Successful mount of redo thread 1, with mount id 2097158872. Nombre ... UNDO_RBS1
Fri Nov 19 09:49:17 2004 Localización ... /home/u03/oradata/CURSOxx/rbs01.dbf
Database mounted in Exclusive Mode. Tamaño ... 1M
Completed: ALTER DATABASE MOUNT Siguiente extensión ... 500k
Fri Nov 19 09:49:17 2004 Tamaño máximo ... 2M
ALTER DATABASE OPEN
Fri Nov 19 09:49:17 2004 SQL> create undo tablespace undo_rbs1 datafile
Thread 1 opened at log sequence 578 '/home/u03/oradata/CURSO01/rbs01.dbf'
Current log# 5 seq# 578 mem# 0: /u03/oradata/CURSO01/redo2a.log 2* size 1M autoextend on next 500K maxsize 2M
Current log# 5 seq# 578 mem# 1: /u04/oradata/CURSO01/redo2b.log create undo tablespace undo_rbs1 datafile
Successful open of redo thread 1. '/home/u03/oradata/CURSO01/rbs01.dbf'
Fri Nov 19 09:49:17 2004 *
MTTR advisory is disabled because FAST_START_MTTR_TARGET is not ERROR at line 1:
set ORA-01119: error in creating database file
Fri Nov 19 09:49:17 2004 '/home/u03/oradata/CURSO01/rbs01.dbf'
SMON: enabling cache recovery ORA-27038: skgfrcre: file exists
SMON: enabling tx recovery
***Warning - Executing transaction without active Undo Tablespace
Fri Nov 19 09:49:17 2004 Nota. Cuando se borró el espacio UNDO_RBS1, no se eliminó el fichero correspondiente y se
Database Characterset is WE8ISO8859P15
replication_dependency_tracking turned off (no async multimaster genera un error. Es necesario previamente borrar o renombrar “rbs01.dbf”; se elige renombrar el
replication found) fichero por ser una operación más segura en este caso. ¡Cuidado con esta operación!.
***Warning - Executing transaction without active Undo Tablespace
Completed: ALTER DATABASE OPEN
SQL> !

20. Crear un espacio llamado PRUEBA, que no sea de “undo”, e intentar asignarlo como espacio de “undo”. ¿Qué /u01/app/oracle/admin/CURSO01/bdump (CURSO01)> cd
sucede?. /home/u03/oradata/CURSO01

Nombre ... PRUEBA /home/u03/oradata/CURSO01 (CURSO01)> mv rbs01.dbf


Localización ... /home/u03/oradata/CURSOxx/prueba01.dbf rbs01.dbf.antiguo
Tamaño ... 1M
/home/u03/oradata/CURSO01 (CURSO01)> exit
SQL> create tablespace prueba datafile
'/home/u03/oradata/CURSO01/prueba01.dbf' size 1M SQL>

Tablespace created. SQL> create undo tablespace undo_rbs1 datafile


'/home/u03/oradata/CURSO01/rbs01.dbf'
SQL> alter system set undo_tablespace=PRUEBA; 2 size 1M autoextend on next 500K maxsize 2M;
alter system set undo_tablespace=PRUEBA
* Tablespace created.
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is
invalid SQL> alter system set undo_tablespace=undo_rbs1
ORA-30012: undo tablespace 'PRUEBA' does not exist or of wrong
type System altered.

SQL> show parameters undo


21. Crear de nuevo el espacio de “undo” UNDO_RBS1 y asignarlo como tal.
NAME TYPE VALUE
------------------------------------ ----------- ---------

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 61 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 62
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

undo_management string AUTO MAXCONCURRENCY NUMBER


undo_retention integer 900 UNXPSTEALCNT NUMBER
undo_suppress_errors boolean FALSE UNXPBLKRELCNT NUMBER
undo_tablespace string UNDO_RBS1 UNXPBLKREUCNT NUMBER
EXPSTEALCNT NUMBER
EXPBLKRELCNT NUMBER
22. Obtener la descripción completa de las vistas siguientes (consultar también la documentación en línea). EXPBLKREUCNT NUMBER
SSOLDERRCNT NUMBER
" DBA_UNDO_EXTENTS NOSPACEERRCNT NUMBER
" V$UNDOSTAT
" V$ROLLSTAT Muestra datos estadísticos relativos a consumo de espacio de “undo”, longitud de las
consultas ejecutadas, ... Se devuelven valores nulos si se trabaja en modo manual.
Cada fila de la vista corresponde a un intervalo de 10 minutos (en total 1008 filas,
SQL> desc dba_undo_extents correspondientes a un periodo de siete dias).
Name Null? Type
----------------------------------------- -------- -------------- SQL> desc v$rollstat
OWNER CHAR(3) Name Null? Type
SEGMENT_NAME NOT NULL VARCHAR2(30) ----------------------------------------- ----------------------
TABLESPACE_NAME NOT NULL VARCHAR2(30) USN NUMBER
EXTENT_ID NUMBER LATCH NUMBER
FILE_ID NOT NULL NUMBER EXTENTS NUMBER
BLOCK_ID NUMBER RSSIZE NUMBER
BYTES NUMBER WRITES NUMBER
BLOCKS NUMBER XACTS NUMBER
RELATIVE_FNO NUMBER GETS NUMBER
COMMIT_JTIME NUMBER WAITS NUMBER
COMMIT_WTIME VARCHAR2(20) OPTSIZE NUMBER
STATUS VARCHAR2(9) HWMSIZE NUMBER
SHRINKS NUMBER
Especialmente interesantes son las columnas “owner” -propietario del espacio de “undo”-, WRAPS NUMBER
tablespace_name -nombre del espacio de “undo”-, y “status” -estado de la transacción en la EXTENDS NUMBER
extension: Active, contiene transacciónes activas, expired, el segmento no se utiliza, o unexpired, no AVESHRINK NUMBER
AVEACTIVE NUMBER
hay transacciónes activas pero contiene datos que pueden ser requeridos por otras transacciónes-.
STATUS VARCHAR2(15)
CUREXT NUMBER
Según la nota 231509.1, las columnas “commit_jtime” y “commit_wtime” pierden su valor en la CURBLK NUMBER
vista dba_undo_extents desde la version 9.2.0
En modo automático refleja el comportamiento de los segmentos de “undo” en el espacio de
“undo.
SQL> desc v$undostat
Name Null? Type
-------------------------------------------------------------- 23. Habilitar el modo de gestión manual de “undo. Parar y arrancar la base de datos.
BEGIN_TIME DATE
END_TIME DATE # Gestion Automatica
UNDOTSN NUMBER undo_management = manual
UNDOBLKS NUMBER undo_tablespace = UNDO_RBS1
TXNCOUNT NUMBER
/u01/app/oracle/admin/CURSO01/pfile (CURSO01)> sqlplus /nolog
MAXQUERYLEN NUMBER

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 63 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 64
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

SQL*Plus: Release 9.2.0.1.0 - Production on Fri Nov 19 11:54:44 2004 SEGMENT_TYPE VARCHAR2(18)
TABLESPACE_NAME VARCHAR2(30)
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
HEADER_FILE NUMBER
SQL> connect / as sysdba; HEADER_BLOCK NUMBER
Connected. BYTES NUMBER
BLOCKS NUMBER
SQL> shutdown immediate EXTENTS NUMBER
Database closed.
Database dismounted. INITIAL_EXTENT NUMBER
ORACLE instance shut down. NEXT_EXTENT NUMBER
MIN_EXTENTS NUMBER
SQL> startup MAX_EXTENTS NUMBER
ORACLE instance started. PCT_INCREASE NUMBER
Total System Global Area 34148352 bytes FREELISTS NUMBER
Fixed Size 450560 bytes FREELIST_GROUPS NUMBER
Variable Size 29360128 bytes RELATIVE_FNO NUMBER
Database Buffers 4194304 bytes BUFFER_POOL VARCHAR2(7)
Redo Buffers 143360 bytes
Database mounted.
Database opened. SQL> desc dba_rollback_segs

SQL> show parameters undo Nombre ¿Nulo? Tipo


----------------------------------------- -------- -------------
NAME TYPE VALUE SEGMENT_NAME NOT NULL VARCHAR2(30)
------------------------------------ ---------- ----------
undo_management string MANUAL OWNER VARCHAR2(6)
undo_retention integer 900 TABLESPACE_NAME NOT NULL VARCHAR2(30)
undo_suppress_errors boolean FALSE SEGMENT_ID NOT NULL NUMBER
undo_tablespace string UNDO_RBS1 FILE_ID NOT NULL NUMBER
BLOCK_ID NOT NULL NUMBER
SQL> alter system set undo_tablespace=UNDO02;
alter system set undo_tablespace=UNDO02 INITIAL_EXTENT NUMBER
* NEXT_EXTENT NUMBER
ERROR at line 1: MIN_EXTENTS NOT NULL NUMBER
ORA-02097: parameter cannot be modified because specified value is invalid MAX_EXTENTS NOT NULL NUMBER
ORA-30014: operation only supported in Automatic Undo Management mode PCT_INCREASE NUMBER
STATUS VARCHAR2(16)
INSTANCE_NUM VARCHAR2(40)
24. Obtener la descripción completa de las vistas siguientes (consultar también la documentación en línea): RELATIVE_FNO NOT NULL NUMBER

- DBA_SEGMENTS SQL> desc V$rollname


- DBA_ROLLBACK_SEGS
- V$ROLLNAME Nombre ¿Nulo? Tipo
- V$ROLLSTAT ----------------------------------------- -------- -------------
USN NUMBER
NAME NOT NULL VARCHAR2(30)
SQL> desc dba_segments
SQL> desc v$rollstat
Nombre ¿Nulo? Tipo
----------------------------------------- -------- ------------- Nombre ¿Nulo? Tipo
OWNER VARCHAR2(30) ----------------------------------------- -------- -------------
SEGMENT_NAME VARCHAR2(81) USN NUMBER
PARTITION_NAME VARCHAR2(30) EXTENTS NUMBER
RSSIZE NUMBER

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 65 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 66
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

WRITES NUMBER COUNT(*)


XACTS NUMBER ----------
GETS NUMBER 1
WAITS NUMBER
OPTSIZE NUMBER
HWMSIZE NUMBER SQL> select owner, SEGMENT_NAME, TABLESPACE_NAME,STATUS from
SHRINKS NUMBER dba_rollback_segs order by owner, segment_name, status
WRAPS NUMBER
EXTENDS NUMBER PUBLIC _SYSSMU1$ UNDO_RBS1
AVESHRINK NUMBER OFFLINE
AVEACTIVE NUMBER
STATUS VARCHAR2(15) PUBLIC _SYSSMU2$ UNDO_RBS1
CUREXT NUMBER OFFLINE
CURBLK NUMBER
PUBLIC _SYSSMU3$ UNDO_RBS1
OFFLINE
25. Averiguar cuantos espacios de “undo” dedicados a gestión automática existen en la base de datos y ponerlos fuera
de línea (comprobar este punto). PUBLIC _SYSSMU4$ UNDO_RBS1
OFFLINE
SQL> select tablespace_name, contents, status from dba_tablespaces
where contents='UNDO'; PUBLIC _SYSSMU5$ UNDO_RBS1

TABLESPACE_NAME CONTENTS STATUS OFFLINE


------------------------------ --------- ---------
UNDO_RBS1 UNDO ONLINE PUBLIC _SYSSMU6$ UNDO02
UNDO02 UNDO ONLINE OFFLINE

SQL> alter tablespace undo_rbs1 offline; PUBLIC _SYSSMU7$ UNDO02


OFFLINE
Tablespace altered.
PUBLIC _SYSSMU8$ UNDO02
SQL> alter tablespace undo02 offline; OFFLINE

Tablespace altered. SYS SYSTEM SYSTEM


ONLINE
SQL> select tablespace_name, contents, status from dba_tablespaces
where contents='UNDO';
SQL> SELECT segment_name, tablespace_name, bytes, blocks, extents
TABLESPACE_NAME CONTENTS STATUS FROM sys.dba_segments
------------------------------ --------- --------- WHERE segment_type = 'ROLLBACK';
UNDO_RBS1 UNDO OFFLINE
UNDO02 UNDO OFFLINE SYSTEM
SYSTEM 1482752 724 27

26. Averiguar de cuántos segmentos de "rollback" dispone la base de datos y cuáles de ellos están activos.
Realizar la consulta anterior para tipo de segmento igual a “UNDO”.

SQL> select count(*) from dba_rollback_segs where status='ONLINE';


SQL> SELECT segment_name, tablespace_name, bytes, blocks, extents

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 67 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 68
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

FROM sys.dba_segments maxextents unlimited)


WHERE segment_type like '%UNDO' 5* extent management dictionary

Tablespace created.
27. Idem para el número de segmentos fuera de línea.

29. Crear un segmento de "rollback" público, en el espacio de almacenamiento anterior, llamado RP01.
SQL> select count(*) from dba_rollback_segs where
status='OFFLINE'; SQL> CREATE PUBLIC ROLLBACK SEGMENT RP01 TABLESPACE RBS
2 storage (initial 100k next 100k minextents 2 maxextents 10
COUNT(*) optimal 500K);
---------- CREATE PUBLIC ROLLBACK SEGMENT RP01 TABLESPACE RBS
8 *
ERROR at line 1:
ORA-01552: cannot use system rollback segment for non-system
28. Averiguar si existe un espacio de almacenamiento de nombre RBS, si no crearlo. En adelante se trabajará con este tablespace 'RBS'
espacio de almacenamiento exclusivo para los segmentos de "rollback".

Nombre ... RBS Según la nota 1005227.6 para la solución a este problema, provocado porque debe haber como
Localización ... /home/u03/oradata/CURSOxx/rbs_manual01.dbf mínimo un segmento activado que no sea SYSTEM, deben seguirse los siguientes pasos:
Tamaño ... 1M
Siguiente extensión ... 500k " Crear un segmento de “rollback” en el espacio SYSTEM y activarlo.
Tamaño máximo ... 2M " Crear los segmentos oportunos en el espacio dedicado a “rollback”.
" Borrar o desactivar el segmento creado en SYSTEM
SQL> select tablespace_name from dba_tablespaces;

TABLESPACE_NAME
------------------------------
SYSTEM
SQL> create public rollback segment r_borrar tablespace system
TOOLS
2 storage (initial 100k next 100k minextents 2 maxextents 10
UNDO_RBS1
optimal 500K);
TEMP
USERS
Rollback segment created.
DATACURSO01
INDCURSO01
SQL> alter rollback segment r_borrar online;
UNDO02
PRUEBA
Rollback segment altered.
9 rows selected.
SQL> CREATE PUBLIC ROLLBACK SEGMENT RP01 TABLESPACE RBS
2 storage (initial 100k next 100k minextents 2 maxextents 10
optimal 500K);
SQL> select tablespace_name from dba_tablespaces where
tablespace_name ='RBS';
Rollback segment created.
no rows selected

SQL> create tablespace rbs 30. Observar los parámetros de almacenamiento con que se ha creado el segmento RP01. ¿Cuáles son?, ¿cuáles son
2 datafile '/home/u03/oradata/CURSO01/rbs_manual01.dbf' los del espacio de almacenamiento RBS?.
3 size 1M
4 default storage (initial 100k next 100k minextents 2 SQL> select substr(segment_name,1,10) seg,

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 69 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 70
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

substr(tablespace_name,1,10) tables, INITIAL_EXTENT, NEXT_EXTENT, PUBLIC _SYSSMU4$ OFFLINE


MIN_EXTENTS, MAX_EXTENTS from dba_rollback_segs where segment_name PUBLIC _SYSSMU5$ OFFLINE
='RP01'; PUBLIC _SYSSMU6$ OFFLINE
PUBLIC _SYSSMU7$ OFFLINE
SEG TABLES INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS PUBLIC _SYSSMU8$ OFFLINE
MAX_EXTENTS PUBLIC R_BORRAR ONLINE
---------- ---------- -------------- ----------- ----------- PUBLIC RP01 ONLINE
----------- SYS RPR01 ONLINE
RP01 RBS 102400 102400 2
10 12 rows selected.

SQL> select substr(tablespace_name,1,10) tables, INITIAL_EXTENT, 34. Averiguar en que espacios de almacenamiento está definido cada uno de los segmentos de "rollback" de la base de
NEXT_EXTENT, MIN_EXTENTS, MAX_EXTENTS from dba_tablespaces where datos.
tablespace_name ='RBS'

TABLES INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS SQL> select substr(owner,1,10) prop, substr(segment_name,1,10)
---------- -------------- ----------- ----------- ----------- nombre, tablespace_name from dba_rollback_segs order by
RBS 102400 102400 2 2147483645 segment_name;

PROP NOMBRE TABLESPACE_NAME


31. Crear un segmento de "rollback" privado llamado RPR01. ------ ---------- ------------------------------
PUBLIC RP01 RBS
SQL> CREATE ROLLBACK SEGMENT RPR01 TABLESPACE RBS; SYS RPR01 RBS
PUBLIC R_BORRAR SYSTEM
Rollback segment created. SYS SYSTEM SYSTEM
PUBLIC _SYSSMU1$ UNDO_RBS1
PUBLIC _SYSSMU2$ UNDO_RBS1
32. Activar los segmentos de "rollback" creados anteriormente. PUBLIC _SYSSMU3$ UNDO_RBS1
PUBLIC _SYSSMU4$ UNDO_RBS1
SQL> alter rollback segment rp01 online; PUBLIC _SYSSMU5$ UNDO_RBS1
PUBLIC _SYSSMU6$ UNDO02
Rollback segment altered. PUBLIC _SYSSMU7$ UNDO02

SQL> ALTER ROLLBACK SEGMENT RPR01 ONLINE; PROP NOMBRE TABLESPACE_NAME


------ ---------- ------------------------------
Rollback segment altered. PUBLIC _SYSSMU8$ UNDO02

12 rows selected.
33. Averiguar cuáles de los segmentos de "rollback" anteriores son públicos y cuáles privados.

35. Averiguar cuáles son los parámetros de almacenamiento de los segmentos de "rollback".
SQL> select owner, segment_name, status from dba_rollback_segs;
SQL> select substr(owner,1,10) prop, substr(segment_name,1,10)
OWNER SEGMENT_NAME STATUS nombre, INITIAL_EXTENT, NEXT_EXTENT, MIN_EXTENTS, MAX_EXTENTS ,
------ ------------------------------ ---------------- PCT_INCREASE from dba_rollback_segs where segment_name like 'R%';
SYS SYSTEM ONLINE
PUBLIC _SYSSMU1$ OFFLINE PROP NOMBRE INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS
PUBLIC _SYSSMU2$ OFFLINE MAX_EXTENTS PCT_INCREASE
PUBLIC _SYSSMU3$ OFFLINE ------ ---------- -------------- ----------- -----------

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 71 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 72
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

----------- ------------ ORACLE instance shut down.


PUBLIC RP01 102400 102400 2 SQL> startup
10 0 ORACLE instance started.
SYS RPR01 102400 102400 2
32765 0 Total System Global Area 34148352 bytes
PUBLIC R_BORRAR 102400 102400 2 Fixed Size 450560 bytes
10 0 Variable Size 29360128 bytes
Database Buffers 4194304 bytes
Redo Buffers 143360 bytes
36. Desactivar los segmentos de "rollback" RP01 y RPR01. Database mounted.
Database opened.
SQL> ALTER ROLLBACK SEGMENT RP01 offline;

Rollback segment altered. 39. Volver a realizar los ejercicios 26 y 27.

SQL> ALTER ROLLBACK SEGMENT RPR01 offline;


Vease resolución de ejercicios anteriores.
Rollback segment altered.
40. Desactivar el segmento de "rollback" RP01.
37. Parar y arrancar la base de datos, comprobar de nuevo el ejercicio 33. ¿Qué sucede con los segmentos de "rollback"
SQL> alter rollback segment rp01 offline;
RP01 y RPR01?.
Rollback segment altered.
Vease resolución del ejercicio anterior.
41. Intentar borrar los segmentos de "rollback" RP01 y RPR01, ¿qué sucede?.
38. Modificar el init.ora de la base de datos de forma que esté declarado el segmento de "rollback" RPR01. Parar y SQL> drop rollback segment rp01;
arrancar la base de datos.
Rollback segment dropped.
En el fichero init<SID>.ora:
SQL> drop rollback segment rpr01;
rollback_segments = ( RPR01 ) drop rollback segment rpr01
*
ERROR at line 1:
ORA-01545: rollback segment 'RPR01' specified not available
/u01/app/oracle/admin/CURSO01/pfile (CURSO01)> sqlplus /nolog

SQL*Plus: Release 9.2.0.1.0 - Production on Mon Nov 22 10:03:34 42. Desactivar el segmento de "rollback" RPR01 y borrarlo.
2004
SQL> alter rollback segment rpr01 offline;
Copyright (c) 1982, 2002, Oracle Corporation. All rights
reserved. Rollback segment altered.
SQL> connect /as sysdba; SQL> drop rollback segment rpr01;
Connected.
SQL> shutdown immediate Rollback segment dropped.
Database closed.
Database dismounted.

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 73 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 74
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

43. Realizar una parada y arranque de la base de datos (sin modificar el init.ora ni la variable donde se declaran los ORA-01556: MINEXTENTS for rollback segment must be greater than 1
segmentos de "rollback"). ¿Cuál es el resultado?. Modificar el init.ora y volver a arrancar la base de datos.

/u01/app/oracle/admin/CURSO01/pfile (CURSO01)> sqlplus /nolog SQL> CREATE PUBLIC ROLLBACK SEGMENT RP01
2 TABLESPACE RBS
SQL*Plus: Release 9.2.0.1.0 - Production on Mon Nov 22 10:09:36 3 STORAGE (INITIAL 100K
2004 4 NEXT 100K
5 MINEXTENTS 2
Copyright (c) 1982, 2002, Oracle Corporation. All rights 6* MAXEXTENTS 1)
reserved. MAXEXTENTS 1)
*
SQL> connect / as sysdba; ERROR at line 6:
Connected. ORA-02221: invalid MAXEXTENTS storage option value
SQL> shutdown immediate
Database closed.
Database dismounted. 45. Idem pero modificando los siguientes parámetros:
ORACLE instance shut down.
- minextents 2
SQL> startup " maxextents 20
ORACLE instance started.
SQL> CREATE PUBLIC ROLLBACK SEGMENT RP01
Total System Global Area 34148352 bytes 2 TABLESPACE RBS
Fixed Size 450560 bytes 3 STORAGE (INITIAL 100K
Variable Size 29360128 bytes 4 NEXT 100K
Database Buffers 4194304 bytes 5 MINEXTENTS 2
Redo Buffers 143360 bytes 6* MAXEXTENTS 20)
Database mounted.
ORA-01092: ORACLE instance terminated. Disconnection forced Rollback segment created.

Buscar el mensaje de error precedente en la documentación en 46. Crear un segmento de "rollback" público llamado RP02 con los mismos parámetros que los anteriores y además:
línea. Modificar el init.ora y rearrancar la base de datos.
" pctincrease 50

44. Crear de nuevo los segmentos de "rollback" ateniéndose a los siguientes parámetros de almacenamiento: SQL> CREATE PUBLIC ROLLBACK SEGMENT RP02
2 TABLESPACE RBS
- minextents 1 3 STORAGE (INITIAL 100K
- maxextents 1 4 NEXT 100K
- initial 100k 5 MINEXTENTS 2
- next 100k 6 MAXEXTENTS 20
7* PCTINCREASE 50)
SQL> CREATE PUBLIC ROLLBACK SEGMENT RP01 PCTINCREASE 50)
2 TABLESPACE RBS *
3 STORAGE (INITIAL 100K ERROR at line 7:
4 NEXT 100K ORA-02192: PCTINCREASE not allowed for rollback segment storage
5 MINEXTENTS 1 clauses
6* MAXEXTENTS 1)
CREATE PUBLIC ROLLBACK SEGMENT RP01
* 47. Crear un segmento de "rollback" público llamado RP02 con los mismos parámetros que los anteriores.
ERROR at line 1:

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 75 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 76
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

SQL> CREATE PUBLIC ROLLBACK SEGMENT RP02 ERROR at line 1:


2 TABLESPACE RBS ORA-01598: rollback segment 'RP02' is not online
3 STORAGE (INITIAL 100K
4 NEXT 100K
5 MINEXTENTS 2 SQL> ALTER ROLLBACK SEGMENT RP03 shrink;
6* MAXEXTENTS 20) ALTER ROLLBACK SEGMENT RP03 shrink
*
Rollback segment created. ERROR at line 1:
ORA-01598: rollback segment 'RP03' is not online

48. Crear un segmento de "rollback" público llamado RP03 con un optimal de 50k. Idem con un optimal de 300K. SQL> ALTER ROLLBACK SEGMENT RP02 online;

SQL> CREATE PUBLIC ROLLBACK SEGMENT RP03 Rollback segment altered.


2 TABLESPACE RBS
3 STORAGE (INITIAL 100K SQL> c.rp02.rp03.
4 NEXT 100K 1* ALTER ROLLBACK SEGMENT rp03 online
5 MINEXTENTS 2 SQL> r
6 MAXEXTENTS 20 1* ALTER ROLLBACK SEGMENT rp03 online
7* OPTIMAL 50K )
CREATE PUBLIC ROLLBACK SEGMENT RP03 Rollback segment altered.
*
ERROR at line 1: SQL> ALTER ROLLBACK SEGMENT RP02 SHRINK;
ORA-01593: rollback segment optimal size (25 blks) is smaller than
the computed initial size (100 blks) Rollback segment altered.

SQL> c.rp02.rp03.
Buscar el error producido en la documentación en línea. 1* ALTER ROLLBACK SEGMENT rp03 SHRINK
SQL> r
1* ALTER ROLLBACK SEGMENT rp03 SHRINK
SQL> CREATE PUBLIC ROLLBACK SEGMENT RP03
2 TABLESPACE RBS Rollback segment altered.
3 STORAGE (INITIAL 100K
4 NEXT 100K
5 MINEXTENTS 2 51. Desactivar todos los segmentos de "rollback" (incluido el SYSTEM).
6 MAXEXTENTS 20
7* OPTIMAL 300K ) SQL> select segment_name, status from dba_rollback_segs;

Rollback segment created. SEGMENT_NAME STATUS


------------------------------ ----------------
SYSTEM ONLINE
49. Repetir los ejercicios 26 y 27 anteriores. _SYSSMU1$ OFFLINE
_SYSSMU2$ OFFLINE
Vease resolución de ejercicios anteriores. _SYSSMU3$ OFFLINE
_SYSSMU4$ OFFLINE
_SYSSMU5$ OFFLINE
50. Decrementar el tamaño de los segmentos de "rollback" RP02 y RP03. Activar RP02 y RP03, repetir la operación.
_SYSSMU6$ OFFLINE
_SYSSMU7$ OFFLINE
_SYSSMU8$ OFFLINE
SQL> ALTER ROLLBACK SEGMENT RP02 SHRINK;
R_BORRAR ONLINE
ALTER ROLLBACK SEGMENT RP02 SHRINK
RP01 OFFLINE
*

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 77 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 78
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

SEGMENT_NAME STATUS SQL> drop rollback segment rp02;


------------------------------ ----------------
RP02 ONLINE Rollback segment dropped.
RP03 ONLINE
SQL> drop rollback segment rp03;
13 rows selected.
Rollback segment dropped.

SQL> alter rollback segment r_borrar offline;


53. Intentar borrar el segmento de "rollback" SYSTEM, ¿qué sucede?.
Rollback segment altered.

SQL> alter rollback segment rp02 offline; SQL> select segment_name, status from dba_rollback_segs where
status='ONLINE';
Rollback segment altered.
SEGMENT_NAME STATUS
SQL> alter rollback segment rp03 offline; ------------------------------ ----------------
SYSTEM ONLINE
Rollback segment altered.

SQL> alter rollback segment system offline; SQL> drop rollback segment system;
alter rollback segment system offline drop rollback segment system
* *
ERROR at line 1: ERROR at line 1:
ORA-01597: cannot alter system rollback segment online or offline ORA-01544: cannot drop system rollback segment

52. Borrar todos los segmentos de "rollback" de la base de datos (excepto el SYSTEM). 54. Crear segmentos de "rollback" públicos RP01, RP02, RP03, ... RP20 con los parámetros:

SQL> select segment_name, status from dba_rollback_segs; - minextents 2


- maxextents 20
SEGMENT_NAME STATUS - initial 100k
------------------------------ ---------------- - next 100k
SYSTEM ONLINE - optimal 500K
_SYSSMU1$ OFFLINE
_SYSSMU2$ OFFLINE
_SYSSMU3$ OFFLINE Editar un fichero llamado crea_segmentos.sql, por ejemplo, que
_SYSSMU4$ OFFLINE contenga todas las sentencias de creación del tipo:
_SYSSMU5$ OFFLINE
_SYSSMU6$ OFFLINE
_SYSSMU7$ OFFLINE CREATE PUBLIC ROLLBACK SEGMENT RP01
_SYSSMU8$ OFFLINE TABLESPACE RBS
RP01 OFFLINE STORAGE (INITIAL 100K
NEXT 100K
10 rows selected. MINEXTENTS 2
MAXEXTENTS 20
SQL> drop rollback segment r_borrar; OPTIMAL 500K)
/
Rollback segment dropped. CREATE PUBLIC ROLLBACK SEGMENT RP02

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 79 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 80
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

TABLESPACE RBS 6 MAXEXTENTS 20


STORAGE (INITIAL 100K 7* OPTIMAL 500K)
NEXT 100K CREATE PUBLIC ROLLBACK SEGMENT RP21
MINEXTENTS 2 *
MAXEXTENTS 20 ERROR at line 1:
OPTIMAL 500K) ORA-01031: insufficient privileges
/
...
58. Intentar borrar el segmento de "rollback" RP21 y el RP20 sin poseer los privileios necesarios para realizarlo,
Ejecutar desde sqlplus el fichero de la siguiente forma: desactivarlos previamente (conectarse como usuario SCOTT).

SQL> @crea_segmentos.sql SQL> alter rollback segment rp20 offline;


alter rollback segment rp20 offline
*
55. Poner todos los segmentos anteriores en línea. ERROR at line 1:
ORA-01031: insufficient privileges
Editar un fichero llamado enlínea_segmentos.sql, por ejemplo,
que contenga todas las sentencias del tipo:
59. Intentar modificar los segmentos de "rollback" RP19 y el RP18, sin poseer los privilegios necesarios para realizarlo,
conectarse como usuario SCOTT, asignando:
Alter ROLLBACK SEGMENT RP01 online;
- maxextents 25
Ejecutar desde sqlplus el fichero de la siguiente forma: - next 200k
" optimal 1M
SQL> @enlínea_segmentos.sql

SQL> alter rollback segment rp18


56. Modificar los segmentos de "rollback" RP01 y RP02, indicando los siguientes parámetros: 2 storage (next 200k
3 maxextents 25
- minextents 1 4* optimal 1M)
" initial 200k alter rollback segment rp18
*
ERROR at line 1:
SQL> alter rollback segment rp01 ORA-01031: insufficient privileges
2 storage (minextents 1
3* initial 200k);
initial 200k); 60. Conectarse como usuario SYSTEM y realizar el ejercicio anterior.
*
ERROR at line 3: SQL> connect system
ORA-02203: INITIAL storage options not allowed Enter password:
Connected.
57. Intentar crear el segmento de "rollback" RP21 con las mismas caracteristicas que los anteriores pero sin poseer los SQL> alter rollback segment rp18
privilegios necesarios para realizarlo (conectarse cmo usuario SCOTT). 2 storage (next 200k
3 maxextents 25
SQL> CREATE PUBLIC ROLLBACK SEGMENT RP21 4* optimal 1M)
2 TABLESPACE RBS
3 STORAGE (INITIAL 100K Rollback segment altered.
4 NEXT 100K
5 MINEXTENTS 2

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 81 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 82
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

61. Realizar una inserción en la tabla SCOTT.DEPT, conectarse como SCOTT, previamente asignar a la transacción el RP11 19 512000
segmento de "rollback" RP19. Los valores seran los siguientes:
SEGMENT_NAME SEGMENT_ID OPTSIZE
- DEPTNO 50 ------------------------------ ---------- ----------
- DNAME INFORMATICA RP12 20 512000
- LOC MURCIA RP13 21 512000
RP14 22 512000
SQL> connect scott RP15 23 512000
Enter password: RP16 24 512000
Connected. RP17 25 512000
SQL> SET TRANSACTION USE ROLLBACK SEGMENT rp19; RP18 26 1048576
RP19 27 512000
Transaction set. RP20 28 512000
SYSTEM 0
SQL> insert into scott.dept values (50,'INFORMATICA','MURCIA');

1 row created.

SQL> commit;

Commit complete.

62. Modificar el parámetro OPTIMAL de los segmentos de "rollback" RP01 a RP10, fijándolo en 100K. ¿Es posible?,
¿tiene sentido?.

SQL> alter rollback segment rp05 storage(optimal 100k);

Rollback segment altered.

63. Consultar el valor del parámetro OPTIMAL de los segmentos de "rollback" definidos en la base de datos.

SQL> select a.segment_name, a.segment_id, b.optsize from


dba_rollback_segs a, v$rollstat b
2 where a.segment_id=b.usn
3* order by a.segment_name

SEGMENT_NAME SEGMENT_ID OPTSIZE


------------------------------ ---------- ----------
RP01 10
RP02 9 512000
RP03 11 512000
RP04 12 512000
RP05 13 102400
RP06 14 512000
RP07 15 512000
RP08 16 512000
RP09 17 512000
RP10 18 512000

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 83 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 84
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

SQL> DESC DBA_ROLE_PRIVS


PRACTICAS TEMA 7. Nombre ¿Nulo? Tipo
----------------------------------------- --------
USUARIOS, PERFILES, PRIVILEGIOS Y ROLES. -----------------------
GRANTEE VARCHAR2(30)
GRANTED_ROLE NOT NULL VARCHAR2(30)
ADMIN_OPTION VARCHAR2(3)
7. Buscar en la documentación en línea el contenido de las vistas: DEFAULT_ROLE VARCHAR2(3)

• dba_profiles SQL> desc DBA_TAB_PRIVS


• dba_roles Nombre ¿Nulo? Tipo
------------------------------------------ --------
• dba_users
--------------------
• dba_role_privs GRANTEE NOT NULL VARCHAR2(30)
• dba_tab_privs OWNER NOT NULL VARCHAR2(30)
• dba_sys_privs TABLE_NAME NOT NULL VARCHAR2(30)
GRANTOR NOT NULL VARCHAR2(30)
PRIVILEGE NOT NULL VARCHAR2(40)
SQL> DESC DBA_PROFILES GRANTABLE VARCHAR2(3)
Nombre ¿Nulo? Tipo HIERARCHY VARCHAR2(3)
----------------------------------------- --------
----------------------- SQL> DESC DBA_SYS_PRIVS
PROFILE NOT NULL VARCHAR2(30) Nombre ¿Nulo? Tipo
RESOURCE_NAME NOT NULL VARCHAR2(32) ----------------------------------------- --------
RESOURCE_TYPE VARCHAR2(8) -----------------------
LIMIT VARCHAR2(40) GRANTEE NOT NULL VARCHAR2(30)
PRIVILEGE NOT NULL VARCHAR2(40)
SQL> DESC DBA_ROLES ADMIN_OPTION VARCHAR2(3)
Nombre ¿Nulo? Tipo
----------------------------------------- --------
----------------------- 8. Conectarse como usuario SYSTEM a la base y crear un usuario llamado “administrador” autentificado por la base
ROLE NOT NULL VARCHAR2(30) de datos. Indicar como "tablespace" por defecto USERS y como "tablespace" temporal TEMP; asignar una cuota de
PASSWORD_REQUIRED VARCHAR2(8) 500K en el "tablespace" USERS.
SQL> DESC DBA_USERS
Nombre ¿Nulo? Tipo SQL> CREATE USER ADMINISTRADOR IDENTIFIED BY ADMIN
----------------------------------------- -------- 2 DEFAULT TABLESPACE USERS
----------------------- 3 TEMPORARY TABLESPACE TEMP
USERNAME NOT NULL VARCHAR2(30) 4 QUOTA 500K ON USERS;
USER_ID NOT NULL NUMBER
PASSWORD VARCHAR2(30) User created.
ACCOUNT_STATUS NOT NULL VARCHAR2(32)
LOCK_DATE DATE
EXPIRY_DATE DATE SQL> SELECT USERNAME FROM DBA_USERS WHERE
DEFAULT_TABLESPACE NOT NULL VARCHAR2(30) USERNAME='ADMINISTRADOR';
TEMPORARY_TABLESPACE NOT NULL VARCHAR2(30)
CREATED NOT NULL DATE USERNAME
PROFILE NOT NULL VARCHAR2(30) ------------------------------
INITIAL_RSRC_CONSUMER_GROUP VARCHAR2(30) ADMINISTRADOR
EXTERNAL_NAME VARCHAR2(4000)

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 85 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 86
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

defecto USERS y como "tablespace" temporal TEMP; asignar una cuota de 0K en el "tablespace" USERS. ¿Es
posible hacerlo?.
9. Abrir una sesión sqlplus e intentar conectarse como usuario “administrador”, ¿qué sucede?, ¿por qué?.

SQL> show user


/u01/app/oracle/admin/CURSO01/creacion (CURSO01)> sqlplus USER is "ADMINISTRADOR"

SQL*Plus: Release 9.2.0.1.0 - Production on Mon Nov 22 12:50:48 SQL> r


2004 1 create user prueba00 identified by prueba00
2 default tablespace users
Copyright (c) 1982, 2002, Oracle Corporation. All rights 3 temporary tablespace temp
reserved. 4* quota 0k on users
create user prueba00 identified by prueba00
Enter user-name: administrador *
Enter password: ERROR at line 1:
ERROR: ORA-01031: insufficient privileges
ORA-01045: user ADMINISTRADOR lacks CREATE SESSION privilege;
logon denied
13. Conectado como usuario SYSTEM, otorgar el privilegio “create user” al usuario “administrador” y repetir el ejercicio
anterior.
10. Averiguar qué privilegios de sistema, roles y privilegios sobre objetos tiene concedidos el usuario “administrador”.
/u01/app/oracle/admin/CURSO01 (CURSO01)> sqlplus

SQL> select * from dba_role_privs where grantee='ADMINISTRADOR'; SQL*Plus: Release 9.2.0.1.0 - Production on Mon Nov 22 12:55:31
2004
no rows selected
Copyright (c) 1982, 2002, Oracle Corporation. All rights
SQL> select * from dba_tab_privs where grantee='ADMINISTRADOR'; reserved.

no rows selected Enter user-name: system


Enter password:
SQL> select * from dba_sys_privs where grantee='ADMINISTRADOR';
Connected to:
no rows selected Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning and Oracle Label Security options
JServer Release 9.2.0.1.0 - Production
11. Otorgar el privilegio “CREATE SESSION” al usuario “administrador” e intentar de nuevo la conexión sqlplus.
SQL> grant create user to administrador;

SQL> grant create session to administrador; Grant succeeded.

Grant succeeded. SQL> connect administrador


Enter password:
SQL> connect administrador Connected.
Enter password:
Connected. SQL> create user prueba00 identified by prueba00
SQL> 2 default tablespace users
3 temporary tablespace temp
4* quota 0k on users
12. Conectarse como usuario “administrador” y crear un usuario llamado “prueba00” que tenga como "tablespace" por

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 87 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 88
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

User created. RECOVERY_CATALOG_OWNER CREATE SESSION


NO

14. Averiguar que usuarios de la base de datos tienen asignado el privilegio “create user” de forma directa, ¿qué vista
debe ser consultada?. 16. Crear dos "tablespace" llamados NOMINA y ACADEMO, que contendrán datos relativos a las aplicaciones de
nomina y datos académicos de los empleados de una empresa, según las siguientes características:

SQL> connect system


Introduzca su clave: ACADEMO NOMINA
Connected.
Tamaño inicial 1M 1M
SQL> desc dba_sys_privs Autoextensible SI SI
Nombre ¿Nulo? Tipo Extensión 200K 100K
----------------------------------------- -------- Tamaño máximo 1400K 1500K
-----------------------
GRANTEE NOT NULL VARCHAR2(30) Parámetros Initial 16K 16K
PRIVILEGE NOT NULL VARCHAR2(40) almacenamiento
ADMIN_OPTION VARCHAR2(3) Next 16K 16K
Minextents 1 1
Maxextents 3 3
SQL> select * from dba_sys_privs where privilege ='CREATE USER';
Localización /u02/oradata/<bd> /u02/oradata/<bd>
GRANTEE PRIVILEGE
ADM
------------------------------
---------------------------------------- --- Consulte la ayuda en línea si no recuerda la sintaxis exacta de la sentencia.
DBA CREATE USER
YES
ADMINISTRADOR CREATE USER SQL> create tablespace academo datafile
NO '/u02/oradata/CURSO01/academo01.dbf' size 1M
IMP_FULL_DATABASE CREATE USER 2 autoextend on next 200k maxsize 1400K
NO 3 default storage (initial 16k next 16k
4 minextents 1 maxextents 3);

15. Hacer lo mismo para el privilegio “create session”. Tablespace created.

SQL> create tablespace nomina datafile


SQL> select * from dba_sys_privs where privilege ='CREATE '/u02/oradata/CURSO01/nomina01.dbf' size 1M
SESSION'; 2 autoextend on next 100K maxsize 1500K
3 default storage (initial 16k next 16k
GRANTEE PRIVILEGE 4 minextents 1 maxextents 3);
ADM
------------------------------ Tablespace created.
---------------------------------------- ---
DBA CREATE SESSION
YES 17. Crear dos "tablespace" temporales, manejados de forma local, llamados TEMP_NOMINA y TEMP_ACADEMO con
CONNECT CREATE SESSION las siguientes características:
NO
ADMINISTRADOR CREATE SESSION
NO TEMP_ACADEMO TEMP_NOMINA

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 89 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 90
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

Tamaño inicial 500K 600K


Autoextensible SI SI 20. Comprobar en el diccionario de datos los usuarios o roles que poseen el privilegio “CREATE ROLE”.
Extensión 50K 50K
Tamaño máximo 600K 700K
SQL> select * from dba_sys_privs where privilege ='CREATE ROLE';

Localización /u04/oradata/<bd> /u04/oradata/<bd> GRANTEE PRIVILEGE


ADM
------------------------------
SQL> create temporary tablespace temp_academo ---------------------------------------- ---
2 tempfile '/u04/oradata/CURSO01/temp_academo01.dbf' DBA CREATE ROLE
3 size 500k autoextend on next 50k maxsize 600k YES
4 extent management local uniform size 100k; IMP_FULL_DATABASE CREATE ROLE
NO
Tablespace created.

SQL> create temporary tablespace temp_nomina 21. Crear un rol llamado “ADMIN”, asignarle los privilegios “create session”, “create user” y “CREATE ROLE”. Asignarlo
2 tempfile '/u04/oradata/CURSO01/temp_nomina01.dbf' al usuario administrador.
3 size 600k autoextend on next 50k maxsize 700k
4 extent management local uniform size 100k;
SQL> create role admin;
Tablespace created.
Role created.

18. Estando conectado como usuario “administrador” probar a crear un rol llamado “administrador”, ¿qué ocurre?. SQL> grant create session to admin;

Grant succeeded.
SQL> connect administrador
Enter password: SQL> c.session.user.
Connected. 1* grant create user to admin
SQL> create role administrador; SQL> r
create role administrador 1* grant create user to admin
*
ERROR at line 1: Grant succeeded.
ORA-01031: insufficient privileges
SQL> c.user.role.
1* grant create role to admin
19. Idem estando conectado como usuario SYSTEM, ¿qué sucede?, ¿por qué?. SQL> r
1* grant create role to admin

SQL> connect system Grant succeeded.


Enter password:
Connected. SQL> grant admin to administrador;
SQL> create role administrador;
create role administrador Grant succeeded.
*
ERROR at line 1:
ORA-01921: role name 'ADMINISTRADOR' conflicts with another user 22. Consultar los privilegios de sistema que tiene asignados de forma directa el usuario “administrador”, revocarlos y
or role name asignarle el rol “admin.”.

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 91 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 92
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

--
PRUEBA01 SYSTEM SYSTEM
SQL> select * from dba_sys_privs where grantee ='ADMINISTRADOR' PRUEBA00 USERS TEMP
ADMINISTRADOR USERS TEMP
GRANTEE PRIVILEGE SYSTEM SYSTEM TEMP
ADM SYS SYSTEM TEMP
------------------------------
---------------------------------------- --- SQL> select substr(username,1,15) usuario, tablespace_name,
ADMINISTRADOR CREATE SESSION max_bytes from dba_ts_quotas where username in
NO ('SYS','SYSTEM','ADMINISTRADOR','PRUEBA00','PRUEBA01')
ADMINISTRADOR CREATE USER
NO USUARIO TABLESPACE_NAME MAX_BYTES
--------------- ------------------------------ ----------
SQL> revoke create session from administrador; ADMINISTRADOR USERS 512000

Revoke succeeded.

SQL> c.session.user. 25. Crear un usuario llamado “prueba02” autenticado por base de datos, asignando como "tablespace" por defecto
1* revoke create user from administrador NOMINA y como "tablespace" temporal TEMP_NOMINA (no se le asignara cuota en NOMINA).
SQL> r
1* revoke create user from administrador
SQL> create user prueba02 identified by prueba02
Revoke succeeded. 2 default tablespace nomina
3 temporary tablespace temp_nomina;
SQL> grant admin to administrador;
User created.
Grant succeeded.

26. Asignar al usuario “prueba01” los "tablespace" ACADEMO y TEMP_ACADEMO como "tablespace" de trabajo y
23. Crear, conectado como SYSTEM, un usuario llamado “prueba01” autenticado por base de datos al que no se le temporal respectivamente (sin especificar cuota).
asigne "tablespace" por defecto ni temporal.
SQL> alter user prueba01 temporary tablespace temp_academo;
SQL> create user prueba01 identified by prueba01;
User altered.
User created.
SQL> alter user prueba01 default tablespace academo;

24. Consultar en las vistas correspondientes los "tablespaces" y la quota en cada uno de ellos que tiene los usuarios User altered.
SYS, SYSTEM, “administrador”, “prueba00” y “prueba01”. ¿Qué ha ocurrido con el usuario “prueba01”?.

27. Consultar en las vistas correspondientes los "tablespace" y la cuota en cada uno de ellos que tiene los usuarios
SQL> select substr(username,1,15) usuario, DEFAULT_TABLESPACE , “prueba01” y “prueba02”.
TEMPORARY_TABLESPACE
2 from dba_users SQL> select * from dba_ts_quotas where username in
3 where username in ('PRUEBA01','PRUEBA02');
('SYS','SYSTEM','ADMINISTRADOR','PRUEBA00','PRUEBA01');
no rows selected
USUARIO DEFAULT_TABLESPACE
TEMPORARY_TABLESPACE
------------------------------------------------------------------ 28. Crear un rol llamado “CONEXIÓN” y asignarle el permiso “CREATE SESSION”.

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 93 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 94
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

SQL> create role conexion;


SQL> connect prueba01
Role created. Enter password:
Connected.
SQL> grant create session to conexion;
SQL> CREATE TABLE CODIGOS
Grant succeeded. 2 (CODIGO varchar2(3),
3 DESCRIPCION varchar2(20))
4 TABLESPACE ACADEMO
29. Asignar el rol “CONEXIÓN” a los usuarios “prueba00”, “prueba01” y “prueba02”. 5 STORAGE (INITIAL 64K
6 NEXT 64K
7 MINEXTENTS 5
SQL> grant conexion to prueba00, prueba01, prueba02; 8* MAXEXTENTS 10)
CREATE TABLE CODIGOS
Grant succeeded. *
ERROR at line 1:
ORA-01031: insufficient privileges

30. Comprobar en la vista correspondiente cuales son los roles asignados a los usuarios “prueba00”, “prueba01” y
“prueba02”. 32. Crear un rol llamado “DESARROLLO” y asignarle los permisos "CREATE SEQUENCE", "CREATE SESSION",
"CREATE SYNONYM", "CREATE TABLE" y "CREATE VIEW". Asignar el rol “DESARROLLO” a los usuarios
“prueba00”, “prueba01” y “prueba02”.
SQL> select * from dba_role_privs where grantee in
('PRUEBA00','PRUEBA01','PRUEBA02');
SQL> connect system
GRANTEE GRANTED_ROLE ADM Enter password:
DEF Connected.
------------------------------ ------------------------------ ---
--- SQL> create role desarrollo;
PRUEBA00 CONEXION NO
YES Role created.
PRUEBA01 CONEXION NO
YES SQL> grant create sequence, create session, create synonym, create
PRUEBA02 CONEXION NO table, create view to desarrollo;
YES
Grant succeeded.

31. Conectarse como usuario “prueba01” y crear la tabla siguiente en el "tablespace" ACADEMO: SQL> grant desarrollo to prueba00, prueba01, prueba02;

CREATE TABLE CODIGOS Grant succeeded.


(CODIGO varchar2(3),
DESCRIPCION varchar2(20))
TABLESPACE ACADEMO
STORAGE (INITIAL 64K 33. Volver a repetir el ejercicio 25. ¿Se genera algún error?.
NEXT 64K
MINEXTENTS 5
MAXEXTENTS 10);
SQL> connect prueba01
Introduzca su clave:
Connected.
¿Es posible hacerlo?, ¿falta algún permiso?.

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 95 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 96
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

SQL> CREATE TABLE CODIGOS User altered.


2 (CODIGO varchar2(3),
3 DESCRIPCION varchar2(20))
4 TABLESPACE ACADEMO 36. Obtener información sobre roles, privilegios de sistema, "tablespace" y cuotas para los usuarios “prueba00”,
5 STORAGE (INITIAL 64K “prueba01” y “prueba02”.
6 NEXT 64K
7 MINEXTENTS 5
8* MAXEXTENTS 10) SQL> select * from dba_role_privs where grantee in
CREATE TABLE CODIGOS ('PRUEBA00','PRUEBA01','PRUEBA02');
*
ERROR at line 1: GRANTEE GRANTED_ROLE ADM
ORA-01950: no privileges on tablespace 'ACADEMO' DEF
------------------------------ ------------------------------ ---
---
34. Asignar cuota ilimitada al usuario “prueba01” en el "tablespace" ACADEMO. Volver a repetir el ejercicio 26. PRUEBA00 CONEXION NO
YES
PRUEBA00 DESARROLLO NO
SQL> connect system YES
Enter password: PRUEBA01 CONEXION NO
Connected. YES
PRUEBA01 DESARROLLO NO
SQL> alter user prueba01 quota unlimited on academo; YES
PRUEBA02 CONEXION NO
User altered. YES
PRUEBA02 DESARROLLO NO
SQL> connect prueba01 YES
Enter password:
Connected. 6 rows selected.

SQL> CREATE TABLE CODIGOS SQL> select * from dba_sys_privs where grantee in
(CODIGO varchar2(3), ('PRUEBA00','PRUEBA01','PRUEBA02')
DESCRIPCION varchar2(20)) 2 ;
TABLESPACE ACADEMO
STORAGE (INITIAL 64K no rows selected
NEXT 64K
MINEXTENTS 5 SQL> select USERNAME , TABLESPACE_NAME , BYTES from
MAXEXTENTS 10); dba_ts_quotas where username in
('PRUEBA00','PRUEBA01','PRUEBA02');
Table created.
USERNAME TABLESPACE_NAME
BYTES
35. Asignar cuota ilimitada al usuario “prueba02” en el "tablespace" NOMINA. ------------------------------ ------------------------------
----------
PRUEBA02 ACADEMO
SQL> connect system 0
Introduzca su clave: PRUEBA01 ACADEMO
Connected. 327680

SQL> alter user prueba02 quota unlimited on academo;

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 97 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 98
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

37. Asignar cuota cero en el "tablespace" por defecto para el usuario “prueba01”, ¿siguen estando sus objetos?, ¿es
posible crear algún otro? (probad a crear un tabla). User altered.

SQL> alter user prueba01 quota 0k on academo; 40. Averiguar que usuarios o roles de base de datos tienen asignado el privilegio ALTER USER.

User altered.
SQL> connect system
SQL> select owner, table_name from dba_tables where Introduzca su clave:
owner='PRUEBA01'; Conectado.

OWNER TABLE_NAME SQL> select * from dba_sys_privs where privilege='ALTER USER';


------------------------------ ------------------------------
PRUEBA01 CODIGOS GRANTEE PRIVILEGE
ADM
SQL> connect prueba01 ------------------------------
Enter password: ---------------------------------------- ---
Connected. DBA ALTER USER
YES
SQL> CREATE TABLE CODIGOS2(CODIGO varchar2(3),
DESCRIPCION varchar2(20))
TABLESPACE ACADEMO 41. Abrir una sesión con el usuario “administrador” y otra con el usuario “prueba02”. Siendo el usuario “administrador”,
STORAGE (INITIAL 64K intentar borrar el usuario “prueba02”.
NEXT 64K
MINEXTENTS 5
MAXEXTENTS 10); SQL> show user
CREATE TABLE CODIGOS2(CODIGO varchar2(3), USER es "SYSTEM"
*
ERROR at line 1: SQL> drop user prueba02;
ORA-01536: space quota exceeded for tablespace 'ACADEMO' drop user prueba02
*
ERROR en línea 1:
38. Conectarse como usuario “prueba01” e intentar modificar su cuota en el "tablespace" ACADEMO, ¿es posible?. ORA-01940: no se puede borrar un usuario conectado actualmente

SQL> connect prueba01 42. Asignar el permiso DROP USER al rol ADMIN.
Introduzca su clave:
Connected.
SQL> grant drop user to admin;
SQL> alter user prueba01 quota unlimited on academo;
alter user prueba01 quota unlimited on academo Grant succeeded.
*
ERROR at line 1:
ORA-01031: insufficient privileges 43. Averiguar que usuarios o roles de base de datos tienen asignado el privilegio DROP USER.

39. Conectarse como usuario “prueba01” y modificar su clave, ¿es posible?. SQL> select * from dba_sys_privs where privilege='DROP USER';

GRANTEE PRIVILEGE
SQL> alter user prueba01 identified by probando01; ADM

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 99 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 100
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

------------------------------
---------------------------------------- ---
ADMIN DROP USER
NO 47. Asignar el permiso “CREATE PROFILE” al rol ADMIN.
DBA DROP USER
YES
IMP_FULL_DATABASE DROP USER SQL> grant create profile to admin;
NO
Grant succeeded.

44. Conectado como usuario "administrador", crear el usuario “prueba03” autentificado por base de datos y asignando
cuotas en el "tablespace" ACADEMO (500K) y NOMINA (200K). Su "tablespace" temporal será TEMP. 48. Averiguar que perfiles están definidos en la base de datos y que límites de recursos fija cada uno de ellos.

SQL> connect administrador SQL> r


Enter password: 1 select substr(profile,1,12) perfil,
Connected. substr(resource_name,1,25) recurso, resource_type,
2 substr(limit,1,10) limite from dba_profiles
SQL> create user prueba03 identified by prueba03 3* order by profile, resource_name
default tablespace academo
temporary tablespace temp PERFIL RECURSO RESOURCE LIMITE
quota 500k on academo ------------ ------------------------- -------- ----------
quota 200k on nomina DEFAULT COMPOSITE_LIMIT KERNEL UNLIMITED
DEFAULT CONNECT_TIME KERNEL UNLIMITED
User created. DEFAULT CPU_PER_CALL KERNEL UNLIMITED
DEFAULT CPU_PER_SESSION KERNEL UNLIMITED
DEFAULT FAILED_LOGIN_ATTEMPTS PASSWORD UNLIMITED
45. Comprobar en el fichero de inicialización si está activado el modo de limitación de recursos. DEFAULT IDLE_TIME KERNEL UNLIMITED
DEFAULT LOGICAL_READS_PER_CALL KERNEL UNLIMITED
DEFAULT LOGICAL_READS_PER_SESSION KERNEL UNLIMITED
Editar con el editor vi, por ejemplo, el fichero de DEFAULT PASSWORD_GRACE_TIME PASSWORD UNLIMITED
inicializacion. DEFAULT PASSWORD_LIFE_TIME PASSWORD UNLIMITED
DEFAULT PASSWORD_LOCK_TIME PASSWORD UNLIMITED

46. Averiguar que usuarios de base de datos o que roles tienen asignado el privilegio “CREATE PROFILE”. PERFIL RECURSO RESOURCE LIMITE
------------ ------------------------- -------- ----------
DEFAULT PASSWORD_REUSE_MAX PASSWORD UNLIMITED
SQL> connect system DEFAULT PASSWORD_REUSE_TIME PASSWORD UNLIMITED
Enter password: DEFAULT PASSWORD_VERIFY_FUNCTION PASSWORD NULL
Connected. DEFAULT PRIVATE_SGA KERNEL UNLIMITED
SQL> select * from dba_sys_privs where privilege='CREATE PROFILE'; DEFAULT SESSIONS_PER_USER KERNEL UNLIMITED

GRANTEE PRIVILEGE 16 rows selected.


ADM
------------------------------
---------------------------------------- --- 49. Consultar que perfiles tiene asignados cada usuario de la base de datos.
DBA CREATE PROFILE
YES
IMP_FULL_DATABASE CREATE PROFILE SQL> select username, profile from dba_users order by username;
NO

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 101 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 102
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

USERNAME PROFILE 1* alter user prueba01 profile desarrollo


------------------------------ ------------------------------
ADMINISTRADOR DEFAULT User altered.
DBSNMP DEFAULT
OUTLN DEFAULT
PRUEBA00 DEFAULT SQL> c.01.02
PRUEBA01 DEFAULT 1* alter user prueba02 profile desarrollo
PRUEBA03 DEFAULT SQL> r
SCOTT DEFAULT 1* alter user prueba02 profile desarrollo
SYS DEFAULT
SYSTEM DEFAULT User altered.

9 rows selected. SQL> c.02.03


1* alter user prueba03 profile desarrollo
SQL> r
50. Crear un perfil llamado “DESARROLLO” con las siguientes especificaciones: 1* alter user prueba03 profile desarrollo

Sessions_per_user 2 User altered.


Cpu_per_session unlimited
Cpu_per_call 6000
Connect_time 480 52. Intentar la conexión dos veces como usuario “prueba01” fallando la contraseña, ¿qué sucede?. Comprobar si la
Idle_time 2 cuenta ha sido bloqueada en la vista de base de datos correspondiente.
Failed_login_attempts 2
Password_life_time 120

SQL> connect prueba01


SQL> r Enter password:
1 create profile desarrollo ERROR:
2 limit ORA-01017: invalid username/password; logon denied
3 sessions_per_user 2
4 cpu_per_session unlimited
5 cpu_per_call 6000 Warning: You are no longer connected to ORACLE.
6 connect_time 480
7 idle_time 2
8 failed_login_attempts 2 ...
9* password_life_time 120
SQL> connect prueba01
Profile created. Enter password:
ERROR:
ORA-28000: the account is locked
51. Asignar el perfil anterior a los usuarios “prueba00”, “prueba01”, “prueba02” y “prueba03”.

SQL> select username, lock_date from dba_users where username


SQL> alter user prueba00 profile desarrollo;
like 'PRUEBA%';
User altered.
USERNAME LOCK_DATE
------------------------------ ---------
SQL> c.00.01
PRUEBA03
1* alter user prueba01 profile desarrollo
PRUEBA00
SQL> r

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 103 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 104
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

PRUEBA01 22-NOV-04 Warning: You are no longer connected to ORACLE.

53. Crear un usuario “prueba04” con el parámetro “password expire”, sus "tablespace" por defecto y temporal serán 55. Modificar el "tablespace" por defecto y el temporal del usuario “prueba01” de forma que sean NOMINA y
USERS (cuota 0k) y TEMP. Asignar los roles CONEXIÓN y DESARROLLO. Conectarse como usuario “prueba04”, TEMP_NOMINA.
¿qué sucede?.

SQL> connect system


SQL> create user prueba04 identified by prueba04 Enter password:
2 default tablespace users Connected.
3 temporary tablespace temp
4 quota 0k on users SQL> alter user prueba04 default tablespace nomina;
5* password expire
User altered.
User created.
SQL> alter user prueba04 temporary tablespace temp_nomina;
SQL> grant conexion, desarrollo to prueba04;
User altered.
Grant succeeded.

SQL> connect prueba04 56. Comprobar cual es el valor del parámetro OS_AUTHENT_PREFIX en la base de datos.
Enter password:
ERROR:
ORA-28001: the password has expired Editar con vi o ejecutar la sentencia pg sobre el fichero de
parametros de inicializacion (init<SID>.ora).

Changing password for prueba04


New password: 57. Cambia la identificación del usuario “prueba01” de forma que sea identificado por el sistema operativo.
Retype new password:
Password changed
Connected. SQL> alter user prueba01 identified externally;

User altered.
54. Bloquear la cuenta del usuario “prueba04”, ¿qué sucede al conectarse de nuevo?.
SQL> set head off
SQL> select * from dba_users where username='PRUEBA01'
SQL> connect system
Enter password: PRUEBA01 26 EXTERNAL
Connected. LOCKED(TIMED) 22-NOV-04 22-MAR-05
ACADEMO TEMP_ACADEMO
SQL> alter user prueba04 account lock; 22-NOV-04
DESARROLLO DEFAULT_CONSUMER_GROUP
User altered.

SQL> connect prueba04 58. Modificar el parámetro OS_AUTHENT_PREFIX de forma que, en adelante, la cadena que identifique a un usuario
Enter password: externo sea “” (cadena vacía).
ERROR:
ORA-28000: the account is locked
Editar con vi o ejecutar la sentencia pg sobre el fichero de
parametros de inicializacion (init<SID>.ora). Indicar:

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 105 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 106
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

os_authent_prefix = ""
62. Asignar el privilegio anterior al rol ADMIN..

59. Desbloquear la cuenta del usuario “prueba04”.


SQL> grant alter profile to admin;

SQL> alter user prueba03 account unlock; Grant succeeded.

63. Comprobar los valores asignados al perfil “DESARROLLO”. Modificar el perfil “DESARROLLO”, desde el usuario
60. Modificar los valores del perfil DEFAULT según se indica en la siguiente tabla: “administrador”, según la siguiente tabla:

Sessions_per_user 5
Cpu_per_session unlimited Sessions_per_user 5
Cpu_per_call 6000 Connect_time DEFAULT
Connect_time 480 Idle_time 30
Idle_time 60
Failed_login_attempts 3 ¿Qué ha sucedido con el resto de los parámetros?. ¿Coincide el valor de “Connect_time” en este perfil con el
Password_life_time 180 que tiene en el perfil DEFAULT?.

SQL> select profile, substr(resource_name,1,25) nombre_recurso,


SQL> alter profile default substr(limit,1,20) limite from dba_profiles where profile =
2 limit 'DESARROLLO';
3 sessions_per_user 5
4 cpu_per_session unlimited PROFILE NOMBRE_RECURSO LIMITE
5 cpu_per_call 6000 ----------------------------------------------------------------
6 connect_time 480 ---
7 idle_time 60 DESARROLLO COMPOSITE_LIMIT DEFAULT
8 failed_login_attempts 3 DESARROLLO SESSIONS_PER_USER 2
9 password_life_time 180; DESARROLLO CPU_PER_SESSION
UNLIMITED
Profile altered. DESARROLLO CPU_PER_CALL 6000
DESARROLLO LOGICAL_READS_PER_SESSION DEFAULT
DESARROLLO LOGICAL_READS_PER_CALL DEFAULT
61. Averiguar que usuarios o roles tienen asignado el privilegio “ALTER PROFILE”. DESARROLLO IDLE_TIME 2
DESARROLLO CONNECT_TIME 480
DESARROLLO PRIVATE_SGA DEFAULT
SQL> select * from dba_sys_privs where privilege='ALTER DESARROLLO FAILED_LOGIN_ATTEMPTS 2
PROFILE'; DESARROLLO PASSWORD_LIFE_TIME 120

GRANTEE PRIVILEGE PROFILE NOMBRE_RECURSO LIMITE


ADM ----------------------------------------------------------------
--------------------------- ----------------------------------- ---
---- DESARROLLO PASSWORD_REUSE_TIME DEFAULT
DBA ALTER PROFILE DESARROLLO PASSWORD_REUSE_MAX DEFAULT
YES DESARROLLO PASSWORD_VERIFY_FUNCTION DEFAULT
DESARROLLO PASSWORD_LOCK_TIME DEFAULT

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 107 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 108
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

DESARROLLO PASSWORD_GRACE_TIME DEFAULT

16 rows selected. SQL> select * from dba_sys_privs where grantee in


('CONNECT','RESOURCE','DBA','EXP_FULL_DATABASE','IMP_FULL_DATABASE
') order by grantee,privilege;
SQL> alter profile desarrollo
2 limit SESSIONS_PER_USER 5 GRANTEE PRIVILEGE
3 connect_time default ADM
4 idle_time 30; ----------------------------------------------------------------
---
Profile altered. CONNECT ALTER SESSION
NO
CONNECT CREATE CLUSTER
64. Averiguar los privilegios de sistema y sobre objetos, así como los roles, que tiene asignados los roles por defecto NO
“CONNECT”, “RESOURCE”, “DBA”, “EXP_FULL_DATABASE” e “IMP_FULL_DATABASE”. CONNECT CREATE DATABASE LINK
¿Considera una buena política de seguridad asignar el rol “CONNECT” a todos los usuarios que precisan NO
conectarse a la base de datos?. CONNECT CREATE SEQUENCE
NO
CONNECT CREATE SESSION
SQL> select * from dba_role_privs where grantee in NO
('CONNECT','RESOURCE','DBA','EXP_FULL_DATABASE','IMP_FULL_DATABASE CONNECT CREATE SYNONYM
') order by grantee, granted_role NO
CONNECT CREATE TABLE
NO
GRANTEE GRANTED_ROLE CONNECT CREATE VIEW
ADM DEF NO
------------------------------ ------------------------------ DBA ADMINISTER DATABASE TRIGGER
--- --- YES
DBA DELETE_CATALOG_ROLE DBA ADMINISTER RESOURCE MANAGER
YES YES YES
DBA EXECUTE_CATALOG_ROLE DBA
YES YES ...
DBA EXP_FULL_DATABASE NO
YES
DBA GATHER_SYSTEM_STATISTICS NO SQL> select grantee, table_name, privilege from dba_tab_privs
YES where grantee in
DBA IMP_FULL_DATABASE NO ('CONNECT','RESOURCE','DBA','EXP_FULL_DATABASE','IMP_FULL_DATABASE
YES ') order by grantee, table_name, privilege
DBA SELECT_CATALOG_ROLE
YES YES DBA DBMS_DEFER_QUERY EXECUTE
EXP_FULL_DATABASE EXECUTE_CATALOG_ROLE NO
YES DBA DBMS_DEFER_SYS EXECUTE
EXP_FULL_DATABASE SELECT_CATALOG_ROLE NO
YES
IMP_FULL_DATABASE EXECUTE_CATALOG_ROLE NO 65. ¿Puede asignarse el perfil “DESARROLLO” al rol “CONNECT”?. ¿Y el perfil “DEFAULT” al perfil “DESARROLLO”?:
YES
IMP_FULL_DATABASE SELECT_CATALOG_ROLE NO
YES No.

10 rows selected.

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 109 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 110
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

66. Averiguar que usuarios o roles de la base de datos tienen asignado el privilegio “DROP PROFILE”. SQL> create role secreto identified by total;

Role created.
SQL> select * from dba_sys_privs where privilege='DROP PROFILE';
SQL> grant secreto to prueba04;
GRANTEE PRIVILEGE ADM
---------------------------------------------------------------- Grant succeeded.
-----
DBA DROP PROFILE YES
IMP_FULL_DATABASE DROP PROFILE NO 70. Averiguar que usuarios poseen el privilegio “ALTER ANY ROLE” (de forma directa o a través de roles).

67. Asignar el privilegio “DROP PROFILE” al rol “ADMIN.”. SQL> select * from dba_sys_privs where privilege='ALTER ANY
ROLE';

SQL> grant drop profile to admin; DBA ALTER ANY ROLE


YES
Grant succeeded.

71. ¿Qué valor tiene en la base de datos el parámetro MAX_ENABLED_ROLES?. Modificar su valor para que, en
adelante, valga 40. Comprobar esta modificacion.
68. Conectarse como usuario “administrador” e intentar eliminar el perfil “DEFAULT”, ¿qué ocurre?.

SQL> show parameters max_enabled_roles


SQL> connect administrador
Enter password: max_enabled_roles integer 30
Connected.

SQL> drop profile default; 72. Averiguar que usuarios poseen el privilegio “GRANT ANY ROLE” (de forma directa o a través de roles).
drop profile default
*
ERROR at line 1: SQL> select * from dba_sys_privs where privilege='GRANT ANY
ORA-00931: missing identifier ROLE';

DBA GRANT ANY ROLE


SQL> drop profile default cascade; YES
drop profile default cascade
*
ERROR at line 1:
ORA-00931: missing identifier

73. Como usuario “administrador”, deasignar el rol “SECRETO” al usuario “prueba04”.


69. Como usuario “administrador” crear el rol “SECRETO” identificado por la contraseña “total” y asignarlo al usuario
“prueba04”.
SQL> revoke secreto from prueba04;
SQL> connect administrador Revoke succeeded.
Enter password:
Connected.
74. Asignar el privilegio “GRANT ANY ROLE” al rol “ADMIN.”.

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 111 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 112
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

SQL> connect prueba03


SQL> connect system Enter password:
Enter password: Connected.
Connected.
SQL> drop role secreto;
SQL> grant grant any role to admin; drop role secreto
*
Grant succeeded. ERROR at line 1:
ORA-01031: insufficient privileges

75. Repetir el ejercicio 66.


78. En caso de que no lo tenga asignado, asignar el rol “CONEXION” y el rol “DESARROLLO” al usuario “prueba04”.
Hacer que solo el rol “CONEXIÓN” este activo cuando se conecte.
SQL> select * from dba_sys_privs where privilege='GRANT ANY
ROLE';
SQL> select * from dba_role_privs where grantee='PRUEBA04';
ADMIN GRANT ANY ROLE
NO GRANTEE GRANTED_ROLE ADM
DBA GRANT ANY ROLE DEF
YES ------------------------------ ------------------------------ ---
---
PRUEBA04 CONEXION NO
76. Averiguar que usuarios poseen el privilegio “DROP ANY ROLE” (de forma directa o a través de roles). YES
PRUEBA04 DESARROLLO NO
YES
SQL> select * from dba_sys_privs where privilege='DROP ANY
ROLE'; SQL> alter user prueba04 default role conexion;

DBA DROP ANY ROLE User altered.


YES
IMP_FULL_DATABASE DROP ANY ROLE
NO 79. Comprobar en la vista apropiada del diccionario de datos los roles activos en la sesión.

77. Asignar permiso de conexión al usuario "prueba03", asignar el rol “SECRETO” al mismo usuario. Conectarse como SQL> select * from dba_role_privs where grantee='PRUEBA04';
este usuario e intentar borrar el rol.
GRANTEE GRANTED_ROLE ADM
DEF
SQL> connect system ------------------------------ ------------------------------ ---
Enter password: ---
Connected. PRUEBA04 CONEXION NO
YES
SQL> grant conexion to prueba03; PRUEBA04 DESARROLLO NO
NO
Grant succeeded.

SQL> grant secreto to prueba03; 80. Conectado como usuario “prueba04”, activar el rol “DESARROLLO” y comprobar de nuevo en la vista apropiada del
diccionario de datos los roles activos en la sesión.
Grant succeeded.

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 113 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 114
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

SQL> connect prueba04 CONNECT CREATE DATABASE LINK


Enter password: NO
Connected.
8 rows selected.
SQL> select * from session_roles;

ROLE 82. Conectarse como usuario SYSTEM y otorgar al usuario "prueba02" el permiso para seleccionar datos de la tabla
------------------------------ códigos (pertenece al usuario "prueba01"). ¿Qué sucede?, ¿por qué?.
CONEXION

SQL> set role all; SQL> show user


USER es "SYSTEM"
Role set.
SQL> grant select on prueba01.codigos to prueba02;
SQL> select * from session_roles; grant select on prueba01.codigos to prueba02
*
ROLE ERROR en línea 1:
------------------------------ ORA-01031: privilegios insuficientes
CONEXION
DESARROLLO
83. Conectarse como usuario "prueba01" y otorgar al usuario "prueba02" el permiso para seleccionar datos de la tabla
códigos; hacerlo de forma que "prueba02" también pueda otorgar el permiso a otros usuarios (opción ADMIN).
81. Asignar el rol "CONNECT" al usuario "ADMIN". ¿Es preciso asignarle los permisos "CREATE PROCEDURE",
"CREATE PUBLIC SYNONYM", "CREATE ROLE", "CREATE TRIGGER"?, ¿Los tiene ya asignados?.
SQL> connect prueba01
Introduzca su clave:
SQL> grant connect to admin; Connected.
Grant succeeded. SQL> grant select on prueba01.codigos to prueba02 with grant
option;
SQL> select * from dba_sys_privs where grantee='CONNECT';
Grant succeeded.
GRANTEE PRIVILEGE
ADM
------------------------------ 84. Conectarse como usuario "prueba02" y otorgar al usuario "prueba03" el permiso para seleccionar datos de la tabla
---------------------------------------- --- códigos.
CONNECT CREATE VIEW
NO SQL> connect prueba02
CONNECT CREATE TABLE Enter password:
NO Connected.
CONNECT ALTER SESSION
NO SQL> grant select on prueba01.codigos to prueba03 ;
CONNECT CREATE CLUSTER
NO Grant succeeded.
CONNECT CREATE SESSION
NO SQL> connect prueba03
CONNECT CREATE SYNONYM Enter password:
NO Connected.
CONNECT CREATE SEQUENCE
NO SQL> select * from prueba01.codigos;

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 115 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 116
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

no rows selected
PRACTICAS TEMA 8.
85. Conectarse como usuario "prueba01" y revocar al usuario "prueba02" el permiso para seleccionar datos de la tabla TRABAJOS (JOBS).
códigos.

SQL> connect prueba01 87. Identificar los procesos de sistema operativo que corresponden al proceso gestor de colas corriendo en la instancia.
Enter password:
Connected.
/u01/app/oracle/admin/CURSO01/pfile (CURSO01)> ps -ef|grep cj
SQL> revoke select on prueba01.codigos from prueba02;
oracle 20321 1 0 14:27 ? 00:00:00 ora_cjq0_CURSO01
oracle 20525 19652 0 15:13 pts/172 00:00:00 grep cj
Revoke succeeded.

88. Comprobar el valor del parámetro job_queue_proceses en el fichero de inicialización.


86. Conectarse como usuario "prueba03" e intentar consultar la tabla códigos. ¿Qué ocurre?, ¿por qué?.

/u01/app/oracle/admin/CURSO01/pfile (CURSO01)> grep job initCURSO01.ora


SQL> connect prueba03
Enter password: job_queue_processes = 10
Connected.

SQL> select * from prueba01.codigos; 89. Eliminar el proceso de sistema operativo gestor de colas mediante la orden “kill”. ¿Qué sucede?, ¿ha afectado a la
select * from prueba01.codigos instancia?, ¿se ha generado algún error en el fichero de alertas?, ¿y alguna traza?.
*
ERROR at line 1: /u01/app/oracle/admin/CURSO01/pfile (CURSO01)> ps -ef|grep CURSO01
ORA-00942: table or view does not exist oracle 20309 1 0 14:27 ? 00:00:00 ora_pmon_CURSO01
oracle 20311 1 0 14:27 ? 00:00:00 ora_dbw0_CURSO01
oracle 20313 1 0 14:27 ? 00:00:00 ora_lgwr_CURSO01
oracle 20315 1 0 14:27 ? 00:00:00 ora_ckpt_CURSO01
oracle 20317 1 0 14:27 ? 00:00:00 ora_smon_CURSO01
oracle 20319 1 0 14:27 ? 00:00:00 ora_reco_CURSO01
oracle 20542 1 0 15:16 ? 00:00:00 ora_cjq0_CURSO01
oracle 20546 19652 0 15:17 pts/172 00:00:00 grep CURSO01

/u01/app/oracle/admin/CURSO01/pfile (CURSO01)> kill -9 20542

/u01/app/oracle/admin/CURSO01/pfile (CURSO01)> ps -ef|grep CURSO01


oracle 20309 1 0 14:27 ? 00:00:00 ora_pmon_CURSO01
oracle 20311 1 0 14:27 ? 00:00:00 ora_dbw0_CURSO01
oracle 20313 1 0 14:27 ? 00:00:00 ora_lgwr_CURSO01
oracle 20315 1 0 14:27 ? 00:00:00 ora_ckpt_CURSO01
oracle 20317 1 0 14:27 ? 00:00:00 ora_smon_CURSO01
oracle 20319 1 0 14:27 ? 00:00:00 ora_reco_CURSO01
oracle 20548 19652 0 15:17 pts/172 00:00:00 grep CURSO01

/u01/app/oracle/admin/CURSO01/pfile (CURSO01)> ps -ef|grep CURSO01


oracle 20309 1 0 14:27 ? 00:00:00 ora_pmon_CURSO01
oracle 20311 1 0 14:27 ? 00:00:00 ora_dbw0_CURSO01
oracle 20313 1 0 14:27 ? 00:00:00 ora_lgwr_CURSO01

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 117 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 118
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

oracle 20315 1 0 14:27 ? 00:00:00 ora_ckpt_CURSO01 LAST_DATE DATE


oracle 20317 1 0 14:27 ? 00:00:00 ora_smon_CURSO01 LAST_SEC VARCHAR2(8)
oracle 20319 1 0 14:27 ? 00:00:00 ora_reco_CURSO01 THIS_DATE DATE
oracle 20556 1 0 15:21 ? 00:00:00 ora_cjq0_CURSO01 THIS_SEC VARCHAR2(8)
NEXT_DATE NOT NULL DATE
oracle 20558 19652 0 15:21 pts/172 00:00:00 grep CURSO01
NEXT_SEC VARCHAR2(8)
TOTAL_TIME NUMBER
BROKEN VARCHAR2(1)
En el fichero de alertas aparece el mensaje:
INTERVAL NOT NULL VARCHAR2(200)
FAILURES NUMBER
Mon Nov 22 15:13:31 2004
WHAT VARCHAR2(4000)
Restarting dead background process CJQ0
NLS_ENV VARCHAR2(4000)
CJQ0 started with pid=8
MISC_ENV RAW(32)
Mon Nov 22 15:18:31 2004
INSTANCE NUMBER
Restarting dead background process CJQ0
CJQ0 started with pid=8
SQL> desc user_jobs
Name Null? Type
----------------------------------------- -------- -------------
90. Fijar el parámetro job_queue_proceses en 1020 procesos. Parar y arrancar la base de datos. ¿Arranca con JOB NOT NULL NUMBER
normalidad?, ¿qué valor toma el parámetro?. LOG_USER NOT NULL VARCHAR2(30)
PRIV_USER NOT NULL VARCHAR2(30)
SCHEMA_USER NOT NULL VARCHAR2(30)
/u01/app/oracle/admin/CURSO01/pfile (CURSO01)> sqlplus /nolog LAST_DATE DATE
LAST_SEC VARCHAR2(8)
SQL*Plus: Release 9.2.0.1.0 - Production on Mon Nov 22 15:24:09 2004 THIS_DATE DATE
THIS_SEC VARCHAR2(8)
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. NEXT_DATE NOT NULL DATE
NEXT_SEC VARCHAR2(8)
SQL> connect / as sysdba; TOTAL_TIME NUMBER
Connected. BROKEN VARCHAR2(1)
INTERVAL NOT NULL VARCHAR2(200)
SQL> shutdown immediate FAILURES NUMBER
Database closed. WHAT VARCHAR2(4000)
Database dismounted. NLS_ENV VARCHAR2(4000)
ORACLE instance shut down. MISC_ENV RAW(32)
INSTANCE NUMBER
SQL> startup
ORA-01078: failure in processing system parameters SQL> desc dba_jobs_running
LRM-00122: value '1020' for 'job_queue_processes' must be between '0' and '1000' Name Null? Type
----------------------------------------- -------- ------------
SID NUMBER
91. Ver el contenido del paquete dbms_job. JOB NUMBER
FAILURES NUMBER
LAST_DATE DATE
LAST_SEC VARCHAR2(8)
Revisar documentacion en linea. THIS_DATE DATE
THIS_SEC VARCHAR2(8)
INSTANCE NUMBER
92. Ver la descripción de las vistas dba_jobs, user_jobs y dba_jobs_running. Buscar la descripción de cada uno de los
campos en la documentación en línea.
93. Como usuario SYSTEM crear un trabajo que llamara al procedimiento descrito seguidamente, también propiedad
del SYSTEM, que permite analizar el esquema de un cierto numero de usuarios y generar las estadísticas internas
SQL> desc dba_jobs usadas por el analizador sintáctico de Oracle.
Name Null? Type Se ejecutara en el momento de su creación y con periodicidad semanal.
----------------------------------------- -------- ----------------
JOB NOT NULL NUMBER
create table usuarios_estadisticas (username varchar2(30) not null,
LOG_USER NOT NULL VARCHAR2(30)
PRIV_USER NOT NULL VARCHAR2(30) fecha date,
SCHEMA_USER NOT NULL VARCHAR2(30) error varchar2(80))

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 119 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 120
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

tablespace users
storage (initial 16K next 16K maxextents 10)
94. Fijar el numero de procesos de ejecucion de trabajos en cero y forzar la ejecución del trabajo, ¿se genera algún
error?. ¿Ha variado el intervalo de ejecución?, ¿qué día de la semana se ejecutara si se fuerza de nuevo su
CREATE OR REPLACE procedure analiza_usuarios as ejecución mañana?.
cursor usuarios is
select username,rowid from system.usuarios_estadisticas;
werror varchar2(80); SQL> alter system set job_queue_processes=0;
wrowid urowid;
begin System altered.
FOR rec_usuarios IN usuarios LOOP
wrowid:=rec_usuarios.rowid; SQL> select job,to_char(last_date, 'dd-mm-yyyy hh24:mi:ss'),
begin to_char(next_date, 'dd-mm-yyyy hh24:mi:ss'),substr(interval,1,25)
DBMS_UTILITY.ANALYZE_SCHEMA(rec_usuarios.username,'ESTIMATE',NULL,33) from dba_jobs;
;
update system.usuarios_estadisticas
JOB TO_CHAR(LAST_DATE,' TO_CHAR(NEXT_DATE,'
SUBSTR(INTERVAL,1,25)
set fecha=sysdate, error=null
------ -------------------
where rowid=rec_usuarios.rowid;
-----------------------------------------
exception
2 22-11-2004 15:31:18 29-11-2004 15:31:18 SYSDATE + 7
when others then
werror:=rpad(sqlerrm,80); SQL> exec dbms_job.run(2);
update system.usuarios_estadisticas
set error=werror, fecha=sysdate PL/SQL procedure successfully completed.
where rowid=wrowid;
end; SQL> select job,to_char(last_date, 'dd-mm-yyyy hh24:mi:ss'),
END LOOP; to_char(next_date, 'dd-mm-yyyy hh24:mi:ss'),substr(interval,1,25)
end analiza_usuarios; from dba_jobs;
/

JOB TO_CHAR(LAST_DATE,' TO_CHAR(NEXT_DATE,'


Crear un "script" llamado crea_trabajo1.sql, por ejemplo, con SUBSTR(INTERVAL,1,25)
el contenido siguiente: ---------- -------------------
------------------------------------
DECLARE 2 22-11-2004 15:37:11 29-11-2004 15:37:11 SYSDATE + 7
v_numjob integer;
begin
dbms_job.submit(v_numjob,'SYSTEM.ANALIZA_USUARIOS;', SYSDATE, 9. Observar, en caso de que se haya producido, el error generado en el ejercicio anterior en el fichero de alertas y
'SYSDATE + 7'); comprobar si se ha creado algún fichero de traza; en caso de existir este ultimo, editarlo con el editor vi y ver su
commit; contenido.
DBMS_OUTPUT.PUT_LINE('Identificador de trabajo es: ' || v_numjob);
end;
/ 10. Como usuario “prueba01” crear un trabajo que llamara al procedimiento descrito seguidamente, también propiedad
de “prueba01”, que permite averiguar a cuales de las tablas propiedad del usuario tienen ocupado mas del 80% de
las extensiones que le son permitidas. Insertara una fila en la tabla “tablas_revision” por cada una de las tablas que
Ejecutarlo desde sqlplus: cumplan la condición.
Se ejecutara cada hora.
SQL> @crea_trabajo1.sql
Previamente debe crearse la siguiente tabla:
Procedimiento PL/SQL terminado correctamente.

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 121 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 122
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

CREATE TABLE tablas_revision


(nombre_tabla varchar2(30), Para ver las caracteristicas de almacenamiento de la tabla
ocupacion number) consultar la vista "user_tables".
storage (initial 100k next 100k);
Crear un "script" llamado chequear_tablas.sql, por ejemplo, que
contenga las sentencias de creacion del procedimiento:
¿En que espacio de almacenamiento se ha creado la tabla?, ¿con que parámetros de almacenamiento?.

SQL> @chequear_tablas.sql
CREATE OR REPLACE procedure chequear_tablas as
Procedure created.
extensiones integer;
maximo_extensiones integer;
ocupacion integer;
Crear un "script" llmado crea_trabajo2.sql, por ejemplo, con el
porcentaje_extensiones integer := 80; contenido siguiente:
cursor c_tablas is select table_name from user_tables;

begin DECLARE
FOR rec_tables IN c_tablas LOOP v_numjob integer;
select count(*) into extensiones begin
from user_extents dbms_job.submit(v_numjob,'PRUEBA01.CHEQUEAR_TABLAS;', SYSDATE,
where segment_name=rec_tables.table_name; 'SYSDATE + 60/1440');
commit;
select max_extents into maximo_extensiones DBMS_OUTPUT.PUT_LINE('Identificador de trabajo es: ' || v_numjob);
from user_tables end;
where table_name=rec_tables.table_name; /

ocupacion:=(round(extensiones*100/maximo_extensiones)); SQL> @crea_trabajo2.sql

IF (ocupacion > porcentaje_extensiones) THEN PL/SQL procedure successfully completed.


insert into tablas_revision values (rec_tables.table_name, ocupacion);
commit;
END IF; SQL> select job,to_char(last_date, 'dd-mm-yyyy hh24:mi:ss'),
to_char(next_date, 'dd-mm-yyyy hh24:mi:ss'),substr(interval,1,25)
END LOOP;
from user_jobs

JOB TO_CHAR(LAST_DATE,' TO_CHAR(NEXT_DATE,'


end chequear_tablas;
SUBSTR(INTERVAL,1,25)
/
-------- -------------------
------------------------------------------
3 23-11-2004 13:13:42 SYSDATE +
SQL> connect prueba01 60/1440
Introduzca su clave:
Connected.
11. Como usuario SYSTEM crear un trabajo que llamara al procedimiento descrito seguidamente, también propiedad del
SQL> CREATE TABLE tablas_revision
SYSTEM, que permite monitorizar el numero de sesiones activas de usuario en la instancia. Se ejecutara cada cinco
2 (nombre_tabla varchar2(30),
3 ocupacion number) minutos.
4 storage (initial 100k next 100k);

Table created. CREATE OR REPLACE procedure monitorizar_usuarios as

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 123 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 124
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

sesiones number(4); storage (initial 100k next 100k);


activas number(4);
cursor c_usuarios is Table created.
select usuario
from usuarios_monitorizados SQL> CREATE TABLE usuarios_monitorizados
where monitorizar = 'S'; (usuario varchar2(30),
monitorizar char(1),
begin descripcion varchar2(80))
FOR rec_usuarios IN c_usuarios LOOP storage (initial 100k next 100k);

Table created.
select nvl(count(*),0) into sesiones
from v$session
Conectarse como usuario SYS y dar permisos sobre vista SESSION:
where username=rec_usuarios.usuario
and status in ('ACTIVE','INACTIVE'); SQL> connect sys as sysdba;
Enter password:
select nvl(count(*),0) into activas Connected.
from v$session SQL> show user
where username=rec_usuarios.usuario USER is "SYS"
and status = 'ACTIVE';
SQL> grant select on V_$SESSION to system;
insert into usuarios_monitorizados_log
values (rec_usuarios.usuario,sysdate,sesiones,activas); Grant succeeded.

END LOOP;
commit; Crear un "script" llamado monitorizar_usuarios.sql, por ejemplo,
end monitorizar_usuarios; que contenga las sentencias de creacion del procedimiento:
/

Previamente deben crearse las siguientes tablas: SQL> @monitorizar_usuarios.sql

CREATE TABLE usuarios_monitorizados_log Procedure created.


(usuario varchar2(30),
fecha_log date,
sesiones number(4),
Crear un "script" llmado crea_trabajo3.sql, por ejemplo, con el
contenido siguiente:
activas number(4))
storage (initial 100k next 100k);
DECLARE
CREATE TABLE usuarios_monitorizados v_numjob integer;
(usuario varchar2(30), begin
monitorizar char(1), dbms_job.submit(v_numjob,'SYSTEM.MONITORIZAR_USUARIOS;', SYSDATE,
descripcion varchar2(80)) 'SYSDATE + 5/1440');
storage (initial 100k next 100k); commit;
DBMS_OUTPUT.PUT_LINE('Identificador de trabajo es: ' || v_numjob);
end;
SQL> CREATE TABLE usuarios_monitorizados_log /
(usuario varchar2(30),
fecha_log date,
sesiones number(4), SQL> @crea_trabajo3.sql
activas number(4))

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 125 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 126
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

PL/SQL procedure successfully completed. monitorización de usuarios, ¿qué sucede?.

SQL> connect prueba01


12. Consultar todos los trabajos definidos para el usuario SYSTEM, obteniendo el numero de trabajo, fecha de la Introduzca su clave:
próxima ejecución, intervalo, numero de fallos producidos, estado (“broken” o no) y su definición. Connected.

SQL> select job, to_char(next_date, 'dd-mm-yyyy SQL> exec dbms_job.remove(4);


hh24:mi:ss'),substr(interval,1,25), failures, broken, what from BEGIN dbms_job.remove(4); END;
dba_jobs where schema_user='SYSTEM'; *
ERROR at line 1:
ORA-23421: job number 4 is not a job in the job queue
JOB TO_CHAR(NEXT_DATE,' SUBSTR(INTERVAL,1,25) ORA-06512: at "SYS.DBMS_SYS_ERROR", line 86
FAILURES B ORA-06512: at "SYS.DBMS_IJOB", line 529
---------- ------------------- ------------------------- ORA-06512: at "SYS.DBMS_JOB", line 171
---------- - ORA-06512: at line 1
WHAT
------------------------------------------------------------------
-------- 15. Conectado como usuario "prueba01", consultar la vista user_jobs y determinar sus trabajos.
1 25-11-2004 11:41:19 SYSDATE + 7
0 N SQL> select job, to_char(next_date, 'dd-mm-yyyy
SYSTEM.ANALIZA_USUARIOS; hh24:mi:ss'),substr(interval,1,25), failures, broken, what from
user_jobs;
2 29-11-2004 15:37:11 SYSDATE + 7
0 N JOB TO_CHAR(NEXT_DATE,' SUBSTR(INTERVAL,1,25)
SYSTEM.ANALIZA_USUARIOS; FAILURES B
---------- ------------------- -------------------------
4 23-11-2004 13:26:43 SYSDATE + 5/1440 ---------- -
N WHAT
SYSTEM.MONITORIZAR_USUARIOS; ------------------------------------------------------------------
--------
3 23-11-2004 13:13:42 SYSDATE + 60/1440
13. Repetir el ejercicio anterior para el usuario “prueba01”. N
PRUEBA01.CHEQUEAR_TABLAS;
SQL> select job, to_char(next_date, 'dd-mm-yyyy
hh24:mi:ss'),substr(interval,1,25), failures, broken, what from
dba_jobs where schema_user='PRUEBA01'; 16. Marcar el trabajo, propiedad del usuario “prueba01”, que realiza el chequeo de tablas como “broken”. Consultar su
estado en la vista user_jobs.
JOB TO_CHAR(NEXT_DATE,' SUBSTR(INTERVAL,1,25)
FAILURES B SQL> exec dbms_job.broken(3,TRUE);
---------- ------------------- -------------------------
---------- - PL/SQL procedure successfully completed.
WHAT
------------------------------------------------------------------ SQL> select job, to_char(next_date, 'dd-mm-yyyy
-------- hh24:mi:ss'),substr(interval,1,25), failures, broken, what from
3 23-11-2004 13:13:42 SYSDATE + 60/1440 user_jobs;
N
PRUEBA01.CHEQUEAR_TABLAS; JOB TO_CHAR(NEXT_DATE,' SUBSTR(INTERVAL,1,25)
FAILURES B
---------- ------------------- -------------------------
14. Conectarse como usuario “prueba01” e intentar eliminar de la cola de trabajos a aquel trabajo que realiza la ---------- -

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 127 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 128
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

WHAT SYSTEM.MONITORIZAR_USUARIOS;
------------------------------------------------------------------
--------
3 01-01-4000 00:00:00 SYSDATE + 60/1440 19. Conectarse como usuario “prueba01” y modificar el trabajo que chequea la ocupación de las tablas para que se
Y realice cada treinta minutos.
PRUEBA01.CHEQUEAR_TABLAS;
SQL> connect prueba01
Enter password:
17. Intentar marcar como “broken” el trabajo que realiza la monitorización de usuarios. ¿Qué sucede al realizarlo?, Connected.
¿quién es su poseedor?.
SQL> exec dbms_job.interval(3,'SYSDATE + 30/1440');
SQL> exec dbms_job.broken(4,TRUE);
BEGIN dbms_job.broken(4,TRUE); END; PL/SQL procedure successfully completed.
*
ERROR at line 1: SQL> select job, to_char(next_date, 'dd-mm-yyyy
ORA-23421: job number 4 is not a job in the job queue hh24:mi:ss'),substr(interval,1,25), failures, broken, what from
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 86 user_jobs;
ORA-06512: at "SYS.DBMS_IJOB", line 529
ORA-06512: at "SYS.DBMS_JOB", line 245 JOB TO_CHAR(NEXT_DATE,' SUBSTR(INTERVAL,1,25)
ORA-06512: at line 1 FAILURES B
---------- ------------------- -------------------------
---------- -
18. Conectarse como usuario SYSTEM y modificar el trabajo que llama al procedimiento de monitorización de usuarios WHAT
para que se realice cada quince minutos. ------------------------------------------------------------------
-------
SQL> exec dbms_job.interval(4,'SYSDATE + 15/1440'); 3 01-01-4000 00:00:00 SYSDATE + 30/1440
Y
PL/SQL procedure successfully completed. PRUEBA01.CHEQUEAR_TABLAS;

SQL> select job, to_char(next_date, 'dd-mm-yyyy


hh24:mi:ss'),substr(interval,1,25), failures, broken, what from 20. Forzar la ejecución inmediata del trabajo que realiza el chequeo de ocupación de tablas. ¿Conectado como que
dba_jobs where schema_user='SYSTEM'; usuario debe realizarse?.

JOB TO_CHAR(NEXT_DATE,' SUBSTR(INTERVAL,1,25) SQL> exec dbms_job.run(3);


FAILURES B
---------- ------------------- ------------------------- PL/SQL procedure successfully completed.
---------- -
WHAT SQL> select job, to_char(next_date, 'dd-mm-yyyy
------------------------------------------------------------------ hh24:mi:ss'),substr(interval,1,25), failures, broken, what from
-------- user_jobs;
1 25-11-2004 11:41:19 SYSDATE + 7
0 N JOB TO_CHAR(NEXT_DATE,' SUBSTR(INTERVAL,1,25)
SYSTEM.ANALIZA_USUARIOS; FAILURES B
---------- ------------------- -------------------------
2 29-11-2004 15:37:11 SYSDATE + 7 ---------- -
0 N WHAT
SYSTEM.ANALIZA_USUARIOS; ------------------------------------------------------------------
--------
4 23-11-2004 13:26:43 SYSDATE + 15/1440 3 23-11-2004 14:13:27 SYSDATE + 30/1440
N 0 N

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 129 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 130
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

PRUEBA01.CHEQUEAR_TABLAS;

PRACTICAS TEMA 9.
21. Conectado como usuario SYSTEM, eliminar el trabajo que realiza el chequeo de ocupación de tablas.
AUDITORÍA.
SQL> connect system
Enter password:
Connected.
1. Ver la descripción de las vistas ALL_DEF_AUDIT_OPTS, DBA_AUDIT_OBJECT, DBA_AUDIT_SESSION,
SQL> exec dbms_job.remove(3); DBA_AUDIT_STATEMENT, DBA_AUDIT_TRAIL, DBA_OBJ_AUDIT_OPTS, DBA_PRIV_AUDIT_OPTS, y
BEGIN dbms_job.remove(3); END; DBA_STMT_AUDIT_OPTS. Averiguar el significado de cada uno de los campos usando la documentación en línea.
*
ERROR at line 1:
ORA-23421: job number 3 is not a job in the job queue SQL> desc ALL_DEF_AUDIT_OPTS
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 86 Nombre ¿Nulo? Tipo
ORA-06512: at "SYS.DBMS_IJOB", line 529 ----------------------------------------- --------
ORA-06512: at "SYS.DBMS_JOB", line 171 ---------------
ORA-06512: at line 1 ALT VARCHAR2(3)
AUD VARCHAR2(3)
COM VARCHAR2(3)
22. Repetir el ejercicio anterior conectado como usuario “prueba01”. DEL VARCHAR2(3)
GRA VARCHAR2(3)
SQL> connect prueba01 IND VARCHAR2(3)
Enter password: INS VARCHAR2(3)
Connected. LOC VARCHAR2(3)
REN VARCHAR2(3)
SQL> exec dbms_job.remove(3); SEL VARCHAR2(3)
UPD VARCHAR2(3)
PL/SQL procedure successfully completed. REF VARCHAR2(3)
EXE VARCHAR2(3)
SQL> select job, to_char(next_date, 'dd-mm-yyyy
hh24:mi:ss'),substr(interval,1,25), failures, broken, what from ...
user_jobs;

no rows selected 2. Ver la descripción de la vista SYS.AUD$.

SQL> desc sys.aud$

Name Null? Type


----------------------------------------------------------------
--
SESSIONID NOT NULL NUMBER
ENTRYID NOT NULL NUMBER
STATEMENT NOT NULL NUMBER
TIMESTAMP# NOT NULL DATE
USERID VARCHAR2(30)
USERHOST
VARCHAR2(128)
TERMINAL

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 131 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 132
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

VARCHAR2(255) Connected.
ACTION# NOT NULL NUMBER
RETURNCODE NOT NULL NUMBER SQL> select * from dba_sys_privs where privilege ='AUDIT ANY';
OBJ$CREATOR VARCHAR2(30)
OBJ$NAME GRANTEE PRIVILEGE
VARCHAR2(128) ADM
AUTH$PRIVILEGES VARCHAR2(16) ------------------------------
AUTH$GRANTEE VARCHAR2(30) ---------------------------------------- ---
NEW$OWNER VARCHAR2(30) DBA AUDIT ANY
NEW$NAME YES
VARCHAR2(128) IMP_FULL_DATABASE AUDIT ANY
SES$ACTIONS VARCHAR2(19) NO
SES$TID NUMBER
LOGOFF$LREAD NUMBER SQL> select * from dba_sys_privs where privilege ='AUDIT SYSTEM';
LOGOFF$PREAD NUMBER
LOGOFF$LWRITE NUMBER GRANTEE PRIVILEGE
LOGOFF$DEAD NUMBER ADM
LOGOFF$TIME DATE ------------------------------
COMMENT$TEXT ---------------------------------------- ---
VARCHAR2(4000) DBA AUDIT SYSTEM
CLIENTID VARCHAR2(64) YES
SPARE1
VARCHAR2(255)
SPARE2 NUMBER 5. Auditar todas las conexiones exitosas y fallidas a la base de datos.
OBJ$LABEL RAW(255)
SES$LABEL RAW(255)
PRIV$USED NUMBER SQL> audit session;
SESSIONCPU NUMBER
Audit succeeded.

3. Comprobar si esta habilitada la auditoría en la base de datos. Habilitar la auditoría en la base de datos en caso de
que no este. 6. Abrir una sesión a la base de datos como usuario “SYSTEM” y como usuario “prueba01”. Comprobar que
información se ha guardado en la auditoría como consecuencia de las operaciones anteriores (consultar la vista
DBA_AUDIT_TRAIL).
SQL> show parameters audit_trail

NAME TYPE VALUE SQL> select substr(os_username,1,10) usuario_so,


--------------------------------------------------------- substr(username,1,12) usuario, to_char(timestamp,'dd-mm-yyy
audit_trail string NONE hh24:mi:ss') tiempo_conexion, to_char(logoff_time,'dd-mm-yyyy
hh24:mi:ss') tiempo_desconexion from dba_audit_trail order by
username,timestamp,logoff_time;
Se debe parar la base de datos, editar el fichero de parametros
de inicializacion, init<bd>.ora, añadiendo la linea USUARIO_SO USUARIO TIEMPO_CONEXION TIEMPO_DESCONEXION
"audit_trail=db", y volver a arrancar la base de datos. ---------- ------------ ------------------ -------------------
oracle PRUEBA01 29-11-004 11:53:50
oracle SYSTEM 29-11-004 11:53:44 29-11-2004 11:53:50
4. Comprobar que usuarios de base de datos tienen asignados los privilegios AUDIT SYSTEM y AUDIT ANY.

SQL> connect system 7. Auditar las conexiones exitosas y fallidas a la base de datos de los usuarios “prueba01” y “prueba02”.
Enter password:

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 133 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 134
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

CREATE TABLE CODIGOS_NOTAS


SQL> audit session by prueba01, prueba02; (CODIGO varchar2(3),
DESCRIPCION varchar2(20))
Audit succeeded. TABLESPACE ACADEMO
STORAGE (INITIAL 64K
NEXT 64K
8. Conectarse a la base de datos como usuario “prueba02” introduciendo una clave errónea. Comprobar el apunte MINEXTENTS 3
realizado en la auditoría del sistema (consultar la vista DBA_AUDIT_SESSION). MAXEXTENTS 10);

Otorgar privilegios para consultar, insertar, actualizar y borrar registros de la tabla “codigos_notas” al usuario
SQL> select substr(os_username,1,10) usuario_so, "prueba02".
substr(username,1,12) usuario, to_char(timestamp,'dd-mm-yyy Conectarse como usuario “prueba02” y realizar las siguientes operaciones:
hh24:mi:ss') tiempo_conexion, to_char(logoff_time,'dd-mm-yyyy
hh24:mi:ss') tiempo_desconexion from dba_audit_session where • Seleccionar todos los registros de la tabla “codigos_notas”.
username='PRUEBA02' order by username,timestamp,logoff_time • Insertar en la tabla “codigos_notas” los siguientes registros:
USUARIO_SO USUARIO TIEMPO_CONEXION TIEMPO_DESCONEXION
‘0’, ‘NO PRESENTADO’
---------- ------------ ------------------ -------------------
‘1’, ‘APROBADO’
oracle PRUEBA02 29-11-004 11:55:37
Consultar los registros de auditoría generados para las operaciones anteriores (vista DBA_AUDIT_OBJECT).
9. Auditar el uso de SELECT TABLE, DELETE TABLE, UPDATE TABLE e INSERT TABLE en cualquier caso (fallido o
no) y por sentencia individual. Comprobar las opciones activas de auditoría (vista DBA_STMT_AUDIT_OPTS).
SQL> connect prueba01
Enter password:
Connected.
SQL> audit select table, delete table, update table, insert
table by access; SQL> CREATE TABLE CODIGOS_NOTAS
2 (CODIGO varchar2(3),
Audit succeeded. 3 DESCRIPCION varchar2(20))
4 TABLESPACE ACADEMO
5 STORAGE (INITIAL 64K
SQL> select user_name usuario, audit_option opcion, success, 6 NEXT 64K
failure from DBA_STMT_AUDIT_OPTS order by user_name 7 MINEXTENTS 3
8* MAXEXTENTS 10)
USUARIO OPCION SUCCESS FAILURE
------------------------------------------------------------ Table created.
PRUEBA01 CREATE SESSION BY ACCESS BY ACCESS
PRUEBA02 CREATE SESSION BY ACCESS BY ACCESS SQL> grant select, insert, update, delete on codigos_notas to
CREATE SESSION BY ACCESS BY ACCESS prueba02;
SELECT TABLE BY ACCESS BY ACCESS
INSERT TABLE BY ACCESS BY ACCESS Grant succeeded.
UPDATE TABLE BY ACCESS BY ACCESS
DELETE TABLE BY ACCESS BY ACCESS SQL> connect prueba02
Enter password:
7 rows selected. Connected.

SQL> select * from prueba01.codigos_notas;


10. Conectarse como usuario “prueba01”. Comprobar si se ha creado la tabla “codigos_notas” en el "tablespace"
ACADEMO, en caso contrario creadla. no rows selected

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 135 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 136
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

SQL> insert into prueba01.codigos_notas values ('0','NO oracle PRUEBA02 29-11-004 12:08:54 SYSTEM PRODUCT_PRIVS
PRESENTADO'); SELECT
oracle PRUEBA02 29-11-004 12:08:54 SYSTEM
1 row created. SQLPLUS_PRODUCT SELECT
oracle PRUEBA02 29-11-004 12:08:54 SYSTEM
SQL> insert into prueba01.codigos_notas values ('1','APROBADO'); SQLPLUS_PRODUCT SELECT
oracle PRUEBA02 29-11-004 12:09:06 PRUEBA01 CODIGOS_NOTAS
1 row created. SELECT
oracle PRUEBA02 29-11-004 12:09:19 PRUEBA01 CODIGOS_NOTAS
SQL> commit; INSERT
oracle PRUEBA02 29-11-004 12:09:32 PRUEBA01 CODIGOS_NOTAS
Commit complete. INSERT

11. Consultar las opciones por defecto de auditoría de objetos (ALL_DEF_AUDIT_OPTS).


SQL> SQL> connect system
Enter password: SQL> select * from all_def_audit_opts;
Connected.
ALT AUD COM DEL GRA IND INS LOC REN SEL UPD REF EXE
SQL> select substr(os_username,1,10) usuario_so, --- --- --- --- --- --- --- --- --- --- --- --- ---
substr(username,1,12) usuario, to_char(timestamp,'dd-mm-yyy -/- -/- -/- -/- -/- -/- -/- -/- -/- -/- -/- -/- -/-
hh24:mi:ss') tiempo_conexion, to_char(logoff_time,'dd-mm-yyyy
hh24:mi:ss') tiempo_desconexion from dba_audit_session where
username='PRUEBA02' order by username,timestamp,logoff_time; 12. Especificar las opciones de auditoría por defecto para los objetos creados en un futuro de forma que se registre
información siempre que se produzca un “alter”, “grant”, “insert”, “update” o “delete”.
USUARIO_SO USUARIO TIEMPO_CONEXION TIEMPO_DESCONEXION
---------- ------------ ------------------ ------------------- SQL> audit alter, grant, insert, update, delete on default;
oracle PRUEBA02 29-11-004 11:55:37
oracle PRUEBA02 29-11-004 12:08:54 29-11-2004 12:10:42 Audit succeeded.
SQL> select substr(os_username,1,10) usuario_so, SQL> select * from all_def_audit_opts;
substr(username,1,12) usuario, to_char(timestamp,'dd-mm-yyy
hh24:mi:ss') tiempo_conexion, substr(owner,1,10) propie, ALT AUD COM DEL GRA IND INS LOC REN SEL UPD REF EXE
substr(obj_name,1,15) objeto, substr(action_name,1,10) accion from --- --- --- --- --- --- --- --- --- --- --- --- ---
dba_audit_object where username='PRUEBA02' order by S/S -/- -/- S/S S/S -/- S/S -/- -/- -/- S/S -/- -/-
os_username,timestamp, owner,obj_name,action_name;

USUARIO_SO USUARIO TIEMPO_CONEXION PROPIE OBJETO


ACCION El significado de cada una de las columnas es:
------------------------------------------------------------------
--------- -/-: No auditoria por defecto.
oracle PRUEBA02 29-11-004 12:08:54 SYS DUAL S/-: Auditado cuando sea exitosa la operación.
SELECT -/S: Auditado cuando sea fallida la operación.
oracle PRUEBA02 29-11-004 12:08:54 SYS DUAL
SELECT
oracle PRUEBA02 29-11-004 12:08:54 SYS DUAL ALT ... ALTER
SELECT AUD ... AUDIT
oracle PRUEBA02 29-11-004 12:08:54 SYSTEM PRODUCT_PRIVS COM ... COMMENT
SELECT

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 137 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 138
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

DEL ... DELETE USUARIO PRIVILEGE SUCCESS


GRA ... GRANT FAILURE
------------ ---------------------------------------- ----------
IND ... INDEX ----------
INS ... INSERT PRUEBA01 CREATE SESSION BY ACCESS
LOC ... LOCK BY ACCESS
REN ... RENAME PRUEBA02 CREATE SESSION BY ACCESS
SEL ... SELECT BY ACCESS
ALTER ANY RULE BY ACCESS
UPD ... UPDATE BY ACCESS
REF ... REFERENCES CREATE ANY RULE BY ACCESS
EXE ... EXECUTE BY ACCESS
DROP ANY RULE BY ACCESS
BY ACCESS
13. Desactivar la auditoría de las conexiones a la base de datos. EXECUTE ANY RULE BY ACCESS
BY ACCESS

SQL> select substr(user_name,1,12) usuario, privilege, 6 rows selected.


success,failure from dba_priv_audit_opts order by user_name,
privilege; SQL> noaudit session by prueba01, prueba02;

USUARIO PRIVILEGE SUCCESS Noaudit succeeded.


FAILURE
------------ ---------------------------------------- ---------- SQL> select substr(user_name,1,12) usuario, privilege,
---------- success,failure from dba_priv_audit_opts order by user_name,
PRUEBA01 CREATE SESSION BY ACCESS privilege;
BY ACCESS
PRUEBA02 CREATE SESSION BY ACCESS USUARIO PRIVILEGE SUCCESS
BY ACCESS FAILURE
ALTER ANY RULE BY ACCESS ------------ ---------------------------------------- ----------
BY ACCESS ----------
CREATE ANY RULE BY ACCESS ALTER ANY RULE BY ACCESS
BY ACCESS BY ACCESS
CREATE SESSION BY ACCESS CREATE ANY RULE BY ACCESS
BY ACCESS BY ACCESS
DROP ANY RULE BY ACCESS DROP ANY RULE BY ACCESS
BY ACCESS BY ACCESS
EXECUTE ANY RULE BY ACCESS EXECUTE ANY RULE BY ACCESS
BY ACCESS BY ACCESS

7 rows selected.
14. Desactivar la auditoría de uso de SELECT TABLE, DELETE TABLE, UPDATE TABLE e INSERT TABLE (activada
SQL> noaudit session; en ejercicios anteriores).

Noaudit succeeded.
SQL> select substr(user_name,1,12) usuario, substr(audit_option,
SQL> select substr(user_name,1,12) usuario, privilege, 1,15) opcion, success,failure from dba_stmt_audit_opts order by
success,failure from dba_priv_audit_opts order by user_name, user_name, audit_option;
privilege;
USUARIO OPCION SUCCESS FAILURE

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 139 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 140
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

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


DELETE TABLE BY ACCESS BY ACCESS 0 NO PRESENTADO
INSERT TABLE BY ACCESS BY ACCESS 1 APROBADO
SELECT TABLE BY ACCESS BY ACCESS
UPDATE TABLE BY ACCESS BY ACCESS SQL> insert into codigos_notas values ('3','NOTABLE');

SQL> noaudit select table, delete table, update table, insert 1 row created.
table;
SQL> commit;
Noaudit succeeded.
SQL> connect system
SQL> select substr(user_name,1,12) usuario, substr(audit_option, Introduzca su clave:
1,15) opcion, success,failure from dba_stmt_audit_opts order by Connected.
user_name, audit_option;
SQL> select substr(username,1,10) usuario, to_char(timestamp,'dd-
no rows selected mm-yyyy hh24:mi:ss') fecha, substr(owner,1,10) prop,
substr(obj_name,1,15) objeto, ses_actions from dba_audit_object
where owner='PRUEBA01' order by timestamp
15. Activar la auditoría para cualquier operación de consulta, inserción o borrado que se efectué sobre la tabla
“prueba01.codigos_notas”. USUARIO FECHA PROP OBJETO
SES_ACTIONS
------------------------------------------------------------------
SQL> audit select, insert, delete on prueba01.codigos_notas; --------
PRUEBA02 29-11-2004 12:09:06 PRUEBA01 CODIGOS_NOTAS
Audit succeeded. PRUEBA02 29-11-2004 12:09:19 PRUEBA01 CODIGOS_NOTAS
PRUEBA02 29-11-2004 12:09:32 PRUEBA01 CODIGOS_NOTAS
SQL> select substr(owner,1,12),substr(OBJECT_NAME,1,12), PRUEBA01 02-12-2004 10:09:30 PRUEBA01 CODIGOS_NOTAS ------
substr(object_type,1,10), DEL, INS, SEL, UPD from S--S------
dba_obj_audit_opts where owner='PRUEBA01' order by object_name,
object_type;

SUBSTR(OWNER SUBSTR(OBJEC SUBSTR(OB DEL INS SEL UPD SES_ACTIONS Resumen de sesion, una cadena de 16 caracteres,
------------ ------------ --------- --- --- --- --- uno por cada tipo de accion de la lista ordenada ALTER, AUDIT,
PRUEBA01 CHEQUEAR_TAB PROCEDURE -/- -/- -/- -/- COMMENT, DELETE, GRANT, INDEX, INSERT, LOCK, RENAME, SELECT,
PRUEBA01 CODIGOS TABLE -/- -/- -/- -/-
PRUEBA01 CODIGOS_NOTA TABLE S/S S/S S/S -/- UPDATE, REFERENCES, y EXECUTE.
PRUEBA01 TABLAS_REVIS TABLE -/- -/- -/- -/- Las posicones 14, 15, y 16 estan reservadas para usos futuros. Los
caracteres son - para ninguno, S para éxito, F para fallo y B para
ambos.
16. Conectado como usuario “prueba01” realizar una consulta del contenido de la tabla “codigos_notas”. Consultar los
registros de auditoría generados (DBA_AUDIT_OBJECT).
17. Desactivar la auditoría del ejercicio 15.

SQL> connect prueba01


Introduzca su clave: SQL> noaudit select, insert, delete on prueba01.codigos_notas;
Connected.
Noaudit succeeded.
SQL> select * from codigos_notas;

COD DESCRIPCION

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 141 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 142
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

18. Desactivar todas las opciones de auditoría de objetos que existen por defecto.
• Se están produciendo un número considerable de abrazos mortales debido a que se están adquiriendo bloqueos
exclusivos sobre tablas.
SQL> noaudit all on default;
• Se ha detectado el borrado de registros de la tabla SCOTT.EMP
Noaudit succeeded.
Se sospecha que los usuarios “prueba01” y “prueba02” son los responsables de las acciones anteriores.
Determinar las distintas operaciones sobre las que habrá que efectuar una auditoría, así como consultar en las
distintas vistas para obtener la información precisa que permita descartar o confirmar las sospechas que han dado lugar
19. Comprobar las características de almacenamiento del “audit trail”. Borrar todos los registros de auditoría a la activación de la auditoría.
correspondientes a la tabla “prueba01.codigos_notas”.
Al usuario "prueba02" se le han asignado todos los permisos posibles sobre scott.emp:

SQL> select substr(owner,1,10) prop,substr(table_name,1,8) SQL> grant all on scott.emp to prueba02;


tabla,substr(tablespace_name,1,10) espacio, INITIAL_EXTENT,
NEXT_EXTENT,MIN_EXTENTS,MAX_EXTENTS from dba_tables where Grant succeeded.
table_name='AUD$';

PROP TABLA ESPACIO INITIAL_EXTENT NEXT_EXTENT Para activar la auditoría se ejecutara el siguiente orden de
MIN_EXTENTS MAX_EXTENTS sentencias:
---------- -------- ---------- -------------- -----------
----------- ----------- SQL> audit alter, INDEX, RENAME ON DEFAULT BY SESSION;
SYS AUD$ SYSTEM 10240 16384
1 121 Audit succeeded.

SQL> AUDIT SESSION BY prueba01, prueba02;


20. Auditar cualquier cambio que se realice en el “audit trail”.
Audit succeeded.
SQL> AUDIT INSERT, UPDATE, DELETE ON SYS.AUD$ BY ACCESS; SQL> AUDIT ALTER USER;
Audit succeeded. Audit succeeded.

SQL> AUDIT DROP USER;


SQL> select substr(owner,1,12) prop,substr(OBJECT_NAME,1,12)
objeto, substr(object_type,1,10) tipo, DEL, INS, SEL, UPD from Audit succeeded.
dba_obj_audit_opts where owner='SYS' and OBJECT_NAME ='AUD$' order
by object_name, object_type SQL> AUDIT LOCK TABLE BY ACCESS WHENEVER SUCCESSFUL;

Audit succeeded.
PROP OBJETO TIPO DEL INS SEL UPD SQL> AUDIT DELETE ON scott.emp BY ACCESS WHENEVER SUCCESSFUL;
------------ ------------ --------- --- --- --- ---
SYS AUD$ TABLE A/A A/A -/- A/A Audit succeeded.

21. Considere un caso hipotético donde quiere auditarse la base de datos en base a los siguientes hechos detectados: Supongamos que el usuario prueba01 ejecuta las sentencias:

• Se han modificado ciertas cuotas, asignación de espacios de almacenamiento, “tablespaces”, y contraseñas de


usuario. SQL> connect prueba01

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 143 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 144
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

Enter password:
Connected.
• Opciones de auditoría de sentencias fijadas.
SQL> ALTER USER prueba03 QUOTA 0 ON users;
ALTER USER prueba03 QUOTA 0 ON users
* SQL> connect system
ERROR at line 1: Enter password:
ORA-01031: insufficient privileges Connected.

SQL> select user_name, audit_option,success, failure from


SQL> DROP USER prueba04; sys.dba_stmt_audit_opts;
DROP USER prueba04
* USER_NAME AUDIT_OPTION SUCCESS
ERROR at line 1: FAILURE
ORA-01031: insufficient privileges -----------------------------------------------------------
------
PRUEBA02 CREATE SESSION BY ACCESS BY
Supongamos que el usuario prueba02 ejecuta las sentencias: ACCESS
PRUEBA01 CREATE SESSION BY ACCESS BY
ACCESS
SQL> connect prueba02 ALTER USER BY ACCESS BY
Enter password: ACCESS
Connected. DROP USER BY ACCESS BY
ACCESS
SQL> LOCK TABLE scott.emp IN EXCLUSIVE MODE; LOCK TABLE BY ACCESS NOT
SET
Table(s) Locked.

SQL> DELETE FROM scott.emp WHERE mgr = 7698;


• Opciones de auditoría de privilegios.
5 rows deleted.
SQL> select user_name, privilege,success, failure from
SQL> ALTER TABLE scott.emp STORAGE (NEXT 500K);
sys.dba_priv_audit_opts;
Table altered.
USER_NAME PRIVILEGE SUCCESS FAILURE
-----------------------------------------------------------
SQL> CREATE INDEX scott.ename_index ON scott.emp (ename);
----
CREATE INDEX scott.ename_index ON scott.emp (ename)
PRUEBA02 CREATE SESSION BY ACCESS BY
*
ACCESS
ERROR at line 1:
PRUEBA01 CREATE SESSION BY ACCESS BY
ORA-01031: insufficient privileges
ACCESS
ALTER USER BY ACCESS BY
ACCESS
SQL> DELETE FROM scott.emp WHERE empno = 8000;
DROP USER BY ACCESS BY
ACCESS
0 rows deleted.

Recuperamos ahora información sobre los registros de • Opciones de auditoría para objetos del esquema SCOTT.
auditoría:
SQL> SELECT * FROM sys.dba_obj_audit_opts WHERE owner =

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 145 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 146
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

'SCOTT' AND object_name LIKE 'EMP%';


8 rows selected.
OWNER OBJECT_NAME OBJECT_TY ALT AUD COM DEL GRA IND
INS LOC REN SEL UPD REF EXE CRE REA WRI
------- -------------- --------- --- --- --- --- --- --- • Registros de auditoria generados para objetos.
--- --- --- --- --- --- --- --- --- ---
SCOTT EMP TABLE -/- -/- -/- A/- -/- -/- -/-
-/- -/- -/- -/- -/- -/- -/- -/- -/- SQL> select substr(username,1,12) usuario,
to_char(timestamp,'dd-mm-yyy hh24:mi:ss') tiempo_conexion,
substr(owner,1,10) propie, substr(obj_name,1,15) objeto,
La información debe interpretarse de la siguiente forma: substr(action_name,1,15) accion from dba_audit_object where
owner='SCOTT' order by os_username,usuario, timestamp,
• El carácter "-" indica que la opción de auditoría no esta owner,obj_name,action_name;
fijada.
• EL carácter "S" indica que la opción de auditoría esta
fijada “BY SESSION”.
• El carácter "A" indica que la opción de auditoría esta USUARIO TIEMPO_CONEXION PROPIE OBJETO
fijada “BY ACCESS”. ACCION
--------------------------------------------------------------
• Cada opción de auditoría puede ser para “WHENEVER ------
SUCCESSFUL” y “WHENEVER NOT SUCCESSFUL”; las dos opciones PRUEBA02 02-12-004 10:38:35 SCOTT EMP
están separadas por "/". LOCK
PRUEBA02 02-12-004 10:38:45 SCOTT EMP
DELETE
• Información de auditoría para la sentencia “AUDIT SESSION”. PRUEBA02 02-12-004 10:39:12 SCOTT EMP
DELETE
SQL> select substr(os_username,1,10) usuario_so,
substr(username,1,12) usuario, to_char(timestamp,'dd-mm-yyy
hh24:mi:ss') tiempo_conexion, to_char(logoff_time,'dd-mm- Debe tenerse en cuenta que la opción para auditar las
yyyy hh24:mi:ss') tiempo_desconexion from dba_audit_session
order by username,timestamp,logoff_time; sentencias alter, index, ... es posterior a la creación del
objeto.
USUARIO_SO USUARIO TIEMPO_CONEXION Si, explícitamente, se audita la tabla “emp”.
TIEMPO_DESCONEXION
---------- ------------ ------------------
------------------- SQL> audit alter, INDEX, RENAME ON scott.emp by session;
oracle PRUEBA01 29-11-004 11:53:50 29-11-2004
11:55:37 Audit succeeded.
oracle PRUEBA01 29-11-004 12:07:32 29-11-2004
12:08:54 SQL> connect prueba02
curso01 PRUEBA01 02-12-004 10:37:26 02-12-2004 Enter password:
10:38:25 Connected.
oracle PRUEBA02 29-11-004 11:55:37 SQL>
oracle PRUEBA02 29-11-004 12:08:54 29-11-2004 SQL> ALTER TABLE scott.emp STORAGE (NEXT 500K);
12:10:42
curso01 PRUEBA02 02-12-004 10:38:25 02-12-2004 Table altered.
10:40:03
oracle SYSTEM 29-11-004 11:53:44 29-11-2004 SQL> CREATE INDEX scott.ename_index ON scott.emp (ename);
11:53:50 CREATE INDEX scott.ename_index ON scott.emp (ename)
oracle SYSTEM 29-11-004 12:10:42 29-11-2004 *
12:22:42 ERROR at line 1:

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 147 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 148
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

ORA-01031: insufficient privileges


Table altered.

SQL> connect system SQL> CREATE INDEX scott.ename_index ON scott.emp (ename);


Enter password: CREATE INDEX scott.ename_index ON scott.emp (ename)
Connected. *
ERROR at line 1:
SQL> select substr(username,1,12) usuario, ORA-01031: insufficient privileges
to_char(timestamp,'dd-mm-yyy hh24:mi:ss') tiempo_conexion,
substr(owner,1,10) propie, substr(obj_name,1,15) objeto,
substr(action_name,1,15) accion from dba_audit_object where SQL> connect system
owner='SCOTT' order by os_username,usuario, timestamp, Enter password:
owner,obj_name,action_name; Connected.

USUARIO TIEMPO_CONEXION PROPIE OBJETO SQL> select substr(username,1,12) usuario,


ACCION to_char(timestamp,'dd-mm-yyy hh24:mi:ss') tiempo_conexion,
-------------------------------------------------------------- substr(owner,1,10) propie, substr(obj_name,1,15) objeto,
------ substr(action_name,1,25) accion from dba_audit_object where
PRUEBA02 02-12-004 10:38:35 SCOTT EMP LOCK owner='SCOTT' order by os_username,usuario, timestamp,
PRUEBA02 02-12-004 10:38:45 SCOTT EMP owner,obj_name,action_name;
DELETE
PRUEBA02 02-12-004 10:39:12 SCOTT EMP USUARIO TIEMPO_CONEXION PROPIE OBJETO
DELETE ------------ ------------------ ---------- ---------------
PRUEBA02 03-12-004 10:13:29 SCOTT EMP ACCION
SESSION REC -------------------------
PRUEBA02 02-12-004 10:38:35 SCOTT EMP
LOCK
SQL> SELECT * FROM sys.dba_obj_audit_opts WHERE owner =
'SCOTT' AND object_name LIKE 'EMP%'; PRUEBA02 02-12-004 10:38:45 SCOTT EMP
DELETE
OWNER OBJECT_NAME OBJECT_TY ALT AUD
------------------------------------------- --------- --- --- PRUEBA02 02-12-004 10:39:12 SCOTT EMP
COM DEL GRA IND INS LOC REN SEL UPD REF EXE CRE REA WRI DELETE
--- --- --- --- --- --- --- --- --- --- --- --- --- ---
SCOTT EMP TABLE S/S -/- PRUEBA02 03-12-004 10:13:29 SCOTT EMP
-/- A/- -/- S/S -/- -/- S/S -/- -/- -/- -/- -/- -/- -/- SESSION REC

PRUEBA02 03-12-004 10:16:45 SCOTT EMP


Si se audita ahora por “acceso”. ALTER TABLE

SQL> audit alter, INDEX, RENAME ON scott.emp by access; Observemos que prueba02 no tiene permiso para crear
índices.
Audit succeeded.

SQL> connect prueba02 SQL> connect system


Enter password: Enter password:
Connected. Connected.
SQL> ALTER TABLE scott.emp STORAGE (NEXT 1500K);

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 149 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 150
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

SQL> select * from dba_sys_privs where grantee='PRUEBA02'; SQL> select substr(username,1,12) usuario,
to_char(timestamp,'dd-mm-yyy hh24:mi:ss') tiempo_conexion,
no rows selected substr(owner,1,10) propie, substr(obj_name,1,15) objeto,
substr(action_name,1,15) accion from dba_audit_object where
SQL> select * from dba_role_privs where grantee='PRUEBA02' owner='SCOTT' order by os_username,usuario, timestamp,
owner,obj_name,action_name;

GRANTEE GRANTED_ROLE USUARIO TIEMPO_CONEXION PROPIE OBJETO ACCION


ADM DEF --------------------------------------------------------------
------------------------------ ------------------------------ ------
--- --- PRUEBA02 02-12-004 10:38:35 SCOTT EMP LOCK
PRUEBA02 CONEXION PRUEBA02 02-12-004 10:38:45 SCOTT EMP DELETE
NO YES PRUEBA02 02-12-004 10:39:12 SCOTT EMP DELETE
PRUEBA02 03-12-004 10:13:29 SCOTT EMP
SESSION REC
SQL> select * from dba_role_privs where grantee='CONEXION' PRUEBA02 03-12-004 10:16:45 SCOTT EMP ALTER
TABLE
no rows selected PRUEBA02 03-12-004 10:24:46 SCOTT ENAME_INDEX CREATE
INDEX
SQL> select * from dba_sys_privs where grantee='CONEXION'
6 rows selected.
GRANTEE PRIVILEGE ADM
-------------------------------------------------------------
CONEXION CREATE SESSION NO

Se le otorga permiso y se prueba a crear un índice como


prueba02 sobre scott.emp. Aunque falle, registra el apunte.

SQL> grant create table to prueba02;

Grant succeeded.

SQL> connect prueba02


Enter password:
Connected.

SQL> CREATE INDEX scott.ename_index ON scott.emp (kk);


CREATE INDEX scott.ename_index ON scott.emp (kk)
*
ERROR at line 1:
ORA-00904: "KK": invalid identifier

SQL> connect system


Enter password:
Connected.

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 151 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 152
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

SYS EXP_FULL_DATABASE YES


YES
PRACTICAS TEMA 10. ADMIN EXP_FULL_DATABASE NO
YES
COPIAS DE SEGURIDAD.
5. En el sistema de ficheros /export/<nombre_bbdd>, crear un fichero de parámetros llamado “par_admin01” que
permita realizar una exportación total de la base de datos, incluyendo sus datos y lo permisos sobre todos los
1. Revisar la estructura de la base de datos. Indicar si cumple con las indicaciones OFA y el contenido de cada uno de objetos, a un fichero llamado “total_admin01.dmp” (opciones “file”, “full”, “log”). Realizar la exportación como usuario
los sistemas de ficheros. “administrador”.
El registro de la exportación se guardará en el fichero “total_admin01.log”.

Desde sistema operativo, mediante las sentencias "cd" y "ls -al"


" Conectarse como usuario propietario de la base de datos.
" Situarse en el direcorio /export/<nombre_bbdd>. Editar con "vi"
2. Comprobar que usuarios y roles tienen asignado el rol “exp_full_database”. el fichero par_admin01.

buffer=102400
SQL> select * from dba_role_privs where file=/export/CURSO01/total_admin01.dmp
granted_role='EXP_FULL_DATABASE'; log=/export/CURSO01/total_admin01.log
full=y

GRANTEE GRANTED_ROLE ADM " Lanzar la exportación (se conectara como usuario
DEF "administrador").
------------------------------ ------------------------------ ---
---
DBA EXP_FULL_DATABASE NO /export/CURSO01 (CURSO01)> exp parfile=par_admin01
YES
SYS EXP_FULL_DATABASE YES Export: Release 9.2.0.1.0 - Production on Jue Dic 9 12:37:16 2004
YES
Copyright (c) 1982, 2002, Oracle Corporation. All rights
reserved.
3. ¿Podría un usuario que tuviera asignado el rol “dba” realizar una exportación total de la base de datos?, ¿por qué?.
Usuario: administrador
4. Asignar el rol ”exp_full_database” al rol “admin”. Contraseña:

Conectado a: Oracle9i Enterprise Edition Release 9.2.0.1.0 -


SQL> grant exp_full_database to admin; Production
With the Partitioning and Oracle Label Security options
Grant succeeded. JServer Release 9.2.0.1.0 - Production
Exportación realizada en el juego de caracteres WE8ISO8859P15 y el
SQL> select * from dba_role_privs where juego de caracteres NCHAR AL16UTF16
granted_role='EXP_FULL_DATABASE';
Exportando toda la base de datos ...
GRANTEE GRANTED_ROLE ADM . exportando definiciones de tablespace
DEF . exportando perfiles
------------------------------ ------------------------------ --- . exportando definiciones de usuario
--- . exportando roles
DBA EXP_FULL_DATABASE NO . exportando costos de recursos
YES . exportando definiciones de segmentos de rollback

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 153 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 154
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

. exportando enlaces a la base de datos reserved.


. exportando números de secuencia
. exportando alias de directorios
. exportando espacios de nombres de contexto Usuario: system
... Contraseña:

Conectado a: Oracle9i Enterprise Edition Release 9.2.0.1.0 -


6. Editar el fichero “total_admin01.log” y comprobar si se ha producido algún error. ¿Qué información aparece en la Production
ultima fila del fichero?. With the Partitioning and Oracle Label Security options
JServer Release 9.2.0.1.0 - Production
Exportación realizada en el juego de caracteres WE8ISO8859P15 y el
Debe editarse el fichero usando el editor "vi" (también puede juego de caracteres NCHAR AL16UTF16
hacerse con un “tail”). Las ultimas líneas mostraran el siguiente
mensaje: Exportando las tablas especificadas a través de la Ruta de Acceso
Convencional ...
/export/CURSO01 (CURSO01)> tail -f total_admin01.log El usuario actual ha cambiado a SYS
. exportando vistas materializadas . exportando la tabla AUD$ 114
. exportando logs de instantáneas filas exportadas
. exportando colas de trabajo La exportación ha terminado correctamente y sin advertencias.
. exportando grupos de refrescamiento y secundarios
. exportando dimensiones
. exportando acciones y objetos de procedimiento post-esquema 10. Como usuario “scott”, realizar una exportación de su esquema. Los parámetros se almacenarán en un fichero
. exportando tabla de historial de usuario llamado “par_scott03”, la exportación en el fichero “scott_scott03.dmp” y el registro en el fichero “scott_scott03.log”.
. exportando opciones de auditoría por defecto y del sistema ¿Se ha realizado con éxito la exportación?. Usar las mismas opciones que en el ejercicio anterior.
. exportando estadísticas
La exportación ha terminado correctamente y sin advertencias. El fichero de parámetros tendrá el siguiente contenido:

buffer=102400
7. Editar el fichero “total_admin01.log” y verificar el orden de copia de los objetos de la base de datos, ¿cuál es?. file=/export/CURSO01/scott_scott03.dmp
log=/export/CURSO01/scott_scott03.log
8. Comprobar si se ha exportado al fichero “total_admin01.dmp” el usuario “SYS”. ¿Y el “SYSTEM”?. owner=(SCOTT)
compress=y

No en el caso del SYS. Sí en el caso de SYSTEM. /export/CURSO01 (CURSO01)> exp parfile=par_scott03

Export: Release 9.2.0.1.0 - Production on Jue Dic 9 13:01:09 2004


9. Exportar todos los registros correspondientes al “audit. trail”. Crear un fichero de parámetros de nombre
"exporta_aud" con las siguientes líneas: Copyright (c) 1982, 2002, Oracle Corporation. All rights
reserved.
buffer=102400
file=/export/CURSO01/exporta_aud.dmp
Usuario: scott
log=/export/CURSO01/exporta_aud.log
Contraseña:
tables=(SYS.AUD$)
Conectado a: Oracle9i Enterprise Edition Release 9.2.0.1.0 -
Production
/export/CURSO01 (CURSO01)> exp parfile=exporta_aud With the Partitioning and Oracle Label Security options
JServer Release 9.2.0.1.0 - Production
Export: Release 9.2.0.1.0 - Production on Jue Dic 9 12:57:09 2004 Exportación realizada en el juego de caracteres WE8ISO8859P15 y el
juego de caracteres NCHAR AL16UTF16
Copyright (c) 1982, 2002, Oracle Corporation. All rights

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 155 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 156
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

. exportando acciones y objetos de procedimiento pre-esquema reserved.


. exportando nombres de biblioteca de funciones ajenas para el
usuario SCOTT
. exportando sinónimos de tipo público Usuario: scott
. exportando sinónimos de tipo privado Contraseña:
. exportando definiciones de tipos de objetos para el usuario
SCOTT Conectado a: Oracle9i Enterprise Edition Release 9.2.0.1.0 -
Exportando los objetos de SCOTT ... Production
. exportando enlaces a la base de datos With the Partitioning and Oracle Label Security options
. exportando números de secuencia JServer Release 9.2.0.1.0 - Production
. exportando definiciones de agrupamiento EXP-00023: debe ser DBA para realizar una exportación de la base
. exportando las tablas de SCOTT a través de la Ruta de Acceso de datos completa o del tablespace
Convencional ... (2)U(suarios) o (3)T(ablas): (2)U >
. exportando la tabla BONUS 0
filas exportadas
. exportando la tabla DEPT 5 12. Conectado como usuario “scott”, realizar una exportación de sus tablas “emp” y “dept”. Los parámetros se
filas exportadas almacenarán en un fichero llamado “par_scott05”, la exportación en el fichero “tablas_scott05.dmp” y el registro en el
. exportando la tabla EMP 9 fichero “tablas_scott05.log”. ¿Hubo éxito en la exportación?.
filas exportadas
. exportando la tabla SALGRADE 5 El contenido del fichero de parámetros será:
filas exportadas
. exportando sinónimos buffer=102400
. exportando vistas file=/export/CURSO01/tablas_scott05.dmp
. exportando procedimientos almacenados log=/export/CURSO01/tablas_scott05.log
. exportando operadores tables=(EMP, DEPT)
. exportando restricciones de integridad referencial compress=y
. exportando disparadores
. exportando tipos de índice /export/CURSO01 (CURSO01)> exp parfile=par_scott05
. exportando índices bitmap, funcionales y extensibles
. exportando acciones de posttables Export: Release 9.2.0.1.0 - Production on Jue Dic 9 13:17:22 2004
. exportando vistas materializadas
. exportando logs de instantáneas Copyright (c) 1982, 2002, Oracle Corporation. All rights
. exportando colas de trabajo reserved.
. exportando grupos de refrescamiento y secundarios
. exportando dimensiones
. exportando acciones y objetos de procedimiento post-esquema Usuario: scott
. exportando estadísticas Contraseña:
La exportación ha terminado correctamente y sin advertencias.
Conectado a: Oracle9i Enterprise Edition Release 9.2.0.1.0 -
Production
11. Como usuario “scott”, intentar realizar una exportación total de la base de datos. Los parámetros se almacenarán en With the Partitioning and Oracle Label Security options
un fichero llamado “par_scott04”, la exportación en el fichero “total_scott04.dmp” y el registro en el fichero JServer Release 9.2.0.1.0 - Production
“total_scott04.log”. ¿Se ha realizado con éxito la exportación?, ¿por qué?. Exportación realizada en el juego de caracteres WE8ISO8859P15 y el
juego de caracteres NCHAR AL16UTF16

/export/CURSO01 (CURSO01)> exp parfile=par_scott04 Exportando las tablas especificadas a través de la Ruta de Acceso
Convencional ...
Export: Release 9.2.0.1.0 - Production on Jue Dic 9 13:04:18 2004 . exportando la tabla EMP 9
filas exportadas
Copyright (c) 1982, 2002, Oracle Corporation. All rights . exportando la tabla DEPT 5

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 157 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 158
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

filas exportadas El contenido del fichero de parámetros será:


La exportación ha terminado correctamente y sin advertencias.
buffer=102400
file=/export/CURSO01/tablas_prueba0102.dmp
13. Como usuario “prueba01”, intentar realizar una exportación de las tablas “scott.emp” y “scott.dept”. Los parámetros log=/export/CURSO01/tablas_prueba0102.log
se almacenarán en un fichero llamado “par_prueba0101”, la exportación en el fichero “tablas_prueba0101.dmp” y el tables=(INEXISTENTE)
registro en el fichero “tablas_prueba0101.log”. ¿Qué sucede?. compress=y

El contenido del fichero de parámetros será: /export/CURSO01 (CURSO01)> exp parfile=par_prueba0102

buffer=102400 Export: Release 9.2.0.1.0 - Production on Jue Dic 9 13:20:18 2004


file=/export/CURSO01/tablas_prueba0101.dmp
log=/export/CURSO01/tablas_prueba0101.log Copyright (c) 1982, 2002, Oracle Corporation. All rights
tables=(SCOTT.EMP, SCOTT.DEPT) reserved.
compress=y

/export/CURSO01 (CURSO01)> exp parfile=par_prueba0101 Usuario: prueba01


Contraseña:
Export: Release 9.2.0.1.0 - Production on Jue Dic 9 13:18:58 2004
Conectado a: Oracle9i Enterprise Edition Release 9.2.0.1.0 -
Copyright (c) 1982, 2002, Oracle Corporation. All rights Production
reserved. With the Partitioning and Oracle Label Security options
JServer Release 9.2.0.1.0 - Production
Exportación realizada en el juego de caracteres WE8ISO8859P15 y el
Usuario: prueba01 juego de caracteres NCHAR AL16UTF16
Contraseña:
Exportando las tablas especificadas a través de la Ruta de Acceso
Conectado a: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Convencional ...
Production EXP-00011: PRUEBA01.INEXISTENTE no existe
With the Partitioning and Oracle Label Security options La exportación ha terminado correctamente pero con advertencias.
JServer Release 9.2.0.1.0 - Production
Exportación realizada en el juego de caracteres WE8ISO8859P15 y el
juego de caracteres NCHAR AL16UTF16 15. Comprobar el valor del parámetro db_block_size en la base de datos.

Exportando las tablas especificadas a través de la Ruta de Acceso


Convencional ...
EXP-00009: no tiene privilegios para exportar la tabla SCOTT de /export/CURSO01 (CURSO01)> sqlplus
EMP
EXP-00009: no tiene privilegios para exportar la tabla SCOTT de SQL*Plus: Release 9.2.0.1.0 - Production on Jue Dic 9 13:21:11
DEPT 2004
La exportación ha terminado correctamente pero con advertencias.
Copyright (c) 1982, 2002, Oracle Corporation. All rights
reserved.
14. Como usuario “prueba01”, realizar la exportación de la tabla “inexistente”. Los parámetros se almacenarán en un
fichero llamado “par_prueba0102”, la exportación en el fichero “tablas_prueba0102.dmp” y el registro en el fichero Introduzca el nombre de usuario: system
“tablas_prueba0102.log”. ¿Se genera algún mensaje de error?; si es así, ¿qué prefijo tienen?. Si se ha producido Introduzca la contraseña:
algún mensaje de error, buscar en la documentación en línea su significado.
Conectado a:
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 159 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 160
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

With the Partitioning and Oracle Label Security options usuario SCOTT
JServer Release 9.2.0.1.0 - Production . exportando sinónimos de tipo público
. exportando sinónimos de tipo privado
SQL> show parameters db_block_size . exportando definiciones de tipos de objetos para el usuario
SCOTT
NAME TYPE VALUE Exportando los objetos de SCOTT ...
--------------------------------------------------------- . exportando enlaces a la base de datos
db_block_size integer 2048 . exportando números de secuencia
. exportando definiciones de agrupamiento
. exportando las tablas de SCOTT a través de la Ruta de Acceso
16. Realizar de nuevo los ejercicios 5 y 10 usando el modo directo de exportación. Defina el valor del parámetro Directa ...
RECORDLENGTH. . exportando la tabla BONUS 0
El nombre de los ficheros usados será: filas exportadas
. exportando la tabla DEPT 5
filas exportadas
F.parámetros F.exportación F.registro . exportando la tabla EMP 9
filas exportadas
Ejercicio 6 Pard_admin01 Totald_admin01.dmp Totald_admin01.log . exportando la tabla SALGRADE 5
Ejercicio 10 Pard_admin02 Sistemad_admin02.dmp Sistemad_admin02.log
filas exportadas
. exportando sinónimos
. exportando vistas
. exportando procedimientos almacenados
En el caso, por ejemplo, del ejercicio 10, el fichero de
. exportando operadores
parámetros quedaría de esta forma:
. exportando restricciones de integridad referencial
. exportando disparadores
file=/export/CURSO01/scottd_scott03.dmp
. exportando tipos de índice
log=/export/CURSO01/scottd_scott03.log
. exportando índices bitmap, funcionales y extensibles
owner=(SCOTT)
. exportando acciones de posttables
compress=y
. exportando vistas materializadas
direct=y
. exportando logs de instantáneas
RECORDLENGTH=65535
. exportando colas de trabajo
. exportando grupos de refrescamiento y secundarios
/export/CURSO01 (CURSO01)> exp parfile=pard_scott03
. exportando dimensiones
. exportando acciones y objetos de procedimiento post-esquema
Export: Release 9.2.0.1.0 - Production on Jue Dic 9 13:39:31 2004
. exportando estadísticas
La exportación ha terminado correctamente y sin advertencias.
Copyright (c) 1982, 2002, Oracle Corporation. All rights
reserved.
17. Conectarse como usuario “scott” y eliminar la tabla”emp”.
Usuario: scott
Contraseña:
SQL> drop table emp;
Conectado a: Oracle9i Enterprise Edition Release 9.2.0.1.0 -
Production Tabla borrada.
With the Partitioning and Oracle Label Security options
JServer Release 9.2.0.1.0 - Production
Exportación realizada en el juego de caracteres WE8ISO8859P15 y el 18. Como usuario “administrador”, importar la tabla “scott.emp” desde el fichero “scott_scott03.dmp”. Crear un fichero de
juego de caracteres NCHAR AL16UTF16 parámetros llamado “par_imp_admin01” (parámetros file, fromuser y tables), el registro se guardara en el fichero
. exportando acciones y objetos de procedimiento pre-esquema “imp_tabla_emp”. ¿Termina con éxito la importación?.
. exportando nombres de biblioteca de funciones ajenas para el

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 161 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 162
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

SYS IMP_FULL_DATABASE YES


El contenido del fichero de parámetros de importación es: YES

buffer=102400
file=/export/CURSO01/scott_scott03.dmp 20. Asignar el rol “imp_full_database” al usuario “administrador”.
log=/export/CURSO01/imp_tabla_emp.log
tables=(EMP)
fromuser=scott SQL> grant imp_full_database to administrador;
touser=scott
Concesión terminada correctamente.

/export/CURSO01 (CURSO01)> imp parfile=par_imp_admin01


21. Realizar de nuevo el ejercicio 18.
Import: Release 9.2.0.1.0 - Production on Jue Dic 9 13:47:36 2004

Copyright (c) 1982, 2002, Oracle Corporation. All rights /export/CURSO01 (CURSO01)> imp parfile=par_imp_admin01
reserved.
Import: Release 9.2.0.1.0 - Production on Jue Dic 9 13:52:04 2004
Usuario: administrador
Contraseña: Copyright (c) 1982, 2002, Oracle Corporation. All rights
reserved.
Conectado a: Oracle9i Enterprise Edition Release 9.2.0.1.0 -
Production Usuario: administrador
With the Partitioning and Oracle Label Security options Contraseña:
JServer Release 9.2.0.1.0 - Production
Conectado a: Oracle9i Enterprise Edition Release 9.2.0.1.0 -
Archivo de exportación creado por EXPORT:V09.02.00 a través de la Production
ruta de acceso convencional With the Partitioning and Oracle Label Security options
JServer Release 9.2.0.1.0 - Production
Advertencia: Los objetos fueron exportados por SCOTT, no por usted
Archivo de exportación creado por EXPORT:V09.02.00 a través de la
importación realizada en el juego de caracteres WE8ISO8859P15 y el ruta de acceso convencional
juego de caracteres NCHAR AL16UTF16
IMP-00007: tiene que ser DBA para importar objetos en la cuenta de Advertencia: Los objetos fueron exportados por SCOTT, no por usted
otro usuario
IMP-00000: La importación no ha terminado correctamente importación realizada en el juego de caracteres WE8ISO8859P15 y el
juego de caracteres NCHAR AL16UTF16
. importando objetos de SCOTT en SCOTT
19. Comprobar que usuarios y roles tienen asignado el rol “imp_full_database”. . importando la tabla "EMP" 9
filas importadas
Activando las restricciones...
SQL> select * from dba_role_privs where La importación ha terminado correctamente pero con advertencias.
granted_role='IMP_FULL_DATABASE';

GRANTEE GRANTED_ROLE ADM 22. Comprobar si los usuarios “prueba01” y “prueba02” tienen cuota en el “tablespace” USERS. En caso de que no la
DEF tengan, asignar una cuota de 1M a cada uno de ellos.
------------------------------ ------------------------------ ---
---
DBA IMP_FULL_DATABASE NO SQL> select tablespace_name, max_bytes from dba_ts_quotas where
YES tablespace_name='USERS' and username in ('PRUEBA01','PRUEBA02');

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 163 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 164
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

JServer Release 9.2.0.1.0 - Production


ninguna fila seleccionada
Archivo de exportación creado por EXPORT:V09.02.00 a través de la
SQL> alter user prueba01 quota 1M on users; ruta de acceso convencional

Usuario modificado. Advertencia: Los objetos fueron exportados por SCOTT, no por usted

SQL> alter user prueba02 quota 1M on users; importación realizada en el juego de caracteres WE8ISO8859P15 y el
juego de caracteres NCHAR AL16UTF16
Usuario modificado. . importando objetos de SCOTT en PRUEBA01
. importando la tabla "EMP" 9
SQL> select tablespace_name, max_bytes from dba_ts_quotas where filas importadas
tablespace_name='USERS' and username in ('PRUEBA01','PRUEBA02') . importando la tabla "DEPT" 5
filas importadas
TABLESPACE_NAME MAX_BYTES Activando las restricciones...
------------------------------ ---------- La importación ha terminado correctamente pero con advertencias.
USERS 1048576
USERS 1048576
24. Idem en el esquema “prueba02” para todo el esquema “scott” (fichero “scott_scott03.dmp”). Crear un fichero de
parámetros llamado “par_imp_admin03” (parámetros file, log, grants –N-, full y touser); el registro se guardara en el
23. Como usuario “administrador”, realizar una importación en el esquema de usuario “prueba01” de las tablas “emp” y fichero “imp_esquema_scott_prueba02”.
“dept” pertenecientes al esquema de usuario “scott” (fichero “tablas_scott05.dmp”). Crear un fichero de parámetros
llamado “par_imp_admin02” (parámetros file, log, grants –N-, fromuser, touser y tables); el registro se guardara en el
fichero “imp_tablas_prueba01”. El contenido del fichero de parámetros de importación es:

buffer=102400
El contenido del fichero de parámetros de importación es: file=/export/CURSO01/scott_scott03.dmp
log=/export/CURSO01/imp_esquema_scott_prueba02
buffer=102400 full=y
file=/export/CURSO01/tablas_scott05.dmp grants=N
log=/export/CURSO01/imp_tablas_prueba01 touser=prueba02
tables=(EMP, DEPT)
fromuser=scott
touser=prueba01 /export/CURSO01 (CURSO01)> imp parfile=par_imp_admin03
grants=N
Import: Release 9.2.0.1.0 - Production on Jue Dic 9 13:58:54 2004

/export/CURSO01 (CURSO01)> imp parfile=par_imp_admin02 Copyright (c) 1982, 2002, Oracle Corporation. All rights
reserved.
Import: Release 9.2.0.1.0 - Production on Jue Dic 9 13:55:36 2004
Usuario: administrador
Copyright (c) 1982, 2002, Oracle Corporation. All rights Contraseña:
reserved.
Conectado a: Oracle9i Enterprise Edition Release 9.2.0.1.0 -
Usuario: administrador Production
Contraseña: With the Partitioning and Oracle Label Security options
JServer Release 9.2.0.1.0 - Production
Conectado a: Oracle9i Enterprise Edition Release 9.2.0.1.0 -
Production Archivo de exportación creado por EXPORT:V09.02.00 a través de la
With the Partitioning and Oracle Label Security options ruta de acceso convencional

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 165 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 166
Administración Básica de Oracle9i – Prácticas resueltas Administración Básica de Oracle9i – Prácticas resueltas

Advertencia: Los objetos fueron exportados por SCOTT, no por usted


Advertencia: Los objetos fueron exportados por SCOTT, no por usted
importación realizada en el juego de caracteres WE8ISO8859P15 y el
importación realizada en el juego de caracteres WE8ISO8859P15 y el juego de caracteres NCHAR AL16UTF16
juego de caracteres NCHAR AL16UTF16 . importando objetos de SCOTT en ADMINISTRADOR
. importando objetos de SCOTT en PRUEBA02 "BEGIN "
. importando la tabla "BONUS" 0 "sys.dbms_logrep_imp.instantiate_schema(schema_name=>'SCOTT',
filas importadas export_db_name"
. importando la tabla "DEPT" 5 "=>'CURSO01', inst_scn=>'2031207');"
filas importadas "COMMIT; END;"
. importando la tabla "EMP" 9 "CREATE TABLE "BONUS" ("ENAME" VARCHAR2(10), "JOB" VARCHAR2(9),
filas importadas "SAL" NUMBER"
. importando la tabla "SALGRADE" 5 ", "COMM" NUMBER) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
filas importadas STORAGE(INI"
Activando las restricciones... "TIAL 65536 NEXT 65536 MINEXTENTS 1 MAXEXTENTS 2147483645
La importación ha terminado correctamente y sin advertencias. PCTINCREASE 50 FRE"
"ELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE
"SYSTEM" LOGGING"
25. Como usuario “administrador", realizar una importación a fichero usando el fichero “scott_scott03.dmp” (parámetro " NOCOMPRESS"
SHOW=Y). Crear un fichero de parámetros llamado “par_impfichero_admin04”; el registro se guardara en el fichero . . ignorando la tabla "BONUS"
“imp_scott_fichero”.
"CREATE TABLE "DEPT" ("DEPTNO" NUMBER(2, 0), "DNAME"
VARCHAR2(14), "LOC" VAR"
El contenido del fichero de parámetros de importación es: "CHAR2(13)) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
STORAGE(INITIAL 6"
buffer=102400 "5536 NEXT 65536 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE
file=/export/CURSO01/scott_scott03.dmp 50 FREELISTS"
log=/export/CURSO01/imp_scott_fichero " 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "SYSTEM"
full=y LOGGING NOCOM"
show=y "PRESS"
. . ignorando la tabla "DEPT"

/export/CURSO01 (CURSO01)> imp parfile=par_impfichero_admin04 "CREATE UNIQUE INDEX "PK_DEPT" ON "DEPT" ("DEPTNO" ) PCTFREE 10
INITRANS 2 "
Import: Release 9.2.0.1.0 - Production on Jue Dic 9 14:00:44 2004 "MAXTRANS 255 STORAGE(INITIAL 65536 NEXT 65536 MINEXTENTS 1
MAXEXTENTS 21474"
Copyright (c) 1982, 2002, Oracle Corporation. All rights "83645 PCTINCREASE 50 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL
reserved. DEFAULT) TAB"
"LESPACE "SYSTEM" LOGGING"
Usuario: administrador "ALTER TABLE "DEPT" ADD CONSTRAINT "PK_DEPT" PRIMARY KEY
Contraseña: ("DEPTNO") USING I"
"NDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 65536
Conectado a: Oracle9i Enterprise Edition Release 9.2.0.1.0 - NEXT 65536 MI"
Production "NEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 50 FREELISTS 1
With the Partitioning and Oracle Label Security options FREELIST GROUPS"
JServer Release 9.2.0.1.0 - Production " 1 BUFFER_POOL DEFAULT) TABLESPACE "SYSTEM" LOGGING ENABLE "
...
Archivo de exportación creado por EXPORT:V09.02.00 a través de la El resultado de la importacion, las sentencias de creación, se
ruta de acceso convencional almacenará en el fichero de log.

© Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 167 © Juan Luis Serradilla Amarilla y Francisco Fernández Martínez 168

También podría gustarte