Usar o Oracle Direct NFS com o Backup e DR

Para usar o Oracle Direct NFS (dNFS) com um appliance de backup/recuperação, é necessário atender aos seguintes requisitos:

  • Largura de banda de rede suficiente entre o servidor de banco de dados e o dispositivo de backup/recuperação

  • Use todos os patches obrigatórios ou recomendados da Oracle. A Oracle mantém uma lista de patches obrigatórios ou recomendados na documentação de suporte da Oracle.

Configurar o console de gerenciamento para proteger e montar bancos de dados virtuais do Oracle pelo dNFS

Para fazer backup com o dNFS, defina o formato de disco de preparo do dispositivo de backup/recuperação (preferência de disco) como NFS.

Use estas instruções para definir o formato do disco de preparação (preferência de disco) como NFS:

  1. Acesse Gerenciar > Hosts.

  2. Clique com o botão direito do mouse no host e selecione Edit.

  3. Em Como preparar o formato do disco, selecione NFS e clique em Salvar.

Ações a serem realizadas no host de destino para que o dNFS funcione

Execute estas ações para garantir que o dNFS esteja configurado corretamente:

  1. Verifique a seguinte mensagem em DB Alert.log para confirmar se o dNFS está ativado:

    Oracle instance running with ODM: Oracle Direct NFS ODM Library Version 3.01.
    

    Se o dNFS não estiver ativado, faça o seguinte:

    • Os pacotes de cliente NFS precisam existir no host do banco de dados para jobs de proteção e em qualquer host Oracle em que você possa montar um banco de dados Oracle capturado usando o dNFS. Por exemplo, no Linux, o pacote nfs-util precisa existir no host. Verifique o seguinte:

      rpm -qa |grep nfs-util

    • Ative o dNFS no host Oracle:

      cd $ORACLE_HOME/rdbms/lib make -f ins_rdbms.mk dnfs_on

    • Reinicie os bancos de dados em execução nesse ORACLE_HOME e verifique a seguinte mensagem em DB Alert.log para confirmar se o dNFS está ativado:

      Instância do Oracle em execução com ODM: Oracle Direct NFS ODM Library Version 3.0

  2. Durante o job de backup, execute a consulta a seguir para verificar o uso do dNFS:

    select * from gv$dnfs_servers;
    

    Confira as estatísticas de leitura/gravação do NFS para a E/S em andamento:

    select inst_id, PNUM, NFS_READ, NFS_WRITE, NFS_COMMIT, NFS_MOUNT from
    gv$dnfs_stats where NFS_READ>0 or NFS_WRITE>0 order by inst_id, PNUM;
    

    Podemos ver as informações do processo do canal de dnfs.

    select c.inst_id, program, pid,pname, local, path from gv$process p,
    gv$dnfs_channels c where p.inst_id = c.inst_id and c.pnum = p.pid;
    

Resolver problemas de dNFS: problemas de banco de dados

Isso inclui:

Registro de alertas

A primeira etapa de qualquer operação de depuração é verificar o registro de alertas em busca de mensagens relacionadas ao dNFS. Um problema comum observado em bancos de dados com dNFS é o tamanho do buffer de soquete limitado. O Oracle tenta ajustar o tamanho, mas isso pode ser limitado pelo SO. Nesse caso, um erro como este é encontrado no registro de alertas:

    Direct NFS: Failed to set socket buffer size.wtmax=[1048576]\
    rtmax=[1048576], errno=-1

Outros itens a serem procurados no registro de alertas incluem se as placas de rede corretas estão sendo usadas para se comunicar com o arquivador. Isso pode ser determinado procurando uma mensagem semelhante a esta:

    Direct NFS: channel id [0] path [192.168.56.3] to filer [192.168.56.3] via local [] is UP

Arquivos de rastreamento do banco de dados

Se houver problemas de E/S, os eventos a seguir poderão ser definidos no banco de dados para capturar outras informações de registro. Defina esses eventos, aguarde o incidente ocorrer e analise os arquivos de rastreamento.

    ALTER SYSTEM SET MAX_DUMP_FILE_SIZE =UNLIMITED;
    ALTER SYSTEM SET EVENTS '10298 trace name context forever, level 1'; # KSFD I/O tracing
    ALTER SYSTEM SET EVENTS '19392 trace name context forever, level 8'; # kgnfs tracing
    ALTER SYSTEM SET EVENTS '19394 trace name context forever, level 8'; # skgnfs tracing
    ALTER SYSTEM SET EVENTS '19396 trace name context forever, level 6'; # kgodm tracing
    ALTER SYSTEM SET EVENTS '19398 trace name context forever, level 128'; # mount tracing errors

O banco de dados não está respondendo

Se um banco de dados em execução no dNFS não estiver respondendo, faça login como SYSDBA usando o sqlplus e execute um "hanganalyze" ou um dump:

    ```oradebug
    oradebug setmypid
    oradebug unlimited
    oradebug hanganalyze 3
    oradebug dump systemstate 266
    ```

Se o banco de dados for um banco de dados RAC, adicione uma opção -g aos dois últimos comandos oradebug.

Visualizações de dNFS

O cliente dNFS está no kernel do banco de dados. Portanto, várias visualizações v$ existem no banco de dados para monitorar e verificar a integridade do dNFS. O Oracle fornece um pacote que pode ser usado para monitorar rapidamente a performance do dNFS. Esse pacote está no pacote de monitoramento dNFS do Oracle.

Após a implantação, um DBA pode executar as seguintes ações para receber informações (parâmetros: dnfs_monitor(sleep time), dnfs_itermonitor (sleep time,number of times to check), sleep time is in seconds):

    SQL> set serveroutput on
    SQL> set lines 200
    SQL> exec dnfs_monitor(60);
    Started at  01/18/2017 10:09:46 AM
    Finished at 01/18/2017 10:10:46 AM
    READ IOPS:                 2
    WRITE IOPS:                3
    TOTAL IOPS:                5
    READ Throughput:           0 MB/s
    WRITE Throughput:          0 MB/s
    TOTAL Throughput:          0 MB/s
    SQL> exec dnfs_itermonitor(2,10)
    Started at 01/18/2017 10:20:18 AM
    TIMESTAMP              READ IOPS  WRITE IOPS  TOTAL IOPS  READ(MB/s)  WRITE (MB/s) TOTAL (MB/s)

    01/18/2017 10:20:20 AM  15         7          22           0            0           0

    01/18/2017 10:20:22 AM   2         3          5            0            0           0

    01/18/2017 10:20:24 AM   0         3          3            0            0           0

    01/18/2017 10:20:26 AM   2         2          4            0            0           0

    01/18/2017 10:20:28 AM   0         3          3            0            0           0

    01/18/2017 10:20:30 AM   2         3          5            0            0           0

    01/18/2017 10:20:32 AM   4         3          7            0            0           0

    01/18/2017 10:20:34 AM   0         3          3            0            0           0

    01/18/2017 10:20:36 AM   2         3          5            0            0           0

    01/18/2017 10:20:38 AM   2         3          5            0            0           0

    Finished at 01/18/2017 10:20:38 AM

As visualizações de V$ são:

  • V$DNFS_SERVER: mostra informações para todas as conexões do servidor NFS (uma para cada servidor NFS). A visualização é útil para verificar a conectividade e as configurações do soquete TCP.

  • V$DNFS_CHANNELS: mostra informações de todos os caminhos de rede criados para os servidores NFS. Cada cliente dNFS cria um canal por processo por caminho de rede. Se houver vários caminhos (várias NICs), o cliente dNFS vai fazer o balanceamento de carga em todos os canais. Os dados refletem a atividade desde a última seleção.

  • V$DNFS_FILES: mostra os arquivos abertos usando o cliente dNFS.

  • V$DNFS_STAT: métricas de desempenho para o cliente dNFS.

V$DNFS_SERVER
Coluna Descrição
SRVNAME Nome do servidor NFS
DIRNAME Volume exportado pelo servidor NFS
MNTPORT Porta de montagem local
NFSPORT Porta do servidor NFS
WTMAX Tamanho máximo de gravação para o servidor NFS
RTMAX Tamanho máximo de leitura para o servidor NFS
V$DNFS_CHANNELS
Coluna Descrição
PNUM Número do processo do Oracle (link para o PID em v$process)
SVRNAME Nome do servidor NFS
PATH Caminho de rede para o servidor
CH_ID ID do canal dNFS
SVR_ID ID do servidor dNFS
SENDS Enviar operações pelo canal desde a última seleção.
RECVS Receber operações pelo canal desde a última seleção.
PINGS Operações de ping no canal desde a última seleção.
V$DNFS_FILES
Coluna Descrição
FILENAME Nome do arquivo.
FILESIZE Tamanho do arquivo.
PNUM ID do processo (link para o PID em v$process)
SRV_ID ID do servidor NFS
V$DNFS_STAT
Coluna Descrição
PNUM Número do processo do Oracle (link para o PID em v$process)
NFS_NULL Null operations
NFS_GETATTR Acessar operações de atributos
NFS_SETATTR Definir operações de atributo
NFS_LOOKUP Operações de pesquisa
NFS_ACCESS Operações de acesso
NFS_READLINK Ler operações de link
NFS_READ Operações de leitura
NFS_WRITE Operações de gravação
NFS_CREATE Criar operações
NFS_MKDIR Fazer operações de diretório
NFS_MKNOD Fazer operações de nó
NFS_SYMLINK Operações de link simbólico
NFS_REMOVE Remover operações
NFS_RMDIR Remover operações de diretório
NFS_RENAME Renomear operações
NFS_LINK Operações de vinculação
NFS_READDIR Operações de leitura de diretório
NFS_READDIRPLUS Operações de leitura de diretório e mais
NFS_FSSTAT Operação de status do sistema de arquivos
NFS_FSINFO Operações de informações do sistema de arquivos
NFS_PATHCONF Operações de configuração de caminho
NFS_COMMIT Confirmar operações
NFS_MOUNT Operações de montagem

O pacote de monitoramento dNFS do Oracle

    CREATE OR REPLACE PROCEDURE dnfs_monitor
       (sleepSecs IN NUMBER)
    IS
       startTime       DATE;
       startReadIOPS   NUMBER;
       startWriteIOPS  NUMBER;
       startReadBytes  NUMBER;
       startWriteBytes NUMBER;
       endTime         DATE;
       endReadIOPS     NUMBER;
       endWriteIOPS    NUMBER;
       endReadBytes    NUMBER;
       endWriteBytes   NUMBER;
       readThr         NUMBER;
       writeThr        NUMBER;
       readIOPS        NUMBER;
       writeIOPS       NUMBER;
       elapsedTime     NUMBER;
    BEGIN

       SELECT sysdate, SUM(stats.nfs_readbytes), SUM(stats.nfs_writebytes),
    SUM(stats.nfs_read), SUM(stats.nfs_write)
       INTO startTime, startReadBytes, startWriteBytes, startReadIOPS, startWriteIOPS
       FROM dual, v$dnfs_stats stats;

       DBMS_OUTPUT.PUT_LINE('Started at  ' || TO_CHAR(startTime,'MM/DD/YYYY HH:MI:SS AM'));

       DBMS_LOCK.SLEEP(sleepSecs);

       SELECT sysdate, SUM(stats.nfs_readbytes), SUM(stats.nfs_writebytes), SUM(stats.nfs_read), SUM(stats.nfs_write)
       INTO endTime, endReadBytes, endWriteBytes, endReadIOPS, endWriteIOPS
       FROM dual, v$dnfs_stats stats;

       DBMS_OUTPUT.PUT_LINE('Finished at ' || to_char(endTime,'MM/DD/YYYY HH:MI:SS AM'));

       elapsedTime := (endTime - startTime) * 86400;
       readThr := (endReadBytes - startReadBytes)/(1024 * 1024 * elapsedTime);
       writeThr := (endWriteBytes - startWriteBytes)/(1024 * 1024 * elapsedTime);
       readIOPS := (endReadIOPS - startReadIOPS)/elapsedTime;
       writeIOPS := (endWriteIOPS - startWriteIOPS)/elapsedTime;

       DBMS_OUTPUT.PUT_LINE('READ IOPS:        ' || LPAD(TO_CHAR(readIOPS, '999999999'), 10, ' '));
       DBMS_OUTPUT.PUT_LINE('WRITE IOPS:       ' || LPAD(TO_CHAR(writeIOPS,
       '999999999'), 10, ' '));
       DBMS_OUTPUT.PUT_LINE('TOTAL IOPS:       ' || LPAD(TO_CHAR(readIOPS + writeIOPS, '999999999'), 10, ' '));
       DBMS_OUTPUT.PUT_LINE('READ Throughput:  ' || LPAD(TO_CHAR(readThr, '999999999'), 10, ' ') || ' MB/s');
       DBMS_OUTPUT.PUT_LINE('WRITE Throughput: ' || LPAD(TO_CHAR(writeThr,
       '999999999'), 10, ' ') || ' MB/s');
       DBMS_OUTPUT.PUT_LINE('TOTAL Throughput: ' || LPAD(TO_CHAR(readThr + writeThr, '999999999'), 10, ' ') || ' MB/s');
       END;
    /

    CREATE OR REPLACE PROCEDURE dnfs_itermonitor
       (sleepSecs IN NUMBER,
        iter      IN NUMBER)
    IS
       startTime       DATE;
       startReadIOPS   NUMBER;
       startWriteIOPS  NUMBER;
       startReadBytes  NUMBER;
       startWriteBytes NUMBER;
       endTime         DATE;
       endReadIOPS     NUMBER;
       endWriteIOPS    NUMBER;
       endReadBytes    NUMBER;
       endWriteBytes   NUMBER;
       readThr         NUMBER;
       writeThr        NUMBER;
       readIOPS        NUMBER;
       writeIOPS       NUMBER;
       i               NUMBER;
       elapsedTime     NUMBER;
    BEGIN

       DBMS_OUTPUT.PUT_LINE('Started at ' || TO_CHAR(SYSDATE, 'MM/DD/YYYY HH:MI:SS AM'));

       DBMS_OUTPUT.PUT_LINE(
           LPAD('TIMESTAMP', 15, ' ')||
           LPAD('READ IOPS', 33, ' ')||
           LPAD('WRITE IOPS', 15, ' ')||
           LPAD('TOTAL IOPS', 15, ' ')||
           LPAD('READ (MB/s)', 15, ' ')||
           LPAD('WRITE (MB/s)', 15, ' ')||
           LPAD('TOTAL (MB/s)', 15, ' '));

       FOR i IN 1..iter
       LOOP
       SELECT sysdate, SUM(stats.nfs_readbytes), SUM(stats.nfs_writebytes), SUM(stats.nfs_read), SUM(stats.nfs_write)
       INTO startTime, startReadBytes, startWriteBytes, startReadIOPS, startWriteIOPS
       FROM dual, v$dnfs_stats stats;

       DBMS_LOCK.SLEEP(sleepSecs);

       SELECT sysdate, SUM(stats.nfs_readbytes), SUM(stats.nfs_writebytes), SUM(stats.nfs_read), SUM(stats.nfs_write)
       INTO endTime, endReadBytes, endWriteBytes, endReadIOPS, endWriteIOPS
       FROM dual, v$dnfs_stats stats;

       elapsedTime := (endTime - startTime) * 86400;
       readThr := (endReadBytes-startReadBytes)/(1024 * 1024 * elapsedTime);
       writeThr := (endWriteBytes-startWriteBytes)/(1024 * 1024 * elapsedTime);
       readIOPS := (endReadIOPS - startReadIOPS)/elapsedTime;
       writeIOPS := (endWriteIOPS - startWriteIOPS)/elapsedTime;

       DBMS_OUTPUT.PUT_LINE(
           TO_CHAR(endTime, 'MM/DD/YYYY HH:MI:SS AM')||
           LPAD(TO_CHAR(readIOPS, '999999999'), 15, '') ||
           LPAD(TO_CHAR(writeIOPS, '999999999'), 15,' ') ||
           LPAD(TO_CHAR(readIOPS + writeIOPS, '999999999'),15, ' ') ||
           LPAD(TO_CHAR(readThr, '999999999'), 15, '') ||LPAD(TO_CHAR(writeThr, '999999999'), 15, '
    ') ||
    LPAD(TO_CHAR(readThr + writeThr, '999999999'), 15, ' '));
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('Finished at ' || to_char(endTime, 'MM/DD/YYYY HH:MI:SS AM'));

    END;

Guia do DBA do Oracle