Olá pessoal,
Espero que estejam bem.
Esse post é um post relativamente pequeno e simples, mas extremamente útil.
Estava em um projeto de migração, o ambiente que foi utilizado para a realização de stress test, deploy de códigos, validações funcionais, etc, foi o ambiente de PreProd, que possuía um sizing semelhante ao ambiente final de Produção.
Acontece que como esse era o ambiente “golden” em termos de código e performance, fizemos várias alterações no ambiente, incluindo SQL Patches, SQL Profiles e SQL Baselines, recursos que utilizamos para trazer estabilidade de planos de execução e/ou alterações que julgamos necessárias.
Como garantir que teremos os mesmos planos de execução e comportamento no ambiente Produtivo? Simples, a gente copia esses recursos do ambiente de PreProd para o ambiente Prod.
Essa é uma tarefa relativamente simples.
Etapas em PreProd:
1) Criar uma Staging Table para os SQL Patches;
2) Empacotar os SQL Patches na Staging Table;
3) Criar uma Staging Table para os SQL Profiles;
4) Empacotar os SQL Profiles na Staging Table;
5) Criar uma Staging Table para os SQL Baselines;
6) Empacotar os SQL Baselines na Staging Table;
7) Realizar um DataPump Export das Staging Tables.
Etapas em Prod:
1) Realizar um DataPump Import das Staging Tables;
2) Desempacotar os SQL Patches da Staging Table;
3) Desempacotar os SQL Profiles da Staging Table;
4) Desempacotar os SQL Baselines da Staging Table.
Só isso!
Abaixo estão os passos conforme descritos na ordem acima.
-- PreProd

-- SQL Patches

exec dbms_sqldiag.create_stgtab_sqlpatch('SQLPATCH_STAGE','SYSTEM');

exec dbms_sqldiag.pack_stgtab_sqlpatch(staging_table_name=>'SQLPATCH_STAGE',staging_schema_owner=>'SYSTEM');

-- SQL Profiles

exec dbms_sqltune.create_stgtab_sqlprof('SQLPROFILE_STAGE','SYSTEM');

select 'exec dbms_sqltune.pack_stgtab_sqlprof(staging_table_name=>''SQLPROFILE_STAGE'',staging_schema_owner=>''SYSTEM'',profile_name=>'''||name||''');'

from dba_sql_profiles;

-- Baselines

exec dbms_spm.create_stgtab_baseline('SQLBASELINE_STAGE','SYSTEM');

DECLARE

my_plans number;

BEGIN

my_plans := dbms_spm.pack_stgtab_baseline(

table_owner => 'SYSTEM',

table_name => 'SQLBASELINE_STAGE',

enabled => 'yes',

accepted=> 'yes');

END;

/

-- Export

expdp "'/ as sysdba'" directory=qa_refresh dumpfile=exp_patches_profiles_baselines.dmp logfile=exp_patches_profiles_baselines.log tables=SYSTEM.SQLPATCH_STAGE,SYSTEM.SQLPROFILE_STAGE,SYSTEM.SQLBASELINE_STAGE

-- Prod

-- Import

impdp "'/ as sysdba'" directory=qa_refresh dumpfile=exp_patches_profiles_baselines.dmp logfile=imp_patches_profiles_baselines.log full=yes

-- SQL Patches

exec dbms_sqldiag.unpack_stgtab_sqlpatch(replace=>true,staging_table_name=>'SQLPATCH_STAGE',staging_schema_owner=>'SYSTEM');

-- SQL Profiles

exec dbms_sqltune.unpack_stgtab_sqlprof(replace=>true,staging_table_name=>'SQLPROFILE_STAGE',staging_schema_owner=>'SYSTEM');

-- Baselines

SET SERVEROUTPUT ON

DECLARE

l_plans_unpacked PLS_INTEGER;

BEGIN

l_plans_unpacked := DBMS_SPM.unpack_stgtab_baseline(

table_name => 'SQLBASELINE_STAGE',

table_owner => 'SYSTEM');

DBMS_OUTPUT.put_line('Plans Unpacked: ' || l_plans_unpacked);

END;

/
Espero que seja útil.
Um abraço,

 

Vinicius