Olá pessoal, aqui vamos ver como gerenciar o tamanho dos flashback logs gerados no nosso ambiente. Isto é útil principalmente quando você está caindo no erro “ORA-00242: maximum allowed filename records used up in control file” que pode estar relacionado ao bug 12661855, o qual você encontra no My Oracle Support. Este não é o único método para contornar este bug, então faça-se o favor e leia a nota antes de aplicar qualquer alteração. 🙂
Aqui vou mostrar como fazer isso somente para fins de teste e aprendizado. Por favor tenha em mente de que o uso deste recurso (flashback database) requer a licença Enterprise Edition.
Primeiro de tudo precisamos alterar o banco de dados para o modo flashback (lembre-se que para fazer isso seu banco de dados já deve estar em modo archive log e também com a FRA definida):
SQL> select name, open_mode, log_mode, flashback_on from v$database; NAME OPEN_MODE LOG_MODE FLASHBACK_ON --------- -------------------- ------------ ------------------ CDB2 READ WRITE ARCHIVELOG NO SQL> alter database flashback on; Database altered.
Se verificarmos o alert.log do banco de dados veremos que o processo RVWR, responsável por gerenciar os flashback logs, foi iniciado:
2018-03-18T17:05:40.963600+01:00 alter database flashback on Starting background process RVWR 2018-03-18T17:05:40.986988+01:00 RVWR started with pid=63, OS id=6619 2018-03-18T17:05:42.678759+01:00 Allocated 15937344 bytes in shared pool for flashback generation buffer Flashback Database Enabled at SCN 2185106 Completed: alter database flashback on
E nosso banco de dados ligou o recurso de flashback:
SQL> select name, open_mode, log_mode, flashback_on from v$database; NAME OPEN_MODE LOG_MODE FLASHBACK_ON --------- -------------------- ------------ ------------------ CDB2 READ WRITE ARCHIVELOG YES
Alterando o tamanho dos Flashback logs
Como podemos ver, temos um flashback log de 200MB:
SQL> SELECT log# as "Log No", thread# as "Thread No", sequence# as "Seq No", name, bytes/1024/1024 as "Size(MB)", first_change# as "First Chg No", first_time from v$flashback_database_logfile order by first_time; Log No Thread No Seq No NAME Size(MB) First Chg No FIRST_TIME ---------- ---------- ---------- ---------------------------------------------------------------------- ---------- ------------ ----------------- 1 1 1 /home/oracle/fra/CDB2/flashback/o1_mf_fbx3lnz4_.flb 200 2185105 03/18/18 17:05:42 2 1 1 /home/oracle/fra/CDB2/flashback/o1_mf_fbx3lro0_.flb 200 0 2 rows selected.
Vou executar uma carga no ambiente a fim de gerar mais flashback logs, assim podemos compará-los e gerenciá-los corretamente.
Verificando novamente agora temos 7 flashback logs:
SQL> SELECT log# as "Log No", thread# as "Thread No", sequence# as "Seq No", name, bytes/1024/1024 as "Size(MB)", first_change# as "First Chg No", first_time from v$flashback_database_logfile order by first_time; Log No Thread No Seq No NAME Size(MB) First Chg No FIRST_TIME ---------- ---------- ---------- ------------------------------------------------------------------------------------------ ---------- ------------ ----------------- 1 1 1 /home/oracle/fra/CDB2/flashback/o1_mf_fbx3lnz4_.flb 200 2185105 03/18/18 17:05:42 2 1 2 /home/oracle/fra/CDB2/flashback/o1_mf_fbx3lro0_.flb 200 2187758 03/18/18 17:32:58 3 1 3 /home/oracle/fra/CDB2/flashback/o1_mf_fbx55wtr_.flb 200 2188056 03/18/18 17:35:25 4 1 4 /home/oracle/fra/CDB2/flashback/o1_mf_fbx5bh4s_.flb 200 2188418 03/18/18 17:39:01 5 1 5 /home/oracle/fra/CDB2/flashback/o1_mf_fbx5k6ns_.flb 200 2189289 03/18/18 17:42:04 6 1 6 /home/oracle/fra/CDB2/flashback/o1_mf_fbx5px1t_.flb 200 2189598 03/18/18 17:42:46 7 1 1 /home/oracle/fra/CDB2/flashback/o1_mf_fbx5r6sd_.flb 200 0 7 rows selected.
Se prestarmos atenção, os flashback logs tem o mesmo tamanho dos redo logs:
SQL> select group#, bytes/1024/1024 size_mb from v$log; GROUP# SIZE_MB ---------- ---------- 1 200 2 200 3 200 3 rows selected.
Então vamos alterar isso. Para alterar o tamanho dos flashback logs nos devemos alterar o parâmetro não documentado “_db_flashback_log_min_size”, o qual é definido em bytes. Vamos alterá-lo para 500MB:
SQL> alter system set "_db_flashback_log_min_size"=524288000; System altered.
Eu estou com a mesma carga de trabalho ainda em execução, então vamos verificar novamente:
SQL> SELECT log# as "Log No", thread# as "Thread No", sequence# as "Seq No", name, bytes/1024/1024 as "Size(MB)", first_change# as "First Chg No", first_time from v$flashback_database_logfile order by first_time Log No Thread No Seq No NAME Size(MB) First Chg No FIRST_TIME ---------- ---------- ---------- ---------------------------------------------------------------------- ---------- ------------ ----------------- 1 1 1 /home/oracle/fra/CDB2/flashback/o1_mf_fbx3lnz4_.flb 200 2185105 03/18/18 17:05:42 2 1 2 /home/oracle/fra/CDB2/flashback/o1_mf_fbx3lro0_.flb 200 2187758 03/18/18 17:32:58 3 1 3 /home/oracle/fra/CDB2/flashback/o1_mf_fbx55wtr_.flb 200 2188056 03/18/18 17:35:25 4 1 4 /home/oracle/fra/CDB2/flashback/o1_mf_fbx5bh4s_.flb 200 2188418 03/18/18 17:39:01 5 1 5 /home/oracle/fra/CDB2/flashback/o1_mf_fbx5k6ns_.flb 200 2189289 03/18/18 17:42:04 6 1 6 /home/oracle/fra/CDB2/flashback/o1_mf_fbx5px1t_.flb 200 2189598 03/18/18 17:42:46 7 1 7 /home/oracle/fra/CDB2/flashback/o1_mf_fbx5r6sd_.flb 200 2191323 03/18/18 17:43:29 8 1 8 /home/oracle/fra/CDB2/flashback/o1_mf_fbx5smmv_.flb 200 2214833 03/18/18 17:54:51 9 1 1 /home/oracle/fra/CDB2/flashback/o1_mf_fbx6gxjt_.flb 400 0 9 rows selected.
Nesta amostragem acima nós vemos um flashback log de 400MB. Este foi criado na transição para o novo tamanho, mas todos os próximos terão 500MB:
SQL> SELECT log# as "Log No", thread# as "Thread No", sequence# as "Seq No", name, bytes/1024/1024 as "Size(MB)", first_change# as "First Chg No", first_time from v$flashback_database_logfile order by first_time Log No Thread No Seq No NAME Size(MB) First Chg No FIRST_TIME ---------- ---------- ---------- ---------------------------------------------------------------------- ---------- ------------ ----------------- 1 1 1 /home/oracle/fra/CDB2/flashback/o1_mf_fbx3lnz4_.flb 200 2185105 03/18/18 17:05:42 2 1 2 /home/oracle/fra/CDB2/flashback/o1_mf_fbx3lro0_.flb 200 2187758 03/18/18 17:32:58 3 1 3 /home/oracle/fra/CDB2/flashback/o1_mf_fbx55wtr_.flb 200 2188056 03/18/18 17:35:25 4 1 4 /home/oracle/fra/CDB2/flashback/o1_mf_fbx5bh4s_.flb 200 2188418 03/18/18 17:39:01 5 1 5 /home/oracle/fra/CDB2/flashback/o1_mf_fbx5k6ns_.flb 200 2189289 03/18/18 17:42:04 6 1 6 /home/oracle/fra/CDB2/flashback/o1_mf_fbx5px1t_.flb 200 2189598 03/18/18 17:42:46 7 1 7 /home/oracle/fra/CDB2/flashback/o1_mf_fbx5r6sd_.flb 200 2191323 03/18/18 17:43:29 8 1 8 /home/oracle/fra/CDB2/flashback/o1_mf_fbx5smmv_.flb 200 2214833 03/18/18 17:54:51 9 1 9 /home/oracle/fra/CDB2/flashback/o1_mf_fbx6gxjt_.flb 400 2420878 03/18/18 18:04:34 10 1 1 /home/oracle/fra/CDB2/flashback/o1_mf_fbx7149f_.flb 500 0 10 rows selected.
Verificando mais uma vez:
SQL> SELECT log# as "Log No", thread# as "Thread No", sequence# as "Seq No", name, bytes/1024/1024 as "Size(MB)", first_change# as "First Chg No", first_time from v$flashback_database_logfile order by first_time Log No Thread No Seq No NAME Size(MB) First Chg No FIRST_TIME ---------- ---------- ---------- ---------------------------------------------------------------------- ---------- ------------ ----------------- 1 1 1 /home/oracle/fra/CDB2/flashback/o1_mf_fbx3lnz4_.flb 200 2185105 03/18/18 17:05:42 2 1 2 /home/oracle/fra/CDB2/flashback/o1_mf_fbx3lro0_.flb 200 2187758 03/18/18 17:32:58 3 1 3 /home/oracle/fra/CDB2/flashback/o1_mf_fbx55wtr_.flb 200 2188056 03/18/18 17:35:25 4 1 4 /home/oracle/fra/CDB2/flashback/o1_mf_fbx5bh4s_.flb 200 2188418 03/18/18 17:39:01 5 1 5 /home/oracle/fra/CDB2/flashback/o1_mf_fbx5k6ns_.flb 200 2189289 03/18/18 17:42:04 6 1 6 /home/oracle/fra/CDB2/flashback/o1_mf_fbx5px1t_.flb 200 2189598 03/18/18 17:42:46 7 1 7 /home/oracle/fra/CDB2/flashback/o1_mf_fbx5r6sd_.flb 200 2191323 03/18/18 17:43:29 8 1 8 /home/oracle/fra/CDB2/flashback/o1_mf_fbx5smmv_.flb 200 2214833 03/18/18 17:54:51 9 1 9 /home/oracle/fra/CDB2/flashback/o1_mf_fbx6gxjt_.flb 400 2420878 03/18/18 18:04:34 10 1 10 /home/oracle/fra/CDB2/flashback/o1_mf_fbx7149f_.flb 500 2486224 03/18/18 18:06:51 11 1 1 /home/oracle/fra/CDB2/flashback/o1_mf_fbx75f0m_.flb 500 0 11 rows selected.
Da hora! Está funcionando como esperado.
Pré-alocando o espaço para os Flashback logs
Ok, mais uma coisa que quero mostrar é que podemos pré-alocar o tamanho total dos flashback logs que esperamos ter. Digamos que estimamos que teremos 10GB de flashback logs, então podemos pré-alocar este espaço para otimizar a performance quando habilitarmos o flashback no banco de dados pela primeira vez, portanto o Oracle não irá esperar para alocar este espaço, ele irá alocá-lo de uma vez.
Nós precisamos apenas alterar o parâmetro não documentado “_db_flashback_log_min_total_space” para o tamanho desejado:
SQL> alter system set "_db_flashback_log_min_total_space"=10G; System altered.
O Oracle começará a criar novos arquivos de flashback log até alcance o tamanho especificado no parâmetro:
SQL> SELECT log# as "Log No", thread# as "Thread No", sequence# as "Seq No", name, bytes/1024/1024 as "Size(MB)", first_change# as "First Chg No", first_time from v$flashback_database_logfile order by first_time, log# Log No Thread No Seq No NAME Size(MB) First Chg No FIRST_TIME ---------- ---------- ---------- ---------------------------------------------------------------------- ---------- ------------ ----------------- 1 1 1 /home/oracle/fra/CDB2/flashback/o1_mf_fbx3lnz4_.flb 200 2185105 03/18/18 17:05:42 2 1 2 /home/oracle/fra/CDB2/flashback/o1_mf_fbx3lro0_.flb 200 2187758 03/18/18 17:32:58 3 1 3 /home/oracle/fra/CDB2/flashback/o1_mf_fbx55wtr_.flb 200 2188056 03/18/18 17:35:25 4 1 4 /home/oracle/fra/CDB2/flashback/o1_mf_fbx5bh4s_.flb 200 2188418 03/18/18 17:39:01 5 1 5 /home/oracle/fra/CDB2/flashback/o1_mf_fbx5k6ns_.flb 200 2189289 03/18/18 17:42:04 6 1 6 /home/oracle/fra/CDB2/flashback/o1_mf_fbx5px1t_.flb 200 2189598 03/18/18 17:42:46 7 1 7 /home/oracle/fra/CDB2/flashback/o1_mf_fbx5r6sd_.flb 200 2191323 03/18/18 17:43:29 8 1 8 /home/oracle/fra/CDB2/flashback/o1_mf_fbx5smmv_.flb 200 2214833 03/18/18 17:54:51 9 1 9 /home/oracle/fra/CDB2/flashback/o1_mf_fbx6gxjt_.flb 400 2420878 03/18/18 18:04:34 10 1 10 /home/oracle/fra/CDB2/flashback/o1_mf_fbx7149f_.flb 500 2486224 03/18/18 18:06:51 11 1 11 /home/oracle/fra/CDB2/flashback/o1_mf_fbx75f0m_.flb 500 2666863 03/18/18 18:13:14 12 1 1 /home/oracle/fra/CDB2/flashback/o1_mf_fbx7jlo5_.flb 500 0 13 0 1 /home/oracle/fra/CDB2/flashback/o1_mf_fbx7jx9l_.flb 500 0 14 0 1 /home/oracle/fra/CDB2/flashback/o1_mf_fbx7k4rr_.flb 500 0 15 0 1 /home/oracle/fra/CDB2/flashback/o1_mf_fbx7kh1d_.flb 500 0 16 0 1 /home/oracle/fra/CDB2/flashback/o1_mf_fbx7kpdw_.flb 500 0 17 0 1 /home/oracle/fra/CDB2/flashback/o1_mf_fbx7kxo0_.flb 500 0 18 0 1 /home/oracle/fra/CDB2/flashback/o1_mf_fbx7l4w5_.flb 500 0 19 0 1 /home/oracle/fra/CDB2/flashback/o1_mf_fbx7lfgr_.flb 500 0 20 0 1 /home/oracle/fra/CDB2/flashback/o1_mf_fbx7lnok_.flb 500 0 21 0 1 /home/oracle/fra/CDB2/flashback/o1_mf_fbx7lvxp_.flb 500 0 22 0 1 /home/oracle/fra/CDB2/flashback/o1_mf_fbx7m366_.flb 500 0 23 0 1 /home/oracle/fra/CDB2/flashback/o1_mf_fbx7mbg1_.flb 500 0 24 0 1 /home/oracle/fra/CDB2/flashback/o1_mf_fbx7mksf_.flb 500 0 25 0 1 /home/oracle/fra/CDB2/flashback/o1_mf_fbx7ms2r_.flb 500 0 26 0 1 /home/oracle/fra/CDB2/flashback/o1_mf_fbx7n0b6_.flb 500 0 26 rows selected.
Se somarmos todos os flashback logs teremos o total de 10GB.
É isso que eu tinha para hoje! Espero que tenham gostado.
Franky