SQL Magazine 148 - NoSQL Com Cassandra
SQL Magazine 148 - NoSQL Com Cassandra
SQL Magazine 148 - NoSQL Com Cassandra
Sumrio
04 Questes de banco de dados do concurso do Tribunal de contas de So Paulo
[ Mauro Pichiliani ]
14 Introduo ao Cassandra
[ Maycon Pinheiro Queiros ]
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
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.
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
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:
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
a a
1 NULL
NULL NULL
NULL NULL
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.
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.
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.
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.
[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
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
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.
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.
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 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)
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
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 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
SEX 19/08
TER 16/08
Backups de 07/08 at
No temos backups
13/08 esto obsoletos.
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.
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.
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
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).
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