MERCADOS FINANCIEROS

jueves, 20 de febrero de 2020

PING VRF

ping vrf POSXXX 10.1.16.32 repeat 1000 size 1500

DIAGNOSTIC PACK

alter system set control_management_pack_access='DIAGNOSTIC+TUNING' scope=both;

CONTROL MANAGEMENT PACK

alter system set control_management_pack_access='DIAGNOSTIC+TUNING' scope=both;

RESTORE DATABASE NOARCHIVELOG

Recovering a Database in NOARCHIVELOG Mode Using Incremental Backups

You can perform limited recovery of changes to a database running in NOARCHIVELOG mode by applying incremental backups. Note that the incremental backups must be consistent, like all backups of a database run in NOARCHIVELOG mode, so you cannot make backups of the database when it is open.
Assume the following scenario:
  • You run database trgt in NOARCHIVELOG mode.
  • You use a recovery catalog.
  • You shut down the database consistently and make a level 0 backup of database trgt to tape on Sunday afternoon.
  • You shut down the database consistently and make a level 1 differential incremental backup to tape at 3:00 a.m. on Wednesday and Friday.
  • The database has a media failure on Saturday, destroying half of the datafiles as well as the online redo logs.
In this case, you must perform an incomplete media recovery until Friday, the date of the most recent incremental backup. RMAN uses the level 0 Sunday backup as well as the Wednesday and Friday level 1 backups.
Because the online redo logs are lost, you must specify the NOREDO option in the RECOVER command.
You must also specify NOREDO if the online logs are available but the redo cannot be applied to the incrementals.
If you do not specify NOREDO, then RMAN searches for redo logs after applying the Friday incremental backup, and issues an error message when it does not find them.
After connecting to trgt and the catalog database, recover the database with the following command:
 
 
STARTUP FORCE MOUNT; RESTORE CONTROLFILE; # restore control file from consistent backup ALTER DATABASE MOUNT; RESTORE DATABASE; # restore datafiles from consistent backup RECOVER DATABASE NOREDO; # specify NOREDO because online redo logs are lost ALTER DATABASE OPEN RESETLOGS;

BACKUP NOARCHIVELOG

Backing Up in NOARCHIVELOG Mode: Example

This script puts the database into the correct mode for a consistent, whole database backup and then backs up the database. The script performs a shutdown, startup, shutdown, and then startup again before creating multiple copies of the backup:
# Shut down database cleanly with immediate option. This type of shutdown lets  
# current calls to the database complete, but prevents further logons or calls. 
# If the database is not up, you receive a message saying so but RMAN will not 
# treat this situation as an error.
SHUTDOWN IMMEDIATE; 
  
# Start up the database in case it suffered instance failure or was 
# closed with SHUTDOWN ABORT before starting this script. 
# The script performs instance recovery if 
# needed. Oracle uses the default init.ora file. Alternatively, use this form:
# STARTUP FORCE DBA pfile=filename. 
# Use the DBA option because you are going to shut down again
# and do not want to let users in during the short interval. Use the FORCE 
# option because it cannot hurt and might help in certain situations. 
STARTUP FORCE DBA; 
SHUTDOWN IMMEDIATE; 
  
# The database is cleanly closed and ready for a consistent backup. RMAN
# requires that the database be started and mounted to perform a backup.
RMAN> STARTUP MOUNT;

# this example uses automatic channels to make the backup
BACKUP 
  COPIES 2 
  INCREMENTAL LEVEL 0 
  MAXSETSIZE 10M 
  DATABASE 
  INCLUDE CURRENT CONTROLFILE
  TAG 'BACKUP_1'
;

# Now that the backup is complete, open the database. 
ALTER DATABASE OPEN; 

BACKUP OFFLINE CATALOGO


Keeping a Long-Term Backup: Example

If you configure a retention policy, then you may want to exclude specified backups from this policy. For example, you may want to archive a consistent backup of the database once a year to serve as a historical record. This long-term backups does not function as a backup that you may perform recovery on, but an archived snapshot of data at a particular time.
To exempt a backup from the retention policy, specify the KEEP option on the BACKUP command. You can also specify LOGS or NOLOGS to indicate whether RMAN should save archived logs for possible recovery of this backup. If you specify NOLOGS, then the backup must be consistent.
This example keeps the backup of the database indefinitely and does not save archived logs needed to recover it:

RMAN> SHUTDOWN IMMEDIATE;
RMAN> STARTUP MOUNT;  # put database in consistent state
RMAN> BACKUP DATABASE KEEP FOREVER NOLOGS
              TAG 'db_archive_1'; # make long-term consistent backup

# mark backup as unavailable in the repository so that RMAN does not attempt to
# restore it unless explicitly specified on the RESTORE command
RMAN> CHANGE BACKUP TAG 'db_archive_1' UNAVAILABLE;
RMAN> SQL 'ALTER DATABASE OPEN';

BACKUP DATABASE SKIP

SQL> alter tablespace example read only;

Tablespace altered.


SQL> alter tablespace example read write;


LUNES - SABADO 
RMAN> BACKUP DATABASE SKIP READONLY SKIP OFFLINE;

DOMINGO
RMAN> BACKUP DATABASE;

BACKUP RMAN OFFLINE CATALOGO

Keeping a Long-Term Backup: Example

If you configure a retention policy, then you may want to exclude specified backups from this policy. For example, you may want to archive a consistent backup of the database once a year to serve as a historical record. This long-term backups does not function as a backup that you may perform recovery on, but an archived snapshot of data at a particular time.
To exempt a backup from the retention policy, specify the KEEP option on the BACKUP command. You can also specify LOGS or NOLOGS to indicate whether RMAN should save archived logs for possible recovery of this backup. If you specify NOLOGS, then the backup must be consistent.
This example keeps the backup of the database indefinitely and does not save archived logs needed to recover it:
RMAN> SHUTDOWN IMMEDIATE;
RMAN> STARTUP MOUNT;  # put database in consistent state
RMAN> BACKUP DATABASE KEEP FOREVER NOLOGS 
              TAG 'db_archive_1'; # make long-term consistent backup

# mark backup as unavailable in the repository so that RMAN does not attempt to
# restore it unless explicitly specified on the RESTORE command
RMAN> CHANGE BACKUP TAG 'db_archive_1' UNAVAILABLE;
RMAN> SQL 'ALTER DATABASE OPEN';

martes, 18 de febrero de 2020

IDEO PROTOTHINKING

Ideo ayuda a que las organizaciones de negocios, gobierno y educación crezcan con trabajo en tres áreas fundamentales. De un lado, ayudan a identificar las necesidades latentes de las personas y encuentran maneras nuevas de satisfacerlas. En segundo término, visualizan nuevas direcciones para empresas y marcas y diseñan nuevas ofertas —productos, servicios, espacios, e interacción con medios audiovisuales y de software— que les dé vida. Por último, les ayudan a cambiar su cultura y a construir las habilidades necesarias para innovar de manera sostenida.

Ideo no es un consultor común. Muchos asesores de negocios llegan a una compañía, diagnostican y después aparecen con un libro bien editado para convencer a su cliente de las soluciones. En Ideo, en cambio, le piden al cliente que trabaje junto con ellos en todo el proceso. Por eso, no pierden tiempo en la implantación. No hay necesidad de discutir los volúmenes de las recomendaciones.

El primer paso de la consultoría es conformar un equipo conjunto de ejecutivos del cliente con algunos de los 450 antropólogos, ingenieros, diseñadores, estrategas de negocios y científicos sociales de Ideo, para observar el comportamiento de los consumidores. Van a las casas o a comprar los productos del cliente a los almacenes o a los sitios de internet. Después hacen una gran lluvia de ideas, en la cual se discuten rigurosamente los problemas y las soluciones, que se escriben en papeles que se van pegando en las paredes. 

La etapa siguiente es construir prototipos para visualizar las soluciones. Esto ahorra discusiones en las que trata de intuir la forma en que se vería la idea. Para ahorrar tiempo, usan modelos simples de cartón donde lo más importante es el resultado general y no es el estilo, un elemento que desvela y, por supuesto, demora el trabajo de las oficinas de diseñadores convencionales. Con decisiones sobre los cambios, finalmente solo queda el proceso de implantación. 

La velocidad con que se encuentran y resuelven los problemas, es una de las características que más atraen a quienes trabajan con Ideo. Pero otros prefieren sobre todo, su visión extraordinariamente enfocada a los negocios pero ecléctica. Se incluye la opinión de ingenieros, antropólogos o físicos que pasan sus vacaciones montando en bicicleta por los Alpes. Todo se amalgama en lo que llaman 'pensamiento de diseño', que da un poder enorme a la identificación de las oportunidades que generen valor. El método de Ideo es tan bueno, que la prestigiosa Universidad de Stanford estableció su escuela de diseño adoptando completamente esta visión. 


¿Cómo definiría innovación?
Para nosotros, innovación es usar una visión creativa en la resolución de problemas, que llamamos 'pensamiento de diseño', que permita generar un nuevo valor para la organización. El nuevo valor puede venir en forma de nuevos productos, nuevos servicios, nuevos procesos o formas de hacer las cosas, pero no creemos que sea una innovación hasta que no genere valor. De modo que en ocasiones se tiene un invento, una idea loca o algo artístico, pero hasta que no se traduce en algo útil y valioso para las organizaciones, no necesariamente lo llamaríamos innovación.

¿Pensamiento de diseño?

Sí. Es el proceso que ocurre en la mente del diseñador y que normalmente se usaría para crear un producto nuevo. Ahora se usa para crear cualquier cosa nueva para el mundo, que tenga un valor.

¿Se trata de usar el diseño como una aproximación más universal a la creatividad?

Exacto. Nuestra firma ha hecho entre 3.000 y 4.000 programas de diseño e innovación. Cuando se hace cualquier cosa ese número de veces, uno empieza a encontrar patrones. Empieza a ver las grandes lecciones que parecen estar en todos los proyectos. En 30 años, hemos encontrado cosas que se pueden asociar con los proyectos exitosos.

La primera categoría de estos elementos es la apertura al aprendizaje nuevo. Algunas compañías —las que no son buenas en innovación— se sienten demasiado satisfechas, demasiado seguras de sí mismas. Creen que no tienen que aprender. Encontramos que las compañías innovadoras, incluso si son la número uno en el mundo, aprenden continuamente.

Hay tres tipos de aprendizaje en una organización, que son diferentes a las de aprendizaje para un individuo. Aprenden al observar el comportamiento humano, la enredada conducta de las personas en el mundo real. Segundo, aprenden por un proceso de 'ensayo y error iluminado', lo que implica la disposición a ensayar algo con los clientes, y ver lo que tiene éxito y lo que fracasa. Si se tiene una cultura corporativa de "yo nunca cometo un error", nunca se podrán tomar riesgos. El éxito de las compañías innovadoras es estar dispuestas a cometer errores, porque están experimentando todo el tiempo.

La tercera manera de aprender es la polinización cruzada, que consiste en mirar otras industrias, otros países y encontrar ideas que no simplemente se copian, sino que de alguna forma se traducen para ser usadas en la organización propia.

El 'pensamiento de diseño' requiere humildad, porque se debe reconocer que uno puede aprender todavía, que necesita seguir aprendiendo. No como los expertos que creen que ya saben lo suficiente. Además, se trata de usar todo el cerebro, no solo las habilidades analíticas del lado izquierdo, sino también la parte creativa e intuitiva del cerebro. Eso es muy importante para la innovación.



¿Cuál es la mayor barrera para que una organización acoja estas ideas?

He trabajado personalmente en más de 1.500 grupos de clientes y hay dos obstáculos que he visto con más frecuencia.

Uno lo mencioné hace un momento: satisfacción. Estar demasiado seguro de sí mismo, creer que no necesita innovar. Por ejemplo, yo crecí en el Medio Oeste de Estados Unidos, en Akron, Ohio. Cuando nací, en los 50, la industria de llantas estaba en mi pueblo. El 100% de las llantas para los carros de Estados Unidos se hacía a menos de 10 kilómetros de mi casa. Pero los llanteros de Akron se volvieron demasiado seguros de sí mismos. Pensaron que lo sabían todo, que eran los mejores del mundo y ellos y su comunidad pagaron un precio muy alto por su satisfacción.

Bajaron su tasa de innovación y para cuando me gradué de bachillerato a los 18 años, habían pasado de tener el 100% de las llantas para los vehículos de pasajeros a 0%, porque otras compañías, principalmente extranjeras como Michelin en Francia y Yokohama Tires en Japón y luego Bridgestone, innovaron a un paso más rápido. Esa satisfacción, ese confort y ese sentimiento de superioridad fue una barrera enorme a la innovación y causó mucho dolor.

Pero incluso entre grupos innovadores hay otra barrera: la del abogado del diablo. En muchas organizaciones, hay personas que son muy buenos críticos. Les dan cualquier idea y encontrarán lo malo que hay en ella. Cuando se propone una innovación, son muy buenos en derribarla. Dirán: "bueno, no tenemos ninguna prueba de eso" o "ya ensayamos algo así antes y no funcionó". Y muchas veces, reciben premios por hacerlo. Y la gente dice: "ese tipo es tan inteligente".

Pero entonces, si es tan inteligente, pongámoslo a cargo de arreglar la sugerencia, lo que llamo 'como podríamos'. Cuando diga: "eso nunca funcionará, porque los reguladores nunca lo aprobarán" o algo así, toda la organización debería iluminar con reflectores al abogado del diablo y decirle: "usted es muy inteligente, ha estado en la organización mucho tiempo, es una especie de experto. Díganos como podríamos cambiar esta idea para que pueda pasar por los reguladores. Para que llegue al mercado exitosamente".

Mientras dejemos que el abogado del diablo solo sea un crítico, tendremos una gran barrera a la innovación. Lo que queremos es engancharlo, pensando que incluso puede tener razón.



¿Cómo se promueve la creatividad?

Hay muchas formas, pero creo que muchas de ellas se pueden resumir en la creación de un entorno amigable a las ideas. Eso implica que cualquiera en la compañía puede proponer una idea sin que se rían de él. No serán criticados en exceso o no los harán sentir pequeños o estúpidos, porque no han pensado la idea en su totalidad. Suponga que usted tiene una idea nueva y se la lleva al jefe o al vecino de cubículo y, de inmediato, le preguntan cómo se fabricaría eso o qué dirán los clientes sobre ese producto o cómo lo manejarán los canales de distribución. Si está en un entorno amigable a las ideas, es perfectamente válido decir que no ha llegado a ese punto todavía. "Es solo una idea embrionaria, pero déjeme pensar en eso".

Si eso se puede decir en una empresa, la gente construirá sobre la idea. Pero en algunas culturas dicen "solo quiero oír ideas patentables. No me traigan cosas a medias, ideas sin terminar". Ese es un entorno no amigable, en el que es mejor no contar las ideas porque se critican o se burlan de la gente.

¿Cómo se construye un entorno así?

Una es tener muchas sesiones de lluvia de ideas, para que todos se acostumbren a compartir sus ideas. Otra es hacer muchos prototipos con los conceptos gruesos —que se ponen de manera física si es un producto, o con un video si es un servicio, o bosquejados en un papel—, para que las personas desarrollen fluidez con las ideas y comprendan mejor el concepto de que hay muchas ideas flotando alrededor.

Un pequeño beneficio que se deriva de las culturas amigables a las ideas es que la gente no se aferra a una idea para siempre. Si creen que es la única idea que van a tener en la vida, la mantendrán en secreto o solo se la cuentan a una persona. En un entorno amigable a las ideas, se espera tener más ideas, de modo que es más fácil compartirlas con personas que tienen diferentes experiencias y antecedentes para que construyan sobre ellas.

Mucho de lo que hacemos en Ideo es tratar de sacar las mejores ideas de todo el equipo, no solo de la alta gerencia. Encontramos propuestas en las personas que están en la calle atendiendo los clientes, en los jóvenes recién egresados de la universidad que no están atrapados en el concepto de cómo funciona la industria. Hay que promover la aparición de esas ideas, de una forma que llamamos 'los huevos enseñándoles a las gallinas', en la cual la gente joven que no ha estrechado su visión por las reglas de la industria, se pregunta por qué las cosas se hacen de una forma y no de otra completamente diferente.

¿Qué deben hacer las compañías pequeñas en innovación?

Para que a las empresas pequeñas les vaya bien, tienen que ser extraordinarias. Cuando se es pequeño, más vale tener productos, servicios o experiencias para los clientes que se vendan solos. Que sean tan buenos, que los clientes hablen de ellos. Lo que llaman 'rumor de mercadeo'.

Cuando Starbucks era pequeño, no hacía publicidad, pero vendía una gran experiencia y la gente hablaba de ello. Usando ese 'rumor' ahora es una compañía gigantesca.

W.L. Gore es una empresa pequeña, no vende mucho a los consumidores, pero la gente conoce sus productos. El más famoso es la tela Gore-tex. Es una tela que respira. Es extraordinaria. Mantiene la lluvia fuera, pero deja escapar la transpiración. La humedad la atraviesa en una dirección pero no en la otra. El producto es tan bueno que todos están dispuestos a pagar más por él. Y todos quieren ponerlo en sus chaquetas y su ropa exterior.

Aunque Gore es muy exitoso, sigue sacando productos nuevos y extraordinarios. Uno de los últimos son cuerdas de guitarra, un producto que no ha cambiado en… ¿100 años, tal vez? Fabricaron un nuevo material y creo que tienen algo así como 50% del mercado mundial ahora, porque es el mejor. Luego trabajaron en venas artificiales para cirugías. Cada producto en su línea es extraordinario. Incidentalmente, en Gore no tienen jefes, ni descripción de cargos. Son una organización muy interesante.
                    

PROYECTOS DESIGN THINKING

http://www.designthinking.es/inicio/

Qué es el Design Thinking

Es un método para generar ideas innovadoras que centra su eficacia en entender y dar solución a las necesidades reales de los usuarios. Proviene de la forma en la que trabajan los diseñadores de producto. De ahí su nombre, que en español se traduce de forma literal como "Pensamiento de Diseño", aunque nosotros preferimos hacerlo como "La forma en la que piensan los diseñadores".
Se empezó a desarrollar de forma teórica en la Universidad de Stanford en California (EEUU) a partir de los años 70, y su primera aplicabilidad con fines lucrativos como "Design Thinking" la llevó a cabo la consultoría de diseño IDEO, siendo hoy en día su principal precursora

Quienes lo utilizan

Según Tim Brown, actual CEO de IDEO, el Design Thinking “Es una disciplina que usa la sensibilidad y métodos de los diseñadores para hacer coincidir las necesidades de las personas con lo que es tecnológicamente factible y con lo que una estrategia viable de negocios puede convertir en valor para el cliente, así como en una gran oportunidad para el mercado”.

¿Cómo funciona?

El Design Thinking se desarrolla siguiendo un proceso en el que se ponen en valor los que nosotros consideramos sus 5 características diferenciales:
La generación de empatía: hay que entender los problemas, necesidades y deseos de los usuarios implicados en la solución que estamos buscando. Independientemente de qué estemos desarrollando, siempre conllevará la interacción con personas. Satisfacerlas es la clave de un resultado exitoso.
El trabajo en equipo, ya que pone en valor la capacidad de los individuos de aportar singularidad.
La generación de prototipos, ya que defiende que toda idea debe ser validada antes de asumirse como correcta. El Design Thinking propicia la identificación de fallos, para que cuando demos con la solución deseada, éstos ya se hayan solventado.
Todo ello bajo una atmósfera en la que se promueve lo lúdico. Se trata de disfrutar durante el proceso, y gracias a ello, llegar a un estado mental en el que demos rienda suelta a nuestro potencial.
Durante el proceso se desarrollan técnicas con un gran contenido visual y plástico. Esto hace que pongamos a trabajar tanto nuestra mente creativa como la analítica, dando como resultado soluciones innovadores y a la vez factibles.
Para comenzar a utilizar la metodología es muy importante preparar estos cuatro puntos:
Los materiales: Los usados en las técnicas de Design Thinking están al alcance de cualquiera. Hazte con rotuladores, hojas de papel, notas adhesivas, lápices de colores, pegamento y una cámara de fotos. Serán nuestras herramientas para promover la comunicación visual, que es fundamental en la metodología. Una imagen vale más que mil palabras. Y lo que es más importante: una imagen puede evocar un sinfín de ideas, ya que da pie a la interpretación.
El equipo: En el Design Thinking es imprescindible trabajar en equipo. Cuanto más diverso sea, mejor. Así podréis sumar puntos de vista, conocimientos y experiencia. Es imprescindible que haya al menos una persona con conocimientos sobre la metodología que sepa guiar el proceso. Y aunque debe tener un nucleo estable de personas que participen hasta el final, se podrán sumar otras dependiendo de la fase en la que nos encontremos. Por ejemplo, en la generación de ideas o en la prueba de prototipos.
El espacio: Durante el proceso necesitaréis un espacio de trabajo, aunque también desarrollaréis técnicas fuera de él. Buscad un sitio lo suficientemente amplio para trabajar en torno a una mesa, con paredes libres donde pegar la información que vayáis generando. Pensad en un lugar luminoso e inspirador, que propicie el trabajo distendido y os haga sentir cómodos y con un buen estado anímico. ¿Habéis oido hablar de las famosas oficinas de Google? Un espacio inspirador motiva la innovación.
La actitud: En el Design Thinking es imprescindible la actitud. Debemos adoptar la que se denomina "Actitud del Diseñador". Ser curiosos, y observadores. En cualquier detalle podemos encontrar información trascendente. Debemos ser empáticos, tanto con las personas como con sus circunstancias. Ser capaces de ponernos en la piel del otro. Cuestionarnos el Status Quo, y no cargar con prejuicios o asunciones. Ser optimistas y positivos.Perder el miedo a equivocarnos, y ver los errores como oportunidades.
 

¿En qué consiste el proceso?

El proceso de Design Thinking se compone de cinco etapas. No es lineal. En cualquier momento podrás ir hacia atrás o hacia delante si lo ves oportuno, saltando incluso a etapas no consecutivas. Comenzarás recolectando mucha información, generando una gran cantidad de contenido, que crecerá o disminuirá dependiendo de la fase en la que te encuentres.
¿En qué consiste el proceso?
A lo largo del proceso irás afinando ese contenido hasta desembocar en una solución que cumpla con los objetivos del equipo. Y seguramente, incluso los supere.
¿En qué consiste el proceso?
EMPATIZA: El proceso de Design Thinking comienza con una profunda comprensión de las necesidades de los usuarios implicados en la solución que estemos desarrollando, y también de su entorno. Debemos ser capaces de ponernos en la piel de dichas personas para ser capaces de generar soluciones consecuentes con sus realidades.
DEFINE: Durante la etapa de Definición, debemos cribar la información recopilada durante la fase de Empatía y quedarnos con lo que realmente aporta valor y nos lleva al alcance de nuevas perspectivas interesantes. Identificaremos problemas cuyas soluciones serán clave para la obtención de un resultado innovador.
IDEA: La etapa de Ideación tiene como objetivo la generación de un sinfín de opciones. No debemos quedarnos con la primera idea que se nos ocurra. En esta fase, las actividades favorecen el pensamiento expansivo y debemos eliminar los juicios de valor. A veces, las ideas más estrambóticas son las que generan soluciones visionarias.
PROTOTIPA: En la etapa de Prototipado volvemos las ideas realidad. Construir prototipos hace las ideas palpables y nos ayuda a visualizar las posibles soluciones, poniendo de manifiesto elementos que debemos mejorar o refinar antes de llegar al resultado final.
TESTEA: Durante la fase de Testeo, probaremos nuestros prototipos con los usuarios implicados en la solución que estemos desarrollando. Esta fase es crucial, y nos ayudará a identificar mejoras significativas, fallos a resolver, posibles carencias. Durante esta fase evolucionaremos nuestra idea hasta convertirla en la solución que estábamos buscando.
 
 

¿Cuáles son las técnicas?

 

Problemas con SYSAUX, ocupación de AWRs

Problemas con SYSAUX, ocupación de AWRs


Hoy vamos a lidiar con un problema muy común en las bases de datos de Oracle que es el tamaño del tablespace SYSAUX.
El tablespace SYSAUX es uno de los tablespaces especiales de la base de datos con el que no podemos jugar alegremente, la principal característica que tiene de cara a la administración de base de datos es que ,el espacio que le demos se ha perdido, es decir, no va ha haber forma de hacerlo mas pequeño (al menos en mi caso siempre ha habido un “pero” que lo imposibilita).
Como decía al principio es junto con el SYSTEM un tablespace muy especial, y los motivos de su tamaño pueden ser varios,hoy vamos a centrarnos en como vaciar un poco el tamaño debido el AWR.
Lo que, lo primero que tendremos que hacer es ver cual es el componente que esta llenándonos el tablespace.
Para ello tenemos la consulta
set linesize 100;
column OCCUPANT_NAME format a20;
column OCCUPANT_DESC format a60;
column Mb format 999999.99
SELECT occupant_name,space_usage_kbytes/1024 Mb,occupant_desc
  FROM V$SYSAUX_OCCUPANTS
  order by space_usage_kbytes  desc;

OCCUPANT_NAME             MB OCCUPANT_DESC
-------------------- ------- ------------------------------------------------------------
SM/AWR                780.06 Server Manageability - Automatic Workload Repository
SM/OPTSTAT            333.00 Server Manageability - Optimizer Statistics History
LOGMNR                 91.63 LogMiner
XDB                    85.50 XDB
SM/ADVISOR             65.56 Server Manageability - Advisor Framework
WM                      6.38 Workspace Manager
SM/OTHER                6.25 Server Manageability - Other Components
SMON_SCN_TIME           5.31 Transaction Layer - SCN to TIME mapping
EXPRESSION_FILTER       3.88 Expression Filter System
JOB_SCHEDULER           2.81 Unified Job Scheduler
EM_MONITORING_USER      2.75 Enterprise Manager Monitoring User
SQL_MANAGEMENT_BASE     1.69 SQL Management Base Schema
PL/SCOPE                1.56 PL/SQL Identifier Collection
XSOQHIST                1.38 OLAP API History Tables
AO                      1.38 Analytical Workspace Object Table
LOGSTDBY                1.38 Logical Standby
STREAMS                 1.00 Oracle Streams
AUTO_TASK                .31 Automated Maintenance Tasks
ORDIM/ORDDATA            .00 Oracle Multimedia ORDDATA Components
ORDIM/ORDPLUGINS         .00 Oracle Multimedia ORDPLUGINS Components
ORDIM/SI_INFORMTN_SC     .00 Oracle Multimedia SI_INFORMTN_SCHEMA Components
HEMA
EM                       .00 Enterprise Manager Repository
TEXT                     .00 Oracle Text
ULTRASEARCH              .00 Oracle Ultra Search
ORDIM                    .00 Oracle Multimedia ORDSYS Components
SDO                      .00 Oracle Spatial
STATSPACK                .00 Statspack Repository
TSM                      .00 Oracle Transparent Session Migration User
XSAMD                    .00 OLAP Catalog
AUDIT_TABLES             .00 DB audit tables
ULTRASEARCH_DEMO_USE     .00 Oracle Ultra Search Demo User

Como podemos ver, son muchas las cosas que se guardan en SYSAUX, pero, en nuestro caso, está bastante claro que, la mayoría de la ocupación es debida a los AWR.
Nuestro siguientes pasos van a ser:
  • Determinar que es lo que nos ocupa el espacio
  • Mirar si la causa esta en la retención
  • Mirar si la causa está en los AWR guardados
  • Mirar si la causa está en las lineas “huerfanas” de las Active Session History
Nuestro objetivo va a ser liberar espacio dentro de SYSAUX , no disminuir el tamaño de este tablespace ya que, como decía al principio esto es prácticamente una misión imposible.

Determinar que es lo que ocupa espacio

El siguiente paso será el buscar la información del AWR, para ello el propio Oracle tiene una utilidad que podemos llamar desde sqlplus
 SQL> @$ORACLE_HOME/rdbms/admin/awrinfo.sql

Este sql nos genera un informe con unos apartados muy interesantes que nos servirán para encontrar de donde liberar espacio.

Mirar si la causa esta en la retención

************************************                                                                         
(2) Size estimates for AWR snapshots                                                                          
*************************************                                                                                                                                                                                    
| Estimates based on 60 mins snapshot INTERVAL:                                                               
|    AWR size/day                           31.0 MB (1,324 K/snap * 24 snaps/day)                             
|    AWR size/wk                           217.2 MB (size_per_day * 7) per instance                                                                                                                                     
| Estimates based on 24 snaps in past 24 hours:                                                               
|    AWR size/day                           31.0 MB (1,324 K/snap and 24 snaps in past 24 hours)              
|    AWR size/wk                           217.2 MB (size_per_day * 7) per instance                           
|
Aqui podemos ver el tamaño estimado que ocupa nuestra información de los AWR, en función del periodo de retencion que tengamos de los AWR tendremos la ocupación en la base de datos.
Cuando sabemos cuanto ocupa cada AWR y cuanto hacemos al día, tenemos que saber cuantos dias guardamos para ver si la ocupación es correcta, para ello haremos :
SQL> SELECT retention FROM dba_hist_wr_control;

RETENTION
---------------------------------------------------------------------------
+00007 00:00:00.0
En mi caso por ejemplo, la retencion es de 7 días.

Mirar si la causa está en los AWR guardados

Otro de los problemas que podemos tener es que el número de AWR que mantenemos guardados por razones históricas en la instancia, en el informe que acabamos de obtener también aparece un apartado con las últimas 50 snapshots de la base de datos, el eliminar imágenes antiguas también nos ayudará a liberar espacio.
  • Mirar si la causa está en las lineas “huerfanas” de las Active Session History
  • Algunas veces el Active Session History (ASH) guarda filas que no pertenecen a ningún AWR,esto hace que el ASH ocupe gran parte del espacio dedicado al AWR, la forma de saber si esto nos está sucediendo es mirar nuestro informe en el apartado
    **********************************
    (3a) Space usage by AWR components (per database)
    **********************************
    
    COMPONENT        MB  % AWR  KB_PER_SNAP MB_PER_DAY MB_PER_WEEK TABLE% : INDEX%                                
    --------- --------- ------ ------------ ---------- ----------- ----------------                               
    FIXED         131.5   50.6          670       15.7       109.9    52% : 48%                                   
    EVENTS         37.9   14.6          193        4.5        31.7    43% : 57%                                   
    SQLPLAN        25.0    9.6          127        3.0        20.9    72% : 28%                                   
    ASH            18.3    7.0           93        2.2        15.3    89% : 11%                                   
    SQL            11.0    4.2           56        1.3         9.2    60% : 40%                                   
    SPACE          10.3    4.0           53        1.2         8.6    61% : 39%                                   
    SQLTEXT         5.2    2.0           26        0.6         4.3    96% : 4%                                    
    SQLBIND         0.8    0.3            4        0.1         0.6    50% : 50%                                   
    RAC             0.6    0.2            3        0.1         0.5    50% : 50%                                   
    
    Si la línea de ASH ocupa mas de un 1% probablemente sea la causa de nuestra ocupación.
    Mediante la siguiente consulta podemos saber si es nuestro caso.
    SELECT COUNT(*) huerfanas
    FROM wrh$_active_session_history a
    WHERE NOT EXISTS
      (SELECT *
      FROM wrm$_snapshot
      WHERE snap_id       = a.snap_id
      AND dbid            = a.dbid
      AND instance_number = a.instance_number
      );
    
    
     HUERFANAS
    ----------
           116
    
    
    Si aparece alguna línea podemos borrarlas con
    delete  
    FROM wrh$_active_session_history a
    WHERE NOT EXISTS
      (SELECT *
      FROM wrm$_snapshot
      WHERE snap_id       = a.snap_id
      AND dbid            = a.dbid
      AND instance_number = a.instance_number
      );
    
    Con estas tres acciones, si elproblema de laocupación del SYSAUX es debido a el AWR tendremos que haberpodido liberar el espacio suficiente para que la base de datos pueda seguir trabajando sin problemas de espacio.
    Aún así, el tema de la ocupación del SYSAUX es un tema bastante complejo, con lo que, como siempre, el mejor sitio para buscar soluciones es soporte de Oracle, aquí tenéis un pequeño listado de algunas de las notas que puede que os aplique y cuyo contenido tenéis en la página de soporte
    • AWR Data Uses Significant Space in the SYSAUX Tablespace [ID 287679.1]
    • Suggestions if your SYSAUX Tablespace grows rapidly or too large [Document 1292724.1]
    • General Guidelines for SYSAUX Space Issues [Document 552880.1]
    • SYSAUX Grows Because Optimizer Stats History is Not Purged [Document 1055547.1]
    • Space issue in Sysaux tablespace due to Unexpected AWR size [Document 1218413.1]
    • Space Management In Sysaux Tablespace with AWR in Use [Document 287679.1]
    • SYSAUX Tablespace Grows Heavily Due To AWR [Document 852028.1]

    BORRAR NOTIFICACIONES ENTERPRISE MANAGER

    Si deseamos borrar todo el historial de notificaciones:
    SQL> begin
    2 delete from mgmt_current_severity;
    3 end;
    4 /
    PL/SQL procedure successfully completed.
    SQL> commit;
    Commit complete.

    begin
    delete from mgmt_current_severity;
    end;


    The Driving Table


    The table of interest in the SYSMAN schema is named MGMT_SEVERITY.
    USER is "SYSTEM"
    SQL> conn sysman/oracle
    Connected.
    USER is "SYSMAN"
    SQL> desc mgmt_severity
     Name                                      Null?    Type
     ----------------------------------------- -------- --------------
     TARGET_GUID                               NOT NULL RAW(16)
     METRIC_GUID                               NOT NULL RAW(16)
     KEY_VALUE                                 NOT NULL VARCHAR2(256)
     COLLECTION_TIMESTAMP                      NOT NULL DATE
     LOAD_TIMESTAMP                                     DATE
     SEVERITY_CODE                             NOT NULL NUMBER
     SEVERITY_TYPE                                      NUMBER
     SEVERITY_DURATION                                  NUMBER
     SEVERITY_GUID                                      RAW(16)
     ANNOTATED_FLAG                                     NUMBER
     NOTIFICATION_STATUS                                NUMBER
     MESSAGE                                            VARCHAR2(4000)
     MESSAGE_NLSID                                      VARCHAR2(64)
     MESSAGE_PARAMS                                     VARCHAR2(4000)
     ACTION_MESSAGE                                     VARCHAR2(4000)
     ACTION_NLSID                                       VARCHAR2(64)
     ACTION_MESSAGE_PARAMS                              VARCHAR2(4000)
     ADVISORY_ID                                        VARCHAR2(64)
     USER_NAME                                          VARCHAR2(64)
    

    Aside from the RAW datatypes, working with data in this table should be fairly straightforward, that is, once you know what to look for. The table’s primary key is a composite key, and uses TARGET_GUID, METRIC_GUID, KEY_VALUE, COLLECTION_TIMESTAMP, and SEVERITY_CODE.

    You won’t find the RAW values anywhere on the page, even if you look at the page’s source. If you try that approach, mainly as an exercise to see what the underlying HTML code looks like, all you’re going to see (at the bottom of the text editor page) are a few lines of code, with one of them stretching out well over 30,000 characters.

    The two best telltales in the table are KEY_VALUE and COLLECTION_TIMESTAMP. The KEY_VALUE values have a pattern to them. If the message is about a tablespace having crossed a space threshold, then the KEY_VALUE is simply the name of the tablespace. If the message is about SYS having logged on, the KEY_VALUE will be a mixture of “SYS” plus “_.” The recovery area message is identified by a value of RECOVERY AREA. The blocking message starts with SID, and the invalid objects in a schema begins with the schema name.

    For the most part, the date and time shown under Alert Triggered will appear as the value for COLLECTION_TIMESTAMP. Between that time and the “key values” in the KEY_VALUE column, you should be sufficiently armed to invoke a procedure named DELETE_CURRENT_SEVERITY in the EM_SEVERITY package.
    PROCEDURE DELETE_CURRENT_SEVERITY
     Argument Name                  Type                    In/Out Default?
     ------------------------------ ----------------------- ------ --------
     P_TARGET_GUID                  RAW                     IN
     P_METRIC_GUID                  RAW                     IN
     P_KEY_VALUE                    VARCHAR2                IN
    
    

    This procedure deletes data from a table named MGMT_CURRENT_SEVERITY.
      BEGIN
        DELETE FROM MGMT_CURRENT_SEVERITY
         WHERE target_guid = p_target_guid
           AND metric_guid = p_metric_guid
           AND key_value = p_key_value;
      END delete_current_severity;
    

    On the face of it, this approach seems like a safe way to go about clearing stale messages, but there is a better way, and that way is to delete directly from the MGMT_SEVERITY table and let the SEVERITY_DELETE trigger do all the work for you.

    Implementando Fast Connection Failover sobre Aplicaciones .NET

    Implementando Fast Connection Failover sobre Aplicaciones .NET

    Por Francisco Riccio
    Publicado en Marzo 2014
    Introducción
    Fast Connection Failover (FCF) es un mecanismo que ofrece un failover de conexión de base de datos a nuestras aplicaciones, el cual se ejecutará automáticamente cuando ocurra una indisponibilidad en la instancia conectada; siendo una acción transparente para los usuarios finales.
    Las librerías requeridas para el uso de FCF están disponibles desde la versión Oracle Client 10gR1, pero en el caso de ODP.NET están disponibles desde la versión 10gR2. Es importante resaltar que a partir de la versión Oracle Client 10gR2 se incluyó el feature de notificación de balanceo de carga sobre una base  de datos Oracle RAC a través de notificaciones FAN.
    FCF tiene las siguientes características:
    • Ofrece rápida detección de la indisponibilidad de una instancia e inicia la reconexión en otra disponible. La detección de dicha indisponibilidad no se da por eventos de TCP Timeouts sino mediante eventos recibidos por el Oracle RAC, siendo más rápido y eficiente.
    • Automáticamente realiza una limpieza de las conexiones conectadas sobre una instancia indisponible de base de datos antes de reingresarlas al pool.
    • En un ambiente en Oracle RAC, ODP.NET estará informado en todo momento sobre la carga actual de cada una de las instancias de base de datos, permitiendo que al abrir nuevas conexiones se reubiquen sobre la instancia menos congestionada. Asimismo reconoce cuando nuevos nodos son agregados al clúster y los considerará para la colocación de nuevas conexiones que se soliciten.
    FCF consigue una detección rápida de indisponibilidad y además enterarse de cada evento que ocurre en nuestra base de datos Oracle RAC mediante Fast Application Notification (FAN).
    FAN es un mecanismo de notificación que Oracle RAC utiliza para notificar a otros procesos sobre su nivel de servicio, disponibilidad y configuración. Estas notificaciones FAN son las que nuestra aplicación podrá recibir para tomar alguna acción. La publicación de estos eventos FAN se realiza mediante Oracle Notification Service (ONS).
    Se presenta la siguiente arquitectura:

    Figura 1
    En la figura 1 podemos apreciar que dependiendo del tipo de aplicación que tengamos, los mensajes FAN serán recibidos ya sea por un componente ONS o mediante una cola de mensajes en Oracle Advanced Queuing (AQ).
    Nuestra implementación que más adelante se documentará estará basado en un desarrollo sobre Microsoft .NET utilizando ODP.NET para el acceso de una base de datos Oracle RAC 12c compuesto de 2 nodos.
    Nuestra base de datos estará corriendo sobre una plataforma Oracle Linux v5.10 x64 bits y nuestra aplicación será de tipo cliente/servidor corriendo sobre clientes Windows 7 x64 bits.
    Adicionalmente contamos con un servidor DNS que resolverá las IPs de los hostnames solicitados, además por buena práctica, será responsable de devolver cualquiera de las 3 IP’s asociadas al IP SCAN de nuestra configuración de Oracle RAC 12c.
    La aplicación utilizará Oracle Data Access Components (ODAC) versión 12c de x64 bits como driver para el acceso a la base de datos.
    La arquitectura de nuestra solución será la siguiente:

    Figura 2
    Nota 1: Como consideración en nuestro diseño, no deberíamos implementar FCF y TAF juntos como mecanismo de failover de conexión para nuestras aplicaciones. Recordemos que TAF es útil cuando son aplicaciones que ejecutan muchas operaciones de lectura.

    Nota 2: A partir de la versión Oracle Database 12c, FCF ha sido extendido hacia Oracle Dataguard y Oracle GoldenGate para ODP.NET 12c a través de Global Data Services.

    Nota 3: Cuando un servicio de base de datos se detiene de manera manual las conexiones de base de datos que se encuentran en estado de ocio son cerradas y las que aún están en ejecución terminan su operación con normalidad. Este feature llamado (Planned Outage) solo está disponible para ODP.NET Unmanaged Driver.

    Nota 4: ODP.NET no soporta la distribución de conexiones de base de datos cuando un nuevo nodo inicia, sin embargo si soporta failover de conexión de base de datos y re-conectarlo al nuevo nodo si lo ve conveniente.


    Implementación

    Requisitos

    Paso 1.- Parámetro AQ_TM_PROCESSES > 0

    El parámetro aq_tm_process establece el número de procesos internos utilizados para la gestión de las colas en Oracle AQ.
    Debemos recordar que Oracle AQ será el repositorio que tendrá los mensajes FAN que deseamos recoger para ser notificados.

    Paso 2.- Habilitamos Advanced Queuing a nuestro servicio de base de datos (Opción –q true).
    srvctl  modify service –d PRD –s PROD –q true

    Procedemos a su validación:



    Nota
    : Para la versión Oracle Database 10gR2 podemos modificar el servicio con el siguiente script:
    SQL>  execute dbms_service.modify_service(service_name=>'PROD',aq_ha_notifications=>true);
    Paso 3.- Permisos sobre la cola de Oracle AQ sobre eventos FAN.
    SQL> execute  DBMS_AQADM.GRANT_QUEUE_PRIVILEGE('DEQUEUE','SYS.SYS$SERVICE_METRICS',  ' ');
    Aquí debemos utilizar el usuario de base de datos con el que nuestra aplicación se conectará.
    En el ejercicio a desarrollar, el usuario de base de datos que será utilizado por la aplicación para conectarse será: FRICCIO.

    Paso 4.- SQLNET.ORA
    El archivo SQLNET.ORA ubicado en la estación cliente debemos agregarle las siguientes entradas:

    SQLNET.OUTBOUND_CONNECT_TIMEOUT = 5 (Tiempo en segundos que tiene un cliente para establecer una conexión hacia una instancia de base de datos).
    SQLNET.TCP.CONNECT_TIMEOUT=3 (Tiempo en segundos para establecer una conexión TCP hacia la base de datos, este valor debe ser menor al parámetro SQLNET.OUTBOUND_CONNECT_TIMEOUT).
    El archivo SQLNET.ORA ubicado en las instancias de base de datos debemos agregarle la siguiente entrada como recomendación:
    SQLNET.EXPIRE_TIME=10 (Tiempo en segundos que se realizará un ping a las conexiones de base de datos con la finalidad de identificar conexiones huérfanas).
    Aplicación .NET
    La cadena de conexión de base de datos  debe contar con una correcta configuración, para nuestro caso hemos registrado la configuración en el archivo app.config.



       

    Analizaremos las características incluidas en la cadena de conexión.
    • Pooling, construirá un pool de conexión si su valor es true.
    • Min Pool Size & Max Pool Size, definen la mínima y máxima cantidad de conexiones de base de datos que tendrá el pool creado.
    • Validate Connection, valida si una conexión es válida cuando regresa al pool.
    • HA Events, permite recibir eventos en nuestra aplicación al recibir ODP.NET un evento FAN.
    • Load Balancing, habilita al pool de conexiones balancear las nuevas conexiones que ingresen acorde a cómo está la carga distribuida actualmente entre las instancias de base de datos basándose en los algoritmos definidos por el Load Balance Advisor (LBA) y Connection Load Balancing (CLB). Permitiendo que las aplicaciones reciban conexiones de una instancia que ofrece el mejor desempeño.
    • El usuario de base de datos debe ser el mismo que le hemos entregado permisos en la cola de mensajes de AQ descrito en la sección de Requisitos.
    Para implementar FCF en nuestra aplicación es de carácter obligatorio contar con las opciones: Pooling, HA Events y muy recomendable Load Balacing.

    Se recomienda la revisión del siguiente URL para obtener mayor información acerca de todas las opciones disponibles en la cadena de conexión:

    http://docs.oracle.com/cd/E51173_01/win.122/e17732/featConnecting.htm#ODPNT165

    Nota: ODP.NET 12c únicamente está certificado para sistemas operativos Windows Server 2012/2008R2/2008 y Windows 7. Para mayor información o actualización revisar en My Oracle Support (MOS) Nota: 726240.1 (Oracle Data Provider for .NET (ODP) Supported Configurations).
    Una vez definida la cadena de conexión de base de datos debemos programar el evento HAEventHandler(OracleHAEventArgs eventArgs), el cual se disparará ni bien se reciba un evento FAN del Oracle RAC.

    Podemos apreciar que parámetro eventArgs nos devuelve la información recibida del evento FAN. Para nuestro caso preguntamos si ha habido alguna caída en el servicio PROD, si es así, solicitaremos abrir de nuevo la conexión de base de datos y este será conectado automáticamente a una de las instancias sobrevivientes que publican el mismo servicio con el mejor desempeño.

    Nuestra aplicación a implementar tendrá como objetivo mostrar la instancia donde se ha establecido la conexión de base de datos y la hora actual en todo momento.

    Se presenta todo el código utilizado:


    Es importante observar que nosotros somos responsable del manejo de la conexión una vez que se haya disparado el evento al recibirse un mensaje FAN. FCF no creará conexiones por nosotros.
    Validando la aplicación:
    Al iniciar la aplicación veremos que se ha generado una conexión de base de datos a la instancia  PRD1.

    En la instancia 1 se evidencia que efectivamente se encuentra la sesión de base de datos.

     Luego procedemos a matar la instancia PRD1 con la finaldiad de validar que el failover de conexión se realice automáticamente.

    Veremos que la aplicación automáticamente comienza a responder sin problemas pero conectado a la instancia PRD2.

    En la instancia 2 se evidencia que efectivamente se encuentra la sesión de base de datos.



    Conclusiones


    Se puede apreciar que Oracle FCF complementa nuestras soluciones de Alta Disponibilidad proporcionándonos un failover de conexión de base de datos a nuestras aplicaciones; ocasionando que nuestros usuarios no perciban el incidente ocurrido en la base de datos.
    FCF permite que nuestras aplicaciones que utilizan pool de conexiones de base de datos se beneficien enormemente con el feature de carga de balanceo y actualizadas gracias a las notificaciones FAN, haciendo que nuestra aplicación sea más eficiente al ir distribuyendo las conexiones nuevas sobre las instancias más óptimas además que todo requerimiento de base de datos que envié la aplicación será atendida por conexiones que estén conectadas sobre las instancias que ofrecen mejor desempeño.

    Operaciones Online en Oracle 12.2 y 18c

    Operaciones Online en Oracle 12.2 y 18c

    Por Jorge Zorrilla
    Publicado en Noviembre 2018

    Revisado por Francisco Riccio





    Introducción
    A lo largo de los años, la base de datos Oracle ha ido evolucionando y ofreciendo nuevas opciones para una mejor administración.  Las funcionalidades con mayor impacto para la labor de los DBAs han sido las operaciones Online.  Gracias a las actividades online, podemos evitar largas ventanas de mantenimiento sobre ambientes productivos en horarios nocturnos o de fin de semana.
    Ya desde la versión Oracle 9i tuvimos acceso a operaciones online como:
    • CREATE INDEX.
    • REBUILD INDEX.


    En Oracle 12c Release 1, Oracle continúa mejorando las opciones online y añade nuevas operaciones de gran ayuda como:
    • DROP INDEX.
    • DROP CONSTRAINT.
    • ALTER INDEX UNUSABLE.
    • SET COLUMN UNUSED.
    • MOVE PARTITION & SUBPARTITION.


    Sin embargo, es a partir de Oracle 12c Release 2 donde se agregan las operaciones online de mayor impacto como:
    • MOVE TABLE.
    • SPLIT & MERGE PARTITION.
    • CONVERT NON-PARTITION TABLE TO PARTITION TABLE.


    En este artículo quiero explicar en detalle las operaciones online para Oracle 12cR2 y 18c; los casos de uso más comunes y algunas restricciones para cada tipo de operación.

    MOVE TABLE ONLINE.
    El comando nos permite mover una tabla de manera online agregando la opción ONLINE sobre ALTER TABLE.
    Lo mejor de esta operación es que no afecta el estado de los índices; por lo que es posible realizar desfragmentación de tablas sin la necesidad de una ventana de mantenimiento.
    Para nuestro ejemplo, creamos una tabla y le agregamos una gran cantidad de datos.  Posteriormente creamos su Primary Key y un índice sobre el campo código.
    SQL> create table music.BEATLES (id number, codigo number, fec_registro date, miembro 
    varchar2(42)) tablespace USERS;
    
    Table created.
    
    SQL> insert into music.BEATLES (
    select rownum, mod(rownum,1000), sysdate - mod(rownum,100),
    decode(mod(rownum,10),1,'PAUL',2,'JOHN',3,'RINGO',4,'GEORGE',5,'STUART',6,'PETE',7,'NORMAN',
    8,'TOMMY',9,'JIMMIE','THE BEATLES')
    from dual connect by level <= 1700000);
    
    1700000 rows created.
    
    SQL> commit;
    
    Commit complete.
    


    SQL> alter table music.BEATLES ADD CONSTRAINT PK_BEATLES PRIMARY KEY (id);
    
    Table altered.
    
    SQL> create index music.IDX1_BEATLES on music.BEATLES (codigo) tablespace USERS;
    
    Index created.
    

    Finalmente verificamos las características de la tabla y sus índices.
    SQL> select owner, table_name, tablespace_name from dba_tables where table_name='BEATLES';
    
    OWNER   TABLE_NAME     TABLESPACE_NAME  COMPRESS
    ------- -------------- ---------------- --------
    MUSIC   BEATLES        USERS  DISABLED
    
    SQL> select OWNER,INDEX_NAME,STATUS, CLUSTERING_FACTOR, NUM_ROWS, TABLESPACE_NAME from 
    dba_indexes where table_name='BEATLES';
    
    OWNER   INDEX_NAME     STATUS   CLUSTERING_FACTOR   NUM_ROWS TABLESPACE_NAME
    ------- -------------- -------- ----------------- ---------- ----------------
    MUSIC   PK_BEATLES     VALID                 6800    1700000 USERS
    MUSIC   IDX1_BEATLES   VALID              1700000    1700000 USERS
      

    Procedemos a realizar el movimiento de la tabla al tablespace DATA y verificamos que los índices se mantienen validos después del movimiento.
    SQL> ALTER TABLE music.BEATLES MOVE ONLINE tablespace DATA;
    
    Table altered.
    
    SQL> select owner, table_name, tablespace_name from dba_tables where table_name='BEATLES';
    
    OWNER    TABLE_NAME     TABLESPACE_NAME
    -------- -------------- ----------------
    MUSIC    BEATLES        DATA
    
    SQL> select OWNER,INDEX_NAME,STATUS, CLUSTERING_FACTOR, NUM_ROWS, TABLESPACE_NAME from 
    dba_indexes where table_name='BEATLES';
    
    OWNER    INDEX_NAME     STATUS   CLUSTERING_FACTOR   NUM_ROWS TABLESPACE_NAME
    -------- -------------- -------- ----------------- ---------- --------
    MUSIC    PK_BEATLES     VALID                13524    1700000 USERS
    MUSIC    IDX1_BEATLES   VALID              1579897    1700000 USERS
      

    Podemos utilizar el movimiento de una tabla de manera Online para activar la compresión e incluir la reconstrucción de los índices (sobre diferentes tablespaces). Todo ejecutado desde el mismo comando con la opción UPDATE INDEXES. 
    SQL>  ALTER TABLE music.BEATLES MOVE ONLINE COMPRESS tablespace DATA
        UPDATE INDEXES (
        music.PK_BEATLES tablespace DATA,
        music.IDX1_BEATLES tablespace USERS);
    
    Table altered.
    
    SQL> select owner, table_name, tablespace_name,COMPRESSION from dba_tables where 
    table_name='BEATLES';
    
    OWNER     TABLE_NAME    TABLESPACE_NAME    COMPRESS
    --------- ------------- ------------------ --------
    MUSIC     BEATLES       DATA               ENABLED
    
    SQL> select OWNER,INDEX_NAME,STATUS, CLUSTERING_FACTOR, NUM_ROWS, TABLESPACE_NAME from 
    dba_indexes where table_name='BEATLES';
    
    OWNER    INDEX_NAME     STATUS   CLUSTERING_FACTOR   NUM_ROWS TABLESPACE_NAME
    -------- -------------- -------- ----------------- ---------- ---------------
    MUSIC    PK_BEATLES     VALID                10846    1700000 DATA
    MUSIC    IDX1_BEATLES   VALID              1386859    1700000 USERS
      

    Finalmente podemos reorganizar la tabla de tal manera que valor de Clustering Factor se reduzca para columnas indexadas (diferentes al Primary Key). Utilizamos el concepto de CLUSTERING ATTRIBUTE.
    SQL> alter table music.BEATLES ADD CLUSTERING by linear order(codigo) without 
    materialized zonemap;
    
    Table altered.
    
    SQL> alter table music.BEATLES MOVE ONLINE NOCOMPRESS tablespace DATA UPDATE INDEXES;
    
    Table altered.
    
    SQL> select OWNER,INDEX_NAME,STATUS, CLUSTERING_FACTOR, NUM_ROWS, TABLESPACE_NAME from 
    dba_indexes where table_name='BEATLES';
    
    OWNER    INDEX_NAME     STATUS   CLUSTERING_FACTOR   NUM_ROWS TABLESPACE_NAME
    -------- -------------- -------- ----------------- ---------- ---------------
    MUSIC    PK_BEATLES     VALID              1687292    1700000 DATA
    MUSIC    IDX1_BEATLES   VALID                 6140    1700000 USERS
      

    Es importante indicar que el movimiento de tablas Online tiene las siguientes restricciones:
    • No es posible ejecutar este comando sobre tablas particionada de tipo IOT y tablas que contengan índices de tipo Domain.
    • No se puede realizar DML con paralelismo e inserciones masivas (direct path) mientras se ejecuta el movimiento Online.
    • No es posible ejecutar este comando para tablas de tipo IOT con columnas LOB, VARRAY o de tipo User-Defined.




    CONVERTIR NON-PARTITIONED TABLE TO PARTITIONED TABLE.
    En versiones anteriores es posible convertir una tabla no particionada a particionada con comandos como Exchange Partition o DBMS_Redefinition, sin embargo, estos métodos pueden llegar a ser complejos y con validaciones previas a la conversión.
    A partir de Oracle 12cR2 es posible convertir una tabla no particionada a particionada a través de un solo comando y de manera Online.  Podemos definir diferentes características para cada partición que se vaya a crear.
    SQL> alter table music.BEATLES MODIFY PARTITION BY RANGE (fec_registro) (
         partition T1_07_2018 values less than (TO_DATE('01-AUG-2018','DD-MON-YY
    YY')) tablespace USERS COMPRESS,
         partition T2_08_2018 values less than (TO_DATE('01-SEP-2018','DD-MON-YY
    YY')) tablespace DATA RESULT_CACHE (mode default),
         partition T3_09_2018 values less than (TO_DATE('01-OCT-2018','DD-MON-YY
    YY')) tablespace USERS,
         partition T4_10_2018 values less than (TO_DATE('01-NOV-2018','DD-MON-YY
    YY')) tablespace DATA
    ) ONLINE;
    
    Table altered.
      

    Si la tabla contiene índices, es posible definir el particionamiento de cada índice con la opción UPDATE INDEXES.  Si esta opción no se define (como en el comando anterior) los índices son redefinidos de la siguiente manera:
    • Índices NonUnique se convierten en LOCAL INDEXES.
    • Índices Unique y que forman parte del rango de partición se convierten en LOCAL INDEXES.
    • Índices Unique y que no forman parte del rango de partición se convierten en GLOBAL INDEXES.


    Para nuestro ejemplo vamos a definir diferentes tipos de particionamiento por cada índice.
    SQL> alter table music.BEATLES MODIFY PARTITION BY RANGE (fec_registro) (
         partition T1_07_2018 values less than (TO_DATE('01-AUG-2018','DD-MON-YY
    YY')) tablespace USERS READ ONLY,
         partition T2_08_2018 values less than (TO_DATE('01-SEP-2018','DD-MON-YY
    YY')) tablespace DATA READ ONLY,
         partition T3_09_2018 values less than (TO_DATE('01-OCT-2018','DD-MON-YY
    YY')) tablespace USERS,
         partition T4_10_2018 values less than (TO_DATE('01-NOV-2018','DD-MON-YY
    YY')) tablespace DATA
     ) ONLINE
     UPDATE INDEXES(
     music.PK_BEATLES GLOBAL PARTITION BY HASH (ID) PARTITIONS 4,
     music.IDX1_BEATLES LOCAL
     );
    
    Table altered.
      

    Finalmente es posible tomar solo una parte de la información de la tabla para el particionamiento. Usamos la opción INCLUDING ROWS.  Esta opción borra los registros que no cumplen con la condición definida.
    Para nuestro ejemplo vamos a particionar la tabla, pero solo incluimos los valores a partir de agosto 2018.  Se puede observar que los valores antes de dicha fecha son eliminados de la tabla.
    SQL> alter table music.BEATLES MODIFY PARTITION BY RANGE (fec_registro) (
         partition T2_08_2018 values less than (TO_DATE('01-SEP-2018','DD-MON-YY
    YY')) tablespace DATA COMPRESS,
         partition T3_09_2018 values less than (TO_DATE('01-OCT-2018','DD-MON-YY
    YY')) tablespace USERS,
         partition T4_10_2018 values less than (TO_DATE('01-NOV-2018','DD-MON-YY
    YY')) tablespace USERS
     ) ONLINE
     UPDATE INDEXES(
     music.PK_BEATLES GLOBAL,
     music.IDX1_BEATLES LOCAL
     )
     INCLUDING ROWS WHERE fec_registro >= TO_DATE('01-AUG-2018','DD-MON-YYYY'); 
    
    Table altered.
    
    SQL> select fec_registro, count(1) 
         from music.BEATLES 
         where fec_registro < TO_DATE('01-AUG-2018','DD-MON-YYYY') 
         group by fec_registro;
    
    no rows selected
      

    La conversión a tabla particionada de manera Online también tiene algunas restricciones como:
    • No es posible ejecutar este comando sobre tablas de tipo IOT.
    • No se pude utilizar el comando sobre tablas que poseen índices de tipo Domain.
    • No es posible particionar una tabla hija de tipo Reference-Partitioned de manera Online.




    MERGE & SPLIT ONLINE
    Una vez que se tiene una tabla particionada, es posible realizar tareas de mantenimiento como MERGE o SPLIT de manera online. 
    Estas operaciones requieren de un bloqueo de tipo X DML sobre las particiones involucradas, es por ello que ambas operaciones son completadas sólo cuando todos los DML, iniciados antes de la operación online, finalizan.
    Verificamos las particiones de nuestra tabla.
    SQL> select TABLE_OWNER,  TABLE_NAME, PARTITION_NAME,PARTITION_POSITION, NUM_ROWS from 
    dba_tab_partitions where TABLE_NAME='BEATLES';
    
    TABLE_OWNE TABLE_NAME           PARTITION_ PARTITION_POSITION   NUM_ROWS
    ---------- -------------------- ---------- ------------------ ----------
    MUSIC      BEATLES              T1_07_2018                  1     510000
    MUSIC      BEATLES              T2_08_2018                  2     527000
    MUSIC      BEATLES              T3_09_2018                  3     510000
    MUSIC      BEATLES              T4_10_2018                  4     153000
      

    Desde la versión Oracle 12cR1 es posible realizar SPLIT y MERGE de múltiples particiones.  A partir de Oracle 12cR2 es posible realizar dichas operaciones múltiples de manera Online.
    La operación SPLIT se puede realizar Online a partir de Oracle 12cR2, mientras que la operación MERGE solo se puede realizar de manera Online a partir de la versión 18c.
    Connected to:
    Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
    
    SQL> alter table music.BEATLES
         MERGE PARTITIONS T1_07_2018, T2_08_2018 INTO PARTITION T12_07_08_2018
         ONLINE UPDATE INDEXES;
         ONLINE UPDATE INDEXES
         *
    ERROR at line 3:
    ORA-14020: this physical attribute may not be specified for a table partition
    
    SQL> alter table music.BEATLES
         MERGE PARTITIONS T1_07_2018, T2_08_2018 INTO PARTITION T12_07_08_2018;
    
    Table altered.
    
    SQL> alter table music.BEATLES SPLIT PARTITION T12_07_08_2018 at (TO_DATE(
    '01-AUG-2018','DD-MON-YYYY'))
    INTO (PARTITION T1_07_2018, PARTITION T2_08_2018)
    ONLINE UPDATE INDEXES;
    
    Table altered.
      

    Connected to:
    Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
    Version 18.1.0.0.0
    
    SQL> alter table music.BEATLES
         MERGE PARTITIONS T1_07_2018, T2_08_2018 INTO PARTITION T12_07_08_2018
         ONLINE UPDATE INDEXES;
    
    Table altered.
      




    EXTRA: MOVE DATAFILE ONLINE
    La opción de mover datafiles de manera Online es una funcionalidad presente desde la versión Oracle 12c Release 1, sin embargo, me pareció importante agregarla como una funcionalidad extra debido su importancia en tareas de mantenimiento como:
    • Migración de Filesystem a ASM o viceversa.
    • Reorganización de datafiles en diferentes Filesystems o Diskgroups.

    SQL>  alter database move datafile '+DATA/APEXDB/DATAFILE/sysaux.304.977269941' to 
    '/u02/oradata/apexdb/sysaux_01.dbf';
    
    Database altered.
    
    SQL> alter database move datafile '/u02/oradata/apexdb/sysaux_01.dbf' to '+DATA';
    
    Database altered.
      

    • Renombramiento de datafiles.
    SQL> alter database move datafile '+DATA/APEXDB/DATAFILE/data.263.989013263' to 
    '+DATA/APEXDB/DATAFILE/DATA_01.dbf';
    
    Database altered.
      

    ORA-03113 - ORA-00205

    Para solucionarlo, iniciaremos la base de datos en modo nomount con:
    startup nomount
    Y cambiaremos su estado a mount con:
    alter database mount;



    Solucionar error ORA-03113 end-of-file on communication channel en Oracle 11g

    A continuación haremos un clear para cada grupo de archivelog de nuestra base de datos, ejecutando:
    alter database clear unarchived logfile group 1;
    alter database clear unarchived logfile group 2;
    alter database clear unarchived logfile group 3; 

    ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 3 UNRECOVERABLE DATAFILE;


    shutdown immediate;
    Una vez detenida la iniciaremos de forma normal con el comando:
    startup;



    Solucionar error ORA-03113 end-of-file on communication channel en Oracle 11g


    select status from v$instance;

    ASM FLEX CLUSTER ODA

    The prerequisites are that the OCR files, ASM parameter file and ASM password file are stored in an ASM disk group with asm.compatible set to at least 12.1.  We will confirm the ASM cluster mode before we begin and after we have finished.
    [oracle@h1-o12-cl1 ~]$ . oraenv
    ORACLE_SID = [oracle] ? +ASM1
    The Oracle base remains unchanged with value /u01/app/oracle
    [oracle@h1-o12-cl1 ~]$ asmcmd showclustermode
    ASM cluster : Flex mode disabled

    Oracle Database 12.2: Reportes AWR a nivel PDB

    Oracle Database 12.2: Reportes AWR a nivel PDB



    Por Sebastián D’Alessandro
    Publicado en Febrero 2018


    Revisado por Lorenzo Mota


    Introducción

    Desde su aparición en Oracle Database 10g, Automatic Workload Repository (AWR) ha ido evolucionando constantemente con el correr de las versiones.
    Oracle 12c introdujo un gran cambio en la arquitectura de la base de datos incorporando el concepto de “multitenant”.  En el primer release de 12c, los reportes de AWR solamente pueden ser generados a nivel “Container Database” (CDB). Esto nos impide, en cierta manera, poder analizar en profundidad el comportamiento de determinadas PDBs puntuales.
    La versión 12.2 introduce una notable mejora en AWR,  la capacidad de poder correr snapshots  tanto a nivel CDB como de PDB cuando trabajamos en ambientes “multitenant”.
    Esta nueva característica nos permite un diagnóstico más granular de problemas de performance focalizados en una PDB en particular, situación que resulta sumamente interesante y útil en soluciones DBaaS donde se espera que el rol de DBA tienda a ser el de un “pDBA” ( Pluggable Database Administrator), es decir un DBA responsable de la administración de una o varias PDBs en particular, pero que a nivel físico comparten recursos con otras en el mismo CDB.
    Los reportes AWR a nivel PDB, están basados en la recolección de estadísticas que resultan útiles para evaluar el desempeño de una “Pluggable Database”, estos datos son recopilados siempre y cuando dicha PDB esté abierta en la base de datos “Container” (CDB) al momento de la toma del snapshot.
    La información de AWR a nivel CDB es almacenada en el tablespace SYSAUX del CDB$ROOT y los snapshots de cada PDB en su correspondiente tablespace SYSAUX.
    Podríamos decir entonces, que a partir de ahora tenemos en “multitenant” dos niveles de visualización e información en los reportes de AWR, uno a nivel general de “Container”  y otro particular para cada PDB.
    Los snapshots a nivel CDB incluyen estadísticas correspondientes al CDB, adicionando además información de todas las PDBs que éste contiene, por ejemplo: “ASH”, “SQL statistics”, “file statistics”, etc.
    A nivel PDB, los snapshots de AWR recopilan estadísticas de la “Pluggable Database” y suman también algunas estadísticas globales que pueden resultar útiles para el diagnóstico de problemas puntuales en esa base de datos. El administrador de la PDB puede realizar determinadas operaciones de gestión a ese nivel, por ejemplo configurar el periodo de retención, agendar y depurar snapshots, realizar capturas manuales, etc.
    Algunas tareas de administración de snapshots a nivel CDB o PDB, como por ejemplo creación y depuración,  pueden ser realizadas tanto de forma “manual” como  “automática”.
    En un ambiente “multitenant”, podemos entonces crear manualmente snapshots en cualquiera de los dos niveles según sea necesario.
    En este artículo, vamos a ejemplificar operaciones de captura de snapshots y generación de reportes utilizando un “Container Database” llamado CDB12CR2 el cual contiene dentro una PDB con nombre PDB12CR2.



    La siguiente salida muestra la estructura de la misma con sus correspondientes IDs:
    SQL>  select name, con_id, dbid, con_uid, guid from v$containers 
          order by con_id;
      
      NAME         CON_ID       DBID     CON_UID GUID
      --------  ---------- ---------- ---------- --------------------------------
      CDB$ROOT          1  2233049298          1 4700A987085A3DFAE05387E5E50A8C7B
      PDB$SEED          2   806654536  806654536 4B07A0A8F95D27C7E053B800A8C0A206
      PDB12CR2          3  2086124034 2086124034 4B07B077947A2E0AE053B800A8C0F1F0



    Por defecto, los snapshots  automáticos de AWR sólo están configurados para correr a nivel CDB. Oracle recomienda que en los PDBs sean ejecutados de forma manual, y sólo en los intervalos de tiempo donde sea necesario realizar el análisis (ver nota Doc ID 2295998.1 de MOS).
    No obstante esto, es posible automatizar “captura” en las PBDs configurando el parámetro AWR_PDB_AUTOFLUSH_ENABLED en TRUE (por defecto se encuentra deshabilitado).



    Generación de snapshots



    Veamos entonces como realizar la toma de snapshots AWR utilizando ambos métodos (automático y manual):


    1-Método Automático:
    1) Configuramos primero el parámetro  awr_pdb_autoflush_enabled=true a nivel PDB:


    Nos conectamos a la PDB:
    SQL> alter session set container=PDB12CR2;
    
    Session  altered.



    Verificamos el valor del parámetro:
    SQL> show parameter awr_pdb_autoflush_enabled
    
    NAME                                  TYPE        VALUE
    ------------------------------------  ----------- ------------------------------
    awr_pdb_autoflush_enabled             boolean     FALSE



    Modificamos el valor:
    SQL> alter system set  awr_pdb_autoflush_enabled=true;
    
    System  altered.
    
    SQL>  show parameter awr_pdb_autoflush_enabled
    
    NAME                                  TYPE        VALUE
    ------------------------------------  ----------- ------------------------------
    awr_pdb_autoflush_enabled             boolean     TRUE



    2) Configuramos correctamente el intervalo de los snapshots de AWR (Si bien esto es algo que no está muy difundido en notas técnicas, resulta un aspecto crítico):

    SQL>  select * from cdb_hist_wr_control;
    
      DBID        SNAP_INTERVAL     RETENTION         TOPNSQL  CON_ID
      ----------  ----------------- ----------------- -------- ------
      2086124034  +40150 00:01:00.0 +00008 00:00:00.0  DEFAULT      3
    
      SQL> execute dbms_workload_repository.modify_snapshot_settings(interval  => 60);
      
      PL/SQL  procedure successfully completed.
      
      SQL>  select * from cdb_hist_wr_control;
    
      DBID        SNAP_INTERVAL     RETENTION         TOPNSQL  CON_ID
      ----------  ----------------- ----------------- -------- ------
      2086124034  +00000 01:00:00.0 +00008 00:00:00.0  DEFAULT      3




    3) Establecemos también AWR_SNAPSHOT_TIME_OFFSET en 1000000 para evitar problemas de performance cuando múltiples “Pluggable Databases” estén creando snapshots en simultáneo.
    Podemos ver más información en la documentación: “Oracle Database 12c Release 2 Database Reference (1.26 AWR_SNAPSHOT_TIME_OFFSET)”
    http://docs.oracle.com/database/122/REFRN/AWR_SNAPSHOT_TIME_OFFSET.htm#REFRN10325


    Debemos tener en cuenta que esta modificación hay que realizarla a nivel del CDB$ROOT.
    SQL> alter session set container=CDB$ROOT;
    
    Session  altered.
    
    SQL> alter system set  AWR_SNAPSHOT_TIME_OFFSET=1000000;
    
    System  altered.




    4) Finalmente, al ya estar configurada la ejecución automática, debemos esperar 1-2 horas para que los “snaps” sean tomados. Luego, si podemos generar un reporte.
    SQL>  select SNAP_ID, DBID, STARTUP_TIME,  BEGIN_INTERVAL_TIME, END_INTERVAL_TIME, CON_ID 
          from awr_pdb_snapshot;
    
    
    SNAP_ID       DBID STARTUP_TIME                   BEGIN_INTERVAL_TIME            
    END_INTERVAL_TIME,      CON_ID
    ----------  ---------- ------------------------------ ------------------------------ 
     ------------------------------ ----------
       1 2086124034 04-JAN-18 08.53.03.000 AM      04-JAN-18 03.35.35.929 PM      
    04-JAN-18 03.52.44.978 PM               3
        2 2086124034 04-JAN-18 08.53.03.000  AM      04-JAN-18 03.52.44.978 PM      
    04-JAN-18 04.54.52.399 PM               3 




    2-Método Manual:
    1) Nos conectamos a la PDB:
    SQL>  connect / as sysdba
    Connected.
    
    SQL>  alter session set container= PDB12CR2;
    Session  altered.



    2) Ejecutamos el procedimiento para la creación manual del snapshot:
    SQL> exec  dbms_workload_repository.create_snapshot();
    
    PL/SQL  procedure successfully completed.



    En la siguiente salida podemos ver el “snap” generado:
    SNAP_ID       DBID STARTUP_TIME                   BEGIN_INTERVAL_TIME            
    END_INTERVAL_TIME                  CON_ID
    ----------  ---------- ------------------------------ ------------------------------  
    ------------------------------ ----------
         1 2086124034 04-JAN-18 08.53.03.000  AM      04-JAN-18 03.35.35.929 PM      
      04-JAN-18 03.52.44.978 PM               3
        2 2086124034 04-JAN-18 08.53.03.000  AM      04-JAN-18 03.52.44.978 PM      
      04-JAN-18 04.54.52.399 PM               3 
             3 2086124034 04-JAN-18 08.53.03.000  AM    04-JAN-18 04.54.52.399 PM      
      04-JAN-18 04.57.02.760 PM               3


    Es importante tener en cuenta que los ID de snapshots  generados a nivel PDB, pueden llegar a diferir de los generados en el CDB cuando la captura a nivel PDB es realizada de forma manual.
    Podemos ver entonces los datos de AWR a nivel CDB en las vistas AWR_ROOT_xxx  y a nivel PDB (“Pluggable Databases” abiertas en el momento de la captura del snapshot) en las vistas AWR_PDB_xxx;
    Una PDB tiene la capacidad de poder transportar sus propios datos de AWR cuando se realiza una operación de “unplug/plug” desde un CDB a otro. Los “Container Databases” targets tiene la capacidad de diferenciar entre los datos antiguos de AWR (que son transportados junto con la PDB) y los nuevos datos AWR capturados después de la operación de “plug”.
    Los “snaps” propios de una PDB tienen un ID único, el cual no está relacionado con los snapshots del CDB.
    De esta manera las operaciones de “pluging” y “unpluging” de una PDB en un “Container Database” no afectan la información de AWR almacenada en la PDB.



    Gestión de la seguridad



    El administrador del CDB, si lo cree conveniente,  puede llegar a utilizar “PDB lockdown profiles” para deshabilitar la funcionalidad de AWR en una o varias PDBs puntuales.
    La manera de realizar esto, es ejecutando la siguiente sentencia en la PDB :
    SQL> alter  lockdown profile profile_name disable feature=('AWR_ACCESS');



    Una vez deshabilitada la funcionalidad en una PDB, ya no se podrán realizar operaciones relacionadas con snapshots en ella.
    Si se requiere habilitar nuevamente AWR a nivel PDB, se debe ejecutar la sentencia que mostramos a continuación:
    SQL> alter  lockdown profile profile_name enable feature=('AWR_ACCESS');



    Generación de reportes AWR



    Existen varias maneras de obtener un reporte de AWR, tanto a nivel CDB como PDB. La dos principales son utilizando “Cloud Control” y los scripts correspondientes provistos durante la instalación del motor.

    En nuestro caso veremos ejemplos de cómo utilizar los scripts desde línea de comando.
    Tal como mencionamos anteriormente, podemos generar reportes tanto a nivel CDB como PDB. El informe AWR obtenido en un PDB, no difiere mucho a un reporte que haya sido generado en la CDB original. Simplemente la información que contiene está acotada a esa base de datos en particular.
    Veamos primero como se genera un reporte a nivel CDB (Similar a 12cR1).
    Generación del reporte en el CDB:
    Nos conectamos al root del CDB y ejecutamos el script “awrrpt”.
    Principalmente debemos indicar:
    • Tipo de reporte: (tenemos tres opciones):
    • 'html':            HTML format (default)
    • 'text':             Text format
    • 'active-html': Includes Performance Hub active report
    • Intervalo de “snaps” a utilizar
    • Nombre del reporte
    Nota: El reporte será generado en el directorio donde nos encontremos parados.
    SQL> @?/rdbms/admin/awrrpt
    
    Specify  the Report Type
    ~~~~~~~~~~~~~~~~~~~~~~~
    AWR  reports can be generated in the following formats.  Please enter the
    name  of the format at the prompt.  Default  value is 'html'.
    
    'html'          HTML format (default)
    'text'          Text format
    'active-html'   Includes Performance Hub active report
    
    Enter  value for report_type: html
    old   1: select 'Type Specified:  ',lower(nvl('&&report_type','html')) report_type from dual
    new   1: select 'Type Specified:  ',lower(nvl('html','html')) report_type from dual
    
    Type  Specified:  html
    
    old   1: select '&&report_type'  report_type_def from dual
    new   1: select 'html' report_type_def from dual
    
    
    old   1: select '&&view_loc' view_loc_def  from dual
    new   1: select 'AWR_PDB' view_loc_def from dual
    
    
    
    Current  Instance
    ~~~~~~~~~~~~~~~~
    DB  Id          DB Name        Inst Num       Instance       Container Name
    --------------  -------------- -------------- -------------- --------------
    2233049298      CDB12CR2                    1  cdb12cr2       CDB$ROOT
    
    
    Instances  in this Workload Repository schema
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    DB Id         Inst Num   DB Name      Instance     Host
    ------------  ---------- ---------    ----------   ------
    * 2233049298     1       CDB12CR2     cdb12cr2     server01.loc
    
    Using  2233049298 for database Id
    Using          1 for instance number
    
    Specify  the number of days of snapshots to choose from
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Entering  the number of days (n) will result in the most recent
    (n)days of snapshots being listed. Pressing  without
    specifying  a number lists all completed snapshots.
    
    
    Enter  value for num_days:
    
    Listing  all Completed Snapshots
    Instance      DB Name      Snap Id       Snap Started    Snap Level
    ------------  ------------ ---------- ------------------ ----------
    cdb12cr2      CDB12CR2            18  03 Jan 2018 10:13    1
            19  03 Jan 2018 11:00    1
           20  03 Jan 2018 11:54    1
           21  03 Jan 2018 13:00    1
          22  03 Jan 2018 14:00    1
          23  03 Jan 2018 15:00    1
          24  03 Jan 2018 16:00    1
          25  03 Jan 2018 17:00    1
          26  03 Jan 2018 18:00    1
          27  03 Jan 2018 19:00    1
            28  04 Jan 2018 09:04    1
          29  04 Jan 2018 10:00    1
          30  04 Jan 2018 11:00    1
          31  04 Jan 2018 12:00    1
          32  04 Jan 2018 13:00    1
          33  04 Jan 2018 14:00    1
          34  04 Jan 2018 15:00    1
          35  05 Jan 2018 05:59    1
          36  05 Jan 2018 08:11    1
          37  05 Jan 2018 09:00    1
          38  05 Jan 2018 10:00    1
          39  05 Jan 2018 11:00    1
          40  05 Jan 2018 12:00    1
          41  05 Jan 2018 13:01    1
          42  05 Jan 2018 14:00    1
          43  05 Jan 2018 15:00    1
    
    Specify  the Begin and End Snapshot Ids
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Enter  value for begin_snap: 42
    Begin  Snapshot Id specified: 42
    
    Enter  value for end_snap: 43
    
    Specify  the Report Name
    ~~~~~~~~~~~~~~~~~~~~~~~
    The  default report file name is awrrpt_1_42_43.html.  To use this name,
    press   to continue, otherwise enter an alternative.
    
    Enter  value for report_name: cdb12cr2_42_43.html
    
    #######
    #######  < parte de la salida suprimida >
    #######
    
    Report  written to cdb12cr2_42_43.html
    SQL>



    Generación a nivel PDB:
    En el reporte a nivel PDB, la cabecera del mismo identifica la PDB desde la cual se está emitiendo el reporte. Además como ocurre en los reportes tradicionales, se indica cuáles son los snapshots involucrados, los que en este caso corresponden a la “pluggable” y no al “root”.
    Los snapshosts pueden ser mantenidos (creados y depurados) de la misma manera que ocurre con los snapshots del CDB.
    Es importante aclarar,  que la información relacionada con los snaps de AWR para la PDB se encuentra en la vista AWR_PDB_SNAPSHOT y no en la DBA_HIST_SNAPSHOT.
    Para le generación del reporte, es necesario estar explícitamente conectado a la PDB en cuestión:


    Procedimiento
    Nos conectamos primero a la PDB:
    SQL>  alter session set container= PDB12CR2;
    
    Session  altered.
    Verificamos:
    SQL>  show con_name
    
    NAME_COL_PLUS_PDB_CONTAINER
    ------------------------------------------------------------------------------
    PDB12CR2



    Luego ejecutamos el script de generación al igual que en el caso anterior:
    Nuevamente indicamos los tres datos principales que nos son solicitados:
    • Tipo de reporte:
    • 'html':             HTML format (default)
    • 'text':              Text format
    • 'active-html':  Includes Performance Hub active report
    • Intervalo de snaps
    • Nombre del reporte.
    Además en este caso debemos indicar la ubicación de los datos AWR. Esta debe ser AWR_PDB.
    En la Figura 1 vemos de que forma nos es requerida esa especificación:
        Specify the location of AWR Data
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        AWR_ROOT - Use AWR data from root (default)
        AWR_PDB - Use AWR data from PDB
        Enter value for awr_location: AWR_PDB


    Figura 1. Indicar “location” de los datos de AWR en AWR_PDB


    Ejecutamos el script awrrpt:
    SQL> @?/rdbms/admin/awrrpt
    Specify  the Report Type
    ~~~~~~~~~~~~~~~~~~~~~~~
    AWR  reports can be generated in the following formats.  Please enter the
    name  of the format at the prompt.  Default  value is 'html'.
    
    'html'          HTML format (default)
    'text'          Text format
    'active-html'   Includes Performance Hub active report
    
    Enter  value for report_type: html
    
    Type  Specified:  html
    
    Specify  the location of AWR Data
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    AWR_ROOT  - Use AWR data from root (default)
    AWR_PDB  - Use AWR data from PDB
    Enter  value for awr_location: AWR_PDB
    
    Location  of AWR Data Specified: AWR_PDB
    
    
    
    Current  Instance
    ~~~~~~~~~~~~~~~~
    DB  Id          DB Name        Inst Num       Instance       Container Name
    --------------  -------------- -------------- -------------- --------------
    2086124034      CDB12CR2                    1  cdb12cr2       PDB12CR2
    
    
    Root  DB Id      Container DB Id AWR DB Id
    ---------------  --------------- ---------------
    2233049298      2086124034      2086124034
    
    
    Instances  in this Workload Repository schema
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    DB Id         Inst Num   DB Name      Instance     Host
    ------------  ---------- ---------    ----------   ------
    2086124034        1      CDB12CR2     cdb12cr2     server01.loc
    
    Using  2086124034 for database Id
    Using          1 for instance number
      
    
    Specify  the number of days of snapshots to choose from
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Entering  the number of days (n) will result in the most recent
    (n)  days of snapshots being listed.  Pressing   without
    specifying  a number lists all completed snapshots.
    
    
    Enter  value for num_days: 1
    
    Listing  the last day's Completed Snapshots
    Instance      DB Name      Snap Id       Snap Started    Snap Level
    ------------  ------------ ---------- ------------------ ----------
    
    cdb12cr2      CDB12CR2            4   04 Jan 2018 15:35    1
            5   04 Jan 2018 15:52    1
           6   04 Jan 2018 16:04    1
           7   04 Jan 2018 16:11    1
    
      
    Specify  the Begin and End Snapshot Ids
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Enter  value for begin_snap: 6
    Begin  Snapshot Id specified: 6
    
    Enter  value for end_snap: 7
    End   Snapshot Id specified: 7
    
    Specify  the Report Name
    ~~~~~~~~~~~~~~~~~~~~~~~
    The  default report file name is awrrpt_1_6_7.html.   To use this name,
    press   to continue, otherwise enter an alternative.
    
    Enter  value for report_name: pdb12cr2_6_7.html
    
    ####
    ####  < parte de la salida suprimida >
    ####
    
    Report  written to pdb12cr2_6_7.html
    Nota: En el caso que la PDB desde la cual queremos emitir el reporte no se encuentre abierta, recibiremos el siguiente error:
    ERROR  at line 59:
    ORA-06550:  line 59, column 52:
    PL/SQL:  ORA-01219: database or pluggable database not open: queries allowed on
    fixed  tables or views only
    ORA-06550:  line 56, column 5:
    PL/SQL:  SQL Statement ignored
      
    SP2-0556:  Invalid file name.



    Para extraer el reporte AWR debemos abrirla. Esto lo hacemos de la siguiente manera:
    SQL> alter pluggable  database open;




    Verificación de los reportes generados:



    Una vez terminada la ejecución del script (o el método de generación que hayamos elegido) vamos a tener nuestro reporte en el formato seleccionado.
    Reporte a nivel CDB:
    En el caso de un reporte a nivel CDB, no vamos a encontrar modificaciones significativas con respecto a versiones anteriores.
    Podemos ver que nos indica que se trata del “root container” y nos muestra el correspondiente “container DB ID”. También vemos que los snap Id corresponden a los tomados en el CDB (Figura 2). Una novedad en la salida del reporte, la encontramos en la sección “SQL Statistics” (Figura 3) donde por cada diferente lista se incluye la columna “PDB Name” indicando justamente a que PDB corresponde el SQL (Figura 4).

    Figura 2. Cabecera de reporte AWR a nivel CDB.

    Figura 3. Sección “SQL Statistics” en reporte AWR.

    Figura 4. En cada opción de “SQL Statistics” se puede ver la nueva columna “PDB Name”.


    Reporte a nivel PDB:
    En el caso del reporte generado en la PDB, fundamentalmente veremos que se indica que se trata de un reporte AWR de PDB, podemos ver también en la cabecera el nombre del CDB, y la PDB (indicada como “container”) y su correspondiente “container DBID” (Figura 5).
    El resto de los datos del “header” son bastante generales y no difieren mucho.
    Más abajo en el reporte, podemos ver de cual servicio se trata, en este caso pdb12cr2.localdomain (Figura 6).

    Figura 5. Cabecera de reporte AWR a nivel PDB.

    Figura 6. Sección “Service Statistics”. Se puede ver que se trata de la PDB únicamente.



    Conclusión:

    AWR es una de las principales herramientas para realizar el “thoubleshooting” de performance en una base de datos Oracle. La versión 12c introdujo el concepto de “multitenant”, un cambio muy grande a nivel arquitectura. La capacidad de poder compartir la instancia por varias bases de datos y aplicaciones diferentes trae consigo innumerables beneficios, pero también cierta complejidad a la hora de analizar y determinar el origen de problemas de rendimiento. El release 2 de Oracle Database 12c mejora mucho este aspecto, incorporando entre otras cosas la posibilidad de capturar datos y generar reportes AWR a nivel “Pluggable Database”.