Oracle Direct NFS mit Sicherung und Notfallwiederherstellung verwenden

Damit Sie Oracle Direct NFS (dNFS) mit einer Sicherungs-/Wiederherstellungs-Appliance verwenden können, müssen die folgenden Anforderungen erfüllt sein:

  • Ausreichende Netzwerkbandbreite zwischen Datenbankserver und Sicherungs-/Wiederherstellungs-Appliance

  • Alle erforderlichen oder empfohlenen Oracle-Patches verwenden Oracle führt in der Oracle-Supportdokumentation eine Liste der erforderlichen oder empfohlenen Patches.

Verwaltungskonsole für den Schutz und das Bereitstellen virtueller Oracle-Datenbanken über dNFS konfigurieren

Wenn Sie eine dNFS-basierte Sicherung ausführen möchten, müssen Sie das Staging-Laufwerkformat (Laufwerkeinstellung) der Sicherungs-/Wiederherstellungs-Appliance auf NFS festlegen.

So legen Sie das Format des Staging-Laufwerks (Laufwerkeinstellung) auf NFS fest:

  1. Klicken Sie auf Verwalten > Hosts.

  2. Klicken Sie mit der rechten Maustaste auf den Host und wählen Sie Bearbeiten aus.

  3. Wählen Sie unter „Staging-Laufwerkformat“ die Option NFS aus und klicken Sie auf Speichern.

Aktionen, die auf dem Zielhost ausgeführt werden müssen, damit dNFS funktioniert

Führen Sie die folgenden Schritte aus, um sicherzustellen, dass dNFS richtig konfiguriert ist:

  1. Prüfen Sie unter DB Alert.log, ob die folgende Meldung angezeigt wird, um zu bestätigen, dass dNFS aktiviert ist:

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

    Wenn dNFS nicht aktiviert ist, aktivieren Sie es:

    • NFS-Clientpakete müssen auf dem Datenbankhost für Sicherungsjobs und auf jedem Oracle-Host vorhanden sein, auf dem Sie eine erfasste Oracle-Datenbank mit dNFS bereitstellen können. Unter Linux muss beispielsweise das nfs-util-Paket auf dem Host vorhanden sein. Prüfe Folgendes:

      rpm -qa |grep nfs-util

    • Aktivieren Sie dNFS auf dem Oracle-Host:

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

    • Starten Sie die auf dieser ORACLE_HOME ausgeführten Datenbanken neu und prüfen Sie dann unter DB Alert.log, ob dNFS aktiviert ist:

      Oracle-Instanz, die mit ODM ausgeführt wird: Oracle Direct NFS ODM Library Version 3.0

  2. Führen Sie während des Sicherungsjobs die folgende Abfrage aus, um die dNFS-Nutzung zu prüfen:

    select * from gv$dnfs_servers;
    

    Sie können die NFS-Lese-/Schreibstatistiken für die laufenden I/Os aufrufen:

    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;
    

    Wir sehen die Informationen zur DNFS-Kanalverarbeitung.

    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;
    

dNFS: Datenbankprobleme beheben

Dazu zählen:

Benachrichtigungsprotokoll

Der erste Schritt bei der Fehlerbehebung besteht darin, das Benachrichtigungsprotokoll auf dNFS-bezogene Nachrichten zu prüfen. Ein häufiges Problem bei Datenbanken mit dNFS ist die begrenzte Größe des Socket-Buffers. Oracle versucht, die Größe anzupassen, was jedoch durch das Betriebssystem eingeschränkt werden kann. In diesem Fall wird im Benachrichtigungsprotokoll ein Fehler wie dieser gefunden:

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

Prüfen Sie außerdem im Benachrichtigungsprotokoll, ob die richtigen Netzwerkkarten für die Kommunikation mit dem Dateiserver verwendet werden. Sie können dies anhand einer Meldung wie der folgenden feststellen:

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

Datenbank-Tracedateien

Wenn I/O-Probleme auftreten, können die folgenden Ereignisse in der Datenbank festgelegt werden, um zusätzliche Protokollierungsinformationen zu erfassen. Legen Sie diese Ereignisse fest, warten Sie, bis der Fehler auftritt, und prüfen Sie dann die Trace-Dateien.

    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

Datenbank reagiert nicht

Wenn eine Datenbank, die auf dNFS ausgeführt wird, nicht reagiert, melden Sie sich mit sqlplus als SYSDBA an und führen Sie einen „hanganalyze“ oder einen Dump aus:

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

Wenn es sich bei der Datenbank um eine RAC-Datenbank handelt, fügen Sie den letzten beiden oradebug-Befehlen die Option „-g“ hinzu.

dNFS-Aufrufe

Der dNFS-Client befindet sich im Datenbankkern. Daher gibt es in der Datenbank mehrere v$-Ansichten, mit denen der Status von dNFS aus der Datenbank überwacht und geprüft werden kann. Oracle bietet ein Paket, mit dem die dNFS-Leistung schnell überwacht werden kann. Dieses Paket ist im Oracle dNFS-Monitorpaket enthalten.

Nach der Bereitstellung kann ein DBA Folgendes ausführen, um Informationen zu erhalten (Parameter: dnfs_monitor(Ruhezeit), dnfs_itermonitor (Ruhezeit,Anzahl der Prüfungen), Ruhezeit in Sekunden):

    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

Die V$-Ansichten sind:

  • V$DNFS_SERVER: Zeigt Informationen zu allen NFS-Serververbindungen an (eine für jeden NFS-Server). Die Ansicht ist nützlich, um die Verbindung und die TCP-Socket-Einstellungen zu prüfen.

  • V$DNFS_CHANNELS: Zeigt Informationen zu allen Netzwerkpfaden an, die zu den NFS-Servern erstellt wurden. Jeder dNFS-Client erstellt einen Kanal pro Prozess und Netzwerkpfad. Wenn mehrere Pfade vorhanden sind (mehrere NICs), führt der dNFS-Client ein Load Balancing über alle Kanäle durch. Die Daten spiegeln die Aktivitäten seit der letzten Auswahl wider.

  • V$DNFS_FILES: Zeigt Dateien an, die mit dem dNFS-Client geöffnet sind.

  • V$DNFS_STAT: Leistungsmesswerte für den dNFS-Client.

V$DNFS_SERVER
Spalte Beschreibung
SRVNAME Name des NFS-Servers
DIRNAME Vom NFS-Server exportiertes Volume
MNTPORT Lokaler Bereitstellungsport
NFSPORT NFS-Server-Port
WTMAX Maximale Schreibgröße für NFS-Server
RTMAX Maximale Lesegröße für NFS-Server
V$DNFS_CHANNELS
Spalte Beschreibung
PNUM Oracle-Prozessnummer (Link zur PID in v$process)
SVRNAME Name des NFS-Servers
PATH Netzwerkpfad zum Server
CH_ID dNFS-Kanal-ID
SVR_ID dNFS-Server-ID
SENDS Senden Sie Vorgänge über den Kanal seit der letzten Auswahl.
RECVS Empfang von Vorgängen über den Kanal seit der letzten Auswahl
PINGS Ping-Vorgänge über den Kanal seit der letzten Auswahl.
V$DNFS_FILES
Spalte Beschreibung
FILENAME Name der Datei.
FILESIZE Größe der Datei.
PNUM Prozess-ID (Link zur PID in v$process)
SRV_ID NFS-Server-ID
V$DNFS_STAT
Spalte Beschreibung
PNUM Oracle-Prozessnummer (Link zur PID in v$process)
NFS_NULL Null operations
NFS_GETATTR Attributvorgänge abrufen
NFS_SETATTR Attributvorgänge festlegen
NFS_LOOKUP Suchvorgänge
NFS_ACCESS Zugriffsvorgänge
NFS_READLINK Lesevorgänge für Links
NFS_READ Lesevorgänge
NFS_WRITE Schreibvorgänge
NFS_CREATE Vorgänge erstellen
NFS_MKDIR Verzeichnisvorgänge ausführen
NFS_MKNOD Knotenvorgänge ausführen
NFS_SYMLINK Symbolische Links
NFS_REMOVE Vorgänge entfernen
NFS_RMDIR Verzeichnisvorgänge entfernen
NFS_RENAME Vorgänge umbenennen
NFS_LINK Verknüpfungsvorgänge
NFS_READDIR Lesevorgänge für Verzeichnisse
NFS_READDIRPLUS Lesevorgänge für Verzeichnis plus
NFS_FSSTAT Dateisystemstatusvorgang
NFS_FSINFO Dateisysteminformationen
NFS_PATHCONF Pfadkonfigurationsvorgänge
NFS_COMMIT Commit-Vorgänge
NFS_MOUNT Bereitstellungsvorgänge

Das Oracle dNFS-Monitorpaket

    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;

The Oracle DBA Guide