LogMiner Além do FlashBack Query

Documentos relacionados
EXEMPLO DE FLASHBACK VERSIONS QUERY E FLASHBACK TRANSACTION QUERY

Administração de Banco de Dados

Backup e Restauração Banco de Dados. Evandro Deliberal

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

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

INSTALAÇÃO DO LOGIX COM BANCO ORACLE

Em nosso exemplo, o banco de dados XE está trabalhando no modo NOARCHIVELOG, e para verificar isso, basta executar as seguintes tarefas:

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

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

Page 1. Prof. Constantino Jacob

Administração de Banco de Dados

Banco de Dados. Prof. Antonio

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

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

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

IMPLEMENTAÇÃO DE BANCO DE DADOS

Banco de Dados Oracle 10g: Introdução à Linguagem SQL

GBC043 - Sistemas de Banco de Dados Lab8 : Transações no PostgreSql

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

Oracle PL/SQL Overview


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

Lock. Administração de Banco de Dados

Uniao Educacional e Tecnologica Impacta- Uni Impacta

Administração de Banco de Dados

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

Oracle Comandos para Processamento de Transações

Administração de Banco de Dados

SQL Gatilhos (Triggers)

Prof. Josenildo Silva

Sumário. Capítulo 2 Conceitos Importantes Tópicos Relevantes Instance Base de Dados Conclusão... 37

Bases de Dados. DDL Data Definition Language

Treinamento. DBA Oracle 11g. Duração: 120 horas

trigger insert, delete, update

Funções Definidas pelo Usuário

Progress DCA Desenvolvendo Aplicações Caracter Parte 1

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

ORACLE ARQUITETURA FÍSICA

PHP INTEGRAÇÃO COM MYSQL PARTE 1

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

SQL Introdução ao Oracle

PL/SQL. Profa. Dra. Cristina Dutra de Aguiar Ciferri. Laboratório de Bases de Dados PL/SQL

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

SGBD. Funções Básicas de um SGBD

BANCO DE DADOS: SQL. Edson Anibal de Macedo Reis Batista. 27 de janeiro de 2010

Oracle 10g: SQL e PL/SQL

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

Crash recovery é similar ao instance recovery, onde o primeiro referencia ambientes de instância exclusiva e o segundo ambientes parallel server.

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

A instância Oracle é composta de :

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.

SGBD. Definição. Funções básicas

Triggers(Gatilhos) Tiago Alves de Oliveira

Manipulação de Dados com SQL

Oracle Database: Fundamentos de SQL e PL/SQL

RECUPERAÇÃO DE CONTEÚDO BANCO DE DADOS

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

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

SQL (Tópicos) Structured Query Language

Oracle Zero Downtime Migration (com Golden Gate)

SGBD. Funções Básicas de um SGBD

MySQL. Introdução Prof. Erinaldo Nascimento

[versão para impressão] Link original: comp=24763 Conhecendo o PL/SQL

Prova de Tecnologia da Informação

COMPETÊNCIAS ESPECÍFICAS Compreender e utilizar a linguagem SQL, na construção e manutenção de uma base de dados.

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

Oracle PL/SQL Triggers

Sistemas de Banco de Dados

Administração de Banco de Dados

Programando em SQL. Triggers, Stored Procedures e funções. Profa. Késsia Marchi

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

Oracle Database 12c. Novas Características para DBAs e Desenvolvedores

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

MySQL. Prof. César Melo. com a ajuda de vários

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

AULA 11 IMPLEMENTANDO SEGURANÇA

Aula 2 Arquitetura Oracle

ORACLE 11 G INTRODUÇÃO AO ORACLE, SQL,PL/SQL. Carga horária: 32 Horas

Banco de Dados II. Triggers e Functions. Prof. Moser Fagundes. Curso TSI Instituto Federal Sul-Rio-Grandense (IFSul) Campus Charqueadas

O projeto físico do bando de dados consiste no mapeamento do projeto lógico para um DBMS real Projeto deve levar em conta fatores como:

Banco de Dados. Marcio de Carvalho Victorino Exercícios SQL

Triggers. um trigger permite que uma determinada sequência de comandos SQL seja accionada quando um determinado evento ocorre.

Banco de Dados Oracle. Faculdade Pernambucana - FAPE

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

MANUAL INSTALAÇÃO WEB SERVICE

Oracle Database 11g: Novos Recursos para Administradores

Transcrição:

LogMiner Além do FlashBack Query O Oracle LogMiner é uma ferramenta que permite consultas a arquivos de redo log s online e archives através de SQL. Os arquivos de redo contém o histórico da atividades em um banco de dados. Isso já existia no Oracle8i O Oracle também possui a tecnologia de Flashback Query (introduzida no 9i) que permite ver o valor de uma coluna em um ponto no passado, antes que este valor tenha sido alterado ou gravado. No entanto isso só vai funcionar se a alteração ocorreu dentro do período determinado por UNDO_RETENTION, cujo default de 15 minutos. Muitas vezes esta informação não pode ser recuperada, ou por que o tempo expirou, ou por que o segmentos de undo foram re-utilizados. Abaixo tem um pequeno exemplo de como utilizar o logminer quando não temos a possibilidade de usar o recurso de flashback SQL> SELECT to_char(sysdate, 'hh24:mi:ss') from dual; TO_CHAR( -------- 13:53:41 SQL> select from v$log; GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TI ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- -------- 1 1 83 52428800 1 YES INACTIVE 952754 30/08/09 2 1 84 52428800 1 NO CURRENT 972768 30/08/09 3 1 82 52428800 1 YES INACTIVE 950683 30/08/09 6 linhas selecionadas SQL> delete from dept; 6 linhas deletadas. SQL> commit; Commit concluído. não há linhas selecionadas

Como podemos ver as linhas não existem mais. No entanto as imagens anteriores da DML ainda estão na tablespace de undo e podem ser utilizadas com a Flashback Query ou com Flashback Table To Timestamp. SQL> select from dept as of timestamp systimestamp - interval '1' minute; Como podemos notar as before images ainda estão na TS de Undo. Mas e se um transação as sobrescrevesse?. Vou executar uma DML paralela que vai usar todos os segumento de rollback da TS de Undo SQL> conn sh/sh Conectado. SQL> create table big as select from sales; Tabela criada. SQL> SQL> alter session enable parallel dml; Sessão alterada. SQL> update /+ parallel (big,10) / big set amount_sold=amount_sold; update /+ parallel (big,10) / big set amount_sold=amount_sold ORA-12801: erro assinalado no servidor de consulta paralela P009 ORA-30036: não foi possível estender o segmento em 8 no tablespace de undo 'UNDOTBS1' Sem ter como acessar as imagens anteriores ao delete, tanto Flashback Query como Flashback Table não funcionam mais. SQL> conn geddy/geddy Conectado. SQL> select from dept as of timestamp to_timestamp('2009-08-30:13:21:11', 'yyyy-mm-dd:hh24:mi:ss' ); select from dept as of timestamp to_timestamp('2009-08-30:13:21:11', 'yyyy-mm-dd:hh24:mi:ss') ORA-01555: instantâneo muito antigo: número de segmento de rollback 18 com nome "_SYSSMU18$" muito SQL> alter table dept enable row movement; Tabela alterada. SQL> flashback table dept to timestamp to_timestamp('2009-08-30:13:21:00', 'yyyy-mm-dd:hh24:mi:ss'); flashback table dept to timestamp to_timestamp('2009-08-30:13:21:00', 'yyyy-mm-dd:hh24:mi:ss') ORA-00604: ocorreu um erro no nível 1 SQL recursivo

ORA-12801: erro assinalado no servidor de consulta paralela P000 ORA-01555: instantâneo muito antigo: número de segmento de rollback 18 com nome "_SYSSMU18$" muito Utilizar Flashback ficou impossível. Também não tenho flashback logs, portanto não posso utilizar o Flashback Database. Poderia fazer um TSPITR agora, mas não tenho tempo. Agora é a vez do LogMiner entrar em ação. SQL> select from v$log; GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TI ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- -------- 1 1 86 52428800 1 NO CURRENT 979188 30/08/09 2 1 84 52428800 1 YES ACTIVE 972768 30/08/09 3 1 85 52428800 1 YES ACTIVE 976378 30/08/09 Neste momento estou na sequence# 86. O caso é que eu sei exatamente qual sequence# de archive eu preciso investigar. Achar quando exatamente o erro lógico aconteceu é a parte mais difícil do processo SQL> select name from v$archived_log where sequence#=84; NAME ---------------------------------------------------------------------------------------------------- C:\ORACLE\FLASH_RECOVERY_AREA\DB10G\ARCHIVELOG\2009_08_30\O1_MF_1_84_59OCS2PG_.ARC 2 dbms_logmnr.add_logfile 3 ('C:\ORACLE\FLASH_RECOVERY_AREA\DB10G\ARCHIVELOG\2009_08_30\O1_MF_1_84_59OCS2PG_.ARC', 4 dbms_logmnr.new); 5 end; 6 / SQL> execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog); SQL> select sql_undo,' -- ', sql_redo from v$logmnr_contents where seg_name='dept'; SQL_UNDO '--' SQL_REDO -------------------------------- ---- -------------------------------- ("DEPA -- delete from "GEDDY"."DEPT" where RTMENT_ID","DEPARTMENT_NAME","MA "DEPARTMENT_ID" = '10' and "DEP NAGER_ID","LOCATION_ID") ARTMENT_NAME" = 'Administration' ('10','Administration','200','17 and "MANAGER_ID" = '200' and "L 00'); OCATION_ID" = '1700' and ROWID = 'AAAM1QAAEAAAD48AAG'; ("DEPA -- delete from "GEDDY"."DEPT" where RTMENT_ID","DEPARTMENT_NAME","MA "DEPARTMENT_ID" = '20' and "DEP NAGER_ID","LOCATION_ID") ARTMENT_NAME" = 'Marketing' and ('20','Marketing','201','1800'); "MANAGER_ID" = '201' and "LOCATI ON_ID" = '1800' and ROWID = 'AAA M1QAAEAAAD48AAH'; ("DEPA -- delete from "GEDDY"."DEPT" where RTMENT_ID","DEPARTMENT_NAME","MA "DEPARTMENT_ID" = '30' and "DEP NAGER_ID","LOCATION_ID") ARTMENT_NAME" = 'Purchasing' and ('30','Purchasing','114','1700') "MANAGER_ID" = '114' and "LOCAT ; ION_ID" = '1700' and ROWID = 'AA AM1QAAEAAAD48AAI'; ("DEPA -- delete from "GEDDY"."DEPT" where RTMENT_ID","DEPARTMENT_NAME","MA "DEPARTMENT_ID" = '40' and "DEP

NAGER_ID","LOCATION_ID") ARTMENT_NAME" = 'Human Resources ('40','Human Resources','203','2 ' and "MANAGER_ID" = '203' and " 400'); LOCATION_ID" = '2400' and ROWID = 'AAAM1QAAEAAAD48AAJ'; ("DEPA -- delete from "GEDDY"."DEPT" where RTMENT_ID","DEPARTMENT_NAME","MA "DEPARTMENT_ID" = '50' and "DEP NAGER_ID","LOCATION_ID") ARTMENT_NAME" = 'Shipping' and " ('50','Shipping','121','1500'); MANAGER_ID" = '121' and "LOCATIO N_ID" = '1500' and ROWID = 'AAAM 1QAAEAAAD48AAK'; ("DEPA -- delete from "GEDDY"."DEPT" where RTMENT_ID","DEPARTMENT_NAME","MA "DEPARTMENT_ID" = '60' and "DEP NAGER_ID","LOCATION_ID") ARTMENT_NAME" = 'IT' and "MANAGE ('60','IT','103','1400'); R_ID" = '103' and "LOCATION_ID" = '1400' and ROWID = 'AAAM1QAAEA AAD48AAL'; Pooso ainda tornar a coluna sql_undo um pouco mais legível com a opção print_pretty_sql. Além disso quero executar os comandos em um loop PL/SQL, utilizando sql dinâmico e essa abordagem requer que ponto e virgula no final de cada comando seja removido. A opção no_sql_delimiter resolve isso pra mim : 2 dbms_logmnr.start_logmnr( 3 options => 4 dbms_logmnr. 5 dict_from_online_catalog + 6 dbms_logmnr.print_pretty_sql + 7 dbms_logmnr.no_sql_delimiter 8 ); 9 end; 10 / Após este comando a sql_undo pode ser lido assim : SQL> select sql_undo from v$logmnr_contents where seg_name='dept'; SQL_UNDO -------------------------------- "DEPARTMENT_ID" = 10, "DEPARTMENT_NAME" = 'Adminis tration', "MANAGER_ID" = 200, "LOCATION_ID" = 1700 "DEPARTMENT_ID" = 20, "DEPARTMENT_NAME" = 'Marketi ng', "MANAGER_ID" = 201, "LOCATION_ID" = 1800

"DEPARTMENT_ID" = 30, "DEPARTMENT_NAME" = 'Purchas ing', "MANAGER_ID" = 114, "LOCATION_ID" = 1700 "DEPARTMENT_ID" = 40, "DEPARTMENT_NAME" = 'Human R esources', "MANAGER_ID" = 203, "LOCATION_ID" = 2400 "DEPARTMENT_ID" = 50, "DEPARTMENT_NAME" = 'Shippin g', "MANAGER_ID" = 121, "LOCATION_ID" = 1500 "DEPARTMENT_ID" = 60, "DEPARTMENT_NAME" = 'IT', "MANAGER_ID" = 103, "LOCATION_ID" = 1400 não há linhas selecionadas Para finalizar basta apenas executar o bloco abaixo para que tenhamos as linhas de volta na tabela dept 2 for undo_rec in ( 3 select sql_undo, row_id 4 from v$logmnr_contents 5 where table_name='dept' and seg_owner='geddy') 6 loop 7 begin 8 execute immediate undo_rec.sql_undo; 9 end; 10 end loop; 11 end; 12 / SQL> SELECT FROM DEPT;