Está en la página 1de 11

Administración Básica de Oracle9i.

PRACTICAS.

TRABAJOS (JOBS).

1. Identificar los procesos de sistema operativo que corresponden al proceso gestor de


colas corriendo en la instancia.

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

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

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

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

job_queue_processes = 10

3. Eliminar el proceso de sistema operativo gestor de colas mediante la orden “kill”. ¿Qué
sucede?, ¿ha afectado a la instancia?, ¿se ha generado algún error en el fichero de
alertas?, ¿y alguna traza?.

/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 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
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 20556 1 0 15:21 ? 00:00:00 ora_cjq0_CURSO01
oracle 20558 19652 0 15:21 pts/172 00:00:00 grep CURSO01

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


Administración Básica de Oracle9i.

En el fichero de alertas aparece el mensaje:

Mon Nov 22 15:13:31 2004


Restarting dead background process CJQ0
CJQ0 started with pid=8
Mon Nov 22 15:18:31 2004
Restarting dead background process CJQ0
CJQ0 started with pid=8

4. Fijar el parámetro job_queue_proceses en 1020 procesos. Parar y arrancar la base de


datos. ¿Arranca con normalidad?, ¿qué valor toma el parámetro?.

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

SQL*Plus: Release 9.2.0.1.0 - Production on Mon Nov 22 15:24:09 2004

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

SQL> connect / as sysdba;


Connected.

SQL> shutdown immediate


Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> startup
ORA-01078: failure in processing system parameters
LRM-00122: value '1020' for 'job_queue_processes' must be between '0' and
'1000'

5. Ver el contenido del paquete dbms_job.

Revisar documentacion en linea.

6. 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.

SQL> desc dba_jobs


Name Null? Type
----------------------------------------- -------- ----------------
JOB NOT NULL NUMBER
LOG_USER NOT NULL VARCHAR2(30)
PRIV_USER NOT NULL VARCHAR2(30)
SCHEMA_USER NOT NULL VARCHAR2(30)
LAST_DATE DATE
LAST_SEC VARCHAR2(8)
THIS_DATE DATE
THIS_SEC VARCHAR2(8)
NEXT_DATE NOT NULL DATE
NEXT_SEC VARCHAR2(8)
TOTAL_TIME NUMBER
BROKEN VARCHAR2(1)
INTERVAL NOT NULL VARCHAR2(200)
FAILURES NUMBER
WHAT VARCHAR2(4000)
NLS_ENV VARCHAR2(4000)

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


Administración Básica de Oracle9i.

MISC_ENV RAW(32)
INSTANCE NUMBER

SQL> desc user_jobs


Name Null? Type
----------------------------------------- -------- -------------
JOB NOT NULL NUMBER
LOG_USER NOT NULL VARCHAR2(30)
PRIV_USER NOT NULL VARCHAR2(30)
SCHEMA_USER NOT NULL VARCHAR2(30)
LAST_DATE DATE
LAST_SEC VARCHAR2(8)
THIS_DATE DATE
THIS_SEC VARCHAR2(8)
NEXT_DATE NOT NULL DATE
NEXT_SEC VARCHAR2(8)
TOTAL_TIME NUMBER
BROKEN VARCHAR2(1)
INTERVAL NOT NULL VARCHAR2(200)
FAILURES NUMBER
WHAT VARCHAR2(4000)
NLS_ENV VARCHAR2(4000)
MISC_ENV RAW(32)
INSTANCE NUMBER

SQL> desc dba_jobs_running


Name Null? Type
----------------------------------------- -------- ------------
SID NUMBER
JOB NUMBER
FAILURES NUMBER
LAST_DATE DATE
LAST_SEC VARCHAR2(8)
THIS_DATE DATE
THIS_SEC VARCHAR2(8)
INSTANCE NUMBER

7. 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 usadas por el analizador
sintáctico de Oracle.
Se ejecutara en el momento de su creación y con periodicidad semanal.

create table usuarios_estadisticas (username varchar2(30) not null,


fecha date,
error varchar2(80))
tablespace users
storage (initial 16K next 16K maxextents 10)

CREATE OR REPLACE procedure analiza_usuarios as


cursor usuarios is
select username,rowid from system.usuarios_estadisticas;
werror varchar2(80);
wrowid urowid;
begin
FOR rec_usuarios IN usuarios LOOP
wrowid:=rec_usuarios.rowid;
begin

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


Administración Básica de Oracle9i.

DBMS_UTILITY.ANALYZE_SCHEMA
(rec_usuarios.username,'ESTIMATE',NULL,33);
update system.usuarios_estadisticas
set fecha=sysdate, error=null
where rowid=rec_usuarios.rowid;
exception
when others then
werror:=rpad(sqlerrm,80);
update system.usuarios_estadisticas
set error=werror, fecha=sysdate
where rowid=wrowid;
end;
END LOOP;
end analiza_usuarios;
/

Crear un "script" llamado crea_trabajo1.sql, por ejemplo, con el


contenido siguiente:

DECLARE
v_numjob integer;
begin
dbms_job.submit(v_numjob,'SYSTEM.ANALIZA_USUARIOS;', SYSDATE, 'SYSDATE +
7');
commit;
DBMS_OUTPUT.PUT_LINE('Identificador de trabajo es: ' || v_numjob);
end;
/

Ejecutarlo desde sqlplus:

SQL> @crea_trabajo1.sql

Procedimiento PL/SQL terminado correctamente.

8. 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 ejecución mañana?.

SQL> alter system set job_queue_processes=0;

System altered.

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) from dba_jobs;

JOB TO_CHAR(LAST_DATE,' TO_CHAR(NEXT_DATE,' SUBSTR(INTERVAL,1,25)


------ ------------------- -----------------------------------------
2 22-11-2004 15:31:18 29-11-2004 15:31:18 SYSDATE + 7

SQL> exec dbms_job.run(2);

PL/SQL procedure successfully completed.

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) from dba_jobs;

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


Administración Básica de Oracle9i.

JOB TO_CHAR(LAST_DATE,' TO_CHAR(NEXT_DATE,' SUBSTR(INTERVAL,1,25)


---------- ------------------- ------------------------------------
2 22-11-2004 15:37:11 29-11-2004 15:37:11 SYSDATE + 7

9. Observar, en caso de que se haya producido, el error generado en el ejercicio anterior en


el fichero de alertas y comprobar si se ha creado algún fichero de traza; en caso de
existir este ultimo, editarlo con el editor vi y ver su contenido.

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
cumplan la condición.
Se ejecutara cada hora.

Previamente debe crearse la siguiente tabla:

CREATE TABLE tablas_revision


(nombre_tabla varchar2(30),
ocupacion number)
storage (initial 100k next 100k);

¿En que espacio de almacenamiento se ha creado la tabla?, ¿con que parámetros


de almacenamiento?.

CREATE OR REPLACE procedure chequear_tablas as


extensiones integer;
maximo_extensiones integer;
ocupacion integer;
porcentaje_extensiones integer := 80;
cursor c_tablas is select table_name from user_tables;

begin
FOR rec_tables IN c_tablas LOOP
select count(*) into extensiones
from user_extents
where segment_name=rec_tables.table_name;

select max_extents into maximo_extensiones


from user_tables
where table_name=rec_tables.table_name;

ocupacion:=(round(extensiones*100/maximo_extensiones));

IF (ocupacion > porcentaje_extensiones) THEN


insert into tablas_revision values (rec_tables.table_name, ocupacion);
commit;
END IF;

END LOOP;

end chequear_tablas;
/

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


Administración Básica de Oracle9i.

SQL> connect prueba01


Introduzca su clave:
Connected.

SQL> CREATE TABLE tablas_revision


2 (nombre_tabla varchar2(30),
3 ocupacion number)
4 storage (initial 100k next 100k);

Table created.

Para ver las caracteristicas de almacenamiento de la tabla consultar la


vista "user_tables".

Crear un "script" llamado chequear_tablas.sql, por ejemplo, que contenga


las sentencias de creacion del procedimiento:

SQL> @chequear_tablas.sql

Procedure created.

Crear un "script" llmado crea_trabajo2.sql, por ejemplo, con el contenido


siguiente:

DECLARE
v_numjob integer;
begin
dbms_job.submit(v_numjob,'PRUEBA01.CHEQUEAR_TABLAS;', SYSDATE, 'SYSDATE +
60/1440');
commit;
DBMS_OUTPUT.PUT_LINE('Identificador de trabajo es: ' || v_numjob);
end;
/

SQL> @crea_trabajo2.sql

PL/SQL procedure successfully completed.

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) from user_jobs

JOB TO_CHAR(LAST_DATE,' TO_CHAR(NEXT_DATE,' SUBSTR(INTERVAL,1,25)


-------- ------------------- ------------------------------------------
3 23-11-2004 13:13:42 SYSDATE + 60/1440

11.Como usuario SYSTEM crear un trabajo que llamara al procedimiento descrito


seguidamente, también propiedad del SYSTEM, que permite monitorizar el numero de
sesiones activas de usuario en la instancia. Se ejecutara cada cinco minutos.

CREATE OR REPLACE procedure monitorizar_usuarios as


sesiones number(4);
activas number(4);
cursor c_usuarios is
select usuario
from usuarios_monitorizados

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


Administración Básica de Oracle9i.

where monitorizar = 'S';

begin
FOR rec_usuarios IN c_usuarios LOOP

select nvl(count(*),0) into sesiones


from v$session
where username=rec_usuarios.usuario
and status in ('ACTIVE','INACTIVE');

select nvl(count(*),0) into activas


from v$session
where username=rec_usuarios.usuario
and status = 'ACTIVE';

insert into usuarios_monitorizados_log


values (rec_usuarios.usuario,sysdate,sesiones,activas);

END LOOP;
commit;
end monitorizar_usuarios;
/

Previamente deben crearse las siguientes tablas:

CREATE TABLE usuarios_monitorizados_log


(usuario varchar2(30),
fecha_log date,
sesiones number(4),
activas number(4))
storage (initial 100k next 100k);

CREATE TABLE usuarios_monitorizados


(usuario varchar2(30),
monitorizar char(1),
descripcion varchar2(80))
storage (initial 100k next 100k);

SQL> CREATE TABLE usuarios_monitorizados_log


(usuario varchar2(30),
fecha_log date,
sesiones number(4),
activas number(4))
storage (initial 100k next 100k);

Table created.

SQL> CREATE TABLE usuarios_monitorizados


(usuario varchar2(30),
monitorizar char(1),
descripcion varchar2(80))
storage (initial 100k next 100k);

Table created.

Conectarse como usuario SYS y dar permisos sobre vista SESSION:

SQL> connect sys as sysdba;

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


Administración Básica de Oracle9i.

Enter password:
Connected.
SQL> show user
USER is "SYS"

SQL> grant select on V_$SESSION to system;

Grant succeeded.

Crear un "script" llamado monitorizar_usuarios.sql, por ejemplo, que


contenga las sentencias de creacion del procedimiento:

SQL> @monitorizar_usuarios.sql

Procedure created.

Crear un "script" llmado crea_trabajo3.sql, por ejemplo, con el contenido


siguiente:

DECLARE
v_numjob integer;
begin
dbms_job.submit(v_numjob,'SYSTEM.MONITORIZAR_USUARIOS;', SYSDATE, 'SYSDATE
+ 5/1440');
commit;
DBMS_OUTPUT.PUT_LINE('Identificador de trabajo es: ' || v_numjob);
end;
/

SQL> @crea_trabajo3.sql

PL/SQL procedure successfully completed.

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

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='SYSTEM';

JOB TO_CHAR(NEXT_DATE,' SUBSTR(INTERVAL,1,25) FAILURES B


---------- ------------------- ------------------------- ---------- -
WHAT
--------------------------------------------------------------------------
1 25-11-2004 11:41:19 SYSDATE + 7 0 N
SYSTEM.ANALIZA_USUARIOS;

2 29-11-2004 15:37:11 SYSDATE + 7 0 N


SYSTEM.ANALIZA_USUARIOS;

4 23-11-2004 13:26:43 SYSDATE + 5/1440 N


SYSTEM.MONITORIZAR_USUARIOS;

13.Repetir el ejercicio anterior para el usuario “prueba01”.

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


Administración Básica de Oracle9i.

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';

JOB TO_CHAR(NEXT_DATE,' SUBSTR(INTERVAL,1,25) FAILURES B


---------- ------------------- ------------------------- ---------- -
WHAT
--------------------------------------------------------------------------
3 23-11-2004 13:13:42 SYSDATE + 60/1440 N
PRUEBA01.CHEQUEAR_TABLAS;

14.Conectarse como usuario “prueba01” e intentar eliminar de la cola de trabajos a aquel


trabajo que realiza la monitorización de usuarios, ¿qué sucede?.

SQL> connect prueba01


Introduzca su clave:
Connected.

SQL> exec dbms_job.remove(4);


BEGIN dbms_job.remove(4); END;

*
ERROR at line 1:
ORA-23421: job number 4 is not a job in the job queue
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 86
ORA-06512: at "SYS.DBMS_IJOB", line 529
ORA-06512: at "SYS.DBMS_JOB", line 171
ORA-06512: at line 1

15.Conectado como usuario "prueba01", consultar la vista user_jobs y determinar sus


trabajos.

SQL> select job, to_char(next_date, 'dd-mm-yyyy hh24:mi:ss'),substr


(interval,1,25), failures, broken, what from user_jobs;

JOB TO_CHAR(NEXT_DATE,' SUBSTR(INTERVAL,1,25) FAILURES B


---------- ------------------- ------------------------- ---------- -
WHAT
--------------------------------------------------------------------------
3 23-11-2004 13:13:42 SYSDATE + 60/1440 N
PRUEBA01.CHEQUEAR_TABLAS;

16.Marcar el trabajo, propiedad del usuario “prueba01”, que realiza el chequeo de tablas
como “broken”. Consultar su estado en la vista user_jobs.

SQL> exec dbms_job.broken(3,TRUE);

PL/SQL procedure successfully completed.

SQL> select job, to_char(next_date, 'dd-mm-yyyy hh24:mi:ss'),substr


(interval,1,25), failures, broken, what from user_jobs;

JOB TO_CHAR(NEXT_DATE,' SUBSTR(INTERVAL,1,25) FAILURES B

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


Administración Básica de Oracle9i.

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


WHAT
--------------------------------------------------------------------------
3 01-01-4000 00:00:00 SYSDATE + 60/1440 Y
PRUEBA01.CHEQUEAR_TABLAS;

17.Intentar marcar como “broken” el trabajo que realiza la monitorización de usuarios. ¿Qué
sucede al realizarlo?, ¿quién es su poseedor?.

SQL> exec dbms_job.broken(4,TRUE);


BEGIN dbms_job.broken(4,TRUE); END;

*
ERROR at line 1:
ORA-23421: job number 4 is not a job in the job queue
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 86
ORA-06512: at "SYS.DBMS_IJOB", line 529
ORA-06512: at "SYS.DBMS_JOB", line 245
ORA-06512: at line 1

18.Conectarse como usuario SYSTEM y modificar el trabajo que llama al procedimiento de


monitorización de usuarios para que se realice cada quince minutos.

SQL> exec dbms_job.interval(4,'SYSDATE + 15/1440');

PL/SQL procedure successfully completed.

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='SYSTEM';

JOB TO_CHAR(NEXT_DATE,' SUBSTR(INTERVAL,1,25) FAILURES B


---------- ------------------- ------------------------- ---------- -
WHAT
--------------------------------------------------------------------------
1 25-11-2004 11:41:19 SYSDATE + 7 0 N
SYSTEM.ANALIZA_USUARIOS;

2 29-11-2004 15:37:11 SYSDATE + 7 0 N


SYSTEM.ANALIZA_USUARIOS;

4 23-11-2004 13:26:43 SYSDATE + 15/1440 N


SYSTEM.MONITORIZAR_USUARIOS;

19.Conectarse como usuario “prueba01” y modificar el trabajo que chequea la ocupación de


las tablas para que se realice cada treinta minutos.

SQL> connect prueba01


Enter password:
Connected.

SQL> exec dbms_job.interval(3,'SYSDATE + 30/1440');

PL/SQL procedure successfully completed.

SQL> select job, to_char(next_date, 'dd-mm-yyyy hh24:mi:ss'),substr


(interval,1,25), failures, broken, what from user_jobs;

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


Administración Básica de Oracle9i.

JOB TO_CHAR(NEXT_DATE,' SUBSTR(INTERVAL,1,25) FAILURES B


---------- ------------------- ------------------------- ---------- -
WHAT
-------------------------------------------------------------------------
3 01-01-4000 00:00:00 SYSDATE + 30/1440 Y
PRUEBA01.CHEQUEAR_TABLAS;

20.Forzar la ejecución inmediata del trabajo que realiza el chequeo de ocupación de tablas.
¿Conectado como que usuario debe realizarse?.

SQL> exec dbms_job.run(3);

PL/SQL procedure successfully completed.

SQL> select job, to_char(next_date, 'dd-mm-yyyy hh24:mi:ss'),substr


(interval,1,25), failures, broken, what from user_jobs;

JOB TO_CHAR(NEXT_DATE,' SUBSTR(INTERVAL,1,25) FAILURES B


---------- ------------------- ------------------------- ---------- -
WHAT
--------------------------------------------------------------------------
3 23-11-2004 14:13:27 SYSDATE + 30/1440 0 N
PRUEBA01.CHEQUEAR_TABLAS;

21.Conectado como usuario SYSTEM, eliminar el trabajo que realiza el chequeo de


ocupación de tablas.

SQL> connect system


Enter password:
Connected.

SQL> exec dbms_job.remove(3);


BEGIN dbms_job.remove(3); END;

*
ERROR at line 1:
ORA-23421: job number 3 is not a job in the job queue
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 86
ORA-06512: at "SYS.DBMS_IJOB", line 529
ORA-06512: at "SYS.DBMS_JOB", line 171
ORA-06512: at line 1

22.Repetir el ejercicio anterior conectado como usuario “prueba01”.

SQL> connect prueba01


Enter password:
Connected.

SQL> exec dbms_job.remove(3);

PL/SQL procedure successfully completed.

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

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

También podría gustarte