O Database Create Assistant (DBCA) é a ferramenta padrão do Oracle para criar novos bancos de dados, oferecendo diversas opções que facilitam essa tarefa, como a criação e utilização de templates.

Na versão 12cR2, a Oracle introduziu a capacidade de clonar um banco de dados existente, podendo ele estar no mesmo servidor ou em um servidor remoto. Na verdade, o DBCA simplesmente automatiza as tarefas para criar uma nova instância e usa o RMAN para executar um Duplicate Database.

Na versão 12cR2 só é suportado o clone de um banco de dados non-CDB. A partir da versão 18c o procedimento suporta clone de um CDB. Até a versão 19c não é possível usar essa feature no modo interativo (interface gráfica), somente em silent mode (modo texto do DBCA).

A opção no DBCA que executa esse trabalho é -createDuplicateDB. Veja todas as opções desse comando:


[oracle@srvup1 ~]$ dbca -createDuplicateDB -help
        -createDuplicateDB - Command to Duplicate a database.
                -gdbName <Global database name>
                -primaryDBConnectionString <EZCONNECT string to connect to primary database for example "host:port/servicename">
                -sid <Database system identifier>
                [-useWalletForDBCredentials <true | false> Specify true to load database credentials from wallet]
                        -dbCredentialsWalletLocation <Path of the directory containing the wallet files>
                        [-dbCredentialsWalletPassword <Password to open wallet with auto login disabled>]
                [-initParams <Comma separated list of name=value pairs>]
                        [-initParamsEscapeChar <Specify escape character for comma when a specific initParam has multiple values.If the escape character is not specified backslash is the default escape character>]
                [-policyManaged | -adminManaged]
                [-policyManaged <Policy managed database, default option is Admin managed database>]
                        -serverPoolName <Specify the single server pool name in case of create server pool or comma separated list in case of existing server pools>
                        [-pqPoolName <value>]
                        [-createServerPool <Create a new server pool, which will be used by the database>]
                                [-pqPoolName <value>]
                                [-forceServerPoolCreation <To create server pool by force when adequate free servers are not available. This may affect the database which is already in running mode>]
                                [-pqCardinality <value>]
                                [-cardinality <Specify the cardinality of the new server pool that is to be created, default is the number of qualified nodes>]
                [-adminManaged <Admin managed database, this is default option>]
                [-datafileDestination <Destination directory for all database files>]
                [-nodelist <Node names separated by comma for the database>]
                [-databaseConfigType <SINGLE | RAC | RACONENODE>]
                        [-RACOneNodeServiceName <Service name for the service to be created for RAC One Node database. This option is mandatory when the databaseConfigType is RACONENODE>]
                [-createAsStandby <Option to create a standby database>]
                        [-dbUniqueName <db_unique_name for standby db>]
                [-customScripts <A comma separated list of SQL scripts which needs to be run post db creation.The scripts are run in order they are listed>]

[oracle@srvup1 ~]$

Como podemos perceber, são muitas opções que permitem clonar desde ambientes com Transparent Data Encryption (TDE, vide uso de wallet), ambientes Real Application Clusters (RAC), criar o clone como um Standby e até mesmo especificar uma lista de scripts SQL customizados que o DBA desejar executar após o procedimento.

Para o cenário mais simples, se o banco de dados de origem usa Oracle Managed Files (OMF), precisamos apenas das seguintes opções:

  • -gdbName: Global Database Name do banco de dados que será criado.
  • -primaryDBConnectionString: String de conexão com o banco de dados que será clonado
  • -sid: SID do banco de dados que será criado.

Se OMF não é utilizado na origem, podemos utilizar a opção -initParams para habilitar OMF no banco de dados que será clonado (destino). Veja o exemplo abaixo:

$ dbca -silent -createDuplicateDB \
-gdbName CLONE \
-primaryDBConnectionString "localhost:1521/up19.localdomain" \
-sid CLONE \
-initParams db_create_file_dest='/u01/app/oracle/oradata'

Dica

Observe que a barra invertida permite quebrar linha no DBCA

Opcionalmente podemos informar a senha do usuário SYS do banco de dados que será clonado com a cláusula -sysPassword. Caso não seja informado no comando, o DBCA irá solicitar via prompt. Por segurança, é recomendado não passar a senha diretamente no comando pois fica exposta no histórico de comandos do sistema operacional.

Exemplo informando a senha:

$ dbca -silent -createDuplicateDB -gdbName CLONE -primaryDBConnectionString "localhost:1521/up19.localdomain" -sid CLONE -sysPassword senha

Exemplo sem informar a senha, o DBCA solicita logo em seguida:

$ dbca -silent -createDuplicateDB -gdbName CLONE -primaryDBConnectionString "localhost:1521/up19.localdomain" -sid CLONE
Enter SYS user password:

Neste exemplo, um banco de dados no mesmo servidor será clonado. O nome do banco de dados de origem é up19 e o service name é up19.localdomain. O nome do banco de dados que será criado é CLONE. No parâmetro -primaryDBConnectionString precisamos passar uma string de conexão no padrão EASY CONNECT, por tanto é necessário usar o service name em vez do SID de origem.

O número da porta é obrigatório, mesmo que seja 1521

Um comportamento estranho é que é obrigatório informar o número da porta do Listener. O comportamento padrão do EASYCONECT é assumir a porta padrão 1521 quando a mesma é omitida.

Confusamente, se não informarmos o número da porta, o DBCA acusa que o banco de dados deveria estar em ARCHIVELOG (mesmo que já esteja).

Veja o log de execução do comando:

$ dbca -silent -createDuplicateDB \
> -gdbName CLONE \
> -primaryDBConnectionString "localhost:1521/up19.localdomain" \
> -sid CLONE \
> -initParams db_create_file_dest='/u01/app/oracle/oradata'
Enter SYS user password:

Prepare for db operation
22% complete
Listener config step
44% complete
Auxiliary instance creation
67% complete
RMAN duplicate
89% complete
Post duplicate database operations
100% complete

Look at the log file "/u01/oracle/cfgtoollogs/dbca/CLONE/CLONE1.log" for further details.

Note que é gerado um arquivo de log em $ORACLE_BASE/cfgtoollogs/dbca. O arquivo não é muito rico em detalhes, somente as etapas macro que são exibidas no terminal e os respectivos horários de conclusão.

$ cat /u01/oracle/cfgtoollogs/dbca/CLONE/CLONE1.log
[ 2020-03-22 15:42:24.078 BRT ] Prepare for db operation
DBCA_PROGRESS : 22%
[ 2020-03-22 15:42:24.142 BRT ] Listener config step
DBCA_PROGRESS : 44%
[ 2020-03-22 15:42:24.361 BRT ] Auxiliary instance creation
DBCA_PROGRESS : 67%
[ 2020-03-22 15:42:39.848 BRT ] RMAN duplicate
DBCA_PROGRESS : 89%
[ 2020-03-22 15:45:38.640 BRT ] Post duplicate database operations
DBCA_PROGRESS : 100%
[ 2020-03-22 15:47:51.314 BRT ]

A partir da etapa 67% | RMAN Duplicate, podemos abrir outro terminal e monitorar o trabalho do RMAN pelo SQL*PLUS:

SQL> SELECT SID, ROW_TYPE, OPERATION 
FROM V$RMAN_STATUS 
WHERE STATUS = 'RUNNING';

       SID ROW_TYPE            OPERATION
---------- ------------------- ---------------------------------
       130 SESSION             RMAN
       130 COMMAND             DUPLICATE DB FROM ACTIVE USING B

O exemplo a seguir demonstra o clone sendo realizado a partir de outro servidor que usa Automatic Storage Management (ASM). Observe que os parâmetros db_create_file_dest e db_recovery_file_dest são utilizados para indicar os ASM Diskgroups para os arquivos no banco de dados que será criado.

dbca -silent -createDuplicateDB \
-gdbName CLONE \
-primaryDBConnectionString "192.168.1.55:1521/up19.localdomain" \
-sid CLONE \
-initParams db_create_file_dest='+KING240',db_recovery_file_dest='+FRA'

Como podemos ver, é possível facilmente clonar um banco de dados de filesystem para ASM e vise versa. Uma observação é que quando clonamos um CDB no mesmo servidor, é recomendado configurar a nova instância em um Listener diferente para evitar conflito com service name dos PDBs.

Leave a Reply

Discover more from Blog do Dibiei

Subscribe now to keep reading and get access to the full archive.

Continue reading