lunes, 18 de junio de 2012

Script - Traspaso de estadísticas Oracle entre esquemas

Script para el traspaso de estadísticas Oralce entre dos esquemas de distintas bases de datos, se supone existe una tabla intermedia llamadas "CONEXIONES" ubicada en una base de datos central "DB_CENTRAL" donde se almacenan todas los usuarios y passwords de nuestro pool de bases de datos.

El script va pidiendo el esquema de origen y destino, base de datos de origen y destino.

column FECHA new_value FECHA

select
  TO_CHAR(SYSDATE,'YYYYMMDD')   FECHA
from
  DUAL
/

host mkdir &FECHA

WHENEVER SQLERROR CONTINUE
WHENEVER OSERROR CONTINUE

set serveroutput on size 1000000
set termout on
set verify off
set feedback off
set echo off
set heading off
set pagesize 0
set pause off
set wrap on
set line 500
column lanza format a1000


conn usuario/"password"@DB_CENTRAL

define conexion_orig = ""
define conexion_dest = ""
column conexion_orig format a60 new_value Conexion_orig
column conexion_dest format a60 new_value Conexion_dest
COLUMN cadena_conexion format a60
COLUMN comentarios format a50


-- Esquemas a capturar/volcar estadísticas
accept esquema_orig_stats char prompt 'Filtro de esquema ORIGEN a capturar estadísticas: '
accept esquema_dest_stats char prompt 'Filtro de esquema DESTINO a capturar estadísticas: '

-- Mostramos las conexiones origen
accept cadena_orig char prompt 'Filtro de cadena de conexión ORIGEN (usuario SYSTEM): '

select conn_id, trim(usuario)||'/"'||trim(passw)||'"@'||trim(cadena) as cadena_conexion , SUBSTR(COMENTARIOS,1,50) comentarios
from
    CONEXIONES
where
    upper(usuario) like '%'||UPPER('SYSTEM')||'%' and
    upper(cadena) like '%'||UPPER('&cadena_orig')||'%' and
    (UPPER(comentarios) not like 'NO DISPONIBLE%'  AND
    UPPER(comentarios) not like 'ELIMINA%' OR
    COMENTARIOS IS NULL)
order by comentarios, trim(cadena), trim(usuario)
/

accept conn_id_orig number prompt 'Introduzca el id de la conexión ORIGEN: ';

-- Mostramos las conexiones destino
accept cadena_dest char prompt 'Filtro de cadena de conexión DESTINO (usuario SYSTEM): '

select conn_id, trim(usuario)||'/"'||trim(passw)||'"@'||trim(cadena) as cadena_conexion , SUBSTR(COMENTARIOS,1,50) comentarios
from
    CONEXIONES
where
    upper(usuario) like '%'||UPPER('SYSTEM')||'%' and
    upper(cadena) like '%'||UPPER('&cadena_dest')||'%' and
    (UPPER(comentarios) not like 'NO DISPONIBLE%'  AND
    UPPER(comentarios) not like 'ELIMINA%' OR
    COMENTARIOS IS NULL)
order by comentarios, trim(cadena), trim(usuario)
/

accept conn_id_dest number prompt 'Introduzca el id de la conexión DESTINO: ';

spool &FECHA\copy_stats.sql
select 'copy from '||v_from.cadena_conexion||' to '||v_to.cadena_conexion||' append &esquema_dest_stats..STATS_TABLE using SELECT * from &esquema_orig_stats..STATS_TABLE'
from
    (select conn_id, trim(usuario)||'/"'||trim(passw)||'"@'||trim(cadena) as cadena_conexion
    from
        CONEXIONES
    where
        conn_id=&conn_id_orig
    order by conn_id) v_from,
    (select conn_id, trim(usuario)||'/"'||trim(passw)||'"@'||trim(cadena) as cadena_conexion
    from
        CONEXIONES
    where
        conn_id=&conn_id_dest
    order by conn_id) v_to   
/
spool off;


-- Generamos las cadenas de conexión a origen y destino

select trim(usuario)||'/"'||trim(passw)||'"@'||trim(cadena) as conexion_orig
from CONEXIONES
where
    conn_id=decode(nvl(&conn_id_orig,98),0,98,nvl(&conn_id_orig,98))
/
select trim(usuario)||'/"'||trim(passw)||'"@'||trim(cadena) as conexion_dest
from CONEXIONES
where
    conn_id=decode(nvl(&conn_id_dest,98),0,98,nvl(&conn_id_dest,98))
/
-- Conexion a ORIGEN
conn &conexion_orig

-- Borrado, creación y captura de stadisticas
exec DBMS_STATS.DROP_STAT_TABLE('&esquema_orig_stats','STATS_TABLE');
EXEC DBMS_STATS.CREATE_STAT_TABLE('&esquema_orig_stats' , 'STATS_TABLE');
EXEC DBMS_STATS.EXPORT_SCHEMA_STATS('&esquema_orig_stats', 'STATS_TABLE', NULL, '&esquema_orig_stats');


-- Conexion a DESTINO
conn &conexion_dest
-- Borrado, creación de tabla de estadísticas
exec DBMS_STATS.DROP_STAT_TABLE('&esquema_dest_stats','STATS_TABLE');
EXEC DBMS_STATS.CREATE_STAT_TABLE('&esquema_dest_stats' , 'STATS_TABLE');

-- Copia de estadísticas
@&FECHA\copy_stats.sql

-- Depuramos las estadísticas cargadas
DELETE FROM &esquema_dest_stats..STATS_TABLE WHERE (C1,C4,C5) IN
(SELECT A.C1, A.C4, A.C5
FROM
    &esquema_dest_stats..STATS_TABLE A,
    DBA_TAB_COLUMNS B
WHERE
    A.C1=B.TABLE_NAME(+) AND
    A.C4=B.COLUMN_NAME(+) AND
    A.C5=B.OWNER(+) AND
    B.TABLE_NAME IS NULL);
COMMIT;

exec DBMS_STATS.IMPORT_SCHEMA_STATS('&esquema_dest_stats', 'STATS_TABLE', NULL, '&esquema_dest_stats');


No hay comentarios:

Publicar un comentario