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

