Use o Oracle Direct NFS com a Cópia de segurança e RD

Para usar o Oracle Direct NFS (dNFS) com um dispositivo de cópia de segurança/recuperação, tem de cumprir os seguintes requisitos:

  • Largura de banda de rede suficiente entre o servidor de base de dados e a aplicação de cópia de segurança/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 do apoio técnico da Oracle.

Configure a consola de gestão para proteger e montar bases de dados Oracle virtuais através do dNFS

Para fazer uma cópia de segurança baseada em dNFS, tem de definir o formato do disco de preparação do dispositivo de cópia de segurança/recuperação (preferência de disco) como NFS.

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

  1. Aceda a Gerir > Anfitriões.

  2. Clique com o botão direito do rato no anfitrião e selecione Editar.

  3. No formato do disco de preparação, selecione NFS e, de seguida, clique em Guardar.

Ações a realizar no anfitrião de destino para que o dNFS funcione

Realize estas ações para garantir que o dNFS está configurado corretamente:

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

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

    Se o dNFS não estiver ativado, ative-o:

    • Os pacotes de cliente NFS têm de existir no anfitrião da base de dados para tarefas de proteção e em qualquer anfitrião Oracle no qual possa montar uma base de dados Oracle capturada usando o dNFS. Por exemplo, para o Linux, o pacote nfs-util deve existir no anfitrião. Verifique o seguinte:

      rpm -qa |grep nfs-util

    • Ative o dNFS no anfitrião Oracle:

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

    • Reinicie as bases de dados em execução nesse ORACLE_HOME e, em seguida, verifique se existe a seguinte mensagem em DB Alert.log para confirmar que o dNFS está ativado:

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

  2. Durante a tarefa de cópia de segurança, execute a seguinte consulta para verificar a utilização do dNFS:

    select * from gv$dnfs_servers;
    

    Pode ver as estatísticas de leitura/escrita de NFS para a E/S em curso:

    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 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;
    

Resolva problemas de dNFS: problemas de base de dados

Isto inclui:

Registo de alertas

A primeira paragem para qualquer operação de depuração é verificar o registo de alertas para mensagens relacionadas com o dNFS. Um problema comum observado em bases de dados com dNFS está relacionado com o tamanho do buffer do soquete limitado. O Oracle tenta ajustar o tamanho, mas isto pode ser limitado pelo sistema operativo. Neste caso, é encontrado um erro como este no registo de alertas:

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

Outros itens a procurar no registo de alertas incluem se as placas de rede corretas estão a ser usadas para comunicar com o filtro. Pode determinar isto procurando uma mensagem semelhante à seguinte:

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

Ficheiros de rastreio da base de dados

Se ocorrerem problemas de E/S, é possível definir os seguintes eventos na base de dados para captar informações de registo adicionais. Defina estes eventos, aguarde a ocorrência do incidente e, em seguida, reveja-os para rastrear ficheiros.

    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

A base de dados não está a responder

Se uma base de dados em execução no dNFS não estiver a responder, inicie sessão como SYSDBA através do sqlplus e execute um "hanganalyze" ou um despejo:

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

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

Visualizações de dNFS

O cliente dNFS está realmente no kernel da base de dados. Por conseguinte, existem várias visualizações v$ na base de dados para monitorizar e verificar o estado do dNFS a partir da base de dados. A Oracle fornece um pacote que pode ser usado para monitorizar rapidamente o desempenho do dNFS. Este pacote está no pacote de monitorização do Oracle dNFS.

Após a implementação, um DBA pode realizar o seguinte para obter informações (parâmetros: dnfs_monitor(tempo de suspensão), dnfs_itermonitor(tempo de suspensão,número de vezes a verificar), o tempo de suspensão está em segundos):

    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$:

  • V$DNFS_SERVER: mostra informações para todas as ligações do servidor NFS (uma para cada servidor NFS). A vista é útil para verificar a conetividade e as definições da entrada 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 existirem vários caminhos (vários NICs), o cliente dNFS equilibra a carga em todos os canais. Os dados refletem a atividade desde a última seleção.

  • V$DNFS_FILES: mostra os ficheiros que estão abertos através do 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 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 através do canal desde a última seleção.
RECVS Receber operações através do 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 ficheiro.
FILESIZE Tamanho do ficheiro.
PNUM ID do processo (link para 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 Obtenha operações de atributos
NFS_SETATTR Defina operações de atributos
NFS_LOOKUP Operações de pesquisa
NFS_ACCESS Operações de acesso
NFS_READLINK Ler operações de associação
NFS_READ Operações de leitura
NFS_WRITE Operações de escrita
NFS_CREATE Operações de criação
NFS_MKDIR Faça operações de diretório
NFS_MKNOD Faça operações de nós
NFS_SYMLINK Operações de links simbólicos
NFS_REMOVE Remova operações
NFS_RMDIR Remova operações de diretório
NFS_RENAME Operações de mudança de nome
NFS_LINK Operações de associação
NFS_READDIR Operações de leitura do diretório
NFS_READDIRPLUS Ler diretório mais operações
NFS_FSSTAT Operação de estado do sistema de ficheiros
NFS_FSINFO Operações de informações do sistema de ficheiros
NFS_PATHCONF Operações de configuração do caminho
NFS_COMMIT Operações de confirmação
NFS_MOUNT Operações de montagem

O pacote de monitorização dNFS da 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;

O guia de DBA da Oracle