create user subset identified by oracle account unlock;
GRANT CONNECT, RESOURCE TO subset;
GRANT ALTER ANY INDEX TO subset;
GRANT ALTER ANY TABLE TO subset;
GRANT ALTER SYSTEM TO subset;
GRANT ANALYZE ANY TO subset;
GRANT CREATE ANY DICTIONARY TO subset;
GRANT CREATE ANY DIRECTORY TO subset;
GRANT CREATE ANY INDEX TO subset;
GRANT CREATE ANY PROCEDURE TO subset;
GRANT CREATE ANY TABLE TO subset;
GRANT CREATE PROCEDURE TO subset;
GRANT CREATE SEQUENCE TO subset;
GRANT CREATE SESSION TO subset;
GRANT CREATE TABLE TO subset;
GRANT CREATE TABLESPACE TO subset;
GRANT CREATE TYPE TO subset;
GRANT DROP ANY INDEX TO subset;
GRANT DROP ANY TABLE TO subset;
GRANT DROP TABLESPACE TO subset;
GRANT EXECUTE ANY PROCEDURE TO subset;
GRANT EXECUTE ON DBMS_AQADM TO subset;
GRANT EXECUTE ON DBMS_CRYPTO TO subset;
GRANT INSERT ANY TABLE TO subset;
GRANT LOCK ANY TABLE TO subset;
GRANT RESUMABLE TO subset;
GRANT SELECT ANY DICTIONARY TO subset;
GRANT SELECT ANY TABLE TO subset;
GRANT UNLIMITED TABLESPACE TO subset;
miércoles, 19 de diciembre de 2018
miércoles, 25 de octubre de 2017
martes, 24 de octubre de 2017
Como Monitorear una Standby
1) validar en la primaria el numero maximo de secuencia de archive log
SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG;
2) validar el numero maximo de secuencia aplicada en standby database
SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG WHERE APPLIED=’YES’;
3) validacion del las secuencias aplicadas
SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG
WHERE APPLIED=’YES’
ORDER BY SEQUENCE# ;
en la primaria ejecutar cualquiera de las 2 lineas para forzar un switch a los redolog
alter system switch logfile;
ALTER SYSTEM CHECKPOINT;
4) ejecutar los pasos 1 y 2 para corroborar el cambio en la secuencia
5) en la standby database , validar los estados de las secuencias
SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG
WHERE APPLIED='YES'
ORDER BY SEQUENCE# ;
SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG;
2) validar el numero maximo de secuencia aplicada en standby database
SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG WHERE APPLIED=’YES’;
3) validacion del las secuencias aplicadas
SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG
WHERE APPLIED=’YES’
ORDER BY SEQUENCE# ;
en la primaria ejecutar cualquiera de las 2 lineas para forzar un switch a los redolog
alter system switch logfile;
ALTER SYSTEM CHECKPOINT;
4) ejecutar los pasos 1 y 2 para corroborar el cambio en la secuencia
5) en la standby database , validar los estados de las secuencias
SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG
WHERE APPLIED='YES'
ORDER BY SEQUENCE# ;
jueves, 19 de febrero de 2015
hagamos un export con expdp/impdp
1) Para
bajar la base
1.
Verificar las variables de ambiente
2. sqlplus sys/oracle_4U as sysdba
3.
shutdown immediate;
4.
lsnrctl stop
2) Para
subir la base modo restrictive
1. Startup restrict;
3) para
crear un directorio
1.
create or replace directory RESPALDO as
‘/u01/direccion…’;2. grant read, write on directory RESPALDO to <USUARIO> ;
4) Checar la
vista V$NLS_PARAMETERS
1) Tomar los valores de NLS_LANGUAGE, NLS_TERRITORY, NLS_CHARACTERSETY formar el export de la siguiente manera
select
trim(parameter)
||'='
||trim(value)
from v$nls_parameterswhere parameter like '%NLS_LANGUAGE%'
or parameter like '%NLS_TERRITORY%'
or parameter like '%NLS_CHARACTERSET%';
export
NLS_LANG=AMERICAN_AMERICA.AL32UTF8
5) para hacer un export full
expdp system/oracle_4U
full=y directory=RESPALDO dumpfile=salida.dmp logfile=salida.log
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
impdp system/oracle_4U directory=RESPALDO content=all
dumpfile=salida2.dmp schemas=OE,HR logfile=salida_imp.log
6)
iniciar la base y el listener
Startup -- inicia la base
Lsnrctl start
sql muy utiles en migracion de bases
--cuantos indices invalidos
select owner,count(1)
from dba_indexes
where status = 'INVALID'
group by owner;
--cuales son los indices invalidos
select owner,
index_name,
index_type,
table_owner,
table_name,
table_type,
tablespace_name
from dba_indexes
where status = 'INVALID';
-- cuantos son los objetos invalidos
select owner,object_type,count(1)
from dba_objects
where status = 'INVALID'
group by owner,object_type
order by 1,2;
-- cuales son los objetos invalidos
select owner,
object_name,
created,
last_ddl_time
from dba_objects
where status = 'INVALID'
order by 1,2;
-- Paquetes con bodies sin que no tengan sus correspondientes headers
select unique owner,name
from dba_source a
where type = 'PACKAGE BODY'
and not exists (select null
from dba_source b
where a.owner = b.owner
and a.name = b.name
and b.type = 'PACKAGE') ;
-- Constraints deshabilitadas
select owner,
case constraint_type
when 'P' then 'PRIMARY_KEY'
when 'R' then 'FOREIGN_KEY'
when 'U' then 'UNIQUE'
when 'C' then 'CHECK'
end constraint_type,
count(1)
from dba_constraints
where status = 'DISABLED'
group by owner,constraint_type
order by 1,2;
select owner,
constraint_name,
constraint_type,
table_name
from dba_constraints
where status = 'DISABLED'
order by 1,2;
--Triggers deshabilitados
select owner,
trigger_name,
trigger_type,
triggering_event,
table_owner,
table_name
from dba_triggers
where status = 'DISABLED'
order by 1,2;
-- para contar registros de todas las tablas
SELECT 'SELECT '
|| q'{'}'
||OWNER
|| '.'
|| OBJECT_NAME
|| q'{'}'
|| ' as Origen, COUNT(*) as registros'
|| ' FROM '
||OWNER ||'.'
|| OBJECT_NAME
|| ' UNION' --,
-- OBJECT_TYPE
FROM ALL_OBJECTS
WHERE OBJECT_TYPE='TABLE'
and owner not in ('SYS','SYSTEM','DBSNMP');
select owner,count(1)
from dba_indexes
where status = 'INVALID'
group by owner;
--cuales son los indices invalidos
select owner,
index_name,
index_type,
table_owner,
table_name,
table_type,
tablespace_name
from dba_indexes
where status = 'INVALID';
-- cuantos son los objetos invalidos
select owner,object_type,count(1)
from dba_objects
where status = 'INVALID'
group by owner,object_type
order by 1,2;
-- cuales son los objetos invalidos
select owner,
object_name,
created,
last_ddl_time
from dba_objects
where status = 'INVALID'
order by 1,2;
-- Paquetes con bodies sin que no tengan sus correspondientes headers
select unique owner,name
from dba_source a
where type = 'PACKAGE BODY'
and not exists (select null
from dba_source b
where a.owner = b.owner
and a.name = b.name
and b.type = 'PACKAGE') ;
-- Constraints deshabilitadas
select owner,
case constraint_type
when 'P' then 'PRIMARY_KEY'
when 'R' then 'FOREIGN_KEY'
when 'U' then 'UNIQUE'
when 'C' then 'CHECK'
end constraint_type,
count(1)
from dba_constraints
where status = 'DISABLED'
group by owner,constraint_type
order by 1,2;
select owner,
constraint_name,
constraint_type,
table_name
from dba_constraints
where status = 'DISABLED'
order by 1,2;
--Triggers deshabilitados
select owner,
trigger_name,
trigger_type,
triggering_event,
table_owner,
table_name
from dba_triggers
where status = 'DISABLED'
order by 1,2;
-- para contar registros de todas las tablas
SELECT 'SELECT '
|| q'{'}'
||OWNER
|| '.'
|| OBJECT_NAME
|| q'{'}'
|| ' as Origen, COUNT(*) as registros'
|| ' FROM '
||OWNER ||'.'
|| OBJECT_NAME
|| ' UNION' --,
-- OBJECT_TYPE
FROM ALL_OBJECTS
WHERE OBJECT_TYPE='TABLE'
and owner not in ('SYS','SYSTEM','DBSNMP');
viernes, 31 de octubre de 2014
Trabajando con JOB en oracle 11g
hola, este dia en mi trabajo se me asigno la tarea de crear un job, para mi no es problema, pero que pasa si alguien no sabe?? , entonces les dejo este pequenio manual, ha sido probado en la version 11g.
1) primero vamos a crear una tabla la que llenaremos por medio del JOB
CREATE TABLE TMP_BORRAME_PRUEBA
(
DESCRIPCION VARCHAR2(100 BYTE),
FECHA DATE
);
2) creamos un procedimiento PL/SQL para ser llamado desde el JOB
CREATE OR REPLACE procedure prc_tmp_borrame
is
v_contador number(5) := null;
begin
select count(1)
into v_contador
from tmp_borrame_prueba;
insert into tmp_borrame_prueba
(descripcion, fecha)
values ('Registros contados :'|| to_char(v_contador), sysdate);
commit;
end;
/
3) lo siguiente , puedes usarlo de acuerdo a tu conveniencia
--- para ver todos los jobs del esquema ONDE EJSTOY connected
SELECT JOB,
SCHEMA_USER,
LAST_DATE,
NEXT_DATE,
INTERVAL,
WHAT
FROM DBA_JOBS
WHERE SCHEMA_USER = (SELECT USER FROM DUAL);
BEGIN
DBMS_JOB.BROKEN( <NUMERO JOB>, FALSE ); -- pone estado on line el JON [dependiendo tu caso]
DBMS_JOB.BROKEN( <NUMERO JOB>, TRUE ); -- pone estado OFF line el JON [dependiendo tu caso]
COMMIT;
END;
BEGIN
DBMS_JOB.REMOVE ( <NUMERO JOB> ); ---BORRA ELJOB
COMMIT;
END;
-- forma para crear un job.....
DECLARE
X NUMBER;
BEGIN
SYS.DBMS_JOB.SUBMIT
( JOB => X
,WHAT => -- colocamos entre [BEGIN] ..... [ END; ] el codigo pl que deseamos ejecutar
'begin
prc_tmp_borrame;
end;'
,NEXT_DATE => TO_DATE('31/10/2014 14:36:37','dd/mm/yyyy hh24:mi:ss') --- fecha y hora de inicio
,INTERVAL => 'SYSDATE+1/1440' --- intervalo de ejecucion
--,interval => 'TRUNC(SYSDATE+1)+3.5/24' -- para ejecutarlo todos los dias a las 3:30 .....
,NO_PARSE => FALSE --- vale chonga :D
);
SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || TO_CHAR(X));
COMMIT;
END;
/
1) primero vamos a crear una tabla la que llenaremos por medio del JOB
CREATE TABLE TMP_BORRAME_PRUEBA
(
DESCRIPCION VARCHAR2(100 BYTE),
FECHA DATE
);
2) creamos un procedimiento PL/SQL para ser llamado desde el JOB
CREATE OR REPLACE procedure prc_tmp_borrame
is
v_contador number(5) := null;
begin
select count(1)
into v_contador
from tmp_borrame_prueba;
insert into tmp_borrame_prueba
(descripcion, fecha)
values ('Registros contados :'|| to_char(v_contador), sysdate);
commit;
end;
/
3) lo siguiente , puedes usarlo de acuerdo a tu conveniencia
--- para ver todos los jobs del esquema ONDE EJSTOY connected
SELECT JOB,
SCHEMA_USER,
LAST_DATE,
NEXT_DATE,
INTERVAL,
WHAT
FROM DBA_JOBS
WHERE SCHEMA_USER = (SELECT USER FROM DUAL);
BEGIN
DBMS_JOB.BROKEN( <NUMERO JOB>, FALSE ); -- pone estado on line el JON [dependiendo tu caso]
DBMS_JOB.BROKEN( <NUMERO JOB>, TRUE ); -- pone estado OFF line el JON [dependiendo tu caso]
COMMIT;
END;
BEGIN
DBMS_JOB.REMOVE ( <NUMERO JOB> ); ---BORRA ELJOB
COMMIT;
END;
-- forma para crear un job.....
DECLARE
X NUMBER;
BEGIN
SYS.DBMS_JOB.SUBMIT
( JOB => X
,WHAT => -- colocamos entre [BEGIN] ..... [ END; ] el codigo pl que deseamos ejecutar
'begin
prc_tmp_borrame;
end;'
,NEXT_DATE => TO_DATE('31/10/2014 14:36:37','dd/mm/yyyy hh24:mi:ss') --- fecha y hora de inicio
,INTERVAL => 'SYSDATE+1/1440' --- intervalo de ejecucion
--,interval => 'TRUNC(SYSDATE+1)+3.5/24' -- para ejecutarlo todos los dias a las 3:30 .....
,NO_PARSE => FALSE --- vale chonga :D
);
SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || TO_CHAR(X));
COMMIT;
END;
/
jueves, 5 de junio de 2014
UPDATE, EN TABLA CON VARIOS MILLONES DE REGISTROS???
hola amig@ , este día se me encomendó realizar una actualización para una tabla destino que contiene 4.5 millones de registros, desde una tabla origen que contiene 8.5 millones de registros.
bueno para eso probé varias opciones desde hacer un cursor hasta hacer un merge pero los tiempos de ejecución fueron muy lentos, buscando información me encontré con un documento de ORACLE, aca les dejo el ejemplo, los conceptos a comprender son facilites; también se manejan los errores, por cuestión de tiempo no los incorporo a una tabla para manejar una estadística, ya eso seria opción de ustedes ;)
no se olviden de dejar sus comentarios....
CREATE OR REPLACE PROCEDURE SLDUSR.UPDATE_ALL_ROWS ( P_LOAÑO IN number ,
P_LOMES IN number,
P_LODIA IN number )
AS
TYPE V_TCCCLI IS TABLE OF NOV_L1CTLOG.TCCCLI%TYPE INDEX BY PLS_INTEGER;
TYPE V_TCNCON IS TABLE OF NOV_L1CTLOG.TCNCON%TYPE INDEX BY PLS_INTEGER;
TYPE V_TCNFOL IS TABLE OF NOV_L1CTLOG.TCNFOL%TYPE INDEX BY PLS_INTEGER;
TYPE V_LOTANT IS TABLE OF NOV_L1CTLOG.LOTANT%TYPE INDEX BY PLS_INTEGER;
TYPE V_LOTDES IS TABLE OF NOV_L1CTLOG.LOTDES%TYPE INDEX BY PLS_INTEGER;
TO_V_TCCCLI V_TCCCLI;
TO_V_TCNCON V_TCNCON;
TO_V_TCNFOL V_TCNFOL;
TO_V_LOTANT V_LOTANT;
TO_V_LOTDES V_LOTDES;
X_BAD_ITERATION EXCEPTION;
PRAGMA EXCEPTION_INIT (X_BAD_ITERATION, -24381 );
BEGIN
SELECT TRIM(TCCCLI) ,
TRIM(TCNCON) ,
TRIM(TCNFOL) ,
TRIM(LOTANT) ,
TRIM(LOTDES)
BULK COLLECT INTO TO_V_TCCCLI ,
TO_V_TCNCON ,
TO_V_TCNFOL ,
TO_V_LOTANT ,
TO_V_LOTDES
FROM NOV_L1CTLOG
WHERE LOAÑO = P_LOAÑO AND
LOMES = P_LOMES AND
LODIA = P_LODIA ;
FORALL I IN TO_V_TCNFOL.FIRST .. TO_V_TCNFOL.LAST SAVE EXCEPTIONS
UPDATE ASSET2
SET TELEFONO = TO_V_LOTDES(I)
WHERE ID_ANE_BILLING = TO_V_TCNFOL(I);
DBMS_OUTPUT.PUT_LINE ( TO_CHAR(SQL%ROWCOUNT) || ' records updated.' );
COMMIT;
EXCEPTION
WHEN X_BAD_ITERATION
THEN
DBMS_OUTPUT.PUT_LINE ('SUCCESSFUL UPDATE OF ' || TO_CHAR(SQL%ROWCOUNT) || ' RECORDS.' );
DBMS_OUTPUT.PUT_LINE ( 'FAILED ON ' || TO_CHAR(SQL%BULK_EXCEPTIONS.COUNT) || ' RECORDS.' );
FOR I IN 1 .. SQL%BULK_EXCEPTIONS.COUNT
LOOP
DBMS_OUTPUT.PUT_LINE (
'ERROR OCCURRED ON ITERATION ' ||
SQL%BULK_EXCEPTIONS(I).ERROR_INDEX ||
' DUE TO ' ||
SQLERRM (
-1 * SQL%BULK_EXCEPTIONS(I).ERROR_CODE)
);
DBMS_OUTPUT.PUT_LINE (
'NOV_L1CTLOG = ' ||
TO_CHAR (
TO_V_TCNFOL (
SQL%BULK_EXCEPTIONS(I).ERROR_INDEX )) ||
' VALUE = ' ||
TO_CHAR (
TO_V_LOTANT (
SQL%BULK_EXCEPTIONS(I).ERROR_INDEX ))
);
END LOOP;
END UPDATE_ALL_ROWS;
Suscribirse a:
Entradas (Atom)