Программирование >>  Oracle 

1 ... 404 405 406 [ 407 ] 408 409 410 ... 469


1644

Приложение А

set heading off set embedded on spoollogmnr.opt select

colmap= user table name ( max(decode(column id, 1, column id , null))

max(decode(column id, 1, , column name, null) ) max(decode(column id, 2, , column id , null)) max(decode(column id, 2, , column name, null)) max(decode(column id, 3, , column id , null)) max(decode(column id, 3, , column name, null)) max(decode(column id, 4, , column id , null)) max(decode(column id, 4, , column name, null) ) max(decode(column id, 5, , column id , null)) max(decode(column id, 5, , column name,null)) ); colmap from user tab columns

group by user, table name

spool off

в SQL*Plus для автоматической генерации файла logmnr.opt. Например, если в1полнить этот сценарий в схеме, где имеются только таблицы ЕМР и DEPT, аналогичные тем, что принадлежат пользователю SCOTT/TIGER, вы получите:

tkyte@TKYTE816> @colmap

colmap = TKYTE DEPT (1, DEPTNO, 2, DNAME, 3, LOC);

colmap = TKYTE EMP (1, EMPNO, 2, ENAME, 3, JOB, 4, MGR, 5, HIREDATE);

Я всегда сопоставляю первых пять столбцов таблицы. Если вы хотите использовать другой набор пяти столбцов, отредактируйте полученный при выполнении этого сценария файл logmnr.opt, изменив имена столбцов. Например, в таблице ЕМР есть еще три столбца, не представленные в полученном файле colmap - SAL, COMM и DEPTNO. Если необходимо просматривать изменения столбца SAL, a не JOB, файл colmap должен выглядеть так:

tkyte@TKYTE816> @colmap

colmap = TKYTE DEPT (1, DEPTNO, 2, DNAME, 3, LOC);

colmap = TKE EMP (1, EMPNO, 2, ENAME, 3, SAL, 4, MGR, 5, HIREDATE);

Помимо использования соответствующего регистра символов и количества пробелов при работе с файлом colmap важно также следующее:

Файл должен называться logmnr.opt. Другое имя использовать нельзя.

Этот файл должен быть в том же каталоге, что и файл словаря.

Файл colmap можно использовать только вместе с файлом словаря.

Итак, мы сейчас изменим все столбцы в таблице DEPT. Я использую четыре различных оператора UPDATE, каждый из которых будет изменять другую строку и набор столбцов. Это позволит увидеть результат сопоставления столбцов-заместителей:

tkyte@TKYTE816> alter system archive log current;

tkyte@TKYTE816> update dept set deptno = 11



Пакет DBMS LOGMNR 1645

2 where deptno = 40

tkyte@TKYTE816> update dept set dname = initcap(dname)

2 where deptno = 10

tkyte@TKYTE816> update dept set loc = initcap(loc)

2 where deptno = 20

tkyte@TKYTE816> update dept set dname = initcap(dname),

2 loc = initcap(loc)

3 where deptno = 30

tkyte@TKYTE816> commit;

tkyte@TKi816> alter system archive log current;

Теперь можно найти изменения в каждом из столбцов, загрузив вновь сгенерированный архивный файл журнала повторного выполнения и запустив LogMiner с опцией USE COLMAP. Обратите внимание, что я сгенерировал файл logmnr.opt с помощью представленного ранее сценария и поместил этот файл в тот же каталог, где находится словарь данных:

tkyte@TKYTE816> declare

2 l name v$archived log.name%type;

3 begin

5 select name into l name

6 from v$archived log

7 where completion time = (select max(completion time)

8 fromv$archived log);

10 sys.dbms logmnr.add logfile(l name, sys.dbms logmnr.NEW) ;

11 end;

12 /

PL/SQL procedure successfully completed.

tkyte@TKYTE816> begin

2 sys.dbms logmnr.start logmnr

3 (dictFileName => c:\temp\miner dictionary.dat,

4 options => sys.dbms logmnr.USE COLMAP);

5 end;

PL/SQL procedure successfully completed.

tkyte@TKYTE816> select scn, phl name, phl undo, phl redo,

2 ph2 name, ph2 undo, ph2 redo,

3 ph3 name, ph3 undo, ph3 redo

4 from v$logmnr contents

5 where seg name = DEPT



1646 Приложение А

SCN PHl NA PH1 PH1 PH2 N PH2 0NDO PH2 REDO PH3 PH3 UNDO PH3 RED0

6.4430E+12 DEPTNO 40 11

6.4430E+12 DNAME accounting Accounting

6.4430E+12 LOC DALLAS Dallas

6.4430E+12 DNAME sales Sales LOC CHICAGO Chicago

Итак, этот результат ясно показывает (в первой строке, например), что в столбце DEPTNO значение 40 (PH1) б1ло изменено на 11. Это понятно, поскольку мы в1пол-няли SET DEPTNO = 11 WHERE DEPTNO = 40. Обратите внимание, что остальн1е столбцы в перовой строке - пустые. Причина в том, что сервер Oracle записывает только измененные байты; для этой строки нет предварительного и окончательного образов столбцов DNAME и LOC. Вторая строка показывает изменение значения в столбце DNAME с accounting на Accounting и отсутствие изменений в столбцах DEPTNO LOC, поскольку они не были затронуты. Последняя строка показывает, что при изменении двух столбцов одним оператором UPDATE они будут представлены в столбцах-заместителях.

Как видите, использование столбцов-заместителей может пригодиться при поиске конкретной транзакции в большем объеме данных повторного выполнения. Если известно, что транзакция изменила таблицу X, поменяв в столбце Y значение с а на b, найти ее очень легко.

Опции и использование

Функциональные возможности LogMiner реализуются двумя пакетами -

DBMS LOGMNR и DBMS LOGMNR D. Пакет DBMS LOGMNR D ( D в названии

обозначает словарь - dictionary ) содержит всего одну процедуру, BUILD. Она применяется для создания словаря данных, используемого пакетом DBMS LOGMNR при загрузке файла журнала повторного выполнения. Он позволяет сопоставить идентификаторам объектов имена таблиц, определить имена и типы данных столбцов по порядковому номеру и т.д. Использовать процедуру DBMS LOGMNR D.BUILD очень просто. Она имеет два параметра:

DICTIONARY FILENAME. Имя файла словаря, который необходимо создать. В наших примерах использовался файл miner dictionary.dat.

DICTIONARY LOCATION. Каталог, в котором этот файл будет создан. Процедура использует для создания файла средства пакета UTL FILE, так что каталог должен быть перечислен среди допустимых каталогов, задаваемых параметром инициализации utl file dir. Подробнее о конфигурировании пакета UTL FILE cм. в соответствующем разделе в конце приложения А.

Вот и все, что нужно знать о процедуре BUILD. Оба параметра указывать обязательно. Если при вызове этой процедуры получено сообщение об ошибке, подобное следующему:

tkyte@TKYTE816> exec sys.dbms logmnr d.build(x.dat, c:\not valid\); BEGIN sys.dbms lognmr d.build(x.dat, c:\not valid\); END;



1 ... 404 405 406 [ 407 ] 408 409 410 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика