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 dem Datenbankserver und der Sicherungs-/Wiederherstellungs-Appliance

  • Verwenden Sie alle von Oracle erforderlichen oder empfohlenen Patches. Oracle führt eine Liste der erforderlichen oder empfohlenen Patches in der Oracle-Supportdokumentation.

Verwaltungskonsole zum Schutz und Mounten virtueller Oracle-Datenbanken über dNFS konfigurieren

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

So legen Sie das Format des Staging-Laufwerks (Laufwerkseinstellung) 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-Laufwerksformat“ 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 Aktionen aus, um sicherzustellen, dass dNFS richtig konfiguriert ist:

  1. Suchen Sie im DB Alert.log nach der folgenden Meldung, 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 Schutzjobs und auf jedem Oracle-Host vorhanden sein, auf dem Sie eine erfasste Oracle-Datenbank mit dNFS bereitstellen können. Unter Linux sollte beispielsweise das Paket nfs-util auf dem Host vorhanden sein. Prüfen Sie 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 Datenbanken, die auf diesem ORACLE_HOME ausgeführt werden, neu und suchen Sie dann im DB Alert.log nach der folgenden Meldung, um zu bestätigen, dass dNFS aktiviert ist:

      Oracle-Instanz mit ODM: 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 Statistiken für NFS-Lese-/Schreibvorgänge für die laufenden E/A-Vorgänge ansehen:

    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 können die Verarbeitungsinformationen des dnfs-Channels sehen.

    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-Fehlerbehebung: Datenbankprobleme

Dazu zählen:

Benachrichtigungsliste

Der erste Schritt bei jedem Debugging-Vorgang besteht darin, das Benachrichtigungslog nach dNFS-bezogenen Meldungen zu durchsuchen. Ein häufiges Problem, das bei Datenbanken mit dNFS beobachtet wird, ist die begrenzte Größe des Socket-Puffers. Oracle versucht, die Größe anzupassen, aber das kann durch das Betriebssystem eingeschränkt werden. In diesem Fall wird im Benachrichtigungslog ein Fehler wie dieser angezeigt:

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

Prüfen Sie im Warnungsprotokoll auch, ob die richtigen Netzwerkkarten für die Kommunikation mit dem Filer verwendet werden. Das lässt sich 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-Trace-Dateien

Bei I/O-Problemen 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 Vorfall eintritt, 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 „hanganalyze“ oder einen Dump aus:

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

Wenn die Datenbank eine RAC-Datenbank ist, fügen Sie den letzten beiden oradebug-Befehlen die Option -g hinzu.

dNFS-Aufrufe

Der dNFS-Client befindet sich im Datenbankkernel. Daher sind in der Datenbank mehrere v$-Ansichten vorhanden, mit denen der Zustand von dNFS in 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(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

Die V$-Ansichten sind:

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

  • V$DNFS_CHANNELS: Zeigt Informationen für alle Netzwerkpfade an, die zu den NFS-Servern erstellt wurden. Jeder dNFS-Client erstellt einen Channel 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 NFS-Servername
DIRNAME Von NFS-Server exportiertes Volume
MNTPORT Lokaler Bereitstellungsport
NFSPORT NFS-Serverport
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 NFS-Servername
PATH Netzwerkpfad zum Server
CH_ID dNFS-Channel-ID
SVR_ID dNFS-Server-ID
SENDS Vorgänge über den Channel seit der letzten Auswahl senden.
RECVS Vorgänge über den Channel seit der letzten Auswahl empfangen.
PINGS Ping-Vorgänge über den Channel 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 Lookup-Vorgänge
NFS_ACCESS Zugriffsvorgänge
NFS_READLINK Linkvorgänge lesen
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 Vorgänge für symbolische Links
NFS_REMOVE Vorgänge entfernen
NFS_RMDIR Verzeichnisvorgänge entfernen
NFS_RENAME Vorgänge umbenennen
NFS_LINK Link-Vorgänge
NFS_READDIR Verzeichnisvorgänge lesen
NFS_READDIRPLUS Verzeichnis- und Plus-Vorgänge lesen
NFS_FSSTAT Dateisystemstatusvorgang
NFS_FSINFO Vorgänge für Dateisysteminformationen
NFS_PATHCONF Vorgänge für die Pfadkonfiguration
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;

Oracle DBA Guide