IFRS Banco de Dados II
IFRS Banco de Dados II
[email protected]
https://youtube.com/user/andreschaeffer
Apresentação
Objetivos
Avaliação
A arquitetura de um banco de dados é o design estrutural que define como os dados são organizados,
armazenados e acessados dentro de um sistema de gerenciamento de banco de dados. A figura abaixo mostra
a arquitetura do SGBD Oracle que utilizaremos em nossas aulas práticas.
Sobre a nossa configuração de laboratório
Nosso banco de dados para as práticas será uma versão gratuita do banco de dados Oracle, o Oracle
Database XE (eXpress Edition) 10g. Levando em conta aspectos pedagógicos e custos relacionados,
utilizamos essa versão de banco de dados em um Ubuntu Linux 11.10 executando em uma máquina virtual,
no caso a Oracle VM Virtual Box 7.0. Maiores detalhes de utilização da máquina virtual, do ambiente
Linux e do banco de dados serão vistos no decorrer desta disciplina.
Um esquema lógico-abstrato do funcionamento do banco de dados pode ser visto na figura a seguir.
Os Background Processes são os processos responsáveis por gerenciar a instância do banco de dados.
Ex.: DBWR, LGWR, CKPT, SMON, PMON, ARCH, RECO, etc …
Se formos agora ao sistema operacional e o banco de dados da máquina Ub11Exer estiver ativado, ao
executarmos o comando
$ ps -ef | grep xe_ veremos todos os processos Linux responsáveis pelo gerenciamento do nosso
BD.
O banco de dados é um conjunto de
estruturas lógicas e físicas que juntas contêm
dados e metadados para as aplicações.
arquivos físicos que compõe o BD (datafiles, control file e o server parameter file)
online redo log files, que gravam todas as alterações feitas no banco de dados
archived redo log files, que juntamente com os online redo log files, constituem um registro de
todas as alterações “comitadas” no BD desde o último backup executado
Na Flash Recovery Área, os backup são guardados na forma de coleções chamadas de Conjuntos de Backup,
acessíveis pelas ferramentas do próprio banco de dados Oracle.
Árvore de diretórios da instalação padrão
Linux:
/usr/lib/oracle/xe/oradata/XE
Windows:
C:\oraclexe\oradata\XE
Linux:
/usr/lib/oracle/xe/app/oracle/flash_recovery_area/XE
Windows:
C:\oraclexe\app\oracle\flash_recovery_area\XE
Linux /usr/lib/oracle/xe/app/oracle/admin/XE Pastas com arquivos de log gerados pela instância, inclusive o
Windows C:\oraclexe\app\oracle\admin\XE “alert_xe.log”
Linux /usr/lib/oracle/xe/app/oracle/product/10.2.0/server
Pastas onde fica instalado o aplicativo
Windows C:\oraclexe\app\oracle\product\10.2.0\server
Configuração da máquina servidora como cliente de outros
Linux /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/network/admin
bancos de dados e do processo responsável por estabelecer
Windows C:\oraclexe\app\oracle\product\10.2.0\server\network\admin
conexões com o próprio banco de dados
Os modelos que usaremos em nosso laboratório são simplificações de sistemas reais para fins didáticos. São
3 usuários ou esquemas de banco de dados: POS, EOR e HR.
EMP 14 linhas
DEPT 5 linhas
Tabelas e Modelo E/R do esquema POS
(Administração de Bancos de Dados)
INTERFACE_VEICULOS 0 linhas
TCIDADES 9866 linhas
TCLIENTES 26535 linhas
TEMPRESAS 1 linhas
TESTABELECIMENTOS 26931 linhas
TITENS_NFS 386115 linhas
TNFS_SAIDA 50066 linhas
TPAISES 75 linhas
TUFS 114 linhas
Parte 1 - Transações em Bancos de Dados
Um curso introdutório de Bancos de Dados ou mesmo a disciplina de Bancos de Dados I talvez já tenha
abordado a temática das transações. No entanto, faremos algumas operações práticas sobre este tópico a fim
de aprimorar seu conhecimento sobre o assunto ou mesmo introduzir o mesmo para quem não conhece.
Transações em bancos de dados são operações lógicas e atômicas que manipulam dados dentro de um
sistema de gerenciamento de banco de dados. Uma transação pode ser composta por uma ou mais operações,
como inserção, atualização, exclusão ou consulta de dados.
A principal característica das transações é a atomicidade, que significa que todas as operações dentro da
transação são tratadas como uma unidade indivisível. Isso significa que ou todas as operações dentro da
transação são executadas com sucesso e os dados são atualizados no banco de dados, ou nenhuma operação é
realizada e o banco de dados permanece inalterado. Além da atomicidade, as transações também devem
obedecer a propriedades ACID:
Atomicidade: Como mencionado, uma transação é uma operação atômica, ou seja, todas as operações dentro
dela são tratadas como uma única unidade, garantindo que todas sejam concluídas com sucesso ou que
nenhuma seja executada.
Consistência: A transação deve garantir que o banco de dados passe de um estado consistente para outro
estado consistente. Isso significa que todas as restrições de integridade referencial e regras de negócios
devem ser mantidas antes e após a transação.
Isolamento: Cada transação deve ser isolada das outras transações concorrentes que estão ocorrendo
simultaneamente no sistema. Isso garante que o resultado de uma transação não seja afetado por outras
transações concorrentes e vice-versa.
Durabilidade: Após o commit de uma transação (confirmação das operações realizadas), as mudanças feitas
por essa transação devem ser permanentes e persistir mesmo em caso de falha do sistema, garantindo que os
dados permaneçam consistentes mesmo após eventos como falhas de energia ou reinicializações do sistema.
Exer - Transações
Exer – Esquema Objeto-Relacional
Parte 2 - Programação procedural – PL-SQL
Neste ponto de seu estudo sobre o funcionamento dos bancos de dados, você já deve ter algum nível de
familiaridade com a linguagem SQL, e já deve ter notado que, apesar de poderosa, ela não consegue por si só
implementar uma série de recursos e necessidades que temos e que são atendidos pelas linguagens de
programação, como por exemplo loops, estruturas if-then-else, procedimentos e funções. No contexto do
banco de dados Oracle, isso é atendido pela Procedural Language (PL-SQL). Veremos em nossos exercícios
apenas exemplos simples direcionados a alunos que estão tendo seu primeiro contato com o assunto. A
linguagem PL-SQL oferece recursos como tratamento de exceções, ocultação de informações, orientação a
objetos, assim como a inserção dos recursos e necessidades citados anteriormente. Permite que as instruções
da linguagem SQL sejam incluídas em unidades procedurais de código e estruturadas em blocos. Ela é usada
na construção de objetos do banco de dados Oracle como procedimentos, funções, gatilhos e pacotes
(procedures, functions, triggers e packages).
Você poderia questionar: mas tais necessidades e recursos, se não fossem contemplados pela linguagem PL-
SQL, seriam contemplados pela linguagem de programação da aplicação que conecta com o BD. Por que
usar um ou outro?
Desempenho: PL/SQL pode ser mais eficiente para operações que envolvem manipulação intensiva de dados
no banco de dados. Isso ocorre porque as operações realizadas no banco de dados são executadas no servidor
de banco de dados, minimizando a transferência de dados entre o banco de dados e a interface da aplicação.
Segurança: o uso de PL/SQL pode ajudar a garantir a integridade dos dados e aplicar regras de negócios
diretamente no banco de dados. Isso ajuda a garantir que as operações de banco de dados sejam realizadas de
maneira consistente e segura, independentemente da interface do usuário.
Consistência de Dados: ao usar PL/SQL é mais fácil garantir a consistência dos dados, especialmente em
sistemas multiusuários, onde várias partes da aplicação podem estar acessando e modificando os mesmos
dados simultaneamente.
Reutilização de Código: procedimentos e funções PL/SQL podem ser reutilizados em várias partes da
aplicação, o que pode reduzir a duplicação de código e promover a consistência e a modularidade.
Exer - PL-SQL
Parte 3 - Administração de Bancos de Dados
A administração do banco de dados é uma tarefa fundamental no âmbito da tecnologia da informação, que
envolve o gerenciamento e a manutenção de sistemas de armazenamento de dados. Este campo abrange uma
variedade de tarefas, desde o projeto e implementação de esquemas de banco de dados até a otimização de
consultas e a garantia da segurança e integridade dos dados. Os administradores de banco de dados são
responsáveis por garantir que os bancos de dados estejam operando de maneira eficiente, confiável e segura,
além de colaborarem com outros profissionais de TI para garantir que as necessidades de armazenamento e
acesso aos dados sejam atendidas de forma adequada.
A sequência de tópicos e exercícios apresentados a seguir aborda algumas das principais atividades do DBA,
o DataBase Administrator.
A esta altura de nossa experiência profissional, pouco precisamos comentar a respeito da importância de se
ter uma boa política de backup para nossas informações. Da mesma forma, pouco ajuda fazermos o backup
se não soubermos recuperar essas informações no caso de uma ‘tragédia’. Rotinas de recuperação devem ser
testadas com alguma periodicidade para evitar surpresas na hora em que os dados precisam ser recuperados.
Para facilitar a vida de administradores de bancos de dados, às vezes o próprio fabricante do software
disponibiliza algum programa para realizar as tarefas de backup e recovery. No caso do banco de dados
Oracle não é diferente. Existem ainda ferramentas desenvolvidas por terceiros para tais tarefas, mas elas
precisam ser configuradas de forma adequada para que não decepcionem quando forem necessárias.
Os utilitários de exportação e importação de dados geram arquivos em formato proprietário para transferência
de informações entre diferentes esquemas do mesmo banco de dados, diferentes bancos de dados, ou mesmo
para backup e recovery. É possível exportar, ou fazer uma cópia, de qualquer tabela do banco de dados.
Logicamente, toda sua definição estrutural é exportada juntamente com os dados para que a tabela possa ser
recriada novamente no destino.
Índices, apesar de ocuparem espaço físico no banco de dados, têm somente seu comando de criação
exportado, obrigando o utilitário a recriá-lo no banco de destino. O mesmo acontece com as constraints. Elas
não ocupam espaço no banco de dados. Apenas representam restrições obrigatórias a serem respeitadas.
Visões, da mesma forma, têm apenas exportado seu código SQL. Não ocupam espaço físico. Estes utilitários
também permitem exportar ou importar um banco de dados inteiro. Por isso são quase sempre usados como
complemento do backup físico ou, às vezes, dependendo do caso, como única forma de backup de um banco
de dados.
Para uma lista completa dos possíveis parâmetros a serem usados, deve-se executar na linha de comando
$ exp help = y
Alguns parâmetros mais usados:
Parâmetro Descrição
BUFFER Espaço em memória a ser usado
COMMIT Possibilita executar um commit cada vez que o buffer em memória encher
CONSISTENT Força a exportação respeitando as integridades relacionais
CONSTRAINTS Determina se as constraints do objeto devem ser exportadas/importadas
FEEDBACK Exibe o progresso da importação a cada N linhas importadas
FILE Nome do arquivo a ser criado/lido
FROMUSER Em arquivos com vários usuários, especifica quais usuários importar
FULL Determina que o banco de dados todo/arquivo todo seja exportado/importado
GRANTS Especificar se deve-se exportar/importar concessões de privilégios junto
IGNORE Possibilita importar dados mesmo se a tabela de destino já existir
INDEXES Permite destacar se os índices do objeto serão considerados ou não
INDEXFILE Cria um arquivo somente com as DDLs de criação das tabelas, índices e constraints
LOG Arquivo de registro do processo de exportação/importação
PARFILE Especifica um arquivo de parâmetros que deve ser usado
ROWS Dá a opção de se exportar/importar somente a estrutura do objeto, sem os dados
STATISTICS Determina se a exportação/importação deve ou não considerar estatísticas dos objetos
TABLES Lista de tabelas a serem exportadas/importadas
TOUSER Especifica para qual usuários importar
USERID Usuário a exportar/importar
A essa altura do desenvolvimento de nossos exercícios, cabe lembrar que para todos eles usaremos o usuário
do Linux oracle que também possui a senha padrão 123. É importante estar conectado sempre nesse usuário
para todos os exercícios por duas razões principais. A primeira é que os programas que estão instalados no
Linux são acessíveis (path) somente ao usuário oracle. E segundo porque a estrutura de pastas e arquivos de
nossos exercícios foi montada abaixo do diretório home do usuário oracle, que neste caso é
/usr/lib/oracle/xe
Podemos a qualquer momento nos deslocar para o diretório home de qualquer usuário executando na linha de
comando cd seguido de ENTER.
Quando for necessário carregar dados de sistemas legados ou mesmo programas cuja interface com o mundo
externo pode existir somente através de arquivos-texto, faz-se necessária a utilização de uma ferramenta
capaz de realizar este processo. O banco Oracle possui o aplicativo SQL Loader.
Ele trabalha com um arquivo de configuração chamado controlfile, que mapeia os dados de entrada para
algum formato na saída (tabela do banco de dados). Gera um arquivo de log com o registro da carga dos
dados, um arquivo com os registros que, por uma ou outra razão, não foram carregados ao banco de dados, e
um arquivo contendo todos os registros que também não foram carregados mas porque não atenderam ao
filtro WHEN quando este for usado. Estes últimos são chamados de registros descartados, ou discarded
records.
Uma lista completa dos parâmetros aceitos pelo aplicativo pode ser obtida digitando-se ‘ sqlldr -? ‘ na linha
de comando.
Alguns parâmetros do SQL Loader (obtidos em http://www.oracleutilities.com/OSUtil/sqlldr.html):
bad – A file that is created when at least one record from the input file is rejected. The rejected data
records are placed in this file. A record could be rejected for many reasons, including a non-unique key or a
required column being null.
control – The name of the control file. This file specifies the format of the data to be loaded.
data – The name of the file that contains the data to load.
discard – The name of the file that contains the discarded rows. Discarded rows are those that fail the
WHEN clause condition when selectively loading records.
Quando eliminamos uma tabela, o banco de dados não remove imediatamente a tabela, e sim, renomeia a
tabela e a coloca na lixeira junto com seus objetos associados (índices, por exemplo), para fins de
recuperação.
A característica de fazer consultas voltando no tempo permite consultar uma posição passada do BD sem ter
que executar alguma tarefa de recovery ou resgatar algum backup para isso. É útil para saber, por exemplo, a
posição de determinado campo antes de alguma exclusão ou alteração acidental acontecer. Acrescentamos,
para isso, uma cláusula à sentença SQL que nos permite especificar o momento no passado ao qual queremos
retornar, ou ao SCN do banco de dados ao qual queremos voltar.
Uma visão (view) é como uma tabela virtual, que consiste em linhas e colunas como uma tabela real, mas
seus dados são derivados de uma ou mais tabelas subjacentes por meio de uma consulta. As views podem ser
utilizadas para
Abstração de dados: elas podem ocultar a complexidade subjacente das consultas, permitindo que os
usuários finais vejam os dados de uma maneira mais simples e estruturada.
Segurança: views podem ser usadas para restringir o acesso a determinadas colunas ou linhas de uma tabela.
Isso permite que os administradores de banco de dados controlem quem pode visualizar ou modificar certos
conjuntos de dados.
Consistência de dados: podem ser usadas para garantir que os dados estejam sempre apresentados de
maneira consistente, mesmo que a estrutura subjacente das tabelas mude.
No entanto, é importante observar que as views não armazenam os dados fisicamente, elas apenas
armazenam a definição da consulta.
Exer – Views
Um shell script é um script escrito para o shell, ou seja, o interpretador de linha de comando do sistema
operacional. Com um shell script (termo usualmente associado ao Linux e ao Unix) ou programa de lote
(termo usualmente associado ao Windows), podemos automatizar tarefas rotineiras que precisam se repetir,
como por exemplo:
rotinas de backup
Database Links
Um database link é um objeto que permite acessar objetos de outros esquemas ou usuários dentro do mesmo
banco de dados, desde que existam permissões para isso, ou mesmo objetos em outros bancos de dados
remotos, desde que existam permissões e comunicação entre os servidores.
Sintaxe:
O connect string necessário na sintaxe faz referência às strings de conexão configuradas no arquivo
tnsnames.ora, que, em nosso Sistema Operacional Linux, fica localizado em
/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/network/admin/tnsnames.ora
XE =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = Ub11Exer)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = XE)
)
)
Imagine agora, por exemplo, que quiséssemos acessar um ambiente de produção a partir de nosso ambiente
de desenvolvimento. Poderíamos criar uma string de conexão chamada PRODUCAO para isso. Poderíamos
colocar o host name da máquina servidora ou mesmo seu IP Address. Por fim, o nome da instância do banco
da dados ao qual queremos conexão, porque, via de regra, pode-se ter mais de uma instância de banco de
dados executando no mesmo servidor de banco de dados.
PRODUCAO =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.152)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = XE)
)
)
Uma conexão via database link para esta string de conexão, conectaria a algum usuário do banco de dados
chamado “XE” da máquina 192.168.0.152, cujo listener recebe conexões pela porta 1521.
Portanto, se quiséssemos criar um database link chamado BDPRODUCAO para conectar num suposto
usuário CENTRAL com senha CNT00, pela string de conexão PRODUCAO, criada acima, na máquina
remota 170.66.11.10, que possui um banco Oracle instalado com nome XE, e o listener “ouvindo” na porta
1521, faríamos:
Replicação de Dados
Replicação é o processo de copiar e manter objetos de um banco de dados em múltiplos outros bancos de
dados que, juntos, compõe um sistema de banco de dados distribuído. Modificações no banco de dados
publicador são capturadas e mantidas localmente antes de serem propagadas para cada um dos bancos de
dados remotos. Os comandos para criação e atualização das réplicas (snapshots), gerenciamento e criação de
processos automáticos (jobs ) de replicação, gerenciamento de database links e configuração de arquivos que
permitem a ocorrência da replicação de dados, estão distribuídos nos exercícios que faremos a seguir.
Exer - Snapshots
Exer – Jobs de Replicação
Vários sistemas atuais enfrentam problemas de performance. Estes problemas podem ser de vários tipos e
causados por razões diversas, como por exemplo:
Portanto, uma metodologia de ajuste de performance não deve focar somente em um destes pontos, mas sim,
em todos. Uma aplicação, por exemplo, deve “nascer” objetivando uma boa performance além de atender às
necessidades de quem a solicitou. Ainda, se você for responsável por agir sobre um problema de performance
em um sistema, deve definir anteriormente os objetivos e agir primeiro sobre o que é mais crítico, que dá
mais retorno. Administradores de banco de dados, administradores de rede, analistas e programadores devem
trabalhar juntos como um time e não como adversários. Tipicamente, 20% das transações sobre bancos de
dados são responsáveis por 80% do uso do sistema, e estas transações é que devem ser o foco do trabalho.
O conhecimento do mecanismo usado pelo banco de dados no processamento das consultas SQL pode ajudá-
lo a criar consultas mais otimizadas. A figura abaixo mostra de forma básica a organização do banco de
dados na memória do servidor.
A System Global Area (SGA) é a área em memória usada pelo banco de dados. Uma de suas partes é a
Shared Pool, que contém o dicionário de dados e a chamada Library Cache. Dentro da Library Cache
encontram-se as Shared SQL Areas. Dentro da Shared SQL Area, cada sentença SQL é analisada e passa a
ser chamada de cursor. Um cursor guarda consigo as seguintes informações:
- a sentença analisada
- o plano de execução
- a lista de objetos referenciados
Se dois usuários executam a mesma sentença SQL, então estarão usando o mesmo cursor.
Índices
Um índice é um objeto do banco de dados lógica e fisicamente independente dos dados de uma tabela. A
criação de um índice pode reduzir significativamente o tempo de execução de uma consulta. Sempre que uma
restrição (constraint) de chave primária for criada, um índice é criado automaticamente. Os índices podem ser
únicos ou não-únicos. Índices únicos garantem que não exista na tabela indexada duas entradas com o mesmo
valor. Um índice pode ser criado sobre somente uma coluna ou sobre várias colunas de uma mesma tabela,
não sendo necessário que estas colunas, na tabela, sejam adjacentes.
Exer – Tuning de Consultas SQL