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:
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-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:
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
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.
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 |
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. |
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
|
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
- Backup und DR für Oracle-Datenbanken
- Voraussetzungen für den Schutz einer Oracle-Datenbank
- Oracle-Patches und bekannte Probleme
- Oracle-Datenbanken für den Schutz vorbereiten
- Oracle-Datenbank erkennen und schützen
- Details und Einstellungen für Oracle-Datenbanken
- dNFS mit Backup and DR verwenden
- Erkannte Oracle-Datenbank schützen
- Oracle-Datenbank als Standardmount einbinden
- Sofortige virtuelle Kopie einer Oracle-Datenbank erstellen
- Oracle-Datenbank wiederherstellen
- Sofortige Wiederherstellung einer Oracle-Datenbank mit Mount and Migrate
- Umgebung mit einem Backup- und DR-Workflow bereitstellen