{"id":1,"date":"2022-12-09T21:07:19","date_gmt":"2022-12-09T21:07:19","guid":{"rendered":"http:\/\/oracleconraul.com\/?p=1"},"modified":"2023-07-19T14:19:37","modified_gmt":"2023-07-19T14:19:37","slug":"multitenant","status":"publish","type":"post","link":"https:\/\/oracleconraul.com\/index.php\/2022\/12\/09\/multitenant\/","title":{"rendered":"C\u00f3mo Crear una PDB-Application"},"content":{"rendered":"\n<p><strong><em>CREAR UNA APPLICATION PDB DATABASE<\/em><\/strong><\/p>\n\n\n\n<p>Los \u00abcontenedores de aplicaci\u00f3n\u00bb es una caracter\u00edstica de la versi\u00f3n 12 versi\u00f3n 2 (12.2). Un \u00abapplication container\u00bb es un componente CDB opcional para almacenar datos y metadatos para una aplicaci\u00f3n. Un CDB tiene 0 o varios contenedores de aplicaciones. Cada aplicaci\u00f3n est\u00e1 compuesta por una configuraci\u00f3n, metadatos y objetos compartidos. Podemos por tanto definirlo como un contenedor de aplicaciones compartidas, donde se pueden albergar diferentes versiones de la misma.<br><br>Applicantion Containers pueden ser creado de diferentes formas: desde PDBD seed, clonando PDBS, pluggind or unplugged de PDB, pero en todos los casos se usa el comando CREATE PLUGGABLE DATABASE, incluyendo la cl\u00e1usula&nbsp;<strong>\u00abAPPLICATION CONTAINER\u00bb<\/strong>. Para crear una Application container, debes de estar conectado al CDB root, y este debe estart abierto en modo \u00abread write\u00bb, y el nombre de la applicaton container debe de ser \u00fanico.<\/p>\n\n\n\n<p><em><strong>1) Sentencia para crear la base de datos como Application Container.<\/strong><\/em><br><br>A modo de ejemplo crearemos una Application Container de juguetes a la que llamaremos \u00abtoys_root\u00bb.<\/p>\n\n\n\n<p class=\"has-ast-global-color-8-color has-ast-global-color-4-background-color has-text-color has-background has-small-font-size\">CREATE PLUGGABLE DATABASE toys_root AS APPLICATION CONTAINER<br>ADMIN USER admin identified by ****<br>ROLES=(CONNECT)<br>CREATE_FILE_DEST=\u2019\/u02\/app\/oracle\/oradata\/ORCL\/toys_root\u2019;<br>\/<\/p>\n\n\n\n<p><em><strong>2) Con la siguiente consulta, podemos comprobar qu\u00e9 tipo de PDBs hemos creado en nuestra arquitectura.<\/strong><\/em><br><br>El resultado mostrar\u00e1 nuestra Application PDB como \u00abApplication root\u00bb a YES.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"http:\/\/bdconraul.com\/wp-content\/uploads\/2023\/06\/image-17.png\" alt=\"\" class=\"wp-image-3851\"\/><\/figure>\n\n\n\n<p><strong><em>3) Abrimos la base de datos que acabamos de crear.<\/em><\/strong><\/p>\n\n\n\n<p class=\"has-ast-global-color-8-color has-ast-global-color-4-background-color has-text-color has-background has-small-font-size\">alter pluggable database TOYS_ROOT open;<\/p>\n\n\n\n<p>Una vez creada Application Container PDB, ya podemos realizar una prueba de c\u00f3mo se gestionan las versiones de APP y c\u00f3mo estas versiones se pueden replicar entre las diferentes PDBS.<\/p>\n\n\n\n<p><strong><em>4) Creamos una versi\u00f3n de aplicaci\u00f3n de la PDB.<\/em><\/strong><\/p>\n\n\n\n<p>Conectados a la PDB TOYS_ROOT ejecutamos.<\/p>\n\n\n\n<p class=\"has-ast-global-color-8-color has-ast-global-color-4-background-color has-text-color has-background has-small-font-size\">ALTER PLUGGABLE DATABASE application TOYS_APP begin install \u20181.0\u2019;<\/p>\n\n\n\n<p>Con ello le estamos indicando que se cree una versi\u00f3n de una applicaci\u00f3n a la que llamaremos TOYS_APP y cuya versi\u00f3n ser\u00e1 la 1.0.<\/p>\n\n\n\n<p><strong><em>5) Comprobamos si la CDB se ha creado correctamente.<\/em><\/strong><\/p>\n\n\n\n<p class=\"has-ast-global-color-8-color has-ast-global-color-4-background-color has-text-color has-background has-small-font-size\">select app_name, app_version, app_status<br>from dba_applications<br>where app_name=\u2019TOYS_APP\u2019;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"http:\/\/bdconraul.com\/wp-content\/uploads\/2023\/06\/image-18.png\" alt=\"\" class=\"wp-image-3860\"\/><\/figure>\n\n\n\n<p><strong><em>6) Creamos un tbs de prueba, un usuario y damos los permisos necesarios:<\/em><\/strong><\/p>\n\n\n\n<p class=\"has-ast-global-color-8-color has-ast-global-color-4-background-color has-text-color has-background has-small-font-size\">set echo on<br>create tablespace toys_tbs datafile size 100M autoextend on next 10M maxsize 200M;<br>create user toys_owner identified by **** container=all;<br>grant create session, dba to toys_owner;<br>alter user toys_owner default tablespace toys_tbs;<\/p>\n\n\n\n<p>Creamos una nueva tabla con el fin de comprobar que se replica correctamente. Ser\u00e1 la versi\u00f3n 1.0. de nuestra aplicaci\u00f3n TOYS_APP.<\/p>\n\n\n\n<p class=\"has-ast-global-color-8-color has-ast-global-color-4-background-color has-text-color has-background has-small-font-size\">SQL&gt; CREATE TABLE toys_owner.raul (uno number, dos varchar(2));<br>Table created.<br>SQL&gt; insert into toys_owner. raul values(1,\u2019r\u2019);<br>1 row created.<br>SQL&gt; commit;<br>Commit complete.<\/p>\n\n\n\n<p><strong><em>7) Cerramos la instalaci\u00f3n de la \u00abaplicaci\u00f3n\u00bb<\/em><\/strong><\/p>\n\n\n\n<p>ALTER PLUGGABLE DATABASE application TOYS_APP end install \u20181.0\u2019;<\/p>\n\n\n\n<p><strong><em>8) Comprobamos ahora el estado de la aplicaci\u00f3n<\/em><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code has-ast-global-color-8-color has-ast-global-color-4-background-color has-text-color has-background has-small-font-size\"><code>select app_name, app_version, app_status\nfrom dba_applications\nwhere app_name='TOYS_APP';\n\nAPP_NAME APP_VERSION APP_STATUS\n-------------------------------\n<strong>TOYS_APP 1.0 NORMAL<\/strong><\/code><\/pre>\n\n\n\n<p><strong>9) Replicaci\u00f3n entre contenedores<\/strong><\/p>\n\n\n\n<p>Para realizar la prueba, vamos a crear dos nuevas PDBS, en este caso \u00abrobots\u00bb y mu\u00f1ecas \u00abdolls\u00bb.<\/p>\n\n\n\n<pre class=\"wp-block-code has-ast-global-color-8-color has-ast-global-color-4-background-color has-text-color has-background has-small-font-size\"><code>CREATE PLUGGABLE database robots\nadmin user admin identified by ***\nCREATE_FILE_DEST=\n'\/u02\/app\/oracle\/oradata\/ORCL\/toys_root\/robots'\nPluggable database created.\n\nSQL&gt; alter pluggable database robots open;\nPluggable database altered.<\/code><\/pre>\n\n\n\n<p class=\"has-ast-global-color-8-color has-ast-global-color-4-background-color has-text-color has-background has-small-font-size\">CREATE PLUGGABLE database dolls<br>admin user admin identified by ***<br>CREATE_FILE_DEST=<br>\u2018\/u02\/app\/oracle\/oradata\/ORCL\/toys_root\/dolls\u2019;<br><br>SQL&gt; alter pluggable database dolls open;<br>Pluggable database altered.<\/p>\n\n\n\n<p class=\"has-ast-global-color-8-color has-ast-global-color-4-background-color has-text-color has-background has-small-font-size\">SQL&gt; show pdbs<br>CON_ID CON_NAME OPEN MODE RESTRICTED<br>2 PDB$SEED READ ONLY NO<br>3 TOYS_ROOT READ WRITE NO<br>4 PDB1 READ WRITE NO<br>5 TOYS_ROOT$SEED READ WRITE NO<br>6&nbsp;<strong>ROBOTS&nbsp;<\/strong>READ WRITE NO<br>7&nbsp;<strong>DOLLS&nbsp;<\/strong>READ WRITE NO<\/p>\n\n\n\n<p>Ahora nos vamos a los contenedores recientemente recreados para realizar la sincronizaci\u00f3n de nuestra aplicaci\u00f3n.<\/p>\n\n\n\n<p>Cambiamos al contenedor ROBOTS y refrescamos la aplicaci\u00f3n, en este caso tst_app<\/p>\n\n\n\n<pre class=\"wp-block-code has-ast-global-color-8-color has-ast-global-color-4-background-color has-text-color has-background has-small-font-size\"><code>SQL&gt; ALTER SESSION SET CONTAINER=ROBOTS;\n\nSession altered.\n\nSQL&gt; ALTER PLUGGABLE DATABASE APPLICATION TOYS_APP SYNC ;\n\nPluggable database altered.<\/code><\/pre>\n\n\n\n<p>Comprobamos que la tabla se ha refrescado<\/p>\n\n\n\n<pre class=\"wp-block-code has-ast-global-color-8-color has-ast-global-color-4-background-color has-text-color has-background has-small-font-size\"><code>SQL&gt; show con_name\n\nCON_NAME\n------------------------------\nROBOTS\n\nSQL&gt; DESC TOYS_OWNER.RAUL\nName                               Null?    Type\n---------------------------------- -------- -----------------------\nUNO                                         NUMBER\nDOS                                         VARCHAR2(2)\n\n\nSQL&gt; select * from toys_owner.raul;\n\n       UNO DO\n---------- --\n\t 1 r\n<\/code><\/pre>\n\n\n\n<p>Vamos a realizar la misma operaci\u00f3n de sincronizaci\u00f3n en la otra PDB.<\/p>\n\n\n\n<p class=\"has-ast-global-color-8-color has-ast-global-color-4-background-color has-text-color has-background has-small-font-size\">SQL&gt; ALTER SESSION SET CONTAINER=DOLLS;<br>Session altered.<\/p>\n\n\n\n<p>Y realizamos la misma operativa. Sincronizamos la aplicaci\u00f3n:<\/p>\n\n\n\n<p class=\"has-ast-global-color-8-color has-ast-global-color-4-background-color has-text-color has-background has-small-font-size\">SQL&gt; ALTER PLUGGABLE DATABASE APPLICATION TOYS_APP SYNC ;<br>Pluggable database altered.<\/p>\n\n\n\n<p>Comprobamos que la tabla se ha replicado:<\/p>\n\n\n\n<p class=\"has-ast-global-color-8-color has-ast-global-color-4-background-color has-text-color has-background has-small-font-size\">SQL&gt; desc toys_owner.raul<br>Name Null? Type<br>UNO NUMBER<br>DOS VARCHAR2(2)<br><br>SQL&gt; select * from toys_owner.raul;<br>UNO DO<br>1 r<\/p>\n\n\n\n<p>En todo momento podr\u00e1s conocer el estado de t\u00fa APP, c\u00f3mo son el estado en el que se encuentra y su versi\u00f3n<br><br>Puedes chequarlo con una query similar a la siguiente, donde se indica el nombre de la APP, su id, su estado, si es o no impl\u00edcita, etc.<br><br><em>select app_name, app_version, app_id, app_status,<br>app_implicit implicit<br>from dba_applications;<\/em><\/p>\n\n\n\n<pre class=\"wp-block-preformatted has-ast-global-color-8-color has-ast-global-color-4-background-color has-text-color has-background has-small-font-size\">APP_NAME                 APP_VERSION                APP_ID APP_STATUS   I\n---------------------------------------- ------------------------------ ---------- ------------ -\nTOYS_APP                  1.0                         2     NORMAL      N\n<\/pre>\n\n\n\n<p><strong>10) Subir de versi\u00f3n nuestra APP<\/strong>.<\/p>\n\n\n\n<p>Una vez que hemos creado y comprobado el funcionamiento de las Application Container, podemos crear diferentes versiones de la misma, o borrar una versi\u00f3n de APP cuando ya no nos sea v\u00e1lida.<br><br>Para subir la versi\u00f3n de nuestra APP, tenemos que usar los comandos begin upgrade \/ end upgrade, por supuesto dentro de la APP_ROOT.<\/p>\n\n\n\n<p class=\"has-ast-global-color-8-color has-ast-global-color-4-background-color has-text-color has-background has-small-font-size\">SQL&gt; alter pluggable database application TOYS_APP1 begin upgrade \u20181.0\u2019 to \u20181.1\u2019;<br>Pluggable database altered.<br><br>SQL&gt; insert into toys_owner. raul values(2,\u2019d\u2019);<br>1 row created.<br>SQL&gt; commit;<br>Commit complete.<br><br>SQL&gt; alter pluggable database application TOYS_APP1 end upgrade;<br>Pluggable database altered.<br><br>SQL&gt; alter session set container=DOLLS;<br>SQL&gt; ALTER PLUGGABLE DATABASE APPLICATION TOYS_APP1 SYNC;<br>Pluggable database altered.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted has-ast-global-color-8-color has-ast-global-color-4-background-color has-text-color has-background has-small-font-size\"> SQL&gt; SELECT * FROM TOYS_OWNER.RAUL;\n   UNO DOS\n---------- --\n     1 r\n     2 d<\/pre>\n\n\n\n<p><strong>11) Desistalar una aplicaci\u00f3n<\/strong><\/p>\n\n\n\n<p>Para desinstalar una aplicaci\u00f3n debemos realizar las siguientes acciones:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted has-ast-global-color-8-color has-ast-global-color-4-background-color has-text-color has-background has-small-font-size\">SQL&gt; ALTER PLUGGABLE DATABASE APPLICATION TOYS_APP BEGIN UNINSTALL;\nPluggable database altered.\n\nSQL&gt; drop user toys_owner cascade;\nuser dropped.\n\nSQL&gt; drop tablespace TOYS_TBS INCLUDING CONTENTS AND DATAFILES;\ntablespace dropped\n\nSQL&gt; ALTER PLUGGABLE DATABASE APPLICATION TOYS_APP END UNINSTALL;\nPluggable database altered.<\/pre>\n\n\n\n<p>En definitiva, Oracle nos permite tener \u00abversiones\u00bb de diferentes aplicaciones, que pueden ser sincronizadas a trav\u00e9s de las PDB, actualizadas, clonadas, etc.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>CREAR UNA APPLICATION PDB DATABASE Los \u00abcontenedores de aplicaci\u00f3n\u00bb es una caracter\u00edstica de la versi\u00f3n 12 versi\u00f3n 2 (12.2). Un \u00abapplication container\u00bb es un componente CDB opcional para almacenar datos y metadatos para una aplicaci\u00f3n. Un CDB tiene 0 o varios contenedores de aplicaciones. Cada aplicaci\u00f3n est\u00e1 compuesta por una configuraci\u00f3n, metadatos y objetos compartidos.<\/p>\n<div class=\"more-link\">\n\t\t\t\t <a href=\"https:\/\/oracleconraul.com\/index.php\/2022\/12\/09\/multitenant\/\" class=\"link-btn theme-btn\"><span>Read More <\/span> <i class=\"fa fa-caret-right\"><\/i><\/a>\n\t\t\t<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"wpupg_custom_link":[],"wpupg_custom_link_behaviour":[],"wpupg_custom_link_nofollow":[],"wpupg_custom_image":[],"wpupg_custom_image_id":[],"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[14],"tags":[33],"class_list":["post-1","post","type-post","status-publish","format-standard","hentry","category-oracle","tag-multitenantarquitecturacdbpdb"],"_links":{"self":[{"href":"https:\/\/oracleconraul.com\/index.php\/wp-json\/wp\/v2\/posts\/1","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/oracleconraul.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/oracleconraul.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/oracleconraul.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/oracleconraul.com\/index.php\/wp-json\/wp\/v2\/comments?post=1"}],"version-history":[{"count":24,"href":"https:\/\/oracleconraul.com\/index.php\/wp-json\/wp\/v2\/posts\/1\/revisions"}],"predecessor-version":[{"id":4040,"href":"https:\/\/oracleconraul.com\/index.php\/wp-json\/wp\/v2\/posts\/1\/revisions\/4040"}],"wp:attachment":[{"href":"https:\/\/oracleconraul.com\/index.php\/wp-json\/wp\/v2\/media?parent=1"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oracleconraul.com\/index.php\/wp-json\/wp\/v2\/categories?post=1"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oracleconraul.com\/index.php\/wp-json\/wp\/v2\/tags?post=1"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}