EXEMPLO DE FLASHBACK VERSIONS QUERY E FLASHBACK TRANSACTION QUERY

Documentos relacionados
Administração de Banco de Dados

IMPLEMENTAÇÃO DE BANCO DE DADOS

LogMiner Além do FlashBack Query

DDL DML DCL DTL Tipos Numéricos: INT FLOAT DOUBLE Tipos String: CHAR VARCHAR BINARY BLOB TEXT Tipos Data e Hora: DATE TIME TIMESTAMP YEAR

Page 1. Prof. Constantino Jacob

Oracle Comandos para Processamento de Transações

BANCO DE DADOS. info 3º ano. Prof. Diemesleno Souza Carvalho

Banco de Dados. Prof. Antonio

DO BÁSICO AO AVANÇADO PARA MANIPULAÇÃO E OTIMIZAÇÃO DE DADOS. Fábio Roberto Octaviano

ORACLE 11 G INTRODUÇÃO AO ORACLE, SQL,PL/SQL

saída durante o runtime Usando Functions de uma Única Linha para Personalizar Relatórios Mostrar as diferenças entre as functions SQL de uma única

Banco de Dados. Professora: Luciana Faria

Linguagem de pesquisa declarativa para banco de dados relacional; 1ª Versão - Desenvolvida pela IBM no laboratório de pesquisa de San José;

A U L A 3 S U B G R U P O S D M L E D Q L : I N S E R I N D O E P E S Q U I S A N D O D A D O S E M U M A T A B E L A

Oracle Database 10g: Fundamentos de SQL e PL/SQL

Preparação criar tabela. Linguagem de Manipulação de Dados (DML) Estudo Dirigido 12/11/2018

SQL CREATE MATERIALIZED VIEW. Processamento Analítico de Dados Profa. Dra. Cristina Dutra de Aguiar Ciferri. OLAP: Modelagem Multidimensional

ESTUDO DE CASO EM PL/SQL

f. Exemplo: verificar condição de aprovação de alunos

Laboratório de Banco de Dados II Aula 04. Prof. Érick de Souza Carvalho

Uniao Educacional e Tecnologica Impacta- Uni Impacta

Preparação. Linguagem de Manipulação de Dados (DML) Estudo Dirigido 10/12/2013

Triggers(Gatilhos) Tiago Alves de Oliveira

Linguagem SQL Restrições, Triggers e Views

Manipulação de Dados com SQL

Laboratório de Banco de Dados. Prof. Luiz Vivacqua.

Banco de Dados I Introdução SQL

MySql. Introdução a MySQL. Andréa Garcia Trindade

Introdução à Banco de Dados. Nathalia Sautchuk Patrício

Introdução à linguagem SQL

Bases de Dados. DML Data Manipulation Language Parte 3

LINGUAGEM SQL Linguagem usada em SGBD para: Definir estrutura de dados; Modificar dados em um banco de dados; Especificar restrições de segurança; Rea

EXEMPLOS DE COMANDOS NO SQL SERVER

BANCO DE DADOS GERENCIAL 1 A U L A 2

Quando se seleciona os modos OS ou XML, arquivos são criados com os registros de auditoria, eles se localizam parâmetro audit_file_dest.

Prova de Tecnologia da Informação

Oracle Database 11g: Introdução à Linguagem SQL Novo

Banco de Dados II. Administração do SGBD Oracle. Tablespaces, usuários, privilégios, papéis e perfis. Gustavo Dibbern Piva

SQL CREATE DATABASE. MySQL, SQL Server, Access, Oracle, Sybase, DB2, e outras base de dados utilizam o SQL.

A linguagem SQL

Bases de Dados. DDL Data Definition Language

BANCO DE DADOS WEB AULA 12. manipulação de dados atualização e exclusão de registros. professor Luciano Roberto Rocha.

DO BÁSICO AO AVANÇADO PARA MANIPULAÇÃO E OTIMIZAÇÃO DE DADOS. Fábio Roberto Octaviano

PostgreSQL. André Luiz Fortunato da Silva Analista de Sistemas CIRP / USP alf@cirp.usp.br

Administração de Banco de Dados

Disciplina: Banco de Dados Tema: SQL Parte 2

26/04/2017 Triggers no SQL Server: teoria e prática aplicada em uma situação real

Introdução ao PostgreSQL

SQL Linguagem de Definição de Dados. Laboratório de Bases de Dados Profa. Dra. Cristina Dutra de Aguiar Ciferri

Material Teórico. Procedures, Functions, Exceptions e Triggers. Responsável pelo Conteúdo: Prof. Ms. Alexander Gobbato Albuquerque

Comandos de Manipulação

SQL (Tópicos) Structured Query Language

PROGRAMA. 3.SQL Básico. 3.1 Criação de tabelas 3.2 Queries simples 3.3 Subqueries 3.4 Agregação. Prof. Dr. Marcos Tsuzuki

BD II (SI 587) Segurança em Banco de Dados. Josenildo Silva.

Introdução à Engenharia da Computação. Banco de Dados Professor Machado

SQL Structured Query Language. SQL Linguagem de Definição de Dados. SQL Structured Query Language. SQL Structured Query Language

SQL. Prof. Roger Cristhian Gomes

PHP INTEGRAÇÃO COM MYSQL PARTE 1

MySQL. Introdução Prof. Erinaldo Nascimento

SIMONE APARECIDA DE OLIVEIRA RECUPERAÇÃO DE ARQUIVOS EM BANCOS DE DADOS ORACLE COM O FLASHBACK

Instituto Federal de Educação, Ciência e Tecnologia de São Paulo

Linguagem de Consulta Estruturada SQL- DML

Marcos Alexandruk Marcos Alexandruk

Faculdade Pitágoras 16/08/2011. Curso Superior de Tecnologia: Banco de Dados Sistemas para Internet

Progress DCA Desenvolvendo Aplicações Caracter Parte 1

Faculdade Pitágoras. Curso Superior de Tecnologia: Banco de Dados. Disciplina: Banco de Dados Prof.: Fernando Hadad Zaidan SQL

Bases de Dados 2005/2006. Aula 5

TLBD II Instruções SQL

Fundamentos de Programação ORACLE: SQL. Prof. Walter Gima

PROVA TECNOLOGIA DA INFORMAÇÃO

Banco de Dados II. Transações (Oracle) Segurança: Introdução; Controle de Acesso; Criptografia; Recursos de SQL.

INSTALAÇÃO DO LOGIX COM BANCO ORACLE

SQL Structured Query Language

SQL Linguagem de Definição de Dados

Exercício Aula Passada. SQL Linguagem de Manipulação de Dados. Exercício Aula Passada. Exercício Aula Passada. Exercício Aula Passada

Linguagem de Consulta Estruturada SQL- DML

NoSQL Apache Cassandra para DBAs. Conceitos básicos que todo DBA deve conhecer sobre Apache Cassandra.

BANCO DE DADOS FACSUL 2017 TECNOLOGIA DE REDE DE COMPUTADORES

Modelo Entidade-Relacionamento (E-R)

O modelo relacional encontra-se padronizado pela indústria de informática. Ele é chamado de

LINGUAGEM SQL. DML - Linguagem de Manipulação de Dados

BANCO DE DADOS -INTRODUÇÃO AO SQL. Prof. Angelo Augusto Frozza, M.Sc.

Transcrição:

EXEMPLO DE FLASHBACK VERSIONS QUERY E FLASHBACK TRANSACTION QUERY A funcionalidade do recurso Flashback Query disponível desde a versão Oracle 9i e abordada também nos artigos de Maio/2007 e Maio/2008, foi aperfeiçoada no Oracle 10g para incluir dois novos tipos de consultas: Flashback Versions Query e Flashback Transaction Query. O Flashback Versions Query fornece uma maneira simples e fácil de mostrar todas as versões de todas as linhas em uma tabela entre dois SCN's ou tempos de intervalo (time stamps), informando se as linhas foram inseridas, deletadas ou atualizadas. Na verdade, acredito que o Flashback Versions Query é uma extensão à linguagem SQL que permite ao DBA recuperar diferentes versões de linhas de tabela em qualquer intervalo de tempo. Uma nova versão de registro será criada toda vez que o comando COMMIT for emitido, e mesmo que uma linha seja deletada e reinserida várias vezes, todas estas alterações estarão disponíveis para acesso. É importante lembrar que o parâmetro UNDO_RETENTION controla e especifica quanto tempo os blocos de dados Oracle alterados ficarão disponíveis no segmento de UNDO até serem sobre-gravados, portanto é bom certificar que não só este parâmetro esteja corretamente setado, mas também que o tablespace de UNDO seja grande suficiente para que as alterações realizadas no banco de dados estejam disponíveis para uso do Flashback Query quando necessário. No mais, para invocar esta funcionalidade é necessário utilizar a cláusula VERSIONS BETWEEN na sentença SELECT. A sintaxe para uso do Flashback Versions Query é a seguinte: SELECT [pseudo_columns]...from table_name VERSIONS BETWEEN {SCN TIMESTAMP {expr MINVALUE} AND {expr MAXVALUE}} [AS OF {SCN TIMESTAMP expr}] WHERE [pseudo_column column]... Já o Flashback Transaction Query usa a view de dicionário de dados FLASHBACK_TRANSACTION_QUERY para recuperar informações de transações de banco de dados para todas as tabelas envolvidas em uma transação. Esta view possui uma coluna UNDO_SQL que fornece a sentença SQL que poderá ser utilizada para desfazer uma mudança feita anteriormente. A propósito, nas versões anteriores ao Oracle 10g, o LogMiner poderia ser utilizado para fornecer estas informações. É importante salientar que para ter acesso a esta view, o usuário de banco de dados deverá ter o privilégio de sistema SELECT ANY TRANSACTION. Em resumo, caso seja identificado que um dado em uma linha de tabela foi modificado erroneamente, poderemos então usar o Flashback Transaction Query para identificar o histórico das sentenças de undo SQL e utilizá-las para reverter estas modificações. A view FLASHBACK_TRANSACTION_QUERY contém as seguintes colunas: Nome Descrição ---------------- --------------------------------------------------------------------------- XID Identificador da transação. START_SCN Número do SCN que inicia a transação. START_TIMESTAMP Horário de início da transação. COMMIT_SCN SCN gerado durante o COMMIT da transação. Será nulo para

transações ativas. COMMIT_TIMESTAMP Horário do COMMIT. Será nulo para transações ativas. LOGON_USER Usuário de banco de dados logado que realizou a transação. UNDO_CHANGE# Identificador de UNDO. OPERATION Operações realizadas pela transação (insert, delete, update). TABLE_NAME Nome da tabela onde as operações DML foram aplicadas. TABLE_OWNER Nome do usuário de banco de dados proprietário da tabela. ROW_ID O ROWID que foi modificado pela operação DML. UNDO_SQL SQL que poderá ser usado para desfazer a operação DML realizada. Vale a pena salientar que a coluna LOGON_USER mostrada acima, poder ser útil para filtrar as transações realizadas por um usuário específico que possui privilégios de acesso às tabelas de propriedade de outro usuário. Vamos então a um pequeno exemplo prático onde usarei a procedure DBMS_LOCK.SLEEP apenas para gerar um intervalo de tempo (60 segundos) entre as transações: -- Criando um usuário para teste SYS> create user scott identified by tiger 2 default tablespace users 3 quota unlimited on users; Usuário criado. SYS> grant connect,resource to scott; Concessão bem-sucedida. SYS> grant select any transaction to scott; Concessão bem-sucedida. SYS> grant execute on dbms_lock to scott; Concessão bem-sucedida. SYS> connect scott/tiger Conectado. -- Criando de uma tabela para teste SCOTT> create table t1 (id number); Tabela criada. -- Simulando operações DML's na tabela T1 SCOTT> set time on 09:12:34 SCOTT> insert into t1 values (1); 1 linha criada. 09:12:34 SCOTT> exec dbms_lock.sleep(60);

09:13:34 SCOTT> commit; 09:13:34 SCOTT> insert into t1 values (2); 1 linha criada. 09:13:34 SCOTT> exec dbms_lock.sleep(60); 09:14:34 SCOTT> commit; 09:14:34 SCOTT> insert into t1 values (3); 1 linha criada. 09:14:34 SCOTT> exec dbms_lock.sleep(60); 09:15:34 SCOTT> commit; 09:15:34 SCOTT> update t1 set id = id*10; 3 linhas atualizadas. 09:15:34 SCOTT> exec dbms_lock.sleep(60); 09:16:34 SCOTT> commit; 09:16:34 SCOTT> delete from t1; 3 linhas deletadas. 09:16:34 SCOTT> exec dbms_lock.sleep(60);

09:17:34 SCOTT> commit; 09:17:36 SCOTT> set time off -- Obtendo informações das versões das linhas SCOTT> select versions_starttime stime, 2 versions_endtime endtime, 3 versions_xid xid, 4 case 5 when versions_operation = 'I' then 'INSERT' 6 when versions_operation = 'U' then 'UPDATE' 7 when versions_operation = 'D' then 'DELETE' 8 end as operation, 9 id 10 from t1 versions between timestamp minvalue and maxvalue 11 order by stime; STIME ENDTIME XID OPERAT ID ----------------- ------------------ ---------------- ------ ---------- 28/07/08 09:13:32 28/07/08 09:16:37 06001F00E9000000 INSERT 1 28/07/08 09:14:32 28/07/08 09:16:37 01000500F3000000 INSERT 2 28/07/08 09:15:32 28/07/08 09:16:37 02001000EF000000 INSERT 3 28/07/08 09:16:37 28/07/08 09:17:32 03001100F1000000 UPDATE 10 28/07/08 09:16:37 28/07/08 09:17:32 03001100F1000000 UPDATE 20 28/07/08 09:16:37 28/07/08 09:17:32 03001100F1000000 UPDATE 30 28/07/08 09:17:32 04001D00F4000000 DELETE 10 28/07/08 09:17:32 04001D00F4000000 DELETE 20 28/07/08 09:17:32 04001D00F4000000 DELETE 30 9 linhas selecionadas. De acordo com o resultado acima, podemos perceber, por exemplo, que o valor 1 contido na coluna ID da tabela T1, foi inserido pela transação 06001F00E9000000 às 09:13:32 e permaneceu com este valor até às 09:16:37 quando teve seu valor alterado para 10 até ser deletada por volta das 09:17:32. Podemos perceber também que as operações DELETE e UPDATE foram realizadas em uma mesma transação, ou seja, a transação 03001100F1000000 para UPDATE e a 04001D00F4000000 para DELETE. Agora, vamos ver abaixo o que podemos obter selecionando dados a partir da view FLASHBACK_TRANSACTION_QUERY: SCOTT> select undo_sql 2 from flashback_transaction_query 3 where xid = '06001F00E9000000'; UNDO_SQL ------------------------------------------------------------------------- delete from "SCOTT"."T1" where ROWID = 'AAADsWAAEAAAMtlAAA'; O resultado acima mostra o comando DML necessário que deverá ser utilizado para

desfazer a alteração realizada na transação identificada pelo id 06001F00E9000000. SCOTT> select undo_sql 2 from flashback_transaction_query 3 where xid = '03001100F1000000'; UNDO_SQL ------------------------------------------------------------------------- update "SCOTT"."T1" set "ID" = '1' where ROWID = 'AAADsWAAEAAAMtlAAA'; update "SCOTT"."T1" set "ID" = '2' where ROWID = 'AAADsWAAEAAAMtlAAB'; update "SCOTT"."T1" set "ID" = '3' where ROWID = 'AAADsWAAEAAAMtlAAC'; O resultado acima mostra os comandos DML's necessários que deverão ser utilizados para desfazerem as alterações realizadas na transação identificada pelo id 03001100F1000000. SCOTT> select undo_sql 2 from flashback_transaction_query 3 where xid = '04001D00F4000000'; UNDO_SQL ------------------------------------------------------------------------- insert into "SCOTT"."T1"("ID") values ('10'); insert into "SCOTT"."T1"("ID") values ('20'); insert into "SCOTT"."T1"("ID") values ('30'); O resultado acima mostra os comandos DML's necessários que deverão ser utilizados para desfazerem as alterações realizadas na transação identificada pelo id 04001D00F4000000. Por fim, irei obter abaixo, o histórico de todos os comandos DML's que poderão, de alguma forma, serem utilizados para desfazerem as alterações nos registros da tabela T1 desde a sua criação: SCOTT> select to_char(commit_timestamp,'hh24:mi:ss') time, 2 operation, 3 undo_sql 4 from flashback_transaction_query 5 where table_name='t1' order by 1; TIME OPERATION UNDO_SQL -------- --------- ---------------------------------------------------------------------- 09:13:32 INSERT delete from "SCOTT"."T1" where ROWID = 'AAADsWAAEAAAMtlAAA'; 09:14:32 INSERT delete from "SCOTT"."T1" where ROWID = 'AAADsWAAEAAAMtlAAB'; 09:15:32 INSERT delete from "SCOTT"."T1" where ROWID = 'AAADsWAAEAAAMtlAAC'; 09:16:32 UPDATE update "SCOTT"."T1" set "ID" = '1' where ROWID = 'AAADsWAAEAAAMtlAAA'; 09:16:32 UPDATE update "SCOTT"."T1" set "ID" = '2' where ROWID = 'AAADsWAAEAAAMtlAAB'; 09:16:32 UPDATE update "SCOTT"."T1" set "ID" = '3' where ROWID = 'AAADsWAAEAAAMtlAAC'; 09:17:32 DELETE insert into "SCOTT"."T1"("ID") values ('10');

09:17:32 DELETE insert into "SCOTT"."T1"("ID") values ('20'); 09:17:32 DELETE insert into "SCOTT"."T1"("ID") values ('30'); 9 linhas selecionadas.