Introduzido na versão 11R2 do banco de dados Oracle, o Database Smart Flash Cache é uma feature que ajuda a ter ganhos de desempenho em sistema com carga intensa de IO. Ele funciona como se fosse uma segunda camada de cache para o banco.
Aqui você pode entender melhor como funciona a tecnologia. A idea aqui é realizar alguns testes de uso e mostrar que o banco de dados pode funcionar sem problemas caso de indisponibilidade do hardware que irá implementar essa camada.
O Ambiente
- Oracle Database 18c
- Red Hat Enterprise Linux Server release 7.6 (Maipo)
- Diskgroup NVME. Usei placas NVME da Dell.
Parâmetros alterados
- Criei um tabela TESTE com 27Gb
- Para evitar direct path reads quando fizer um select em tabelas grandes: _serial_direct_read=NEVER
alter system set db_flash_cache_file='+NVME/flash_cache' sid='*' scope=spfile; alter system set db_flash_cache_size='60g' scope=spfile sid='*' scope=spfile; alter system set "_serial_direct_read"=NEVER; |
O valor a ser utlizado no parâmetro db_flash_cache_size é feito da seguinte maneira. Pegue 80% do valor da SGA da sua base e multiplique por 2 a 10 vezes.
db_flash_cache_size = (SGA*80%)*10
Verificando o uso do Smart Flash Cache
Antes de realizar a consulta na tabela teste, podemos verificar na visão v$bh que não temos o status flashcur - current flash cache buffer. Mais detalhes da visão aqui.
select status, count(*) from v$bh group by status;
---------- ---------- cr 109 xcur 253854 |
Fiz a primeira consulta na tabela TESTE e ele demorou 2min e 41 segundos.
SQL> select count(*) from c##teste.teste; COUNT(*) ---------- 15000000 Decorrido: 00:02:41.87 |
Após isso, fiz a consulta na visão v$bh e veja que dessa vez temos o status flashcur.
select status, count(*) from v$bh group by status;
---------- ---------- cr 138 flashcur 3498035 xcur 253825 |
Fiz a consulta novamente na tabela TESTE e como temos os blocos em cache, o tempo caiu para 47 segundos..
SQL> select count(*) from c##teste.teste; COUNT(*) ---------- 15000000 Decorrido: 00:00:47.67 |
Simulando queda do diskgroup
Como já vimos, temos blocos em cache usando o smart flash cache, a ideia é simular uma perca nos discos que compões esta área.
Fiz login na instância ASM e desmontei o grupo de discos forçando.
SQL> alter diskgroup nvme dismount force; Diskgroup altered. |
No log da instância ASM consta que o flash cache foi desabilitado.
2019-04-09 13:34:54.644000 -03:00 Flash cache file +NVME/flash.dat header read failed with error 0 Errors in file /u01/app/oracle/diag/rdbms/sproch/SPROCH/trace/SPROCH_gen0_327938.trc: Flash Cache: disabling started for file 0 Flash cache: future write-issues disabled Start disabling flash cache writes.. Flash cache: DBW0 stopping flash writes... Flash cache: DBW4 stopping flash writes... Flash cache: DBW5 stopping flash writes... Flash cache: DBW8 stopping flash writes... Flash cache: DBW3 stopping flash writes... Flash cache: DBW7 stopping flash writes... Flash cache: DBW1 stopping flash writes... Flash cache: DBW6 stopping flash writes... Flash cache: DBW2 stopping flash writes... |
Consultando a base de dados, podemos ver que nossa instância permaneceu ativa. Ou seja, podemos usar o recurso sem a preocupação de falha no diskgroup.
SQL> select open_mode from v$database; OPEN_MODE -------------------- READ WRITE |
Comentários