Utilizzare Oracle Direct NFS con Backup e RE

Per utilizzare Oracle Direct NFS (dNFS) con un'appliance di backup/ripristino, 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 i database Oracle virtuali tramite dNFS

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

Segui queste istruzioni per impostare il formato del disco di staging (preferenza del disco) su NFS:

  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. Cerca 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 essere presente 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 se il seguente messaggio è presente in DB Alert.log per confermare che dNFS sia attivato:

      Instanza Oracle in esecuzione con ODM: Oracle Direct NFS ODM Library versione 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 di 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 vedere le informazioni relative al 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 relativi a dNFS: problemi del database

È incluso quanto segue:

Log degli avvisi

La prima tappa per qualsiasi operazione di debug è controllare il log degli avvisi per verificare la presenza di messaggi correlati a NFS. Un problema comune osservato nei database con dNFS è la dimensione limitata del buffer della socket. 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 se vengono utilizzate le schede di rete corrette per comunicare con il filer. Per determinare se è così, cerca 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, nel database è possibile impostare i seguenti eventi per acquisire ulteriori informazioni di logging. Imposta questi eventi, attendi che si verifichi l'incidente e poi controlla i file di traccia.

    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 "hanganalyze" 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 di dNFS

Il client dNFS si trova effettivamente nel kernel del database. Pertanto, all'interno del database esistono diverse visualizzazioni v$ per monitorare e controllare lo stato di salute del NFS da database. Oracle fornisce un pacchetto che può essere utilizzato per monitorare rapidamente le prestazioni di dNFS. Questo pacchetto è disponibile nel pacchetto di monitoraggio Oracle dNFS.

Una volta eseguito il deployment, un DBA può eseguire quanto segue per ottenere informazioni (parametri: dnfs_monitor(tempo di sospensione), dnfs_itermonitor (tempo di sospensione,numero di volte da controllare), il tempo di sospensione è 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 della porta TCP.

  • V$DNFS_CHANNELS: mostra le 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 carico del client NFS viene bilanciato 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 del 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 al server
CH_ID ID canale NFS
SVR_ID ID server NFS
SENDS Invia le operazioni tramite il canale dall'ultima selezione.
RECVS Ricevi le 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 del processo Oracle (link al PID in v$process)
NFS_NULL Null operations
NFS_GETATTR Operazioni di recupero degli attributi
NFS_SETATTR Operazioni di impostazione degli attributi
NFS_LOOKUP Operazioni di ricerca
NFS_ACCESS Operazioni di accesso
NFS_READLINK Operazioni di lettura del link
NFS_READ Operazioni di lettura
NFS_WRITE Operazioni di scrittura
NFS_CREATE Operazioni create
NFS_MKDIR Esegui operazioni di directory
NFS_MKNOD Esegui operazioni sui nodi
NFS_SYMLINK Operazioni sui link simbolici
NFS_REMOVE Operazioni di rimozione
NFS_RMDIR Operazioni di rimozione della directory
NFS_RENAME Operazioni di rinominazione
NFS_LINK Operazioni di collegamento
NFS_READDIR Operazioni di lettura della directory
NFS_READDIRPLUS Operazioni di lettura della directory più
NFS_FSSTAT Operazione di stato del file system
NFS_FSINFO Operazioni di informazioni sul file system
NFS_PATHCONF Operazioni di configurazione del percorso
NFS_COMMIT Operazioni di commit
NFS_MOUNT Operazioni di montaggio

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

La guida DBA di Oracle