Mostrando postagens com marcador Oracle Database;Arquitetura Oracle. Mostrar todas as postagens
Mostrando postagens com marcador Oracle Database;Arquitetura Oracle. Mostrar todas as postagens

12 de abr. de 2013

Oracle Database – Entendendo sua Arquitetura (Parte 2)

Olá pessoal, hoje abordaremos as estruturas de armazenamento no ambiente Oracle. Espero q apreciem…

INTRODUÇÂO

Em um Servidor Oracle, o banco de dados em sí é composto por vários arquivos no disco e consiste em estruturas de armazenamento físicas e lógicas.

Os arquivos que compõe o banco de dados são categorizados em dois grupos: Arquivos de Banco de Dados por armazenarem Dados e Metadados e os  Arquivos Não Banco de Dados por armazenarem Parâmetros de Inicialização, informações de Logs, etc..

imageO modelo relacional das estruturas de armazenamento utilizado pelo Oracle Database é mostrado na figura. Esta é um diagrama de entidade-relacionamento que utiliza-se da notação Engenharia de Informações para demonstrar o relacionamento “um–para–muitos” entre as entidades, nas respectivas estruturas.  

Com esta divisão (ou separação) do armazenamento  no servidor, o armazenamento físico dos dados pode ser gerenciado sem afetar o acesso às estruturas lógicas.

A Estrutura Lógica é formada pelas entidades Tablespace, Segment, Extent e Oracle data block, enquanto que a Estrutura Física  pelas entidades Data Files e OS Block (blocos do Sistema Operacional).

ESTRUTURAS FÍSICAS DE ARMAZENAMENTO

Na estrutura física, o banco de dados é composto de por vários tipos arquivos; três são obrigatórios:  Arquivo de Dado, Arquivo de  controle e Arquivo de redo log. Os arquivos externos que normalmente estarão presentes são: Arquivo de Parâmetros, Arquivo de Senhas  e Arquivo de Redo Log Arquivado.
 
Arquivo de Dados – Data File: 

Os arquivos de dados são os maiores arquivos em um banco de dados Oracle. Eles armazenam todos os dados inseridos no banco de dados, bem como os de dados necessário para que o SGDBR Oracle possa gerenciá-lo.  Tais arquivos de dados, existem mesmo se o banco de dados está em uso ou não, ou seja, aberto ou fechado.  Conforme vimos na primeira figura deste post – Storage Structures – cada arquivo de dados está contido em uma única tablespace, porém uma única tablespace pode conter maiimages de um arquivo de dados.

Em versões anteriores ao Oracle database 10g, pelo menos um arquivo de dados deveria ser criado. A partir desta versão, quando um banco de dados é criado, pelo menos dois arquivos de dados são criados: um para o tablespace SYSTEM (armazena o dicionário de dados) e um outro para o tablespace SYSAUX (armazena os dados que auxiliam o dicionário de dados).  

A figura, mostra, através da consulta da VIEW V$DATAFILE, os dois arquivos de dados criados em uma instalação 11g: SYSTEM01 E SYSAUX01.

Arquivo de  controle – Control File:

O arquivo de controle é de extrema importância por manter os metadados  do banco de dados. Ele é validado na inicialização do banco contenimagedo informações, tais como:  Nome do banco de dados e o seu identificador (SID), Timestamp de criação do BD, Nomes das tablespaces. 

Nomes e as localizações dos arquivos de dados e de redo log online, Informações sobre checkpoints, de recuperação, de backup, dentre outras. Por ele ser muito crítico para a operação do banco de dados, a recomendação é de manter cópias multiplexadas (cópias em diferentes discos) do mesmo.

Os arquivo de controle é um arquivo binário com extensão “CTL”. A figura mostra uma consulta da VIEW V$CONTROLFILE, listando o nome e o status de todos os arquivos de controle  associados à instância.

Arquivos de redo log – Redo Log Files: 

Os arquivos de redo log armazenam todas as alterações realizadas nos banimagecos de dados como resultado das transações e das atividades internas do Oracle.  

Com isto, os arquivos de redo log contêm todas as informações necessárias para recuperar dados perdidos em seu banco de dados. 

Cada instrução SQL que você emitir a alteração de dados pode ser reconstruído pela informação guardada nesses arquivos.

Os arquivos de redo log são arquivos binários nomeados com a extensão “LOG” e são organizados em grupos e membros. Cada banco de dados deve ter pelo menos dois grupos de redo log. Também, para o arquivo de redo log, a recomendação é de manter cópias multiplexadas do mesmo.

Arquivos de Parâmetros – Parameter Files:

São  arquivos que contêm valores de parâmentros de inicialização, utilizados para definirem  recursos do banco de dados, os limites quanto aos tamanhos das várias estruturas na System Global Area (SGA) e também quanto à quantidade de usuários que podem se conectar ao banco de dados simultaneamente.

Arquivo de Senhas - Password File:

Arquivo dentro da estrutura adminstrativa ou de diretório do software Oracle, que armazena informações de autenticação de usuários que possuem permissão para inicializar ou efetuar shutdown no banco de dados.

 Arquivos de Redo Log Arquivados - Archived Redo Log Files:

Estes arquivos são cópias off-line dos arquivos de redo log. Em processo (s) de recuperação de falhas são extremante necessários.


ESTRUTURAS LÓGICAS DE ARMAZENAMENTO

Um banco de dados Oracle é composto por unidade lógicas, tornando possível e eficiente a administração do armazenamento físico dos dados.  Abaixo, uma breve descrição dos compoentes de forma resumida:

Tablespace -  Espaço de Tabela:

No Oracle, todos os dados no banco de dados são armazenados, de forma lógica, em Tablespace (ou espaço de tabela), que consiste de um ou mais arquivos de dados (estruturas físicas). Na tablespace, contêm os segmentos que são as estruturas lógicas do banco de dados, como tabelas e índices. Esta divisão lógica ajuda a administrar uma parte do banco de dados sem afetar as outras. Cada banco de dados pode ter uma ou mais tablespaces.

image
Segment – Segmento:

Agrupamento de extensões no banco de dados abran-gendo  um objeto, tratado pelo Oracle, como uma unidade, por exemplo, uma tabela ou índice. 

Esta, normalmente, é a menor unidade de armazenamento com a qual um usuário final do banco de dados lidará.  

Há quatro tipos de segmentos encontrados em um banco de dados Oracle: segmentos de dados, segmentos de índices, segmentos temporários e segmentos de rollback.

Extents – Extensões: 

É o próximo nível da estrutura lógica; são formados por um agrupamento de blocos contíguos.

Oracle data blocks - bloco de dados do Oracle:

Menor estrutura de armazenamento, porém o seu tamanho é normalmente um múltiplo do tamanho de um bloco do sistema operacional; isto ajuda no desempenho da I/O.  

O bloco corresponde a um número específico de bytes, baseado no parâmetro DB_BLOCK_SIZE determinado quando o banco de dados é criado.


Finalizo aqui e espero que este humilde resumo tenha sido proveitoso e útil a todos. Comentários são sempre bem vindos.

[]’s e obrigado.

Juliano Ramalho.


Referências:

- Oracle Essentials - Oracle Database 11g – 4ª Ed. Rick Greenwald,  
- Oracle Database 11g The Complete Reference – Kevin Loney     
- Oracle Database 11g DBA Handbook - Bob Bryla and Kevin Loney   
- Introduction to Oracle Database - Oracle® Database Concepts 11g Release 2 (11.2)

6 de abr. de 2013

Oracle Database – Entendendo sua Arquitetura (Parte 1)

Olá pessoal!  O tema a ser abordado. neste e no próximo post, será sobre a arquitetura Oracle – foco para certificação OCA.  Iniciarei um breve overview sobre alguns conceitos básicos em sistemas de banco de dados. Espero que apreciem…

INTRODUÇÃO

Há muito, os bancos de dados e seus repectivos sistemas gerenciadores são essenciais em nosso cotidiano. A tecnologia empregada neste nicho têm um impacto importante no crescente uso dos sistemas computacionais. Portanto, deve-se ter em mente a diferença entre os termos “Banco de Dados ou DataBase” e “SGBD – Sistema Gerenciador de Banco de Dados ou DBMS – DataBase Management System”.

Banco de Dados ou Database é uma coleção de informações relacionadas representando algum aspecto do nosso mundo real, às vezes chamado de minimundo ou universo de discurso (UoD – Universe of Discourse) [Navathe].

Sistema Gerenciador de Banco de Dados é um sistema de software de uso geral que facilita o processo de definição, construção, manipulação e compartilhamento de bancos de dados entre os diversos usuários e  aplicações, além da proteção dos dados [Navathe].  A figura abaixo ilustra os conceitos abordados e ao lado um breve descritivo dos mesmos.
 
imageDefinição: Envolve a especificação dos tipos, das estruturas e restrições dos dados a serem armazendos; Toda esta definição ou informação descritiva do banco de dados será também armazenada pelo SGBD na forma de um catálogo ou dicionário de dados, chamado de metadados.

Construção: Processo de armazenamento dos dados em algum meio controlado pelo SGBD.
Maninpulação: São funções como consulta para recuperação de dados especificos, atualização do BD afim de refletir as mudanças no minimundo e a geração de relatórios com base nos dados.

Compartilhamento: Recurso pelo qual permite que os ususários e aplicações acessem-no simultaneamente.

Aplicações: Estas podem ser classificadas em três categorias: orientadas à transações; de suporte à decisão; e para a Internet. São programa de software que interagem com um banco de dados para acessar e manipular dados. O acesso ao BD dar-se-á ao enviar uma consulta (query) ou solicitação de dados ao SGBD.

Proteção:  Engloba-se a proteção do sistema contra defeitos e falhas de hardware e software e proteção de segurança contra acesso não autorizado e malicioso.

Basicamente, um SGDB é constituido pelos seguintes elementos:

- kernel code (código do Kernel): Código que gerencia a memória e armazenamento para o SGBD.

- Repositório de metadados (Repository of metadata): Repositório usualmente conhecido como Dicionário de Dados (Data Dictionary), é um conjunto somente–leitura de tabelas que fornecem informações sobre o banco de dados.

- Linguagem de consulta (Query language): Linguagem que permite que os usuários e aplicações acessem os dados.

Os principais modelos de  SGBDs - sistemas de gerenciamento de banco de dados foram definidos nas décadas de 1960  e 1970, vejamos:

image
- Modelo Hierárquico: Principal modelo de dados, simbolizado pelo IMS da IBM  em 1965, organizava os dados em uma estrutura de árvore formando uma hierarquia de registros; semelhante à estrutura de um file system num relacionamento do tipo um – para – muitos; veja a figura ao lado.

Era muito restritivo e qualquer mudança na sua estrutura de dados exigia muito esforço de reprogramação. Além disso, o acesso dos programas e/ou aplicações ao banco de dados era feito via interfaces de baixo nivel de programação, usando-se a linguagem Assembler.
image
- Modelo Rede: Proposto por Carles Bachman (General Eletric) em 1964, é  semelhante ao modelo hierárquico, exceto pelo fato de ter registros de dados associados formando conjuntos de dados nas interseções num relacionamento do tipo muitos - para – muitos, conforme observamos na figura  ao lado.

- Modelo Relacional: O pesquisador da IBM Edgar Frank Codd publicou em 1970 um paper intitulado "Relational Model of Data for Large Shared Data Banks" ("Modelo de dados relacional para grandes bancos de dados compartilhados"), definindo este modelo derivado da Teoria dos Conjuntos Matemáticos.  O modelo relacional de Codd armazena os dados por linhas e colunas, em tabelas.

Uma tabela (relação) é uma representação bidimensional de linhas (tuplas) e as colunas (atributos). Cada linha em uma tabela tem o mesmo conjunto de colunas. Neste modelo, as tabelas (relações) são acessadas via uma linguagem de alto nivel chamada SQL (Structure Query Language), criando um maior nível de abstração, de modo que os usuários não precisavam mais conhecer a estrutura fisica dos dados; apenas dizer o que queriam e não mais o como. Veja o exemplo abaixo:

image

O Oracle Database, em todas as suas versões, é uma implmementação de um SGBDR - Sistema de Gerenciamento de Banco de Dados Relacional – o qual está de acordo com o paradigma relacional. Ele é a interface entre os usuários/aplicações com a base de dados (ou banco de dados).  A figura abaixo mostra, de forma resumida, os players em uma solução de gerenciamento de banco de dados Oracle Database 11g em uma organização.
image

ARQUITETURA ORACLE


A arquitetrua é subdividida em duas estruturas: a física, que abrange os arquivos físicos armazenados no disco;  a lógica, que abrange memória, armazenamento lógico e estruturas lógicas do banco de dados.  
Em um servidor Oracle Database, os dois componentes que o compõe são: a Instância e o Banco de dados. Em outras arquiteturas concorrentes, como o Microsoft SQL Server e o IBM DB2, estes termos são utilizados sem qualquer distinção por seus respectivos usuários. Isto se dá porque nelas, uma coleção de bancos de dados que compartilham recursos de memória comuns são referenciados como instância.

INSTÂNCIA x BANCO DE DADOS 

image
Na terminlogia Oracle, o termo “Instância” refere-se as estruturas de memórias e aos processos (ou processos background - background processes). Ela é  criada temporariamente na memória RAM e na(s) CPU(s) para permitir o acesso ao banco de dados. O “time to live” de uma instância se dá enquanto sua  permanência na memória, podendo ser inicializada ou parada.  Já, o termo “Banco de Dados” refere-se aos arquivos físicos que o  compôe.
Há dois tipos de arquiteturas de instância Oracle: a de instnância única e a distribuida.

- Arquitetura de instância única: encontrada em um ambiente simples onde a relação é um-para-um, ou seja,  um banco de dados é acessado por uma só instância. A figura ao lado ilustra esta arquitetura;

- Arquitetura distribuida (RAC - Real Application Cluster): Fornece a opção  para dimensionar aplicações além da capacidade de um único serviimagedor, provendo um ambiente de computação para o Banco de dados Oracle executar todos os tipos de aplicações corporativas de base em um conjunto de servidores em cluster (grupo de sistemas de computadores independentes, conhecidos como nós,  trabalhando juntos como um único sistema). 
Neste ambiente, a relação é de muitos-para-um, pois um  banco de dados em cluster é um único banco de dados que pode ser acessado por diversas instâncias, onde cada instância é executada em um servidor (nó do cluster) distinto. 
A figura ao lado mostra esta arquitetura.
Esta solução de arquitetrua distribuida será abordada, em profundidade,  em um post oportuno. 
Voltando à arquitetura de instância única, vemos na figura abaixo a representação simplificada de uma concexão entre um usuário e um banco de dados no servidor de Banco de Dados Oracle.  Neste processo há interagibilidade entre os seguintes componentes:  usuário, processo do usuário, processo do servidor, instância e banco de dados.

Do lado do Cliente (Front-end):

image
1- No host local o usuário interage com um processo de usuário conectando-se a um processo servidor no server;
2- Quando a conexão entre o processo do usuário com o processo do servidor é estabelecida, em geral, através  de uma LAN, o protocolo Oracle Net é utilizado sobre o TCP. Neste momento, os processos tanto do usuário quanto do servidor se interagem.

Do lado do Servidor:

3- O processo de servidor interage com uma instância.
4- A instância interage com o banco de dados.
Por segurança, nenhum processo do usuário interagirá diretamente com o banco de dados, sendo sempre mediado pelo processso do servidor. 

ESTRUTURAS DE MEMÓRIA 


O Oracle utiliza a memória física do servidor, criando estruturas lógicas, para armazenar diversas informações tais como:

- Códigos executáveis;

- Informações sobre cada sessão;

- Informações de processos individuais associados ao banco de dados;

- Informações compartilhadas entre os processos;

- Os dados em cache.

As estruturas de memória, criadas em um ambiente Oracle, contém as seguintes áreas:

SGA – System Global Area – Sistema de Área Global):  Grupo de estruturas de memória read/write compartilhada por todos os Processos Backgrounds e Processos Servidores; contêm dados e informações de controle para uma instância de banco de dados Oracle. Cada instância tem a sua própria SGA.

PGA -  Program Global Area – Área de Programa Global: Região da memória  não-compartilhada, que contém dados e informações de controle exclusivamente para uso por um processo. O PGA é criado pela banco de dados Oracle, quando um processo é iniciado. PGA existe para cada processo servidor e processo background.

UGA – User Global Area - Área do Usuário Global: A UGA é a memória associada a uma sessão do usuário.

Software Code Area - Área de Código de Software: é uma área utilizada ​​para o armazenamento do código executável que está ou será executado. O código do Banco de Dados Oracle é armazenado em uma área de software que normalmente é em um local exclusivo e/ou protegido.

A figura a seguir, nos mostra a estrutura da SGA e seus componentes:

image

A memória na SGA, também chamada de Shared Global Area, é alocada em unidades de grânulos (unidade de alocação de memória virtual contígua). A configuração mínima da SGA são três grânulos: um grânulo para a SGA fixa [inclui os buffers de redo]; um grânulo para o Cache de Buffer do Banco de Dados e um grânulo para o Shared Pool.


Dependendo do tamanho total da SGA, um grânulo pode ter 4 ou 16 MB. Se o tamanho da SGA for menor ou igual a 128 MB, um grânulo terá 4 MB; caso contrário terá 16 MB.

Vamos a um breve overview sobre os componentes mais importantes:

a) Shared Pool – Pool Compartilhado

Área de compartilhamento que armazena vários tipos de dados, como códigos PL/SQL analizados (parsed), parêmetros do sistema, e definições de dados.

- Library Cache – Cache de Biblioteca:
Armazena as informações sobre intruções SQL e PL/SQL mais executadas recentemente no banco de dados, permitindo o compartilhamento destas instruções. Consiste em duas estruturas:

-- Shared SQL Area: 

Armazena e compartilha o plano deexecução e a árvore de parse das instruções SQL executadas no banco de dados. Assim, na segunda vez em que uma instrução SQL idêntica é executada, ela aproveita as informações de parse (análise) disponíveis na SQL compartilhado,agilizando a sua execução.


-- Shared PL/SQL Area:  

Armazena e compartilha as instruções PL/SQL executadas mais recentemente. Funções, pacotes e triggers compilados, e nos quais foi efetuado parse, são armazenados nessa área.


- Data Dictionary cache - Cache de Dicionário de Dados: 

É um conjunto das definições mais usadas recentemente no banco de dados • Inclui informações sobre arquivos do banco de dados, tabelas, índices, colunas, usuários, privilégios e outros objetos do banco de dados. Quando o servidor necessita dessas informações, as tabelas do dicionário de dados são lidas e os dados retornados são armazenados nesta área.


b) Database Buffer Cache – Cache de Buffer do Banco de Dados:

Este componente da SGA, também conhecido como Buffer Cache (ou Cache de Buffer), é a área da memória que armazena cópias dos blocos de dados lidos/acessados a partir dos arquivos de dados.
Os ojetivos pelos quais o  Oracle Database utiliza-se do Buffer Cache são os de otimizar a I/O, manter os blocos de dados freqüentemente acessados ​​no cache de buffer, e gravar os blocos menos acessados no disco.

Um buffer é uma área da memória, na qual o gerenciador de buffer, temporariamente, armazena os blocos de dados lidos recentemente ou que estão sendo no momento.

Como pode-se observar na figura acima, o Buffer Cache é dividido em um ou mais Buffer Pools:

- Defualt: 

Este  é o local onde os blocos são normalmente armazenados em cache, tem o tamanho padrão que é de 8 KB.


- Keep: 

O objetivo  é manter objetos na memória, evitando assim as operações de I/O. Portanto, destina-se a blocos que foram e são acessados com frequência,


- Recycle: 

Destina-se aos blocos que são utlizados com pouca frequência. Este pool impedi que os objetos consumam espaço desnecessário no cache.


- nK: 

 Este tipo de pool, destina-se ao armazenamento de tablespace que usa o tamanho de bloco não-padrão de 2KB, 4KB e 16KB. O tamanho padrão que é de 8 KB.


c) Redo Log Buffer Cache:

Área que aramazena as informacões sobre alterações no banco de dados, utilizada para reconstruir alteracões realizadas no banco de dados por DML, DDL ou operacões internas.

d) Large Pool:

Área opcional, utilizada para as transações que interagem com mais de um banco de dados, buffers de mensagens para processos executando consultas paralelas, além de operacões de backup e recovery.

e) Java Pool:

Área opcional, utilizada pela Orace JVM para todos os cógidos e dados Java em uma sessão de usuário.

f) Stream Pool:

Área opcional, utilizada para guardar dados e estruturas de controle para oferecer suporte para os recursos do Oracle Streams.

As informações sobre a SGA e seus componentes, podem ser obtidas por meio de uma consulta a V$SGAINFO, conforme vemos abaixo:

image


PGA – (Program Global Area ou Process Global Area)


Região da memória que contém os dados e as informações de controle de um único processo do servidor ou de um único processo de segundo plano. A PGA é alocada quando um processo  é criado e desalocada quando o processo é encerrado. Ao contrário da SGA, que é compartilhada por vários processos, a PGA é uma área usada por apenas um processo.

O PGA é subdividido em diferentes áreas, porém o seu conteúdo varia de acordo com a configuração de execução da instância (servidor dedicado ou servidor compartilhado). Em geral, a memória PGA inclui estes componentes:
image
Private SQL Area – Área SQL Privada: Contém dados, tais como as informações de bind e as estruturas de memória de runtime. Cada sessão que executa uma instrução SQL tem uma área SQL privada. Cada usuário que submete a mesma instrução SQL tem uma área SQL privada própria que usa uma única área SQL compartilhada. Dessa forma, é possível associar várias áreas SQL privadas à mesma área SQL compartilhada. A área SQL privada de um cursor (nome ou identificador para uma área específica da SQL privada) divide-se em duas áreas:

-- Persistent Area – Área Persistente: 

Esta área contém valores de varáveis de ligação. Um valor de variável de ligação é fornecida para uma instrução SQL em tempo de execução quando a instrução é executada. A área persistente é libertada apenas quando o cursor está fechado.


-- Runtime Area - Área de runtime: 

Criada como a primeira etapa de uma solicitação de execução. Para os comandos INSERT, UPDATE e DELETE, essa área é liberada após a execução da instrução. Para consultas, essa área só é liberada depois que é efetuada uma operação de fetch (busca de dados) em todas as linhas ou depois que a consulta é cancelada.


SQL Work Areas: 

É  uma alocação privada da memória PGA utlizada para operações com utilização intensiva da memória  como: Classificação, Junção de hash, Intercalação de bitmap, Criação de bitmap.


Session Memory:

Consiste na memória alocada para reter as variáveis de uma sessão e outras informações relativas a essa sessão.


PROCESSOS BACKGROUND 


Quando uma instância do Oracle é inicializada, vários processos em segundo plano também iniciam. Um processo em segundo plano é um bloco de código executável projetado para executar uma tarefa específica. Ao contrário do processo em primeiro plano, como uma sessão SQL*Plus ou um navegador da Web, um processo em segundo plano funciona nos bastidores.

Cada instância executa pelo menos quatro processos em background (DBWR, LGWR, SMON e PMON), podendo haver um número de processos em background adicionais.  A Figura abaixo mostra o relacionamento entre os processos em segundo plano, o banco de dados e a SGA do Oracle.  image Veremos uma breve descição de cada processo.

RECO (Recuperador): 

Utilizado com a configuração de banco de dados distribuído para resolver automaticamente falhas que envolvem transações distribuídas.


PMON (Monitor de Processos):

Executa a recuperação de processo quando um processo do usuário falha. Limpa o cache de buffer do banco de dados e libera recursos utilizados pelo processo do usuário.


SMON (Monitor do Sistema): 

Executa recuperação de travamentos, quando necessário, na inicialização da instância. Limpa os segmentos temporários que não são mais utilizados e aglutina as extensões livres contíguas nas tablespaces gerenciadas pelo dicionário.


CKPT (Ponto de verificação): 

Atualiza cabeçalhos do banco de dados para registrar os detalhes de um ponto de verificação. Não grava blocos no disco.


ARCn: 

Copia arquivos de log refazer online para armazenamento de arquivos quando os arquivos estão cheios ou ocorre uma troca de logs.


DBWn (Transcritor de Banco de Dados):

Grava buffers modificados (sujos) do cache de buffer do banco de dados em arquivos de dados.


LGWR (Transcritor de Log): 

Grava todas as entradas refazer que foram copiadas para o buffer desde a última vez em que gravou em um disco.


D000 (Dispatcher):

É executado somente quando a configuração do servidor compartilhado é utilizada. Permite que os processos de usuário compartilhem processos de servidor.


LMS (Servidor do Gerenciador de Travas):

Utilizado somente no Real Application Clusters. Fornece travamento entre as instâncias no Oracle9i Real Application Clusters.


Bom pessoal, finalizo esta primeira parte. No próximo post abordarei as estruturas de armazenamento.

[]’s e Obrigado

Juliano Ramalho

Referências: