Archival Backups são as exceções das políticas de retenção do banco de dados, permitindo que os dados sejam preservados por um período muito maior do que definido via regra de retenção. Pode acontecer que a media usada para estes backups não fiquem disponíveis (exemplo de fitas que são armazenadas fora do datacenter), além do detalhe que este tipo de backup não pode ser feito na FRA (Fast Recovery Area). Um exemplo de uso deste recurso é realizar um backup de cada fechamento trimestral, ou realizar um backup antes e após um upgrade ou migração importantes, etc. Neste artigo vamos explorar alguns cenários práticos deste recurso.
Em relação à sintaxe, a base de tudo é o modelo abaixo:
BACKUP ... KEEP {UNTIL TIME [=] 'date_string' | FOREVER} | NOKEEP [RESTORE POINT alias];
Podemos realizar este archival backup com o banco online ou offline (montado). Na segunda opção, não será necessário os archivelogs ou backups incrementais para fazer o restore/recover do banco, além de não ser necessário abrir o banco usando a opção RESETLOGS. Preparando nosso banco de dados para o teste:
[oracle@oel8 admin]$ sqlplus / as sysdba
SQL*Plus: Release 18.0.0.0.0 - Production on Thu May 6 05:04:36 2021
Version 18.13.0.0.0
Copyright (c) 1982, 2018, Oracle. All rights reserved.
Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.13.0.0.0
SQL> select instance_name,status from v$instance;
INSTANCE_NAME STATUS
---------------- ------------
RMANDB OPEN
SQL> shu immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 1610612016 bytes
Fixed Size 8658224 bytes
Variable Size 520093696 bytes
Database Buffers 1073741824 bytes
Redo Buffers 8118272 bytes
Database mounted.
SQL> select instance_name,status from v$instance;
INSTANCE_NAME STATUS
---------------- ------------
RMANDB MOUNTED
Ao executar o comando abaixo recebemos um erro, pois a FRA não pode abrigar arquivos dessa natureza:
[oracle@oel8 admin]$ rman target /
Recovery Manager: Release 18.0.0.0.0 - Production on Thu May 6 05:06:59 2021
Version 18.13.0.0.0
Copyright (c) 1982, 2018, Oracle and/or its affiliates. All rights reserved.
connected to target database: RMANDB (DBID=3825250984, not open)
RMAN> BACKUP DATABASE KEEP UNTIL TIME 'SYSDATE+365';
Starting backup at 2021-05-06:05:07:02
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=44 device type=DISK
backup will be obsolete on date 2022-05-06:05:07:02
archived logs required to recover from this backup will be backed up
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00001 name=/oracle/dados/RMANDB/datafile/o1_mf_system_h8nynqfx_.dbf
input datafile file number=00003 name=/oracle/dados/RMANDB/datafile/o1_mf_sysaux_h8nyq35q_.dbf
input datafile file number=00004 name=/oracle/dados/RMANDB/datafile/o1_mf_undotbs1_h8nyrjdr_.dbf
input datafile file number=00005 name=/oracle/dados/RMANDB/datafile/ts_cortex_catalog.dbf
input datafile file number=00007 name=/oracle/dados/RMANDB/datafile/o1_mf_users_h8nyrkn7_.dbf
channel ORA_DISK_1: starting piece 1 at 2021-05-06:05:07:02
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of backup command at 05/06/2021 05:07:03
ORA-19811: cannot have files in DB_RECOVERY_FILE_DEST with keep attributes
Definindo no comando o destino dos arquivos, além de nomear o restore point para facilitar as consultas posteriores:
RMAN> BACKUP DATABASE FORMAT '/oracle/dados/RMANDB/BACKUP1/%U' TAG DB_KEEP KEEP UNTIL TIME 'SYSDATE+365' RESTORE POINT BSS;
Starting backup at 2021-05-06:05:09:57
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=1 device type=DISK
backup will be obsolete on date 2022-05-06:05:09:57
archived logs required to recover from this backup will be backed up
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00001 name=/oracle/dados/RMANDB/datafile/o1_mf_system_h8nynqfx_.dbf
input datafile file number=00003 name=/oracle/dados/RMANDB/datafile/o1_mf_sysaux_h8nyq35q_.dbf
input datafile file number=00004 name=/oracle/dados/RMANDB/datafile/o1_mf_undotbs1_h8nyrjdr_.dbf
input datafile file number=00005 name=/oracle/dados/RMANDB/datafile/ts_cortex_catalog.dbf
input datafile file number=00007 name=/oracle/dados/RMANDB/datafile/o1_mf_users_h8nyrkn7_.dbf
channel ORA_DISK_1: starting piece 1 at 2021-05-06:05:09:57
channel ORA_DISK_1: finished piece 1 at 2021-05-06:05:11:02
piece handle=/oracle/dados/RMANDB/BACKUP1/cqvu5215_1_1 tag=DB_KEEP comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:01:05
using channel ORA_DISK_1
backup will be obsolete on date 2022-05-06:05:11:03
archived logs will not be kept or backed up
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
including current SPFILE in backup set
channel ORA_DISK_1: starting piece 1 at 2021-05-06:05:11:03
channel ORA_DISK_1: finished piece 1 at 2021-05-06:05:11:04
piece handle=/oracle/dados/RMANDB/BACKUP1/crvu5237_1_1 tag=DB_KEEP comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
using channel ORA_DISK_1
backup will be obsolete on date 2022-05-06:05:11:04
archived logs will not be kept or backed up
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
including current control file in backup set
channel ORA_DISK_1: starting piece 1 at 2021-05-06:05:11:05
channel ORA_DISK_1: finished piece 1 at 2021-05-06:05:11:06
piece handle=/oracle/dados/RMANDB/BACKUP1/csvu5238_1_1 tag=DB_KEEP comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
Finished backup at 2021-05-06:05:11:06
Abrindo o banco e listando informações sobre o backup, observamos que foi definido uma TAG chamada DB_KEEP:
RMAN> ALTER DATABASE OPEN;
Statement processed
RMAN> LIST BACKUP OF DATABASE;
List of Backup Sets
===================
BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ -------------------
321 Full 1.29G DISK 00:00:43 2021-05-06:05:10:40
BP Key: 347 Status: AVAILABLE Compressed: NO Tag: DB_KEEP
Piece Name: /oracle/dados/RMANDB/BACKUP1/cqvu5215_1_1
Keep: BACKUP_LOGS Until: 2022-05-06:05:09:57
List of Datafiles in backup set 321
File LV Type Ckp SCN Ckp Time Abs Fuz SCN Sparse Name
---- -- ---- ---------- ------------------- ----------- ------ ----
1 Full 2695951 2021-05-06:05:04:56 NO /oracle/dados/RMANDB/datafile/o1_mf_system_h8nynqfx_.dbf
3 Full 2695951 2021-05-06:05:04:56 NO /oracle/dados/RMANDB/datafile/o1_mf_sysaux_h8nyq35q_.dbf
4 Full 2695951 2021-05-06:05:04:56 NO /oracle/dados/RMANDB/datafile/o1_mf_undotbs1_h8nyrjdr_.dbf
5 Full 2695951 2021-05-06:05:04:56 NO /oracle/dados/RMANDB/datafile/ts_cortex_catalog.dbf
7 Full 2695951 2021-05-06:05:04:56 NO /oracle/dados/RMANDB/datafile/o1_mf_users_h8nyrkn7_.dbf
Com a query abaixo também podemos consultar todos os archival backups:
RMAN> SELECT S.RECID, S.SET_COUNT, S.BACKUP_TYPE, S.PIECES, P.PIECE#, S.KEEP_OPTIONS, S.KEEP_UNTIL FROM V$BACKUP_SET S, V$BACKUP_PIECE P WHERE S.RECID = P.RECID AND S.KEEP='YES';
RECID SET_COUNT B PIECES PIECE# KEEP_OPTION KEEP_UNTIL
---------- ---------- - ---------- ---------- ----------- -------------------
321 410 D 1 1 BACKUP_LOGS 2022-05-06:05:09:57
322 411 D 1 1 NOLOGS 2022-05-06:05:11:03
323 412 D 1 1 NOLOGS 2022-05-06:05:11:04
Podemos consultar também todos os restore points existentes:
RMAN> LIST RESTORE POINT ALL;
SCN RSP Time Type Time Name
---------------- ------------------- ---------- ------------------- ----
2695950 2021-05-06:05:11:02 BSS
Podemos procurar pelo nome específico do Restore Point:
RMAN> LIST RESTORE POINT BSS;
SCN RSP Time Type Time Name
---------------- ------------------- ---------- ------------------- ----
2695950 2021-05-06:05:11:02 BSS
Caso queiramos usar este recurso fazendo o backup com o banco aberto, percebemos que o backup dos archivelogs também é realizado, pois será necessário em um eventual recover:
RMAN> BACKUP DATABASE FORMAT '/oracle/dados/RMANDB/BACKUP1/%U' TAG DB_KEEP KEEP UNTIL TIME 'SYSDATE+365' RESTORE POINT BSS1;
Starting backup at 2021-05-06:05:19:49
using channel ORA_DISK_1
backup will be obsolete on date 2022-05-06:05:19:49
archived logs required to recover from this backup will be backed up
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00001 name=/oracle/dados/RMANDB/datafile/o1_mf_system_h8nynqfx_.dbf
input datafile file number=00003 name=/oracle/dados/RMANDB/datafile/o1_mf_sysaux_h8nyq35q_.dbf
input datafile file number=00004 name=/oracle/dados/RMANDB/datafile/o1_mf_undotbs1_h8nyrjdr_.dbf
input datafile file number=00005 name=/oracle/dados/RMANDB/datafile/ts_cortex_catalog.dbf
input datafile file number=00007 name=/oracle/dados/RMANDB/datafile/o1_mf_users_h8nyrkn7_.dbf
channel ORA_DISK_1: starting piece 1 at 2021-05-06:05:19:49
channel ORA_DISK_1: finished piece 1 at 2021-05-06:05:20:14
piece handle=/oracle/dados/RMANDB/BACKUP1/ctvu52jl_1_1 tag=DB_KEEP comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:25
current log archived
using channel ORA_DISK_1
backup will be obsolete on date 2022-05-06:05:20:17
archived logs required to recover from this backup will be backed up
channel ORA_DISK_1: starting archived log backup set
channel ORA_DISK_1: specifying archived log(s) in backup set
input archived log thread=1 sequence=100 RECID=110 STAMP=1071811216
channel ORA_DISK_1: starting piece 1 at 2021-05-06:05:20:17
channel ORA_DISK_1: finished piece 1 at 2021-05-06:05:20:18
piece handle=/oracle/dados/RMANDB/BACKUP1/cuvu52kh_1_1 tag=DB_KEEP comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
using channel ORA_DISK_1
backup will be obsolete on date 2022-05-06:05:20:19
archived logs required to recover from this backup will be backed up
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
including current SPFILE in backup set
channel ORA_DISK_1: starting piece 1 at 2021-05-06:05:20:19
channel ORA_DISK_1: finished piece 1 at 2021-05-06:05:20:20
piece handle=/oracle/dados/RMANDB/BACKUP1/cvvu52kj_1_1 tag=DB_KEEP comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
using channel ORA_DISK_1
backup will be obsolete on date 2022-05-06:05:20:20
archived logs required to recover from this backup will be backed up
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
including current control file in backup set
channel ORA_DISK_1: starting piece 1 at 2021-05-06:05:20:21
channel ORA_DISK_1: finished piece 1 at 2021-05-06:05:20:22
piece handle=/oracle/dados/RMANDB/BACKUP1/d0vu52kk_1_1 tag=DB_KEEP comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
Finished backup at 2021-05-06:05:20:22
RMAN> LIST RESTORE POINT BSS1;
SCN RSP Time Type Time Name
---------------- ------------------- ---------- ------------------- ----
2696931 2021-05-06:05:20:18 BSS1
Tentando realizar o mesmo backup, mas com a opção KEEP FOREVER. Vemos que esta condição só é possível utilizando o catálogo do RMAN:
RMAN> BACKUP DATABASE FORMAT '/oracle/dados/RMANDB/BACKUP1/%U' TAG DB_KEEP KEEP FOREVER RESTORE POINT BSS2;
Starting backup at 2021-05-06:05:24:36
using channel ORA_DISK_1
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of backup command at 05/06/2021 05:24:36
RMAN-06522: KEEP FOREVER option is not supported without the recovery catalog
Desse modo, vou usar um outro banco de dados que possui catálogo criado para testar esse recurso:
[oracle@oel7 BACKUP]$ rman target / catalog CORTEX_CATALOG/CORTEX_CATALOG@RMANDB
Recovery Manager: Release 19.0.0.0.0 - Production on Thu May 6 05:28:08 2021
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
connected to target database: CORTEX (DBID=548968087)
RMAN-04007: warning from recovery catalog database: ORA-28002: the password will expire within 7 days
connected to recovery catalog database
RMAN> BACKUP DATABASE FORMAT '/oracle/BACKUP/%U' TAG DB_KEEP KEEP FOREVER RESTORE POINT BSS2;
Starting backup at 06-MAY-21
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=7 device type=DISK
backup will never be obsolete
archived logs required to recover from this backup will be backed up
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00001 name=+DG_DATA/CORTEX/DATAFILE/system.256.1039033445
input datafile file number=00005 name=+DG_DATA/CORTEX/DATAFILE/soe.266.1065506205
input datafile file number=00003 name=+DG_DATA/CORTEX/DATAFILE/sysaux.257.1039033519
input datafile file number=00004 name=+DG_DATA/CORTEX/DATAFILE/undotbs1.258.1039033555
input datafile file number=00007 name=+DG_DATA/CORTEX/DATAFILE/users.259.1039033555
channel ORA_DISK_1: starting piece 1 at 06-MAY-21
channel ORA_DISK_1: finished piece 1 at 06-MAY-21
piece handle=/oracle/BACKUP/03vu533c_1_1 tag=DB_KEEP comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:02:45
current log archived
using channel ORA_DISK_1
backup will never be obsolete
archived logs required to recover from this backup will be backed up
channel ORA_DISK_1: starting archived log backup set
channel ORA_DISK_1: specifying archived log(s) in backup set
input archived log thread=1 sequence=24 RECID=20 STAMP=1071811858
channel ORA_DISK_1: starting piece 1 at 06-MAY-21
channel ORA_DISK_1: finished piece 1 at 06-MAY-21
piece handle=/oracle/BACKUP/04vu538k_1_1 tag=DB_KEEP comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
using channel ORA_DISK_1
backup will never be obsolete
archived logs required to recover from this backup will be backed up
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
including current SPFILE in backup set
channel ORA_DISK_1: starting piece 1 at 06-MAY-21
channel ORA_DISK_1: finished piece 1 at 06-MAY-21
piece handle=/oracle/BACKUP/05vu538m_1_1 tag=DB_KEEP comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
using channel ORA_DISK_1
backup will never be obsolete
archived logs required to recover from this backup will be backed up
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
including current control file in backup set
channel ORA_DISK_1: starting piece 1 at 06-MAY-21
channel ORA_DISK_1: finished piece 1 at 06-MAY-21
piece handle=/oracle/BACKUP/06vu538o_1_1 tag=DB_KEEP comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
Finished backup at 06-MAY-21
RMAN> LIST RESTORE POINT BSS2;
SCN RSP Time Type Time Name
---------------- --------- ---------- --------- ----
3931139 06-MAY-21 BSS2
Para finalizar o artigo, vamos simular uma situação onde criamos um archival backup de 1 ano, mas depois queremos deixá-lo com retenção infinita:
RMAN> BACKUP DATABASE FORMAT '/oracle/BACKUP/%U' TAG DB_KEEP KEEP UNTIL TIME 'SYSDATE+365' RESTORE POINT BSS3;
Starting backup at 06-MAY-21
using channel ORA_DISK_1
backup will be obsolete on date 06-MAY-22
archived logs required to recover from this backup will be backed up
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00001 name=+DG_DATA/CORTEX/DATAFILE/system.256.1039033445
input datafile file number=00005 name=+DG_DATA/CORTEX/DATAFILE/soe.266.1065506205
input datafile file number=00003 name=+DG_DATA/CORTEX/DATAFILE/sysaux.257.1039033519
input datafile file number=00004 name=+DG_DATA/CORTEX/DATAFILE/undotbs1.258.1039033555
input datafile file number=00007 name=+DG_DATA/CORTEX/DATAFILE/users.259.1039033555
channel ORA_DISK_1: starting piece 1 at 06-MAY-21
channel ORA_DISK_1: finished piece 1 at 06-MAY-21
piece handle=/oracle/BACKUP/07vu53ck_1_1 tag=DB_KEEP comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:02:25
current log archived
using channel ORA_DISK_1
backup will be obsolete on date 06-MAY-22
archived logs required to recover from this backup will be backed up
channel ORA_DISK_1: starting archived log backup set
channel ORA_DISK_1: specifying archived log(s) in backup set
input archived log thread=1 sequence=24 RECID=20 STAMP=1071811858
input archived log thread=1 sequence=25 RECID=21 STAMP=1071812134
channel ORA_DISK_1: starting piece 1 at 06-MAY-21
channel ORA_DISK_1: finished piece 1 at 06-MAY-21
piece handle=/oracle/BACKUP/08vu53h7_1_1 tag=DB_KEEP comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
using channel ORA_DISK_1
backup will be obsolete on date 06-MAY-22
archived logs required to recover from this backup will be backed up
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
including current SPFILE in backup set
channel ORA_DISK_1: starting piece 1 at 06-MAY-21
channel ORA_DISK_1: finished piece 1 at 06-MAY-21
piece handle=/oracle/BACKUP/09vu53h9_1_1 tag=DB_KEEP comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
using channel ORA_DISK_1
backup will be obsolete on date 06-MAY-22
archived logs required to recover from this backup will be backed up
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
including current control file in backup set
channel ORA_DISK_1: starting piece 1 at 06-MAY-21
channel ORA_DISK_1: finished piece 1 at 06-MAY-21
piece handle=/oracle/BACKUP/0avu53hb_1_1 tag=DB_KEEP comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
Finished backup at 06-MAY-21
RMAN> LIST RESTORE POINT BSS3;
SCN RSP Time Type Time Name
---------------- --------- ---------- --------- ----
3932348 06-MAY-21 BSS3
Com o comando CHANGE podemos alterar este restore point para FOREVER:
RMAN> LIST BACKUP OF DATABASE;
List of Backup Sets
===================
BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
85 Full 1.97G DISK 00:02:03 06-MAY-21
BP Key: 88 Status: AVAILABLE Compressed: NO Tag: DB_KEEP
Piece Name: /oracle/BACKUP/03vu533c_1_1
Keep: BACKUP_LOGS Until: FOREVER
List of Datafiles in backup set 85
File LV Type Ckp SCN Ckp Time Abs Fuz SCN Sparse Name
---- -- ---- ---------- --------- ----------- ------ ----
1 Full 3931140 06-MAY-21 NO +DG_DATA/CORTEX/DATAFILE/system.256.1039033445
3 Full 3931140 06-MAY-21 NO +DG_DATA/CORTEX/DATAFILE/sysaux.257.1039033519
4 Full 3931140 06-MAY-21 NO +DG_DATA/CORTEX/DATAFILE/undotbs1.258.1039033555
5 Full 3931140 06-MAY-21 NO +DG_DATA/CORTEX/DATAFILE/soe.266.1065506205
7 Full 3931140 06-MAY-21 NO +DG_DATA/CORTEX/DATAFILE/users.259.1039033555
BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
143 Full 1.97G DISK 00:02:00 06-MAY-21
BP Key: 145 Status: AVAILABLE Compressed: NO Tag: DB_KEEP
Piece Name: /oracle/BACKUP/07vu53ck_1_1
Keep: BACKUP_LOGS Until: 06-MAY-22
List of Datafiles in backup set 143
File LV Type Ckp SCN Ckp Time Abs Fuz SCN Sparse Name
---- -- ---- ---------- --------- ----------- ------ ----
1 Full 3932349 06-MAY-21 NO +DG_DATA/CORTEX/DATAFILE/system.256.1039033445
3 Full 3932349 06-MAY-21 NO +DG_DATA/CORTEX/DATAFILE/sysaux.257.1039033519
4 Full 3932349 06-MAY-21 NO +DG_DATA/CORTEX/DATAFILE/undotbs1.258.1039033555
5 Full 3932349 06-MAY-21 NO +DG_DATA/CORTEX/DATAFILE/soe.266.1065506205
7 Full 3932349 06-MAY-21 NO +DG_DATA/CORTEX/DATAFILE/users.259.1039033555
RMAN> CHANGE BACKUPSET 143 KEEP FOREVER;
using channel ORA_DISK_1
keep attributes for the backup are changed
backup will never be obsolete
backup set key=143 RECID=6 STAMP=1071812132
Obs: Este procedimento foi criado pelo senhor Ahmed Baraka (www.ahmedbaraka.com) e foi apenas reproduzido por mim em um laboratório pessoal para fins de aprendizado.