Pular para o conteúdo

Provisionamento de uma nova PDB baseado no PDB$SEED

Provisionamento e Migração de Non-CDB to CDB

Definições:

CDB: Container Database

PDB: Pluggable Database

PDB$SEED: Refere-se à seed PDB. A seed PDB é automaticamente criada durante a criação do banco de dados do tipo multitenant, ou CDB. Sua existência é obrigatória e seu conteúdo não pode ser alterado. Permanece em modo READ-ONLY e serve para agilizar o processo de criação de novas PDB’s.

common users: Para fins deste artigo, refere-se a usuários que existem em todos os PDB’s de um CDB.

local users: Para fins deste artigo, refere-se a usuários que existem no âmbito de um PDB. Ou seja, um usuário com o mesmo nome pode existir em vários PDB’s mas serem usuários completamente distintos pois só são válidos no âmbito de cada PDB.

Existem quarto métodos de provisionamento de novas PDB’s em um CDB:

  • Criando um novo PDB baseado na seed PDB. Por exemplo, existe a necessidade de criação de um novo banco de dados para armazenar dados relativos à uma nova aplicação. Sua criação é praticamente instantânea e muito simples.
  • Como parte de uma estratégia de migração de Non-CDB para CDB. Neste artigo, demonstro a tentativa de fazer este método funcionar. Como este método não funcionou devido a erros ORA-600, resolvi manter a parte de troubleshooting uma vez que pode servir para outras pessoas e a instigar novos artigos.
  • Criando uma PDB com base em outra PDB (Clone) no mesmo container. Por exemplo, pretende-se testar um patch de uma aplicação no ambiente de produção. Pode-se, primeiramente, efetuar um clone da PDB de produção dando origem a uma nova PDB. Os testes, então, podem ser efetivamente feitos nesta nova PDB. O procedimento de clone de PDB’s é bastante simples.
  • Através dos procedimentos plug e unplug, pode-se mover PDB’s entre diferentes CDB’s.
  • Transportable Database: Neste artigo, tem-se um demonstrativo de como migrar uma Non-CDB para uma CDB utilizando o novo método transportable database.

Ferramentas

O DBA, pode fazer uso das seguintes ferramentas quanto ao provisionamento de PDB’s

  • SQL*Plus: Todos os exemplos deste artigo farão uso do SQL*Plus
  • SQL Developer: Substitui o Database Control no Oracle 12c.
  • Enterprise Manager Cloud Control.
  • DBCA: Criação de bancos de dados baseados na seed PDB bem como os procedimentos de plug e unplug.

Configuração do ambiente utilizado nos exemplos

SQL> show parameter create

NAME                 TYPE         VALUE
-------------------------------- -----------     ------------------------------
db_create_file_dest         string    +DATA
db_create_online_log_dest_1         string    +DATA
db_create_online_log_dest_2         string    +FRA
SQL> select name, open_mode from v$pdbs;

NAME        OPEN_MODE
------------------    ---------
PDB$SEED        READ-ONLY
PROD_PDB1        READ WRITE
PROD_PDB2        READ WRITE
PROD_PDB3        READ WRITE

SQL> show parameter domain

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
db_domain                 string     xps15z.com

Provisionando uma nova PDB baseado no PDB$SEED

A criação de um novo PDB baseado no PDB$SEED é praticamente instantânea. A operação copia os data files do READ-ONLY PDB seed para o diretório de destino. O diretório de destino pode ser definido tanto como uma cláusula do comando CREATE PLUGGABLE DATABASE ou através de parâmetros de inicialização da instância.

  • Copia os data files do PDB seed
  • Cria os tablespaces SYSTEM e SYSAUX
  • Criação de um catálogo incluindo os metadados apontando para os Oracle Supplied Objects que reside no root CDB.
  • Cria os common users SYS e SYSTEM.
  • Criação do local user (PDBA).
  • Um novo serviço no formato <nome do pdb>.<db_domain> é criado. Este nome será registrado no listener.
[oracle@12c Desktop]$ sqlplus / as sysdba

SQL*Plus: Release 12.1.0.1.0 Production on Tue Nov 26 16:00:34 2013
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and Real Application Testing options

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT

SQL> create pluggable database prod_pdb4 admin user prod_pdb4_user identified by oracle roles=(dba);
Pluggable database created.

SQL> alter pluggable database prod_pdb4 open;
Pluggable database altered.

SQL> connect prod_pdb4_user/oracle@12c.xps15z.com:1521/prod_pdb4.xps15z.com
Connected.

SQL>

SQL> select file_name from dba_data_files;

FILE_NAME
--------------------------------------------------------------------------------
+DATA/PROD/EC17994AB37E2D47E043FA00A8C0B00B/DATAFILE/system.275.832521713
+DATA/PROD/EC17994AB37E2D47E043FA00A8C0B00B/DATAFILE/sysaux.280.832521713

SQL> !

[oracle@12c Desktop]$ lsnrctl status
LSNRCTL for Linux: Version 12.1.0.1.0 - Production on 26-NOV-2013 16:05:58
Copyright (c) 1991, 2013, Oracle.  All rights reserved.
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))

STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 12.1.0.1.0 - Production
Start Date                25-NOV-2013 08:21:28
Uptime                    1 days 7 hr. 44 min. 30 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/12.1.0/oracle/network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/12c/listener/alert/log.xml
Listening Endpoints Summary...
 (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
 (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=12c.xps15z.com)(PORT=1521)))
 (DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=12c.xps15z.com)(PORT=5500))(Security=(my_wallet_directory=/u01/app/oracle/admin/prod/xdb_wallet))(Presentation=HTTP)(Session=RAW))

Services Summary...
Service "+ASM" has 1 instance(s).
 Instance "+ASM", status READY, has 1 handler(s) for this service...
Service "prod.xps15z.com" has 1 instance(s).
 Instance "prod", status READY, has 1 handler(s) for this service...
Service "prodXDB.xps15z.com" has 1 instance(s).
 Instance "prod", status READY, has 1 handler(s) for this service...
Service "prod_pdb1.xps15z.com" has 1 instance(s).
 Instance "prod", status READY, has 1 handler(s) for this service...
Service "prod_pdb2.xps15z.com" has 1 instance(s).
 Instance "prod", status READY, has 1 handler(s) for this service...
Service "prod_pdb3.xps15z.com" has 1 instance(s).
 Instance "prod", status READY, has 1 handler(s) for this service...
Service "prod_pdb4.xps15z.com" has 1 instance(s).
 Instance "prod", status READY, has 1 handler(s) for this service...
The command completed successfully

Plugando uma Non-CDB em uma CDB (Migração)

Pode ser feito através dos seguintes métodos:

  1. Transportable Tablespace
  2. Transportable Database
  3. Data Pump
  4. Arquivo de definição XML gerado através da execução do DBMS_PDB quando conectado ao banco de dados Non-CDB: Este é o procedimento que iremos utilizar para fins de exemplo neste artigo. Este procedimento é somente possível entre Oracle 12c Non-CDB e Oracle 12c CDB. Caso o seu banco de origem não seja 12c, deve-se fazer o upgrade do banco de dados de origem antes.
  5. Replicação (Golden Gate)

Quanto ao método 3 acima mencionado, foram encontrados vários problemas durante os testes deste que poderia ser o métido mais produtivo e rápido. Este post, inclui o troubleshooting que foi feito em uma tentativa de solucionar os problemas encontrados.

Apesar do método 3  ser expressamente recomendado pela Oracle, depois de muito troubleshooting, tive que abandoná-lo pois não consegui contornar os inúmeros ORA-600 ao tentar abrir o banco de dados após o plug. O próprio script noncdb_to_pdb.sql da Oracle falha durante a tentativa de abertura da PDB em modo restrito.

Portanto, esta parte do artigo tem o intuito de servir outras pessoas como demonstrativo do “caminho que deve ser evitado”. Resolvi não desperdiçar o tempo e esforço que foi empenhado tentando fazer este procedimento funcionar. Como minhas tentativas falharam,  convido a todos os leitores e colegas articulistas a fazerem o mesmo teste a fim de verificar-mos a sua reproducibilidade.

O procedimento numero 3 acima descrito para migrar uma Non-CDB para uma CDB é composto dos seguintes passos:

  • Abrir o banco de dados Non-CDB em modo READ-ONLY
  • Executa-se o DBMS_PDB.describe a fim de gerar um arquivo descritivo em formato XML. Este arquivo será usando na criação da PDB.
  • Conecta-se na CDB com um common user e roda-se o CREATE PLUGGABLE DATABASE com a cláusula USING ‘XMLfile’. A lista de data files da Non-CDB é lida deste arquivo XML.
  • Roda-se o ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql script na nova PDB. Este script é responsável por remover os metadados desnecessários residentes no tablespace SYSTEM da nova PDB.
  • Abre-se o novo PDB
[oracle@12c Desktop]$ cat /etc/oratab
+ASM:/u01/app/12.1.0/oracle:N:        # line added by Agent
prod:/u01/app/oracle/product/12.1.0:N:    # line added by Agent
noncdb:/u01/app/oracle/product/12.1.0:N:

[oracle@12c Desktop]$ echo $ORACLE_SID
noncdb

[oracle@12c Desktop]$ sqlplus / as sysdba

SQL*Plus: Release 12.1.0.1.0 Production on Wed Nov 27 12:38:42 2013
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
Connected to an idle instance.

SQL> startup open READ-ONLY;
ORACLE instance started.

Total System Global Area 1068937216 bytes
Fixed Size            2296576 bytes
Variable Size          713032960 bytes
Database Buffers        348127232 bytes
Redo Buffers            5480448 bytes

Database mounted.

Database opened.

SQL> exec dbms_pdb.describe('/tmp/noncdb.xml');
PL/SQL procedure successfully completed.

SQL> exit

Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and Real Application Testing options

[oracle@12c Desktop]$ cat /tmp/noncdb.xml 

<?xml version="1.0" encoding="UTF-8"?>
<PDB>
 <pdbname>noncdb</pdbname>
 <cid>0</cid>
 <byteorder>1</byteorder>
 <vsn>202375168</vsn>
 <dbid>1650472377</dbid>
 <cdbid>1650472377</cdbid>
 <guid>EC24AC7C36195E99E043FA00A8C0B46A</guid>
 <uscnbas>601748</uscnbas>
 <uscnwrp>0</uscnwrp>
 <rdba>4194824</rdba>
 <tablespace>
   <name>SYSTEM</name>
   <type>0</type>
   <tsn>0</tsn>
   <status>1</status>
   <issft>0</issft>
   <file>
     <path>+DATA/NONCDB/DATAFILE/system.281.832577841</path>
     <afn>1</afn>
     <rfn>1</rfn>
     <createscnbas>14</createscnbas>
     <createscnwrp>0</createscnwrp>
     <status>1</status>
     <fileblocks>89600</fileblocks>
     <blocksize>8192</blocksize>
     <vsn>202375168</vsn>
     <fdbid>1650472377</fdbid>
     <fcpsw>0</fcpsw>
     <fcpsb>601747</fcpsb>
     <frlsw>0</frlsw>
     <frlsb>1</frlsb>
     <frlt>832577849</frlt>
   </file>
 </tablespace>

 <tablespace>
   <name>SYSAUX</name>
   <type>0</type>
   <tsn>1</tsn>
   <status>1</status>
   <issft>0</issft>
   <file>
     <path>+DATA/NONCDB/DATAFILE/sysaux.272.832577869</path>
     <afn>2</afn>
     <rfn>2</rfn>
     <createscnbas>2394</createscnbas>
     <createscnwrp>0</createscnwrp>
     <status>1</status>
     <fileblocks>75520</fileblocks>
     <blocksize>8192</blocksize>
     <vsn>202375168</vsn>
     <fdbid>1650472377</fdbid>
     <fcpsw>0</fcpsw>
     <fcpsb>601747</fcpsb>
     <frlsw>0</frlsw>
     <frlsb>1</frlsb>
     <frlt>832577849</frlt>
   </file>
 </tablespace>
 <tablespace>
   <name>TEMP</name>
   <type>1</type>
   <tsn>3</tsn>
   <status>1</status>
   <issft>0</issft>
   <bmunitsize>128</bmunitsize>
   <file>
     <path>+DATA/NONCDB/TEMPFILE/temp.273.832577899</path>
     <afn>1</afn>
     <rfn>1</rfn>
     <createscnbas>3356</createscnbas>
     <createscnwrp>0</createscnwrp>
     <status>1</status>
     <fileblocks>2560</fileblocks>
     <blocksize>8192</blocksize>
     <vsn>202375168</vsn>
     <autoext>1</autoext>
     <maxsize>4194302</maxsize>
     <incsize>80</incsize>
   </file>
 </tablespace>
 <tablespace>
   <name>USERS</name>
   <type>0</type>
   <tsn>4</tsn>
   <status>1</status>
   <issft>0</issft>
   <file>
     <path>+DATA/NONCDB/DATAFILE/users.278.832577923</path>
     <afn>4</afn>
     <rfn>4</rfn>
     <createscnbas>15858</createscnbas>
     <createscnwrp>0</createscnwrp>
     <status>1</status>
     <fileblocks>640</fileblocks>
     <blocksize>8192</blocksize>
     <vsn>202375168</vsn>
     <fdbid>1650472377</fdbid>
     <fcpsw>0</fcpsw>
     <fcpsb>601747</fcpsb>
     <frlsw>0</frlsw>
     <frlsb>1</frlsb>
     <frlt>832577849</frlt>
   </file>
 </tablespace>
 <optional>
   <csid>873</csid>
   <ncsid>2000</ncsid>
   <options>
     <option>CATALOG=12.1.0.1.0</option>
     <option>CATJAVA=12.1.0.1.0</option>
     <option>CATPROC=12.1.0.1.0</option>
     <option>JAVAVM=12.1.0.1.0</option>
     <option>OWM=12.1.0.1.0</option>
     <option>XDB=12.1.0.1.0</option>
     <option>XML=12.1.0.1.0</option>
   </options>
   <dv>0</dv>
   <ncdb2pdb>1</ncdb2pdb>
   <APEX>4.2.0.00.27:0</APEX>
   <parameters>
     <parameter>processes=300</parameter>
     <parameter>nls_language=ENGLISH</parameter>
     <parameter>nls_territory=UNITED KINGDOM</parameter>
     <parameter>memory_target=1073741824</parameter>
     <parameter>db_block_size=8192</parameter>
     <parameter>compatible=12.1.0.0.0</parameter>
     <parameter>open_cursors=300</parameter>
   </parameters>
   <tzvers>
     <tzver>primary version:18</tzver>
     <tzver>secondary version:0</tzver>
   </tzvers>
   <walletkey>0</walletkey>
 </optional>
</PDB>

[oracle@12c Desktop]$ . oraenv

ORACLE_SID = [noncdb] ? prod

The Oracle base remains unchanged with value /u01/app/oracle

[oracle@12c Desktop]$ sqlplus / as sysdba

SQL*Plus: Release 12.1.0.1.0 Production on Wed Nov 27 12:44:09 2013
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and Real Application Testing options

SET SERVEROUTPUT ON

DECLARE
 compatible CONSTANT VARCHAR2(3) := 
   CASE DBMS_PDB.CHECK_PLUG_COMPATIBILITY(
          pdb_descr_file => '/tmp/noncdb.xml',
          pdb_name       => 'PROD_PDB2')
   WHEN TRUE THEN 'YES'
   ELSE 'NO'
END;

BEGIN
 DBMS_OUTPUT.PUT_LINE(compatible);
END;
/

NO

PL/SQL procedure successfully completed.

Checando a compatibilidade da Non-CDB usando DBMS_PDB.CHECK_PLUG_COMPATIBILITY

SET SERVEROUTPUT ON

DECLARE
 compatible CONSTANT VARCHAR2(3) := 
   CASE DBMS_PDB.CHECK_PLUG_COMPATIBILITY(
          pdb_descr_file => '/tmp/noncdb.xml',
          pdb_name       => 'PROD_PDB2')
   WHEN TRUE THEN 'YES'
   ELSE 'NO'
END;

BEGIN
 DBMS_OUTPUT.PUT_LINE(compatible);
END;
/

NO

Pode-se verificar que a função retorna NO, ou seja, existem incompatibilidades. Checamos o conteúdo da tabela PDB_PLUB_IN_VIOLATIONS

SQL> set linesize 200
SQL> col cause for a20
SQL> col message for a80
SQL> select cause, type, message from pdb_plug_in_violations where name='PROD_PDB2';

CAUSE        TYPE      MESSAGE
----------------     --------- ---------------------------------------------------------------------------
Non-CDB to PDB    WARNING   PDB plugged in is a Non-CDB, requires noncdb_to_pdb.sql be run.
Parameter             WARNING   CDB parameter memory_target mismatch: Previous 1073741824 Current 1593835520

Como só temos Warnings, daremos prosseguimento a criação de nossa PDB. Neste exemplo, utilizaremos a cláusula COPY para que os data files sejam copiados dos locais de origem para o destino. Neste caso, o local de destino é OMF e deriva do parâmetro DB_CREATE_FILE_DEST.

SQL> create pluggable database prod_pdb2 using '/tmp/noncdb.xml' copy;

Pluggable database created

Pode-se verificar no output acima que a PDB é criada sem problemas. Porém, é necessário rodar o script noncdb_to_pdb.sql que, de acordo com a documentação, é responsável por remover objetos desnecessários do tablespace SYSTEM na nova PDB. Uma das grandes vantagens da multitenancy, é o fato de não termos duplicidade de objetos Oracle em diferentes bancos de dados.

Roda-se o noncdb_to_pdb.sql script

SQL> connect sys/oracle@12c.xps15z.com:1521/prod_pdb2.xps15z.com as sysdba
Connected.

SQL> @?/rdbms/admin/noncdb_to_pdb.sql
SQL> SET SERVEROUTPUT ON
SQL> SET FEEDBACK 1
SQL> SET NUMWIDTH 10
SQL> SET LINESIZE 80
SQL> SET TRIMSPOOL ON
SQL> SET TAB OFF
SQL> SET PAGESIZE 100
SQL> 
SQL> WHENEVER SQLERROR EXIT;
SQL> 
SQL> DOC

DOC>#######################################################################
DOC>#######################################################################
DOC>   The following statement will cause an "ORA-01403: no data found"
DOC>   error if we're not in a PDB.
DOC>   This script is intended to be run right after plugin of a PDB,
DOC>   while inside the PDB.
DOC>#######################################################################
DOC>#######################################################################
DOC>#

SQL> 
SQL> VARIABLE cdbname VARCHAR2(128)
SQL> VARIABLE pdbname VARCHAR2(128)
SQL> BEGIN
 2    SELECT sys_context('USERENV', 'CDB_NAME')
 3      INTO :cdbname
 4      FROM dual
 5      WHERE sys_context('USERENV', 'CDB_NAME') is not null;
 6    SELECT sys_context('USERENV', 'CON_NAME')
 7      INTO :pdbname
 8      FROM dual
 9      WHERE sys_context('USERENV', 'CON_NAME') <> 'CDB$ROOT';
10  END;
11  /

PL/SQL procedure successfully completed.

SQL> 
SQL> COLUMN pdbname NEW_VALUE pdbname
SQL> COLUMN pdbid NEW_VALUE pdbid
SQL> 
SQL> select :pdbname pdbname from dual;

PDBNAME
--------------------------------------------------------------------------------
PROD_PDB2

1 row selected.

SQL> 
SQL> select TO_CHAR(con_id) pdbid from v$pdbs where name='&pdbname';
old   1: select TO_CHAR(con_id) pdbid from v$pdbs where name='&pdbname'
new   1: select TO_CHAR(con_id) pdbid from v$pdbs where name='PROD_PDB2'

PDBID
----------------------------------------
4

1 row selected.

SQL> 
SQL> -- save pluggable database open mode
SQL> COLUMN open_state_col NEW_VALUE open_sql;
SQL> COLUMN restricted_col NEW_VALUE restricted_state;
SQL> SELECT decode(open_mode,
 2                'READ-ONLY', 'ALTER PLUGGABLE DATABASE &pdbname OPEN READ-ONLY',
 3                'READ WRITE', 'ALTER PLUGGABLE DATABASE &pdbname OPEN', '')
 4           open_state_col,
 5         decode(restricted, 'YES', 'RESTRICTED', '')
 6           restricted_col
 7         from v$pdbs where name='&pdbname';

old   2:               'READ-ONLY', 'ALTER PLUGGABLE DATABASE &pdbname OPEN READ-ONLY',
new   2:               'READ-ONLY', 'ALTER PLUGGABLE DATABASE PROD_PDB2 OPEN READ-ONLY',
old   3:               'READ WRITE', 'ALTER PLUGGABLE DATABASE &pdbname OPEN', '')
new   3:               'READ WRITE', 'ALTER PLUGGABLE DATABASE PROD_PDB2 OPEN', '')
old   7:        from v$pdbs where name='&pdbname'
new   7:        from v$pdbs where name='PROD_PDB2'

OPEN_STATE_COL                                    RESTRICTED
------------------------------------------------- ----------
1 row selected.

SQL> 
SQL> -- save value for _system_trig_enabled parameter
SQL> COLUMN sys_trig NEW_VALUE sys_trig_enabled  NOPRINT;
SQL> SELECT parm_values.ksppstvl as sys_trig
 2     FROM sys.x$ksppi parms, sys.x$ksppsv parm_values
 3     WHERE parms.ksppinm = '_system_trig_enabled' AND
 4           parms.inst_id = USERENV('Instance') AND
 5           parms.indx = parm_values.indx;

1 row selected.

SQL> 
SQL> -- if pdb was already closed, don't exit on error
SQL> WHENEVER SQLERROR CONTINUE;
SQL> 
SQL> alter pluggable database "&pdbname" close;
old   1: alter pluggable database "&pdbname" close
new   1: alter pluggable database "PROD_PDB2" close
alter pluggable database "PROD_PDB2" close
*

ERROR at line 1:

ORA-65020: pluggable database PROD_PDB2 already closed

SQL> 
SQL> WHENEVER SQLERROR EXIT;
SQL> 
SQL> alter session set container = CDB$ROOT;

Session altered.

SQL> alter system flush shared_pool;
System altered.

SQL> /
System altered.

SQL> /
System altered.

SQL> alter session set container = "&pdbname";
old   1: alter session set container = "&pdbname"
new   1: alter session set container = "PROD_PDB2"

Session altered.

SQL> 
SQL> alter pluggable database "&pdbname" open restricted;
old   1: alter pluggable database "&pdbname" open restricted
new   1: alter pluggable database "PROD_PDB2" open restricted

ERROR:
ORA-03114: not connected to ORACLE
Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and Real Application Testing options

SQL> select name, open_mode from v$pdbs;

NAME                   OPEN_MODE
------------------------------ ----------
PDB$SEED               READ-ONLY
PROD_PDB1              READ WRITE
PROD_PDB2              MOUNTED

O script noncdb_to_pdb.sql não aparentou ter rodado normalmente. A prova disto é que quando tento abrir a nova PDB em restricted mode, recebo os seguintes erros:

Dump file
DDE recursive invocation exceeded max allowed
DDE was called in a 'No Invocation Mode'
DDE encountered the following error:
ORA-49203: Too many recursive DDE invocations
ORA-00600: internal error code, arguments: [kspgip1], [101], [3298], [1], [_diag_uts_control], [], [], [], [], [], [], []
ORA-00600: internal error code, arguments: [kspgsp1], [101], [3293], [1], [_max_incident_file_size], [], [], [], [], [], [], []
ORA-00600: internal error code, arguments: [kspgip1], [101], [3298], [1], [_diag_uts_control], [], [], [], [], [], [], []
Error when reading init.ora parameter
Check syntax in init.ora file
Also your SRV image may need relinking

O erro se repete ao tentar forçar a abertura da nova PDB em restricted mode

SQL> alter pluggable database prod_pdb1 open restricted;
alter pluggable database prod_pdb1 open restricted
*
ERROR at line 1:

ORA-00600: internal error code, arguments: [504], [0x0DF7ACC58], [64], [4],
[enqueue hash chains], [1], [1], [0x000000000], [], [], [], []
ORA-02002: error while writing to audit trail
ORA-00600: internal error code, arguments: [504], [0x0DF7ACC58], [64], [4],
[enqueue hash chains], [1], [1], [0x000000000], [], [], [], []
ORA-00600: internal error code, arguments: [504], [0x0DF7ACC58], [64], [4],
[enqueue hash chains], [1], [1], [0x000000000], [], [], [], []
ORA-00600: internal error code, arguments: [504], [0x0DF7ACC58], [64], [4],
[enqueue hash chains], [1], [1], [0x000000000], [], [], [], []
ORA-00600: internal error code, arguments: [504], [0x0DF7ACC58], [64], [4],
[enqueue hash chains], [1], [1], [0x000000000], [], [], [], []
ORA-01078: failure in processing system parameters
ORA-00600: internal error code, arguments: [kspgip1], [101], [3298], [1],
[_diag_uts_control], [], [], [], [], [], [], []
ORA-00600: internal error code, arguments: [kspgsp1], [101], [3292], [1],
[max_dump_file_size], [], [], [], [], [], [], []
ORA-00600: internal error code, arguments: [kspgip1], [101], [3298], [1],
[_diag_uts_control], [], [], [], [], [], [], []

Foi possível observar também que os arquivos de trace mostram uma inabilidade de ler algum tipo de parametro de inicialização ao tentar abrir a PDB.

Como não consegui encontrar nenhum registro sobre este erro no MOS, fiz o download a estou applicando o PSU October 15, 2013 Oracle Grid Infrastructure System Patch – 17272829. Este PSU aplica os patches em ambos Grid Infrastructure Home bem como o Oracle Database Home.

Uma curiosidade durante a aplicação do PSU foi que o opatchauto apply  apresentou erros pois esperava mais de 5GB de espaço livre sendo que o patch em si não possuía mais de 800MB. Os 3GB livres que eu tinha no /u01 não foram suficientes para aplicação do patch.

Mais 10GB foram adicionados a VM, bem como mais memória RAM a fim de igualar o parametro MEMORY_TARGET da instância Non-CDB com o parâmetro da instância CDB. Nenhuma das tentativas deu resultado positivo. 

Conclusão

Prosseguindo com as tentativas de plugar uma Non-CDB a um CDB, verifica-se que, na maioria dos casos, é possível plugar o banco de dados. Porém, não foi possível rodar o script script noncdb_to_pdb.sql devido aos ORA-600 que ocorrem quando o script tenta abrir a PDB em modo restrito.

Como mencionado no início desta sessão, convidamos os demais articulistas a tentar replicar esta operação nos seus ambientes. Neste momento, estou convencido de que existe um bug ainda não descoberto ou publicado pela Oracle.

Transportable Database

Como o procedimento anterior via DBMS_PDB.describe e plug não funcionou, irei ilustrar um outro método de migração da uma Non-CDB para um CDB – Transportable Database

Resumo desta Operação

Cria-se uma nova PDB baseada na PDB$SEED

  • Como iremos utilizar um network link para fazer o import, criamos um database link entre a nova PDB e a Non-CDB
  • Coloca-se os user tablespaces da Non-CDB em modo READ-ONLY: Como o procedimento transportable database não inclui os tablespaces administrativos como SYSTEM e SYSAUX, somente os user tablespaces serão colocados em READ-ONLY e copiados para a PDB.
  • Executamos o import que fará uso de um database link
  • Volta-se os user tablespaces para o modo READ WRITE na Non-CDB

Como não possuímos nenhum user tablespace que não seja o USERS em nosso CDB, prosseguimos com a criação de mais um tablespace bem como  alguns objetos.

ORA-00600 [oracle@12c admin]$ . oraenv
ORACLE_SID = [noncdb] ? 
The Oracle base remains unchanged with value /u01/app/oracle
[oracle@12c admin]$ sqlplus / as sysdba

SQL*Plus: Release 12.1.0.1.0 Production on Mon Dec 2 09:49:54 2013
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and Real Application Testing options
SQL> show parameter create

NAME                 TYPE     VALUE
------------------------------------ ----------- ------------------------------
create_bitmap_area_size          integer    8388608
create_stored_outlines         string
db_create_file_dest             string     +DATA
db_create_online_log_dest_1         string
db_create_online_log_dest_2         string
db_create_online_log_dest_3         string
db_create_online_log_dest_4         string
db_create_online_log_dest_5         string 

SQL> select name from v$tablespace;

NAME
------------------------------
SYSTEM
SYSAUX
UNDOTBS1
TEMP
USERS

SQL> create tablespace mytbs datafile size 100m autoextend on next 10m maxsize unlimited extent management local segment space management auto;

Tablespace created.

SQL> select file_name from dba_data_files where tablespace_name in ('USERS','MYTBS');

FILE_NAME
--------------------------------------------------------------------------------
+DATA/NONCDB/DATAFILE/users.272.832602221
+DATA/NONCDB/DATAFILE/mytbs.279.833104385

Prosseguimos com a criação de uma nova PDB em nossa CDB instance. 

SQL> create pluggable database noncdb_pdb admin user noncdb identified by oracle roles=(dba);

Pluggable database created.

SQL> alter pluggable database noncdb open;

Pluggable database altered.

CREATE PUBLIC DATABASE LINK "NONCDB.XPS15Z.COM" 
CONNECT TO system IDENTIFIED BY oracle 
USING '12c.xps15z.com:1521/noncdb.xps15z.com';

Coloca-se os user tablespaces em modo READ-ONLY

CREATE SQL> alter tablespace users read only;
Tablespace altered.

SQL> alter tablespace mytbs read only;
Tablespace altered.

Copia-se os data files pertencentes aos tablespaces acima listados para o destino. Neste caso, usamos o utilitátio asmcmd para fazer a cópia dos data files. Como a fonte e destino estão na mesma instância ASM, isso facilita o processo de cópia, porém é possível efetuar cópias entre instâncias ASM através do commando asmcmd cp.

ASMCMD> cp +DATA/NONCDB/DATAFILE/users.272.832602221 +DATA/PROD/EC8B323D3E5C6408E043FA00A8C04676/DATAFILE/users.dbf
copying +DATA/NONCDB/DATAFILE/users.272.832602221 -> +DATA/PROD/EC8B323D3E5C6408E043FA00A8C04676/DATAFILE/users.dbf
ASMCMD> cp +DATA/NONCDB/DATAFILE/mytbs.279.833104385 +DATA/PROD/EC8B323D3E5C6408E043FA00A8C04676/DATAFILE/mytbs.dbf
copying +DATA/NONCDB/DATAFILE/mytbs.279.833104385 -> +DATA/PROD/EC8B323D3E5C6408E043FA00A8C04676/DATAFILE/mytbs.dbf

No banco de dados de destino, neste caso a instância CDB “prod”, iniciamos a importação do banco de dados através do utilitário impdp.

$ impdp 'sys/oracle@noncdb_pdb as sysdba' full=Y directory=NONCDB_PDB_DIR network_link=noncdb2.xps15z.com transportable=always transport_datafiles='+DATA/PROD/EC8B323D3E5C6408E043FA00A8C04676/DATAFILE/users.dbf', '+DATA/PROD/EC8B323D3E5C6408E043FA00A8C04676/DATAFILE/mytbs.dbf' logfile=import.log

Import: Release 12.1.0.1.0 - Production on Mon Dec 2 14:51:07 2013
Copyright (c) 1982, 2013, Oracle and/or its affiliates.  All rights reserved.
Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and Real Application Testing options
Starting "SYS"."SYS_IMPORT_FULL_01":  "sys/********@noncdb_pdb AS SYSDBA" full=Y directory=NONCDB_PDB_DIR network_link=noncdb2.xps15z.com transportable=always transport_datafiles=+DATA/PROD/EC8B323D3E5C6408E043FA00A8C04676/DATAFILE/users.dbf, +DATA/PROD/EC8B323D3E5C6408E043FA00A8C04676/DATAFILE/mytbs.dbf logfile=import.log 

Estimate in progress using BLOCKS method...
Processing object type DATABASE_EXPORT/PLUGTS_FULL/FULL/PLUGTS_TABLESPACE
Processing object type DATABASE_EXPORT/PLUGTS_FULL/PLUGTS_BLK
Processing object type DATABASE_EXPORT/EARLY_OPTIONS/VIEWS_AS_TABLES/TABLE_DATA
Processing object type DATABASE_EXPORT/NORMAL_OPTIONS/TABLE_DATA
Processing object type DATABASE_EXPORT/NORMAL_OPTIONS/VIEWS_AS_TABLES/TABLE_DATA

Total estimation using BLOCKS method: 2.765 MB

Processing object type DATABASE_EXPORT/PRE_SYSTEM_IMPCALLOUT/MARKER
Processing object type DATABASE_EXPORT/PRE_INSTANCE_IMPCALLOUT/MARKER
Processing object type DATABASE_EXPORT/TABLESPACE

ORA-39083: Object type TABLESPACE:"UNDOTBS1" failed to create with error:
ORA-01516: nonexistent log file, data file, or temporary file "+DATA/NONCDB/DATAFILE/undotbs1.278.832602189"
Failing sql is:
ALTER DATABASE DATAFILE '+DATA/NONCDB/DATAFILE/undotbs1.278.832602189' RESIZE 749731840
ORA-31684: Object type TABLESPACE:"TEMP" already exists
Processing object type DATABASE_EXPORT/PROFILE
Processing object type DATABASE_EXPORT/SYS_USER/USER
Processing object type DATABASE_EXPORT/SCHEMA/USER
ORA-31684: Object type USER:"OUTLN" already exists
ORA-31684: Object type USER:"MDDATA" already exists
ORA-31684: Object type USER:"SPATIAL_WFS_ADMIN_USR" already exists
ORA-31684: Object type USER:"SPATIAL_CSW_ADMIN_USR" already exists
ORA-31684: Object type USER:"FLOWS_FILES" already exists
ORA-31684: Object type USER:"APEX_PUBLIC_USER" already exists
ORA-31684: Object type USER:"APEX_040200" already exists
Processing object type DATABASE_EXPORT/ROLE
ORA-31684: Object type ROLE:"SPATIAL_WFS_ADMIN" already exists
ORA-31684: Object type ROLE:"WFS_USR_ROLE" already exists
ORA-31684: Object type ROLE:"SPATIAL_CSW_ADMIN" already exists
ORA-31684: Object type ROLE:"CSW_USR_ROLE" already exists
ORA-31684: Object type ROLE:"APEX_ADMINISTRATOR_ROLE" already exists
ORA-31684: Object type ROLE:"APEX_GRANTS_FOR_NEW_USERS_ROLE" already exists
Processing object type DATABASE_EXPORT/RADM_FPTM
Processing object type DATABASE_EXPORT/GRANT/SYSTEM_GRANT/PROC_SYSTEM_GRANT
Processing object type DATABASE_EXPORT/SCHEMA/DEFAULT_ROLE
Processing object type DATABASE_EXPORT/SCHEMA/ON_USER_GRANT
Processing object type DATABASE_EXPORT/SCHEMA/TABLESPACE_QUOTA
Processing object type DATABASE_EXPORT/RESOURCE_COST
Processing object type DATABASE_EXPORT/TRUSTED_DB_LINK
Processing object type DATABASE_EXPORT/SYSTEM_PROCOBJACT/PRE_SYSTEM_ACTIONS/PROCACT_SYSTEM
Processing object type DATABASE_EXPORT/SYSTEM_PROCOBJACT/PROCOBJ
Processing object type DATABASE_EXPORT/SYSTEM_PROCOBJACT/POST_SYSTEM_ACTIONS/PROCACT_SYSTEM
Processing object type DATABASE_EXPORT/SCHEMA/PROCACT_SCHEMA
Processing object type DATABASE_EXPORT/EARLY_OPTIONS/VIEWS_AS_TABLES/TABLE
. . imported "SYS"."KU$_EXPORT_USER_MAP"                     35 rows
Processing object type DATABASE_EXPORT/EARLY_POST_INSTANCE_IMPCALLOUT/MARKER
Processing object type DATABASE_EXPORT/NORMAL_OPTIONS/TABLE
. . imported "ORDDATA"."ORDDCM_DOCS_TRANSIENT"                9 rows
. . imported "SYS"."AMGT$DP$AUD$"                             4 rows
. . imported "SYS"."AMGT$DP$DAM_CONFIG_PARAM$"               14 rows
. . imported "SYS"."DP$TSDP_PARAMETER$"                       1 rows
. . imported "SYS"."DP$TSDP_POLICY$"                          1 rows
. . imported "SYS"."DP$TSDP_SUBPOL$"                          1 rows
. . imported "SYSTEM"."REDO_DB_TMP"                           1 rows
. . imported "WMSYS"."E$ENV_VARS$"                            5 rows
. . imported "WMSYS"."E$EVENTS_INFO$"                        12 rows
. . imported "WMSYS"."E$HINT_TABLE$"                         75 rows
. . imported "WMSYS"."E$NEXTVER_TABLE$"                       1 rows
. . imported "WMSYS"."E$VERSION_HIERARCHY_TABLE$"             1 rows
. . imported "WMSYS"."E$WORKSPACES_TABLE$"                    1 rows
. . imported "WMSYS"."E$WORKSPACE_PRIV_TABLE$"                8 rows
. . imported "LBACSYS"."OLS_DP$OLS$AUDIT"                     0 rows
. . imported "LBACSYS"."OLS_DP$OLS$COMPARTMENTS"              0 rows
. . imported "LBACSYS"."OLS_DP$OLS$GROUPS"                    0 rows
. . imported "LBACSYS"."OLS_DP$OLS$LAB"                       0 rows
. . imported "LBACSYS"."OLS_DP$OLS$LEVELS"                    0 rows
. . imported "LBACSYS"."OLS_DP$OLS$POL"                       0 rows
. . imported "LBACSYS"."OLS_DP$OLS$POLS"                      0 rows
. . imported "LBACSYS"."OLS_DP$OLS$POLT"                      0 rows
. . imported "LBACSYS"."OLS_DP$OLS$PROFILE"                   0 rows
. . imported "LBACSYS"."OLS_DP$OLS$PROG"                      0 rows
. . imported "LBACSYS"."OLS_DP$OLS$USER"                      0 rows
. . imported "SYS"."AMGT$DP$DAM_CLEANUP_EVENTS$"              0 rows
. . imported "SYS"."AMGT$DP$DAM_CLEANUP_JOBS$"                0 rows
. . imported "SYS"."DP$TSDP_ASSOCIATION$"                     0 rows
. . imported "SYS"."DP$TSDP_CONDITION$"                       0 rows
. . imported "SYS"."DP$TSDP_FEATURE_POLICY$"                  0 rows
. . imported "SYS"."DP$TSDP_PROTECTION$"                      0 rows
. . imported "SYS"."DP$TSDP_SENSITIVE_DATA$"                  0 rows
. . imported "SYS"."DP$TSDP_SENSITIVE_TYPE$"                  0 rows
. . imported "SYS"."DP$TSDP_SOURCE$"                          0 rows
. . imported "SYSTEM"."REDO_LOG_TMP"                          0 rows
. . imported "WMSYS"."E$BATCH_COMPRESSIBLE_TABLES$"           0 rows
. . imported "WMSYS"."E$CONSTRAINTS_TABLE$"                   0 rows
. . imported "WMSYS"."E$CONS_COLUMNS$"                        0 rows
. . imported "WMSYS"."E$LOCKROWS_INFO$"                       0 rows
. . imported "WMSYS"."E$MODIFIED_TABLES$"                     0 rows
. . imported "WMSYS"."E$MP_GRAPH_WORKSPACES_TABLE$"           0 rows
. . imported "WMSYS"."E$MP_PARENT_WORKSPACES_TABLE$"          0 rows
. . imported "WMSYS"."E$NESTED_COLUMNS_TABLE$"                0 rows
. . imported "WMSYS"."E$REMOVED_WORKSPACES_TABLE$"            0 rows
. . imported "WMSYS"."E$RESOLVE_WORKSPACES_TABLE$"            0 rows
. . imported "WMSYS"."E$RIC_LOCKING_TABLE$"                   0 rows
. . imported "WMSYS"."E$RIC_TABLE$"                           0 rows
. . imported "WMSYS"."E$RIC_TRIGGERS_TABLE$"                  0 rows
. . imported "WMSYS"."E$UDTRIG_DISPATCH_PROCS$"               0 rows
. . imported "WMSYS"."E$UDTRIG_INFO$"                         0 rows
. . imported "WMSYS"."E$VERSION_TABLE$"                       0 rows
. . imported "WMSYS"."E$VT_ERRORS_TABLE$"                     0 rows
. . imported "WMSYS"."E$WORKSPACE_SAVEPOINTS_TABLE$"          0 rows

Processing object type DATABASE_EXPORT/NORMAL_OPTIONS/VIEWS_AS_TABLES/TABLE

. . imported "SYSTEM"."SCHEDULER_PROGRAM_ARGS_TMP"           12 rows
. . imported "SYS"."AMGT$DP$AUDTAB$TBS$FOR_EXPORT"            2 rows
. . imported "SYS"."NACL$_ACE_IMP"                            1 rows
. . imported "SYS"."NACL$_HOST_IMP"                           1 rows
. . imported "WMSYS"."E$EXP_MAP"                              3 rows
. . imported "SYS"."DP$DBA_SENSITIVE_DATA"                    0 rows
. . imported "SYS"."DP$DBA_TSDP_POLICY_PROTECTION"            0 rows
. . imported "SYS"."AMGT$DP$FGA_LOG$FOR_EXPORT"               0 rows
. . imported "SYS"."NACL$_WALLET_IMP"                         0 rows
. . imported "SYSTEM"."SCHEDULER_JOB_ARGS_TMP"                0 rows

Processing object type DATABASE_EXPORT/NORMAL_POST_INSTANCE_IMPCALLOU/MARKER
Processing object type DATABASE_EXPORT/STATISTICS/MARKER
Processing object type DATABASE_EXPORT/END_PLUGTS_BLK
Processing object type DATABASE_EXPORT/FINAL_POST_INSTANCE_IMPCALLOUT/MARKER
Processing object type DATABASE_EXPORT/SCHEMA/POST_SCHEMA/PROCOBJ

ORA-39083: Object type PROCOBJ:"APEX_040200"."ORACLE_APEX_PURGE_SESSIONS" failed to create with error:
ORA-27477: "APEX_040200"."ORACLE_APEX_PURGE_SESSIONS" already exists

Failing sql is:
BEGIN 
dbms_scheduler.create_job('"ORACLE_APEX_PURGE_SESSIONS"',
job_type=>'STORED_PROCEDURE', job_action=>
'WWV_FLOW_CACHE.PURGE_SESSIONS'
, number_of_arguments=>0,
start_date=>TO_TIMESTAMP_TZ('27-NOV-2013 03.24.26.580924000 PM +00:00','DD-MON-RRRR HH.MI.SSXFF AM TZR','NLS_DATE_LANGUAGE=english'), repeat_interval=> 
'FREQ

ORA-39083: Object type PROCOBJ:"APEX_040200"."ORACLE_APEX_MAIL_QUEUE" failed to create with error:
ORA-27477: "APEX_040200"."ORACLE_APEX_MAIL_QUEUE" already exists

Failing sql is:
BEGIN 
dbms_scheduler.create_job('"ORACLE_APEX_MAIL_QUEUE"',
job_type=>'STORED_PROCEDURE', job_action=>
'WWV_FLOW_MAIL.PUSH_QUEUE_IMMEDIATE'
, number_of_arguments=>0,
start_date=>TO_TIMESTAMP_TZ('27-NOV-2013 03.24.27.202461000 PM +00:00','DD-MON-RRRR HH.MI.SSXFF AM TZR','NLS_DATE_LANGUAGE=english'), repeat_interval=> 
'FREQ=MINUTE

ORA-39083: Object type PROCOBJ:"APEX_040200"."ORACLE_APEX_WS_NOTIFICATIONS" failed to create with error:
ORA-27477: "APEX_040200"."ORACLE_APEX_WS_NOTIFICATIONS" already exists

Failing sql is:
BEGIN 
dbms_scheduler.create_job('"ORACLE_APEX_WS_NOTIFICATIONS"',
job_type=>'STORED_PROCEDURE', job_action=>
'WWV_FLOW_WORKSHEET_API.DO_NOTIFY'
, number_of_arguments=>0,
start_date=>TO_TIMESTAMP_TZ('27-NOV-2013 03.24.27.264994000 PM +00:00','DD-MON-RRRR HH.MI.SSXFF AM TZR','NLS_DATE_LANGUAGE=english'), repeat_interval

ORA-39083: Object type PROCOBJ:"APEX_040200"."ORACLE_APEX_DAILY_MAINTENANCE" failed to create with error:
ORA-27477: "APEX_040200"."ORACLE_APEX_DAILY_MAINTENANCE" already exists

Failing sql is:
BEGIN 
dbms_scheduler.create_job('"ORACLE_APEX_DAILY_MAINTENANCE"',
job_type=>'STORED_PROCEDURE', job_action=>
'WWV_FLOW_MAINT.DAILY_MAINTENANCE'
, number_of_arguments=>0,
start_date=>TO_TIMESTAMP_TZ('27-NOV-2013 03.24.27.335199000 PM +00:00','DD-MON-RRRR HH.MI.SSXFF AM TZR','NLS_DATE_LANGUAGE=english'), repeat_inter

Processing object type DATABASE_EXPORT/SCHEMA/POST_SCHEMA/PROCACT_SCHEMA
Processing object type DATABASE_EXPORT/AUDIT_UNIFIED/AUDIT_POLICY_ENABLE
Processing object type DATABASE_EXPORT/AUDIT
Processing object type DATABASE_EXPORT/POST_SYSTEM_IMPCALLOUT/MARKER

Job "SYS"."SYS_IMPORT_FULL_01" completed with 19 error(s) at Mon Dec 2 14:55:09 2013 elapsed 0 00:03:56

Uma vez que o processo terminou, podemos verificar que ambos user tablespaces fazem parte de nossa PDB:

SQL> connect sys/oracle@noncdb_pdb as sysdba
Connected.

SQL> select open_mode from v$database;

OPEN_MODE
--------------------
READ WRITE

SQL> select name from v$datafile;

NAME
--------------------------------------------------------------------------------
+DATA/PROD/DATAFILE/undotbs1.284.832759501
+DATA/PROD/EC8B323D3E5C6408E043FA00A8C04676/DATAFILE/system.259.833104601
+DATA/PROD/EC8B323D3E5C6408E043FA00A8C04676/DATAFILE/sysaux.260.833104599
+DATA/PROD/EC8B323D3E5C6408E043FA00A8C04676/DATAFILE/mytbs.dbf
+DATA/PROD/EC8B323D3E5C6408E043FA00A8C04676/DATAFILE/users.dbf

SQL> select name from v$tablespace;

NAME
------------------------------
UNDOTBS1
SYSTEM
SYSAUX
TEMP
MYTBS
USERS

6 rows selected.

Criando PDB’s com base em outras PDB’s (clone)

Para finalizar este artigo, irei demonstrar mais uma maneira de provisionar novas PDB’s – Clonagem de PDB’s.

Esta técnica, copia a PDB fonte e o resultado desta cópia é plugado na mesma CDB como uma nova PDB.

O procedimento de clonagem de uma PDB, incluem os seguintes passos:

  • Seta-se o parâmetro DB_CREATE_FILE_DEST se estiver usando OMF ou PDB_FILE_NAME_CONVERT para Non-OMF. Estes parâtros servem para instruir o Oracle no que diz respeito a onde os data files relacionados a nova PDB irão residir. Cabe lembrar que este parâmetro é um parâmetro de inicialização que pretence ao âmbito da instância.
  • Conecta-se ao root CDB como um common user que possua o privilégio CREATE PLUGGABLE DATABASE (SYS neste exemplo)
  • Coloca-se a PDB fonte em modo READ-ONLY. Caso a PDB fonte esteja aberta, deve-se fechar a PDB via ALTER PLUGGABLE DATABASE CLOSE IMMEDIATE anteriormente.
  • Executar o comando CREATE PLUGGABLE DATABASE com a cláusula FROM
  • Abre-se a nova PDB em modo READ-WRITE

Pré-Requisitos: A PDB fonte deve e destino devem residir no mesmo CDB.

Procedimento

Neste exemplo, iremos criar uma nova PDB com nome de PROD_PDB2 com base na PDB com nome NONCDB_PDB que foi criada durante o exemplo de Transportable Databases descrito anteriormente.

SQL> select name, open_mode from v$pdbs;

NAME            OPEN_MODE
------------------------------ ----------
PDB$SEED            READ ONLY
NONCDB_PDB            READ WRITE

SQL> select file_name from cdb_data_files where con_id=3;

FILE_NAME
--------------------------------------------------------------------------------
+DATA/PROD/EC8B323D3E5C6408E043FA00A8C04676/DATAFILE/system.259.833104601
+DATA/PROD/EC8B323D3E5C6408E043FA00A8C04676/DATAFILE/sysaux.260.833104599
+DATA/PROD/EC8B323D3E5C6408E043FA00A8C04676/DATAFILE/mytbs.dbf
+DATA/PROD/EC8B323D3E5C6408E043FA00A8C04676/DATAFILE/users.dbf

SQL> alter pluggable database noncdb_pdb close immediate;
Pluggable database altered.

SQL> alter pluggable database noncdb_pdb open read only;
Pluggable database altered.

SQL> show parameter DB_CREATE_FILE_DEST

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest             string     +DATA

SQL> create pluggable database prod_pdb2 from noncdb_pdb;
Pluggable database created.

SQL> alter pluggable database prod_pdb2 open;
Pluggable database altered.

SQL> select name, open_mode from v$pdbs;

NAME        OPEN_MODE
-------------------------------
PDB$SEED               READ ONLY
NONCDB_PDB               READ WRITE
PROD_PDB2               READ WRITE

SQL> connect sys/oracle@prod_pdb2 as sysdba
Connected.

SQL> select name from v$datafile;

NAME
--------------------------------------------------------------------------------
+DATA/PROD/DATAFILE/undotbs1.284.832759501
+DATA/PROD/EC91ABC796E84E74E043FA00A8C0A762/DATAFILE/system.286.833132409
+DATA/PROD/EC91ABC796E84E74E043FA00A8C0A762/DATAFILE/sysaux.287.833132409
+DATA/PROD/EC91ABC796E84E74E043FA00A8C0A762/DATAFILE/mytbs.288.833132439
+DATA/PROD/EC91ABC796E84E74E043FA00A8C0A762/DATAFILE/users.289.833132453

Conclui-se este artigo com sentimentos mistos no que diz respeito a facilidade de provisionamento de novas PDB’s. Existem recursos que realmente facilitam o dia-a-dia do DBA como por exemplo clonagem de PDB’s e criação de novas PDB’s com base na PDB seed. Porém, a maioria destes métodos tornam-se consideravelmente mais complexos quando o banco de dados fonte e o CDB de destino encontram-se em servidores e/ou storages diferentes.

Um dos recursos mais importantes de migração de bancos de dados convencionais Non-CDB para CDB por intermédio de plug/unplug aparenta estar ainda em sua “infância” devido aos vários problemas encontrados durante o exercício deste artigo.

Outro ponto que este artigo ignora, são as Very Large Databases (VLDB’s). Ao considerar a migração de um banco de dados de, digamos, 600 Terabytes entre um servidor/storage para outro, entramos em um plano totalmente diferente. Em muitos casos, os exemplos propostos e demonstrados neste artigo podem tornar-se inviáveis.

Pois bem, venho pedir vossa contribuição enviando comentários, críticas bem como os resultados de seus testes a fim de enriquecermos este artigo.

Espero ter ajudado ou pelo menos instigado a curiosidade e iniciativa de criar novos artigos aprofundando os assuntos que foram pauta deste artigo.

Até a próxima!

Quão útil foi este post ?

Clique em uma estrela para classificar o post

nota média 5 / 5. Contagem de votos: 33

Sem votos ! Seja o primeiro a classificar !

Marcações:

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

plugins premium WordPress