
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.