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:
Vai a Gestisci > Host.
Fai clic con il tasto destro del mouse sull'host e seleziona Modifica.
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:
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
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.
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 |
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. |
Colonna | Descrizione |
---|---|
FILENAME
|
Nome del file. |
FILESIZE
|
Dimensioni del file. |
PNUM
|
ID processo (link al PID in v$process) |
SRV_ID
|
ID server NFS |
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
Recupero istantaneo di un database Oracle utilizzando Mount and Migrate
Eseguire il provisioning di un ambiente con un flusso di lavoro di backup e RE