Managing Flashback Logs size

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.

flashback logs

Flashback architecture overview

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