Procédure de refresh de la base preproduction

Contexte :

La procédure consiste à la mise en place d’un mécanisme de transfert d’une partie des données de la base de production vers la base de preproduction.

En effet le volume de la base de production avoisine les 10 To, il fallait développer des scripts pour exclure les données non indispensable pour les tests,

l’exclusion se fait en écartant certaines tablespaces  lors de la sauvegarde.

Les critères d’exclusion des tablespaces : seront exclus les tablespaces contenant les tables selon les partitions des années :

xxxxx, ces tables servent le plus souvent à l’archivage et n’auront aucun impact sur les tests et donc elles peuvent être mises de côté lors du rafraîchissement des données.

Étapes à suivre par le service Production Informatique :

–          Lancement de la sauvegarde

–          Restauration

Pré-requis et informations importantes :

Recommandations :

  • L’opération de sauvegarde étant coûteuse en I/O, il est vivement recommandé de planifier cette intervention..
  • Lors d’une période d’activité faible de l’instance (Week-end)
  • La procédure étant très impactante pour l’instance de production, il peut être pertinent d’avoir un DBA pour gérer d’éventuels effets de bord ou complications

Pré-requis :

  • Une sauvegarde de la base qui exclue les tablespaces de production doit être planifiée
  • Il doit y avoir de l’espace sur l’intégration pour accueillir la sauvegarde de la production.
  • Il faut supprimer la base source (preprod ou integration )

Exclusion des tablespaces sur la production

  • Lancer le script suivant :
    • exclude.bat qui fait appel au fichier sql configureexclude.sql
    • set ORACLE_SID=%1
      if « %1″== » » goto :eofsqlplus sys/ as sysdba @C:\scripts\configureexclude.sql
      rman target / @C:\scripts\excludetablespace.log
      rman target / @C:\scripts\showall.rcv
    • {configureexclude.sql :
    • set feedback off;
      set serveroutput on;
      spool C:\scripts\excludetablespace.log
      declare
      cursor c_tablespace is
      select tablespace_name from dba_tablespaces where tablespace_name not in
      (‘TS_a_modifier’,’TS_a_modifie20016′) and tablespace_name like ‘TS_%’;
      begin
      for r_tablespace in c_tablespace loop
      dbms_output.put_line(‘configure exclude for tablespace ‘ || r_tablespace.tablespace_name || ‘;’);
      end loop;
      end;
      /
      spool off;
      exit;}
  • Lancement de la sauvegarde sur la production
    • Lancer le script de sauvegarde en tâche planifiée qui skip les tablespaces  ( environ 10 heures )

    Vérification de la sauvegarde sur la production

    Nous devons nous assurer que la sauvegarde s’est correctement déroulée.

    • Lancer le script suivant :

    set ORACLE_SID=%1
    if « %1″== » » goto :eof

    sqlplus sys/ as sysdba @C:\scripts\checkbackup.sql

  • {checkbackup.sql
  • SET PAGESIZE 50
    COL time_taken_display FORM A10 HEAD « Time|Taken|HH:MM:SS »
    COL rman_end_time FORM A17
    COL i_size_gig FORM 999.99 HEAD « Input|Gig »
    COL o_size_gig FORM 999.99 HEAD « Output|Gig »
    COL compression_ratio FORM 99.99 HEAD « Comp.|Ratio »
    COL status FORM A12
    COL input_type FORM A14

    SELECT
    time_taken_display
    ,TO_CHAR(end_time,’dd-mon-rrrr hh24:mi’) AS rman_end_time
    ,input_bytes/1024/1024/1024 i_size_gig
    ,output_bytes/1024/1024/1024 o_size_gig
    ,compression_ratio
    ,status
    ,input_type
    FROM v$rman_backup_job_details
    ORDER BY end_time;
    exit;}

Remettre la configuration sur la production

  • Lancer le script suivant
  • excludeclear.bat
  • set ORACLE_SID=%1
    if « %1″== » » goto :eofsqlplus sys/ as sysdba @C:\scripts\configureexcludeclear.sql
    rman target / @C:\scripts\excludetablespaceclear.log
    rman target / @C:\scripts\showall.rcv
  • {configureexcludeclear.sql:
  • set feedback off;
    set serveroutput on;
    spool C:\scripts\excludetablespaceclear.log
    declare
    cursor c_tablespace is
    select tablespace_name from dba_tablespaces where tablespace_name not in
    (‘TS_modifier’,’TS_modifier2016′) and tablespace_name like ‘TS_%’;
    begin
    for r_tablespace in c_tablespace loop
    dbms_output.put_line(‘configure exclude for tablespace ‘ || r_tablespace.tablespace_name || ‘ clear ;’);
    end loop;
    end;
    /
    spool off;
    exit;

Restauration de la sauvegarde sur l’intégration ou de preproduction

  • Lancer script de restauration suivant
  • Sql>startup force nomount ;
  • A l’endroit où se situe la sauvegarde full partielle prendre le nom du fichier qui commence par C-
  • Sql>restore controlfile from ‘L:\sauvegarde_partielle\C-nom du fichier trouvé ci dessus’;
  • Sql> alter database mount ;
  • Rman>catalog start with ‘L:\sauvegarde_partielle’;
  • Rman> crosscheck backup ;
  • Rman> delete expired backup ;
  • Rman> reset database to incarnation 1; ( valable pour la pré-production, sur l’intégration action non nécessaire )
  • S’assurer que le parameter db_recovery_file_dest est bien défini
  • Sql> show parameter db_recovery_file_dest;
  • Si pas défini
  • Sql> alter system set db_recovery_file_dest=’+BP’;

 

  • Lancer le block run rman  ( environ 8 heures )

RUN {
debug io;
ALLOCATE CHANNEL CH1 TYPE DISK FORMAT « L:\sauvegarde_partielle\%U »;
ALLOCATE CHANNEL CH2 TYPE DISK FORMAT « L:\sauvegarde_partielle\%U »;
ALLOCATE CHANNEL CH3 TYPE DISK FORMAT « L:\sauvegarde_partielle\%U »;
ALLOCATE CHANNEL CH4 TYPE DISK FORMAT « L:\sauvegarde_partielle\%U »;
ALLOCATE CHANNEL CH5 TYPE DISK FORMAT « L:\sauvegarde_partielle\%U »;
ALLOCATE CHANNEL CH6 TYPE DISK FORMAT « L:\sauvegarde_partielle\%U »;
ALLOCATE CHANNEL CH7 TYPE DISK FORMAT « L:\sauvegarde_partielle\%U »;
ALLOCATE CHANNEL CH8 TYPE DISK FORMAT « L:\sauvegarde_partielle\%U »;
ALLOCATE CHANNEL CH9 TYPE DISK FORMAT « L:\sauvegarde_partielle\%U »;
ALLOCATE CHANNEL CH10 TYPE DISK FORMAT « L:\sauvegarde_partielle\%U »;

    set until time « to_date(‘2016-08-30:00:00:00’, ‘yyyy-mm-dd:hh24:mi:ss’) »;

RESTORE DATABASE SKIP FOREVER TABLESPACE  TS_XXXX2000, TS_XXXX2001,
TS_XXXX2002, TS_XXXX2003, TS_XXXX2004, TS_XXXX2005, TS_XXXX2006,
TS_XXXX2007, TS_XXXX2008, TS_XXXX2009, TS_XXXX2010, TS_XXXX2011,
TS_XXXX2012, TS_XXXX2013, TS_XXXX2014,
TSX_XXXX2000, TSX_XXXX2001, TSX_XXXX2002, TSX_XXXX2003, TSX_XXXX2004,
TSX_XXXX2005, TSX_XXXX2006, TSX_XXXX2007, TSX_XXXX2008, TSX_XXXX2009,
TSX_XXXX2010 , TSX_XXXX2011, TSX_XXXX2012, TSX_XXXX2013, TSX_XXXX2014;
  RECOVER DATABASE SKIP FOREVER TABLESPACE  TS_XXXX2000, TS_XXXX2001,
TS_XXXX2002, TS_XXXX2003, TS_XXXX2004, TS_XXXX2005, TS_XXXX2006,
TS_XXXX2007, TS_XXXX2008, TS_XXXX2009, TS_XXXX2010, TS_XXXX2011,
TS_XXXX2012, TS_XXXX2013, TS_XXXX2014,
TSX_XXXX2000, TSX_XXXX2001, TSX_XXXX2002, TSX_XXXX2003, TSX_XXXX2004,
TSX_XXXX2005, TSX_XXXX2006, TSX_XXXX2007, TSX_XXXX2008, TSX_XXXX2009,
TSX_XXXX2010, TSX_XXXX2011, TSX_XXXX2012, TSX_XXXX2013, TSX_XXXX2014;
RELEASE CHANNEL CH1;
RELEASE CHANNEL CH2;
RELEASE CHANNEL CH3;
RELEASE CHANNEL CH4;
RELEASE CHANNEL CH5;
RELEASE CHANNEL CH6;
RELEASE CHANNEL CH7;
RELEASE CHANNEL CH8;
RELEASE CHANNEL CH9;
RELEASE CHANNEL CH10;
debug off;
}

  • Sql> alter database disable block change tracking;
  • Sql> alter database open resetlogs;
  • Sql> alter user system identified by xxxxxx;
  • Sql> shutdown immediate;
  • Sql> startup mount;
  • Sql> alter database noarchivelog;
  • Sql> alter database open;
  • Sql> archive log list;
  • Show parameter pfile ;
  • Si pfile au lieu de spfile, la ligne est vide, si spfile , la ligne contient le chemin du spfile
  • Drop des partitions sur la preproduction

    • Lancer le script suivant dans un prompt cmd :
    • droppartitions.bat SESAM
    • set ORACLE_SID=%1
      if « %1″== » » goto :eof

    sqlplus sys/ as sysdba @C:\scripts\droppallartitionsnot20152016.sql
    sqlplus sys/ as sysdba @C:\scripts\droppallartitionsnot2015201.log
    notepad C:\scripts\droppallartitionsnot20152016_bis.log

  • {droppallartitionsnot20152016.sql:
    set serveroutput on;
    spool droppallartitionsnot2015201.log
    set verify off;
    set heading off;
    set linesize 600;
    declare
    c_count number;
    i number;
    v_table varchar2(100);
    v_part  varchar2(100);
    vtablespace varchar2(100);
    v_owner varchar2(100);
    cursor c_partition is
    select table_name,partition_name,tablespace_name,table_owner from dba_tab_partitions where  table_owner=v_owner and tablespace_name not in (‘TS_XXXX2016′,’TS_XXXX2015′);
    begin
    v_owner:=’SMFDBA’;
    select count(*) into c_count from dba_tab_partitions where  table_owner=V_OWNER and tablespace_name not in (‘TS_SESA%2016′,’TS_XXXX2015’) and tablespace_name like ‘TS_%’;
    i:=1;
    dbms_output.put_line(‘spool C:\scripts\droppallartitionsnot20152016_bis.log’);
    dbms_output.put_line(‘set serveroutput on;’);
    for r_partition in c_partition
    loop
    v_table:=r_partition.table_name;
    v_part:=r_partition.partition_name;
    vtablespace:=r_partition.tablespace_name;
    dbms_output.put_line(‘alter session set current_schema=’||v_owner||’;’);
    dbms_output.put_line(‘begin dbms_output.put_line(chr(10)); end;’);
    dbms_output.put_line(‘/’);
    dbms_output.put_line(‘begin dbms_output.put_line( »’||’ Drop partition pour le owner : ‘|| v_owner ||  »’); end;’);
    dbms_output.put_line(‘/’);
    dbms_output.put_line(‘begin dbms_output.put_line(chr(10)); end;’);
    dbms_output.put_line(‘/’);
    dbms_output.put_line(‘begin dbms_output.put_line( »’||’ Drop partition pour la table : ‘|| v_table ||  »’); end;’);
    dbms_output.put_line(‘/’);
    dbms_output.put_line(‘begin dbms_output.put_line( »’||’Drop Partition: ‘||v_part||’ Tablespace: ‘||vtablespace|| »’); end;’);
    dbms_output.put_line(‘/’);
    dbms_output.put_line(‘begin dbms_output.put_line(chr(10)); end;’);
    dbms_output.put_line(‘/’);
    dbms_output.put_line(‘ begin dbms_output.put_line( »Drop part numero : ‘|| i || ‘ sur total ‘ || c_count||  »’); end;’);
    dbms_output.put_line(‘/’);
    dbms_output.put_line(‘begin dbms_output.put_line(chr(10)); end;’);
    dbms_output.put_line(‘/’);
    dbms_output.put_line(‘create table test as select * from ‘ ||v_table || ‘ where 1=2;’ );
    dbms_output.put_line(‘ALTER TABLE ‘||v_table ||’ EXCHANGE PARTITION ‘||v_part|| ‘ WITH TABLE   test WITHOUT VALIDATION ;’);
    dbms_output.put_line(‘ALTER TABLE ‘ ||v_table || ‘ drop partition ‘ || v_part || ‘;’);
    dbms_output.put_line(‘drop table test;’);
    i:=i+1;
    end loop;
    dbms_output.put_line(‘exit’);
    dbms_output.put_line(‘spool off’);
    end;
    /
    spool off;
    exit;}
  • Au bout d’un moment ( quelques minutes ), il faudra appuyer sur entrée
  • Le drop partitions dure quelques heures ( peut-être environ 4 heures ? )
  • Tester la connexion applicative

ERREUR POSSIBLE :

ORA-00205: error in identifying control file, check alert log for more info

Cause :

Le fichier  spfile pointe sur l’ancien fichier de contrôle et non celui restauré

 

Action:

– Créer un pfile et modifier l’emplacement en pointant sur le fichier de contrôle restauré précédemment

– Démarrer la base avec le fichier pfile

– Puis créer le spfile

create spfile from pfile =’emplacement du pfile.ora’

 

 

Post Comment

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *