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:
Klicken Sie auf Verwalten > Hosts.
Klicken Sie mit der rechten Maustaste auf den Host und wählen Sie Bearbeiten aus.
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:
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
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.
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 |
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. |
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 |
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
Sicherung und Notfallwiederherstellung für Oracle-Datenbanken
Solltest du eine sofortige virtuelle Kopie einer Oracle-Datenbank erstellen?
Sofortige Wiederherstellung einer Oracle-Datenbank mithilfe von „Mount and Migrate“
Umgebung mit einem Sicherungs- und Notfallwiederherstellungs-Workflow bereitstellen