Utilizzare Oracle Direct NFS con Backup e RE

Per utilizzare Oracle Direct NFS (dNFS) con un'appliance di backup/recupero, devono essere soddisfatti i seguenti requisiti:

  • Larghezza di banda di rete sufficiente tra il server di database e l'appliance di backup/ripristino

  • Utilizza tutte le patch Oracle obbligatorie o consigliate. Oracle gestisce un elenco di patch obbligatorie o consigliate nella documentazione dell'assistenza Oracle.

Configura la console di gestione per proteggere e montare database Oracle virtuali su dNFS

Per eseguire il backup basato su dNFS, devi impostare il formato del disco di staging dell'appliance di backup/recupero (preferenza disco) su NFS.

Per impostare il formato del disco di staging (preferenza del disco) su NFS, segui queste istruzioni:

  1. Vai a Gestisci > Host.

  2. Fai clic con il tasto destro del mouse sull'host e seleziona Modifica.

  3. In Formato disco di staging, seleziona NFS e poi fai clic su Salva.

Azioni da eseguire sull'host di destinazione per il funzionamento di dNFS

Esegui queste azioni per assicurarti che dNFS sia configurato correttamente:

  1. Controlla il seguente messaggio in DB Alert.log per verificare che dNFS sia abilitato:

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

    Se dNFS non è abilitato, attivalo:

    • I pacchetti client NFS devono esistere sull'host del database per i job di protezione e su qualsiasi host Oracle su cui potresti montare un database Oracle acquisito utilizzando dNFS. Ad esempio, per Linux, il pacchetto nfs-util deve esistere sull'host. Controlla quanto segue:

      rpm -qa |grep nfs-util

    • Attiva dNFS sull'host Oracle:

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

    • Riavvia i database in esecuzione su ORACLE_HOME, quindi controlla il seguente messaggio in DB Alert.log per verificare che dNFS sia abilitato:

      Istanza Oracle in esecuzione con ODM: Oracle Direct NFS ODM Library Version 3.0

  2. Durante il job di backup, esegui la seguente query per controllare l'utilizzo di dNFS:

    select * from gv$dnfs_servers;
    

    Puoi visualizzare le statistiche Lettura/scrittura NFS per le operazioni di I/O in corso:

    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;
    

    Possiamo visualizzare le informazioni sul processo del canale 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;
    

Risolvere i problemi di dNFS: problemi del database

È incluso quanto segue:

Log avvisi

Il primo passo per qualsiasi operazione di debug è controllare il log degli avvisi per i messaggi correlati a dNFS. Un problema comune osservato sui database con dNFS riguarda la dimensione del buffer del socket limitata. Oracle tenta di regolare le dimensioni, ma ciò può essere limitato dal sistema operativo. In questo caso, nel log degli avvisi viene rilevato un errore simile al seguente:

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

Altri elementi da cercare nel log degli avvisi includono la verifica che le schede di rete corrette vengano utilizzate per comunicare con il filer. Puoi determinarlo cercando un messaggio simile al seguente:

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

File di traccia del database

Se si verificano problemi di I/O, è possibile impostare i seguenti eventi nel database per acquisire informazioni di logging aggiuntive. Imposta questi eventi, attendi che si verifichi l'incidente e poi esaminali per tracciare i file.

    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

Il database non risponde

Se un database in esecuzione su dNFS non risponde, accedi come SYSDBA utilizzando sqlplus ed esegui un'analisi di blocco o un dump:

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

Se il database è un database RAC, aggiungi un'opzione -g agli ultimi due comandi oradebug.

visualizzazioni dNFS

Il client dNFS si trova effettivamente nel kernel del database. Pertanto, nel database esistono diverse viste v$ per monitorare e controllare l'integrità di dNFS dall'interno del database. Oracle fornisce un pacchetto che può essere utilizzato per monitorare rapidamente le prestazioni di dNFS. Questo pacchetto si trova nel pacchetto di monitoraggio dNFS di Oracle.

Una volta eseguito il deployment, un DBA può eseguire le seguenti operazioni per ottenere informazioni (parametri: dnfs_monitor(sleep time), dnfs_itermonitor (sleep time,number of times to check), sleep time è in secondi):

    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

Le visualizzazioni V$ sono:

  • V$DNFS_SERVER: mostra le informazioni per tutte le connessioni al server NFS (una per ogni server NFS). La visualizzazione è utile per verificare la connettività e le impostazioni dei socket TCP.

  • V$DNFS_CHANNELS: mostra informazioni per tutti i percorsi di rete creati per i server NFS. Ogni client dNFS crea un canale per processo per percorso di rete. Se esistono più percorsi (più NIC), il client dNFS distribuisce il carico su tutti i canali. I dati riflettono l'attività dall'ultima selezione.

  • V$DNFS_FILES: mostra i file aperti utilizzando il client dNFS.

  • V$DNFS_STAT: metriche sul rendimento per il client dNFS.

V$DNFS_SERVER
Colonna Descrizione
SRVNAME Nome server NFS
DIRNAME Volume esportato dal server NFS
MNTPORT Porta di montaggio locale
NFSPORT Porta del server NFS
WTMAX Dimensione massima di scrittura per il server NFS
RTMAX Dimensione massima di lettura per il server NFS
V$DNFS_CHANNELS
Colonna Descrizione
PNUM Numero di processo Oracle (link al PID in v$process)
SVRNAME Nome del server NFS
PATH Percorso di rete del server
CH_ID ID canale dNFS
SVR_ID ID server dNFS
SENDS Invia operazioni sul canale dall'ultima selezione.
RECVS Ricevi operazioni sul canale dall'ultima selezione.
PINGS Operazioni di ping sul canale dall'ultima selezione.
V$DNFS_FILES
Colonna Descrizione
FILENAME Nome del file.
FILESIZE Dimensioni del file.
PNUM ID processo (link al PID in v$process)
SRV_ID ID server NFS
V$DNFS_STAT
Colonna Descrizione
PNUM Numero di processo Oracle (link al PID in v$process)
NFS_NULL Null operations
NFS_GETATTR Ottieni operazioni sugli attributi
NFS_SETATTR Impostare le operazioni sugli attributi
NFS_LOOKUP Operazioni di ricerca
NFS_ACCESS Operazioni di accesso
NFS_READLINK Operazioni di lettura dei link
NFS_READ Operazioni di lettura
NFS_WRITE Operazioni di scrittura
NFS_CREATE Operazioni create
NFS_MKDIR Esegui operazioni di directory
NFS_MKNOD Eseguire operazioni sui nodi
NFS_SYMLINK Operazioni sui link simbolici
NFS_REMOVE Rimuovere le operazioni
NFS_RMDIR Rimuovere le operazioni di directory
NFS_RENAME Operazioni di ridenominazione
NFS_LINK Operazioni sui link
NFS_READDIR Operazioni di lettura della directory
NFS_READDIRPLUS Read directory plus operations
NFS_FSSTAT Operazione di stato del file system
NFS_FSINFO Operazioni di informazione sul file system
NFS_PATHCONF Operazioni di configurazione del percorso
NFS_COMMIT Operazioni di commit
NFS_MOUNT Operazioni di montaggio

Pacchetto di monitoraggio Oracle dNFS

    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;

Guida per l'amministratore del database Oracle