Para usar o Oracle Direct NFS (dNFS) com um dispositivo de cópia de segurança/recuperação, tem de cumprir os seguintes requisitos:
Largura de banda de rede suficiente entre o servidor de base de dados e a aplicação de cópia de segurança/recuperação
Use todos os patches obrigatórios ou recomendados da Oracle. A Oracle mantém uma lista de patches obrigatórios ou recomendados na documentação do apoio técnico da Oracle.
Configure a consola de gestão para proteger e montar bases de dados Oracle virtuais através do dNFS
Para fazer uma cópia de segurança baseada em dNFS, tem de definir o formato do disco de preparação do dispositivo de cópia de segurança/recuperação (preferência de disco) como NFS.
Use estas instruções para definir o formato do disco de teste (preferência de disco) como NFS:
Aceda a Gerir > Anfitriões.
Clique com o botão direito do rato no anfitrião e selecione Editar.
No formato do disco de preparação, selecione NFS e, de seguida, clique em Guardar.
Ações a realizar no anfitrião de destino para que o dNFS funcione
Realize estas ações para garantir que o dNFS está configurado corretamente:
Verifique a seguinte mensagem em DB Alert.log para confirmar que o dNFS está ativado:
Oracle instance running with ODM: Oracle Direct NFS ODM Library Version 3.01.
Se o dNFS não estiver ativado, ative-o:
Os pacotes de cliente NFS têm de existir no anfitrião da base de dados para tarefas de proteção e em qualquer anfitrião Oracle no qual possa montar uma base de dados Oracle capturada usando o dNFS. Por exemplo, para o Linux, o pacote
nfs-util
deve existir no anfitrião. Verifique o seguinte:rpm -qa |grep nfs-util
Ative o dNFS no anfitrião Oracle:
cd $ORACLE_HOME/rdbms/lib make -f ins_rdbms.mk dnfs_on
Reinicie as bases de dados em execução nesse
ORACLE_HOME
e, em seguida, verifique se existe a seguinte mensagem em DB Alert.log para confirmar que o dNFS está ativado:Instância do Oracle em execução com a ODM: Oracle Direct NFS ODM Library Version 3.0
Durante a tarefa de cópia de segurança, execute a seguinte consulta para verificar a utilização do dNFS:
select * from gv$dnfs_servers;
Pode ver as estatísticas de leitura/escrita de NFS para a E/S em curso:
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;
Podemos ver as informações do processo do canal 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;
Resolva problemas de dNFS: problemas de base de dados
Isto inclui:
Registo de alertas
A primeira paragem para qualquer operação de depuração é verificar o registo de alertas para mensagens relacionadas com o dNFS. Um problema comum observado em bases de dados com dNFS está relacionado com o tamanho do buffer do soquete limitado. O Oracle tenta ajustar o tamanho, mas isto pode ser limitado pelo sistema operativo. Neste caso, é encontrado um erro como este no registo de alertas:
Direct NFS: Failed to set socket buffer size.wtmax=[1048576]\
rtmax=[1048576], errno=-1
Outros itens a procurar no registo de alertas incluem se as placas de rede corretas estão a ser usadas para comunicar com o filtro. Pode determinar isto procurando uma mensagem semelhante à seguinte:
Direct NFS: channel id [0] path [192.168.56.3] to filer [192.168.56.3] via local [] is UP
Ficheiros de rastreio da base de dados
Se ocorrerem problemas de E/S, é possível definir os seguintes eventos na base de dados para captar informações de registo adicionais. Defina estes eventos, aguarde a ocorrência do incidente e, em seguida, reveja-os para rastrear ficheiros.
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
A base de dados não está a responder
Se uma base de dados em execução no dNFS não estiver a responder, inicie sessão como SYSDBA através do sqlplus e execute um "hanganalyze" ou um despejo:
```oradebug
oradebug setmypid
oradebug unlimited
oradebug hanganalyze 3
oradebug dump systemstate 266
```
Se a base de dados for uma base de dados RAC, adicione uma opção -g aos dois últimos comandos oradebug.
Visualizações de dNFS
O cliente dNFS está realmente no kernel da base de dados. Por conseguinte, existem várias visualizações v$ na base de dados para monitorizar e verificar o estado do dNFS a partir da base de dados. A Oracle fornece um pacote que pode ser usado para monitorizar rapidamente o desempenho do dNFS. Este pacote está no pacote de monitorização do Oracle dNFS.
Após a implementação, um DBA pode realizar o seguinte para obter informações (parâmetros: dnfs_monitor(tempo de suspensão), dnfs_itermonitor(tempo de suspensão,número de vezes a verificar), o tempo de suspensão está em segundos):
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
As visualizações de V$:
V$DNFS_SERVER: mostra informações para todas as ligações do servidor NFS (uma para cada servidor NFS). A vista é útil para verificar a conetividade e as definições da entrada TCP.
V$DNFS_CHANNELS: mostra informações de todos os caminhos de rede criados para os servidores NFS. Cada cliente dNFS cria um canal por processo por caminho de rede. Se existirem vários caminhos (vários NICs), o cliente dNFS equilibra a carga em todos os canais. Os dados refletem a atividade desde a última seleção.
V$DNFS_FILES: mostra os ficheiros que estão abertos através do cliente dNFS.
V$DNFS_STAT: métricas de desempenho para o cliente dNFS.
Coluna | Descrição |
---|---|
SRVNAME
|
Nome do servidor NFS |
DIRNAME
|
Volume exportado pelo servidor NFS |
MNTPORT
|
Porta de montagem local |
NFSPORT
|
Porta do servidor NFS |
WTMAX
|
Tamanho máximo de gravação para o servidor NFS |
RTMAX
|
Tamanho máximo de leitura para o servidor NFS |
Coluna | Descrição |
---|---|
PNUM
|
Número do processo do Oracle (link para PID em v$process) |
SVRNAME
|
Nome do servidor NFS |
PATH
|
Caminho de rede para o servidor |
CH_ID
|
ID do canal dNFS |
SVR_ID
|
ID do servidor dNFS |
SENDS
|
Enviar operações através do canal desde a última seleção. |
RECVS
|
Receber operações através do canal desde a última seleção. |
PINGS
|
Operações de ping no canal desde a última seleção. |
Coluna | Descrição |
---|---|
FILENAME
|
Nome do ficheiro. |
FILESIZE
|
Tamanho do ficheiro. |
PNUM
|
ID do processo (link para PID em v$process) |
SRV_ID
|
ID do servidor NFS |
Coluna | Descrição |
---|---|
PNUM
|
Número do processo do Oracle (link para o PID em v$process )
|
NFS_NULL
|
Null operations
|
NFS_GETATTR
|
Obtenha operações de atributos |
NFS_SETATTR
|
Defina operações de atributos |
NFS_LOOKUP
|
Operações de pesquisa |
NFS_ACCESS
|
Operações de acesso |
NFS_READLINK
|
Ler operações de associação |
NFS_READ
|
Operações de leitura |
NFS_WRITE
|
Operações de escrita |
NFS_CREATE
|
Operações de criação |
NFS_MKDIR
|
Faça operações de diretório |
NFS_MKNOD
|
Faça operações de nós |
NFS_SYMLINK
|
Operações de links simbólicos |
NFS_REMOVE
|
Remova operações |
NFS_RMDIR
|
Remova operações de diretório |
NFS_RENAME
|
Operações de mudança de nome |
NFS_LINK
|
Operações de associação |
NFS_READDIR
|
Operações de leitura do diretório |
NFS_READDIRPLUS
|
Ler diretório mais operações |
NFS_FSSTAT
|
Operação de estado do sistema de ficheiros |
NFS_FSINFO
|
Operações de informações do sistema de ficheiros |
NFS_PATHCONF
|
Operações de configuração do caminho |
NFS_COMMIT
|
Operações de confirmação |
NFS_MOUNT
|
Operações de montagem |
O pacote de monitorização dNFS da Oracle
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;
O guia de DBA da Oracle
- Cópia de segurança e RD para bases de dados Oracle
- Pré-requisitos para proteger uma base de dados Oracle
- Patches da Oracle e problemas conhecidos
- Prepare bases de dados Oracle para proteção
- Descubra e proteja uma base de dados Oracle
- Detalhes e definições para bases de dados Oracle
- Use o dNFS com a cópia de segurança e a RD
- Proteja uma base de dados Oracle descoberta
- Monte uma base de dados Oracle como uma montagem padrão
- Crie uma cópia virtual instantânea de uma base de dados Oracle
- Restaure e recupere uma base de dados Oracle
- Recuperação instantânea de uma base de dados Oracle através da montagem e migração
- Aprovisione um ambiente com um fluxo de trabalho de cópia de segurança e RD