infra: clonar sigesa

  • Para realizar el proceso de clonación el coordinador debe solicitarlo y avisarle a los usuarios
  • ingresamos al servidor de bd (ac12)
ssh sigesadesa.una.ac.cr -l root
  • Ingresamos con el usuario oracle
su - oracle
  • Ambientarse en la base quie corresponda
# Desarrollo
export ORACLE_SID=CDESA01
export ORACLE_SID=CDESA02
export ORACLE_SID=CDESA03
export ORACLE_SID=CDESA04
export ORACLE_SID=CDESA05
export ORACLE_SID=CDESA06
export ORACLE_SID=CDESA07
export ORACLE_SID=CDESA08

# contra
export ORACLE_SID=CCONTRA
  • Identificar el respaldo en la ruta: /respaldos/rman/SIGESA, por medio del control FILE, el control file es el archivo que pesa 20 M aprox, generalmente se llama: CNTRL_CUNA01_20221203_c-2894181579-20221203-08.back y se debe elegir el de la misma fecha el respaldo del archivo FULL_CUNA01_…, en este caso el último:
ls -ltrh /respaldos/rman/SIGESA
  • Es el CNTRL que tenga la misma hora que el respaldo FULL
  • Lo compiamos en uin bloquie de notas
CNTRL_CUNA01_20241210_c-2894181579-20241210-03.back
  • Con ese nombre ir a la ruta: /home/oracle/scripts y editar el archivo restore.rman
cd /home/oracle/scripts

nano /home/oracle/scripts/restore.rman
  • Archivo original
startup nomount;
restore controlfile from '/respaldos/rman/SIGESA/CNTRL_CUNA01_20241003_c-2894181579-20241003-05.back';
alter database mount;
CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO COMPRESSED BACKUPSET PARALLELISM 4;
catalog start with '/respaldos/rman/SIGESA/' noprompt;
crosscheck copy;
delete noprompt expired copy;
restore database;
run{
    	set until time "trunc(sysdate)+3/24+12/1440";
        recover database;
}
alter database open resetlogs;
delete noprompt archivelog all;
shutdown immediate;
startup mount;
alter database noarchivelog;
alter database open;
  • Aquí debemos debemos modificar el nombre del archivo a restaurar
  • Ademas debemos modificar el tiempo del respaldo
  • si nos recordamos el respando se dio a las 2:37
  • entonces debemos agregarle 2 minutos a la la hora que se genero el respaldo
  • es decir a las 2:39
  • entonces en el archivo
  • así

borrar base de datos anterior

  • Ahora que ya tenemos listo para poder clonar de producción
  • Debemos eliminar la BD que vamos a clonar
  • Primero nos ambientamos
ssh sigesadesa.una.ac.cr -l root
su - oracle
  • ambientarse
# Desarrollo
export ORACLE_SID=CDESA01
export ORACLE_SID=CDESA02
export ORACLE_SID=CDESA03
export ORACLE_SID=CDESA04
export ORACLE_SID=CDESA05
export ORACLE_SID=CDESA06
export ORACLE_SID=CDESA07
export ORACLE_SID=CDESA08

# contra
export ORACLE_SID=CCONTRA
sqlplus / as sysdba
  • Y comprobamos
show pdbs;
  • Resultado
  • Detenemos la BD
shut immediate
  • Resultado
  • la levantamos restringida
startup restrict mount
  • Resultado
  • Mostramos los parametros
show parameters control_file
  • Resultado
  • Borramos la BD
drop database;
  • Resultado
  • Salimos
exit
  • Eliminar las rutas de la BD
rm -rf /u02/app/oracle/oradata/${ORACLE_SID}/*
rm -rf /u02/app/oracle/fast_recovery_area/${ORACLE_SID}
rm -rf /u01/app/oracle/product/19.0.0.0/dbhome_1/dbs/lk${ORACLE_SID}
rm -rf /u01/app/oracle/product/19.0.0.0/dbhome_1/dbs/hc_${ORACLE_SID}.dat
  • Eliminar de la ruta /respaldos/rman/SIGESA/ donde se guarda el respaldo de sigesa, cualquier archivo que sea anterior al día que se va a realizar la recuperación
find /respaldos/rman/SIGESA/ ! -newermt $(date +%Y%m%d) | xargs  rm -f ;

Lanzar rman

  • Crear la clonación
cd /home/oracle/scripts/
rman target / @restore.rman

    ERROR 01: Tamaño db_recovery

    • Nota si da el siguiente error

    Mismo dia

    • Ejecutar desde la consola si es el mismo dia si no esto no sirve
    sqlplus / as sysdba
    Alter system set db_recovery_file_dest_size=20G scope=memory;
    exit;
    • Y luego esto
    rman target /
    Recover database;

    Otro día

    • Debe borrar la BD
    • Y volver a empezar el instructivo

    Error 02: Incarnation

    • Si da alguno de los siguientes errorres relacionados con el incarnation, significa que SIGESA-PROD y DESA0X tiene incarnations diferentes :
    - ORA-19912: cannot recover to target incarnation 3
    - RMAN-20207: UNTIL TIME or RECOVERY WINDOW is before RESETLOGS time
    • Revisar tanto PROD como DESA0X el CURRENT del Incarnation sea el mismo por medio del RMAN, ejecutar en ambos:
    rman target /
    list incarnation;
    • Comparar ambas salidas y revisar que el CURRENT esté en el mismo número (Columna DB ID):
    • Sino está en el mismo número, ejecutar el siguiente comando con el mismo número del CURRENT de PROD en el servidor de DESA0X:
    reset database to incarnation 2;
    exit
    • Modificar el restore.rman para que inicie en la lista de restore database;
    • abrimos el archivo
    nano /home/oracle/scripts/restore.rman
    • Asi
    #startup nomount;
    #restore controlfile from '/respaldos/rman/SIGESA/CNTRL_CUNA01_20241210_c-2894181579-20241210$
    #alter database mount;
    #CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO COMPRESSED BACKUPSET PARALLELISM 4;
    #catalog start with '/respaldos/rman/SIGESA/' noprompt;
    #crosscheck copy;
    #delete noprompt expired copy;
    restore database;
    run{
        	set until time "trunc(sysdate)+2/24+39/1440";
            recover database;
    }
    alter database open resetlogs;
    delete noprompt archivelog all;
    shutdown immediate;
    startup mount;
    alter database noarchivelog;
    alter database open;
    • Y volvemos a ejecutar el comando
    rman target / @restore.rman

    Paso 2: Configuración Posterior

    • Cuando el proceso de rman termina se debe verificar su estado
    • Nos ambientamos
    ssh sigesadesa.una.ac.cr -l root
    su - oracle
    • ambientarse
    # Desarrollo
    export ORACLE_SID=CDESA01
    export ORACLE_SID=CDESA02
    export ORACLE_SID=CDESA03
    export ORACLE_SID=CDESA04
    export ORACLE_SID=CDESA05
    export ORACLE_SID=CDESA06
    export ORACLE_SID=CDESA07
    export ORACLE_SID=CDESA08
    
    # contra
    export ORACLE_SID=CCONTRA
    • Ingresamos
    sqlplus / as sysdba
    • Ver si la base quedó abierta
    show pdbs;
    • Podemos obversar que la BD se llama SIGESA que es la que clonamos de producción
    • Entonces debemos cambiarle el nombre de la base de datos con los scripts que se encuentran en la ruta /home/oracle/scripts
    cd /home/oracle/scripts
    • Estos son los archivos
    • El contenido es el siguiente
    alter pluggable database SIGESA close immediate instances=all;
    alter pluggable database SIGESA open read write restricted;
    alter session set container=SIGESA;
    alter pluggable database SIGESA rename global_name to DESA01;
    alter session set container=cdb$root;
    alter pluggable database DESA01 close immediate;
    alter pluggable database DESA01 open read write instances=all;
    • entonces dependiendo de la BD clonada seleccionamos el correspondiente
    @DESA01.sql
    @DESA02.sql
    @DESA03.sql
    @DESA04.sql
    @DESA05.sql
    @DESA06.sql
    @DESA07.sql
    @DESA08.sql
    
    @CONTRALORIA.sql
    • Resultado
    • volvemos a ejecutar para comprobar
    show pdbs;
    • Resultado
    • Nos cambiamos al contenedor correspondiente
    ALTER SESSION SET CONTAINER=DESA01;
    ALTER SESSION SET CONTAINER=DESA02;
    ALTER SESSION SET CONTAINER=DESA03;
    ALTER SESSION SET CONTAINER=DESA04;
    ALTER SESSION SET CONTAINER=DESA05;
    ALTER SESSION SET CONTAINER=DESA06;
    ALTER SESSION SET CONTAINER=DESA07;
    ALTER SESSION SET CONTAINER=DESA08;
    
    ALTER SESSION SET CONTAINER=CONTRA;
    • Resultado

    Modificar datos (partametros)

    • NOTA: recuerde darle ENTER hasta llegar al final de las sentencias
    • Ejecutar script de cambio de contraseñas para los usuarios:
    alter user system identified by dba4desa;
    alter user system account unlock;
    alter user sys identified by dba4desa;
    alter user sys account unlock;
    alter user sysman identified by dba4desa;
    alter user sysman account unlock;
    alter user adm identified by sigesa2015;
    alter user adm account unlock;
    alter user www_sigesa identified by sigesa2015;
    alter user www_sigesa account unlock;
    • ejecutar el script de cambios a parámetros y configuraciones generales
    update usuario set clave = '$2a$10$rIhwk3WpjvYoz6dboLa5We33qzrwOcPWn3YnQJDcv.PZePQ3spU7a', correo = 'a@gmail.com';
    update persona_correo set correo_electronico = id_persona_correo || '@gmail.com';
    update parametro set valor='a@gmail.com' where llave='param_rhu_fmo_email_copia_instancias_notificacion_fin_labores';
    Insert into USUARIO_ROL (ID_USUARIO_ROL,USUARIO,ROL,NOTAS,ESTADO,FECHA_CREACION,USUARIO_CREACION,FECHA_MODIFICACION,USUARIO_MODIFICACION,VERSION,CAMPO_CONFIGURABLE,FECHA_DESDE,FECHA_HASTA) values (SQ_USUARIO_ROL.nextval,'1','9747',null,'1',to_date('30/04/15','DD/MM/RR'),'1',to_date('30/04/15','DD/MM/RR'),'1','0',null,to_date('15/06/16','DD/MM/RR'),to_date('31/12/25','DD/MM/RR'));
    update persona_telefono set telefono = id_persona_telefono;
    update parametro set valor = 'sergio.campos.rodriguez@una.cr' where id_parametro in (3603,814,10091,10090,6078,5518,3242,4678,5878);
    update parametro set valor = replace(valor, '/NFS', '') where id_parametro in (1409,942,9200);
    update parametro set valor = 'SIGESA PRUEBAS<sigesa@una.ac.cr>' where id_parametro = 944;
    update parametro set valor = '@una.cr' where llave = 'param_epf_feh_factura_electronica_mail';
    update EME.persona_general_historica set correo_electronico = concat(id_persona_general_historica,'@gmail.com');
    update EME.persona_general_temporal set correo_electronico = concat(id_persona_general_temporal,'@gmail.com');
    update TEUNA.estudiantes_banner set correo = concat(ROWNUM, '@gmail.com');
    update parametro set valor = 'http://documentosdesa.una.ac.cr/alfresco/api/-default-/public/alfresco/versions/1/' where llave = 'param_sdkuna_alfresco_server';
    update parametro set valor = 'http://documentosdesa.una.ac.cr/alfresco/cmisatom' where llave = 'param_sdkuna_alfresco_server_cmisatom';
    UPDATE "SAS"."PARAMETRO" SET VALOR = 'http://documentosdesa.una.ac.cr/alfresco/api/-default-/public/authentication/versions/1' WHERE LLAVE = 'param_sdkuna_alfresco_rest_auth';
    UPDATE "SAS"."PARAMETRO" SET VALOR = 'http://documentosdesa.una.ac.cr/alfresco/api/-default-/public/alfresco/versions/1' WHERE LLAVE = 'param_sdkuna_alfresco_rest_core';
    UPDATE "SAS"."PARAMETRO" SET VALOR = 'http://documentosdesa.una.ac.cr/alfresco/api/-default-/public/search/versions/1' WHERE LLAVE = 'param_sdkuna_alfresco_rest_search';
    UPDATE "SAS"."PARAMETRO" SET VALOR = '4afe563e-3bf4-4b4a-abcc-4c4dee44c731' WHERE LLAVE = 'param_sdkuna_alfresco_rest_root_repository_id';
    UPDATE "SAS"."PARAMETRO" SET VALOR = 'a21b89a8-9a18-4763-9430-e78ff2ace722' WHERE LLAVE = 'param_sdkuna_alfresco_rest_plantillas_folder_id';
    UPDATE "SAS"."PARAMETRO" SET VALOR = '6a2b132c-83cc-4a77-8967-3938df416499' WHERE LLAVE = 'param_sdkuna_alfresco_rest_factura_electronica_folder_id';
    UPDATE "SAS"."PARAMETRO" SET VALOR = '91ec5cd5-b63b-4374-8067-7f75e2e12d4c' WHERE LLAVE = 'param_sdkuna_alfresco_rest_constancias_folder_id';
    UPDATE "SAS"."PARAMETRO" SET VALOR = '91ec5cd5-b63b-4374-8067-7f75e2e12d4c' WHERE LLAVE = 'param_sdkuna_alfresco_rest_constancias_folder_id';
    update parametro set valor = 'TEUNA UNA<sigesapruebas@una.ac.cr>' where id_parametro = 12467;
    commit;
    • Darle ENTER hasta que salga el commit
    • Cambiar el dblink de BANNER9 a TRNG
    DROP PUBLIC DATABASE LINK BANNER9;
    CREATE PUBLIC DATABASE LINK BANNER9
    CONNECT TO baninst1 IDENTIFIED  BY u_pick_it
    USING '(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = bannerdesa.una.ac.cr)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = qa.una.ac.cr)))';
    commit;
    • Hasta que salga el commit
    • Crear los roles de desarrollo:
    CREATE ROLE DESARROLLO NOT IDENTIFIED;
    GRANT CREATE SESSION TO DESARROLLO;
    GRANT ALTER ANY INDEX TO DESARROLLO;
    GRANT ALTER ANY SEQUENCE TO DESARROLLO;
    GRANT ALTER ANY TABLE TO DESARROLLO;
    GRANT ALTER ANY TRIGGER TO DESARROLLO;
    GRANT ALTER SESSION TO DESARROLLO;
    GRANT ALTER USER TO DESARROLLO;
    GRANT AUDIT ANY TO DESARROLLO;
    GRANT COMMENT ANY TABLE TO DESARROLLO;
    GRANT CREATE ANY INDEX TO DESARROLLO;
    GRANT CREATE ANY JOB TO DESARROLLO;
    GRANT CREATE ANY MATERIALIZED VIEW TO DESARROLLO;
    GRANT CREATE ANY SEQUENCE TO DESARROLLO;
    GRANT CREATE ANY SYNONYM TO DESARROLLO;
    GRANT CREATE ANY TABLE TO DESARROLLO;
    GRANT CREATE ANY TRIGGER TO DESARROLLO;
    GRANT CREATE ANY VIEW TO DESARROLLO;
    GRANT CREATE DATABASE LINK TO DESARROLLO;
    GRANT CREATE JOB TO DESARROLLO;
    GRANT CREATE LIBRARY TO DESARROLLO;
    GRANT CREATE MATERIALIZED VIEW TO DESARROLLO;
    GRANT CREATE PROCEDURE TO DESARROLLO;
    GRANT CREATE PUBLIC DATABASE LINK TO DESARROLLO;
    GRANT CREATE PUBLIC SYNONYM TO DESARROLLO;
    GRANT CREATE ROLE TO DESARROLLO;
    GRANT CREATE SEQUENCE TO DESARROLLO;
    GRANT CREATE ANY SYNONYM TO DESARROLLO;
    GRANT CREATE ANY TABLE TO DESARROLLO;
    GRANT CREATE ANY PROCEDURE TO DESARROLLO;
    GRANT CREATE ANY TRIGGER TO DESARROLLO;
    GRANT CREATE ANY VIEW TO DESARROLLO;
    GRANT CREATE DATABASE LINK TO DESARROLLO;
    GRANT CREATE JOB TO DESARROLLO;
    GRANT CREATE LIBRARY TO DESARROLLO;
    GRANT CREATE MATERIALIZED VIEW TO DESARROLLO;
    GRANT DELETE ANY TABLE TO DESARROLLO;
    GRANT DROP ANY TRIGGER TO DESARROLLO;
    GRANT DROP ANY VIEW TO DESARROLLO;
    GRANT DROP PUBLIC DATABASE LINK TO DESARROLLO;
    GRANT DROP PUBLIC SYNONYM TO DESARROLLO;
    GRANT DROP USER TO DESARROLLO;
    GRANT EXECUTE ANY PROCEDURE TO DESARROLLO;
    GRANT EXECUTE ANY PROGRAM TO DESARROLLO;
    GRANT FLASHBACK ANY TABLE TO DESARROLLO;
    GRANT INSERT ANY TABLE TO DESARROLLO;
    GRANT SELECT ANY DICTIONARY TO DESARROLLO;
    GRANT SELECT ANY SEQUENCE TO DESARROLLO;
    GRANT UPDATE ANY TABLE TO DESARROLLO;
    commit;
    • hasta commit
    • truncar las tablas grandes de RHU para liberar espacio
    truncate table rhu.concepto_resultado_recal;
    truncate table rhu.concepto_resultado_val_re;
    truncate table sas.registro_recurso;
    • Deben salir 3 truncate

    NOTA: No ejecutar en DESA02 Y DESA08

    • Elimina las tablas de RHU para liberar espacio sólo  (Son las bases de datos que usa RH)
    truncate table rhu.concepto_resultado_valor; 
    ALTER TABLE RHU.CONCEPTO_RESULTADO_VALOR MODIFY CONSTRAINT FK_CONCEPTO_R_CONCEPTO_RE_4 DISABLE;
    truncate table rhu.concepto_resultado;
    ALTER TABLE RHU.CONCEPTO_RESULTADO_VALOR MODIFY CONSTRAINT FK_CONCEPTO_R_CONCEPTO_RE_4 ENABLE;
    commit;
    • Resultado (hastas commit)

    Continuamos

    • Disminuir los tablaspace ejecutando el siguiente script:
    set serveroutpu on;
    BEGIN
        FOR r IN (select 'ALTER DATABASE DATAFILE '''||file_name||''' RESIZE '||smallest_mb||'M' str
                  from (
                    SELECT file_name,
                           CEIL ((NVL (hwm, 1) * t.block_size) / 1024 / 1024) smallest_mb,
                           CEIL (blocks * t.block_size / 1024 / 1024) current_mb
                      FROM dba_data_files a,
                           dba_tablespaces t,
                           (SELECT   file_id, MAX (block_id + blocks - 1) hwm
                                FROM dba_extents
                            GROUP BY file_id) b
                     WHERE t.tablespace_name = a.tablespace_name
                     AND a.file_id = b.file_id(+)
                )where current_mb-smallest_mb>=10
        ) LOOP
          begin
              EXECUTE IMMEDIATE r.str ;
                dbms_output.put_line('Exitoso:'||r.str);
              EXCEPTION
                  WHEN OTHERS THEN
                     dbms_output.put_line('ERROR RESIZE EJECUTE MANUALMENTE:'||r.str);
          end;
      END LOOP;
    END;
    /
    • Resultado
    • Ahora si vemos los resultados vamos a encontrar que algunos dierón error
    • Para repararlas las copiamos y pegamos en un bloc de notas
    • Eliminando los saltos del linea y en el tamaño poner 330M
    • Así
    • Y los mandamos a ejecutar
    • Ahora debemos del primer registro hacia abajo
    • contar como 10 registros y vamos a encontrar uno que dice algo como «undotbs2»
    • Igual lo vamos a copiar en el bloc de notas por que mas tarde la vamos a utilizar

    ELIMINAR UNDOTBS2

    • Salimos
    exit
    • Ingresamos
    sqlplus / as sysdba
    • Verificamos
    show pdbs;
    • Detenemos
    Shut immediate
    • Montamos
    Startup mount
    • alteramos
    ALTER DATABASE ARCHIVELOG;
    • Ahora como vamos a modificar datos debemos hacer uin alter session
    alter session set container=DESA01;
    alter session set container=DESA02;
    alter session set container=DESA03;
    alter session set container=DESA04;
    alter session set container=DESA05;
    alter session set container=DESA06;
    alter session set container=DESA07;
    alter session set container=DESA08;
    • Y ahora montamos la instrucción alter para ponerlo offline
    • Esto es con la ruta del undotbs2 que tenemos en el bloc de notas
    ALTER DATABASE DATAFILE '/u02/app/oracle/oradata/CDESA01/DBF260BEDF5248BAE0539703000AFE64/datafile/o1_mf_undotbs2_mok2nh25_.dbf' OFFLINE;
    • Resultado
    • salimos
    exit
    • y volvemos a ingresar
    sqlplus / as sysdba
    • Abrimos la base de datos
    ALTER DATABASE OPEN;
    • vamos a modificar datos entonces hacemos aslter session
    alter session set container=DESA01;
    alter session set container=DESA02;
    alter session set container=DESA03;
    alter session set container=DESA04;
    alter session set container=DESA05;
    alter session set container=DESA06;
    alter session set container=DESA07;
    alter session set container=DESA08;
    • ejecutamos
    DROP TABLESPACE UNDOTBS2 INCLUDING CONTENTS AND DATAFILES;
    • Salimos
    exit
    • Volvemos a ingresar
    sqlplus / as sysdba
    • Detenemos
    SHUT IMMEDIATE;
    • Y volvemos a levantar
    STARTUP;
    • Recreamos el undo
    • para esto vanmos a modificar datos por tanto alter
    alter session set container=DESA01;
    alter session set container=DESA02;
    alter session set container=DESA03;
    alter session set container=DESA04;
    alter session set container=DESA05;
    alter session set container=DESA06;
    alter session set container=DESA07;
    alter session set container=DESA08;
    • ejecutamos
    CREATE UNDO TABLESPACE UNDOTBS2 DATAFILE SIZE 64M AUTOEXTEND ON NEXT 32M MAXSIZE UNLIMITED ONLINE RETENTION NOGUARANTEE BLOCKSIZE 8K FLASHBACK ON;
    
    ALTER SYSTEM SET UNDO_TABLESPACE= UNDOTBS2 Scope=both;
    • Este puede que se tenga que ejcutar varias veces
    Drop tablespace UNDOTBS1 including contents and datafiles; 
    • Salimos
    exit
    • Volvemos a ingresar
    sqlplus / as sysdba
    • ahora debemos reiniciar la BD
    • la detenemos
    Shut immediate
    • Y la iniciar
    Startup

    Aplicar solo desa02

    shut immediate
    startup mount
    alter database noarchivelog; 
    alter database open;
    
    // Si fuera necesario revertirlo
    shut immediate
    startup mount
    alter database archivelog; 
    alter database open;

    Probar funcionamiento

    • ingresamos a SQLdeveloper y abrimos conexion la BD y ejecutamos el siguiente select
    select * from persona_correo;