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