Eliminar un DR del Dataguard

Hoy vamos a ver un a entrada rápida de como eliminamos un DR de una configuración de dataguard.

Tenemos un entorno donde tenemos 2 Physycal standby y queremos eliminar la primera de ellas TEST_STBY1

Comprobemos la configuración de nuestro entorno, nos conectamos a la primaria y ejecutamos:

-bash-4.2$ . oraenv
ORACLE_SID = [oracle] ? TEST
The Oracle base has been set to /opt/app/oracle
-bash-4.2$ export ORACLE_SID=TEST
-bash-4.2$ dgmgrl /

DGMGRL> show configuration verbose;
Configuration - DR_TWO_STANDBY
  Protection Mode: MaxPerformance
  Databases:
    TEST      - Primary database
    TEST_STBY1    - Physical standby database
    TEST_STBY2 - Physical standby database
  Properties:
    FastStartFailoverThreshold      = '30'
    OperationTimeout                = '30'
    FastStartFailoverLagLimit       = '30'
    CommunicationTimeout            = '180'
    FastStartFailoverAutoReinstate  = 'TRUE'
    FastStartFailoverPmyShutdown    = 'TRUE'
    BystandersFollowRoleChange      = 'ALL'
Fast-Start Failover: DISABLED
Configuration Status:
SUCCESS

DGMGRL> show database  'TEST_STBY1';
Database - TEST_STBY1
  Role:            PHYSICAL STANDBY
  Intended State:  APPLY-ON
  Transport Lag:   14 hours 4 minutes 14 seconds
  Apply Lag:       14 hours 4 minutes 14 seconds
  Real Time Query: OFF
  Instance(s):
    TEST
Database Status:
SUCCESS

Tenemos claro que es la que queremos eliminar , de echo, podemos ver como lleva 14 horas. de retraso .
Para eliminarla ejecutaremos el comando Remove Database , si vemos el ejemplo, poderes ver como siempre ponemos el nombre de la base de datos entre comillas simples, en caso de no hacerlo, el dataguard lo tomará como minúsculas


DGMGRL> disable database 'TEST_STBY1';
Disabled.

DGMGRL> remove database 'TEST_STBY1';
Removed database "TEST_STBY1" from the configuration

DGMGRL> show configuration verbose;

Configuration - MyTEST_STBY1
  Protection Mode: MaxPerformance
  Databases:
    TEST      - Primary database
    TEST_STBY2 - Physical standby database
  Properties:
    FastStartFailoverThreshold      = '30'
    OperationTimeout                = '30'
    FastStartFailoverLagLimit       = '30'
    CommunicationTimeout            = '180'
    FastStartFailoverAutoReinstate  = 'TRUE'
    FastStartFailoverPmyShutdown    = 'TRUE'
    BystandersFollowRoleChange      = 'ALL'
Fast-Start Failover: DISABLED
Configuration Status:
SUCCESS

DGMGRL> quit

Ya lo hemos eliminado, pero , deberemos de comprobar en nuestra base de datos primaria que no hemos dejado restos, para ello, buscaremos que los servicios y los destinos de archivado estén limpios de nuestra configuración anterior.

-bash-4.2$ sqlplus "/as sysdba"

SQL> set linesize 800;
SQL> show parameter log_archive_dest_

NAME                                 TYPE        VALUE

log_archive_dest_1                   string      location=USE_DB_RECOVERY_FILE_
                                                 DEST, valid_for=(ALL_LOGFILES,
                                                  ALL_ROLES)
log_archive_dest_2                   string      service="TEST_STBY1", LGWR ASYNC NOAFFIRM
                                             
log_archive_dest_3                   string      service="TEST_STBY2", LGWR ASYNC NOAFFIRM 
												
SQL>   show parameter log_archive_config;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_config                   string      dg_config=(TEST,TEST_STBY1,TEST_STBY2)

Podemos ver como el broker no ha limpiado la configuración, por lo que lo haremos nosotros a mano

SQL> alter system set log_archive_dest_2='' scope=both;
SQL> alter system set log_archive_config='dg_config=(TEST,TEST_STBY2)' scope=both;



SQL> show parameter log_archive_config;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_config                   string      dg_config=(TEST,TEST_STBY)
SQL> show parameter log_archive_dest_

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_1                   string      location=USE_DB_RECOVERY_FILE_
                                                 DEST, valid_for=(ALL_LOGFILES,
                                                  ALL_ROLES)
log_archive_dest_2                   string
log_archive_dest_3                   string      service="TEST_STBY2", LGWR ASYNC NOAFFIRM
SQL>

Con esto, podremos afirmar que nuestra configuración está limpia

Version del parcheado de la base de datos

Hoy vamos a ver otra de estas entradas para dummies utiles en el dia a dia.
Como sabemos en que version de parcheado nos encontramos?

La primera opcion y mas sencilla es la del uso del binario del sistema operativo opatch, pero , como podemos estar seguros de que el parche/psu se ha ejecutado correctamente y se ha aplicado tambien la parte SQL

Oracle 11g

Si estamos en la version 11g deberemos de hacerlo consultando la tabla del diccionario sys.registry$history

SET LINESIZE 180 PAGESIZE 90 
COLUMN FECHA FORMAT A18
COLUMN action FORMAT A20
COLUMN version FORMAT A10
COLUMN comments FORMAT A30
COLUMN bundle_series FORMAT A10
SELECT TO_CHAR(action_time, 'YYYY-MM-DD HH24:MI') AS FECHA,
       action,
       namespace,
       version,
       comments,
       bundle_series
FROM   sys.registry$history
ORDER by action_time;

Lo que nos devolvera algo similar a :

FECHA              ACTION               NAMESPACE            VERSION    COMMENTS                       BUNDLE_SER
------------------ -------------------- -------------------- ---------- ------------------------------ ----------
07-JAN-2017 15:21  APPLY                SERVER               11.2.0.3   PSU 11.2.0.3.15                PSU
01-DEC-2017 18:59  UPGRADE              SERVER               11.2.0.4.0 Upgraded from 11.2.0.3.0
01-DEC-2017 19:00  APPLY                SERVER               11.2.0.4   PSU 11.2.0.4.171017            PSU

Oracle 12c

Cuando estamos en la version 12c, tendremos dos maneras de encontrar esta informacion:

Preguntando a DBA_REGISTRY_SQLPATCH

La consulta sera muy similar a la anterior, pero en ved de preguntar a el dicionario sys.registry$history, lo haremos a la tabla DBA_REGISTRY_SQLPATCH



SET LINESIZE 180 PAGESIZE 90 
COLUMN FECHA FORMAT A20
COLUMN action FORMAT A10
COLUMN status FORMAT A20
COLUMN description FORMAT A90
COLUMN version FORMAT A10
COLUMN bundle_series FORMAT A10
SELECT TO_CHAR(action_time, 'YYYY-MM-DD HH24:MI:SS') AS action_time,
       action,
       status,
       description,
       version,
       patch_id,
       bundle_series
FROM   sys.dba_registry_sqlpatch
ORDER by action_time;

Lo que nos devolvera algo similar a

ACTION_TIME          ACTION     STATUS     DESCRIPTION                              VERSION      PATCH_ID BUNDLE_SER
-------------------- ---------- ---------- ---------------------------------------- ---------- ---------- ----------
07-MAR-2018 21:37:51 APPLY      SUCCESS    Database Patch Set Update : 12.1.0.2.4  12.1.0.2     20831110 PSU
                                         (20831110)

Mediante el package dbms_qopatch

En la version 12c tenemos el nuevo datapatch en los parcheados, la informacion de los parches de la base de datos esta tambien accesible con el package dbms_qopatch.
Esto ya lo vimos en la entrada Obtener los parches instalados en la base de datos CDB que venia a decir :

 
 set serverout on
exec dbms_qopatch.get_sqlpatch_status;

Lo que nos devuelve

Patch Id : 25171037
        Action : APPLY
        Action Time : 14-JUN-2017 23:09:33
        Description : DATABASE PATCH SET UPDATE 12.1.0.2.170418
        Logfile :
/u01/app/oracle/cfgtoollogs/sqlpatch/25171037/21099266/25171037_apply_SID_2017Jun14_23_09_20.log
        Status : SUCCESS
PL/SQL procedure successfully completed.

Sobre el uso de dbms_qopatch tenemos la URL hay una URL Como saber si un parche esta aplicado en la BBDD que tiene consultas muy utiles para obtener informacion de la base de datos (inventario,paches…)

Esta informacion ha sido obtenido en su totalidad de las URLS:

Restaurando archivelogs

Hoy vamos a volver a las entradas para dummies .
En esta entrada vamos a ver en una entrada muy rapida algunas maneras de restaurar archivelogs.

Desde numero de secuencia

La primera y mas comun recuperar un archiver en conreto

RUN
{
SET ARCHIVELOG DESTINATION TO '/sitiotemporal';
restore archivelog  logseq=8619;
}

Podemos hacerlo tambien con un rango con

restore archivelog from sequence 8619 until sequence 8639;

o tambien con

restore archivelog sequence between 8619 and  8639;

De un dia atras

Esta puede ser muy comoda a la hora de incrementales

RUN
{ 
SET ARCHIVELOG DESTINATION TO '/sitiotemporal';
ALLOCATE CHANNEL d1 DEVICE TYPE disk;
 restore ARCHIVELOG FROM TIME 'SYSDATE-1' UNTIL TIME 'SYSDATE';
}

Tambien podriamos indicarlo

restore ARCHIVELOG FROM TIME "to_date('11/04/18 00:00:01','DD/MM/YY HH24:MI:SS')
UNTIL TIME 'SYSDATE';

En RAC

En un rac es igual que en los anteriores, pero deberemos de indicar el numero de thread que nos corresponde

{
SET ARCHIVELOG DESTINATION TO '/sitiotemporal'
restore archivelog from logseq=8619 until logseq=8632 thread=2;
}

Renombrado un ASM diskgroup

Hoy vamos a ver una entrada muy rapida sobre como renombrar un diskgroup exsistente en ASM.

Lo primero que tenemos que tener en cuenta es que , deberemos de parar todas las bases de datos que esten escribiendo sobre ese diskgroup.

Para nuestro caso hemos creado un grupo llamado WRONG_DATA01


test1.pamplona.name:oracle  crsctl stat res -t
--------------------------------------------------------------------------------
Name           Target  State        Server                   State details
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.LISTENER.lsnr
               ONLINE  ONLINE       test1                STABLE
ora.WRONG_DATA01.dg
               OFFLINE OFFLINE      test1                STABLE
ora.test1_FRA_01.dg
               OFFLINE OFFLINE      test1                STABLE
ora.test1_REDO_01.dg
               ONLINE  OFFLINE      test1                STABLE
ora.test1_REDO_02.dg
               OFFLINE OFFLINE      test1                STABLE
ora.asm
               ONLINE  OFFLINE      test1                Instance Shutdown,STARTING
ora.ons
               OFFLINE OFFLINE      test1                STABLE
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.cssd
      1        ONLINE  ONLINE       test1                STABLE
ora.diskmon
      1        OFFLINE OFFLINE                               STABLE
ora.evmd
      1        ONLINE  INTERMEDIATE test1                STABLE
--------------------------------------------------------------------------------

Lo primero y mas logico, es que deberemos de desmontar el dislkgroup a renombrar

test1.pamplona.name:oracle  srvctl stop  diskgroup -diskgroup WRONG_DATA01

test1.pamplona.name:oracle  crsctl stat res -t
--------------------------------------------------------------------------------
Name           Target  State        Server                   State details
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.LISTENER.lsnr
               ONLINE  ONLINE       test1                STABLE
ora.WRONG_DATA01.dg
               OFFLINE OFFLINE      test1                STABLE
ora.test1_FRA_01.dg
               ONLINE  ONLINE       test1                STABLE
ora.test1_REDO_01.dg
               ONLINE  ONLINE       test1                STABLE
ora.test1_REDO_02.dg
               ONLINE  ONLINE       test1                STABLE
ora.asm
               ONLINE  ONLINE       test1                Started,STABLE
ora.ons
               OFFLINE OFFLINE      test1                STABLE
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.cssd
      1        ONLINE  ONLINE       test1                STABLE
ora.diskmon
      1        OFFLINE OFFLINE                               STABLE
ora.evmd
      1        ONLINE  ONLINE       test1                STABLE
--------------------------------------------------------------------------------

Una vez desmontado, procedermos a renombrarlo.
EL renombrado cuenta con dos fases

  • Fase 1 : Esta fase solamente genera el fichero de configuracion
  • Fase 2 Basandose en la fase uno lleva a cabo el cambio .

Veamos a cabo como se lleva a cabo.

Fase 1

A pesar de ser la fase 1 la llamaremos como phase=both y añadiremos el flag check=true , esto nos asegura que no llevara a cabo cambios en las cabeceras de los discos ASM .

renamedg phase=both dgname=WRONG_DATA01 newdgname=test1_DATA_01 asm_diskstring=’/dev/oracleasm/disks/’ check=true verbose=true

test1.pamplona.name:oracle  renamedg phase=both dgname=WRONG_DATA01 newdgname=test1_DATA_01 asm_diskstring='/dev/oracleasm/disks/' check=true verbose=true
Parsing parameters..
Parameters in effect:

         Old DG name       : WRONG_DATA01
         New DG name          : test1_DATA_01
         Phases               :
                 Phase 1
                 Phase 2
         Discovery str        : /dev/oracleasm/disks/
         Check              : TRUE
         Clean              : TRUE
         Raw only           : TRUE
renamedg operation: phase=both dgname=WRONG_DATA01 newdgname=test1_DATA_01 asm_diskstring=/dev/oracleasm/disks/ check=true verbose=true
Executing phase 1
Discovering the group
Performing discovery with string:/dev/oracleasm/disks/
Identified disk UFS:/dev/oracleasm/disks/test1_DATA_01_0001 with disk number:0 and timestamp (33066256 1704307712)
Identified disk UFS:/dev/oracleasm/disks/test1_DATA_01_0002 with disk number:1 and timestamp (33066256 1704307712)
Checking for hearbeat...
Re-discovering the group
Performing discovery with string:/dev/oracleasm/disks/
Identified disk UFS:/dev/oracleasm/disks/test1_DATA_01_0001 with disk number:0 and timestamp (33066256 1704307712)
Identified disk UFS:/dev/oracleasm/disks/test1_DATA_01_0002 with disk number:1 and timestamp (33066256 1704307712)
Checking if the diskgroup is mounted or used by CSS
Checking disk number:0
Checking disk number:1
Generating configuration file..
Completed phase 1
Executing phase 2
Looking for /dev/oracleasm/disks/test1_DATA_01_0001
Leaving the header unchanged
Looking for /dev/oracleasm/disks/test1_DATA_01_0002
Leaving the header unchanged
Completed phase 2
Terminating kgfd context 0x7fb9d6aff0a0

Esta fase nos habra dejado un fichero de configuracion llamado renamedg_config

Fase 2

Este es el comendo que realmente nos llevara a cabo el cambio


renamedg phase=two dgname=WRONG_DATA01 newdgname=test1_DATA_01 asm_diskstring=’/dev/oracleasm/disks/’ verbose=true config=’./renamedg_config’

importanteComo podeis ver es muy sencillo, pero es muy importante tener en cuenta que, este cambio solo se lleva a cabo a nivel de sistema operativo y ASM , no a nivel de ficheros de configuracion o de base de datos, por lo que tendreis que revisar:

  • Ubicacion de pfiles y spfiles
  • Ubicacion de controlfiles dentro de los ficheros de arranque
  • Ubicacion de ficheros de base datos (datafiles,tempfiles, redologs)

Parametro oculto _query_on_physical

Hoy vamos a ver una de estas entradas que contradicen algunas otras que podemos ver en internet.

Dado lo restrictivo de Oracle con el licenciamiento, seria muy interesante contar con una opcion que nos deshabilitara el Real-Time Query del Dataguard .
Si buscamos por internet, nos encontramos con un parametro oculto llamado _query_on_physical

Si Ejecutamos el comando

alter system set "_query_on_physical"=false scope=spfile;

Deshabilitaremos el Active Dataguard, pero … ¿que dice Oracle de todo esto?
Oracle como siempre dice que nunca debemos de activar parametros ocultos en la base de datos a no ser que sea especificamente recomendado por el equipo de soporte

NOTE: Hidden parameter «_query_on_physical» is NOT an option to prevent Active Data Guard usage. It should NOT be used at all in any version of the Oracle Database.
It is unsupported to be set unless Oracle Support advises it for diagnostic reason

Asi que, ya sabeis, la unica opcion que nos da Oracle para no activarlo es «tener cuidado».

Como siempre, mas informacion en soporte:

  • Which are Supported Methods to Prevent Active Data Guard Usage When License is Not Available? (Doc ID 2269239.1)