Para usar o Oracle Direct NFS (dNFS) com um dispositivo de backup/recuperação, é preciso atender aos seguintes requisitos:
Largura de banda de rede suficiente entre o servidor de banco de dados e o dispositivo de backup/recuperação
Use todos os patches necessários ou recomendados da Oracle. A Oracle mantém uma lista de patches necessários ou recomendados na documentação de suporte da Oracle.
Configure o console de gerenciamento para proteger e montar bancos de dados virtuais do Oracle usando o dNFS.
Para fazer um backup baseado em dNFS, defina o formato do disco de preparo do dispositivo de backup/recuperação (preferência de disco) como NFS.
Use estas instruções para definir o formato do disco de preparo (preferência de disco) como NFS:
Acesse Gerenciar > Hosts.
Clique com o botão direito do mouse no host e selecione Editar.
Em "Formato do disco de preparação", selecione NFS e clique em Salvar.
Ações a serem realizadas no host de destino para que o dNFS funcione
Faça o seguinte para garantir que o dNFS esteja configurado corretamente:
Verifique a seguinte mensagem em DB Alert.log para confirmar se o dNFS está ativado:
Oracle instance running with ODM: Oracle Direct NFS ODM Library Version 3.01.
Se o dNFS não estiver ativado, faça isso:
Os pacotes de cliente NFS precisam estar no host do banco de dados para jobs de proteção e em qualquer host Oracle em que você possa ativar um banco de dados Oracle capturado usando o dNFS. Por exemplo, no Linux, o pacote
nfs-util
precisa estar no host. Verifique o seguinte:rpm -qa |grep nfs-util
Ative o dNFS no host da Oracle:
cd $ORACLE_HOME/rdbms/lib make -f ins_rdbms.mk dnfs_on
Reinicie os bancos de dados em execução no
ORACLE_HOME
e verifique a seguinte mensagem em DB Alert.log para confirmar se o dNFS está ativado:Instância do Oracle executada com ODM: Oracle Direct NFS ODM Library Version 3.0
Durante o job de backup, execute a seguinte consulta para verificar o uso do dNFS:
select * from gv$dnfs_servers;
É possível conferir as estatísticas de leitura/gravação de NFS para a E/S em andamento:
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;
Solução de problemas do dNFS: problemas de banco de dados
Isso inclui:
Registro de alertas
A primeira etapa de qualquer operação de depuração é verificar o registro de alertas para mensagens relacionadas ao dNFS. Um problema comum observado em bancos de dados com dNFS é a limitação do tamanho do buffer de soquete. O Oracle tenta ajustar o tamanho, mas isso pode ser limitado pelo SO. Nesse caso, um erro como este é encontrado no registro de alertas:
Direct NFS: Failed to set socket buffer size.wtmax=[1048576]\
rtmax=[1048576], errno=-1
Outros itens a serem procurados no registro de alerta incluem se as placas de rede corretas estão sendo usadas para se comunicar com o filer. Para determinar isso, procure uma mensagem semelhante a esta:
Direct NFS: channel id [0] path [192.168.56.3] to filer [192.168.56.3] via local [] is UP
Arquivos de rastreamento do banco de dados
Se houver problemas de E/S, os seguintes eventos poderão ser definidos no banco de dados para capturar mais informações de registro. Defina esses eventos, aguarde o incidente ocorrer e analise os arquivos de rastreamento.
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
O banco de dados não está respondendo
Se um banco de dados em execução no dNFS não estiver respondendo, faça login como SYSDBA usando sqlplus e execute um "hanganalyze" ou um despejo:
```oradebug
oradebug setmypid
oradebug unlimited
oradebug hanganalyze 3
oradebug dump systemstate 266
```
Se o banco de dados for um RAC, adicione uma opção -g aos dois últimos comandos oradebug.
Visualizações do dNFS
O cliente dNFS está no kernel do banco de dados. Portanto, existem várias visualizações v$ no banco de dados para monitorar e verificar a integridade do dNFS de dentro do banco de dados. A Oracle oferece um pacote que pode ser usado para monitorar rapidamente o desempenho do dNFS. Esse pacote está no pacote de monitoramento do Oracle dNFS.
Depois da implantação, um DBA pode realizar o seguinte para receber informações (parâmetros: dnfs_monitor(tempo de sono), dnfs_itermonitor (tempo de sono,número de vezes para verificar), tempo de sono 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 V$ são:
V$DNFS_SERVER: mostra informações de todas as conexões do servidor NFS (uma para cada servidor NFS). A visualização é útil para verificar a conectividade e as configurações de soquete 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 houver vários caminhos (várias NICs), o cliente dNFS fará o balanceamento de carga em todos os canais. Os dados refletem a atividade desde a última seleção.
V$DNFS_FILES: mostra os arquivos abertos usando o 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 da rede para o servidor |
CH_ID
|
ID do canal dNFS |
SVR_ID
|
ID do servidor dNFS |
SENDS
|
Envie operações pelo canal desde a última seleção. |
RECVS
|
Recebe operações no canal desde a última seleção. |
PINGS
|
Operações de ping no canal desde a última seleção. |
Coluna | Descrição |
---|---|
FILENAME
|
Nome do arquivo. |
FILESIZE
|
Tamanho do arquivo. |
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 PID em v$process )
|
NFS_NULL
|
Null operations
|
NFS_GETATTR
|
Receber operações de atributo |
NFS_SETATTR
|
Definir operações de atributo |
NFS_LOOKUP
|
Operações de pesquisa |
NFS_ACCESS
|
Operações de acesso |
NFS_READLINK
|
Ler operações de link |
NFS_READ
|
Operações de leitura |
NFS_WRITE
|
Operações de gravação |
NFS_CREATE
|
Criar operações |
NFS_MKDIR
|
Fazer operações de diretório |
NFS_MKNOD
|
Fazer operações de nó |
NFS_SYMLINK
|
Operações de link simbólico |
NFS_REMOVE
|
Remover operações |
NFS_RMDIR
|
Remover operações de diretório |
NFS_RENAME
|
Operações de renomeação |
NFS_LINK
|
Operações de vinculação |
NFS_READDIR
|
Ler operações de diretório |
NFS_READDIRPLUS
|
Ler diretório e operações |
NFS_FSSTAT
|
Operação de status do sistema de arquivos |
NFS_FSINFO
|
Operações de informações do sistema de arquivos |
NFS_PATHCONF
|
Operações de configuração de caminho |
NFS_COMMIT
|
Operações de confirmação |
NFS_MOUNT
|
Operações de montagem |
O pacote de monitoramento 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 do DBA do Oracle
- Backup e DR para bancos de dados Oracle
- Pré-requisitos para proteger um banco de dados Oracle
- Patches do Oracle e problemas conhecidos
- Preparar databases Oracle para proteção
- Descobrir e proteger um database Oracle
- Detalhes e configurações para bancos de dados Oracle
- Usar o dNFS com o Backup e DR
- Proteger um database Oracle descoberto
- Ativar um database Oracle como uma ativação padrão
- Criar uma cópia virtual instantânea de um banco de dados Oracle
- Restaurar e recuperar um database Oracle
- Recuperação instantânea de um banco de dados Oracle usando o Mount and Migrate
- Provisionar um ambiente com um fluxo de trabalho de backup e DR