REFRESCAR PHYSICAL STANDBY A PARTIR DE BACKUP INCREMENTAL FROM SCN – Refresh Standby from backup incremental from SCN

¿Cuantas veces hemos perdido una secuencia de archivelog, o nos damos cuenta que nuestra BD standby esta desincronizada y al ver los archivelogs de la BD primaria con la intención de aplicarlos estos ya fueron borrados por la política de retención?.

El siguiente procedimiento describe el paso a paso para re-sincronizar nuestra base de datos standby, sin necesidad de volver a restaurar toda la BD, basta con aplicar las secuencias faltantes a partir del ultimo SCN disponible en que se haya quedado nuestra BD standby.

using_physical_standby_as_a_testing_and_reporting_database

Este método nos puede ahorrar mucho tiempo en la re-sincronización de nuestro standby, sobretodo en bases de datos de gran tamaño.

PASO A PASO:

1.-IDENTIFICAR EL ACTUAL SCN EN QUE SE QUEDO DESINCRONIZADO NUESTRO STANDBY DATABASE
SQL> select current_scn from v$database;

CURRENT_SCN
———————-
1719913113

2.-EN PRODUCCION GENERAR  BACKUP CONTROLFILE PARA STANDBY:
SQL> alter database create standby controlfile as ‘/tmp/backup/standby_control.ctl’;
Database altered.

 

3.-EN PRODUCCION GENERAR BACKUP INCREMENTAL FROM SCN, TOMANDO COMO INPUT EL SCN DEL PASO PREVIO(PASO 1).
[oracle@PR ~]$ rman target /
RMAN> backup device type disk incremental from scn 1719913113 database format ‘/tmp/backup/Inc_backup_%U’;
Starting backup at 13-MAY-16
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=34 device type=DISK
backup will be obsolete on date 20-MAY-16
archived logs will not be kept or backed up
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00001 name=/u01/app/oracle/oradata/RTS/system01.dbf
input datafile file number=00002 name=/u01/app/oracle/oradata/RTS/sysaux01.dbf
input datafile file number=00003 name=/u01/app/oracle/oradata/RTS/undotbs01.dbf
input datafile file number=00004 name=/u01/app/oracle/oradata/RTS/users01.dbf
channel ORA_DISK_1: starting piece 1 at 13-MAY-16
……..

.

4.-TRANSFERIR LOS BACKUPIECES AL SERVIDOR STANDBY
cd /tmp/backup
-bash-4.2$ ls -ltr
total 3123304
-rw-r—– 1 oracle oinstall 12828672 May 18 12:11 standby_control.ctl
-rw-r—– 1 oracle oinstall 478183424 May 18 12:13 Inc_backup_r8t36sr4_1_1
-rw-r—– 1 oracle oinstall 1019928576 May 18 12:13 Inc_backup_r9t36srj_1_1
-rw-r—– 1 oracle oinstall 515129344 May 18 12:13 Inc_backup_rat36ss2_1_1
-rw-r—– 1 oracle oinstall 899063808 May 18 12:14 Inc_backup_rbt36ssa_1_1
-rw-r—– 1 oracle oinstall 260235264 May 18 12:14 Inc_backup_rct36ssp_1_1
-rw-r—– 1 oracle oinstall 12877824 May 18 12:14 Inc_backup_rdt36st0_1_1

-bash-4.2$ scp * oracle@fcrac05:/home/oracle/reco_sby_scn
oracle@fcrac05’s password:
Inc_backup_r8t36sr4_1_1 100% 456MB 152.0MB/s 00:03
Inc_backup_r9t36srj_1_1 100% 973MB 139.0MB/s 00:07
Inc_backup_rat36ss2_1_1 100% 491MB 98.3MB/s 00:05
Inc_backup_rbt36ssa_1_1 100% 857MB 171.5MB/s 00:05
Inc_backup_rct36ssp_1_1 100% 248MB 248.2MB/s 00:01
Inc_backup_rdt36st0_1_1 100% 12MB 12.3MB/s 00:00
standby_control.ctl 100% 12MB 12.2MB/s 00:01

5.-RESTAURAR INCREMENTAL BACKUP EN EL SERVIDOR STANDBY:

5.1.- Poner la BD en modo nomount

shutdown abort;
startup nomount;

5.2.- Restaurar el standby controlfile

[oracle@DR ~]$ rman target /
connected to target database: IRIS (not mounted)
RMAN> restore controlfile from ‘/home/oracle/reco_sby_scn/standby_control.ctl’;

Starting restore at 18-MAY-18
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=3421 instance=IRIS5 device type=DISK

channel ORA_DISK_1: copied control file copy
output file name=+DG_DATA11G_01/IRISSBY/CONTROLFILE/current.2206.972939175
Finished restore at 18-MAY-18

5.3.- Montar la base de datos
SQL> alter database mount;
Database altered.

5.4.- catalogar los backuppieces
[oracle@DR ~]$ rman target /
RMAN> catalog start with ‘/home/oracle/reco_sby_scn/’;

using target database control file instead of recovery catalog
searching for all files that match the pattern /home/oracle/reco_sby_scn/

List of Files Unknown to the Database
=====================================
File Name: /home/oracle/reco_sby_scn/Inc_backup_r9t36srj_1_1
File Name: /home/oracle/reco_sby_scn/Inc_backup_r8t36sr4_1_1
File Name: /home/oracle/reco_sby_scn/standby_control.ctl
File Name: /home/oracle/reco_sby_scn/Inc_backup_rat36ss2_1_1
File Name: /home/oracle/reco_sby_scn/Inc_backup_rbt36ssa_1_1
File Name: /home/oracle/reco_sby_scn/Inc_backup_rct36ssp_1_1
File Name: /home/oracle/reco_sby_scn/Inc_backup_rdt36st0_1_1

Do you really want to catalog the above files (enter YES or NO)? yes
cataloging files…
cataloging done

List of Cataloged Files
=======================
File Name: /home/oracle/reco_sby_scn/Inc_backup_r9t36srj_1_1
File Name: /home/oracle/reco_sby_scn/Inc_backup_r8t36sr4_1_1
File Name: /home/oracle/reco_sby_scn/standby_control.ctl
File Name: /home/oracle/reco_sby_scn/Inc_backup_rat36ss2_1_1
File Name: /home/oracle/reco_sby_scn/Inc_backup_rbt36ssa_1_1
File Name: /home/oracle/reco_sby_scn/Inc_backup_rct36ssp_1_1
File Name: /home/oracle/reco_sby_scn/Inc_backup_rdt36st0_1_1

5.5.-Recover a partir del backup incremental from SCN.

RMAN> recover database;

Starting recover at 18-MAY-18
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=3901 instance=IRIS5 device type=DISK
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 05/18/2018 12:25:00
RMAN-06094: datafile 1 must be restored <—————ERROR

 

NOTA:Recordar que estamos volviendo a restaurar un nuevo standby controlfile que viene desde el origen donde no necesariamente los datafiles tienen la misma ruta que en el destino.En este caso los datafiles en el origen tienen diferente ruta que en el destino,
por lo tanto el recover fallará debido a que el controlfile no los conoce. Para decirle a controlfile que los reconozca, se tiene que catalogar el diskgroup o la ruta donde estos residen en el standby:
RMAN-06094: datafile 1 must be restored

Catalogamos la ruta de nuestros datafiles:

RMAN> catalog start with ‘+DG_DATA11G_01/IRISSBY/datafile’;

using target database control file instead of recovery catalog
searching for all files that match the pattern +DG_DATA11G_01/IRISSBY/datafile

List of Files Unknown to the Database
=====================================
File Name: +DG_DATA11G_01/IRISSBY/datafile/system.2119.972937765
File Name: +DG_DATA11G_01/IRISSBY/datafile/system.2259.972937789
File Name: +DG_DATA11G_01/IRISSBY/datafile/sysaux.2273.972937819
File Name: +DG_DATA11G_01/IRISSBY/datafile/sysaux.2204.972937847
File Name: +DG_DATA11G_01/IRISSBY/datafile/undotbs1.2270.972937873
File Name: +DG_DATA11G_01/IRISSBY/datafile/users.2205.972937923
File Name: +DG_DATA11G_01/IRISSBY/datafile/iris_data1.2255.972937939
File Name: +DG_DATA11G_01/IRISSBY/datafile/iris_data1.2240.972938015
File Name: +DG_DATA11G_01/IRISSBY/datafile/iris_data1.2239.972938077
File Name: +DG_DATA11G_01/IRISSBY/datafile/iris_data1.2254.972938139
File Name: +DG_DATA11G_01/IRISSBY/datafile/iris_data2.2165.972938205
File Name: +DG_DATA11G_01/IRISSBY/datafile/iris_data2.2114.972938265
File Name: +DG_DATA11G_01/IRISSBY/datafile/iris_data2.2160.972938421
File Name: +DG_DATA11G_01/IRISSBY/datafile/iris_data2.2269.972938503

Do you really want to catalog the above files (enter YES or NO)? yes
cataloging files…
cataloging done

List of Cataloged Files
=======================
File Name: +DG_DATA11G_01/IRISSBY/datafile/system.2119.972937765
File Name: +DG_DATA11G_01/IRISSBY/datafile/system.2259.972937789
File Name: +DG_DATA11G_01/IRISSBY/datafile/sysaux.2273.972937819
File Name: +DG_DATA11G_01/IRISSBY/datafile/sysaux.2204.972937847
File Name: +DG_DATA11G_01/IRISSBY/datafile/undotbs1.2270.972937873
File Name: +DG_DATA11G_01/IRISSBY/datafile/users.2205.972937923
File Name: +DG_DATA11G_01/IRISSBY/datafile/iris_data1.2255.972937939
File Name: +DG_DATA11G_01/IRISSBY/datafile/iris_data1.2240.972938015
File Name: +DG_DATA11G_01/IRISSBY/datafile/iris_data1.2239.972938077
File Name: +DG_DATA11G_01/IRISSBY/datafile/iris_data1.2254.972938139
File Name: +DG_DATA11G_01/IRISSBY/datafile/iris_data2.2165.972938205
File Name: +DG_DATA11G_01/IRISSBY/datafile/iris_data2.2114.972938265
File Name: +DG_DATA11G_01/IRISSBY/datafile/iris_data2.2160.972938421
File Name: +DG_DATA11G_01/IRISSBY/datafile/iris_data2.2269.972938503

 

RMAN> switch database to copy;
datafile 1 switched to datafile copy “+DATA/ANARDBdr/datafile/system.274.903008331”
datafile 2 switched to datafile copy “+DATA/ANARDBdr/datafile/sysaux.272.903008327”
datafile 3 switched to datafile copy “+DATA/ANARDBdr/datafile/undotbs1.276.903008333”
datafile 4 switched to datafile copy “+DATA/ANARDBdr/datafile/users.273.903008327”
datafile 5 switched to datafile copy “+DATA/ANARDBdr/datafile/undotbs2.277.903008333”
datafile 6 switched to datafile copy “+DATA/ANARDBdr/datafile/data.2871.903008317”
datafile 7 switched to datafile copy “+DATA/ANARDBdr/datafile/data.3554.903008317”
datafile 8 switched to datafile copy “+DATA/ANARDBdr/datafile/data.256.903008315”
datafile 9 switched to datafile copy “+DATA/ANARDBdr/datafile/data.3751.903008327”
datafile 10 switched to datafile copy “+DATA/ANARDBdr/datafile/data.257.903008315”
datafile 11 switched to datafile copy “+DATA/ANARDBdr/datafile/indx.2630.903008327”
datafile 12 switched to datafile copy “+DATA/ANARDBdr/datafile/indx.2629.903008327”
datafile 13 switched to datafile copy “+DATA/ANARDBdr/datafile/data.275.903008333”

 

FINALMENTE:

RMAN> recover database;

Starting recover at 18-MAY-18
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=3481 instance=IRIS5 device type=DISK
channel ORA_DISK_1: starting incremental datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
destination for restore of datafile 00005: +DG_DATA11G_01/IRISSBY/datafile/iris_data1.2254.972938139
destination for restore of datafile 00010: +DG_DATA11G_01/IRISSBY/datafile/iris_data1.2255.972937939
channel ORA_DISK_1: reading from backup piece /home/oracle/reco_sby_scn/Inc_backup_r9t36srj_1_1
channel ORA_DISK_1: piece handle=/home/oracle/reco_sby_scn/Inc_backup_r9t36srj_1_1 tag=TAG20180518T121324
…..
..
.
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:35
channel ORA_DISK_1: starting incremental datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
destination for restore of datafile 00009: +DG_DATA11G_01/IRISSBY/datafile/iris_data1.2240.972938015
destination for restore of datafile 00012: +DG_DATA11G_01/IRISSBY/datafile/iris_data2.2114.972938265
channel ORA_DISK_1: reading from backup piece /home/oracle/reco_sby_scn/Inc_backup_rat36ss2_1_1
channel ORA_DISK_1: piece handle=/home/oracle/reco_sby_scn/Inc_backup_rat36ss2_1_1 tag=TAG20180518T121324
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:25

starting media recovery

archived log for thread 1 with sequence 6200 is already on disk as file +DG_DATA11G_01/IRISSBY/ARCHIVELOG/2018_05_18/thread_1_seq_6200.1684.976450999
archived log for thread 1 with sequence 6201 is already on disk as file +DG_DATA11G_01/IRISSBY/ARCHIVELOG/2018_05_18/thread_1_seq_6201.2211.976451359
archived log for thread 1 with sequence 6202 is already on disk as file +DG_DATA11G_01/IRISSBY/ARCHIVELOG/2018_05_18/thread_1_seq_6202.944.976451721
archived log for thread 1 with sequence 6203 is already on disk as file

…..
….
.
archived log file name=+DG_DATA11G_01/IRISSBY/ARCHIVELOG/2018_05_18/thread_1_seq_6205.2169.976452801 thread=1 sequence=6205
media recovery complete, elapsed time: 00:00:02
Finished recover at 18-MAY-18

6.-ACTIVAR EL STANDBY DATABASE

[oracle@fcrac05 reco_sby_scn]$ srvctl stop database -d IRISSBY
[oracle@fcrac05 reco_sby_scn]$ srvctl start database -d IRISSBY -o nomount
[oracle@fcrac05 reco_sby_scn]$ !sqlp
sqlplus ‘/as sysdba’

SQL*Plus: Release 12.1.0.2.0 Production on Fri May 18 13:01:01 2018

Copyright (c) 1982, 2014, Oracle. All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 – 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Advanced Analytics and Real Application Testing options

SQL> alter database mount standby database;
Database altered.

SQL> alter database open read only;
Database altered.

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE PARALLEL 8 USING CURRENT LOGFILE DISCONNECT FROM SESSION;
Database altered.

7.-VALIDAR SINCRONIZACIÓN DE STANDBY
SQL> alter session set nls_date_format=’dd/mm/yyyy hh24:mi:ss’;
SELECT sequence#, first_time, next_time, applied, thread# FROM v$archived_log ORDER BY 1,2;
Session altered.

sincronizacion_standby

Finalmente tenemos nuestro standby database sincronizado nuevamente !!

REAL-TIME SQL MONITORING – PARTE I

Real-time SQL Monitor, es un excelente feature disponible desde Oracle 11.2 en adelante, y permite identificar problemas de performance en tiempo de ejecución, permitiendo facilmente diagnosticar sentencias con alto consumo de recursos, long queries, eventos de espera, y queries con paralelismo.

sqlmonitor2

Este feature es el reemplazo de la  antiguamente muy usada vista v$session_longops, la cual servía para monitorear querys de larga ejecución.

Requisitos para usar SQL Monitor:

  • Requiere licencia Diagnostic+Tuning pack, por lo cual el parámetro control_management_pack_access debe estar seteado a Diag+Tuning pack
  • El parámetro statistics_level debe estar seteado al menos en TYPICAL|ALL

¿Todas las sentencias ejecutadas en la Base de datos son Monitoreadas por SQL Monitor?

Como es obvio, por default, no todas las sentencias ejecutadas en la BD son monitoreadas por SQL Monitor, para que una sentencia sea monitoreada debe cumplirse alguno de los siguientes criterios:

  • Sentencias con paralelismo
  • Queries con tiempo de ejecución mayor a 5 segundos de CPU time
  • Queries con tiempo de ejecución mayor a 5 segundos de espera en I/O
  • Aquellas sentencias que explicitamente han sido seteadas con el hint /*+ MONITOR */

¿De donde podemos generar/consultar SQL Monitor report?
– Enterprise Manager
– EM Database Express
– SQL Developer
– Via command line

Vistas en las que esta basada:

En oracle 11g:  En esta version era posible consultar SQL Monitor a traves de las vistas [G]v$sql_monitor [G]v$sql_plan_monitor
En oracle 12c: A partir de esta versión tambien es posible consultar SQL monitor a través de las vistas [G]v$sql_monitor_sesstat, [G]v$sql_monitor_statname, dba_hist_reports(retención de SQL Monitor persistente en disco) y dba_hist_reports_details.

sql_monitor1

Limitaciones y parámetros ocultos (hidden parameters):

Existen limitantes a tener en cuenta si tenemos una BD con mucha carga de trabajo o complejos planes de ejecución.

  • Por default, Oracle limita el numero de sentencias SQL que seran monitoreadas a 20 x CPU_COUNT. Se puede incrementar el valor limite, seteando el parámetro oculto _sqlmon_max_plan pero se debe ser cuidadoso por que esto podría incrementar la cantidad de memoria total usada por SQL Monitor en el Shared Pool, teniendo como resultado que la información de  SQL Monitor sea obsoleta y fuera de memoria mas rápido.
  • SQL Monitor solo monitoreará aquellas sentencias SQL cuyo plan de ejecución tiene menos de 300 lineas, si queremos que SQL Monitor tome en cuenta nuestros planes de ejecución mayor a 300 lineas, podemos cambiar el parametro oculto _sqlmon_max_planlines y así incrementar este límite.Nuevamente se corre el riesgo que la información de  SQL Monitor sea obsoleta y fuera de memoria mas rápido.
  • Se puede incrementar o reducir el valor del umbral de 5 segundos, para que mas sentencias sean consideradas en el monitoreo de SQL Monitor.Esto puede ser cambiado seteando el parámetro oculto _sqlmon_threshold.

Debido a posibles efectos negativos de estos parámetros ocultos es recomendable setearlos a nivel de sesión hasta estar seguros de su impacto.

 

CREAR PLUGGABLE DATABASE SILENT MODE

Crear un PDB en modo silent, puede ser una alternativa muy útil, sobretodo en circunstancias en las que, por seguridad no te permiten tener el entorno grafico X11 u otro habilitado.

–Seteamos variables de entorno:
[oracle@fcrac05 ~]$ env | grep ORA
ORACLE_SID=CDBMOV1
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_1

–Nos logeamos al Container database y vemos los PDBs disponibles:
[oracle@fcrac05 ~]$ !sqlp
sqlplus ‘/as sysdba’
SQL*Plus: Release 12.2.0.1.0 Production on Tue Apr 24 22:32:41 2018
Copyright (c) 1982, 2016, Oracle. All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 – 64bit Production

SQL> show pdbs

CON_ID CON_NAME  OPEN MODE    RESTRICTED
———– ——————–  ———————– ———-
2              PDB$SEED   READ ONLY       NO
3              SMWDB       READ WRITE     NO
4              ZTELBS        READ WRITE     NO

–Creamos el nuevo Pluggable Database:
[oracle@fcrac05 ~]$ dbca -silent -createPluggableDatabase -sourceDB CDBMOV -pdbName GMCDB -pdbAdminPassword “Claro2018$”
Creating Pluggable Database
2% complete
6% complete
11% complete
20% complete
46% complete
Completing Pluggable Database Creation
53% complete
Executing Post Configuration Actions
100% complete

Look at the log file “/u01/app/oracle/cfgtoollogs/dbca/CDBMOV/GMCDB/CDBMOV.log” for further details.

–Revisamos el log de creación:
[oracle@fcrac05 ~]$ tail -50 /u01/app/oracle/cfgtoollogs/dbca/CDBMOV/GMCDB/CDBMOV.log
[ 2018-04-24 22:39:10.196 PET ] Creating Pluggable Database
DBCA_PROGRESS : 2%
DBCA_PROGRESS : 6%
DBCA_PROGRESS : 11%
DBCA_PROGRESS : 20%
DBCA_PROGRESS : 46%
[ 2018-04-24 22:39:29.839 PET ] Completing Pluggable Database Creation
DBCA_PROGRESS : 53%
[ 2018-04-24 22:39:30.866 PET ] Executing Post Configuration Actions
DBCA_PROGRESS : 100%
[ 2018-04-24 22:39:30.866 PET ] Pluggable database “GMCDB” plugged successfully.

 

–Validamos el acceso al nuevo Pluggable database:
SQL> show pdbs

CON_ID CON_NAME  OPEN MODE RESTRICTED
———– ——————– ——————– —————–
2             PDB$SEED    READ ONLY       NO
3             SMWDB        READ WRITE     NO
4             ZTELBS         READ WRITE     NO
5             GMCDB         READ WRITE     NO

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

SQL> show con_name

CON_NAME
——————————
GMCDB

 

Ya tenemos nuestro nuevo Pluggable Database listo para ser usado!! 🙂

FORMAS DE DROPEAR UNA BASE DE DATOS – DROP DATABASE

A continuación se presentan 3 métodos mas usados para dropear una Base de datos Oracle, a los cuales se les puede sacar provecho en distintos escenarios:

 1.- DROP database  command:

El comando “drop database “, esta disponible desde oracle 10gR1 y puede ser usado desde SQLPLUS y RMAN.De hecho desde RMAN este comando es mas flexible por que tenemos otras opciones disponibles.

El comando DROP DATABASE, elimina los siguientes elementos de una BD:

  • Datafiles
  • Redo Logfiles
  • Controlfiles
  • Spfile

¿Que no elimina el comando DROP DATABASE?

  • init.ora file
  • password files
  • listener.ora
  • la entrada de la BD en el oratab.
sintaxis: 
shutdown abort;
startup mount exclusive restrict;
drop database;

Tener en cuenta que la Base de datos debe ser montada en modo  EXCLUSIVE y RESTRICTED, de lo contrario nos mostrará el siguiente error:

SQL> DROP DATABASE;
DROP DATABASE
*ERROR at line 1:
ORA-12719: operation requires database is in RESTRICTED mode

Caso práctico desde SQL PLUS:
SQL> shut abort
ORACLE instance shut down.

SQL> startup mount exclusive restrict pfile=’/home/oracle/pfile_bdprod.ora’;
ORACLE instance started.

Total System Global Area 7.0551E+10 bytes
Fixed Size 2253536 bytes
Variable Size 6442454304 bytes
Database Buffers 6.3888E+10 bytes
Redo Buffers 218234880 bytes
Database mounted.
SQL> drop database;
Database dropped.

DROP DATABASE desde RMAN: al usar el comando Drop database desde RMAN, tenemos disponible las siguientes variaciones del comando:

1. DROP DATABASE;
2. DROP DATABASE NOPROMPT;
3. DROP DATABASE INCLUDING BACKUPS;
4. DROP DATABASE INCLUDING BACKUPS NOPROMPT;

basicamente la diferencia con respecto al metodo clasico usado desde SQLPlus es que adicional a la Base de datos, tambien podemos borrar: backup sets, proxy copies, image copies, y archivelogs asociados a la BD a borrar.

Caso práctico desde RMAN:

RMAN> CONNECT TARGET SYS@oratest

target database Password: 
connected to target database: ORACLEJP (DBID=1748401226)

RMAN> STARTUP FORCE MOUNT
RMAN> SQL 'ALTER SYSTEM ENABLE RESTRICTED SESSION';

RMAN> DROP DATABASE INCLUDING BACKUPS;
database name is "ORACLEJP" and DBID is 1748401226

Do you really want to drop all backups and the database (enter YES or NO)? yes (BY DEFAULT ITS PROMPT)

allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=127 devtype=DISK

List of Backup Pieces
BP Key  BS Key  Pc# Cp# Status      Device Type Piece Name
------- ------- --- --- ----------- ----------- ----------
18      18      1   1   AVAILABLE   DISK        /RMAN/ORACLE_bkp1
19      19      1   1   AVAILABLE   DISK        /RMAN/ARCH_ORACLE_bkp1
deleted backup piece
backup piece handle=/RMAN/ORACLE_bkp1 recid=18 stamp=711242843
deleted backup piece
backup piece handle=/RMAN/ARCH_ORACLE_bkp1 recid=19 stamp=711243739
Deleted 2 objects

released channel: ORA_DISK_1
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=127 devtype=DISK

List of Control File Copies
Key     S Completion Time Ckp SCN    Ckp Time        Name
------- - --------------- ---------- --------------- ----
2       A 27-DEC-09       2754635    27-DEC-09       D:\ORACLE\PRODUCT\10.2.0\STANDBY\STANDBYCTL01.CTL

List of Archived Log Copies
Key     Thrd Seq     S Low Time  Name
------- ---- ------- - --------- ----
202     1    132     A 16-JAN-10 /ORACLE/PRODUCT/10.2.0/ARCHIVE/ORACLE/ORACLE_ARCH_132_701523840_1
203     1    133     A 16-JAN-10 /ORACLE/PRODUCT/10.2.0/ARCHIVE/ORACLE/ORACLE_ARCH_133_701523840_1
204     1    134     A 16-JAN-10 /ORACLE/PRODUCT/10.2.0/ARCHIVE/ORACLE/ORACLE_ARCH_134_701523840_1
....
..
.
247     1    177     A 04-FEB-10 /ORACLE/PRODUCT/10.2.0/ARCHIVE/ORACLE/ORACLE_ARCH_177_701523840_1
248     1    178     A 04-FEB-10 /ORACLE/PRODUCT/10.2.0/ARCHIVE/ORACLE/ORACLE_ARCH_178_701523840_1
249     1    179     A 04-FEB-10 /ORACLE/PRODUCT/10.2.0/ARCHIVE/ORACLE/ORACLE_ARCH_179_701523840_1

deleted control file copy
control file copy filename=/ORACLE/PRODUCT/10.2.0/STANDBY/STANDBYCTL01.CTL recid=2 stamp=706679151
deleted archive log
archive log filename=/ORACLE/PRODUCT/10.2.0/ARCHIVE/ORACLE/ORACLE_ARCH_132_701523840_1 recid=202 stamp=708474283
deleted archive log
...
..
.
archive log filename=/ORACLE/PRODUCT/10.2.0/ARCHIVE/ORACLE/ORACLE_ARCH_178_701523840_1 recid=248 stamp=710118565
deleted archive log
archive log filename=/ORACLE/PRODUCT/10.2.0/ARCHIVE/ORACLE/ORACLE_ARCH_179_701523840_1 recid=249 stamp=710248827
Deleted 49 objects

database name is "ORACLEJP" and DBID is 1748401226
database dropped

RMAN>

Usando el comando drop database including backups NOPROMPT, RMAN no pedirá confirmación para dropear la Base de datos y sus backups asociados.

2.-DBCA modo silent

sintaxis:
dbca -silent -deleteDatabase -sourceDB <Oracle_Sid>

Caso práctico:
Setear variables de ambiente previamente:

[oracle@limspbdprev02 dbs]$ env | grep ORA
ORACLE_SID=BDPROD
ORACLE_BASE=/oracle
ORACLE_HOME=/oracle/oracle11204/product/11.2.0.4

[oracle@limspbdprev02 dbs]$ dbca -silent -deleteDatabase -sourceDB BDPROD
Connecting to database
4% complete
9% complete
14% complete
19% complete
23% complete
28% complete
47% complete
Updating network configuration files
52% complete
Deleting instance and datafiles
76% complete
100% complete
Look at the log file “/oracle/cfgtoollogs/dbca/BDPROD.log” for further details

–ver log :
[oracle@limspbdprev02 dbs]$ tail -100 /oracle/cfgtoollogs/dbca/BDPROD.log | more
The Database Configuration Assistant will delete the Oracle instance and datafiles for your database. All information in the database will be destroyed. Do you want to proceed?
Connecting to database
DBCA_PROGRESS : 4%
DBCA_PROGRESS : 9%
DBCA_PROGRESS : 14%
DBCA_PROGRESS : 19%
DBCA_PROGRESS : 23%
DBCA_PROGRESS : 28%
DBCA_PROGRESS : 47%
Updating network configuration files
DBCA_PROGRESS : 52%
Deleting instance and datafiles
DBCA_PROGRESS : 76%
DBCA_PROGRESS : 100%
Database deletion completed.

 

3.-DBCA modo gráfico

DBCA ->seleccionar BD -> delete database->next->next->finish

drop database

 

 

 

IMPLEMENTANDO PHYSICAL STANDBY USANDO RMAN DUPLICATE FROM ACTIVE DATABASE

A continuación detallaré el paso a paso para la implementación de un Physical Standby Database, usando RMAN DUPLICATE DATABASE FROM ACTIVE DATABASE. Este proceso  clonará a través de la red, un ambiente productivo y en base a este generará un physical standby, sin necesidad de tener un backup RMAN previamente generado.

En el presente ejemplo, el origen se encuentra en filesystem y el destino será un Physical Standby sobreASM.

Información de la BD Primaria(origen):
Host: SERVER-PROD
DB_NAME = IRIS
DB_UNIQUE_NAME=IRIS

Primary Database
OS versión-> redhat 6.7
Servidor -> SERVER-PROD
Instancia -> IRIS
ORACLE_HOME=/oracle/app/oracle/product/12.1.0/dbhome_1
Version 12.1.0.2.0
Storage system: Filesystem

Información de la BD Standby(destino):
Host: SERVER-CONT
DB_NAME = IRIS
DB_UNIQUE_NAME = IRISSBY

Standby Database
OS versión-> redhat 7.2
Servidor-> server-conting
Instancia->IRISSBY
ORACLE_HOME=/u01/app/oracle/product/12.1.0/dbhome_1
Version 12.1.0.2.0
Storage system : ASM (+DG_DATA12C_02)

PRIMARY: Todos los siguientes pasos se ejecutarán en el entorno primario

1)Verificar la BD se encuentre en modo archivelog
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /archivedata/archivelogs/
Oldest online log sequence 5231
Next log sequence to archive 5234
Current log sequence

2) verificar la BD origen se encuentre en modo force_logging

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

En caso de ser requerido activar de la siguiente manera :

SQL> alter database force logging;
Database altered.

3.-Crear standby redo logfiles

alter database add standby logfile '/oradata1/IRIS/onlinelog/slog1.rdo' size 500M;
alter database add standby logfile '/oradata1/IRIS/onlinelog/slog2.rdo' size 500M;
alter database add standby logfile '/oradata1/IRIS/onlinelog/slog3.rdo' size 500M;
alter database add standby logfile '/oradata1/IRIS/onlinelog/slog4.rdo' size 500M;
alter database add standby logfile '/oradata1/IRIS/onlinelog/slog5.rdo' size 500M;

SQL> select group#,thread#,bytes from v$standby_log;

GROUP# THREAD# BYTES
———- ———- ———-
5 1 524288000
6 1 524288000
7 1 524288000
8 1 524288000
9 1 524288000

SQL> select group#, thread#, bytes/1024/1024 from v$log;

GROUP# THREAD# BYTES/1024/1024
———-      ———-      —————
1                  1                   500
2                  1                  500
3                  1                  500
4                  1                  500

SQL> select group#,thread#,bytes from v$standby_log;

GROUP# THREAD# BYTES
———- ———- ———-
5 1 524288000
6 1 524288000
7 1 524288000
8 1 524288000
9 1 524288000

Quedando de la siguiente manera:

select GROUP#,member from v$logfile
 GROUP#       MEMBER
-------- ------------------------------------------------
 4        /oradata1/IRIS/onlinelog/o1_mf_4_cxjbnd5q_.log
 4        /oradata2/IRIS/onlinelog/o1_mf_4_cxjbndhw_.log
 3        /oradata1/IRIS/onlinelog/o1_mf_3_cxjbnbom_.log
 3        /oradata3/IRIS/onlinelog/o1_mf_3_cxjbncbd_.log
 2        /oradata2/IRIS/onlinelog/o1_mf_2_cxjbn9g5_.log
 2        /oradata3/IRIS/onlinelog/o1_mf_2_cxjbn9r6_.log
 1        /oradata1/IRIS/onlinelog/o1_mf_1_cxjbn7lk_.log
 1        /oradata2/IRIS/onlinelog/o1_mf_1_cxjbn7wl_.log
 5        /oradata1/IRIS/onlinelog/slog1.rdo
 6        /oradata1/IRIS/onlinelog/slog2.rdo
 7        /oradata1/IRIS/onlinelog/slog3.rdo
 8        /oradata1/IRIS/onlinelog/slog4.rdo
 9        /oradata1/IRIS/onlinelog/slog5.rdo

4.-Verificar parametros necesarios para armar el dataguard:

DB_NAME:

SQL> show parameter db_name
 NAME             TYPE               VALUE
 ------------ ----------------- ---------------
 db_name          string              IRIS

DB_UNIQUE_NAME:

SQL> show parameter db_unique_name
  NAME               TYPE         VALUE
 ---------------- ------------- ------------
  db_unique_name     string        IRIS

5.-Configurar ARCHIVE_LOG_CONFIG para enviar redo logs de origen a destino usando DB_UNIQUE_NAME.

Antes:

SQL> show parameter LOG_ARCHIVE_CONFIG

NAME                    TYPE       VALUE
 ------------------- ----------- ------------
 log_archive_config    string

Cambio:

SQL> alter system set log_archive_config='DG_CONFIG=(IRIS,IRISSBY)';
 System altered.

Después:

SQL> show parameter log_archive_config

NAME                   TYPE               VALUE
 ------------------- ------------   -------------------------
 log_archive_config    string        DG_CONFIG=(IRIS,IRISSBY)

6.-Habilitar LOG_ARCHIVE_DEST_1 and LOG_ARCHIVE_DEST_2

Antes:

SQL> show parameter log_archive_dest_1
NAME                           TYPE         VALUE
--------------------------- ----------- -----------------------------------
log_archive_dest_1            string     LOCATION=/archivedata/archivelogs/
log_archive_dest_10 string
log_archive_dest_11 string
log_archive_dest_12 string
log_archive_dest_13 string
log_archive_dest_14 string
log_archive_dest_15 string
log_archive_dest_16 string
log_archive_dest_17 string
log_archive_dest_18 string
log_archive_dest_19 string

Cambio:

SQL> alter system set log_archive_dest_1='LOCATION=/archivedata/archivelogs/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=IRIS';

System altered.

despues:

SQL> show parameter log_archive_dest_1

NAME                    TYPE                VALUE
-------------------- ----------   ----------------------------------------
log_archive_dest_1     string     LOCATION=/archivedata/archive-
                                  logs/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) 
                                  DB_UNIQUE_NAME=IRIS
                                                                          
log_archive_dest_10     string
log_archive_dest_11     string
log_archive_dest_12     string
log_archive_dest_13     string
log_archive_dest_14     string
log_archive_dest_15     string
log_archive_dest_16     string
log_archive_dest_17     string
log_archive_dest_18     string
log_archive_dest_19     string

–Seteamos el transporte de redos en el log_archive_dest_2
Antes:

SQL> show parameter log_archive_dest_2
NAME                          TYPE           VALUE
 ----------------------  -------------- ----------------
 log_archive_dest_2           string
 log_archive_dest_20          string
 log_archive_dest_21          string
 log_archive_dest_22          string
 log_archive_dest_23          string
 log_archive_dest_24          string
 log_archive_dest_25          string
 log_archive_dest_26          string
 log_archive_dest_27          string
 log_archive_dest_28          string
 log_archive_dest_29          string

Cambio:

SQL> alter system set log_archive_dest_2='SERVICE=IRISSBY LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=IRISSBY';
 System altered.

Después:

SQL> show parameter log_archive_dest_2
NAME                   TYPE            VALUE
------------------- --------- ----------------------------------
log_archive_dest_2   string   SERVICE=IRISSBY LGWR ASYNC VALID_FOR                                                  
                              =(ONLINE_LOGFILES,PRIMARY_ROLE) 
                              DB_UNIQUE_NAME=IRISSBY
 log_archive_dest_20 string
 log_archive_dest_21 string

7.-Configurar FAL_SERVER y FAL_CLIENT

FAL_SERVER=Fetch archivelog al destino – Primary
FAL_CLIENT=Cliente que recibe los archivelogs – Standby

FAL_SERVER:

SQL> alter system set fal_server=IRIS;
System altered.
SQL> show parameter fal_server
NAME                TYPE                 VALUE
 -------------- ------------------ ------------------
 fal_server           string             IRIS

FAL_CLIENT:

SQL> alter system set fal_client=IRISSBY;
System altered.
SQL> show parameter fal_client
 NAME                   TYPE             VALUE
 -------------- ----------------  ---------------------
 fal_client           string          IRISSBY

8.-Habilitar replicación de SO.

Para que el standby tambien replique operaciones del SO como adición o borrado de archivos(por ejemplo cuando agregas o borras datafiles en PROD,estas operaciones sean replicadas al standby), el parametro standby_file_management debe ser seteado a AUTO.

alter system set standby_file_management=auto;
SQL> show parameter standby_file_management
NAME                         TYPE             VALUE
 -----------------------  --------------- ------------------
 standby_file_management     string            AUTO

9.-Habilitar el login remoto

alter system set remote_loging_passwordfile=exclusive;
SQL> show parameter password
NAME                            TYPE            VALUE
-------------------------- ---------------- ----------------
remote_login_passwordfile     string            EXCLUSIVE

10.-Configurar conectividad de red:

La Instancia primaria debe estar registrada estaticamente con su propio listener

--Listener.ora
SID_LIST_LISTENER =
 (SID_LIST =
 (SID_DESC =
 (GLOBAL_DBNAME = IRIS)
 (ORACLE_HOME = /oracle/app/oracle/product/12.1.0/dbhome_1)
 (SID_NAME = IRIS)
 )
 )

Registrar en el tnsnames.ora las cadenas de conexion de IRIS y IRISSBY en ambos servidores Primario y Standby.

-bash-4.2$ cat tnsnames.ora
IRIS =
 (DESCRIPTION =
 (ADDRESS = (PROTOCOL = TCP)(HOST = 172.19.44.155)(PORT = 1521))
 (CONNECT_DATA =
 (SERVER = DEDICATED)
 (SERVICE_NAME = IRIS)
 )
 )

IRISSBY =
 (DESCRIPTION =
 (ADDRESS = (PROTOCOL = TCP)(HOST = fcrac06)(PORT = 1521))
 (CONNECT_DATA =
 (SERVER = DEDICATED)
 (SERVICE_NAME = IRISSBY)
 ) (UR=A)
 )

STANDBY: Todos los siguientes pasos se ejecutarán en el entorno standby.

11.-Configuraciones de red en standby

Registrar en el tnsnames.ora las cadenas de conexion de IRIS y IRISSBY en servidor standby.

IRIS =
 (DESCRIPTION =
 (ADDRESS = (PROTOCOL = TCP)(HOST = 172.19.44.155)(PORT = 1521))
 (CONNECT_DATA =
 (SERVER = DEDICATED)
 (SERVICE_NAME = IRIS)
 )
 )

IRISSBY =
 (DESCRIPTION =
 (ADDRESS = (PROTOCOL = TCP)(HOST = fcrac06)(PORT = 1521))
 (CONNECT_DATA =
 (SERVER = DEDICATED)
 (SERVICE_NAME = IRISSBY)
 ) (UR=A)
 )

–Registrar la BD standby staticamente en el listener del servidor standby
[grid@fcrac06 admin]$ cat listener.ora
LISTENER_EXT=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_EXT)))) # line added by Agent
MGMTLSNR=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=MGMTLSNR)))) # line added by Agent
ASMNET1LSNR_ASM=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=ASMNET1LSNR_ASM)))) # line added by Agent
LISTENER_SCAN1=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN1)))) # line added by Agent
LISTENER=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))) # line added by Agent

SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME=IRISSBY)
(SID_NAME=IRISSBY)
(ORACLE_HOME=/u01/app/oracle/product/12.1.0/dbhome_1)
)
)

ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER=ON # line added by Agent
VALID_NODE_CHECKING_REGISTRATION_LISTENER=SUBNET # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN1=ON # line added by Agent
VALID_NODE_CHECKING_REGISTRATION_LISTENER_SCAN1=OFF # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_ASMNET1LSNR_ASM=ON # line added by Agent
VALID_NODE_CHECKING_REGISTRATION_ASMNET1LSNR_ASM=SUBNET # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_MGMTLSNR=ON # line added by Agent
VALID_NODE_CHECKING_REGISTRATION_MGMTLSNR=SUBNET # line added by Agent
REGISTRATION_INVITED_NODES_LISTENER_SCAN1=() # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_EXT=ON # line added by Agent
VALID_NODE_CHECKING_REGISTRATION_LISTENER_EXT=SUBNET # line added by Agent

validar:

 [oracle@fcrac06 admin]$ lsnrctl status | grep IRIS
 Service "IRISSBY" has 1 instance(s).
 Instance "IRISSBY", status UNKNOWN, has 1 handler(s) for this service...

12.-Crear las rutas a nivel de SO que alojaran los archivos de BD.
/u01/app/oracle/admin/IRISSBY/

[oracle@ocm2 ~]$ mkdir oradata
[oracle@ocm2 ~]$ mkdir oradata/pritst
[oracle@ocm2 ~]$ mkdir oradata/pritst/arch
[oracle@ocm2 ~]$ mkdir /u01/app/oracle/admin
[oracle@ocm2 ~]$ mkdir /u01/app/oracle/admin/IRISSBY/
[oracle@ocm2 ~]$ mkdir /u01/app/oracle/admin/IRISSBY/adump
[oracle@ocm2 ~]$ mkdir /u01/app/oracle/admin/IRISSBY/bdump
[oracle@ocm2 ~]$ mkdir /u01/app/oracle/admin/IRISSBY/dpdump
[oracle@ocm2 ~]$ mkdir /u01/app/oracle/admin/IRISSBY/pfile

13.- Registrar en el oratab del servidor standby

 vi /etc/oratab
 IRIS:/u01/app/oracle/product/12.1.0/dbhome_1:N # line added by jeanpierre to standbyduplicate

[oracle@fcrac06 admin]$ cat /etc/oratab | grep IRIS
IRIS:/u01/app/oracle/product/12.1.0/dbhome_1:N # line added by jeanpierre to standbyduplicate
[oracle@fcrac06 admin]$

14.-Crear pfile basico en $ORACLE_HOME/dbs del standby

[oracle@fcrac06 dbs]$ cat initIRISSBY.ora
DB_NAME=IRIS
DB_UNIQUE_NAME=IRISSBY
[oracle@fcrac06 dbs]$

15.-copiar el passwordfile de origen a standby
scp oracle@ocm1:$ORACLE_HOME/dbs/orapwIRIS $ORACLE_HOME/dbs

[oracle@fcrac06 dbs]$ ls -ltr
total 10220
-rw-r–r– 1 oracle oinstall 2992 Jun 26 2017 init.ora
-rw-r—– 1 oracle oinstall 7680 Apr 8 01:47 orapwIRIS —
-rw-r—– 1 oracle oinstall 7680 Apr 8 08:40 orapwIRISSBY
-rw-r—– 1 oracle asmadmin 10403840 Apr 8 10:38 cntrlIRISSBY.dbf
-rw-rw—- 1 oracle asmadmin 1544 Apr 8 10:46 hc_IRISSBY.dat
-rw-r–r– 1 oracle oinstall 1238 Apr 8 10:53 initIRIS.ora.old
-rw-r–r– 1 oracle oinstall 36 Apr 8 13:16 initIRISSBY.ora

16.-Usando el pfile simple subir el standby hasta nomount.

[oracle@fcrac06 dbs]$ sqlplus / as sysdba
SQL*Plus: Release 12.1.0.2.0 Production on Sun Apr 8 13:32:20 2018
Copyright (c) 1982, 2014, Oracle. All rights reserved.
Connected to an idle instance.

SQL> !pwd
/u01/app/oracle/product/12.1.0/dbhome_1/dbs

SQL> startup nomount pfile='/u01/app/oracle/product/12.1.0/dbhome_1/dbs/initIRISSBY.ora';
 ORACLE instance started.

Total System Global Area 2466250752 bytes
 Fixed Size 2927240 bytes
 Variable Size 2097153400 bytes
 Database Buffers 318767104 bytes
 Redo Buffers 47403008 bytes

17.-Preparar script para duplicate
[oracle@fcrac06 ~]$ cat dupstby.cmd

 run {
 allocate channel c1 type disk;
 allocate channel c2 type disk;
 allocate auxiliary channel aux1 type disk;
 allocate auxiliary channel aux2 type disk;
 duplicate target database
 for standby
 from active database
 dorecover
 spfile
 set db_unique_name='IRISSBY'
 set fal_client='IRIS'
 set fal_server='IRISSBY'
 set log_archive_dest_1='location=+DG_ARCH12C_02 VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=IRISSBY'
 set log_archive_dest_2='service=IRIS ASYNC valid_for=(ONLINE_LOGFILE,PRIMARY_ROLE) db_unique_name=IRIS'
 set db_create_file_dest='+DG_DATA'
 set db_create_online_log_dest_1='+DG_ARCH12C_02'
 set db_create_online_log_dest_2='+DG_DATA12C_02'
 set db_create_online_log_dest_3='+DG_DATA12C_02'
 set standby_file_management='AUTO'
 set log_archive_config='dg_config=(IRIS,IRISSBY)'
 set audit_file_dest='/u01/app/oracle/admin/IRISSBY/adump'
 set core_dump_dest='/u01/app/oracle/admin/IRISSBY/cdump'
 set diagnostic_dest='/u01/app/oracle'
 nofilenamecheck;
 }
 exit

18.-En el servidor standby conectarse al primario y auxiliay(standby) a traves de RMAN y ejecutar el duplicate database
[oracle@fcrac06 ~]$ rman target sys/oracle@IRIS

Recovery Manager: Release 12.1.0.2.0 – Production on Sun Apr 8 13:52:27 2018
Copyright (c) 1982, 2014, Oracle and/or its affiliates. All rights reserved.
connected to target database: IRIS (DBID=1678477687)

RMAN>

RMAN> connect auxiliary sys/oracle@IRISSBY
connected to auxiliary database: IRIS (not mounted)

RMAN>
run {
 allocate channel c1 type disk;
 allocate channel c2 type disk;
 allocate auxiliary channel aux1 type disk;
 allocate auxiliary channel aux2 type disk;
 duplicate target database
 for standby
 from active database
 dorecover
 spfile
 set db_unique_name='IRISSBY'
 set fal_client='IRIS'
 set fal_server='IRISSBY'
 set log_archive_dest_1='location=+DG_ARCH12C_02 VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=IRISSBY'
 set log_archive_dest_2='service=IRIS ASYNC valid_for=(ONLINE_LOGFILE,PRIMARY_ROLE) db_unique_name=IRIS'
 set db_create_file_dest='+DG_DATA12C_02'
 set db_create_online_log_dest_1='+DG_ARCH12C_02'
 set db_create_online_log_dest_2='+DG_DATA12C_02'
 set db_create_online_log_dest_3='+DG_DATA12C_02'
 set standby_file_management='AUTO'
 set log_archive_config='dg_config=(IRIS,IRISSBY)'
 set audit_file_dest='/u01/app/oracle/admin/IRISSBY/adump'
 set core_dump_dest='/u01/app/oracle/admin/IRISSBY/cdump'
 set diagnostic_dest='/u01/app/oracle'
 nofilenamecheck;
 }
 exit

19.-Proceso de duplicate inicia:
Oracle instance shut down

connected to auxiliary database (not started)
Oracle instance started

Total System Global Area 100931731456 bytes

Fixed Size 7656992 bytes
Variable Size 13958646240 bytes
Database Buffers 86704652288 bytes
Redo Buffers 260775936 bytes
allocated channel: aux
channel aux: SID=2401 device type=DISK

contents of Memory Script:
{
backup as copy current controlfile for standby auxiliary format ‘/oradata/IRISSBY/controlfile/control01.ctl’;
}
executing Memory Script

Starting backup at 08-APR-18
channel c1: starting datafile copy
copying standby control file
output file name=/oracle/app/oracle/product/12.1.0/dbhome_1/dbs/snapcf_IRIS.f tag=TAG20180408T165819
channel c1: datafile copy complete, elapsed time: 00:00:01
Finished backup at 08-APR-18

contents of Memory Script:

20.-Iniciar Active Dataguard

—Activar proceso de Sincronización MRP.

SQL> select status from v$instance;
 STATUS
 ------------
 MOUNTED
SQL> alter database open read only;
Database altered.
SQL> select open_mode from v$database;
OPEN_MODE
 --------------------
 READ ONLY
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE PARALLEL 8 USING CURRENT LOGFILE DISCONNECT FROM SESSION;
Database altered.

21.-Validación final.
Finalmente generamos 3 archivelogs en el origen y validamos sean aplicados en standby

alter session set nls_date_format='dd/mm/yyyy hh24:mi:ss';
 SELECT sequence#, first_time, next_time, applied, thread# FROM v$archived_log ORDER BY 1,2;
 SEQUENCE#   FIRST_TIME           NEXT_TIME           APPLIED  THREAD#
 ---------- -------------------- -------------------- -------  -------
 5262       08/04/2018 17:18:36  08/04/2018 17:20:20  YES        1
 5263       08/04/2018 17:20:20  08/04/2018 17:21:14  YES        1
 5264       08/04/2018 17:21:14  08/04/2018 17:22:56  YES        1
 5265       08/04/2018 17:22:56  08/04/2018 17:23:15  YES        1
 5266       08/04/2018 17:23:15  08/04/2018 17:23:18  IN-MEMORY  1

como se puede apreciar nuestro nuevo physical standby se encuentra terminado y totalmente funcional!!!.

ALTO CONSUMO DE SHARED POOL, ORA-04031: unable to allocate 63496 bytes of shared memory

Hace unos días, al iniciar mi jornada laboral como DBA, me reportaron el siguiente error,el cual a mas de uno le debe resultar familiar : ORA-04031: unable to allocate 13840 bytes of shared memory.

Este error se presentó en una BD  Container RAC 12.2.0.1 de arquitectura multitenant,la cual tenia mas de un Pluggale Database.(el tratamiento de este error es el mismo en BDs no container ).

Rápidamente, revisando el alert.log de cada nodo encontramos que el siguiente error se presentaba de manera muy recurrente.

Errors in file /u01/app/oracle/diag/rdbms/cdbeai/CDBxxx/trace/CDBxxx_ora_51418.trc (incident=905203) (PDBNAME=AUDxxx):
ORA-04031: unable to allocate 13840 bytes of shared memory (“shared pool”,”unknown object”,”sga heap(2,0)”,”ges resource dynamic”)
AUDxxx(3):Incident details in: /u01/app/oracle/diag/rdbms/cdbxxx/CDBxxxx/incident/incdir_905203/CDBxxx_ora_51418_i905203.trc
AUDxxx(3):Use ADRCI or Support Workbench to package the incident.
See Note 411.1 at My Oracle Support for error and packaging details.
2018-03-15T09:22:29.074949-05:00

high contention shared pool_2

El mensaje de error es bastante claro,la base de datos requiere mayor memoria en el shared pool de la que hay disponible.

Verificando, la BD tiene 25GB de SGA en total

SQL> show parameter sga

NAME                                          TYPE         VALUE
————————————       ————- ——————————
allow_group_access_to_sga  boolean    FALSE
lock_sga                                    boolean    FALSE
pre_page_sga                           boolean    TRUE
sga_max_size                           biginteger 25G
sga_min_size                            big integer 0
sga_target                                big integer     25G
unified_audit_sga_queue_size integer 1048576

Investigando a mayor detalle desde cloud control,nos encontramos que el 98% de la memoria asignada al SGA es consumida por el shared pool.(Ops eso no suena nada bien!!).

shared_pool_cloudcontrol1

En la distribución de memoria entre buffers del SGA, se puede apreciar que de 25GB que tiene como total el SGA,22.6GB es consumido por el shared pool.

shared_pool_cloudcontrol2

La distribución de memoria entre buffers del SGA tambien puede visualizarse usando el siguiente query:

SQL> SELECT component, current_size/1024/1024/1024 gbytes
FROM v$sga_dynamic_components
ORDER BY 2 DESC
FETCH FIRST 5 ROWS ONLY;

COMPONENT                                                   GBYTES
—————————————————————- ———-
shared pool                                                       22.6875
large pool                                                            1.1875
Shared IO Pool                                                      .5
DEFAULT buffer cache                                     .3125
streams pool                                                        .125

Revisando a detalle el consumo dentro del shared pool, encontramos que había indicios de memoria retenida en el shared pool por “ges resources“:

SQL> SELECT pool, name, bytes/1024/1024/1024 gbytes
FROM v$sgastat
WHERE pool=’shared pool’
ORDER BY BYTES DESC
FETCH FIRST 5 ROWS ONLY;

POOL                     NAME                          GBYTES
————–         ————————–           ——————-
shared pool       ges enqueues                 5.82885164
shared pool       SQLA                               4.86808275
shared pool       ges resource dynamic 2.52088516
shared pool       free memory                 2.33909176
shared pool      gc index split transaction .86762473

Ahora pasaremos a revisar como ha ido cambiando la asignación de memoria entre buffers dentro del SGA ,desde el ultimo reinicio de la instancia de BD.Para lo cual usaremos el siguiente query bastante útil, obtenido del blog de Andrea Salzano

col FINAL_SIZE for 999,999,999,999,999
 set pages 99
 set lines 210
 col component for a20

with gv_sga_resize_ops as (
 select inst_id instance_number , to_char(START_TIME,'yyyymmdd') START_DAY, START_TIME, COMPONENT, OPER_TYPE, OPER_MODE, final_size
 from GV$SGA_RESIZE_OPS
 where COMPONENT in ('DEFAULT buffer cache','shared pool')
 )
 select instance_number inst_id, START_TIME last_start_time, COMPONENT, OPER_TYPE last_OPER_TYPE, OPER_MODE, final_size, oper_cnt from (
 select instance_number, START_DAY, COMPONENT, OPER_TYPE, OPER_MODE, final_size,
 row_number() over (partition by instance_number, START_DAY, COMPONENT, OPER_TYPE order by instance_number, START_TIME desc) rn,
 count(*)over (partition by instance_number, START_DAY, COMPONENT, OPER_TYPE) oper_cnt, START_TIME
 from gv_sga_resize_ops o
 ) where rn=1
 and instance_number=2
 order by 1,3,2;

Claramente, se puede apreciar, en la columna FINAL_SIZE,que desde el ultimo reinicio de la instancia de BD, el 22/DEC/2017 el Data Buffer Cache tenia una tendencia de hacerse mas pequeño(SHRINK),mientras que a la par el Shared Pool fue creciendo(GROW), hasta ocupar casi todo el SGA.

shARed_pool_DETAIL.jpg

Indagando un poco en My Oracle Support, así como también otras páginas de colegas https://dbamarco.wordpress.com/2015/10/29/shared-pool-memory-leak-in-12c-rac/

encontré la siguiente nota técnica, la cual hace referencia a un bug 21373473, debido a bloqueos de tipo DX y BB los cuales están siendo capturados en el shared pool , pero no están siendo limpiados.

ORA-04031 Errors Occurring with High “ges resource dynamic” & “ges enqueues” Memory Usage In The Shared Pool (Doc ID 2063751.1)

Download and apply the one-off patch number 21373473 (Patch:21373473) for your platform and version combination.

Please note that if using 12.1.0.2, then you should also apply the related patch number 21260431 (Patch:21260431) which also impacts the shared pool memory allocations identified here.

This issue can also be worked around by setting _GES_DIRECT_FREE_RES_TYPE=”CTARAHDXBB” in the instances.

+ otra nota relacionada

NOTE:1951758.1 – ORA-4031 due to Huge “ges resource dynamic” and “ges enqueues” and Instance Terminates: ORA-29770: ‘SGA: allocation forcing component growth’.

Finalmente decidí aplicar el workaround(Doc ID 2063751.1), de setear el parámetro “_ges_direct_free_res_type”, en ambas instancias del RAC:

alter system set “_ges_direct_free_res_type”="CTARAHDXBB" scope=spfile sid=’*’;

…Finalmente

Una semana después del cambio observamos que el comportamiento del shared pool volvió a la normalidad y se ha mantenido estable.

shred_pool_wa

sharedpool_wa2

 

 

PERFORMANCE TUNING : ACTIVE SESSION HISTORY -ASH -PARTE I

INTRODUCCIÓN:

Los problemas de Performance en una Base de datos Productiva,son quizá,los tipo de problema mas críticos, complejos y personalmente considero que son los mas emocionantes de resolver!!!.

¿Cuantas veces nos ha pasado en nuestro día a día como DBAs, que nos han pedido analizar e indicar a detalle que ocasionó un cuello de botella en nuestras BDs en un punto en el pasado?,probablemente de hace unas horas,días o incluso semanas atrás.

Active Session History(ASH), es una excelente herramienta para analizar problemas de performance que suceden en tiempo real,así como también en un punto en el pasado.

ASH brinda la mayoría de información disponible en trace files pero sin necesidad de generar trace files,esta siempre esta disponible.Usar ASH es extremadamente simple, por que no tienes que generar eventos e ir a la ruta en el servidor a revisar las trazas generadas, basta con consultar la vista v$active_session_history.

Cabe resaltar que Active Session History, es un feature disponible desde Oracle 10g release 1 y su uso requiere licencia Diagnostic Pack.

ash-architecture-and-advanced-usage-rmoug2014-7-6381

Cada segundo, Active Session History sensa la base de datos y recolecta importante información de las sesiones activas(sesiones inactivas no son capturadas) y pobla el ASH Buffer,el cual se puede consultar desde la vista v$active_session_history.

  • SESSION:session_id,session_serial#,user_id(puede ser usado contra la dba_users para obtener el username),session_type,session_state,qc_session_id,qc_instance_id
  • WAIT:event,event_id,event#,seq#,p1,p2,p3
  • SQL: sql_id,sql_child_number,sql_plan_hash_value,sql_opcode
  • OBJECT:current_obj#,current_file#,current_block#
  • APPLICATION: Program,Module,action,client_id,service_hash

ash

La información disponible en la v$active_session_history es poblada en base a la información disponible de las vistas v$session y v$session_wait y permite obtener información importante propia de la sesion, wait, sentencia SQL,objeto,aplicacion:

image002

RETENCIÓN:

La retención de active session history, es dependiente de la retención del AWR.

Oracle escribe la información de memoria a disco, desde v$active_session_history hacia la tabla wrh$active_session history, a la cual podemos consultar a través de la vista dba_hist_active_sess_history. Esta acción la realiza cada hora antes de cada snapshot del AWR o cuando el Ash buffer este al 2/3 de su capacidad en el SGA, cabe resaltar que no toda la información baja a disco, solo 1 de cada 10 entradas.

Calcular Retención en dias de ASH:

 select sysdate - a.sample_time ash,
 sysdate - s.begin_interval_time snap,
 c.RETENTION
 from sys.wrm$_wr_control c,
 (
 select db.dbid,
 min(w.sample_time) sample_time
 from sys.v_$database db,
 sys.Wrh$_active_session_history w
 where w.dbid = db.dbid group by db.dbid
 ) a,
 (
 select db.dbid,
 min(r.begin_interval_time) begin_interval_time
 from sys.v_$database db,
 sys.wrm$_snapshot r
 where r.dbid = db.dbid
 group by db.dbid
 ) s
 where a.dbid = s.dbid
 and c.dbid = a.dbid;

retention_ash

SELECT min(sample_time) min_sample_time, max(sample_time) max_sample_time FROM V$ACTIVE_SESSION_HISTORY;

PARÁMETROS:

_ash_size
_ash_enable
_ash_sampling_interval
_ash_disk_write_enable
_ash_disk_filter_ratio

referencias: