You are on page 1of 41

ISSN 1677918-5

9 771677 918004 00148


Assine agora e tenha acesso a
todo o contedo da DevMedia:
www.devmedia.com.br/mvp

148 Edio - 2017 - ISSN 1677918-5

EXPEDIENTE Fale com o Editor!

muito importante para a equipe saber o que voc est achando da


revista: que tipo de artigo voc gostaria de ler, que artigo voc mais
gostou e qual artigo voc menos gostou. Fique a vontade para entrar
Editor Atendimento ao leitor em contato com os editores e dar a sua sugesto!
Se voc estiver interessado em publicar um artigo na revista ou no site
Rodrigo Oliveira Spnola (rodrigo.devmedia@gmail.com) A DevMedia possui uma Central de Atendimento on-line, onde voc SQL Magazine, entre em contato com os editores, informando o ttulo e
pode tirar suas dvidas sobre servios, enviar crticas e sugestes e mini-resumo do tema que voc gostaria de publicar:
Subeditor
falar com um de nossos atendentes. Atravs da nossa central tambm
Eduardo Oliveira Spnola Rodrigo Oliveira Spnola - Editor da Revista
possvel alterar dados cadastrais, consultar o status de assinaturas rodrigo.devmedia@gmail.com
Consultora Tcnica e conferir a data de envio de suas revistas. Acesse www.devmedia
Anny Caroline (annycarolinegnr@gmail.com) .com.br/central, ou se preferir entre em contato conosco atravs do
telefone 21 3382-5038.
Jornalista Responsvel
RODRIGO OLIVEIRA SPNOLA
Kaline Dolabella - JP24185 Publicidade Editor Chefe da SQL Magazine, Mobile
publicidade@devmedia.com.br 21 3382-5038 e Engenharia de Software Magazine.
Capa e Diagramao
Professor da Faculdade Ruy Barbosa,
Romulo Araujo
Anncios Anunciando nas publicaes e nos sites do Grupo DevMedia, uma instituio parte do Grupo DeVry.
voc divulga sua marca ou produto para mais de 100 mil desenvolvedores
Doutor e Mestre em Engenharia de
de todo o Brasil, em mais de 200 cidades. Solicite nossos Media Kits, com
detalhes sobre preos e formatos de anncios. Software pela COPPE/UFRJ.

Sumrio
04 Questes de banco de dados do concurso do Tribunal de contas de So Paulo
[ Mauro Pichiliani ]

Contedo sobre Boas Prticas

14 Introduo ao Cassandra
[ Maycon Pinheiro Queiros ]

Contedo sobre Boas Prticas

22 Integrao de dados com Foreign Data Wrappers


[ Paulo Singaretti ]

Contedo sobre Boas Prticas

30 Backups com RMAN


[ Fbio Prado e Rafael Penna Leite ]
Questes de banco de dados do concurso do Tribunal de contas do municpio de So Paulo

Questes de banco de
dados do concurso do
Tribunal de contas do
municpio de So Paulo
Correo da prova para o cargo de Tecnologia da
Informao para o concurso realizado em agosto/ 15

E Fique por dentro


m maio de 2015 o Tribunal de Contas do Muni-
cpio de So Paulo (TCMSP) abriu um concurso
pblico para preencher as vagas de alguns cargos Este artigo til porque apresenta a correo e explicao das alter-
tcnicos. Dentre eles havia a posio de agente de fisca- nativas corretas das questes de banco de dados cobradas nas provas
lizao com especialidade em tecnologia da informao. objetivas e dissertativas do concurso que selecionou candidatos para
Esse concurso selecionou candidatos para trs vagas com o cargo de Agente de fiscalizao com especialidade em tecnologia
postos de trabalho em So Paulo, sendo que uma delas da informao. O contedo da prova apresenta diversas questes pr-
foi reservada para candidatos que indicaram na ficha de ticas, tericas e fundamentais para quem trabalha com infraestrutura,
inscrio pertencer a um dos seguintes grupos: negros, arquitetura, programao e banco de dados.
negras ou afrodescendentes.
O salrio inicial para as vagas disponveis para esse
cargo era de R$ 9.098,98, com uma jornada de 40 horas
semanais. Como pr-requisitos para o cargo os candi- e trinta minutos e todas as etapas do concurso ficaram a cargo
datos deveriam ter diploma de graduao na rea de da FGV Projetos, um departamento da Fundao Getlio Vargas.
informtica. O edital solicitou dois anos como tempo O edital diz tambm que o contedo da prova para o cargo de
mnimo na funo e experincia comprovada, indicando agente de fiscalizao com especialidade em tecnologia da in-
que o perfil para essa vaga para um profissional pleno formao envolve a manuteno de sistemas, entre outros itens.
que j conhece o mercado de trabalho. Apenas o produto SQL Server 2008/2012 citado no edital sem
De acordo com o edital, a prova foi dividida entre maiores detalhamentos de seu uso.
questes que cobraram conhecimentos gerais (lngua Neste artigo ser apresentada apenas a correo das questes
portuguesa, redao, matemtica e raciocnio lgico- objetivas e dissertativas de conhecimento especfico relacionadas
-quantitativo), especficos e especializados. O exame ao contedo de banco de dados. As questes sero apresentadas,
contou com 9 questes relacionadas a banco de dados corrigidas e comentadas junto com o gabarito oficial.
que deveriam ser respondidas por meio da escolha de
uma alternativa dentro cinco disponveis. Alm disso, Questes de conhecimento especfico da prova
uma questo dissertativa com dois itens foi cobrada. 78) O Tribunal de Contas do Municpio de So Paulo precisa
O tempo total de durao da prova foi de quatro horas revitalizar seu Datacenter para atender crescente demanda

4 SQL Magazine Edio 148


por espao de armazenamento de dados digitais. Para isso, os NAS (Network Attached Storage) geralmente utilizada em
seguintes requisitos foram definidos: situaes onde a quantidade de armazenamento no muito
1. Os dispositivos de armazenamento devem se comunicar entre grande e no h a necessidade imediata de expanso da capaci-
si e com os computadores por uma rede de alta velocidade (fibre dade de guardar dados. O uso de NAS geralmente toma a forma
channel); de apenas um hardware especial (o storage) conectado pela rede
2. Os dados devem ser acessados em blocos, em vez de arquivos, no servidor. Essa soluo no atende aos requisitos de escalabi-
para se obter melhor desempenho; e lidade como SAN.
3. A capacidade de armazenamento deve ser escalvel. A sigla DAS indica que o armazenamento ser feito conectando
diretamente o storage no servidor e no atende aos requisitos 1
Para atender esses requisitos, deve ser usada a tecnologia: e 2. CIFS envolve a manipulao de arquivos e no blocos, como
a) Storage Area Network (SAN); requerido pelo item 2. Por fim, SATA representa uma tecnologia
b) Network Attached Storage (NAS); utilizada para conectar HDs diretamente no hardware e no em
c) Direct Attached Storage (DAS); rede.
d) Common Internet File System (CIFS);
e) Serial Advanced Technology Attachment (SATA). 79) Em relao s polticas de proteo contra a perda ou destrui-
o de dados em um Datacenter, analise as afirmativas a seguir.
Gabarito: A. I Tecnologia de espelhamento de dados (mirroring) permite a
Comentrio: O enunciado dessa interessante questo apresenta recuperao na qual uma coleo de dados copiada para outro
aos candidatos requisitos necessrios para a implementao de site por meio de uma conexo no confivel.
uma tecnologia de armazenamento de dados. O candidato deve II Backups protegem os dados contra falhas de hardware, mau
notar que esse tipo de cenrio comum quando empresas esto funcionamento de software e erros de usurios. Os dados devem
procurando adotar novas tecnologias, pois primeiro indicam-se ser copiados quando esto em um estado consistente.
requisitos e depois preciso escolher a soluo para atend-los. III Replicao de dados a tcnica empregada quando duas ou
Os requisitos indicados nessa questo foram apresentados atra- mais cpias idnticas do dado so mantidas online em discos sepa-
vs de trs pontos. O primeiro deles cita redes de alta velocidade rados, tambm conhecida como RAID nvel 1 ou disk shadowing.
utilizando a tecnologia de fibra ptica. Portanto, o candidato deve
se lembrar que existe a necessidade para armazenamento de dados Est correto o que se afirma em:
remotos e com alta velocidade. a) somente I;
O segundo requisito diz que os dados devem ser acessados por b) somente II;
blocos e no por arquivos. Isto quer dizer que a tecnologia adotada c) somente III;
deve ser de baixo nvel, ou seja, implementada na camada rede d) somente I e II;
e no atravs de algum tipo de sistema de arquivos distribudos, e) I, II e III.
como o NFS (Network File System) do Linux.
O terceiro requisito cita a escalabilidade. Apesar de no have- Gabarito: B.
rem mais detalhes, razovel supor que a escalabilidade desse Comentrio: Essa questo cobra do candidato conhecimentos
ponto se refere a escalabilidade vertical no sentido de adicionar sobre conceitos relacionados a tcnicas para recuperao e pre-
mais discos fsicos ou hardware para storage com o objetivo de veno de perda de dados. Apesar de no citar nenhum banco de
aumentar a capacidade de armazenamento. Em geral, as solues dados especfico no enunciado, pode-se admitir que os termos
para esse tipo de escalabilidade envolvem tecnologias para acesso apresentados esto inseridos no contexto de administrao de
aos dados a nvel de rede. banco de dados. Alm disso, considerando o uso do banco de
A partir dos requisitos podemos comear a analisar as opes dados SQL Server nas demais questes dessa prova e o fato que
citadas nas alternativas e escolher aquela que melhor se encaixa esse produto ter sido citado na descrio das habilidades neces-
na necessidade do Tribunal de Contas do Municpio de So Paulo. srias para a vaga, o candidato deve relacionar os termos citados
A sigla SAN (Storage Area Network) representa o conjunto de tec- no enunciado com as tecnologias fornecidas por esse produto.
nologias onde o armazenamento feito atravs da rede. comum A afirmao I contm uma definio da tecnologia de espelha-
montar solues SAN que empregam equipamentos (hardware) mento (mirroring). Nessa definio indica-se que a recuperao
como storage, roteadores especficos de alta velocidade e cabos de feita por meio do acesso a uma cpia dos dados feitas para outro
fibra ptica que permitem a conexo dos servidores com os stora- local (site) a partir de uma conexo no confivel. Essa afirmao I
ges para criar uma rede de armazenamento. Essa rede permite est incorreta, pois ela se encaixa no conceito de replicao do SQL
expandir a capacidade de guardar dados simplesmente adicionando Server, uma vez que mirroring somente pode ser feito localmente
novos equipamentos e conectando-os corretamente. Portanto, de- e no atravs de sites remotos.
vido a essas caractersticas do SAN e aos requisitos apresentados A afirmao II est correta e descreve de forma certa como
o candidato deve marcar a alternativa A como correta. backups podem realizar a recuperao de dados.

Edio 148 SQL Magazine 5


Questes de banco de dados do concurso do Tribunal de contas do municpio de So Paulo

Tambm est certa a preocupao com a consistncia da cpia. melhor encaixa nesse requisito failover tolerance, que representa
Poderamos acrescentar a essa definio a necessidade de uma uma traduo do termo tolerncia a falhas (apesar de ser comum
estratgia de backup adequada para o ambiente e etapas de teste utilizar o termo fault tolerance ou somente failover). Alm disso,
de backup (restaurao em ambientes alternativos) para garantir a descrio do primeiro item genrica e podemos indicar o
que o backup realmente pode ser utilizado quando for necessrio. balanceamento de carga como maneira de distribuir a demanda
A afirmao III est incorreta, pois replicao no envolve discos em componentes, seja qual for a forma ou tipo de componente da
e nem RAID e disk shadowing. A replicao est relacionada com infraestrutura. Sendo assim, o candidato pode marcar a alternativa
a cpia de dados em diferentes locais (sites) tipicamente remotos, E como correta.
como apresentado na afirmao I. O termo replication permite distribuio de dados, porm no da
Como somente a afirmao II est correta, o candidato deve maneira mais rpida possvel. J os termos mirroring, switch-over,
indicar a alternativa B para a questo 79. Novamente, apesar de swapping e striping no tem como objetivo principal fazerem com
no citar explicitamente o produto SQL Server como servidor que os componentes continuem a executar suas funes quando
gerenciador de banco de dados, pelo contexto pode-se associar um ou mais deles falharem.
os termos utilizados (replicao, backup, mirroring) com as tec-
nologias proporcionadas por esse produto. 89) Numa instalao SQL Server 2012, o comando Transact-SQL
shutdown, quando usado sem a opo with no wait, faz com que o
81) Preocupado com a continuidade da execuo das atividades sistema desabilite os logins correntes, exceto para membros de sy-
que so apoiadas por servios de Tecnologia da Informao (TI), sadmin e serveradmin, e aguarde o trmino dos comandos TSQL
o Gerente de um Datacenter quer otimizar os recursos da sua ou stored procedures que estejam sendo executados. Nessa situa-
infraestrutura de TI para que ela seja capaz de: o, uma procedure til para descobrir os processos em curso :
1 Ajustar seus componentes para que a demanda computacio- a) sp_depends;
nal seja distribuda o mais rpido possvel pelos seus recursos b) sp_actualusers;
fsicos; e c) sp_who;
2 Continuar executando suas funes quando um ou mais d) sp_active;
componentes falham. e) sp_current.

Para isso, a infraestrutura de TI deve ser capacitada, respecti- Gabarito: C.


vamente, com: Comentrio: Essa questo cobra do candidato o conhecimento
a) replication e mirroring; acerca da stored procedure utilizada para observar os processos
b) scalability e switch-over; internos do SQL Server. Esses processos podem ser associados
c) high availability e swapping; a conexes de usurios com o banco de dados ou a processos
d) redundancy e striping; internos criados pelo prprio SQL Server.
e) load balancing e failover tolerance. O enunciado apresenta corretamente o significado do comando
shutdown, porm na descrio desse comando existe um pequeno
Gabarito: E. detalhe semntico que pode ter confundido alguns candidatos: a
Comentrio: Essa outra questo do concurso onde o enunciado opo with no wait no desabilita os logins correntes (com exceo
no cita nenhuma tecnologia ou produto de banco de dados espe- daqueles que pertencem aos fixed server roles sysadmin e server
cfico. Nesse caso interessante analisar as alternativas e notar admin). Na verdade, a opo with no wait evita que os logins pos-
que os que apresentado como soluo para capacitar a TI envolve sam abrir novas conexes no SQL Server enquanto o servidor de
conceitos gerais e no algo especifico de um software ou produto. banco de dados est nesse estado de shutdown.
O candidato que deseja acertar essa questo deve prestar muita Em relao s alternativas, sp_depends utilizada para obter
ateno nos requisitos indicados nos dois primeiros itens listados as dependncias de um objeto, tal como uma view que depende
no enunciado: a necessidade de distribuio rpida entre recur- de uma tabela. J as stored procedures sp_actualusers, sp_active
sos fsicos e a tolerncia a falhas de componentes. importante e sp_current no existem. Portanto, o candidato deve indicar
notar que em nenhum momento do enunciado so citados dados a stored procedure so_who (alternativa C), pois essa a stored
e que o termo componente empregado de forma genrica sob o procedure que mostra detalhes dos processos do SQL Server,
ponto de vista de infraestrutura. Uma vez entendido a necessida- incluindo informaes sobre o SPID (o identificador do processo)
de apresentada pelos dois itens do enunciado o candidato deve e o login e banco de dados sendo utilizado por cada processo.
analisar as alternativas e escolher aquela que contm os termos
mais adequados. 96) Considere as tabelas relacionais, e respectivas instncias,
Para responder rapidamente questo o candidato deve se mostradas na Figura 1.
concentrar no segundo item, que basicamente cita a tecnologia de O comando SQL apresentado na Listagem 1 produz um resul-
tolerncia a falhas. Dentre as alternativas apresentadas, a que se tado com apenas uma coluna, cujo(s) valor(es) /so:

6 SQL Magazine Edio 148


Em seguida, analisar o resultado da linha para os valores de X3
e X2. Aps estudar cuidadosamente o resultado dessa consulta
mais interna pode-se notar que ela vai gerar os dados apresen-
tados na Tabela 1. importante perceber que como o caractere
asterisco (*) foi utilizado todas as colunas apenas da tabela X2
vo ser retornadas pela instruo, pois essa a nica tabela que
est na clusula FROM.

C D
1 1

1 3
Figura 1. Tabelas X1, X2 e X3 do enunciado da questo 96
1 5

2 1
Listagem 1. Comando SQL.
2 3
select A from X1 where
not exists 3 1
(select * from X3 where
not exists 3 1
(select * from X2 where
X1.A=X2.C and X3.B=X2.D)) Tabela 1. Resultado da instruo SELECT mais interna da questo 96

a) 1 possvel notar que nos resultados da Tabela 1 no foram inclu-


b) 1,2,3 dos os valores 4 e 5 para a coluna C, pois eles existem na coluna A
c) 4,5 de X1, mas no existem na coluna C de X2. Alm disso, nota-se que,
d) 1,2,3,4,5 de acordo com as duas expresses da clusula WHERE, o resultado
e) NULL dessa subconsulta interna igual ao contedo original de X2.
A subconsulta do meio da instruo : select * from X3 where not
Gabarito: A. exists(...) e ela basicamente vai analisar para quais valores nicos
Comentrio: Essa questo se concentra na anlise do resultado da coluna C no existem os valores 1, 3 e 5 (o contedo total de
de uma instruo SELECT composta de outras duas instrues. X3). Observando os dados da Tabela 2 possvel notar que ape-
O uso de desse tipo de SELECT dentro de SELECT chamado nas quando a coluna C for igual a 1 termos a sequncia 1, 3 e 5.
subconsulta e necessrio a utilizao de funes especiais como Portanto, o resultado a subconsulta do meio uma nova tabela
EXISTS() em clusulas WHERE para aninh-las, ou seja, colocar em memria com os valores 2, 2, 3 e 3.
um SELECT dentro do outro. Nesse ponto possvel indicar que o resultado em memria de
Para o candidato responder corretamente essa questo ele tem X1 contm apenas as linhas onde o valor da coluna A 1, 2 e 3
que observar os dados e o comando SQL com o objetivo de iden- devido ao filtro da subconsulta mais interna. Para obter o valor
tificar qual ser o resultado final. Tambm importante lembrar final preciso considerar quais linhas em memria de X1 no
que a funo EXISTS() recebe como parmetro um conjunto de esto no resultado gerado at agora. Como 1 o nico valor da
dados e retorna verdadeiro ou falso para cada linha da tabela coluna A que no est na sequncia 2, 2, 3 e 3 ele o retorno final
contida na clusula FROM na instruo que contm o EXISTS(). da instruo com as subconsultas. Portanto, o candidato deve
Para simplificar recomenda-se analisar o comando SQL por indicar a alternativa A para essa questo.
partes, comeando do mais interno e seguir filtrando as linhas.
Dessa forma, a instruo SELECT mais interna : 97) Considere a tabela relacional criada pelo comando:

select * from X2 where create table xx


X1.A=X2.C and X3.B=X2.D (a int null, b int null, c int null)

O resultado dessa instruo vai comparar os dados da tabela X2 Depois de instanciada com um conjunto de registros, os coman-
com os dados da tabela X1 por meio das colunas A e C. De forma dos apresentados na Listagem 2 foram executados.
semelhante, tambm ser feita uma comparao com os dados da Sabendo-se que esses comandos produziram como resultado,
tabela X3 e X2, porm entre as colunas B e D. O candidato deve respectivamente, os nmeros 10, 10, 0, 0 e 5, analise as quatro
analisar linha a linha comeando da tabela X1 e X2. alternativas para a definio da tabela XX:

Edio 148 SQL Magazine 7


Questes de banco de dados do concurso do Tribunal de contas do municpio de So Paulo

I. linhas. Em seguida, cinco instrues SELECT que fazem uso da


CREATE TABLE XX( funo de agregao COUNT() foram apresentadas junto com
A int NULL, cinco nmeros (10, 10, 0, 0 e 5) que correspondem ao resultado da
B int NULL, execuo de cinco instrues SELECT. O candidato ento deve
C int NULL ) analisar quatro itens que contm outras definies para a tabela
II. xx. Por fim, necessrio escolher a alternativa que contm quais
CREATE TABLE XX( dos quatro itens apresentados so vlidos e compatveis com a
A int primary key, instncia corrente da tabela.
B int NULL, Em primeiro lugar importante que o candidato saiba traduzir
C int NULL ) o trecho do enunciado ...itens apresentados so vlidos e compa-
III. tveis com a instncia corrente da tabela. Esse pedao de frase
CREATE TABLE XX( quer dizer que preciso escolher os comandos CREATE TABLE
A int NULL, indicados nos itens I a IV que podem armazenar os mesmos dados
B int NULL, j armazenados na tabela xx criada de acordo com o comando
C int ) CREATE TABLE indicado logo no comeo da questo.
IV. Em seguida, o candidato deve analisar as instrues SELECT
CREATE TABLE XX( da listagem junto com os nmeros que so retornados por elas.
A int, A partir dessas anlises ser necessrio deduzir as caractersticas
B int primary key, dos dados inseridos e verificar quais dos itens de I a IV podem
C int NULL ) armazenar os mesmos dados.
Analisando o conjunto de comandos CREATE TABLE pode-se
Listagem 2. Cinco comandos SELECT do enunciado da questo 97. notar que o item I exatamente igual ao comando CREATE TABLE
do incio do enunciado, ou sejam as colunas a, b e c so do tipo
select count(*) from XX
select count(distinct A) from XX
de dados INT e permitem valores NULL. Portanto, o item I deve
select count(distinct B) from XX obrigatoriamente estar na resposta. Essa concluso j elimina as
select count(*) from XX where C>10 alternativas C e E, pois elas no contm o item I.
select count(*) from XX where not C>10
Analisando o item II podemos notar que a coluna A foi indi-
cada como chave primria. Por definio, chaves primrias no
A lista com todos os comandos que so vlidos e compatveis podem incluir valores NULL. Para verificar se essa definio
com a instncia corrente da tabela : da tabela compatvel com os dados precisamos analisar o
a) I, II; primeiro e o segundo SELECT, pois ele o nico que faz uso
b) I, II, III; direto da coluna A. Nessa instruo utilizou-se a palavra-chave
c) II, IV; DISTINCT para que a funo de agregao COUNT() faa a
d) I, III; contagem somente dos valores nicos da coluna A. O resultado
e) IV foi 10 linhas, ou seja, existem dez valores nicos para a coluna
A e nenhum deles NULL. Se considerarmos que a primeira
Gabarito: B. A alternativa A foi indicada no gabarito preliminar, instruo SELECT tambm retornou 10 linhas, podemos con-
porm houve uma correo e a alternativa B foi escolhida para o cluir pela caracterstica da segunda instruo SELECT e do
gabarito oficial. seu resultado de execuo que uma coluna A do tipo INT e
Comentrio: Essa peculiar questo do concurso cobra do can- chave primria poderia ser empregada para armazenar esses
didato conhecimentos sobre a possiblidade de permitir valores dez valores nicos. Portanto, o item II est correto e podemos
NULL em tabelas, como funciona a funo de agregao COUNT() eliminar a alternativa D da questo, uma vez que ela indica
com e sem a clusula DISTINCT e os requisitos para a criao de que somente os itens I e III esto corretos.
chaves primrias (primary keys). Resta agora analisar o item III e identificar se a alternativa
O enunciado comea apresentado a criao de uma tabela xx correta A ou B. O item III no fornece nenhuma indicao de
com trs colunas: a, b e c. Essas colunas so do tipo numrico INT nulabilidade para a coluna c, ou seja, no foram utilizadas as
e com uma caracterstica importante: todas elas aceitam valores expresses NULL ou NOT NULL para essa coluna. Por padro,
NULL. Em banco de dados relacionais o valor NULL utilizado se NULL ou NOT NULL no forem indicadas para a coluna o
para representar a ausncia de dados, ou seja, essa a forma em- SQL Server vai permitir valores NULL. Contudo, de acordo com
pregada para indicar que nenhum valor est sendo armazenado a documentao oficial do SQL Server, quando se utiliza CRE-
para a coluna. ATE TABLE ou ALTER TABLE para criar ou alterar uma tabela,
Depois da definio da tabela XX o enunciado diz que algumas as configuraes de banco de dados e de sesso influenciam e,
linhas foram inseridas na tabela sem definir a quantidade de possivelmente, substituem a nulidade do tipo de dados que

8 SQL Magazine Edio 148


usado em uma definio de coluna. Sendo assim, o fabricante Est correto concluir que uma determinada coluna NO pode
recomenda a definio explcita de uma coluna com NULL ou ser objeto de atualizao quando resultar de qualquer dos tipos:
NOT NULL durante a criao de colunas em tabelas. a) apresentados, exceto I, II e III;
Para definir se o item III apresenta ou no uma definio de b) apresentados, exceto III e IV;
criao de tabela que acomode os dados inseridos na tabela xx c) apresentados, exceto V;
original precisamos analisar os resultados das instrues 4 e 5 d) apresentados, exceto VI;
da Listagem 2, pois elas so as nicas que se referem coluna C e) apresentados.
diretamente. Essas duas instrues devem retornar 0 e 5 linhas,
respectivamente. Gabarito: E.
Supondo que a coluna C permita valores NULL, temos que o Comentrio: O candidato que desejar responder corretamente
conjunto de valores 10,10,10,10,10,NULL,NULL,NULL,NULL,NU essa questo deve se lembrar como o funcionamento de views
LL para a coluna C faz com que a quarta instruo SELECT retorne junto com os comandos SQL que manipulam dados (INSERT,
0 linhas e quinta instruo retorne cinco linhas. Com esse exemplo UPDATE e DELETE).
de conjunto de valores podemos afirmar que se a coluna permitir Uma view um objeto do banco de dados que encapsula uma
valores NULL a afirmao III est correta e a alternativa B deve instruo SELECT, ou seja, ela permite que o resultado do coman-
ser escolhida pelo candidato. do SELECT contido na definio da view seja utilizado como se
Vamos supor que a coluna C no permita valores NULL. Nes- fosse uma tabela do banco de dados. Dessa forma, pode-se colocar
se caso preciso encontrar um conjunto de valores que gere o o nome da view dentro de uma clusula FROM de outra instruo
valor 0 para a quarta consulta e 5 para a quinta consulta. Como SQL para se trabalhar com os dados retornados pela view.
no podemos indicar valores nulos, precisamos indicar valores Existem algumas restries que indicam o que pode ou no ser
numricos entre os dois intervalores mutuamente exclusivos colocado dentro de uma view. Contudo, os itens I, II, III, IV, V e
definidos pelas expresses C>10 e C<=10. O segundo intervalo VI podem ser inseridos dentro de uma view sem problemas, uma
(C<=10) deve conter exatamente 5 valores e o primeiro intervalo vez que eles permitem manipulaes avanadas de dados para
(C>10) deve conter exatamente 0 valores. Como as expresses de gerar relatrios, por exemplo.
definio dos intervalos so mutuamente exclusivos no existem Views geralmente so empregadas somente para leitura de da-
sequncias de valores que satisfaam as quantidades especifi- dos, o que quer dizer que raramente alteramos dados diretamente
cadas. De fato, essas limitaes das quantidades foram a lista atravs desse objeto. De fato, comum trabalharmos utilizando
de valores a conter ao menos um valor NULL, contradizendo a o comando SELECT em views, mas para alterar os dados faze-
nossa suposio inicial. mos uso dos comandos INSERT, UPDATE e DELETE nas tabelas
Portanto, a coluna c deve obrigatoriamente permitir valores acessadas pela view.
NULL e o candidato deve escolher a alternativa B. Contudo, como Contudo, existe como inserir, alterar e excluir dados atravs de
nenhum valor para a nulabilidade para a coluna c foi indicada no views. A forma mais recomendvel utilizar um trigger do tipo
item III existe margem para sugerir a anulao da questo, uma INSTEAD OF na view e, dentro desse trigger, fazer o tratamento de
vez que se considerarmos o ambiente do SQL Server as caracte- dados manualmente gerando os INSERTS, UPDATES e DELETES
rsticas da coluna vo depender de configuraes especficas no necessrios. Tambm possvel aplicar comandos de modificaes
mencionadas no enunciado. Por outro lado, em nenhum momento de dados naturalmente nas views, porm nesse caso preciso ficar
o SQL Server foi citato na questo e o padro SQL no define os atendo a algumas restries.
valores padro de nulabilidade quando no se especifica nada Uma view atualizvel diretamente por comandos INSERT,
nessa caracterstica das colunas de tabelas. UPDATE e DELETE deve acessar dados de somente uma
tabela, sem realizar agregaes e conter apenas colunas que
98) Views criadas nos bancos podem, de acordo com alguns cri- correspondam diretamente s colunas da tabela base. Ou seja,
trios, ser naturalmente atualizveis, o que significa, por exemplo, nenhuma das construes SQL indicadas nos itens I, II, III, IV, V
que podem ser objeto de comandos update do SQL sem a neces- e VI podem ser colocadas em views se desejarmos atualiz-las
sidade de mecanismos auxiliares ou triggers. Essa caracterstica naturalmente.
depende da expresso SQL que define a view e das tabelas/views Portanto, como nenhuma das opes pode ser empregada para
de origem. Considere alguns tipos de construes SQL que podem views que so atualizadas naturalmente podemos dizer que
ser empregadas na definio de uma coluna de uma view: correto concluir que uma determinada coluna da view NO
I. funes de agregao, tais como sum, avg; pode ser objeto de atualizao quando resultar de qualquer dos
II. funes escalares, tais como sin, trim; tipos apresentados. Isto quer dizer que o candidato deve indicar
III. expresses aritmticas; a alternativa E para essa questo.
IV. expresses condicionais, tais como case;
V. literais; 99) Analise os trs comandos a seguir e as afirmativas a respeito
VI. subconsultas; de seus efeitos no mbito do MS SQL Server:

Edio 148 SQL Magazine 9


Questes de banco de dados do concurso do Tribunal de contas do municpio de So Paulo

delete from x associado com a necessidade de remover as linhas da tabela e


truncate table x coloc-las no log de transao (transaction log) do SQL Server,
drop table x pois cada comando do SQL Server que modifica, insere ou altera
dados gera uma transao implcita que acaba utilizando o log
I. O comando delete e o comando truncate removem o mesmo de transaes.
conjunto de registros da tabela X. Uma vez que apenas a afirmao I est correta, o candidato deve
II. O comando drop, quando usado com a opo with no remo- indicar a alternativa A para a questo 99.
val, produz exatamente o mesmo efeito do comando truncate.
III. Devido s suas caractersticas operacionais, o comando delete 100) Bancos de dados snapshot constituem um recurso que
usualmente executado muito mais rapidamente que o comando pode ser til para estratgias de recuperao de dados nas insta-
truncate. laes MS SQL Server. Um banco de dados do tipo snapshot est
associado a um banco de dados de origem (source). Sobre esse
Est correto o que se afirma em: mecanismo, analise as afirmativas a seguir.
a) somente I; I. No momento da sua criao, bancos snapshot armazenam uma
b) somente III; cpia de todas as pginas do banco de origem.
c) somente I e II; II. Snapshots ocupam sempre o mesmo espao que ocupado
d) somente II e III; pelo banco de origem, pois cada pgina do banco de origem tem
e) I, II e III. sempre uma e apenas uma cpia.
III. Uma pgina do banco de origem, no seu estado original,
Gabarito: A. copiada para o snapshot somente quando ela alterada pela
Comentrio: Essa questo cobra do candidato conhecimentos primeira vez no banco de origem.
sobre os comandos que removem dados da tabela (delete e trun- IV. As operaes de leitura direcionadas para o snapshot jamais
cate) e tambm do comando que remove a tabela (drop). Em geral, requerem o uso de dados do banco de origem.
esses comandos so utilizados com muita cautela, pois uma vez V. Bancos snapshot permitem consultas que refletem os dados
que as linhas de uma tabela sejam removidas por qualquer um no estado em que se encontravam no momento da criao do
desses comandos preciso contar com algum backup dos dados snapshot.
ou aplicar tcnicas manuais para fazer com que os dados sejam
colocados novamente na tabela. Est correto somente o que se afirma em:
O enunciado cita trs comandos, sendo que o primeiro deles a) I, II e III;
um delete sem a clusula WHERE. Esse delete vai apagar todas b) I, II e IV;
as linhas da tabela utilizando o log de transaes e, por isso, pode c) III, IV e V;
requerer mais memria e consumir mais tempo de processamento d) III e V;
do que o comando truncate. e) IV e V.
A propsito, o comando truncate remove todas as linhas da
tabela, porm seu uso restrito a permisses especiais e no h Gabarito: D.
como filtrar as linhas da tabela a serem removidas, ou seja, tudo Comentrio: Essa questo cobra do candidato conhecimentos
que est armazenado na tabela completamente removido. sobre Database Snapshots do MS SQL Server. Esse importante
J o comando delete apaga todas as linhas e tambm remove a recurso utilizado para garantir uma cpia do banco de dados
tabela, desde que ela no esteja envolvida em relacionamentos que e ele traduzido como Instantnea na documentao oficial em
impeam sua remoo. Portanto, os trs comandos apresentados portugus do produto, apesar da maioria dos DBAs SQL Server
removem todas as linhas que existirem na tabela x. e da comunidade de usurios preferir o termo original.
A afirmao I est correta, pois da maneira que foi indicado o Um snapshot de um banco uma exibio esttica somente para
comando delete (sem nenhuma clusula WHERE) todas as linhas leitura de um banco de dados de origem do SQL Server. Essa cpia
vo ser removidas. Esse mesmo resultado obtido utilizando-se esttica transacionalmente consistente com a origem a partir do
o comando truncate. momento da criao do snapshot, ou seja, o que existir no banco de
A afirmao II est incorreta, pois a linguagem TSQL suportada origem tambm vai existir no snapshot. Alm disso, um snapshot
pelo SQL Server no contm a clusula with no removal. Alm reside na mesma instncia de servidor que o banco de dados de
disso, o comando drop no possui o mesmo efeito do comando origem e sempre que a origem for atualizada o snapshot tambm
truncate, pois um drop remove os dados e a tabela (o objeto) en- atualizado.
quanto o truncate remove apenas os dados. A partir do conhecimento da funcionalidade de snapshots no SQL
A afirmao III est incorreta, pois devido ao uso do log de Server o candidato deve analisar as cinco afirmaes apresentadas
transaes o comando delete mais lento do que o comando e indicar quais delas esto corretas atravs da escolha de uma das
truncate. Esse desempenho pior que o comando truncate est alternativas da questo.

10 SQL Magazine Edio 148


A afirmao I est incorreta, pois as pginas de dados de um Empregue apenas restries dos seguintes tipos: primary key,
snapshot contm ponteiros para as pginas de dados do banco de unique, check. Identifique a soluo que requeira o menor n-
origem, ou seja, no so feitas cpias de todas as pginas de dados mero de restries.
do banco de origem.
A afirmao II est incorreta, uma vez que as pginas de um Resposta: Essa questo discursiva foi dividia em dois itens.
snapshot vo conter apenas ponteiros para as pginas de dados No primeiro deles cobra-se do candidato conhecimentos sobre o
originas. Esses ponteiros ocupam muito menos espao que os correto funcionamento de joins, em particular o FULL OUTER
dados em si. JOIN, o LEFT JOIN e o RIGHT JOIN. No segundo item preciso
A afirmao III est correta e essa cpia realizada aps a alte- saber implementar constraints primary key, unique e check para
rao do banco de dados de origem recebe o nome de copy-on- restringir os dados de duas tabelas de modo que eles sempre re-
-write. Durante a criao do snapshot existem somente ponteiros tornem valores equivalentes para as duas consultas no enunciado.
direcionando para as pginas no banco de dados de origem. Assim como algumas questes da prova objetiva, o enunciado
Quando essas pginas so alteradas pela primeira vez elas so no cita explicitamente o SQL Server. Contudo, razovel em-
transferidas para o snapshot. pregar a sintaxe e caractersticas desse produto na resposta, uma
A afirmao IV est errada, pois as operaes de leituras feitas vez que a sintaxe das instrues SQL e os tipos de constraints
no snapshot podem acessar o banco de dados de origem, uma vez que podem ser utilizadas no segundo item so compatveis com
que existem ponteiros ligando as pginas de dados do snapshot esse produto.
com as pginas de dados do banco de dados original. Antes de formular a resposta para os dois itens o candidato deve
A afirmao V est correta, pois o ato de criar um snapshot pode notar que existem apenas duas instrues SELECT indicadas na
ser comparado a bater uma foto de um banco de dados. No final Listagem 3, apesar do comando SELECT aparecer trs vezes no
dessa operao podemos consultar os dados e observar como eles texto. O motivo que a segunda instruo contm a clusula
estavam no exato momento que batermos a foto, ou seja, no UNION e, por isso, considera-se que ela apenas uma instruo.
momento em que fizemos o snapshot. Na primeira instruo SELECT da Listagem 3 utiliza-se o ope-
Como somente as afirmaes III e V esto corretas o candidato rador FULL OUTER JOIN para relacionar as tabelas R e S atravs
deve marcar a alternativa D para responder essa questo. Vale a da coluna a pertencente a ambas. Esse operador retorna todas
pena lembrar que a tcnica de snapshots foi introduzida no SQL as linhas de todas as tabelas envolvidas mesmo que as linhas de
Server 2005 e que ela deve ser utilizada em conjunto com outras qualquer uma das tabelas no satisfaa a condio de igualdade.
funcionalidades do banco de dados para atender aos requisitos de J o operador LEFT JOIN retorna todas as linhas da tabela
disponibilidade, distribuio, escalabilidade e tolerncia a falhas esquerda da clusula JOIN que satisfaam ou no a expresso de
no que diz respeito ao banco de dados. igualdade. De forma semelhante, o operador RIGHT JOIN retorna
todas as linhas da tabela direita da clusula JOIN que satisfaam
Questo discursiva da prova ou no a expresso de igualdade.
2) Considere duas tabelas relacionais R e S, ambas com um atri- Para simplificar o entendimento, vamos considerar duas tabelas:
buto a, no necessariamente identificador, podendo haver outros table 1 e table 2. A Figura 2 mostra o diagrama de Venn indican-
atributos nessas tabelas. Considere tambm as duas consultas do com a cor verde quais linhas so retornadas por um FULL
apresentadas na Listagem 3. OUTER JOIN nessas tabelas e as Figuras 3 e 4 mostram as linhas
retornadas pelo LEFT JOIN e RIGHT JOIN da mesma maneira.
Listagem 3. Consultas da questo 2 da prova discursiva.

select *
from r full outer join s on r.a = s.a

select *
from r left join s on r.a = s.a
union
select *
from r right join s on r.a = s.a
Figura 2. Diagrama mostrando em verde as linhas retornadas pelo operador FULL OUTER JOIN

Pede-se:
a) apresente uma instncia para a tabela R e outra, para a tabela
S que, combinadas, demonstrem que as duas consultas podem
produzir resultados diferentes;
b) estabelea e descreva as restries necessrias sobre as ta-
belas R e S sob as quais as duas consultas so sempre equiva-
lentes para quaisquer instncias vlidas para essas restries. Figura 3. Diagrama mostrando em verde as linhas retornadas pelo operador LEFT JOIN

Edio 148 SQL Magazine 11


Questes de banco de dados do concurso do Tribunal de contas do municpio de So Paulo

a a
1 NULL
NULL NULL
NULL NULL

Tabela 2. Resultado da instruo SELECT com o FULL OUTER JOIN


Figura 4. Diagrama mostrando em verde as linhas retornadas pelo operador RIGHT JOIN a a
NULL NULL
Tambm importante lembrar que o operador UNION coleta
1 NULL
os dados das duas instrues SELECT da segunda listagem e
apresenta os resultados como se fossem apenas um conjunto de Tabela 3. Resultado da instruo SELECT com o LEFT JOIN, RIGHT JOIN e UNION
dados. Alm disso, o UNION elimina valores duplicados caso
algum deles ocorra. Por outro lado, se o sentido de diferente no for um conjunto
A partir da definio do tipo de resultado que os operadores de linhas iguais aps a retirada de valores duplicados e a orde-
FULL OUTER JOIN, LEFT JOIN, RIGHT JOIN e UNION pode-se nao no h como apresentar um conjunto de linhas onde as
notar que as combinaes de linhas das tabelas geradas pela pri- duas consultas da Listagem 3 produzam resultados diferentes.
meira instruo da Listagem 3 ser igual ao resultado da segunda O segundo item da questo pede ao candidato que estabelea e
instruo, uma vez que se utiliza o UNION para combinar os descreva constraints nas tabelas R e S para garantir que o resulta-
resultados do LEFT e do RIGHT JOIN. do das duas consultas da Listagem 3 sejam sempre equivalentes.
Entretanto, o primeiro item dessa questo pede justamente preciso utilizar apenas constraints do tipo chave primria
instncias da tabela R e S que demonstrem como as consultas (primary key, unique e check) e deve-se indicar a soluo que
podem produzir resultados diferentes. Aqui o candidato pode se requeira o menor nmero delas.
confundir, pois dada as definies dos operadores e a duas ins- Novamente, o termo equivalente utilizado no segundo item
trues da Listagem 3 no possvel obter resultados diferentes. da questo confuso e requer clarificao. Como j foi descrito na
De fato, esse termo diferente do enunciado do primeiro item resposta do primeiro item, por definio do operador FULL OU-
no claro o suficiente e pode gerar muitas dvidas. TER JOIN e o uso do LEFT JOIN e do RIGHT JOIN com o UNION
Por exemplo, se consideramos que o diferente sugerido pelo apresentados na Listagem 3 retornam resultados equivalentes
criador da questo inclui linhas duplicadas e fora de ordem se no forem consideradas a duplicao de dados e a ordem.
possvel montar o cenrio onde a definio das tabelas R e S Se consideramos apenas a ordem de dados, no h como utilizar
apresentada na Listagem 4. Essa listagem tambm insere duas constraints primary key, unique e check para controlar como o
linhas na tabela R (uma com o valor NULL e outra com o valor 1) resultado ser exibido, pois para isso precisamos utilizar a clu-
e uma linha na tabela S (apenas com o valor NULL). sula ORDER BY da instruo SELECT. Mesmo empregando essa
clusula existem configuraes de ambiente do SQL Server que
Listagem 4. Exemplo de tabelas R e S com dados de exemplo. podem influenciar como valores NULL so comparados, o que
afeta a ordenao de dados.
CREATE TABLE R (a INT NULL)
GO
Olhando apenas para a duplicidade de linhas, o mais adequado
seria utilizar a palavra-chave DISTINCT logo aps a primeira
INSERT R VALUES(1) instruo SELECT da Listagem 3. A segunda instruo j retira
INSERT R VALUES(NULL)
GO
os valores duplicados, uma vez que o uso do operador UNION
exerce essa funo.
CREATE TABLE S (a INT NULL) importante relembrar as principais diferenas entre as cons-
GO
traints citadas no enunciado do segundo item. A chave primria
INSERT S VALUES(NULL) probe valores NULL e evita valores duplicados na coluna. J a
GO constraint unique permite apenas um valor NULL e tambm
evita valores duplicados. A constraint tipo check permite espe-
A partir das definies e dados das tabelas R e S os resultados cificar uma expresso que vai controlar os valores possveis para
da primeira e segunda consulta da Listagem 3 so apresentados a coluna.
nas Tabelas 2 e 3, respectivamente. Considerando que no exemplo indicado no primeiro item da
O leitor deve notar que apesar do resultado apresentado nas questo, a colocao de uma chave primria na coluna a tanto da
Tabelas 3 e 4 ser diferente, ele basicamente contm as mesmas tabela R como de S resolveria o problema da insero de valores
linhas quando se ordena e retira a duplicao de linhas. Portanto, NULL e, consequentemente, a duplicao de linhas. De forma
se esse for o sentido de diferente indicado no primeiro item da semelhante, uma constraint do tipo check utilizando o operador
questo, essa seria uma resposta vlida. IS NOT NULL tambm poderia ser aplicada.

12 SQL Magazine Edio 148


Nesse cenrio, teramos duas opes para responder ao segundo De fato, essa questo terica pode ter gerado muita confuso
item que levariam o mesmo nmero de restries: duas constraints devido aos termos utilizados, o que pode abrir margem para a
de chave primria ou duas constraints unique. entrada de recurso solicitando sua anulao.
Este artigo apresentou a correo das questes de conhecimento Outro ponto a ser considerado foi a falta de cobrana das
especfico para o cargo de agente de fiscalizao do concurso do operaes de manipulao de dados com o INSERT, UPDATE e
Tribunal de Contas do estado de So Paulo, realizado em agosto de DELETE. O candidato tambm deve ter notado a falta de imagens
2015. As questes dessa prova possuem trs nveis de dificuldade: com modelos de dados relacional, uma vez que este contedo
fcil, mdio e difcil. Cabe ao candidato identificar a dificuldade comum em provas de concursos pblicos para cargos que envol-
da questo e se organizar para respond-las de acordo com seus vem algum conhecimento de banco de dados.
conhecimentos e tempo disponvel.
Em geral, a prova pode ser considerada de nvel mdio para
difcil, pois em geral ela contm apenas questes complexas e Autor
que requerem alto grau de concentrao, apesar de no serem ne-
Mauro Pichiliani
cessrios muitos clculos. A dificuldade da maioria das questes
mauro@pichiliani.com.br / @pichiliani
est de acordo com o cargo de nvel pleno. bacharel em Cincia da Computao, mestre e doutorando
Essa prova teve um foco muito grande em questes relacionadas pelo ITA (Instituto Tecnolgico de Aeronutica) e MCP, MCDBA
administrao de banco de dados. Tambm houveram questes e MCTS. Trabalha h mais de 10 anos utilizando diversos bancos de
relacionadas a consultas, em participar o uso da instruo SELECT. dados SQL e NoSQL. colunista de SQL Server do web site iMasters
Poucas questes envolveram aspectos especficos do SQL Server (http://www.imasters.com.br) e mantenedor do DatabaseCast (@databasecast), o
como, por exemplo, a questo que cobrou o nome de uma stored podcast brasileiro sobre banco de dados.
procedures para observar processos do servidor.
Alm disso, a prova teve dois destaques negativos. A questo
97 apresentou uma alternativa correta que depende de configu- Links:
raes do banco de dados SQL Server, tornando circunstancial a
Download do edital, gabarito e resultados do concurso
alternativa correta indicada no gabarito. Outro aspecto negativo
http://fgvprojetos.fgv.br/concursos/tcm-sp
foi a mal formulao do enunciado da questo subjetiva.

Edio 148 SQL Magazine 13


Introduo ao
Cassandra
Um banco de dados NoSQL distribudo orientado
a chave-valor de alta disponibilidade

B Fique por dentro


ancos NoSQL tm ganhado cada vez mais po-
pularidade nos ltimos tempos, podemos ver
no ranking da Figura 1 que entre os dez SGBDs Neste artigo ser feita uma introduo ao banco de dados NoSQL
mais populares, temos bancos como o MongoDB e o Cassandra. Sero descritos aspectos gerais da arquitetura, principais
Cassandra, que esto subindo cada vez mais na lista. vantagens e desvantagens e como ele se comporta comparado aos
Porque esses bancos esto se tornando mais populares bancos de dados relacionais. Ao passo que os sistemas de informao
e outros, como o Oracle, tem perdido um grande volume geram dados com volume cada vez maior e a velocidades crescentes,
de adeso? Cada vez mais temos sistemas que precisam importante pensar em uma arquitetura de armazenamento de dados
trabalhar com volumes altssimos de transaes por se- que seja altamente escalvel e performtica. Com o Cassandra pos-
gundo e os bancos de dados precisam estar preparados svel construir um banco de dados totalmente distribudo que atende
para aguentar a demanda. Um exemplo de um cenrio s mais exigentes demandas.
de alta demanda so as Black-Fridays, que todo ano
tem batido recordes de vendas no Brasil. Montar uma
estrutura de banco de dados relacional que atenda de- manuteno seja muito menor, porm isso no muito simples
manda de evento desse tipo exige um alto investimento, de ser feito em uma estrutura de banco relacional.
contudo, estamos falando de um nico dia em que essa nesse tipo de cenrio que alguns bancos NoSQL tem ganhado
demanda muito acima do normal. Seria conveniente popularidade. Eles possuem uma estrutura de dados muito mais
que, passado o momento da Black-Friday, encolher a flexvel e so, por concepo, feitos para trabalhar de forma distri-
estrutura de banco de dados de forma que o custo de buda. Essas caractersticas permitem que eles lidem melhor com

Figura 1. Top 10 SGBDs em popularidade [3]

14 SQL Magazine Edio 148


altas demandas de processamento alm de terem uma grande shared-nothing. Isso evita gargalos no sistema e permite que os ns
capacidade de elasticidade, ou seja, em momentos que exigem sejam heterogneos entre si.
alta demanda, pode-se alocar um nmero maior de servidores, Por ter uma arquitetura distribuda e descentralizada, uma
aps esse perodo, basta remov-los da estrutura e economizar soluo com Cassandra altamente escalvel, principalmente
na infraestrutura. para escalar de forma horizontal (conhecida tambm como esca-
Neste artigo ser feita uma introduo a um dos bancos NoSQL labilidade elstica). Caso seja necessria mais performance, basta
mais populares, o Cassandra, cobrindo suas caractersticas e casos adicionar mais ns na rede, no necessrio a priori substituir as
de uso mais comuns, alm de alguns exemplos de como criar e mquinas existentes por servidores mais poderosos (ou escalar
consultar estruturas de dados bsicas dentro dele. verticalmente). Da mesma forma, se a demanda diminuir, pode-se
remover alguns ns e economizar na manuteno do sistema. Alie
Introduo ao Cassandra isso a uma infraestrutura baseada em nuvem e possvel atingir
O Cassandra foi inicialmente desenvolvido pelo Facebook para um alto grau de eficincia de uso de recursos de hardware.
ser utilizado no motor de busca de sua caixa de entrada de men- Os dados das tabelas do Cassandra passam automaticamente
sagens. Em 2008 ele se tornou open-source e em 2009 passou a ser por um processo de particionamento utilizando a partition key da
mantido pela Apache Foundation. Seu modelo de distribuio tabela que, por padro, baseada na chave primria da tabela.
do sistema baseado no Dynamo (desenvolvido pela Amazon) As parties so ento distribudas entre os ns do cluster uti-
enquanto a forma de organizao dos dados baseado no BigTable lizando uma tcnica conhecida como data sharding. As parties
(desenvolvido pelo Google). so replicadas em mltiplos ns para prover alta disponibilidade
O Dynamo nasceu a partir da necessidade de se ter um banco e tolerncia a falhas, o nmero de rplicas configurado na defi-
de dados simples, altamente escalvel e confivel para lidar com nio de um keyspace (o conceito de keyspace ser abordado mais
grandes demandas de leitura/escrita. Essa motivao veio de adiante neste artigo).
uma srie de momentos de indisponibilidade do site da Amazon Para determinar em que n do cluster cada partio ser gra-
durante a Black-Friday de 2004 nos Estados Unidos causados vada, so definidas faixas baseadas no hash da chave utilizada
em boa parte por sobrecargas nos bancos relacionais utilizados para particionamento, essas faixas so chamadas de tokens e so
na poca, resultando em prejuzo financeiro para o site de e- representadas por um inteiro de 64 bits (ou seja, nmeros que
-commerce. O Dynamo ento foi desenvolvido e empregado para podem variar de 263 at 263 1). Cada n assume responsabilidade
tratar os sistemas que sofriam com maior demanda como o de por um ou mais tokens at cobrirem todas as faixas possveis. Esse
carrinho de compras e sesses de usurio. Em 2007, a Amazon tipo de arquitetura conhecido como Arquitetura em Anel, como
disponibilizou um documento descrevendo como a arquitetura representado pela Figura 2.
do Dynamo funcionava, esse documento serviu de base para a
criao de vrios outros bancos NoSQL.
O BigTable tambm comeou a ser desenvolvido em 2004 pelo
Google, tambm como uma soluo altamente escalvel e distri-
buda. O desafio nesse caso era armazenar o volume imenso de
dados de indexao de todas as pginas web mapeadas pelo Goo-
gle que ento era utilizado para alimentar o seu motor de buscas.
A distribuio oficial do Cassandra compatvel com todas
as distribuies do Linux e com o Mac OS. Existe tambm uma
verso compatvel com o Windows distribuda pela DataStax.
O Cassandra , por concepo, feito para trabalhar de forma
distribuda, sendo que no h grandes vantagens em trabalhar
com ele utilizando apenas uma mquina. Ao utilizar vrias m-
quinas (tambm chamadas de ns), vemos o verdadeiro potencial
da soluo.
Outra caracterstica fundamental da arquitetura o fato dela
ser descentralizada, ou seja, diferente da arquitetura master-slave Figura 2. Representao da arquitetura em anel
encontrada em outros sistemas de banco de dados, dessa forma,
todos os ns da rede possuem as mesmas funes e capacidades, Para detectar ns com indcios de falha, o Cassandra emprega
no h um ponto nico de falha. Isso tambm facilita a manu- o gossip protocol: de tempos em tempos os ns do cluster enviam
teno da soluo j que no necessrio realizar configuraes pequenas mensagens entre si, caso algum n falhe sucessivamen-
especficas para cada n. Os ns tambm no compartilham entre te ao responder a essas mensagens, ele marcado como um n
si nenhum tipo de recurso de hardware como disco, processa- defeituoso e aes corretivas so disparadas em background como
mento ou memria, esse tipo de arquitetura conhecido como replicar os dados que estavam nesse servidor para outros ns.

Edio 148 SQL Magazine 15


Introduo ao Cassandra

O Cassandra tambm capaz de detectar se um dado retornado


por um dos ns est desatualizado, nesse caso, outro n ser con-
sultado em busca da verso mais recente do dado e disparado
um processo secundrio para correo do dado desatualizado.
Por se tratar de um sistema distribudo, importante entender Figura 3. Estrutura de uma linha de uma tabela no Cassandra
os nveis de consistncia ao ler e gravar dados no Cassandra. Ao
fazer a insero de um registro, pode-se informar que os dados Agora, diferente de uma tabela de um banco relacional, no
devem ser imediatamente replicados entre os ns responsveis Cassandra no necessrio popular todas as colunas ao criar
(o que chamado de consistncia forte ou consistncia imediata), uma nova linha, de forma que podemos ter "larguras" diferentes
ou, se a informao no crtica, pode-se instruir que os dados para cada uma delas (uma coluna de um banco relacional sempre
sejam replicados aos poucos, conforme a disponibilidade do precisa ser preenchida com algum valor, mesmo que seja um valor
cluster (modo chamado de consistncia fraca ou consistncia nulo). A Figura 4 representa esse conceito.
eventual). Esses nveis de consistncia tambm so aplicveis
ao efetuar comandos de leitura. importante ter em mente que
quanto mais forte o nvel de consistncia, mais oneroso para o
sistema e maior a latncia ao executar os comandos.

Estrutura dos dados


O Cassandra um banco de dados NoSQL. Um banco NoSQL
no emprega os conceitos tradicionais de banco de dados relacio-
nal. No h definio de um schema, as tabelas normalmente no
possuem definies precisas de colunas e no existe o conceito de
constraints como chaves estrangeiras. Porm, isso no impede que
sejam utilizadas linguagens parecidas com o SQL para interagir
com sistemas NoSQL (s vezes referidos como Not Only SQL). Figura 4. Representao de uma tabela do Cassandra
Existem tipos diferentes de bancos de dados NoSQL, podemos
listar os seguintes: Ao gravar um valor em uma coluna, junto a ele associado um
Orientado grafos: bancos baseados na teoria dos grafos, so timestamp indicando o horrio exato em que o valor foi gravado.
teis em cenrios como gerao de rotas ou redes de elementos Isso importante para detectar verses desatualizadas de valores
com vrias interconexes, como redes sociais. O Neo4j um banco quando o Cassandra comparar o resultado de uma consulta feita
de dados que emprega esse conceito; em vrios ns diferentes.
Armazenamento de chave-valor: um dos tipos mais simples, os Recapitulando as estruturas de dados bsicas do Cassandra, de
valores so armazenados e indexados por meio de uma chave. O baixo para cima temos:
Cassandra faz parte dessa categoria; Colunas: representam um conjunto de chave/valor;
Armazenamento colunar: neste tipo de banco os dados as Linhas: conjunto de colunas relacionados uma chave primria;
colunas das tabelas so armazenadas como estruturas de dados Tabelas: continer para um conjunto de linhas;
separadas atrelados a uma chave primria. Um exemplo dessa Keyspace: um conjunto de tabelas.
categoria o HBase;
Orientado documentos: similar ao conceito de chave-valor, A linguagem CQL
mas o valor nesse caso um documento que representa um objeto A linguagem CQL (Cassandra Query Language) utilizada para
complexo semiestruturado (normalmente na forma de um JSON). interagir com o Cassandra. A vantagem te se trabalhar com o CQL
O MongoDB um banco de dados desse tipo. que ele prximo do mais tradicional SQL, sendo familiar para
quem vem do mundo dos bancos relacionais.
Como citado anteriormente, o Cassandra um banco NoSQL do Como no SQL, os comandos no CQL so divididos em trs ca-
tipo chave-valor. Cada conjunto de chave-valor equivalente ao tegorias bsicas, sendo comandos para:
que seria uma coluna e um conjunto de colunas associadas a uma Definio das estruturas de dados;
chave primria compem o que seria uma linha de uma tabela Manipulao dos dados;
do Cassandra, como representado na Figura 3. Consultas.
As tabelas no Cassandra tm um propsito muito similar s
tabelas que encontramos em bancos relacionais. Elas tm a funo Entretanto, importante lembrar que o CQL tem suas caracte-
de agrupar dados correspondentes uma determinada entidade. rsticas prprias que o diferem do SQL, alm de outros tipos de
Podemos, por exemplo, ter uma tabela chamada usurio, que por dados. Mais detalhes da linguagem sero apresentados na parte
sua vez pode ter as colunas nome, sobrenome, telefone e email. prtica deste artigo.

16 SQL Magazine Edio 148


Criando um banco de dados no Cassandra chave vai ser utilizada como partition-key, as outras colunas so
A seguir ser apresentado como criar um banco de dados sim- chamadas de clustering columns.
ples dentro do Cassandra. Para isso, ser utilizada a verso 3.7 Outra observao importante que uma vez definida a com-
que a verso estvel mais recente disponvel no momento da es- posio da chave-primria, ela no pode ser mais alterada, isso
crita deste artigo. A primeira coisa a ser feita criar um keyspace. se deve ao fato de todo o particionamento ser definido por meio
Pode-se criar um utilizando o comando CREATE KEYSPACE: da chave. Criada a tabela, o prximo passo inserir novas linhas
nela, o que pode ser feito utilizando o comando INSERT, conforme
CREATE KEYSPACE IF NOT EXISTS my_keyspace mostra a Listagem 2.
WITH replication = {class: SimpleStrategy, replication_factor: 1};
Listagem 2. Comando INSERT
Nesse comando, estamos criando um novo keyspace chamado
INSERT INTO
my_keyspace. Estamos especificando tambm como dever ser my_keyspace.contacts (contact_id, first_name, last_name, phone_number)
tratada a replicao dos dados por meio do parmetro replication, VALUES (uuid(), John, Doe, 559912341234);
que, por sua vez, possui duas propriedades, sendo: INSERT INTO
my_keyspace.contacts (contact_id, first_name, last_name)
class: indica qual o mtodo de replicao ser utilizando para VALUES (uuid(), Mary, Jane);
distribuir as rplicas das parties, podendo ser: INSERT INTO
- SimpleStrategy: o mtodo padro. Assume que o cluster my_keyspace.contacts (contact_id, first_name, phone_number)
VALUES (uuid(), Will, 441239876543);
composto de um nico data center e ir criar um nmero de
rplicas de cada partio das tabelas desse keyspace igual ao
valor especificado no parmetro replication_factor; Executando os comandos, inserimos trs novas linhas na tabela
- NetworkTopologyStrategy: esse mtodo permite que seja contacts. Propositalmente, nem todas as linhas so inseridas com
definido um fator de replicao para cada data center que faz todas as colunas preenchidas, no Cassandra, as nicas colunas
parte do cluster. Nesse caso, o parmetro replication_factor que requerem um valor preenchido so as que compem uma
no utilizado, sendo necessrio passar um conjunto de chaves chave-primria. Utilizamos tambm a funo uuid() para gerar
e valores em que a chave o nome do data center e o valor a um identificador nico para a linha que ser inserida. Por fim,
quantidade de rplicas para o mesmo. vamos exibir o contedo da tabela utilizando o comando SELECT,
replication_factor: indica quantos ns do cluster devem con- conforme Listagem 3.
ter uma cpia de cada partio das tabelas deste keyspace caso o
mtodo de replicao seja o SimpleStrategy. Listagem 3. Comando SELECT

SELECT * FROM my_keyspace.contacts;


Tendo o keyspace criado, o prximo passo adicionar tabelas a
ele. A Listagem 1 cria uma tabela chamada contacts. contact_id | first_name | last_name | phone_number
--------------------------------------------------------+---------------+---------------+---------------------
910ac22b-538e-42d2-a5cc-7163cdd5a0c3 | Will | null | 441239876543
Listagem 1. Comando CREATE TABLE e7beb210-b9b6-4b08-9afb-950d5918ba2e | John | Doe | 559912341234
7ef9a9af-1332-46bb-abb4-2deb9b335588 | Mary | Jane | null
CREATE TABLE my_keyspace.contacts (
contact_id uuid,
first_name text,
last_name text, Como esperado, podemos ver os trs registros que foram inse-
phone_number text, ridos anteriormente. Um ponto importante que no foi coloca-
PRIMARY KEY(contact_id)
);
do nenhum filtro na consulta, nesse caso, o Cassandra sempre
retornar por padro as primeiras 1000 linhas da tabela. Ao
adicionar filtros com uma clusula WHERE, necessrio sempre
O comando informa que seja criada uma tabela chamada incluir uma chave no filtro, isso tambm vale para os comandos
contacts dentro do keyspace my_keyspace que foi criado ante- UPDATE e DELETE.
riormente. Definimos tambm quatro colunas para essa tabela, At ento, salvo algumas particularidades, tudo muito parecido
contact_id, que a chave-primria e do tipo uuid (Univer- com o que existe na linguagem SQL, o que ajuda muito a quem
sally Unique Identifier), assegura que os valores dessa coluna vem do mundo dos bancos relacionais. Entretanto, podemos ver
sero nicos. As outras colunas so first_name, last_name e as maiores diferenas quando o assunto a modelagem de dados.
phone_number, todas do tipo text. Nesse caso, como a chave- Supondo que seja necessrio alterar a tabela contacts para
-primria composta por apenas uma coluna, ela tambm a permitir que seja gravado mais de um telefone por contato. O
partition-key dessa tabela, o hash da partition-key o que define caminho natural em um banco de dados relacional seria aplicar
em que partio da tabela as linhas sero armazenadas. No caso a primeira forma normal criando uma segunda tabela em que
de uma chave-primria composta, apenas a primeira coluna da seriam armazenados os telefones relacionados ao contact_id da

Edio 148 SQL Magazine 17


Introduo ao Cassandra

tabela original. Porm, isso no encorajado ao trabalharmos com No primeiro caso, estamos adicionando um valor no final da
o Cassandra, realizar um JOIN entre tabelas, embora possvel, lista (igualmente, fazendo a declarao invertida como SET
custoso pelo fato da possibilidade de os dados estarem distribu- phone_numbers = [ 5511987654321 ] + phone_numbers,
dos entre vrios ns diferentes do cluster. Em sistemas com essas ir inserir os valores no incio da lista). No segundo exemplo,
caractersticas, importante fazer o menor nmero de operaes estamos removendo o valor 5511987654321 da lista indepen-
de I/O possvel para garantir uma alta performance. Nesse cen- dentemente da posio que ele esteja. Podemos tambm espe-
rio, recomendado o uso de uma coluna do tipo Collection. Uma cificar um valor para uma posio especfica da lista como no
coleo pode ser uma lista de valores ou ainda um outro conjunto terceiro exemplo, nesse caso, o valor anterior ser substitudo.
de chaves e valores. Podemos exemplificar isso criando um novo Por fim, para limpar todos os valores da lista, basta atribuir
campo phone_numbers sendo uma lista de valores do tipo texto coluna um valor como uma lista vazia como demonstrado no
com os comandos apresentados na Listagem 4. quarto comando.
Uma coleo pode guardar at 64.000 elementos dentro dela,
Listagem 4. Criao de uma coluna do tipo coleo porm, importante salientar que elas so projetadas para guar-
dar pequenos conjuntos de dados, colees muito extensas e com
ALTER TABLE my_keyspace.contacts ADD phone_numbers LIST<text>;
elementos muito complexos impactam a performance de leitura
ALTER TABLE my_keyspace.contacts DROP phone_number; dos dados. Em um cenrio desse tipo mais indicado criar uma
tabela parte.
UPDATE my_keyspace.contacts
Outro recurso interessante no Cassandra a criao de tipos
SET phone_numbers = [ 441239876543, 441239876543 ]
WHERE contact_id = 910ac22b-538e-42d2-a5cc-7163cdd5a0c3; customizados. Tipos customizados tambm so tratados como
colees e so teis quando necessrio definir uma estrutura
SELECT phone_numbers FROM my_keyspace.contacts
WHERE contact_id = 910ac22b-538e-42d2-a5cc-7163cdd5a0c3;
com campos pr-definidos. Digamos que necessrio criar um
tipo para guardar o endereo de um contato, em que sero guar-
phone_numbers dados o logradouro, a cidade, o estado e o CEP. Podemos fazer
---------------------------------------------
[441239876543, 441239876543] isso utilizando o comando CREATE TYPE como exemplificado
na Listagem 6.

Nesse caso, foi criada a nova coluna utilizando o tipo LIST<text>, Listagem 6. Criao de um tipo customizado
com isso, estamos informando uma coluna que uma lista orde-
CREATE TYPE my_keyspace.address (
nada de valores do tipo texto. Outros tipos de coleo disponveis street text,
so SET (lista no ordenada) e MAP (lista de chave-valor). No city text,
possvel alterar a coluna phone_number, que do tipo texto, state text,
zip_code int);
para um tipo LIST<text>. O Cassandra no permite esse tipo de
operao, ento o comando seguinte exclui essa coluna da tabela.
A seguir, atualizado um dos registros agora com uma lista de Ao definir uma coluna com esse tipo, garantido que o campo
telefones e, por fim, um comando SELECT para exibir o resultado. no ter nenhuma chave a mais do que as que esto descritas
No caso da Listagem 4, foi atribuda uma lista fixa de nmeros de (street, city, state e zip_code), contudo, no obrigatrio preen-
telefone na coleo, mas h diversas outras maneiras de manipular cher todos os valores.
os dados, conforme exemplifica a Listagem 5. Agora vamos adicionar uma nova coluna addresses na tabela
contacts que ser uma coleo do tipo MAP<text, address>,
Listagem 5. Operaes com colees
com isso, teremos uma coluna podendo conter vrios endereos
indexados por um nome (Listagem 7).
UPDATE my_keyspace.contacts Podemos ver que para adicionar a nova coluna foi necessrio
SET phone_numbers = phone_numbers + [ 5511987654321 ]
WHERE contact_id = 910ac22b-538e-42d2-a5cc-7163cdd5a0c3; definir o tipo address como FROZEN, sem isso, o Cassandra
no vai permitir que a coluna seja criada. Isso se deve ao fato do
UPDATE my_keyspace.contacts Cassandra no suportar por completo colees aninhadas (tipos
SET phone_numbers = phone_numbers - [ 5511987654321 ]
WHERE contact_id = 910ac22b-538e-42d2-a5cc-7163cdd5a0c3; customizados so tratados como colees) devido forma como
os dados da coluna so serializados. Ao definir uma coleo como
UPDATE my_keyspace.contacts
FROZEN no possvel alterar atributos individuais dela (como
SET phone_numbers[0] = 5511987654321
WHERE contact_id = 910ac22b-538e-42d2-a5cc-7163cdd5a0c3; alterar somente o valor do atributo street da coleo address de
uma linha j existente da tabela), necessrio substituir a coleo
UPDATE my_keyspace.contacts
por completo. Aps criar a nova coluna, inserimos um novo ende-
SET phone_numbers = []
WHERE contact_id = 910ac22b-538e-42d2-a5cc-7163cdd5a0c3; reo com a chave home para um dos contatos. Por fim, podemos
ver o resultado com o comando SELECT.

18 SQL Magazine Edio 148


Listagem 7. Adicionando o novo tipo address tabela contacts Com o ndice criado, os dados so retornados normalmente.
No entanto, o uso de ndices secundrios no eficiente quando:
ALTER TABLE my_keyspace.contacts A coluna tem uma cardinalidade muito alta ou muito baixa (seus
ADD addresses MAP<text, FROZEN<address>>;
valores variam bastaste ou muito pouco). Nesses casos a consulta
UPDATE my_keyspace.contacts pode acabar envolvendo muitos ns do cluster;
SET addresses = addresses + {home:
A coluna tem valores frequentemente alterados ou apagados.
{ street: Av. Paulista, 1, city: Sao Paulo, state: SP, zip_code: 1311000} }
WHERE contact_id = 910ac22b-538e-42d2-a5cc-7163cdd5a0c3; Isso torna a manuteno do ndice onerosa, j que ele tambm
precisa passar por constantes alteraes e tambm ser replicado
SELECT phone_numbers, addresses FROM my_keyspace.contacts
entre as mquinas.
WHERE contact_id = 910ac22b-538e-42d2-a5cc-7163cdd5a0c3;

phone_numbers | addresses TTL (Time to Live)


---------------------------------------------+-----------------------------------------
[441239876543, 441239876543] | {home: {street: Av. Paulista, 1,
Um recurso interessante e muito til do Cassandra a possibi-
city: Sao Paulo, state: SP, lidade de atribuir a um valor de uma coluna um tempo de vida,
zip_code: 1311000}} um recurso chamado TTL (abreviao de Time to Live). Passado
esse tempo, o valor ser automaticamente removido da tabela.
Como explicado anteriormente, o Cassandra no permite fazer O tempo descrito em segundos e definido utilizando o coman-
consultas com filtros sem que haja uma chave entre as clusulas. do USING TTL como no exemplo da Listagem 10.
Se tentarmos fazer uma consulta para trazer todos os contatos
com o nome Mary, o Cassandra retornar o erro apresentado Listagem 10. Definio do tempo de vida de um valor
na Listagem 8.
INSERT INTO my_keyspace.contacts (contact_id, first_name, last_name)
VALUES (uuid(), Temporary, Temporary) USING TTL 600;
Listagem 8. SELECT sem chave na clusula WHERE
SELECT ttl(first_name), ttl(last_name) from my_keyspace.contacts WHERE contact_
SELECT first_name, last_name FROM my_keyspace.contacts id = deec4e61-1aac-442c-bd4e-d5038f900710;
WHERE first_name = Mary;
ttl(first_name) | ttl(last_name)
InvalidRequest: code=2200 [Invalid query] message=Cannot execute this query --------------------+----------------
as it might involve data filtering and thus may have unpredictable performance. 430 | 430
If you want to execute this query despite the performance unpredictability, use
ALLOW FILTERING
No exemplo, foi definido um TTL de 600 segundos (ou 10 mi-
nutos). Tambm possvel consultar o tempo de vida restante
Ele indica que se for executada uma consulta desse tipo, a per- utilizando a funo ttl(). Podemos ver que restam 430 segundos
formance imprevisvel. Isso acontece pois se essa tabela tivesse nesse caso para que os valores sejam apagados da tabela. A funo
bilhes de linhas, possivelmente vrios ns do cluster precisariam ttl() ir retornar nulo caso no haja um tempo de vida definido
ser consultados para conseguir trazer o resultado desejado, seria para o valor. possvel definir tempo de vida no comando UPDA-
basicamente o equivalente a um full table scan em um banco relacio- TE, a diferena que o comando USINT TTL deve estar antes da
nal, mas em uma escala muito maior. Podemos forar a execuo palavra-chave SET.
da consulta adicionando a instruo ALLOW FILTERING no
final do comando como explicado na mensagem, mas isso no Nveis de consistncia
recomendado a no ser que a tabela seja muito pequena. Outra caracterstica muito importante do Cassandra a possi-
Contudo, h uma forma melhor de resolver isso criando um bilidade de definir o nvel de consistncia para as operaes de
ndice secundrio. Assim como em um banco relacional, no Cas- leitura e escrita no banco. Como descrito no incio do artigo, os
sandra possvel criar ndices para colunas que no fazem parte dados ficam distribudos entre os ns do cluster por meio das
da chave primria. Para isso, utilizado o comando CREATE parties que por sua vez podem ter rplicas de acordo com o
INDEX apresentado na Listagem 9. fator de replicao definido na criao do keyspace.
No momento em que um dado escrito, possvel definir um
Listagem 9. Criao de um ndice secundrio nvel de consistncia que ir dizer quantos ns precisaro ser
acionados para gravar os dados. Quanto menor o nvel de con-
CREATE INDEX ON my_keyspace.contacts ( first_name );
sistncia, mais rpida e menos onerosa a operao, porm nem
SELECT first_name, last_name FROM my_keyspace.contacts todas as rplicas da partio onde foi inserido o novo dado tero
WHERE first_name = Mary; a ltima verso do mesmo. Em contrapartida, quanto mais alto o
first_name | last_name
nvel de consistncia definido, mais lenta e onerosa a operao,
---------------+----------- pois ela s considerada como concluda quando a quantidade
Mary | Jane de rplicas necessrias for atualizada.

Edio 148 SQL Magazine 19


Introduo ao Cassandra

Nvel Descrio

ANY Garante que o dado seja escrito em pelo menos uma rplica antes de retornar a resposta para o cliente. Hints (BOX 1) so consi-
deradas como uma escrita bem-sucedida.

ONE, TWO, THREE Garante que o dado seja escrito em pelo menos um, dois ou trs ns antes de retornar uma resposta para o cliente.

LOCAL_ONE Similar ao ONE, mas com a premissa de que o dado seja escrito em pelo menos uma rplica no mesmo data center.

QUORUM Garante que o valor foi escrito com sucesso na maioria das rplicas (calculado por: (fator de replicao / 2) + 1).

LOCAL_QUORUM Similar ao QUORUM, mas com a premissa de que todas as rplicas sejam do mesmo data center.

EACH_QUORUM Tambm similar ao QUORUM, mas garante que o valor seja escrito na maioria das rplicas em todos os data centers.

ALL Garante que o valor seja escrito em um nmero de rplicas igual ao especificado no fator de replicao. A operao conside-
rada como falha caso no seja possvel escrever em uma ou mais rplicas.

Tabela 1. Nveis de consistncia de escrita

Nvel Descrio

ONE, TWO, THREE Retorna o valor mais atualizado encontrado em um, dois ou trs ns (de acordo com o valor especificado). Aps retornar a
informao para o cliente, um processo criado em background para atualizar um valor que esteja desatualizado em uma ou
mais rplicas, se necessrio.

LOCAL_ONE Similar ao ONE, mas com a premissa de que o dado seja lido em um n no mesmo data center.

QUORUM Consulta todos os ns at que a maioria das rplicas tenha respondido (fator de replicao / 2) + 1) retornando a verso mais
atualizada. Aps retornar a informao para o cliente, um processo criado em background para atualizar um valor que esteja
desatualizado em uma ou mais rplicas, se necessrio.

LOCAL_QUORUM Similar ao QUORUM, mas com a premissa de que os ns que responderem sejam todos do mesmo data center.

EACH_QUORUM Tambm similar ao QUORUM, mas com a premissa de haja a resposta da maioria dos ns em todos os data centers.

ALL Consulta todos os ns e aguarda a resposta de todos eles retornando a verso mais atualizada. Aps retornar a informao para
o cliente, um processo criado em background para atualizar um valor que esteja desatualizado em uma ou mais rplicas, se
necessrio.

Tabela 2. Nveis de consistncia de leitura

BOX 1. HINT Listagem 11. Definio de consulta do nvel de consistncia de leitura e escrita

Uma hint gerada dentro do Cassandra quando um n falha em responder ao tentar executar uma CONSISTENCY;
operao de escrita nele, funcionando como uma espcie de lembrete. As hints so gravadas em uma Current consistency level is ONE.
tabela chamada system.hints e s so geradas caso o nvel de consistncia exigido no momento da CONSISTENCY LOCAL_ONE;
Consistency level set to LOCAL_ONE.
escrita j foi atingido. Eventualmente, quando o n volta a responder, o servidor que armazenou a
hint vai tentar escrever novamente a informao e remover a hint caso bem-sucedido.

Entender o nvel de consistncia exigido para cada caso de uso


Os possveis nveis de consistncia que podem ser definidos da aplicao importante para no onerar demais o banco sempre
esto descritos na Tabela 1. Da mesma forma, possvel definir exigindo altos nveis de consistncia. Onde no estritamente
nveis de consistncia de leitura (Tabela 2). necessrio sempre ter o dado mais atualizado, recomendado
O nvel de consistncia definido por conexo. Podemos con- utilizar nveis de consistncia mais baixos.
sultar ou definir o nvel de consistncia utilizando o comando O Cassandra um timo banco de dados para comear a en-
CONSISTENCY conforme apresentado na Listagem 11. tender solues NoSQL para quem sempre teve contato com a

20 SQL Magazine Edio 148


linguagem SQL e bancos relacionais, tornando a curva de apren- Autor
dizado mais suave em comparao ao MongoDB, por exemplo.
Maycon Pinheiro Queiros
No entanto, importante se atentar s suas particularidades
queiros.maycon@gmail.com
da modelagem de dados, j que empregar a normalizao de Apaixonado pelo mundo da tecnologia, j se aventura no
tabelas pode trazer um grande impacto negativo na performance mundo da programao desde os doze anos criando jogos
do banco. de computador. Atuando profissionalmente desde 2010, j passou por
Ele uma tima soluo de alta disponibilidade e escalabilidade desenvolvimento para Web, Desktop, Mobile, focado hoje em solues
quando preciso trabalhar com sistemas que requerem volumes de BI corporativas.
de leitura e escrita extremamente alto e em que sempre h a
chave-primria em mos. timo tambm para solues em nu-
Referncias:
vem graas ao formato de sua arquitetura derivada do Dynamo,
permitindo uma alta elasticidade, sendo assim, pode-se adequar [1] Cassandra Query Language (CQL) v3.3.1. Apache Cassandra
a complexidade da infraestrutura de acordo com a demanda de https://cassandra.apache.org/doc/old/CQL-2.2.html
leitura/escrita necessria.
[2] Hinted Handoff: repair during write path. DataStax
Por outro lado, o Cassandra no interessante para ser usado
https://docs.datastax.com/en/cassandra/3.0/cassandra/operations/opsRepairNodesHin-
em cenrios com baixa demanda de leitura e escrita (a no ser
tedHandoff.html
que seja esperado que essa demanda cresa rapidamente com o
tempo). Tambm no o melhor candidato para ser utilizado como [3 DB-Engines Ranking. DB-Engines, 2016
banco de dados analtico, por ter muitas limitaes quando no http://db-engines.com/en/ranking
so feitas consultas utilizando a chave-primria, existem outras [4] Vendas da Black Friday chegam a R$1,53 bilho, dizem organizadores. G1, 2015
solues que podem desempenhar melhor esse papel, como por http://g1.globo.com/economia/noticia/2015/11/vendas-da-black-friday-chegam-r153-
exemplo, o HBase. -bilhao-dizem-organizadores.htm

[5] Shared Nothing Architecture. Safari Books Online, 2012


https://www.safaribooksonline.com/blog/2012/08/21/shared-nothing-architecture

[6] Cassandra - Introduction. Tutorials Point


https://www.tutorialspoint.com/cassandra/cassandra_introduction.htm

[7] Amazon DynamoDB a Fast and Scalable NoSQL Database Service Designed
for Internet Scale Applications. All Things Distributed, 2012
http://www.allthingsdistributed.com/2012/01/amazon-dynamodb.html

Edio 148 SQL Magazine 21


Integrao de dados
com Foreign
Data Wrappers
Acessando dados externos atravs do PostgreSQL

O
FDW foi construdo baseando-se no SQL/ Fique por dentro
MED (SQL Management of External Data),
que se trata de uma regulamentao de um Foreign Data Wrappers (FDW) uma funcionalidade do PostgreSQL,
padro de configurao, desenvolvimento e aplicao que permite o acesso a dados externos em SGBDs como Oracle, MySQL,
de acessos a dados externos em SGBDs e arquivos de SQL Server, MongoDB, entre outros. O acesso a esses dados realizado
outros fornecedores. O conceito do FDW no apenas atravs do cliente do banco de dados PostgreSQL, utilizando PL/pgSQL,
tornar dados visveis de vrias origens em um nico a linguagem procedural do PostgreSQL. No cenrio atual, no qual exis-
ponto, mas tambm integrar o uso desses dados, por tem sistemas distintos, onde h necessidade de integrao entre dados,
exemplo, utilizando joins ou filtros de tabela externas seja pelo negcio da empresa, motivo de novas aquisies, aplicaes
como parmetro para retornar dados de outra tabela legadas, fornecedores com banco de dados diferentes ou migraes,
de outra fonte. Alm disso, permitindo que sejam feitas torna-se cada vez mais necessrio que a integrao desses dados seja
todas as operaes DML (Data Manipulation Language) realizada de forma simples, confivel e eficiente, evitando custos,
no acesso a dados externos, como select, insert, update processos complexos, necessidade de licenas, alto trfego de rede.
e delete. Essa facilidade de manipulao de dados um O FDW pode ser uma soluo bem til para a maioria dessas situaes.
grande diferencial do FDW se comparado com ferramen-
tas que tm o mesmo propsito de integrao de dados,
geralmente sem real-time ou permisso de alterao de Aps a configurao do FDW, realizado o mapeamento das
objetos (acesso read only somente). tabelas do banco de dados externo com a criao de foreign tables,
Os objetos externos podem se conectar ao Postgre- ou ento com a criao de um schema externo.
SQL utilizando a funcionalidade de FDW, para que seja As configuraes de extenses variam de acordo com o forne-
possvel trabalhar com as informaes dessas fontes cedor. Para extenses de MySQL, MongoDB, SQL Server, Web
externas. O PostgreSQL disponibiliza o acesso aos dados Services, a configurao realizada atravs de instalao de
utilizando-se do conceito de tabelas externas (foreign pacotes no sistema operacional. Para outros tipos de extenses,
tables), o que torna transparente o acesso aos dados como do banco de dados Oracle, que ser utilizado neste artigo,
externos, e so utilizados os mesmos procedimentos de a extenso de FDW configurada com um projeto no GitHub
acesso a tabelas locais. chamado oracle_fdw.
As verses do PostgreSQL e das extenses FDW dos objetos
Criando extenses no PostgreSQL externos funcionam da seguinte forma: o banco de dados Post-
A funcionalidade de FDW disponibilizada no Post- greSQL lana novas verses, releases e correes, e ento os de-
greSQL atravs de extenses, que segue a ideia basica- senvolvedores que disponibilizam os FDWs dos objetos externos
mente de arquivos que podem ser compilados dentro implementam as novas melhorias.
do PostgreSQL com determinadas funcionalidades.
As extenses de FDW adicionadas ao banco de dados Extenses oracle_fdw e mysql_fdw
permitem realizar a integrao de um objeto externo O oracle_fdw uma extenso de acesso ao Oracle, mantida
(SGBD ou arquivo) ao PostgreSQL. no GitHub em um projeto de Laurenz Albe. O oracle_fdw s

22 SQL Magazine Edio 148


compatvel com verses do Oracle Database Client 10 em diante. Listagem 1. Instalao de cliente MySQL no sistema operacional
importante lembrar que o GitHub um repositrio de projetos
[root@servidor]# rpm -Uvh http://dev.mysql.com/get/mysql57-community-relea-
de desenvolvedores que os tornam pblicos ou no, no caso do
se-el6-9.noarch.rpm
oracle_fdw, o cdigo aberto e possvel verificar como foi rea- Retrieving http://dev.mysql.com/get/mysql57-community-release-el6-9.noarch.
lizado o desenvolvimento, que est em constante atualizao, e rpm
[...]
que de certa forma confivel.
[root@servidor lib]# yum install mysql-community-client
necessria ateno antes de baixar qualquer projeto de FDW [...]
do GitHub, no caso do FDW, interessante dar preferncia aos Setting up Install Process
Resolving Dependencies
projetos conhecidos na comunidade PostgreSQL e que disponi- [...]
bilizam de forma clara o cdigo utilizado. Installing:
Com o MySQL, o processo um pouco mais simples, o mys- mysql-community-client x86_64 5.7.15-1.el6 mysql57-community 23 M
Installing for dependencies:
ql_fdw est disponvel para ser instalado por meio do repositrio mysql-community-common x86_64 5.7.15-1.el6 mysql57-community 327 k
oficial do PostgreSQL, com isso, aps adicionar o repositrio de mysql-community-libs x86_64 5.7.15-1.el6 mysql57-community 2.1 M
pacotes do PostgreSQL no CentOS, por exemplo, basta executar a [...]
Installed:
instalao do pacote mysql_fdw, e ento, no banco de dados local, mysql-community-client.x86_64 0:5.7.15-1.el6
devem ser realizadas as configuraes de server, user mapping e Dependency Installed:
outras mais que sero mostradas no decorrer deste artigo. mysql-community-common.x86_64 0:5.7.15-1.el6
mysql-community-libs.x86_64 0:5.7.15-1.el6
Complete!
Configurando o mysql_fdw
Listagem 2. Instalao do mysql_fdw no sistema operacional e no PostgreSQL
A instalao da extenso de FDW para o MySQL realizada
com os pacotes oficiais do PostgreSQL, de acordo com a verso [root@servidor]# rpm -Uvh http://yum.postgresql.org/9.5/redhat/rhel-6-x86_64/
do banco de dados instalada. Para a verso 9.5 que ser utilizada pgdg-redhat95-9.5-2.noarch.rpm
Retrieving http://yum.postgresql.org/9.5/redhat/rhel-6-x86_64/pgdg-re-
nos exemplos a seguir, o repositrio oficial pgdg-centos95-9.5-3. dhat95-9.5-2.noarch.rpm
noarch.rpm contm o mysql_fdw_95. Antes de realizar a instalao [...]
do mysql_fdw_95, necessrio que no servidor em questo tenha [root@servidor]# yum install mysql_fdw_95
[...]
sido instalado o cliente de acesso ao banco de dados MySQL, isso Setting up Install Process
porque o PostgreSQL se comunica com o mysql_fdw, que por sua Resolving Dependencies
vez se comunica com o cliente do MySQL, que se conecta ao banco [...]
Installing:
de dados MySQL e retorna as informaes necessrias. O cliente mysql_fdw_95 x86_64 2.1.2-1.rhel6 pgdg95 27 k
MySQL instalado para este artigo foi o mysql-community-client, Installing for dependencies:
postgresql95 x86_64 9.5.4-2PGDG.rhel6 pgdg95 1.3 M
disponvel no repositrio mysql57-community-release-el6-9.
postgresql95-server x86_64 9.5.4-2PGDG.rhel6 pgdg95 4.5 M
noarch, repositrio oficial do MySQL. [...]
Na Listagem 1 possvel verificar o modo de configurao do Installed:
mysql_fdw_95.x86_64 0:2.1.2-1.rhel6
repositrio. Em seguida, temos a instalao do cliente de MySQL
Dependency Installed:
5.7, que por sua vez instala as dependncias necessrias para o postgresql95.x86_64 0:9.5.4-2PGDG.rhel6
cliente MySQL funcionar corretamente. Aps esses passos, a postgresql95-server.x86_64 0:9.5.4-2PGDG.rhel6
Complete!
configurao no servidor est pronta para o FDW, porm, ainda [root@servidor]# service postgresql-9.5 stop
restar a configurao dos objetos dentro do banco de dados Stopping postgresql-9.5 service: [ OK ]
PostgreSQL, que ser demonstrada mais adiante. [root@servidor]# service postgresql-9.5 start
Starting postgresql-9.5 service: [ OK ]
Com a instalao do cliente MySQL realizada, o prximo passo [root@servidor]# su - postgres
a instalao do pacote mysql_fdw_95 no sistema operacional, e -bash-4.1$ psql
em seguida a instalao do mysql_fdw no PostgreSQL, conforme psql (9.6.0, server 9.5.4)
Type help for help.
ilustrado na Listagem 2. Caso a instalao seja concluda corre- postgres=# create extension mysql_fdw;
tamente, as bibliotecas do cliente MySQL esto sendo acessadas CREATE EXTENSION
pelo PostgreSQL atravs do mysql_fdw.
Como observao, pode-se notar na Listagem 2 que houve No MySQL em que ser feita a conexo via FDW, conforme
dependncias do mysql_fdw instaladas, os pacotes postgresql95- exibido na Listagem 3, h um banco de dados chamado mysql_da-
-server e postgresql95. Isso ocorreu porque no havia ainda no tabase, o qual possui uma tabela chamada mysql_table, que ser
servidor em questo o banco de dados PostgreSQL na verso 9.5 utilizada nos prximos exemplos.
instalado, mas se houvesse, o mysql_fdw no instalaria depen- Nesse MySQL tambm foi criado um usurio chamado mys-
dncias. A instalao do FDW foi realizada dessa forma apenas ql_usuario, com a senha mysql_senha. Utilizando o cliente do
para mostrar uma forma rpida de instalao do banco de dados PostgreSQL, ser necessrio criar um server, que indica ao Post-
e extenso na mesma tarefa. greSQL onde se conectar para obter os dados da tabela estrangeira.

Edio 148 SQL Magazine 23


Integrao de dados com Foreign Data Wrappers

Listagem 3. Visualizao do banco de dados mysql_database no banco de dados Listagem 4. Criao de server e user mapping para MySQL no PostgreSQL
MySQL
[root@servidor]# su - postgres
mysql> show databases; -bash-4.1$ psql
+------------------------------+ psql (9.6.0, server 9.5.4)
| Database | postgres=# CREATE SERVER mysql_server
+------------------------------+ FOREIGN DATA WRAPPER mysql_fdw
OPTIONS (host 127.0.0.1, port 3306);
| information_schema |
CREATE SERVER
| mysql |
postgres=# CREATE USER MAPPING FOR PUBLIC
| mysql_database | SERVER mysql_server
| performance_schema | OPTIONS (username mysql_usuario, password mysql_senha);
| sys | CREATE USER MAPPING
+------------------------------+
5 rows in set (0.00 sec) Listagem 5. Criao de foreign table e import foreign schema

mysql> use mysql_database; postgres=# CREATE FOREIGN TABLE postgres_mysql_table (id int, texto char(50))
Database changed SERVER mysql_server
OPTIONS (table_name mysql_table, dbname mysql_database);
mysql> show tables;
CREATE FOREIGN TABLE
Empty set (0.00 sec)
postgres=# select * from postgres_mysql_table;
id | texto
mysql> create table mysql_table (id int, texto char(50));
----+-------
Query OK, 0 rows affected (0.03 sec)
1 | texto
2 | texto
mysql> show tables; 3 | texto
+------------------------------------+ (3 rows)
| Tables_in_mysql_database |
+------------------------------------+ postgres=# drop foreign table postgres_mysql_table;
| mysql_table | DROP FOREIGN TABLE
+------------------------------------+ postgres=# import foreign schema mysql_database from server mysql_server into
1 row in set (0.00 sec) public;
IMPORT FOREIGN SCHEMA
mysql> create user mysql_user identified by mysql_senha; postgres=# \det
Query OK, 0 rows affected (0.00 sec) List of foreign tables
Schema | Table | Server
mysql> \q -----------+------------------+--------------
Bye public | mysql_table | mysql_server
public | mysql_table2 | mysql_server
(2 rows)
Para esse passo informado como parmetro o nome do ser-
ver, o wrapper que ser utilizado (nesse caso, o mysql_fdw), o
host em que se hospeda o banco de dados estrangeiro e a porta Configurando o oracle_fdw
de conexo. Essa configurao um pr-requisito para a confi- Seguindo com a configurao de FDW, dessa vez para o Oracle
gurao do user mapping, que necessrio informar o login e Database, necessrio o oracle_fdw e um cliente de banco de
senha de conexo ao banco estrangeiro que tem acesso aos ob- dados. Para o banco de dados Oracle no existe extenso oficial
jetos que sero acessados. Com essas configuraes de server e do PostgreSQL, portanto, ser instalado o oracle_fdw, conforme
user mapping, todos os dados de acesso ao banco externo foram foi apresentado neste artigo, um projeto existente no GitHub, mas
informados: servidor e porta, login e senha de conexo. Um com bastante aceitao e utilizao. O GitHub pode ser clonado
exemplo dessa configurao pode ser observado no Listagem 4. para um diretrio a partir do endereo do projeto no GitHub ou
Os objetos do banco de dados externo podem ser configura- o projeto pode ser baixado e transferido para o servidor manual-
dos no PostgreSQL com a criao de uma tabela estrangeira, de mente. Com o GitHub j configurado no servidor, a transferncia
acordo com o que foi feito na Listagem 5 (create foreign table) ou do projeto do GitHub foi realizada utilizando o comando git clone
com a importao de esquema (import foreign schema), no qual e em seguida os passos de instalao do FDW, conforme mostra
mais de uma tabela pode ser importada. interessante entender a Listagem 6.
o conceito de importao de esquema estrangeiro, onde a sintaxe Antes da instalao do oracle_fdw, necessrio a instalao de
import foreign schema no significa que um esquema criado um pacote chamado postgresql95-devel (Listagem 7), que existe
no destino, e sim que todos os objetos pertencentes ao server no repositrio oficial do PostgreSQL. Como esse repositrio j foi
mencionado na sintaxe sero importados como foreign table adicionado ao servidor na instalao do FDW do MySQL, para
um a um. Portanto, caso seja necessrio apagar esses objetos, instalar esse pacote necessrio executar a sintaxe apropriada
no existe uma sintaxe drop foreign schema, ao invs disso, os para o sistema operacional que est sendo configurado. No caso
objetos devem ser removidos um a um como foreign table. do CentOS, a sintaxe yum install.

24 SQL Magazine Edio 148


Listagem 6. Download do projeto oracle_fdw e listagem do contedo baixado Listagem 8. Instalao de oracle_fdw no sistema operacional

[root@servidor]# git clone https://github.com/laurenz/oracle_fdw.git [oracle@servidor]$ export PATH=/usr/pgsql-9.5/bin:$PATH


Initialized empty Git repository in /root/oracle_fdw/.git/ [oracle@servidor]$ make
remote: Counting objects: 1249, done. gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement
remote: Compressing objects: 100% (13/13), done. -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing
remote: Total 1249 (delta 6), reused 0 (delta 0), pack-reused 1236
-fwrapv -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-pro-
Receiving objects: 100% (1249/1249), 703.24 KiB | 294 KiB/s, done.
tector --param=ssp-buffer-size=4 -m64 -mtune=generic -DLINUX_OOM_ADJ=0
Resolving deltas: 100% (827/827), done.
-fpic -I/u01/app/oracle/product/11.2.0/dbhome_1/sdk/include -I/u01/app/oracle/
[root@servidor ~]# cd oracle_fdw/ product/11.2.0/dbhome_1/oci/include -I/u01/app/oracle/product/11.2.0/dbho-
[root@servidor oracle_fdw]# ls -ltrh me_1/rdbms/public -I/usr/include/oracle/12.1/client -I/usr/include/oracle/12.1/
total 392K client64 -I/usr/include/oracle/11.2/client -I/usr/include/oracle/11.2/client64 -I/
-rw-r--r-- 1 root root 156 Oct 4 07:26 TODO usr/include/oracle/11.1/client -I/usr/include/oracle/11.1/client64 -I/usr/include/
-rw-r--r-- 1 root root 34K Oct 4 07:26 README.oracle_fdw oracle/10.2.0.5/client
lrwxrwxrwx 1 root root 17 Oct 4 07:26 README.md -> README.oracle_fdw [...]
-rw-r--r-- 1 root root 1.8K Oct 4 07:26 Makefile [oracle@servidor oracle_fdw]$ make install
-rw-r--r-- 1 root root 1009 Oct 4 07:26 LICENSE /bin/mkdir -p /usr/pgsql-9.5/lib
-rw-r--r-- 1 root root 13K Oct 4 07:26 CHANGELOG /bin/mkdir -p /usr/pgsql-9.5/share/extension
-rw-r--r-- 1 root root 1003 Oct 4 07:26 oracle_fdw--1.1.sql /bin/mkdir -p /usr/pgsql-9.5/share/extension
-rw-r--r-- 1 root root 231 Oct 4 07:26 oracle_fdw--1.0--1.1.sql /bin/mkdir -p /usr/pgsql-9.5/doc/extension
drwxr-xr-x 2 root root 4.0K Oct 4 07:26 expected /usr/bin/install -c -m 755 oracle_fdw.so /usr/pgsql-9.5/lib/oracle_fdw.so
-rw-r--r-- 1 root root 164K Oct 4 07:26 oracle_fdw.c /usr/bin/install -c -m 644 .//oracle_fdw.control /usr/pgsql-9.5/share/extension/
-rw-r--r-- 1 root root 44K Oct 4 07:26 oracle_gis.c /usr/bin/install -c -m 644 .//oracle_fdw--1.1.sql .//oracle_fdw--1.0--1.1.sql /usr/
-rw-r--r-- 1 root root 7.8K Oct 4 07:26 oracle_fdw.h
pgsql-9.5/share/extension/
-rw-r--r-- 1 root root 133 Oct 4 07:26 oracle_fdw.control
/usr/bin/install -c -m 644 .//README.oracle_fdw /usr/pgsql-9.5/doc/extension/
drwxr-xr-x 2 root root 4.0K Oct 4 07:26 sql
-rw-r--r-- 1 root root 92K Oct 4 07:26 oracle_utils.c
Listagem 9. Criao de extenso oracle_fdw no PostgreSQL
Listagem 7. Instalao de dependncia para o oracle_fdw
[root@servidor]# su - postgres
-bash-4.1$ export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
[root@servidor]# yum install postgresql95-devel
-bash-4.1$ psql
[...]
psql (9.6.0, server 9.5.4)
Setting up Install Process
Type help for help.
[...]
postgres=# create extension oracle_fdw;
Resolving Dependencies
CREATE EXTENSION
[...]
postgres=# \q
Installing:
postgresql95-devel x86_64 9.5.4-2PGDG.rhel6 pgdg95 1.7 M
[...]
Installed:
postgresql95-devel.x86_64 0:9.5.4-2PGDG.rhel6 A criao de server e o user mapping tem pequenas modifica-
es se comparado ao MySQL, mas a ideia principal continua,
Complete! criar um link de conexo com o banco de dados externo com as
informaes de conexo de servidor e usurio do objeto externo.
Caso no seja instalado esse pacote, ocorrer um erro na ins- Primeiramente, foi criada uma tabela chamada oracle_table com
talao do oracle_fdw. Outro item necessrio que o servidor duas linhas para teste no PostgreSQL. Tambm existe um usurio
possua ou o banco de dados Oracle instalado, com uma verso a oracle_usuario que j possui os grants necessrios de acesso no
partir da 10g para que sejam utilizadas as bibliotecas de acesso ao banco de dados Oracle.
banco de dados, ou ento, pode ser baixado atravs do site oficial No PostgreSQL, a configurao de server, user mapping e foreign
da Oracle o cliente de acesso ao banco de dados. Para este artigo, table realizada seguindo a mesma ideia que foi aplicada ao MyS-
est sendo utilizado um servidor que j contm o Oracle Database QL, com exceo de alguns parmetros, como a criao do server,
instalado, mas mesmo assim, o cliente de Oracle foi baixado e que difere no que diz respeito ao nome do parmetro que indica o
durante a exportao de variveis LD_LIBRARY_PATH e PATH, servidor (no MySQL era host, no Oracle chama-se dbserver), como
esse caminho do cliente foi informado (Listagem 8). Com esses mostra a Listagem 10. Para o oracle_fdw, tambm necessrio infor-
passos finalizados, a instalao ocorrer normalmente. mar um usurio do PostgreSQL na criao do user mapping. Para o
Aps os procedimentos realizados, a configurao do FDW MySQL esse acesso pode ser pblico, o que tambm possvel para
est pronta no servidor e necessrio criar a extenso dentro do o Oracle, mas necessrio indicar explicitamente essa permisso
PostgreSQL e todo o mapeamento dentro do banco de dados realizando um grant aos usurios ou perfis que tero acesso.
para se conectar ao Oracle Database. importante entender nesse
ponto o funcionamento das bibliotecas do PostgreSQL e do Oracle Utilizando o FDW
Database. comum que ocorram erros no que se refere a libs no O modelo de dados apresentado na Figura 2 contm trs tabelas
encontradas e na maioria dos casos isso se resolve com o export que foram criadas em bancos de dados separados, simulando uma
de PATH, LD_LIBRARY_PATH e o ORACLE_HOME, conforme situao em que a interao entre as tabelas necessria com exe-
mostra a Listagem 9. cuo de select, insert, update e delete, e utilizando join entre elas.

Edio 148 SQL Magazine 25


Integrao de dados com Foreign Data Wrappers

Os objetos contidos nesse modelo de dados so a tabela Client, para visualizao do contedo, em seguida, um join mostrando
presente em um banco de dados Oracle, tabela Project em um o campo Name de cada tabela e o id do Projeto. Dessa forma,
banco de dados MySQL e, por ltimo, a tabela Salesman criada no possvel visualizar como a execuo da query transparente para
PostgreSQL onde est configurado o FDW. A Tabela 1 apresenta o banco de dados, independente se os resultados so provenientes
os cdigos que foram utilizados para a criao das tabelas em de tabela estrangeira ou no.
seus respectivos bancos de dados. Por ltimo, foi realizada uma tentativa de update da tabela
O primeiro teste na Listagem 11 foi realizar join entre as tabe- Client, mas ocorre um erro informando que nessa tabela no h
las, utilizando a tabela Project para fazer o join com as tabelas chave primria. Por esse motivo, a tabela estrangeira foi removida
Client e Salesman. Primeiramente, foram listadas as trs tabelas (no PostgreSQL) e foi criada uma nova tabela estrangeira com o
parmetro OPTIONS (key true) no campo ID, indicando que o
Listagem 10. Criao de server e user mapping para o oracle_fdw campo em questo agora considerado uma chave. Feito isso, o
update passa a ser executado corretamente.
-bash-4.1$ psql
Assim como foi visualizado na Listagem 11 que para a exe-
psql (9.6.0, server 9.5.4)
Type help for help. cuo de um update necessria uma chave, para executar um
postgres=# CREATE SERVER oracle_server delete tambm h a necessidade de se ter uma chave primria.
FOREIGN DATA WRAPPER oracle_fdw Em nosso exemplo, a alterao ocorreu na tabela original no
OPTIONS (DBSERVER //127.0.0.1/oracle_database);
CREATE SERVER
banco de dados MySQL na tabela Project. Aps essa modifi-
postgres=# CREATE USER MAPPING FOR postgres_usuario cao da tabela na sua origem, a excluso foi realizada com
SERVER oracle_server sucesso. O mesmo procedimento tambm vale para o insert.
OPTIONS (USER oracle_usuario, PASSWORD oracle_senha);
Essas regras so importantes para que no haja perda de
CREATE USER MAPPING
postgres=# GRANT USAGE ON FOREIGN SERVER oracle_server TO postgres_usuario; performance na execuo desse tipo de alterao entre banco
GRANT de dados de origem e banco de dados PostgreSQL com FDW.
postgres=# CREATE FOREIGN TABLE oracle_table (id INT, campo CHAR(10)) A Listagem 12 mostra um exemplo de excluso de dados em
SERVER oracle_server OPTIONS (SCHEMA ORACLE_USUARIO, TABLE ORACLE_TABLE);
CREATE FOREIGN TABLE
tabela estrangeira no MySQL.
postgres=# \det Para finalizar os exemplos sobre a utilizao de FDW com ban-
List of foreign tables cos de dados Oracle, MySQL e PostgreSQL, os procedimentos da
Schema | Table | Server
Listagem 13 esto executando delete e insert na tabela Client do
-------------+-----------------+------------------
postgres | oracle_table | oracle_server banco de dados Oracle atravs do PostgreSQL e, aps as alteraes,
public | mysql_table | mysql_server realizado um acesso ao banco de dados Oracle para visualizar
(2 rows) se as alteraes foram aplicadas corretamente.

Erros comuns em configurao do FDW


Tabela Client Tabela Project Tabela Salesman Mesmo no sendo um processo complexo (a configurao do
create table Client create table Project create table Salesman FDW no sistema operacional e no banco de dados PostgreSQL), h
(idClient int, (idProject int, (idSalesman int,
determinados erros que no esto previstos em todos os ambientes
Name char(50)); idClient int, Name char(50));
e, por isso, importante um entendimento do que est ocorrendo
idSalesman int,
Name char(50));
para contornar o problema. A seguir so apresentados alguns
exemplos desses problemas:
Tabela 1. Scripts de criao de tabelas utilizados

Figura 2. Modelo de dados para testes de integrao dos dados

26 SQL Magazine Edio 148


Listagem 11. Executando query, join e update com tabelas estrangeiras Listagem 11. Executando query, join e update com tabelas estrangeiras

You are now connected to database postgres as user postgres_usuario. You are now connected to database postgres as user postgres_usuario.
postgres=> select * from project; postgres=> select * from project;
idproject | idclient | idsalesman | name idproject | idclient | idsalesman | name
-------------+----------+----------------+-------------- -------------+----------+----------------+--------------
1 | 1 | 1 | Armario 1 | 1 | 1 | Armario
2 | 2 | 2 | Cozinha 2 | 2 | 2 | Cozinha
3 | 8 | 2 | Rack 3 | 8 | 2 | Rack
[...] [...]
(10 rows) (10 rows)

postgres=> select * from salesman; postgres=> select * from salesman;


idsalesman | name idsalesman | name
----------------+-------------------- ----------------+--------------------
5 | Vendedor5 5 | Vendedor5
1 | Vendedor1 1 | Vendedor1
2 | Vendedor2 2 | Vendedor2
3 | Vendedor3 3 | Vendedor3
4 | Vendedor4 4 | Vendedor4
(5 rows) (5 rows)

postgres=> select * from client; postgres=> select * from client;


idclient | name idclient | name
----------+---------------------- ----------+----------------------
1 | Daniel 1 | Daniel
2 | Michele 2 | Michele
[...] [...]
8 | Daniela 8 | Daniela
9 | Joao 9 | Joao
10 | Pedro 10 | Pedro
(10 rows) (10 rows)

postgres=> select p.idproject, p.name, c.name, s.name from project p join client c postgres=> select p.idproject, p.name, c.name, s.name from project p join client c
on p.idclient = c.idclient join salesman s on p.idsalesman = s.idsalesman; on p.idclient = c.idclient join salesman s on p.idsalesman = s.idsalesman;
idproject | name | name | name idproject | name | name | name
-------------+------------------+-------------------+--------------------- -------------+------------------+-------------------+---------------------
1 | Armario | Daniel | Vendedor1 1 | Armario | Daniel | Vendedor1
6 | Escrivaninha | Michele | Vendedor5 6 | Escrivaninha | Michele | Vendedor5
2 | Cozinha | Michele | Vendedor2 2 | Cozinha | Michele | Vendedor2
5 | Mesa | Carlos | Vendedor1 5 | Mesa | Carlos | Vendedor1
[...] [...]
3 | Rack | Daniela | Vendedor2 3 | Rack | Daniela | Vendedor2
(10 rows) (10 rows)

postgres=> update client set name = Jorge where idclient=4; postgres=> update client set name = Jorge where idclient=4;
ERROR: no primary key column specified for foreign Oracle table ERROR: no primary key column specified for foreign Oracle table
DETAIL: For UPDATE or DELETE, at least one foreign table column must be marked DETAIL: For UPDATE or DELETE, at least one foreign table column must be marked
as primary key column. as primary key column.
HINT: Set the option key on the columns that belong to the primary key. HINT: Set the option key on the columns that belong to the primary key.
[...] [...]
postgres=> CREATE FOREIGN TABLE client (idClient int OPTIONS (key true), Name postgres=> CREATE FOREIGN TABLE client (idClient int OPTIONS (key true), Name
char(50)) char(50))
SERVER oracle_server SERVER oracle_server
OPTIONS (SCHEMA ORACLE_USUARIO, TABLE CLIENT); OPTIONS (SCHEMA ORACLE_USUARIO, TABLE CLIENT);
CREATE FOREIGN TABLE CREATE FOREIGN TABLE

postgres=> update client set name = Jorge where idclient=4; postgres=> update client set name = Jorge where idclient=4;
UPDATE 1 UPDATE 1
postgres=> select * from client; postgres=> select * from client;
idclient | name idclient | name
-----------+------------------------ -----------+------------------------
1 | Daniel 1 | Daniel
2 | Michele 2 | Michele
[...] [...]
(10 rows) (10 rows)

Edio 148 SQL Magazine 27


Integrao de dados com Foreign Data Wrappers

Listagem 12. Exemplo com excluso de dados em tabela estrangeira do MySQL ERROR: error connecting to Oracle: OCIEnvCreate failed to create
environment handle, esse erro ocorre no momento em que o Post-
postgres=> select p.idproject, p.name, c.name, s.name from project p join client c
on p.idclient = c.idclient join salesman s on p.idsalesman = s.idsalesman;
greSQL vai se conectar ao Oracle para ler a tabela, mesmo aps
idproject | name | name | name toda a configurao ter ocorrido corretamente. Motivo do erro:
-------------+-----------------+----------------------+---------------------- falta exportar a biblioteca do cliente Oracle. Para corrigir isso,
1 | Armario | Daniel | Vendedor1
utilize o mesmo procedimento informado para o erro a seguir;
6 | Escrivaninha | Michele | Vendedor5
[...] Mesmo aps exportar todas as bibliotecas, ocorrem erros de
10 | Balco | Daniela | Vendedor3 falta de arquivos de bibliotecas. Para correo, inclua o caminho
3 | Rack | Daniela | Vendedor2 da biblioteca do PostgreSQL, do cliente Oracle e do cliente MySQL
(10 rows)
no arquivo /etc/alternatives/pgsql-ld-conf e, aps as modifica-
postgres=> delete from project where idproject = 10; es, execute o comando ldconfig para o arquivo ser carregado
DELETE 1 em memria. Para essa modificao necessrio acesso com o
usurio root ou ter sudo para executar essa alterao. Os caminhos
postgres=> select p.idproject, p.name, c.name, s.name from project p join client c
on p.idclient = c.idclient join salesman s on p.idsalesman = s.idsalesman; includos para os exemplos deste artigo foram /usr/pgsql-9.5/lib/,
idproject | name | name | name /usr/lib/oracle/11.2/client64/lib e /usr/lib64/mysql, isso porque esto
------------+------------------+----------------+------------------ no diretrio padro de instalao. Verifique se a sua instalao
1 | Armario | Daniel | Vendedor1
est da mesma forma;
6 | Escrivaninha | Michele | Vendedor5
[...] Makefile:23: /usr/pgsql-9.5/lib/pgxs/src/makefiles/pgxs.mk: No such
3 | Rack | Daniela | Vendedor2 file or directory, essa mensagem acontece no primeiro passo da
(9 rows)
configurao do oracle_fdw, e ocorre porque ou o pacote post-
Listagem 13. Exemplo de excluso e insero de dados em tabela estrangeira do gresql95-devel no foi instalado ou ocorreu algum erro durante
Oracle a instalao;
postgres=> select * from client;
pg_config: Command not found: significa que necessrio exportar
idclient | name a biblioteca do PostgreSQL (no caso, o 9.5) que est no caminho
-----------+------------------
1 | Daniel
usr/pgsql-9.5/bin;
2 | Michele HINT: Set the option key on the columns that belong to the primary
3 | Carlos key: essa mensagem deixa claro que necessrio definir como
[...]
8 | Daniela chave primria a coluna em que se est tentando executar DML.
9 | Joao Defina qual coluna a chave primria da tabela estrangeira (de-
10 | Pedro
(10 rows) finir no PostgreSQL e no na tabela original);
postgres=> delete from client where idclient = 10; ERROR: Oracle table ORACLE_USUARIO.client for foreign
DELETE 1
postgres=> select * from client; table client does not exist or does not allow read access DETAIL: ORA-
idclient | name 00942: table or view does not exist HINT: Oracle table names are case
-----------+----------------
1 | Daniel
sensitive (normally all uppercase): esse erro bem comum no incio
2 | Michele de uma configurao de foreign table, o Oracle por default cria
3 | Carlos
as tabelas como maisculo, portanto, para pesquis-las atravs
[...]
9 | Joao do FDW, crie as tabelas estrangeiras definindo o schema e table
(9 rows) com maisculo;
postgres=> insert into client values (55,Lara);
INSERT 0 1 ERROR: first column of remote table must be unique for INSERT/
postgres=> select * from client; UPDATE/DELETE operation: indica que a primeira coluna da tabela
idclient | name
-----------+------------------ estrangeira precisa ter uma chave para que o mysql_fdw envie
1 | Daniel a solicitao de insert, update ou delete para o banco de dados
2 | Michele
[...] remoto. Nesse caso, diferente do oracle_fdw, a tabela que deve ser
55 | Lara modificada no prprio MySQL e no a tabela estrangeira no
(10 rows)
postgres=> \q
PostgreSQL.
[oracle@servidor]$ sqlplus oracle_usuario/oracle_senha
[...]
SQL> select * from client;
Pontos positivos na utilizao do FDW
IDCLIENT NAME Esse tipo de integrao do FDW entre SGBDs distintos auxilia
-------------- -------------------------------------------------- diversas atividades de um DBA e desenvolvedores, por exemplo,
1 Daniel
2 Michele migraes de banco de dados. possvel tambm executar proce-
[...] dimentos e ferramentas que s existem no PostgreSQL com dados
55 Lara
10 rows selected. originados de outros bancos, onde algumas ferramentas so pagas,
SQL> exit por exemplo, ou gerar de forma simplificada e automatizada a

28 SQL Magazine Edio 148


exportao de arquivos diretamente no sistema operacional em O FDW no atualiza alteraes de tabelas que aconteceram na
vrios formatos utilizando os diversos pacotes fdw disponveis origem, por exemplo, adio de colunas ou nomes, por esse motivo,
nos repositrios do PostgreSQL. caso tenha sido criada uma nova coluna em uma tabela externa
A consulta a dados legados de diversas aplicaes poderia ser que utilizada como tabela estrangeira no PostgreSQL, o correto
simplificada utilizando o FDW. Ao invs de diversos bancos de atualizar a tabela estrangeira com a recriao da mesma.
dados e aplicaes, possvel ter todos os dados centralizados em O FDW uma excelente alternativa de conexo entre banco de
um s banco de dados. Isso elimina latncia podendo inclusive, dados distintos, confivel, de fcil administrao, exige pouco
estarem todos os dados concentrados em uma nica interface de conhecimento do sistema operacional Linux para configurao
acesso. de repositrios, instalao de pacotes e exportao de variveis
Utilizar o FDW para coletar dados de webservices e twitter pode de bibliotecas, e conhecimento mnimo para a conexo no banco
ser uma tima alternativa para o negcio onde necessrio ter de dados PostgreSQL e realizar configurao do FDW. Contudo,
um histrico de comportamentos de clientes e opinies diversas o ideal que um profissional com conhecimento do negcio e do
que esto acontecendo em tempo real na internet. banco de dados realize essas atividades.
Outra alternativa de uso do FDW integrar dois bancos distin-
tos (Oracle e SQL Server, por exemplo) utilizando o PostgreSQL
como mediador para executar rotinas de migrao, de troca de Autor
informaes, ou at mesmo utilizar como um terceiro banco que
Paulo Singaretti
realiza um join entre dados de dois SGBDs externos e disponi-
psingaretti@gmail.com
biliza em uma terceira aplicao.
DBA no iFood, experincia de 10 anos em banco de dados, com
atuao em projetos, em desenvolvimento e administrao.
Pontos de ateno ao utilizar FDW Experincia com Oracle, SQL Server, PostgreSQL e Adabas.
As queries merecem uma ateno especial, principalmente quan-
do a pesquisa tem muitos filtros e joins. O FDW lida muito bem
com queries complexas, mas a utilizao de explain para analisar
Links:
como o PostgreSQL est tratando o envio da solicitao e como
o destino est recebendo importante antes da implementao [1] Foreign data wrappers (Wiki do PostgreSQL)
em produo. https://wiki.postgresql.org/wiki/Foreign_data_wrappers
Latncia pode ser um problema para o FDW. Dependendo da
forma como a infraestrutura est organizada, se est na nuvem e [2] Planeta PostgreSQL
https://planeta.postgresql.org.br
no est no mesmo datacenter, pode-se ter problemas de latncia
entre os bancos de dados. [3] Playing with FDW in PostgreSQL
Atualmente, so poucos os materiais disponveis sobre o FDW, http://kartoza.com/en/blog/playing-with-foreign-data-wrappers-in-postgresql
embora seja uma comunidade muito ativa do PostgreSQL. Eventu-
[4] GitHub Laurenz Albe - Projeto oracle_fdw
almente, pode ser complicado encontrar a soluo imediatamente https://github.com/laurenz/oracle_fdw
aps um determinado evento, mas o suporte da comunidade
PostgreSQL e dos desenvolvedores de FDW em fruns costumam [5] Why SQL/MED is cool
responder rpido sobre tentativas de soluo. http://rhaas.blogspot.com.br/2011/01/why-sqlmed-is-cool.html

Edio 148 SQL Magazine 29


Backups com RMAN
Soluo de backups centralizada com uso do
RMAN e scripts shell

P Fique por dentro


ara a grande maioria das organizaes, os da-
dos possuem um valor inestimvel. Nessa era
da informao, perdas de dados podem causar Uma das atividades mais importantes do Administrador de Banco de
grandes prejuzos e, no pior cenrio, podem at levar Dados (DBA) , sem dvidas, implementar uma estratgia e poltica de
ao encerramento de atividades de uma empresa. Mesmo backups eficiente e segura. Administrar e manter os backups de forma
quando nossos procedimentos nos permitem recuperar simples e centralizada, alm de minimizar riscos (da falta de backups),
os dados em caso de falhas, geralmente isso demanda traz muita agilidade ao DBA. Embora existam diversas ferramentas no
algum tempo de indisponibilidade, que tambm pode mercado que possam nos auxiliar nessa tarefa, quando trabalhamos
gerar prejuzos ao negcio. com Oracle, podemos construir rotinas de backup centralizadas de
Embora os sistemas gerenciadores de bancos de dados, forma simples, utilizando apenas recursos disponveis do prprio
como o Oracle, estejam bem consolidados e robustos, banco de dados e do sistema operacional. Neste artigo, introduziremos
nunca estaremos livres de falhas. Podem ocorrer erros conceitos bsicos de backup e depois apresentaremos uma estrutura
humanos, falhas nos equipamentos de hardware, danos de backup centralizada e muito bem organizada para facilitar o seu
integridade fsica de equipamentos (um incndio, por gerenciamento. Essa soluo foi testada e est em uso h meses na
exemplo), entre muitas outras possibilidades. empresa em que ns, autores deste artigo, trabalhamos.
Pelas razes expostas, na administrao de banco de
dados, uma das maiores responsabilidades do DBA
manter um plano de backup e disponibilidade apro- Na grande maioria dos ambientes, a poltica de backup, uma vez
priados necessidade da empresa. Isso demanda um en- definida, implementada para ocorrer em janelas especficas nos
tendimento do negcio, dos riscos existentes e de como horrios programados. Em ambientes com diversos servidores e
eles podem ser gerenciados. Desse modo, um sistema bancos de dados, construir e manter as rotinas de backup costuma
crtico normalmente demanda backups frequentes, com ser algo trabalhoso. Imagine, por exemplo, um ambiente com 100
manuteno de mdias de backup em locais seguros e bancos de dados em 10 servidores diferentes. Entrar em cada um
com mltiplas cpias. Esses ambientes crticos tambm deles diariamente para verificar o status dos backups pode ser
costumam demandar solues de alta disponibilidade uma tarefa rdua e que normalmente o DBA no ter tempo para
e de recuperao de desastres, como o Oracle Data fazer. Nesse caso, as rotinas de manuteno tambm podem ser
Guard, que permite ter uma cpia idntica do ambiente muito trabalhosas. Imagine se voc tiver 100 scripts de backup,
de produo (conhecida como banco de dados Standby) um para cada banco, e tiver que mudar, por exemplo, o caminho
em outra mquina para que essa cpia seja usada se o de destino dos backups. Alterar um por um no ser uma tarefa
primeiro banco de dados (banco primrio) falhar ou rpida e nem to pouco produtiva.
estiver inacessvel por algum motivo qualquer. Uma Por isso, em primeiro lugar, muito importante criar uma forma
das vantagens de se ter um ambiente com Data Guard de centralizar as rotinas de backup de modo que a manuteno
que voc pode fazer backup do banco de dados Standby e monitorao possam ser realizadas com maior facilidade e
(usando o recurso conhecido como Active Data Guard, agilidade. Existem algumas maneiras de se construir rotinas
que exige licenciamento parte), no onerando desse centralizadas, mas devemos sempre estar atentos a um princpio: a
modo o banco primrio. simplicidade. Na rea de TI, muito comum termos solues com
Sistemas ou ambientes menos crticos, tais como am- maior complexidade do que de fato necessrio. Embora muitas
bientes de desenvolvimento e homologao, permitem vezes essas solues at utilizem recursos interessantes, devemos
polticas de backups menos exigentes e que muitas vezes nos atentar ao fato de que, quanto mais complexa uma soluo,
possibilitam algum tempo de indisponibilidade. O equi- mais difcil a sua manuteno. Isso aumenta riscos, custos e pode
lbrio correto na definio da poltica de backups im- reduzir agilidade. Por isso, ser capaz de administrar os backups
portante, pois polticas mais robustas demandam maiores de uma forma simples e centralizada so fatores importantes para
esforos de gerenciamento, mais controle e acabam sendo ganhar tempo, facilitar a manuteno e minimizar riscos. Para
bem mais caras de se implementar e de se manter. apoiar a construo e gesto de rotinas de backup centralizadas,

30 SQL Magazine Edio 148


existem ferramentas disponveis no mercado, tais como Oracle os blocos vazios ou no utilizados arquivos de entrada, ficando
Secure Backup, Data Protector, Tivoli Storage Manager etc. Infeliz- desse modo, o backup com um tamanho normalmente bem menor
mente, nem sempre temos as licenas disponveis para uso delas, que o tamanho total do banco de dados.
ou as temos apenas para alguns ambientes. Felizmente, somente
com os recursos fornecidos pelo Oracle possvel montar uma Outro ponto importante a diferena entre backups para ban-
rotina de backups centralizada, simples e eficiente. Para gerenciar cos em modo ARCHIVE e em modo NOARCHIVE. No primeiro
os backups, a Oracle possui sua prpria ferramenta, chamada caso, podemos fazer backups " quente", ou seja, com o banco de
Recovery Manager (mais conhecida como RMAN). J para tratar dados no ar. J no segundo caso, precisamos deixar o banco de
a questo de agendamento das rotinas de backup necessrias, po- dados em modo MOUNT para fazer um backup com o banco de
demos contar com o Oracle Scheduler, uma ferramenta completa dados " frio", ou seja, indisponvel para acesso pelos usurios.
para execuo de jobs. Isso ocorre porque qualquer cpia com o banco de dados aberto
Neste artigo, iremos apresentar uma proposta com estrutura sim- resultar em uma cpia inconsistente, pois durante a gerao da
ples e centralizada para controlar procedimentos tpicos de backup, cpia de backup, os arquivos do banco de dados podero sofrer
utilizando apenas recursos disponveis no Oracle e no sistema alteraes devido s operaes de usurios. Quando o banco de
operacional. Primeiramente, apresentaremos uma introduo de dados est em modo ARCHIVE, existe nele os chamados archived
cada um dos recursos utilizados: RMAN, Oracle Scheduler e Oracle logs, que garantem a consistncia do backup junto ao estado do
Wallet, para depois apresentarmos a estrutura proposta. banco de dados no momento do incio do backup.

RMAN Estratgia de backups incrementais


Podemos utilizar ferramentas externas ou mesmo procedimentos No RMAN, podemos adotar uma poltica de realizao de
de cpia de arquivos para fazer backups de bancos de dados Ora- backups completos (full) do banco de dados, com uma determi-
cle. So os chamados backups no gerenciados. Embora possveis, nada frequncia (por exemplo, diariamente), ou de realizao de
a maneira mais eficiente de se fazer backups no Oracle, utilizan- backups incrementais, que pode reduzir o tamanho dos arquivos
do o RMAN, que uma ferramenta do amplamente utilizada para de backup e o tempo de gerao deles.
executar atividades de backup e recuperao de bancos de dados, Em uma estratgia incremental com o RMAN, temos dois tipos
provendo flexibilidade na configurao e execuo da poltica bsicos de backups:
de backups, bem como recursos indispensveis no processo de Backup incremental de nvel 0: um backup completo. Basica-
recuperao em caso de falhas. O RMAN utiliza processos chama- mente, semelhante ao backup full, com a diferena de que ele
dos channels (canais) para realizar suas operaes. Os channels permite a aplicao de backups incrementais de nvel 1 posterior-
so processos de servidor, como qualquer outro, mas destinados mente (algo que um backup full no permite);
exclusivamente para fazer a cpia de arquivos. Backup incremental de nvel 1: um backup que contm apenas
Quando utilizamos o RMAN, importante observarmos al- as diferenas em relao ao ltimo backup de nvel 0 ou de nvel
guns conceitos e terminologias. Dois deles, que s vezes causam 1, dependendo do tipo, que pode ser:
confuso, so os conceitos de backup total ou parcial, e backup - Diferencial: contm diferenas em relao ao ltimo backup
completo ou incremental: realizado, seja ele de nvel 0 ou 1.
Backup total ou parcial (whole or parcial): refere-se ao que - Cumulativo: contm todas as diferenas em relao ao ltimo
servir de entrada para o backup, ou seja, podemos fazer o backup backup de nvel 0 realizado. Ele desconsidera backups que no
de todo o banco de dados, ou podemos fazer o backup de partes sejam de nvel 0, portanto, ele sempre ir conter as diferenas
dele (no caso do Oracle, de tablespaces ou datafiles especficos); desde o ltimo 0, desconsiderando qualquer backup de nvel
Backup completo ou incremental (full or incremental): refere- 1 que foram realizados posteriormente.
-se aos arquivos de sada do backup. No backup completo temos
todo o contedo presente nos arquivos de sada (exceto blocos A Figura 1 ilustra a diferena entre uma estratgia de backups
vazios ou no utilizados se usamos Backup Set). J no caso de incremental diferencial e cumulativa.
backup incremental, temos apenas os blocos alterados desde o Havendo necessidade de recuperao, o ponto de partida sempre
ltimo backup realizado. um backup incremental de nvel 0. Na estratgia com backup
incremental diferencial, precisamos aplicar o backup de nvel 0
Outro conceito importante so os tipos de backup do RMAN, e depois cada backup de nvel 1, na sequncia, at o tempo de
que podem ser: recuperao desejado. J no caso de backup incremental cumula-
Image Copy: uma cpia exata do banco de dados, portanto, tivo, precisamos recuperar o backup de nvel 0 e apenas o ltimo
os arquivos de entrada so copiados byte a byte para os arquivos backup de nvel 1 realizado. Nos dois casos, se o banco de dados
de sada; estiver em modo ARCHIVE, tambm devem ser aplicados os AR-
Backup Set: uma estrutura lgica de dados que pode juntar CHIVES (archived logs) ou seus backups, posteriores ao ltimo
vrios arquivos de entrada em um s arquivo de sada, e que exclui backup incremental restaurado.

Edio 148 SQL Magazine 31


Alta performance com carga direta de dados

Channels: sendo os processos utilizados pelo RMAN para


Estratgia de Backup Incremental com nvel 1 diferencial realizar os backups, permitem configuraes tais como tipo
de dispositivo (disco ou fita), caminho onde sero gerados os
backups, configuraes de tamanho dos backups pieces, entre
Nvel 01
Diferencial
outras opes;
Nvel 01 Backup automtico do controlfile: indica se a cada backup
Diferencial
tambm ser gerado um backup do controlfile;
Nvel 01
Diferencial Dispositivo padro: indica se o padro para os backups ser
Nvel 00 disco ou fita.

DOM - 07/08 4 hs SEG - 08/08 4 hs TER - 09/08 4 hs QUA - 10/08 4 hs Existe uma srie de outras configuraes que podem ser defini-
das pelo RMAN. Muitas delas podem ser sobrescritas pelos seus
comandos. Por exemplo, podemos gravar os arquivos de sada
Estratgia de Backup Incremental com nvel 1 cumulativo
de um backup em dispositivo e caminho diferentes do que est
configurado, desde que coloquemos as instrues explicitamente
no comando.
Nvel 01 Diferencial

Nvel 01 Diferencial Scripts RMAN


Nvel 01 Uma das vantagens apresentadas para o uso de um catlogo do
Diferencial
RMAN a possibilidade de se armazenar scripts do RMAN, que
Nvel 00 podem ser escritos e armazenados previamente para executar
diversas tarefas. Isso ajuda em uma melhor organizao e geren-
DOM - 07/08 4 hs SEG - 08/08 4 hs TER - 09/08 4 hs QUA - 10/08 4 hs ciamento das nossas rotinas de backup.
Os scripts RMAN armazenados podem ser locais ou globais.
Figura 1. Backup diferencial e backup cumulativo Os scripts locais so especficos para um banco de dados e ficam
visveis e disponveis apenas quando estamos conectados a esse
Repositrio do RMAN banco de dados. J os scripts globais ficam disponveis para uso
O repositrio do RMAN armazena os metadados dos backups. em todos os bancos de dados registrados no catlogo do RMAN.
Ele contm as configuraes persistentes de backup (ex.: caminho Scripts do RMAN tambm podem receber parmetros, o que
padro de arquivos de backups), dados sobre os backups reali- faz bastante sentido quando queremos definir scripts reutiliz-
zados etc. O repositrio armazenado por padro no Controlfile veis (e certamente queremos isso quando estamos fazendo uma
do banco de dados alvo (aquele ao qual nos conectamos). Opcio- administrao centralizada dos backups).
nalmente, podemos usar tambm um catlogo do RMAN, que
mantm uma segunda cpia dos metadados e estende as suas Conceitos de expired e obsolete backups
capacidades, trazendo as seguintes vantagens: Dois conceitos importantes, mas que costumam ser confundidos
Possibilidade de manter informaes sobre os backups por entre si, so os de backup expirado e obsoleto. Um objeto est ex-
perodo indefinido (quando usamos apenas o Controlfile o valor pirado quando seus arquivos no so encontrados fisicamente em
mximo de 365 dias); disco ou fita. O fato sinalizado quando executamos o comando
Ter um repositrio central para manter informaes e gerenciar CROSSCHECK via RMAN. Esse comando faz a validao dos
Backups para diversos bancos de dados; objetos, mas no remove as entradas do RMAN. Isso deve ser
Possibilidade de armazenar scripts do RMAN, que nos ajudam feito depois atravs do comando DELETE EXPIRED.
a criar rotinas padronizadas e que podem ser reutilizadas para O conceito de obsoleto est relacionado poltica de reteno
diversos bancos de dados. de backups, ou seja, backups obsoletos so aqueles que no so
mais necessrios para atender aos requisitos de reteno (con-
Configuraes do RMAN figurados atravs de parmetros ou comandos). Por exemplo, se
O RMAN possui diversas configuraes persistentes para o estamos trabalhando com uma poltica de reteno que usa uma
ambiente de backup. As configuraes so feitas no banco de janela de dois dias, devemos ser capazes de restaurar o banco
dados, ficam armazenadas no controlfile, e tambm no catlogo de dados para qualquer ponto da hora atual at dois dias atrs.
do RMAN, caso ele esteja sendo utilizado. Elas nos permitem Qualquer backup necessrio para fazer essa restaurao deve
definir itens como: ser mantido, enquanto que, os backups no necessrios so con-
Poltica de reteno dos backups: podem ser definidas para siderados obsoletos e podem ser removidos atravs do comando
uma janela de tempo (ltimos sete dias, por exemplo), ou para DELETE OBSOLETE. Para explicar melhor esse conceito, veja o
um total de redundncia (manter dois backups, por exemplo); exemplo da Figura 2.

32 SQL Magazine Edio 148


Poltica de reteno: janelas de 3 dias

Nvel Nvel Nvel Nvel Nvel Nvel Nvel Nvel Nvel Nvel Nvel Nvel
01 01 01 01 01 01 01 01 01 01 01 01

Nvel Nvel
00 00
04 hs 04 hs 04 hs 04 hs 04 hs 04 hs 04 hs 04 hs 04 hs 04 hs 04 hs 04 hs 04 hs 04 hs
DOM SEG TER QUA QUI SEX SAB DOM SEG TER QUA QUI SEX SAB
07/08 08/08 09/08 10/08 11/08 12/08 13/08 14/08 15/08 16/08 17/08 18/08 19/08 20/08

Janela de reteno (3 dias)

Janela de reteno (3 dias)

SEX 19/08
TER 16/08
Backups de 07/08 at
No temos backups
13/08 esto obsoletos.
obsoletos

Figura 2. Backups obsoletos

Nesse exemplo trabalhamos com uma poltica de reteno de O Scheduler possui uma srie de objetos, que nos fornecem
trs dias, o que significa que precisamos garantir que podemos inmeras possibilidades para execuo de rotinas automatizadas.
restaurar um backup para qualquer ponto dentro desta janela. O objeto mais bsico o Job, atravs do qual podemos executar
Dessa forma, se estamos no dia 16/08, uma tera, devemos ser uma ao em uma frequncia programada, configurando-o como
capazes de restaurar o banco em um ponto at trs dias antes, Job autocontido (self contained job). Tambm podemos definir
o que nos coloca na data de 13/08. Para uma restaurao nessa estruturas mais complexas atravs do uso de outros tipos de
data, dependemos do backup incremental de nvel 0 do dia objetos, tais como:
07/08, e de todos os incrementais at a data em que precisamos Program: uma camada de abstrao entre um Job e a ao que
fazer a restaurao. Nesse cenrio no temos nenhum backup ele deve executar. Uma de suas vantagens que ele pode ser re-
considerado obsoleto. aproveitado, portanto, til em aes que podem se repetir em
Porm, se avanamos mais alguns dias e usarmos como refe- diversos Jobs ou em diversos momentos;
rncia a quinta-feira, dia 18/08, nossa janela de reteno de 3 dias Schedules: definem quando e com que frequncia ocorre a
nos remete 15/08. Para restaurar um backup dentro dessa janela, execuo de um Job. Da mesma maneira que acontece com um
precisamos do backup incremental de nvel 0 do domingo, 14/08. Program, til quando a queremos reutilizar algo, nesse caso,
Todos os backups anteriores a essa data no so mais necessrios uma agenda de execues de Jobs;
e, por essa razo, so considerados obsoletos. Chain: define uma srie de programs com dependncia de exe-
A remoo de backups obsoletos importante para evitar o cuo entre si, criando um Workflow (fluxo de trabalho) entre eles.
consumo desnecessrio de espao em disco para armazenar composta por passos (Steps) e contm sequncia de execues
os arquivos de backup. Esse procedimento pode ser realizado controlada por regras (rules).
manualmente, ou automatizado, atravs de Jobs, ou atravs do
uso da Fast Recovery Area (FRA), recurso disponvel com tama- Shell Script Linux
nho predefinido em que o Oracle remove automaticamente os O termo Shell descreve uma camada intermediria entre o usu-
backups obsoletos quando precisar de mais espao para gerar rio e o kernel do sistema operacional. , dessa forma, um meio
novos backups. atravs do qual o usurio pode interagir com o kernel. No caso
de nosso exemplo, estamos usando o sistema operacional Linux.
Scheduler Nele, um dos mais conhecidos Shell o interpretador de coman-
Scheduler um recurso do Oracle que permite automatizar a dos conhecido como bash, que permite a execuo de diversos
execuo de Jobs (tarefas). um recurso verstil, que permite comandos do Linux, que podem ser digitados diretamente em um
tanto a execuo de procedures e scripts PL/SQL quanto a exe- utilitrio de linha de comandos ou atravs de scripts. Os Scripts
cuo de cdigo externo, como executveis ou scripts do sistema Shell, como assim so chamados, so nada mais do que arquivos
operacional. texto contendo comandos shell.

Edio 148 SQL Magazine 33


Alta performance com carga direta de dados

Shell Scripts so, dessa forma, muito teis na automao de ta- localizado o schema utilizado para o catlogo do RMAN, que
refas. Eles podem ser editados em qualquer editor de textos, mas contm alm dos metadados de backups, os objetos de Scheduler
muito comum usarmos no Linux o VI, um editor nativo desse Jobs necessrios para o nosso ambiente.
sistema operacional, que pode ser executado a partir da linha de Trabalharemos com quatro linhas de execuo, uma para cada
comandos. Para serem executados, os arquivos de Shell Scripts categoria de tarefa necessria em nossas rotinas de backup, clas-
precisam de permisso de execuo, que pode ser definida atravs sificadas da seguinte forma:
do comando chmod. Backup incremental nvel 0;
O Scheduler permite que um Job ou Program execute um Shell Backup incremental nvel 1, diferencial;
Script. Para que isso ocorra, seu tipo deve ser definido como Backup de archives (apenas para bancos de dados em modo
EXECUTABLE. ARCHIVE);
Remoo dos backups obsoletos, de acordo com a poltica de
Descrio do cenrio de exemplo reteno.
Para apresentar a nossa proposta, iremos adotar um cenrio
de exemplo composto por quatro bancos de dados distribudos Essas categorias tero uma estrutura de execuo semelhante,
em trs mquinas servidoras diferentes, conforme apresentado com variaes apenas nos comandos executados no RMAN (atra-
na Tabela 1. vs de scripts globais) e mais algumas variaes em parmetros,
de acordo com a necessidade. Nos exemplos dessa proposta,
Mquina Banco de Dados Archive Mode iremos apresentar uma estratgia de backup incremental nvel 0.
HOST_1 BDPROD ARCHIVE As demais linhas de execuo seguem o mesmo procedimento.
HOST_2 BDHOMOLOG ARCHIVE Um ponto importante que a estrutura construda segue sempre
HOST_3 BDDESENV NOARCHIVE o requisito de simplificar o processo, devendo manter cdigos
fceis de ler e de manter.
HOST_2 BDAPOIO ARCHIVE
A sequncia bsica de um backup comea com o Scheduler Job
Tabela 1. Cenrio de exemplo entrando em execuo na data e horrio programados. Ao entrar em
execuo, o Job aciona um Shell Script Linux, chamado de orques-
Observe que nesse cenrio temos trs bancos de dados em modo trador, e que contm uma linha para cada banco de dados que ter
ARCHIVE e um banco de dados em modo NOARCHIVE. Faremos um backup. Dessa forma, em cada linha um segundo Shell Script
os backups em disco, mas com as devidas alteraes, a mesma aciona o RMAN, executando a rotina de backup atravs de um
estrutura poderia ser configurada para fazer os backups em fita. Script global do RMAN. Essa sequncia demonstrada na Figura 3.
Nesse cenrio iremos adotar uma estratgia de backups in- A seguir faremos a descrio de cada uma das etapas apresentadas
cremental, com um backup incremental de nvel 0 por semana nessa figura, que sero descritas na ordem mais natural para sua
(aos domingos), seguido de backups incrementais de nvel 1, construo, que comea pelos scripts globais do RMAN, passa para
diferenciais, de segunda a sbado. Os bancos de dados em modo os Shell Scripts e termina na criao do Scheduler Job.
ARCHIVE tambm tero backup de archives no decorrer do dia.
RMAN Script
Pr-requisitos Os scripts globais do RMAN so genricos e serviro para fazer
Nesse exemplo, usamos o Linux Red Hat 5. Os Scripts Shell o backup de diversos bancos de dados. Eles esto localizados no
adotados usam recursos bem padronizados, mas eventualmente item 4 da Figura 3 e, nesse exemplo, eles recebem dois parmetros:
uma verso diferente de Linux pode exigir algum ajuste. A verso &1: o SID para o banco de dados que ter o backup realizado;
do Oracle usada a 11.2.0.4, sendo que os scripts adotados foram &2: diretrio base onde o backup ser realizado.
testados na verso 11GR2. Tambm funcionam em Oracle 12c,
embora possam exigir adaptaes, especialmente em ambiente Observe nas Listagens 1 e 2 que criamos dois scripts distintos: um
multi-tenant, se quisermos adotar polticas diferentes para cada para os backups em modo ARCHIVE e outro para backups em modo
Pluggable Database (PDB). O Oracle 12c tambm demandar um NOARCHIVE. Essa separao existe porque os procedimentos de
catlogo RMAN compatvel com ele. possvel trabalhar em um backup os dois casos so diferentes, pois em modo ARCHIVE pode-
ambiente com bancos de dados nas verses 11G e 12c, mas nesse mos fazer backup quente e em modo NOARCHIVE no. A seleo
caso, o catlogo do RMAN deve estar compatvel com o 12c e os entre os modos feita a partir do Shell Script de acionamento do
comandos do RMAN devem ser compatveis com a verso 12c. RMAN (item 3 da Figura 3), como veremos adiante.
Nessas listagens, a linha 2 adiciona um comentrio para descre-
Estrutura proposta v-los, prtica recomendada para facilitar manuteno e organi-
Na estrutura que iremos propor, os backups so disparados a zao do ambiente. Observe que no comando de backup (linha 4
partir de uma nica mquina (HOST_2) e de um banco de dados na Listagem 1 e linha 6 na Listagem 2) utilizamos o parmetro
instalado nessa mquina (BDAPOIO). Nesse banco de dados est "format" para definir caminho e nome para os arquivos de sada.

34 SQL Magazine Edio 148


O caminho formado de acordo com 1. Scheduler
os parmetros recebidos pelo script.
Job
Por exemplo, se os parmetros forem:
&1 (SID) = BDPROD; Job type: Executable
&2 (diretrio base) = /backup;

Contm uma linha para cada 2. > Shell Script


Teremos: banco de dados Orquestrador
Format /backup/BDPROD/incr/
bkpincr00_%d_%s_%p
Parmetros:
SID
Archive Mode: ARCHIVE | NOARCHIVE
O nome dos arquivos de sada recebe Base backup path
tambm alguns parmetros que so
variveis de substituio do RMAN. Conecta-se ao RMAN, no banco alvo
3. > Shell Script
e no catlogo.
Aqui, utilizamos "%d" (nome do banco Usa Oracle Wallet para proteger Acionamento
senha.
de dados), "%s" (nmero do backupset) Aciona Scripts RMAN armazenados RMAN
e "%p" (nmero do backup piece). Para no catlogo.
Parmetros:
mais informaes sobre eles consulte SID
a seo de links ao final deste artigo. Base backup path

Ainda sobre o comando de backup,


nesse cenrio, utilizamos o parmetro
Executa um ou outro de acordo com
"skip offline", que ir excluir do backup o parmetro Archive Mode
arquivos de dados que estejam off-line.
Tambm possvel excluir arquivos
4. RMAN Script 4. RMAN Script
Modo Modo
inacessveis ou em modo somente ARCHIVE NO ARCHIVE
leitura. Muitas vezes optamos por
Figura 3. Sequncia da estrutura de backup
excluir esses arquivos do backup por-
que sabemos que eles no possuem
alteraes e no queremos aumentar consumo de tempo e espao Listagem 1. Comandos para criao dos scripts globais do RMAN (modo ARCHI-
fazendo backup frequente deles. Entretanto, um ponto de ateno VE).

quando usamos essas opes que se excluirmos esses arquivos 1 Create global script BACKUP_INCR00_MODE_ARCHIVE
do backup, caso tenhamos que fazer uma recuperao completa ou 2 comment Script para gerar backup incremental level 0 em modo ARCHIVE
que dependa desses arquivos, teremos que recorrer a backups mais 3 {
4 backup incremental level 0 skip offline
antigos, que contenham eles, e isso pode dar bastante trabalho (se 5 format &2/&1/incr/bkpincr00_%d_%s_%p tag bkp_incr00_&1
ainda existir algum backup deles). Esses backups geralmente esto 6 (database include current controlfile);
7 exit;
em mdia mais lenta (fita), o que tende a aumentar nosso tempo
8 }
de recuperao. Nesses casos, necessrio ter um controle maior
sobre o tempo de armazenamento das fitas de backup para saber Listagem 2. Comandos para criao dos scripts globais do RMAN (modo NO
ARCHIVE).
exatamente em qual backup esto esses arquivos, ou fazer consultas
no catlogo do RMAN para poder localiz-los. 1 Create global script BACKUP_INCR00_MODE_NOARCHIVE
2 comment Script para gerar backup incremental level 0 em modo NOARCHIVE
3 {
Shell Script de acionamento RMAN 4 shutdown immediate;
Esse Shell Script o item 3 da estrutura apresentada na Figura 3, 5 startup mount;
e tem como principal funo fazer a chamada de scripts do RMAN 6 backup incremental level 0 skip offline
7 format &2/&1/incr/bkpincr00_%d_%s_%p tag bkp_incr00_&1
(aqueles que apresentamos no item 4 dessa mesma figura). Em ge- 8 (database include current controlfile);
ral, uma vez construdo, ele no precisar receber ajustes quando 9 alter database open;
10 exit;
quisermos incluir, alterar ou excluir bancos de dados nos backups,
11 }
pois ele totalmente parametrizado (a manuteno acontece no
Shell Script Orquestrador, como veremos adiante). Esse Shell Script
recebe os seguintes parmetros: Observe que o valor parmetro $2 determina qual script do
$1: SID, identificador da instncia de banco de dados; RMAN ser chamado. O parmetro inserido na composio do
$2: modo de archive do banco, devendo ser ARCHIVE ou NO- nome do script RMAN acionado. Assim, se estamos em um banco
ARCHIVE; de dados configurado em modo ARCHIVE, como o BDPROD de
$3: caminho base para o local de backup. nosso exemplo, o parmetro $2 receber o valor ARCHIVE, que

Edio 148 SQL Magazine 35


Alta performance com carga direta de dados

quando substitudo na linha 11 da Listagem 3 resultar na cha- backupeado. Todas essas linhas chamam o Shell Script de aciona-
mada ao Script BACKUP_INCR00_MODE_ARCHIVE. mento do RMAN (item 3 da Figura 3, apresentado anteriormente)
Outro ponto importante a conexo do RMAN com o banco de passando valores diferentes para trs parmetros:
dados alvo e com o catlogo RMAN. Observe as linhas 9 e 10 da 1 parmetro: o SID para o banco de dados alvo;
Listagem 3. Na linha 9, se estamos nos conectando ao BDPROD, 2 parmetro: indicador do modo de ARCHIVE, que pode ser
o parmetro $1, que o SID, ser substitudo, o que resultar em: ARCHIVE ou NOARCHIVE. Obviamente, ele dever estar de
acordo com a configurao do banco de dados definido pelo SID;
connect target /@rman_BDPROD 3 parmetro: o caminho base para o local do backup em disco.
Vale ressaltar que o backup fsico dever ocorrer em um local
conhecido e acessvel pela mquina de destino. Pode ser um
Listagem 3. Contedo do arquivo Shell Script de acionamento do RMAN:
BACKUP_INCR00.sh. armazenamento local, ou at mesmo um local em rede, definido
como um ponto de montagem na mquina alvo.
1 #!/bin/sh
2 export ORACLE_BASE=/home/oracle/product
3 export ORACLE_HOME=/home/oracle/product/11.2.0.4 Na Listagem 4 temos um exemplo de contedo para o arquivo
4 export ORACLE_PATH=$ORACLE_HOME/bin Shell Script Orquestrador, que possui uma linha para realizar o
5 export PATH=.:$PATH:$ORACLE_HOME/bin
6 export ORACLE_SID=BDAPOIO backup de cada um de nossos bancos de dados. O script chamado
7 data=`date +%Y%m%d%H%M` sempre o mesmo (BACKUP_INCR00.sh, item 3 da Figura 3),
8 $ORACLE_HOME/bin/rman log = /dba/backup/scripts/bkp_$1_$data.log
porm com valores diferentes para seus parmetros, indicando o
<< ENDRMAN
9 connect target /@rman_$1 SID, archive mode e caminho base para gravar o backup.
10 connect catalog /@rman
11 run { execute script BACKUP_INCR00_MODE_$2 using $1 $3; }
12 exit Listagem 4. Contedo do arquivo Shell Script Orquestrador: BACKUP_INCR00_
13 ENDRMAN ALL.sh.

1 #!/bin/sh
2 /dba/backup/scripts/BACKUP_INCR00.sh BDPROD ARCHIVE /backup &
Nessa forma de conectar, rman_BDPROD uma entrada do TNS- 3 /dba/backup/scripts/BACKUP_INCR00.sh BDHOMOLOG ARCHIVE /backup &
4 /dba/backup/scripts/BACKUP_INCR00.sh BDDESENV NOARCHIVE /backup &
NAMES e o "/@" que o antecede uma forma usada pelo Oracle 5 /dba/backup/scripts/BACKUP_INCR00.sh BDAPOIO ARCHIVE /backup &
Secure Password Store para evitar exposio direta do password,
cuja forma de configurar ser vista mais adiante. Procedimento
semelhante adotado na linha 10 para nos conectarmos ao ca- O Script Orquestrador muito importante, pois o ponto
tlogo do RMAN. Os parmetros $1 e $3 so passados tambm principal onde podemos realizar manutenes futuras, visando
ao script do RMAN, conforme podemos observar na linha 11 da acrescentar backups de novos bancos de dados. Por exemplo, se
Listagem 3, atravs da palavra chave "using". desejamos incluir um novo banco de dados nas rotinas de backup,
Nesse script, ajustamos variveis de ambiente do Linux usadas devemos incluir uma nova linha para esse banco de dados nesse
pelo Oracle entre as linhas 2 e 6. Na linha 7, definimos uma vari- script. No final de cada linha acrescentamos o caractere & para
vel Shell Script para armazenar a data. Utilizamos essa varivel permitir que o processo de execuo de backup de cada banco de
na linha seguinte (linha 8), quando definimos o nome do arquivo dados seja executado assincronamente e, desse modo, tambm
onde o RMAN dever gravar o log de execuo. importante ter- paralelamente. Se desejar que os backups sejam executados um
mos a data no arquivo de log para podermos localiz-lo facilmente por vez, em sequncia, exclua esse caractere do final de cada linha.
caso precisemos futuramente consult-lo.
Observe, ainda na linha 8, a chamada ao utilitrio do RMAN. Oracle Scheduler Job
Nele temos um trecho de comandos que so redirecionados do O item 1 da Figura 3 um Job do Scheduler do Oracle, que ser
Shell Script para o RMAN, atravs da notao <<. As tags ENDR- acionado em um horrio programado. Sendo do tipo executvel,
MAN (presentes nas linhas 8 e 13) delimitam o incio e fim do ele pode chamar um Shell Script do sistema operacional Linux,
trecho de comandos que so redirecionados. que nesse caso ser o Shell Script Orquestrador. Na Listagem 5
Nos comandos redirecionados ao RMAN, primeiro ocorre a temos um exemplo de cdigo para criao do Job.
conexo com o banco de dados alvo (linha 9), depois com o banco A criao de Jobs e outros objetos do Scheduler feita pela pa-
de dados do catlogo (linha 10). Por fim, acionado o script global ckage DBMS_SCHEDULER. Vale ressaltar que quando criamos
do RMAN, que ir realizar o backup. um Job, por padro ele fica desabilitado. Por isso devemos incluir
o parmetro "enabled = true" ao cri-lo, ou alterar esse parme-
Shell Script Orquestrador tro posteriormente, atravs da procedure DBMS_SCHEDULER.
Esse Shell Script do Linux, que na Figura 3 o item 2, ser cha- ENABLE.
mado pelo Scheduler Job e ter o nome BACKUP_INCR00_ALL.sh. Outro parmetro a ser observado aquele que define a frequ-
Ele dever possuir uma linha para cada banco de dados que ser ncia de execuo do Job (repeat_interval).

36 SQL Magazine Edio 148


Listagem 5. Comandos para criao do Scheduler Job. para este usurio. O usurio dono do catlogo dever ter a role
RECOVERY_CATALOG_OWNER. Feito isso, deve-se conectar
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
ao catlogo do RMAN usando esse usurio e ento executar o
job_name => RMAN.SCH_JOB_BKP_INCR00, comando CREATE CATALOG.
job_type => EXECUTABLE, O segundo passo definir a conectividade aos bancos de dados
job_action => /dba/backup/scripts/BACKUP_INCR00_ALL.sh,
start_date => to_timestamp_tz(07/08/2016 05:00:00 -03:00, alvo. Assumindo aqui que as devidas configuraes no sistema
dd/mm/yyyy hh24:mi:ss TZR), operacional j existam, temos que criar as entradas no TNSNA-
repeat_interval => FREQ=WEEKLY;BYDAY=SUN;BYHOUR=5; MES. Para o nome das entradas, utilizamos o padro RMAN_[SID].
BYMINUTE=0;BYSECOND=0,
auto_drop => FALSE, Por exemplo, para o BDPROD, a entrada no TNSNAMES ter o
enabled => TRUE, nome RMAN_BDPROD. A definio do padro importante
comments => Backup incremental level 0 - Dom, 5hs);
para que possamos trabalhar com os parmetros. Assim, quan-
END;
/ do estamos no script BACKUP_INCR00.sh, que recebe o SID do
banco alvo como um dos valores parametrizados, temos a linha
"connect target /@rman_$1", que far a conexo com o RMAN.
Existe uma notao prpria para informar a frequncia (para Usando o valor desse parmetro, o resultado dessa linha ser:
maiores detalhes consultar seo links ao final do artigo), aqui connect target /@rman_BDPROD, sendo rman_PROD o nome
utilizamos a execuo semanal (FREQ=WEEKLY), aos domingos presente no TNSNAMES. Dessa forma, em nosso exemplo teremos
(BYDAY=SUN), s 5h da manh (BYHOUR=5;BYMINUTE=0;BYS os seguintes alias cadastrados no TNSNAMES: RMAN_BDPROD,
ECOND=0). Vale ressaltar que se no informarmos hora, minuto RMAN_BDHOMOLOG, RMAN_BDDESENV e RMAN_BDA-
e segundos para execuo, sero usados os valores especificados POIO. Alm dos bancos de dados alvo, iremos criar tambm,
no parmetro "start_date". Por exemplo, se rodamos o comando de no TNSNAMES, um alias para nos conectarmos ao catlogo do
criao do Job com "start_date = systimestamp" (funo que obter RMAN. Em nosso exemplo, chamamos esse alias de RMAN. Na
data e hora atuais do sistema) e com "repeat_interval=FREQ= Listagem 6 temos exemplos de entradas no TNSNAMES para os
WEEKLY;BYDAY=SUN;BYHOUR=5" (omitindo minutos e segun- bancos de dados do catlogo e BDPROD.
dos), e a hora do sistema atual , por exemplo, 10hs16min15seg,
nosso Job executar sempre s 5hs16min15s. Por esse motivo re- Listagem 6. Entradas do TNSNAMES para os bancos de dados BDAPOIO e BD-
PROD.
comendvel sempre informar todos os valores no repeat_interval,
ou colocar uma data de incio de forma explcita, como fizemos RMAN =
anteriormente. Isso tambm deixa o Job mais organizado. (DESCRIPTION=
(ADDRESS_LIST=
Observe tambm que nesse Job no definimos data de fim (end_ (ADDRESS=
date), de forma que ele executar indefinidamente, a menos que os (PROTOCOL=tcp)
parmetros "max_runs" ou "max_failures" estejam definidos. Existe (HOST=HOST_2)
(port=1521)
tambm o parmetro "auto_drop". Se esse parmetro for TRUE, o )
Job automaticamente removido quando for considerado completo )
(CONNECT_DATA=(SERVICE_NAME=BDAPOIO)
ou quando for automaticamente desabilitado. O Job considerado
)
completo quando ultrapassou a data de fim (end_date), quando )
executou pelo nmero mximo de vezes definido (max_runs),
RMAN_BDPROD =
ou quando no um Job cclico e j executou alguma vez. O Job
(DESCRIPTION=
desabilitado automaticamente se ele alcanar o nmero mximo (ADDRESS_LIST=
de falhas (max_failures). Dadas as condies, isso no teria efeito (ADDRESS=
(PROTOCOL=tcp)
sobre o Job desse exemplo, j que ele no tem nenhuma condio (HOST=HOST_1)
que levaria remoo automtica do Job. Mesmo assim, optamos (port=1521)
por deixar o parmetro explcito, para exemplificar seu uso, j que )
)
ele relevante na criao e manuteno de Jobs. (CONNECT_DATA=(SERVICE_NAME=BDPROD)
Por fim, uma boa prtica sempre acrescentar um comentrio )
para o Job (parmetro comment), para deixar o ambiente mais )

organizado e permitir que outros DBAs saibam exatamente do


que se trata esse Job. O segundo passo consiste em criar um usurio para conexo
ao RMAN em cada banco de dados alvo. Esse usurio deve ter
Colocando em prtica privilgio de SYSDBA. O terceiro passo um ponto importante
O primeiro passo criar o catlogo para o RMAN, se ele j no para nos conectamos ao banco de dados alvo. Estando ele em ou-
existir. Para isso, deve-se criar um usurio para ser o dono do ca- tra mquina, normalmente nos conectaramos com um comando
tlogo. Recomenda-se tambm que exista um tablespace dedicado como: connect rman/senha@rman_PROD; porm, j que estamos

Edio 148 SQL Magazine 37


Alta performance com carga direta de dados

usando scripts, no queremos deixar uma senha exposta dentro nossos bancos de dados no RMAN, o que feito conectando-se ao
de um arquivo de script. Se estivermos trabalhando com autenti- RMAN e ao catlogo, e executando o comando REGISTER DATA-
cao externa, esse problema j estar resolvido. Porm, caso esse BASE. Aps executar esse procedimento em todos os bancos de
no seja o cenrio, podemos contornar esse problema usando um dados alvo, devemos criar os scripts globais do RMAN, conforme
recurso do Oracle chamado Secure External Password Store, que exemplos prvios. Para cri-los, pode-se conectar ao BDAPOIO
permite manter credenciais protegidas, de forma que podemos nos e ao catlogo. Os scripts, por serem globais, ficaro disponveis
conectar a um banco de dados sem precisar expor nossa senha. tambm para os demais bancos de dados alvo.
Para configurar esse recurso, usaremos o utilitrio mkstore,
via linha de comando, que pode ser encontrado na pasta bin Listagem 7. Configurando o arquivo sqlnet.ora.
do diretrio ORACLE_HOME. O primeiro passo criar uma
carteira, ou Oracle Wallet. Em nosso exemplo, isso feito com o SQLNET.WALLET_OVERRIDE = TRUE

comando a seguir: WALLET_LOCATION =


(SOURCE =
Mkstore -wrl /home/oracle/product/11.2.0.4/wallet -create (METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /ORABASE/11gR2/WALLET)
Aqui criamos um diretrio wallet dentro do caminho de ins- )
)
talao do Oracle e definimos esse caminho para o primeiro
parmetro, que o diretrio onde ficar localizado o Oracle
Wallet. O segundo parmetro indica que estamos criando uma Depois de criar os scripts do RMAN, os Shell Scripts devem ser
nova Wallet. Nesse processo, precisaremos definir uma senha criados seguindo os exemplos apresentados. Aqui, importante
para a nova Wallet, que sempre ser solicitada a cada alterao observar se os diretrios e arquivos criados esto com as devidas
que realizarmos nela. Dica: Guarde esta senha em um local seguro. permisses, principalmente permisses de execuo. Caso pre-
Feito isso, o prximo passo criar as credenciais necessrias cise ajustar as permisses, utilize o comando chmod do Linux.
dentro da Wallet recm-criada, conforme o cdigo: Por fim, crie o Scheduler Job no Oracle definindo a frequncia de
execuo adequada.
Mkstore -wrl /home/oracle/product/11.2.0.4/wallet -createCredential rman_BDPROD
rman senha. Algumas consideraes sobre simplificar
A soluo que acabamos de apresentar pode ser construda
Nesse comando, devemos informar o caminho para o local onde com diversas variaes, porm o que buscamos aqui foi a
est a Wallet e, aps o comando -createCredencial, os seguintes simplicidade. Por isso, evitamos longos trechos de cdigo, ou
valores: muitos cdigos que possuem pontos de deciso dentro dele.
O alias para o banco de dados no TNSNAMES; Desse modo, acreditamos que o entendimento e a manuteno
O usurio que ir se conectar ao RMAN neste banco de dados; do cdigo fiquem mais fceis.
A senha desse usurio. Poderamos, por exemplo, ter feito a chamada ao backup de
cada banco de dados como um passo (Step) dentro de uma cadeia
Nota de execuo no Job, utilizando os conceitos de Scheduler Chain.
Entretanto, isso torna a manuteno mais difcil. Acrescentar um
Ao executar o comando, ser solicitada a senha da Wallet, que foi definida no momento de sua
novo backup iria requerer acrescentar um novo passo e reconfigu-
criao.
rar as regras de execuo desses passos. Algo bem mais complexo
do que simplesmente acrescentar uma nova linha em um arquivo,
Devemos repetir o comando apresentado para os demais bancos como em nosso exemplo, no Shell Script Orquestrador.
de dados aos quais iremos nos conectar, que em nosso exemplo
so: BDHOMOLOG, BDDESENV e BDAPOIO. Alm disso, Demais linhas de execuo
colocamos aqui tambm um usurio e senha para o catlogo Em nosso exemplo, apresentamos a linha de execuo para o ba-
do RMAN. Em nosso exemplo esse usurio chama-se RMAN ckup incremental de nvel 0. As demais linhas de execuo seguem
e seu alias no TNSNAMES tambm RMAN, apontando para os mesmos princpios. Todas os artefatos so muito semelhantes
o BDAPOIO. para o Scheduler e os Shell Scripts. As maiores diferenas estaro
Por fim, devemos configurar o arquivo sqlnet.ora, alterando o nos scripts globais do RMAN. O script do backup incremental de
parmetro SQLNET.WALLET_OVERRIDE para TRUE e acres- nvel 1 muito parecido com o de nvel 0. O backup de log poder
centando nele o parmetro WALLET_LOCATION, conforme a ser construdo de forma bem parecida, com o comando a seguir:
Listagem 7.
Agora que j configuramos toda a conectividade entre o banco de backup archivelog all delete all input format /&2/&1/log/bkplog_%d_%s_%p tag
dados centralizador e os bancos de dados alvo, devemos registrar bkp_log_&1;

38 SQL Magazine Edio 148


Evidentemente, o backup de log ser executado apenas para Tambm obtida uma lista apenas dos backups do dia atual.
bancos de dados em modo ARCHIVE, e a frequncia dever ser Dentre as colunas disponveis, selecionamos algumas mais rele-
maior, de acordo com a caracterstica de utilizao e carga do vantes. O status indica se o backup foi executado com sucesso, se
mesmo. Sugerimos iniciar a execuo desse backup de hora em teve falha, ou se ainda est sendo executado. Essa coluna indicar
hora ou em tempos mltiplos de 1 hora, e fazer os ajustes de tempo ao DBA se ele deve tomar alguma ao, pois no caso de falha o
necessrios futuramente, se houver necessidade. diagnstico e eventuais aes corretivas devem ser providen-
A estrutura, que acaba tendo um pouco mais de diferenas, ciados. Nesse caso, o LOG, mencionado previamente, um bom
aquela que faz a remoo de backups obsoletos e que pode ser lugar para se iniciar a verificao.
executada com uma frequncia diria, preferencialmente antes Outras colunas importantes so as que indicam horrios de incio
dos backups, para liberar o espao ocupado por backups obsole- e fim dos backups, e os tempos que eles levaram. Acompanhar
tos e minimizar o risco de faltar espao para as novas cpias. O esses tempos importante, pois os backups devem estar dentro
Script global do RMAN pode ser utilizado como exemplo, como na das janelas disponveis de execuo. Se eles comeam a ultrapassar
Listagem 8. Para garantir preciso, feita uma dessincronizaro essa janela devido ao crescimento do banco de dados ou a ques-
do catlogo (ver linha 1), seguida por operaes de crosscheck tes de I/O e concorrncia, aes devem ser avaliadas para no
(ver linhas 2 a 4) para, enfim, removermos backups expirados e ultrapassarem os horrios predefinidos e evitar que os backups
backups obsoletos (ver linhas 5 at 8). Observe que na remoo sejam executados no horrio diurno ou horrios de pico, em que
de backups obsoletos, deixamos a poltica de reteno explcita os usurios esto utilizando o banco de dados.
(redundancy = 1, na linha 8). Isso sobrescreve a configurao
padro do RMAN, e talvez no seja necessria, caso voc queira Listagem 9. Consulta para verificar o status dos backups.
que seja considerada a poltica padro configurada no RMAN.
select
db.name,
jb.start_time,
Listagem 8. Contedo do arquivo de limpeza dos backups.
jb.end_time,
jb.time_taken_display,
1 resync catalog;
jb.input_type,
2 crosscheck archivelog all;
jb.status
3 crosscheck backup;
from rman.rc_database db
4 crosscheck backupset;
left join rman.rc_rman_backup_job_details jb
5 delete noprompt expired backupset device type = disk;
on db.db_key = jb.db_key
6 delete noprompt expired archivelog all device type = disk;
and jb.end_time >= trunc(sysdate) - apenas dia atual
7 delete noprompt expired backup device type = disk;
where
8 DELETE force noprompt OBSOLETE redundancy = 1;
nvl(jb.input_type, NULL) <> ARCHIVELOG - excluir backup de archive
order
by db.name,
LOGs jb.end_time desc

Voc deve ter observado que na chamada ao RMAN, informado


um arquivo de LOG. Com isso podemos manter e consultar os Sugerimos criar um Job para formatar os resultados dessa
logs de cada execuo, o que nos ajuda a conferir os resultados e consulta e envi-los via e-mail para facilitar o acompanhamento
diagnosticar eventuais problemas. Como as execues acontecem pelos DBAs. O Job pode ser agendado para um horrio no qual
a partir de um ponto central, todos os LOGs ficam no mesmo local sabe-se que em geral os backups j tero sido finalizados. Na
e isso facilita o acesso em caso de necessidade. Listagem 10 apresentamos um exemplo de texto formatado que
pode ser enviado por e-mail ao grupo de DBAs.
Monitorao
No dia a dia de um DBA, quanto mais ele puder receber infor- Listagem 10. Exemplo de texto formatado para e-mail com resultados dos
backups.
maes sobre o que est ocorrendo com os bancos de dados de
forma proativa, mais ele ganha agilidade. No caso dos backups, BACKUPS INCREMENTAIS DO DIA: 08/08/2016, SEGUNDA-FEIRA
podemos usar a flexibilidade do catlogo do RMAN para obter
BACKUP INCREMENTAL LEVEL 1
um resumo dos backups realizados e enviar esses resultados por
e-mail para o DBA ou grupos de DBAs. DB_NAME START END DURATION STATUS
A consulta aos resultados pode ser feita atravs de views do ------------------------------------------------------------------------------------
BDAPOIO 05:00:00 05:26:54 00:26:54 COMPLETED
catlogo do RMAN e uma query til para essa tarefa apre- ------------------------------------------------------------------------------------
sentada na Listagem 9. Ela une a view RC_DATABASE, que BDDESENV 05:00:00 05:19:24 00:19:24 COMPLETED
contm os bancos de dados registrados no catlogo, com a view ------------------------------------------------------------------------------------
BDHOMOLOG 05:00:00 05:22:35 00:22:35 COMPLETED
RC_RMAN_BACKUP_JOB_DETAILS, que contm detalhes de ------------------------------------------------------------------------------------
execuo de rotinas de backup pelo RMAN. No exemplo dessa BDPROD 05:00:00 05:12:02 00:12:02 COMPLETED
------------------------------------------------------------------------------------
listagem, no so includos os backups de archives.

Edio 148 SQL Magazine 39


Alta performance com carga direta de dados

No caso dos backups de logs, como eles ocorrem com bastante


Autor
frequncia, no muito recomendvel enviar e-mail a cada execu-
o. Nesse caso, pode-se adotar uma estratgia de enviar o e-mail Rafael Penna Leite
apenas quando houver algum problema, que pode ser evidenciado Penna.rafael@hotmail.com
pelas seguintes situaes: Bacharel em Cincias da Computao pela USP, atua na rea de
Tecnologia da Informao h mais de 15 anos. Possui slidos
Status do ltimo backup de log um status de erro;
conhecimentos e experincias em Anlise de Sistemas, Arquitetura de
Backup de log ainda em execuo mesmo quando j deveria
Software, Administrao de Banco de Dados e Business Intelligence.
ter finalizado (com base em observaes de seu tempo mdio de Atua como DBA Oracle. Tambm j atuou como DBA SQL Server. Na rea de desenvol-
execuo); vimento de software, j atuou como arquiteto e desenvolvedor em diversos projetos
ltimo backup de log no foi executado no momento esperado. do setor financeiro, comercial, e de Rdio e TV. Possui certificaes OCP Database 12c e
Microstrategy 8 MCE.
Neste artigo, mostramos que apenas com ferramentas dispon-
veis no Oracle e no Linux podemos construir rotinas de backup
automatizadas, fceis de manter e gerenciar, e que facilitam o dia a Links:
dia do DBA. Optamos pela simplicidade e facilidade de manuten-
o, em detrimento de solues que podem at ser mais elegantes, Criando catlogos do RMAN
mas que poderiam dificultar o trabalho rotineiro do DBA. http://docs.oracle.com/cd/B28359_01/backup.111/b28273/rcmsynta013.htm
Passamos por vrios conceitos muito teis na administrao de
Conceitos sobre Backup com RMAN
banco de dados Oracle: RMAN, Scheduler Jobs e Secure External
http://www.fabioprado.net/search?q=rman
Password Store (Wallet). Conhecimentos bsicos para interao
com o sistema operacional tambm so teis, como vimos aqui Secure External Password Store
na utilizao de Shell Scripts do Linux. http://docs.oracle.com/cd/B19306_01/network.102/b14266/cnctslsh.htm#CBHGEBEI
Vrios dos conceitos apresentados neste artigo podem ser usados
para outras estruturas de backup. Por exemplo, mesmo quando Configuraes do RMAN
realizamos backups atravs de alguma ferramenta, podemos usar https://docs.oracle.com/cd/B28359_01/backup.111/b28273/rcmsynta010.htm#CHDBHBBA
o catlogo do RMAN para manter as informaes centralizadas Referncia para o comando de Backup do RMAN
e para criar Scripts padronizados, a serem utilizados pelas ferra- https://docs.oracle.com/cd/E11882_01/backup.112/e10643/rcmsynta007.htm#RCMRF107
mentas responsveis pelos backups.
Especificao de formato para nomes de arquivos de sada no RMAN
https://docs.oracle.com/cd/E11882_01/backup.112/e10643/rcmsubcl010.htm#RCMRF195
Autor
Fbio Prado Referncia para a package DBMS_SCHEDULER
fbifabio@gmail.com https://docs.oracle.com/database/121/ARPLS/d_sched.htm#ARPLS72300
Atua no ramo de tecnologia h mais de 15 anos, possui expe-
rincia e profundos conhecimentos em Anlise de Sistemas,
programao com .NET e principalmente Administrao de Bancos de
Dados Oracle. DBA Oracle, autor do blog www.fabioprado.net, instrutor
de cursos de Administrao, PL/SQL, SQL e Tuning em Bancos de Dados Oracle. Bacharel
em Cincias da Computao, com MBA e Ps-graduao em Gesto de Projetos. Possui
os seguintes ttulos e certificaes: Microsoft: MCP, MCSD, MCAD, MCSD.NET, MCDBA,
MCTS, MCT e MCPD; Oracle: Oracle ACE, OCE SQL Tuning, OCE DB 11G Performance Tuning,
OCP Database 10G e 11G, OCA PL/SQL Developer. Mais informaes: www.fabioprado.
net/p/sobre.html.

40 SQL Magazine Edio 148


Edio 148 SQL Magazine 41

You might also like