awk -F':' '{ print $1 }' /etc/passwd
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;
viernes, 23 de mayo de 2014
SQLLOADER DE BASE A BASE???
Me encuentro trabajando para un cliente en el que debemos migrar una data desde AS400 hacia ORACLE 11g..... jijiji , actualmente se hace un pl para hacer el insert y manejar los errores, pues la cosa no deberia aser asi!!!!
les dejo como hacer un sql loader de base a base, para lo cual se creo un DBLINK (pero ese es otro tema)
Paso 1) creamos la tabla que poblaremos con los registros probenientes de la tabla a migrar
paso 2) haremos un pequenio bloque anonimo PL en el cual se crea una tabla donde se manejan los errores
BEGIN
DBMS_ERRLOG.CREATE_ERROR_LOG( ' <nombre de la tabla> ' ) ;
END;
Esta acción crea otra tabla con el acronimo ERR$_<nombre de la tabla>
paso 3) posteriormente procedemos a realizar un insert into \
INSERT INTO <tabla destino> (campo1 ,
campo2 ,
campo3 ,
campo4 ,
campo5 )
SELECT campo1 ,
campo2 ,
campo3 ,
campo4 ,
campo5
FROM <tabla origen>@<nombre del dblink>
where campo1 = parametro1
and campo2 = parametro2
and campo3 = parametro3
LOG ERRORS REJECT LIMIT UNLIMITED;
paso 4) para comprobar si existieron errores deben hacer un select a la tabla creada en el paso 2
SELECT * FROM ERR$_<nombre de la tabla>;
PASO 5) HAY ME CUENTAN COMO LES FUE...
Suscribirse a:
Entradas (Atom)