infra: Clonar contraloría

Paso0: Poner el tiquete en antención

  • El primer paso en poner el tiquete en antención para que el usuario sepa que va a iniciar el proceso

Paso1: conectarse al servidor

  • Conectarse al servidor r/Oracle01
ssh sigesadesa.una.ac.cr -l root
  • No conectarnos con el osuario oracle
su – oracle
  • Establecemos la variable de SID de la base de datos
export ORACLE_SID=CCONTRA

Paso2: clonar

Paso3: configurar instancia

  • Conectarse al servidor r/Oracle01
ssh sigesadesa.una.ac.cr -l root
  • No conectarnos con el osuario oracle
su – oracle
  • Establecemos la variable de SID de la base de datos
export ORACLE_SID=CCONTRA
  • Ingresamso a sqlplus
sqlplus / as sysdba
  • Y verificamos que estamos en la bd correcta
show pdbs;
  • Resultado
  • Modificamos la sesión para que estemos en la BD CONTRALORIA
alter session set container=CONTRALORIA;
  • Resultado
  • Y ejecutamos los siguientes alter user que modifican las contraseñas de 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;
  • Esto tambien lo podemos ejecutar en la conexión de SQL Developer
  • Ejecutamos los siguientes updates que modifican datos sensibles
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;
  • Cambiar el dblink de BANNER9 a QA
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;
  • Creamos 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;

  • 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;
  • Liberamos mas espacio de tablas de RHU (estos solo se aplica si no es DESA02 o DESA08)
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;
  • Disminuir los tablespace
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;
/
  • Este script retorna una serie de resultados
  • Por ejemplo
PENDIENTE
  • Lo mas importantes es encontrar esta linea, la que devuelva algo como «undotbs2» ya que la utilizaremos mas adelante
Exitoso:ALTER DATABASE DATAFILE '/u02/app/oracle/oradata/CCONTRA/DBF260BEDF5248BAE0539703000AFE64/datafile/o1_mf_undotbs2_mkfm2987_.dbf' RESIZE 3M

Eliminar UNDOTBS2

  • Las bases de datos de producción utilizan 2 UNDOTBS2
  • Los tablespaces de UNDO son áreas de almacenamiento especiales que contienen información de «deshacer» (undo) utilizada por Oracle para varias funciones esenciales en la gestión de transacciones.
Funciones del tablespace de UNDO:
Restaurar datos anteriores a un cambio: Cuando se realizan transacciones (inserciones, actualizaciones, eliminaciones), Oracle guarda una copia de los datos anteriores en el tablespace de UNDO. Esto permite que, en caso de que una transacción falle o sea revertida con un ROLLBACK, Oracle pueda recuperar el estado original de los datos.

Mantener la consistencia de lectura: El UNDO permite a las consultas leer datos consistentes en el tiempo, sin verse afectadas por los cambios de transacciones que aún no se han confirmado (committed). Oracle utiliza los datos de UNDO para garantizar que las consultas no vean cambios no confirmados.

Recuperación de transacciones fallidas: Si una transacción falla o se cancela, Oracle utiliza los datos almacenados en el UNDO tablespace para deshacer los cambios realizados hasta ese momento, garantizando la integridad de los datos.

Soporte a flashback queries: Algunas características avanzadas de Oracle, como Flashback Query, dependen del UNDO para permitir que los usuarios vean los datos tal como existían en un momento anterior.
  • pero las de desarrollo 1 por esto debemos eliminar uno de estos
  • para esto
  • Verificamos que estamos en contraloria
su - oracle
export ORACLE_SID=CCONTRA
sqlplus / as sysdba
show pdbs;
  • Ejecutamos
  • Esto:
    • Detiene la BD
    • La monta para poder modificar los archivos de configuración y no aceptar configuraciones
    • Habilita los logs
Shut immediate
Startup mount
ALTER DATABASE ARCHIVELOG;
  • Resultado

NOTA: ARCHIVELOG

El comando ALTER DATABASE ARCHIVELOG en Oracle cambia el modo de la base de datos a ARCHIVELOG, lo que habilita la funcionalidad de archivado de los redo logs. Esto es esencial para realizar copias de seguridad en caliente (sin detener la base de datos) y para implementar la recuperación completa de una base de datos en caso de fallo.

Detalles:
Redo Logs: Los redo logs son archivos que registran todos los cambios realizados en los datos de la base de datos. Estos archivos son clave para la recuperación de la base de datos en caso de un fallo.

Modo ARCHIVELOG: Cuando la base de datos está en modo ARCHIVELOG, los redo logs se archivan automáticamente antes de ser sobrescritos. Esto permite una recuperación completa en caso de fallo, ya que todos los cambios están guardados y disponibles para restauración.

Modo NOARCHIVELOG: En este modo, los redo logs se sobrescriben cuando se llenan, y no se guarda una copia de ellos. En este caso, solo se puede recuperar la base de datos hasta el último backup consistente, lo que implica que cualquier cambio desde ese momento hasta un fallo puede perderse.

¿Por qué habilitar ARCHIVELOG?
Recuperación de datos: Al habilitar ARCHIVELOG, puedes recuperar la base de datos hasta el último cambio realizado (incluso si fue después del último backup).
Copias de seguridad en caliente: Puedes realizar copias de seguridad de la base de datos sin necesidad de detener la base de datos, lo que es importante en entornos donde la disponibilidad es crítica.
  • Luego modificamos la sesion
alter session set container=CONTRALORIA;
  • y luego con la información del segundo que habiamos guardado
Exitoso:ALTER DATABASE DATAFILE '/u02/app/oracle/oradata/CCONTRA/DBF260BEDF5248BAE0539703000AFE64/datafile/o1_mf_undotbs2_mkfm2987_.dbf' RESIZE 3M
  • lo que ocupamos es la dirección del archivo
/u02/app/oracle/oradata/CCONTRA/DBF260BEDF5248BAE0539703000AFE64/datafile/o1_mf_undotbs2_mkfm2987_.dbf
  • vamos a modificar esta linea
# Formato
ALTER DATABASE DATAFILE 'ruta_archivo' OFFLINE

# Ejemplo
ALTER DATABASE DATAFILE '/u02/app/oracle/oradata/CCONTRA/DBF260BEDF5248BAE0539703000AFE64/datafile/o1_mf_undotbs2_mkfm2987_.dbf' OFFLINE
  • Resultado
  • Ahora salimos
exit
  • Y volvemos a ingresar
sqlplus / as sysdba
  • Verificamos que estamos en CONTRALORIA
show pdbs;
  • Y mandamos a abrir la base de datos
ALTER DATABASE OPEN;
  • Modificamos la sesión
alter session set container=CONTRALORIA;
  • Y eliminamos el UNDOTBS2
DROP TABLESPACE UNDOTBS2 INCLUDING CONTENTS AND DATAFILES;
  • Salimos
exit
  • Volvemos a ingresar
sqlplus / as sysdba
  • Detenemos
SHUT IMMEDIATE;
  • y la levantamos
STARTUP;

Recrear el UNDO

  • Continuando modificamos la sesión
alter session set container=CONTRALORIA;
  • 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;

Drop tablespace UNDOTBS1 including contents and datafiles; 
  • Salimos
exit
  • Reiniciamos la BD
Shut immediate

Startup

Paso4: Verificar conexión de BD en SQL Developer

  • Ha este punto podemos verificar que la BD esta funcional en SQL Developer
  • Solo ver que conectar

Paso5: Deploy aplicación de producción

  • Ahora para el caso de contraloría como acabamos de clonar la BD de producción
  • Debemos hacer lo mismo de la aplicación ya que pueden tener versiones diferentes
  • El servidor de desa es el siguiente, ha este es el que le vamos a actualizar la aplicación
Nombre: SIGESA-CONTRALORIA
DNS: test-contra.una.ac.cr
IP: 10.0.2.15
  • Para obtener la aplicación lo vamos hacer desde cualquier nodo de producción
  • Por ejemplo
Nombre: SIGESA-PROD01
IP: 10.0.2.153
  • para esto nos conectamos al servidor c/u
ssh 10.0.2.15 -l cgi
  • Ingresamos con el usuario tomcat t/u4t
su - tomcat8
  • esto ingresa al directorio /tomcat8
  • Detenemos el tomcat
./bin/shutdown.sh
  • Removemos los logs
rm -rf logs/* temp/* work/* application*.gz
  • Y ingresamos al directorio webapps para borrar la aplicación
cd /tomcat8/webapps/
  • Si listamos
ls
  • Observamos el directorio y el .war de sigesa-webapp
  • Asi es como se debe llamar para contraloría
  • Por lo tanto lo eliminamos
rm -rf sigesa-webapp*
  • Y obtenemos el .war de SIGESA-PROD01 y lo renombramos
  • pero para hacer esto primero debemos saber el numero de deploy del war en producción
  • para esto podemos ejecutar t/u4t
ssh tomcat8@10.0.2.153 "ls /tomcat8/webapps"
  • Esto nos retorna el listado y el nombre del war que ocupamos
  • Ya con esto modificamos la siguiente instrucción
# Formato
scp tomcat8@10.0.2.153:/tomcat8/webapps/nombre_archivo.war sigesa-webapp.war

# Ejemplo
scp tomcat8@10.0.2.153:/tomcat8/webapps/sigesa-webapp-1.0.0-SNAPSHOT##1874.war sigesa-webapp.war
  • Regresamos de directorio
cd ..
  • Verificamos que el servidor tomcat esta apagado y no existen procesos
./bin/shutdown.sh 
ps -ef |grep tomcat
rm -rf logs/* temp/* work/* application*.gz
  • Iniciamos el servidor
./bin/startup.sh
  • Y verificamos que levanta
tail -f logs/catalina.out
  • Verificamos que la aplicación este levantando

https://test-contra.una.ac.cr/sigesa-webapp/security/login.xhtml

  • Y listo

Paso6: actualizar archivo control de clonaciones

Paso7: cerrar el Tiquete

  • Reponder el tiquete
Clonación éxitosa