Cuando inicie la revisión de la nueva arquitectura Oracle 12c me fui dando cuenta que con una nueva arquitectura se tiene una nueva forma de administración.
Empecé
a tener muchas preguntas relacionadas a la administración de la arquitectura
Oracle 12c:
¿Cómo
conectarme a un CDB y PDBs?
¿Cómo
saber a qué contenedor estoy conectado?
¿Cuál
es el proceso de inicio y apagado de un CDB y PDBs?
¿Qué
vistas puedo revisar para observar la configuración de un CDB y PDBs?
¿Cómo
se administran los tablespaces?
¿Se
puede modificar parámetros de base de datos en un PDB?
En este
articulo responderemos a esas dudas que normalmente tenemos al iniciar con esta arquitectura.
El CDB
es administrado desde el contendor ROOT y para poder conectarse se puede utilizar dos formas:
Conexión
Local
Conexión a través del LISTENER
Pueden darse cuenta que cada vez que se crea una nueva base de datos PDB, el LISTENER lo registra como un nuevo servicio.
Otra forma
de conectarse a los contenedores es mediante el parámetro de sesión CONTAINER
Para
poder utilizar este método es necesario estar conectado con un usuario COMUN
para todos los contenedores (los usuarios comunes los explicaremos en
posteriores articulos)
¿Cómo saber a qué contenedor estoy conectado?
¿Cómo saber a qué contenedor estoy conectado?
Como
administradores, muchas veces vamos a tener la necesidad de movernos del
contendor ROOT a los diferentes PDBs o viceversa.
Para
evitar realizar tareas sobre un contendor equivocado siempre es bueno consultar
en que contenedor (ROOT o PDB) estamos actualmente. Podemos hacerlo con el comando SHOW
CON_NAME
Tambien podemos consultar el código del contendor con el comando SHOW CON_ID
¿Cuál es el proceso de inicio de un CDB y PDBs?
Observando el proceso de inicio de un CDB y los PDBs se crea una nueva duda.
¿ Cada vez que levantamos el CDB tenemos que lanzar un comando mas para levantar los PDBs?
Para
ahorrar tiempos de inicio de bases de datos; Oracle ha creado un nuevo tipo de TRIGGER AFTER
STARTUP.
Con
este nuevo TRIGGER podemos crear una rutina que inicie todas los PBDs cuando la base de datos inicia.
¿Cuál es el proceso de apagado de un CDB y PDBs?
Otra forma de cerrar un PDB es conectarse al PDB y lanzar el comando SHUTDOWN IMMEDIATE
Si nos conectamos al contenedor ROOT y ejecutamos SHUTDOWN IMMEDIATE, todos los PDBs se cerraran automáticamente y posteriormente lo hará el CDB.
Si nos conectamos al contenedor ROOT y ejecutamos SHUTDOWN TRANSACTIONAL, la base de datos espera a que finalicen solo las transacciones del contendor ROOT. Los PDBs se cierran de forma IMMEDIATE
¿Qué vistas puedo consultar para observar la configuración de un CDB y PDBs?
Con la
nueva arquitectura se han desarrollado nuevas Vistas de diccionario que nos
permiten revisar el estado de los contendores, así como también, el estado de
los elementos dentro de cada contenedor.
También
encontramos modificaciones a vistas ya conocidas para poder soportar la nueva
arquitectura.
Entre
las vistas principales tenemos
V$DATABASE
V$PDBS
Tal vez
la vista que más se utiliza en esta arquitectura. Esta vista muestra las características y el
estado de los PDBs dentro de un CDB.
Es
importante anotar la particularidad en el nombre de la vista. Es una vista V$, sin embargo, se define en
plural.
Es importante tomar atención al campo CON_ID ya que es el código identificador de cada PDB. Es el campo por el que se relaciona cada elemento con su contendor.
Es importante tomar atención al campo CON_ID ya que es el código identificador de cada PDB. Es el campo por el que se relaciona cada elemento con su contendor.
Pueden darse cuenta que en la vista V$PDBS no muestra al contendor ROOT, es porque el contendor ROOT es considerado como el contendor CDB.
Para
poder ver la información del contendor ROOT utilizamos la siguiente vista
V$CONTAINERS
Vista
que nos muestra la información de todos los contendores en la base de datos. Es
muy parecida a V$PDBS pero también contiene la información del contendor ROOT.
CDB_XXX
Muchos
conocemos las vistas del diccionario de datos USER_XXX, ALL_XXX y DBA_XXX. Cada una con un nivel de acceso diferente a
la información.
Para la
nueva arquitectura Oracle 12c se ha creado un nuevo nivel de acceso a través de
las vistas CDB_XXX
Todas las vistas DBA_XXX que conocemos tienen su vista CDB_XXX. En el siguiente cuadro muestro el homónimo (a nivel Multitenant) de algunas vistas conocidas.
Vista de Base de datos
|
Vista del contendor Multitenant
|
DATABASE_PROPERTIES
|
CDB_PROPERTIES
|
DBA_USERS
|
CDB_USERS
|
DBA_TABLESPACES
|
CDB_TABLESPACES
|
DBA_DATA_FILES
|
CDB_DATA_FILES
|
DBA_ROLES
|
CDB_ROLES
|
DBA_OBJECTS
|
CDB_OBJECTS
|
DBA_TABLES
|
CDB_TABLES
|
En todas las vistas CDB_XXX encontraremos los mismos campos que en las vistas DBA_XXX mas el campo CON_ID que indica a que contenedor pertenece el elemento.
Cuando se consulta una vista CDB_XXX en el contenedor ROOT, la vista muestra la información de los elementos en todos los contenedores de la base de datos.
Cuando se consulta la misma vista CDB_XXX, conectado a algún contenedor en particular (por ejemplo un PDB) la vista muestra solo la información de dicho contendor.
CDB_PDBS
Dentro
del grupo de vistas CDB_XXX encontramos una nueva vista llamada CDB_PDBs que
entregan más información sobre cada PDB en la base de datos.
¿Cómo se administran los tablespaces?
La mayoría
de tablespaces son independientes en cada contenedor. Los únicos tablespaces
que son compartidos por todos los contendores son el tablespace UNDO y, en
algunas ocasiones, el tablespace TEMPORAL.
Solo existe un UNDO tablespace en toda la base de datos y se crea en el contenedor ROOT.
El
tablespace TEMPORAL que se crea en el contenedor ROOT puede ser utilizado por
los PDBs, siempre y cuando, dicho contendor no tengan un tablespace Temporal
definido.
En el ejemplo se puede observar que la base de datos PDB2 no tiene un tablespace temporal, por lo que utiliza el tablespace temporal del contendor ROOT.
Para
los tablespaces de datos, cada contendor o PDB maneja sus propios
tablespaces. Se puede tener el
mismo nombre de tablespaces en diferentes contendores o PDBs.
¿Cómo se definen los default tablespaces en esta nueva arquitectura?
¿Cómo se definen los default tablespaces en esta nueva arquitectura?
Como observamos anteriormente, cada contendor o PDB maneja sus propios tablespaces de datos y, en ocasiones, sus propios tablespaces temporales.
¿Se puede modificar parámetros de base de datos en un PDB?
En Oracle 12c se puede apreciar que solo hay una instancia para
todos los contendores PDBs.
Con una sola instancia, se tiene solo un archivo de parámetros PFILE o
SPFILE.
Con
esta afirmación es común pensar que todos los parámetros se definen por igual
para todos los contenedores.
Sin
embargo existen algunos parámetros que pueden ser configurados de manera
independiente en cada contenedor. Los parámetros
que pueden modificarse pueden ser revisados de la vista V$PARAMETER donde el campo ISPDB_MODIFICABLE tiene el valor de
TRUE.
Cuando coloco scope=spfile le estoy indicando a la base de datos que active el cambio cuando reinicie el PDB.
En el contendor ROOT podemos ver los valores que se le asigna a un parámetro en los diferentes contendores.
Los valores de estos parámetros no se almacenan en el archivo de parámetros PFILE o SPFLE. Se almacenan en el diccionario de datos de cada PDB.
Espero
les pueda servir de ayuda.
Gracias Jorge Zorrilla
ResponderBorrarSigo muy de cerca sus post en el blog sobre temas de Oracle.
Excelentre trabajo.
Tengo una pregunta, si tengo Oracle Database 12c con un contenedor CDB y 2 PDB como hago para que en mis cadenas de conexiones (tnsnames) indique con cual de alguna de las PDB puedo trabajar, porque actualmente me conecto es a un CDB.
Cordialmente,
Muchisimas gracias por tus palabras, me ayudan a seguir avanzando con mas articulos.
BorrarCon respecto a tu pregunta. Cuando tu creas un PDB puedes notar que se crea auto maticamente un nuevo servicio en la Base de datos con el mismo nombre; este servicio tambien es registrado en el listener por el nuevo background Process LREG.
De esa, podemos conectarnos directamente a un PDB a travez del listener
Ejm
sqlplus /@PDB1
Tu tnsnames debe tener una cadena de conexion apuntando al servicio PDB1
COMQA =
(DESCRIPTION =(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle12c.oracle.com)(PORT = 1521)))
(CONNECT_DATA =
(SERVICE_NAME = PDB1)))
Excelente explicación de este tema. Sigue así.
ResponderBorrarExcelente post!
ResponderBorrar