Oracle Database 12c: Duplicate em modo ativo com RMAN

Por Joel Perez , Mahir M. Quluzade (OCE) & Flávio Soares (OCE)
Postado em Março 2015

Revisado por Marcelo Pirovar - Solution Architect

Índice do artigos:

 

Oracle Recovery Manager- RMAN suporta dois tipos de duplicação de banco de dados: Active Database Duplication e Backup Duplication. Active database duplication foi introduzido com a versão do Oracle Database 11g. O RMAN conduz a cópia do banco de dados para a instância auxiliar através da rede, de modo que nenhum backup do banco de dados origem é necessário para realizar o active database duplication. Na versão RMAN do Oracle Database 11g, ele utiliza image copies para o active database duplication. Este método é referido como o método push-based na duplicação base de dados ativo. Assim, quando o active database duplication é realizado usando o metodo push-based do RMAN, o banco de dados origem transfere as requeridas image copies para o banco de dados auxiliar. O output do active database duplication no Oracle Database 11g Release 2 (11.2.0.3) é como a seguir (apenas as linhas mais importantes estão sendo mostrados):

RMAN>run
2> {
3> allocate channel c1 device type disk;
4> allocate channel c2 device type disk;
Starting backup at 08-APR-14
channel c1: starting datafile copy
input datafile file number=00003 name=/u01/app/oracle/oradata/prmdb/sysaux01.dbf
channel c2: starting datafile copy
input datafile file number=00001 name=/u01/app/oracle/oradata/prmdb/sysaux01.dbf
output file name=/u01/app/oracle/oradata/dupdb/sysaux01.dbf tag=TAG20140408T125110
channel c1: datafile copy complete, elapsed time: 00:02:15
channel c2: datafile copy complete, elapsed time: 00:02:15
Finished backup at 08-APR-14
datafile 1 switched to datafile copy
input datafile copy RECID=3 STAMP=844347476 file name=/u01/app/oracle/oradata/dupdb/system01.dbf


Como se vê no output acima, o RMAN utiliza os target channels (c1, c2) para transferir as image copiesdos arquivos de dados. O uso das image copies para o active database duplication pode necessitar de recursos adicionais a partir do banco de dados de origem. Para superar este problema, um novo método no Oracle 12c banco de dados (12,1) foi introduzido: pull-based active database duplication no qual o RMAN utiliza os backup sets em vez das image copies. Quando RMAN executa a active database duplication usando backup sets, é estabelecida uma conexão com o banco de dados origem e o banco de dados auxiliar. O banco de dados auxiliar em seguida conecta-se ao banco de dados de origem por meio do Oracle Net Services e recupera os arquivos de dados necessários do banco de dados de origem.

Usando backup sets para o active database duplication proporciona algumas vantagens. O RMAN usa os recursos do host de destino. O RMAN pode empregar compressão blocos não utilizados enquanto cria os backups, reduzindo assim o tamanho dos backups que são transportados através do canal auxiliar. Os backup sets podem ser criados em paralelo no banco de dados de origem usando multi section backups. Você também pode criptografar os backup sets criados no banco de dados de origem.

O RMAN usa os backup sets para executar o active database duplication quando a conexão com o banco de dados destino é estabelecida usando um service name e quando qualquer um das próximas condições seja satisfeita: USANDO BACKUPSET, USANDO COMPRESSED BACKUPSET, SECTION SIZE cláusula utilizada com o comando DUPLICATE ... FROM ACTIVE DATABASE, ou quandoonúmero de canais auxiliares (auxiliary) atribuídos seja maior ou igual do que o número de canais atribuídos para o destino (target).

Nota: O RMAN somente utiliza as image copies para realizar a active database duplication (método push-based) quando o número de canais auxiliares alocados forem menores do que o número de canais de destino no Oracle 12c Banco de Dados.

Ao duplicar um banco de dados, o RMAN gera nomes para os arquivos de banco de dados duplicados. Se o host de destino utiliza a mesma estrutura de diretórios como o host de origem, então você pode usar os mesmos nomes para duplicar os arquivos do banco de dados que você usou para os arquivos de banco de dados origem. Neste caso, você não precisa renomear os arquivos duplicados, mas você tem que especificar a opção NOFILENAMECHECK no comando duplicado.

Se os hosts usarem diferentes estruturas de diretório (que usamos neste caso nesta série de artigos), ou se eles utilizam a mesma estrutura mas você pretende nomear os arquivos duplicados de forma diferente, então, decida como gerar os nomes para os arquivos do banco de dados duplicados. Especificamente, decida como nomear os control files, data files, online redo log files e temp files.
O RMAN suporta as seguintes estratégias para gerar nomes de arquivos duplicados:

  • Especifique a cláusula SPFILE no comando DUPLICATE para definir todos os parâmetros necessários envolvendo nomes de arquivos, com exceção dos parâmetrosDB_FILE_NAME_CONVERT e LOG_FILE_NAME_CONVERT.

A Oracle recomenda essa estratégia porque é mais simples. Quando você executa DUPLICATE ... SPFILE, RMAN ou restaura o arquivo de parâmetro do servidor a partir de um backup ou copia a partir de um banco de dados ativo. O RMAN atualiza os valores dos parâmetros de inicialização no server parameter file copiado com base nos valores do SPFILE PARAMETER_VALUE_CONVERT e/ou SPFILE SET (nesta ordem). O RMAN em seguida, reinicia a instância auxiliar com o server parameter file.

  • SPFILE ... PARAMETER_VALUE_CONVERT 'string_pattern'

Especifique os valores para os parâmetros de inicialização que devem especificar os caminho dos arquivos, com exceção dos parâmetros DB_FILE_NAME_CONVERT e LOG_FILE_NAME_CONVERT. O objetivo principal do PARAMETER_VALUE_CONVERT é para que você possa definir um conjunto de parâmetros de inicialização e evitar colocá-los um por um explicitamente.

Nota: PARAMETER_VALUE_CONVERT pode atualizar todos os valores das strings e não apenas aqueles que contêm os nomes dos caminhos. Os valores são case-sensitive.

  • SPFILE ... SET 'string_pattern'

    Define os parâmetros de inicialização para os valores especificados. Você pode usar SET para definir o parâmetro LOG_FILE_NAME_CONVERT para os online redo logs.
  • DB_FILE_NAME_CONVERT 'string_pattern'

Especifique uma regra para criar os nomes de arquivos para data files e os temp files duplicados. Note-se que DB_FILE_NAME_CONVERT especificado no comando DUPLICATE substitui o parâmetro de inicialização DB_FILE_NAME_CONVERT se estiver definido no arquivo de inicialização.

  • NOFILENAMECHECK

Impede que o RMAN verifique que os datafiles do banco de dados de origem e arquivos online redo logs compartilham os mesmos nomes dos arquivos duplicados. Esta opção é necessária quando você está criando um banco de dados duplicado em um host diferente que tem a mesma configuração de disco, estrutura de diretórios e nomes de arquivos como o host do banco de dados de origem. Se o duplicate de um banco de dados for no mesmo host do banco de dados de origem, certifique-se de que NOFILENAMECHECK não está definido.

Nesta série de artigos, testamos dez cenários de Pull-Based Active Database Duplication. Usamos como banco de dados origem um Multitenant Container Database para todos os cenários. Os bancos de dados incluídos nessa série de artigo são como apresentados abaixo:
prmcdb é a nossa fonte de dados (source database) e será executado no host oel62-ora12c-prm. O prmcdb também é um banco de dados Multitenant Container Database (CDB), contém dois plugáveis databases (PDBs): prmpdb01 e prmpdb02, como apresentado abaixo:

[oracle@oel62-ora12c-prm ~]$ uname -snmo
Linux oel62-ora12c-prm.localdomain x86_64 GNU/Linux
[oracle@oel62-ora12c-prm ~]$ export ORACLE_SID=prmcdb
[oracle@oel62-ora12c-prm ~]$ sqlplus / as sysdba
 
SQL*Plus: Release 12.1.0.1.0 Production on Tue Apr 8 15:19:56 2014
 
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, OLAP, Advanced Analytics and Real Application Testing options
 
SQL> select banner from v$version; 
 
BANNER
--------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
PL/SQL Release 12.1.0.1.0 - Production
CORE  12.1.0.1.0       Production
TNS for Linux: Version 12.1.0.1.0 - Production
NLSRTL Version 12.1.0.1.0 - Production
 
SQL> select cdb, name, open_mode, log_mode from v$database;
 
CDB NAME      OPEN_MODE            LOG_MODE
--- --------- -------------------- ------------
YES PRMCDB    READ WRITE           ARCHIVELOG
 
SQL> select con_id, name, open_mode from v$pdbs;
 
   CON_ID NAME                    OPEN_MODE
--------- ----------------------- ----------
       2  PDB$SEED                READ ONLY
       3  PRMPDB01                READ WRITE
       4  PRMPDB02                READ WRITE

Instalamos também a mesma versão do Oracle Database 12c Release 1 (12.1.0.1) em nosso host de destino oel62-ora12c-dup. Usamos esses dois hosts para todos os casos desta série de artigos.

dupcdb será nossa banco de dados duplicado no host de destino e também será Multitenant Container Database (CDB). Antes de executar o comando duplicate usando o RMAN no banco de dados de origem, temos que nos preparar no host de destino, com as seguintes etapas:

  1. Criar um arquivo de parâmetro de inicialização para o duplicate do banco de dados
  2. [oracle@oel62-ora12c-dup ~]$ cd $ORACLE_HOME/dbs
    [oracle@oel62-ora12c-dup dbs]$ cat initdupcdb.ora 
    *.db_name=dupcdb

  3. Adicionar um serviço estatístico no listener.
  4. [oracle@oel62-ora12c-dup admin]$ cd $ORACLE_HOME/network/admin
    [oracle@oel62-ora12c-dup admin]$ cat listener.ora
    # listener.ora Network Configuration File: /u01/app/oracle/product/12.1.0/dbhome/network/admin/listener.ora
    # Generated by Oracle configuration tools.
     
    SID_LIST_LISTENER =
      (SID_LIST =
        (SID_DESC =
          (GLOBAL_DBNAME = dupcdb)
          (ORACLE_HOME = /u01/app/oracle/product/12.1.0/dbhome)
          (SID_NAME = dupcdb)
        )
      )
     
    LISTENER =
      (DESCRIPTION_LIST =
        (DESCRIPTION =
          (ADDRESS = (PROTOCOL = TCP)(HOST = oel62-ora12c-dup.localdomain)(PORT = 1521))
        )
        (DESCRIPTION =
          (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
        )
      )
     
    ADR_BASE_LISTENER = /u01/app/oracle
     
    [oracle@oel62-ora12c-dup admin]$ lsnrctl status
     
    LSNRCTL for Linux: Version 12.1.0.1.0 - Production on 08-APR-2014 15:37:59
     
    Copyright (c) 1991, 2013, Oracle.  All rights reserved.
     
    Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oel62-ora12c-dup.localdomain)(PORT=1521)))
    STATUS of the LISTENER
    ------------------------
    Alias                     LISTENER
    Version                   TNSLSNR for Linux: Version 12.1.0.1.0 - Production
    Start Date                31-MAR-2014 09:55:57
    Uptime                    8 days 5 hr. 42 min. 2 sec
    Trace Level               off
    Security                  ON: Local OS Authentication
    SNMP                      OFF
    Listener Parameter File   /u01/app/oracle/product/12.1.0/dbhome/network/admin/listener.ora
    Listener Log File         /u01/app/oracle/diag/tnslsnr/oel62-ora12c-dup/listener/alert/log.xml
    Listening Endpoints Summary...
      (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oel62-ora12c-dup.localdomain)(PORT=1521)))
      (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
    Services Summary...
    Service "dupcdb" has 1 instance(s).
      Instance "dupcdb", status UNKNOWN, has 1 handler(s) for this service...
    The command completed successfully

  5. Criar um password file para o banco de dados duplicado.
  6. [oracle@oel62-ora12c-dup ~]$ cd $ORACLE_HOME/dbs
    [oracle@oel62-ora12c-dup dbs]$ orapwd file=orapwdupcdb entries=5
     
    Enter password for SYS: 
    [oracle@oel62-ora12c-dup dbs]$ ls -ltr orapwdupcdb 
    -rw-r----- 1 oracle oinstall 5120 Apr  8 15:40 orapwdupcdb

  7. Criar as pastas necessárias para o duplicate. Não esqueça de criar também, as pastas para todos os PDB’s.
  8. [oracle@oel62-ora12c-dup ~]$ cd $ORACLE_BASE
    [oracle@oel62-ora12c-dup oracle]$ mkdir -p oradata/dupcdb
    [oracle@oel62-ora12c-dup oracle]$ mkdir -p fra/dupcdb
    [oracle@oel62-ora12c-dup oracle]$ cd oradata/dupcdb
    [oracle@oel62-ora12c-dup dupcdb]$ mkdir pdbseed
    [oracle@oel62-ora12c-dup dupcdb]$ mkdir prmpdb01
    [oracle@oel62-ora12c-dup dupcdb]$ mkdir prmpdb02
     
    [oracle@oel62-ora12c-dup ~]$ cd $ORACLE_BASE/admin
    [oracle@oel62-ora12c-dup admin]$ mkdir -p dupcdb/adump
    [oracle@oel62-ora12c-dup admin]$ ls -l
    total 4
    drwxr-xr-x 3 oracle oinstall 4096 Apr  8 17:18 dupcd

  9. Adicione o banco de dados fonte e o destino no Net Service name para ambos os servidores:
  10. [oracle@oel62-ora12c-prm ~]$ cd $ORACLE_HOME/network/admin
    [oracle@oel62-ora12c-prm admin]$ cat tnsnames.ora
    # tnsnames.ora Network Configuration File: /u01/app/oracle/product/12.1.0/dbhome/network/admin/tnsnames.ora
    # Generated by Oracle configuration tools.
     
    DUPCDB =
      (DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = oel62-ora12c-dup)(PORT = 1521))
        )
        (CONNECT_DATA =
          (SERVICE_NAME = dupcdb)
        )
      )
     
    PRMCDB =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = oel62-ora12c-prm.localdomain)(PORT = 1521))
        (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = prmcdb)
        )
      )

  11. Iniciar o duplicate do banco de dados no estado nomount:
  12. [oracle@oel62-ora12c-dup ~]$ export ORACLE_SID=dupcdb
    [oracle@oel62-ora12c-dup ~]$ sqlplus / as sysdba
     
    SQL*Plus: Release 12.1.0.1.0 Production on Tue Apr 8 15:49:16 2014
     
    Copyright (c) 1982, 2013, Oracle.  All rights reserved.
     
    Connected to an idle instance.
     
    SQL> startup nomount;
    ORACLE instance started.
     
    Total System Global Area    217157632 bytes
    Fixed Size                  2286656 bytes
    Variable Size              159386560 bytes
    Database Buffers                     50331648 bytes
    Redo Buffers                5152768 bytes
     

  13. Execute o comando de duplicate no target e auxiliary através do RMAN:

Você pode ver todas as saídas de comandos do duplicate para cada caso em outras partes desta série de artigos. Esta série de artigos, abrange os seguintes casos do banco de dados duplicado:


Quando você usa o comando RMAN DUPLICATE, o banco de dados duplicado é criado e em seguida aberto no modo RESETLOGS. Você não pode querer abrir o banco de dados duplicado imediatamente após a sua criação, para os seguintes casos:

 

  • Caso você precise modificar os parâmetros de inicialização do banco de dados duplicado.

Por exemplo, você precisa modificar as configurações de banco de dados flashback, configurar backups incrementais ou modificar o block change tracking.

  • Você está criando um novo banco de dados como parte de um procedimento de atualização.

Durante um upgrade não é possível abrir o banco de dados com a opção RESETLOGS. A cláusula NOOPEN permite duplicar o banco de dados e em seguida, deixá-lo em um estado pronto para a abertura no modo de atualização e posterior execução de scripts de atualização.
Você pode especificar que o banco de dados duplicado não deve ser aberto usando a cláusula NOOPEN no comando DUPLICATE como abaixo:

DUPLICATE TARGET DATABASE TO dupcdb 
FROM ACTIVE DATABASE

NOOPEN;

RMAN Duplicate para PDBs
Um ponto importante, é que o RMAN permite a duplicação não só do CBD, você pode duplicar um ou mais PDBs com o comando DUPLICATE. Além disso, você pode duplicar um conjunto tablespaces dentro de um PDB. Você precisa estar logado no root do CDB com o usuário que é concedido o privilégio SYSDBA ou SYSBACKUP. A partir desta parte, você vai ver os exemplos para duplicar os plugáveis Databases (PDBs). Opções para duplicar os PDBs, estão apresentados nas tabelas abaixos:


Opções do DUPLICATE

Explicação

PLUGGABLE DATABASE pdb_name

Duplica os PDBs especificadas dentro do CDB. Use uma lista delimitada por vírgula para duplicar vários PDBs ao mesmo tempo.

SKIP PLUGGABLE DATABASE pdb_name

Duplica todos os PDBs do CDB, exceto os especificados pelo PDBs pdb_name. Use uma lista delimitada por vírgula para especificar vários PDBs que devem ser excluídos.

TABLESPACE pdb_name:tablespace_name

Duplica os tablespaces especificado dentro de uma PDB. O tablespace name deve ser prefixado com o nome do PDB que contém a tabela. Se você omitir o nome do PDB, o root é tomado como padrão.

SKIP TABLESPACE pdb_name:tablespace_name

Duplica todos os tablespaces no CDB, exceto os tablespaces no PDB especificado.


Esperamos que este artigo tenha sido útil para você. Convidamos a ler a próxima parte desta série de artigos:

Caso 1: Duplicando CDB - Usando Backup Sets para executar um Active Database Duplication



Joel Pérez é um DBA Especialista (Oracle ACE Director, OCM Cloud Admin. & OCM11g ). Com mais de 14 anos de experiência do mundo Oracle Technology, especializado em arquitetura e implementação de soluções como: Cloud, Alta disponibilidade, Disaster/Recovery, Upgrades, replicação e todos as áreas relacionadas com bancos de dados Oracle. Consultor internacional com deveres, conferências e atividades em mais de 50 países e inúmeros clientes em todo o mundo. Palestrante regular nos eventos Oracle em todo o mundo como: OTN LAD, OTN MENA, OTN APAC e muito mais. Joel sempre foi conhecido por ser pioneiro em tecnologia Oracle desde os primeiros dias de sua carreira sendo o primeiro latino-americano premiado como "OTN Expert" no ano de 2003 pela Oracle Corporation, um dos primeiros "ACE Oracle" no Oracle ACE Program no ano de 2004, um dos primeiros OCP Database Cloud Administrator em todo o mundo no ano de 2013 e como um das maiores realizações profissionais em sua carreira, recentemente ele foi homenageado como o primeiro "OCM Database Cloud Administrator" do mundo.

Mahir M. Quluzade é um DBA Sênior com mais de 10 anos de experiência em banco de dados Oracle com foco principal na alta disponibilidade e soluções de recuperação de desastres (RAC, Data Guard, RMAN, ...). Mahir está atualmente trabalhando no Banco Central da República do Azerbaijão. Ele é um DBA OCP. Mahir é membro fundador do Azerbaijão a Oracle User Group (AZEROUG); também é um blogger. Siga Mahir em seu blog.

Flávio Soares é um Oracle DBA Sênior, Exadata DMA, Troubleshooter e Consultor Oracle, certificado em OCP/OCE RAC. Especialista em Exadata, alta disponibilidade e replicação de dados com soluções Oracle. Flávio disponibiliza frequentes informações para a comunidade Oracle através do seu blog.

Este artigo foi revisto pela equipe de produtos Oracle e está em conformidade com as normas e práticas para o uso de produtos Oracle.