sábado, 14 de enero de 2023

Oracle Database: Mantenimiento espacio para el tablespace AUX

 

Aún cuando consideremos triviales y sin importancia, tenemos que continuar brindando mantenimiento a algunas estructuras de la base de datos.

En ambiente de base de datos como servicio en el OCI, he observado que el tablespace SYSAUX aumenta considerablemente de tamaño, provocado en gran medida por las tablas de seguimiento de colas de trabajos (Jobs).

Veamos como podemos recuperar espacio del tablespace SYSAUX, purgando los históricos de los registros de estas tablas.

login as: opc

Authenticating with public key "rsa-key-20200507"

Passphrase for key "rsa-key-20200507":

Last login: Fri Dec 30 15:00:23 2022 from 10.100.128.176

[opc@serverdb_01_uat ~]$ sudo su - oracle

Last login: Fri Dec 30 15:00:26 CST 2022 on pts/2

Primero que todo vamos conectarnos a una base de datos acomplada de mi contenedor. 

SQL> connect / as sysdba

Connected.

SQL> alter session set container=***************;

Utilizando un script casero, valido la ocupación de cada uno de mis tablespaces. 

SQL> @espacio

Tablespace Name             KBytes         Used         Free   Used      Largest

--------------------- ------------ ------------ ------------ ------ ------------

FCUBSLIVE               42,053,616   21,048,944   21,004,672   50.1    4,063,232

FCUBSPILOT              18,874,368       20,224   18,854,144     .1    4,063,232

UNDOTBS1                 5,268,480      846,976    4,421,504   16.1    2,001,920

USERS                    3,408,640      746,944    2,661,696   21.9    1,870,592

SYSAUX                  11,315,200   10,772,416      542,784   95.2      515,072

TBS_AUDIT_FGA_DATA         409,600        5,184      404,416    1.3      101,376

OAS_IAS_UMS                102,400        8,320       94,080    8.1       94,080

OAS_MDS                    102,400        9,216       93,184    9.0       93,184

TBS_DATA_ETL               614,400      547,840       66,560   89.2       66,560

OAS_IAU                     61,440        1,152       60,288    1.9       60,288

OAS_WLS                     61,440        1,280       60,160    2.1       60,160

OAS_BIPLATFORM             196,608      156,864       39,744   79.8       39,744

OAS_STB                     10,240        1,920        8,320   18.8        8,320

OAS_IAS_OPSS                63,488       56,832        6,656   89.5        6,656

SYSTEM                   8,284,160    8,278,400        5,760   99.9        3,072

                      ------------ ------------ ------------

sum                     90,826,480   42,502,512   48,323,968


15 rows selected.

Como observan, el tablespace de SYSAUX, tiene un poco más de 10GB de almacenamiento ocupado.

Voy a utilizar otro script casero, para ver cuál es el top de los objetos en dicho tablespaces. 

SQL> host ls -la *rank*

-rw-r--r--. 1 oracle oinstall 445 Aug 11 15:51 ranking20_tabla.sql

-rw-r--r--. 1 oracle oinstall 447 Aug 11 15:51 ranking_index.sql

-rw-r--r--. 1 oracle oinstall 506 Aug 11 15:51 ranking_index_sys.sql

-rw-r--r--. 1 oracle oinstall 467 Aug 11 15:51 ranking_schema_index.sql

-rw-r--r--. 1 oracle oinstall 498 Aug 11 15:51 ranking_schema.sql

-rw-r--r--. 1 oracle oinstall 446 Aug 11 15:51 ranking_tabla.sql

-rw-r--r--. 1 oracle oinstall 480 Aug 11 15:51 ranking_tablespace.sql

-rw-r--r--. 1 oracle oinstall 295 Aug 11 15:51 tablas_ranking.sql


SQL> @ranking_tablespace.sql

Enter value for tablespace: SYSAUX

old   3: from dba_segments where segment_type='TABLE' and tablespace_name='&TABLESPACE')

new   3: from dba_segments where segment_type='TABLE' and tablespace_name='SYSAUX')


             Ranking Tablas grandes en la base de datos


OWNER       SEGMENT_NAME                         MBYTES    RANKING

----------- ------------------------------- ----------- ----------

SYS         SCHEDULER$_JOB_RUN_DETAILS         2,615.00          1

SYS         SCHEDULER$_EVENT_LOG               1,408.00          2

SYS         SCHEDULER$_JOB_OUTPUT              1,280.00          3

SYS         PLSCOPE_ACTION$                       10.00          4

MDSYS       SDO_CS_SRS                             9.00          5

SYS         WRI$_OPTSTAT_OPR_TASKS                 5.00          6

SYS         AQ$_KUPC$DATAPUMP_QUETAB_1_P           4.00          7

SYS         EXP_HEAD$                              3.00          8

SYS         STATS_TARGET$                          3.00          9

SYS         PLSCOPE_IDENTIFIER$                    2.00         10


Como observan en el reporte, tenemos 3 objetos bastantes grandes para ser unas simples tablas de registro de colas de procesos.

El siguiente es el procedimiento para limpiar los registros de dichas tablas.

SQL> SCHEDULER$_JOB_RUN_DETAILSexec dbms_scheduler.purge_log(0, 'JOB_AND_WINDOW_LOG');^C

SQL> exec dbms_scheduler.purge_log(0, 'JOB_AND_WINDOW_LOG');

PL/SQL procedure successfully completed.

Una vez ejecutado el proceso, no se sientan defraudados si vuelven a consultar las tablas y el espacio aún no ha sido liberado.

SQL> @ranking_tablespace.sql

Enter value for tablespace: SYSAUX

old   3: from dba_segments where segment_type='TABLE' and tablespace_name='&TABLESPACE')

new   3: from dba_segments where segment_type='TABLE' and tablespace_name='SYSAUX')


              Ranking Tablas grandes en la base de datos


OWNER        SEGMENT_NAME                         MBYTES    RANKING

------------ ------------------------------- ----------- ----------

SYS          SCHEDULER$_JOB_RUN_DETAILS         2,615.00          1

SYS          SCHEDULER$_EVENT_LOG               1,408.00          2

SYS          SCHEDULER$_JOB_OUTPUT              1,280.00          3

SYS          PLSCOPE_ACTION$                       10.00          4

MDSYS        SDO_CS_SRS                             9.00          5

SYS          WRI$_OPTSTAT_OPR_TASKS                 5.00          6

SYS          AQ$_KUPC$DATAPUMP_QUETAB_1_P           4.00          7

SYS          EXP_HEAD$                              3.00          8

SYS          STATS_TARGET$                          3.00          9

SYS          PLSCOPE_IDENTIFIER$                    2.00         10


10 rows selected.

Es necesario que ahora hagamos un "TRUNCATE" sobre las siguientes tablas para liberar el espacio.

SQL> truncate table scheduler$_job_output;

Table truncated.

Volvemos a validar el top de uso de espacio en el tablespace y ahora si ya hemos logrado recuperar parte de la ocupación que tenían estos objetos.

SQL> @ranking_tablespace.sql

Enter value for tablespace: SYSAUX

old   3: from dba_segments where segment_type='TABLE' and tablespace_name='&TABLESPACE')

new   3: from dba_segments where segment_type='TABLE' and tablespace_name='SYSAUX')


         Ranking Tablas grandes en la base de datos


OWNER    SEGMENT_NAME                               MBYTES    RANKING

-------- --------------------------------- --------------- ----------

SYS      SCHEDULER$_JOB_RUN_DETAILS               2,615.00          1

SYS      SCHEDULER$_EVENT_LOG                     1,408.00          2

SYS      PLSCOPE_ACTION$                             10.00          3

MDSYS    SDO_CS_SRS                                   9.00          4

SYS      WRI$_OPTSTAT_OPR_TASKS                       5.00          5

SYS      AQ$_KUPC$DATAPUMP_QUETAB_1_P                 4.00          6

SYS      EXP_HEAD$                                    3.00          7

SYS      STATS_TARGET$                                3.00          8

SYS      PLSCOPE_IDENTIFIER$                          2.00          9

SYS      WRI$_OPTSTAT_IND_HISTORY                     2.00         10


Ahora vamos con las siguientes tablas. Hay un objeto de la base de datos, que guarda estadisticas históricas. Si llegaste a esta publicación, quizás ya antes haz visto publicaciones en juniororacledba.wordpress.com y muchos otros más, en donde sus autores, tratan la misma bronca. El espacio de más utilizado en el tablespace SYSAUX y el incremento en el tamaño del Datapump de tu base de datos.

Es posible disminuir el tamaño de información retenida, aplicando el siguiente procedimiento. Primero puedes obtener, la fecha de referencia desde cuando tienens estadísticas acumuladas en la base de datos.

SQL> select dbms_stats.get_stats_history_availability from dual;

GET_STATS_HISTORY_AVAILABILITY

---------------------------------------------------------------------------

29-NOV-22 10.46.00.871479000 AM -06:00

Bien ahora, puedes con el siguiente procedimiento, borrar las estadísticas acumuladas de los días 11 al 30 de antiguedad, con el siguiente bloque anónimo.

SQL> begin

for i in reverse 10..30

loop

dbms_stats.purge_stats(sysdate-i);

end loop;

end;

/

PL/SQL procedure successfully completed.

Verificas nuevamente la fecha de historial y ya puedes darte cuenta que la fecha ha avanzado hasta los últimos 10 días.

SQL> select dbms_stats.get_stats_history_availability from dual;

GET_STATS_HISTORY_AVAILABILITY

---------------------------------------------------------------------------

20-DEC-22 05.25.19.000000000 PM -06:00

Seguimos revisando los objetos con espacio en el tablespace de SYSAUX y ahora toca las tablas de SCHEDULER.

SQL> @ranking_tablespace.sql

Enter value for tablespace: SYSAUX

old   3: from dba_segments where segment_type='TABLE' and tablespace_name='&TABLESPACE')

new   3: from dba_segments where segment_type='TABLE' and tablespace_name='SYSAUX')


Fri Dec 30                                           page    1

       Ranking Tablas grandes en la base de datos


OWNER      SEGMENT_NAME                      MBYTES    RANKING

---------- ---------------------------------------- ----------

SYS        SCHEDULER$_JOB_RUN_DETAILS      2,615.00          1

SYS        SCHEDULER$_EVENT_LOG            1,408.00          2

SYS        PLSCOPE_ACTION$                    10.00          3

MDSYS      SDO_CS_SRS                          9.00          4

SYS        WRI$_OPTSTAT_OPR_TASKS              5.00          5

SYS        AQ$_KUPC$DATAPUMP_QUETAB_1_P        4.00          6

SYS        EXP_HEAD$                           3.00          7

SYS        STATS_TARGET$                       3.00          8

SYS        PLSCOPE_IDENTIFIER$                 2.00          9

SYS        WRI$_OPTSTAT_IND_HISTORY            2.00         10

************************************************************************

10 rows selected.

Para limpiar estas tablas, vamos a ejecutar el siguiente procedimiento y luego procedemos a TRUNCAR las tablas respectivas.

SQL> exec DBMS_SCHEDULER.PURGE_LOG();

PL/SQL procedure successfully completed.

SQL> truncate table sys.scheduler$_job_run_details;

Table truncated.

SQL> truncate table sys.SCHEDULER$_EVENT_LOG;

Table truncated.

Volvemos a validar y ahora sí, hemos recuperado cerca de 10GB de espacio con estos simples pasos.

SQL> @ranking_tablespace.sql

Enter value for tablespace: SYSAUX

old   3: from dba_segments where segment_type='TABLE' and tablespace_name='&TABLESPACE')

new   3: from dba_segments where segment_type='TABLE' and tablespace_name='SYSAUX')


          Ranking Tablas grandes en la base de datos


OWNER      SEGMENT_NAME                           MBYTES    RANKING

---------- ----------------------------------- --------- ----------

SYS        PLSCOPE_ACTION$                         10.00          1

MDSYS      SDO_CS_SRS                               9.00          2

SYS        WRI$_OPTSTAT_OPR_TASKS                   5.00          3

SYS        AQ$_KUPC$DATAPUMP_QUETAB_1_P             4.00          4

SYS        EXP_HEAD$                                3.00          5

SYS        STATS_TARGET$                            3.00          6

SYS        PLSCOPE_IDENTIFIER$                      2.00          7

MDSYS      EXT_TAB_REF_SYS_1                        2.00          8

XDB        XDB$ELEMENT                              2.00          9

SYS        WRI$_OPTSTAT_IND_HISTORY                 2.00         10

10 rows selected.

SQL>

Adjuntos 

ranking_tablespace.sql

col segment_name format a60
col owner format a20
set pagesize 20
col MBytes format 999,999,999.00
Ttitle ' Ranking Tablas grandes en la base de datos'
Btitle "************************************************************************"
set linesize 120
select * from
( select owner, segment_name, bytes/1024/1024 MBytes,row_number() over (order by bytes desc nulls last) ranking
from dba_segments where segment_type='TABLE' and tablespace_name='&TABLESPACE')
 where ranking <= 10

espacio.sql
column dummy noprint
set linesize 200
column pct_used format 999.9 heading "%|Used"
column name format a40 heading "Tablespace Name"
column Kbytes format 999,999,999 heading "KBytes"
column used format 999,999,999 heading "Used"
column free format 999,999,999 heading "Free"
column largest format 999,999,999 heading "Largest"
break on report
compute sum of kbytes on report
compute sum of free on report
compute sum of used on report

select nvl(b.tablespace_name,
nvl(a.tablespace_name,'UNKOWN')) name,
kbytes_alloc kbytes,
kbytes_alloc-nvl(kbytes_free,0) used,
nvl(kbytes_free,0) free,
((kbytes_alloc-nvl(kbytes_free,0))/
kbytes_alloc)*100 pct_used,
nvl(largest,0) largest
from ( select sum(bytes)/1024 Kbytes_free,
max(bytes)/1024 largest,
tablespace_name
from sys.dba_free_space
group by tablespace_name ) a,
( select sum(bytes)/1024 Kbytes_alloc,
tablespace_name
from sys.dba_data_files
group by tablespace_name )b
where a.tablespace_name (+) = b.tablespace_name
order by free desc,a.tablespace_name
/

/

Changes to Databases that use mTLS Authentication (MOS Doc ID 2911553.1)


 Description:

 DigiCert retired the Organizational Unit (OU) field for all public TLS/SSL certificates to comply with industry standards as of August 2022 per their announcement: https://knowledge.digicert.com/alerts/ou-removal.html. This means that the public TLS/SSL certificates issued by DigiCert will not have the OU field anymore.

To avoid any disruptions to existing client connections, Autonomous Database will support doing DN matching based on the host property of your connection string. If you are using mTLS authentication, you must use an Oracle client library version that supports this new approach and download your wallet zip file with the new mTLS connection strings on or after January 10th, 2023 and before March 6th, 2023.

For more information and detailed instructions, see MOS Doc ID 2911553.1: https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=315341958284675&id=2911553.1&_afrWindowMode=0&_adf.ctrl-state=4hfhij8id_4

Affected service: Autonomous Database on Shared Infrastructure

miércoles, 4 de enero de 2023

Training Days 2023 Live-Virtual-Hybrid conference Feb 15-17, 2023

Training Days 2023 is one of the best Oracle Education Events of the Year. The best speakers are always there with timely information to help you in your day-to-day job. I look forward to seeing all of you at Training Days 2023!" ---Rich

Training Days 2023 Live-Virtual-Hybrid conference ((rmoug.org/Training-Days-)

Imagen

All India Oracle Users Group (AIOUG): Webinar LIVE Harnessing The Power Of OCI-Distributed CLOUD



Want to discover how to unlock the benefits of the OCI?Want to know the various options for OCI-distributed cloud? Join the session by Sai Penumuru to know all about OCI. 
 
All India Oracle Users Group (AIOUG)

 

 

Oracle ACE Spotlight: Abi Giles-Haigh

By: Oana-Aurelia (Păduraru) Bonu
Community Manager at Oracle

We're starting the year by launching the Oracle ACE Spotlight blog section - and the first interview features !

Thank you for answering our questions, Abi!
Discover our conversation from the article below ➡

https://lnkd.in/dJaKgRim

No hay descripción alternativa para esta imagen

lunes, 14 de noviembre de 2022

Invitación comunidad de Hackers de Costa Rica: El DEFCON 11506 (DC11506) presenta PWNEDCR0x5


 ¡Hola comunidad!

¡Como todos los años es costumbre en diciembre cerrar el año con el evento de Hacking más grande del país, hecho por hackers para hackers!
Este año tendremos talleres y charlas para nuevos y adentrados, así como una feria de trabajo enfocada 100% en brindar espacios y confianza de empresas que están apostando por el talento nacional en el área de la Ciberseguridad.
El evento será el sábado 3 de diciembre del 2022 en la Sede San Pedro de la Universidad Latina de Costa Rica, de 8:00am a 5pm.
Agradecemos enormemente a patrocinadores (GBM, Equifax, White Jaguars Cyber Security, CYBERSEC Cluster), así como la Universidad Latina de Costa Rica por apoyar estos espacios de aprendizaje gratuito y al Ministerio de Ciencia, Innovación, Tecnología y Telecomunicaciones (Unidad de Cooperación Internacional (MICITT).
¡Cordialmente invitados!
PD: ¿Listos para el mejor CTF del país?

domingo, 13 de noviembre de 2022

Oracle Database Enterprise Edition 19c: Restauración de un PDB a un Restore Point- Ejemplo borrado de esquema-


Es posible que no te guste ver videos y que requieras ver la parte escrita. Aquí te muestro, como hacer una restauración de un PDB, previo a la creación de puntos de restauración.

Primero que todo nos vamos a conectar a nuestro contenedor de base de datos. Para efectos de referencia, estaremos utilizando una versión 19c, con PSU 17

SQL> connect / as sysdba
Connected.

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED

---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDBRMAN                        READ WRITE NO
         4 SECURITY                       READ WRITE NO
         6 RESTORE_POINT                  READ WRITE NO

SQL> exit

Como puedes ver tenemos 3 PDBs creadas en nuestro contenedor. Para este ejemplo, vamos a utlizar la instancia "RESTORE_POINT".

Veamos que tenemos dentro de nuestra PDB.

[oracle@instructor-laboratorio admin]$ sqlplus hr/hr@restore_point


SQL*Plus: Release 19.0.0.0.0 - Production on Sat Nov 5 18:40:43 2022
Version 19.17.0.0.0
Copyright (c) 1982, 2022, Oracle.  All rights reserved.

Connected to:

Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.17.0.0.0

SQL> select * from cat;
TABLE_NAME                               TABLE_TYPE
---------------------------------------- -----------
REGIONS                                  TABLE
COUNTRIES                                TABLE
LOCATIONS                                TABLE
LOCATIONS_SEQ                            SEQUENCE
DEPARTMENTS                              TABLE
DEPARTMENTS_SEQ                          SEQUENCE
JOBS                                     TABLE
EMPLOYEES                                TABLE
EMPLOYEES_SEQ                            SEQUENCE
JOB_HISTORY                              TABLE
EMP_DETAILS_VIEW                         VIEW
11 rows selected.

SQL> select count(*) from cat;
  COUNT(*)
----------
        11
SQL> select count(*) from employees;
  COUNT(*)
----------
       107

Como haz notado tenemos el esquema de ejemplos de HR. Este es el que vamos a tomar como referencia para el ejercicio.

Vamos a conectarnos con privilegios de SYSDBA a la instancia PDB.

SQL> connect sys/oracle@restore_point as sysdba
Connected.

Una vez conectados, vamos a crear nuestro punto de restauración para recuperación.

SQL> create restore point pdb1_restore_point_created guarantee flashback database;

create restore point pdb1_restore_point_created guarantee flashback database

*
ERROR at line 1:
ORA-38784: Cannot create restore point 'PDB1_RESTORE_POINT_CREATED'.
ORA-38785: Media recovery must be enabled for guaranteed restore point.

Como acaba de observar, es necesario para poder crear un punto de restauración, que el contenedor de base de datos este en modo archivelog.

SQL> connect / as sysdba
Connected.
SQL> archive log list;
Database log mode              No Archive Mode
Automatic archival             Disabled
Archive destination            /opt/app/product/19c/dbs/arch
Oldest online log sequence     160
Current log sequence           162
SQL> shutdown immediate
Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup mount
ORACLE instance started.
Total System Global Area 1610609888 bytes
Fixed Size                  9135328 bytes
Variable Size            1056964608 bytes
Database Buffers          536870912 bytes
Redo Buffers                7639040 bytes
Database mounted.

SQL> alter database archivelog;

Database altered.

SQL> alter database open;

Database altered.

SQL>

Listo. Con la base de datos en modo archivelog, vamos a forzar que toda transacción que se haga a nivel de base de datos, quede registrada. 

SQL> ALTER DATABASE FORCE LOGGING;

Database altered.

SQL> select force_logging from v$database;
FORCE_LOGGING
---------------------------------------
YES

Aunque ya tengamos configurada nuestra base de datos para registro forzado de nivel transaccional, es necesario validar como se encuentran los tablespaces previamente creados.
 
SQL> select force_logging from dba_tablespaces;
FOR
---
YES
YES
NO
NO
NO


SQL> select tablespace_name, force_logging from dba_tablespaces;
TABLESPACE_NAME                FOR
------------------------------ ---
SYSTEM                         YES
SYSAUX                         YES
UNDOTBS1                       NO
TEMP                           NO
USERS                          NO

Como logras observar, no todos los tablespaces, están trabajando en modo forzado de registro transaccional. En el caso del tablespace de UNDO, el modo de facto de trabajo es FORCE LOGGING. En el caso de los tablespace temporales, no trabajan con esta característica.

Cambios el modo de trabajo del tablespace USES forzando el registro transaccional para todas las operaciones. 

SQL> alter tablespace users force logging;

Tablespace altered.

SQL>  select tablespace_name, force_logging from dba_tablespaces;
TABLESPACE_NAME                FOR
------------------------------ ---
SYSTEM                         YES
SYSAUX                         YES
UNDOTBS1                       NO
TEMP                           NO
USERS                          YES

Como reiniciamos nuestro contenedor de base de datos y no hemos configurador salvar el estado OPEN de la instancias, vamos a abrir la instancia de RESTORE_POINT.
SQL> show pdbs
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDBRMAN                        MOUNTED
         4 SECURITY                       READ WRITE NO
         6 RESTORE_POINT                  MOUNTED

SQL> alter pluggable database RESTORE_POINT open;

Pluggable database altered.

Con la siguiente instrucción, cada vez que reiniciemos el contenedor, la PDB RESTORE_POINT, pasara siempre a modo OPEN. 

SQL> alter pluggable database RESTORE_POINT save state;

Pluggable database altered.

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDBRMAN                        MOUNTED
         4 SECURITY                       READ WRITE NO
         6 RESTORE_POINT                  READ WRITE NO

Verifiquemos el estado de los tablespace de la PDB. 

SQL> alter session set container=RESTORE_POINT;

Session altered.

SQL> select tablespace_name, force_logging from dba_tablespaces;

TABLESPACE_NAME                FOR
------------------------------ ---
SYSTEM                         YES
SYSAUX                         YES
UNDOTBS1                       NO
TEMP                           NO
USERS                          NO
TBS_DATOS                      NO
TBS_DATOS_NOSEGUROS            NO
TBS_DATOS_SEGUROS              NO

8 rows selected.

Cambiamos el modo a registro transaccional forzado en todos los tablespaces.

SQL> alter tablespace users force logging;

Tablespace altered.

SQL> alter tablespace TBS_DATOS force logging;

Tablespace altered.

SQL> alter tablespace TBS_DATOS_NOSEGUROS  force logging;

Tablespace altered.

SQL> alter tablespace TBS_DATOS_SEGUROS  force logging;

Tablespace altered.

SQL> select tablespace_name, force_logging from dba_tablespaces;

TABLESPACE_NAME                FOR
------------------------------ ---
SYSTEM                         YES
SYSAUX                         YES
UNDOTBS1                       NO
TEMP                           NO
USERS                          YES
TBS_DATOS                      YES
TBS_DATOS_NOSEGUROS            YES
TBS_DATOS_SEGUROS              YES

8 rows selected.

Ahora si, vamos a crear nuestro punto de restauración. 

SQL> SQL> show con_id
CON_ID
------------------------------
6

SQL> create restore point restore_point_pdb_create_RESTORE_POINT_db guarantee flashback database;

create restore point restore_point_pdb_create_RESTORE_POINT_db guarantee flashback database

*
ERROR at line 1:
ORA-38784: Cannot create restore point
'RESTORE_POINT_PDB_CREATE_RESTORE_POINT_DB'.
ORA-38786: Recovery area is not enabled.

Otro pre-requisito que es necesario. El área de recuperación, debe estar habilitada. En este caso, esto se resuelve dando un tamaño al parámetro DB_RECOVERY_FILE_DEST_SIZE.

SQL> connect / as sysdba

Connected.

SQL> show parameter recovery
NAME                                 TYPE        VALUE
------------------------------------ ----------- --------------------
db_recovery_file_dest                string
db_recovery_file_dest_size           big integer 0
recovery_parallelism                 integer     0
remote_recovery_file_dest            string

SQL> alter system set db_recovery_file_dest_size=50G scope=both;

System altered.

SQL> host mkdir -p /opt/app/oracle/recovery_area

SQL> alter system set db_recovery_file_dest='/opt/app/oracle/recovery_area' scope=both;

System altered.

SQL> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     161
Next log sequence to archive   163
Current log sequence           163

SQL> alter system checkpoint;

System altered.

SQL> show pdbs
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDBRMAN                        MOUNTED
         4 SECURITY                       READ WRITE NO
         6 RESTORE_POINT                  READ WRITE NO

Ya tenemos todos los prerequisitos necesarios para crear nuestro punto de restauración.

SQL> alter session set container=RESTORE_POINT;
Session altered.

Como  lo vimos en el video del canal de Youtube, podemos tener dos tipos de restauración: Normales y Garantizados.

En este caso, vamos a crear un punto de restauración garantizado, en el PDB.

SQL> create restore point restore_point_pdb_create_RESTORE_POINT_db guarantee flashback database;

Restore point created.

También podríamos crear un punto de restauración conectados en el CDB para la base de datos acoplada RESTORE_POINT

SQL> connect / as sysdba
Connected.

SQL> create restore point restore_point_cdb_create_RESTORE_POINT_db for pluggable database RESTORE_POINT guarantee flashback database;

Ahora consultamos los dos puntos de restauración creados. 

SQL> @ver_restore_point.sql
NAME                                          TIME                                       SCN PDB GUA     CON_ID NAME_PDB
--------------------------------------------- ----------------------------------- ---------- --- --- ---------- ---------------
RESTORE_POINT_PDB_CREATE_RESTORE_POINT_DB     05-NOV-22 06.52.43.000000000 PM        5218861 YES YES          6 RESTORE_POINT
RESTORE_POINT_CDB_CREATE_RESTORE_POINT_DB     05-NOV-22 06.53.27.000000000 PM        5218891 YES YES          6 RESTORE_POINT

SQL> show con_id

CON_ID
------------------------------
1

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDBRMAN                        MOUNTED
         4 SECURITY                       READ WRITE NO
         6 RESTORE_POINT                  READ WRITE NO

Vamos a generar el error. Vamos a borrar en el PDB el esquema de HR 

SQL> alter session set container=RESTORE_POINT;
Session altered.

SQL> drop user hr cascade;
User dropped.

Al realizar la operación, nos damos cuenta que cometimos un error.
Vamos a realizar la restauración utilizando alguno de los dos puntos creados previamente.

Primero, vamos a conectarnos al contenedor de base de datos y vamos a cerrar el PDB.

SQL> connect / as sysdba
Connected.
SQL> alter pluggable database RESTORE_POINT close;

Pluggable database altered.

SQL> @ver_restore_point.sql

NAME                                          TIME                                       SCN PDB GUA     CON_ID NAME_PDB
--------------------------------------------- ----------------------------------- ---------- --- --- ---------- ---------------
RESTORE_POINT_PDB_CREATE_RESTORE_POINT_DB     05-NOV-22 06.52.43.000000000 PM        5218861 YES YES          6 RESTORE_POINT
RESTORE_POINT_CDB_CREATE_RESTORE_POINT_DB     05-NOV-22 06.53.27.000000000 PM        5218891 YES YES          6 RESTORE_POINT

Vamos a utilizar el punto de restauración creado en el PDB, para hacer un FLASHBACK de la instancia acoplada.

SQL> flashback pluggable database RESTORE_POINT to restore point RESTORE_POINT_PDB_CREATE_RESTORE_POINT_DB;

Flashback complete.

Completado el Flashback, vamos a abrir en modo sólo lectura la PDB para verificar que el punto de restauración es el deseado y que el esquema HR, si se encuentra en el punto de restauración realizado.

SQL> alter pluggable database RESTORE_POINT open read only;

Pluggable database altered.

SQL> connect hr/hr@RESTORE_POINT
Connected.

SQL> select * from cat;
TABLE_NAME                               TABLE_TYPE
---------------------------------------- -----------
REGIONS                                  TABLE
COUNTRIES                                TABLE
LOCATIONS                                TABLE
LOCATIONS_SEQ                            SEQUENCE
DEPARTMENTS                              TABLE
DEPARTMENTS_SEQ                          SEQUENCE
JOBS                                     TABLE
EMPLOYEES                                TABLE
EMPLOYEES_SEQ                            SEQUENCE
JOB_HISTORY                              TABLE
EMP_DETAILS_VIEW                         VIEW
11 rows selected.

SQL> connect / as sysdba
Connected.

Al confirmar que el punto de restauración es el adecuado, cerramos el PDB y lo abrimos en modo de lectura y escritura, haciendo un reinicio de los redologs.

SQL> alter pluggable database RESTORE_POINT close;

Pluggable database altered.

SQL> alter pluggable database RESTORE_POINT open resetlogs;

Pluggable database altered.

Nos conectamos nuevamente a nuestra base de datos y la información esta nuevamente en su lugar.

SQL> connect hr/hr@RESTORE_POINT

Connected.

SQL> select * from cat;
TABLE_NAME                               TABLE_TYPE
---------------------------------------- -----------
REGIONS                                  TABLE
COUNTRIES                                TABLE
LOCATIONS                                TABLE
LOCATIONS_SEQ                            SEQUENCE
DEPARTMENTS                              TABLE
DEPARTMENTS_SEQ                          SEQUENCE
JOBS                                     TABLE
EMPLOYEES                                TABLE
EMPLOYEES_SEQ                            SEQUENCE
JOB_HISTORY                              TABLE
EMP_DETAILS_VIEW                         VIEW
11 rows selected.

SQL> select count(*) from employees;
  COUNT(*)
----------
       107

SQL>

Si ya no necesitamos los puntos de restauración, nos conectamos al CDB y desde ahí vamos a borrar cada uno de los puntos de restauración creados. 

SQL> connect / as sysdba
Connected.

SQL> @ver_restore_point.sql

NAME                                          TIME                                       SCN PDB GUA     CON_ID NAME_PDB
--------------------------------------------- ----------------------------------- ---------- --- --- ---------- ---------------
RESTORE_POINT_PDB_CREATE_RESTORE_POINT_DB     05-NOV-22 06.52.43.000000000 PM        5218861 YES YES          6 RESTORE_POINT
RESTORE_POINT_CDB_CREATE_RESTORE_POINT_DB     05-NOV-22 06.53.27.000000000 PM        5218891 YES YES          6 RESTORE_POINT

SQL> drop restore point "RESTORE_POINT_PDB_CREATE_RESTORE_POINT_DB" for pluggable database RESTORE_POINT;

Restore point dropped.

SQL> drop restore point "RESTORE_POINT_CDB_CREATE_RESTORE_POINT_DB" for pluggable database RESTORE_POINT;

Restore point dropped.

Ahora confirmamos que no existen puntos de restauración disponibles.

SQL> @ver_restore_point.sql
no rows selected

SQL>

Los puntos de restauración van incrementando su tamaño, según la cantidad de horas, días y semanas que permanezcan y el nivel transaccional que experimente los ambientes referenciados.

Tenga cuidado de agotar el espacio del área de recuperación, por excesivo tiempo de retención de los puntos de restauración.

Los puntos de restauración, no son parte de una estrategia de respaldos. Son parte de una estrategia temporal de DR. No debemos confundir, para que fueron creados.
 

sábado, 12 de noviembre de 2022

Oracle Linux Firewall: WARNING: AllowZoneDrifting is enabled.

Algunas versiones  del software de firewalld tenían un comportamiento no documentado conocido como "zona a la deriva". 

Esto permite que los paquetes ingresen en múltiples zonas; lo cuál es una violación de los firewalls basados en zonas. 

Sin embargo, algunos usuarios confían en este comportamiento para tener una zona "catch-al- cajón del sastre", como zona determinada.

Para deshabilitar esto en la configuración de nuestro firewall en Oracle Linux 7.x deberemos hacer lo siguiente:

Primero que todo vamos a logearnos con el usuario root al sistema operativo y vamos a ir al directorio /etc/firewalld

[opc@laboratorio ~]$ sudo -s /bin/bash
[root@laboratorio opc]# cd /etc/firewalld
[root@laboratorio firewalld]# ls -la
total 32
drwxr-x---. 7 root root 4096 May 13 00:37 .
drwxr-xr-x. 95 root root 8192 Jun 10 17:22 ..
-rw-r--r--. 1 root root 5172 May 13 00:37 direct.xml
-rw-r--r--. 1 root root 2706 Apr 27 2021 firewalld.conf
drwxr-x---. 2 root root 6 Apr 27 2021 helpers
drwxr-x---. 2 root root 6 Apr 27 2021 icmptypes
drwxr-x---. 2 root root 6 Apr 27 2021 ipsets
-rw-r--r--. 1 root root 272 Apr 27 2021 lockdown-whitelist.xml
drwxr-x---. 2 root root 6 Apr 27 2021 services
drwxr-x---. 2 root root 46 May 13 00:29 zones
[root@laboratorio firewalld]# cd zones

En dicho directorio podrás ubicar el directorio "ZONES", pero esto no tiene nada que ver con el tema. No te confundas.


[root@laboratorio zones]# ls -la
total 12

drwxr-x---. 2 root root 46 May 13 00:29 .
drwxr-x---. 7 root root 4096 May 13 00:37 ..
-rw-r--r--. 1 root root 387 Jun 10 16:24 public.xml
-rw-r--r--. 1 root root 350 Jun 10 16:23 public.xml.old

[root@laboratorio zones]# more public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas.
You do not trust the other computers on networks to not harm your computer.
Only selected incoming connections are accepted.</de
scription>
<service name="ssh"/>
<service name="dhcpv6-client"/>
<port protocol="tcp" port="22"/>
<port protocol="tcp" port="1521"/>
</zone>

Con el comando SYSTEMCTL podrás validar si la zona "Drifting" esta activada.

[root@laboratorio zones]# systemctl status firewalld
? firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2022-06-10 16:23:33 GMT; 5h 39min ago
Docs: man:firewalld(1)
Main PID: 31241 (firewalld)
Memory: 27.1M
CGroup: /system.slice/firewalld.service
+-31241 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
Jun 10 16:23:33 laboratorio systemd[1]: Starting firewalld - dynamic firewall daemon...
Jun 10 16:23:33 laboratorio systemd[1]: Started firewalld - dynamic firewall daemon.
Jun 10 16:23:33 laboratorio firewalld[31241]: WARNING: AllowZoneDrifting is enabled.
This is considered an insecure configuration option. It will...g it now.
Jun 10 16:24:05 laboratorio firewalld[31241]: WARNING: AllowZoneDrifting is enabled.
This is considered an insecure configuration option. It will...g it now.
Jun 10 16:28:32 laboratorio firewalld[31241]: WARNING: AllowZoneDrifting is enabled.
This is considered an insecure configuration option. It will...g it now.

En el directorio indicado, vamos a editar el archivo FIREWALLD.CONF.

[root@laboratorio firewalld]# ls -la
total 32
drwxr-x---. 7 root root 4096 May 13 00:37 .
drwxr-xr-x. 95 root root 8192 Jun 10 17:22 ..
-rw-r--r--. 1 root root 5172 May 13 00:37 direct.xml
-rw-r--r--. 1 root root 2706 Apr 27 2021 firewalld.conf
drwxr-x---. 2 root root 6 Apr 27 2021 helpers
drwxr-x---. 2 root root 6 Apr 27 2021 icmptypes
drwxr-x---. 2 root root 6 Apr 27 2021 ipsets
-rw-r--r--. 1 root root 272 Apr 27 2021 lockdown-whitelist.xml
drwxr-x---. 2 root root 6 Apr 27 2021 services
drwxr-x---. 2 root root 46 May 13 00:29 zones
[root@laboratorio firewalld]# more firewalld.conf

# firewalld config file
# default zone
# The default zone used if an empty zone string is used.
# Default: public
DefaultZone=public
# Minimal mark
# Marks up to this minimum are free for use for example in the direct
# interface. If more free marks are needed, increase the minimum
...
...

# based zones to other interfaces based zones (including the default zone).
# Possible values; "yes", "no". Defaults to "yes".

Vas a ir hasta el final del archivo y encontrarás el siguiente parámetro de configuración.

Ahí debes cambiar el valor del parámetro a "NO". No lo documentes, ya que eso no resuelve el tema.


AllowZoneDrifting=No

[root@laboratorio firewalld]# ls -la

total 32
drwxr-x---. 7 root root 4096 Jun 10 22:05 .
drwxr-xr-x. 95 root root 8192 Jun 10 17:22 ..
-rw-r--r--. 1 root root 5172 May 13 00:37 direct.xml
-rw-r--r--. 1 root root 2708 Jun 10 22:05 firewalld.conf
drwxr-x---. 2 root root 6 Apr 27 2021 helpers
drwxr-x---. 2 root root 6 Apr 27 2021 icmptypes
drwxr-x---. 2 root root 6 Apr 27 2021 ipsets
-rw-r--r--. 1 root root 272 Apr 27 2021 lockdown-whitelist.xml
drwxr-x---. 2 root root 6 Apr 27 2021 services
drwxr-x---. 2 root root 46 May 13 00:29 zones

[root@laboratorio firewalld]# vi firewalld.conf

Carga nuevamente la configuración del firewalld y reinicia.


[root@laboratorio firewalld]# systemctl reload firewalld
[root@laboratorio firewalld]# systemctl restart firewalld

Ahora puedes validar que la zona ha sido deshabilitada.

[root@laboratorio firewalld]# systemctl -l status firewalld
? firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service;
enabled; vendor preset: enabled)
Active: active (running) since Fri 2022-06-10 22:07:33 GMT; 10s ago
Docs: man:firewalld(1)
Process: 17907 ExecReload=/bin/kill -HUP $MAINPID (code=exited, status=0/SUCCESS)
Main PID: 18042 (firewalld)
Memory: 22.6M
CGroup: /system.slice/firewalld.service
+-18042 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
Jun 10 22:07:33 laboratorio systemd[1]: Starting firewalld - dynamic firewall daemon...
Jun 10 22:07:33 laboratorio systemd[1]: Started firewalld - dynamic firewall daemon.
[root@laboratorio firewalld]#


Todos los Sábados a las 8:00PM