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

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


Пакет DBMS LOGMNR

1641

tkyte@TKYTE816> commit;

Commit complete.

tkyte@TKYTE816> alter system archive log current;

System altered.

tkyte@TKYTE816> column name format a80 tkyte@TKYTE816> select name

2 from v$archived log

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

4 from v$archived log)

NAME

C:\ORACLE\ORADATA\TKYTE816\ARCHrVE\TKYTE816T001S01267.ARC

Теперь, с учетом того, что я - единственный пользователь, изменяющий базу данных, в сгенерированном архивном журнале окажутся только два выполненных изменения. Последний запрос к представлению V$ARCHIVED LOG возвращает имя архивного файла журнала повторного выполнения, который необходимо анализировать. Его можно загрузить в LogMiner и анализировать с помощью приведенных ниже PL/SQL-блоков. Они добавят последний архивный файл журнала повторного выполнения к списку обрабатываемых, а затем запустят LogMiner:

tkyte@TKYTE816> declare

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

3 begin 4

5 select name into l name

6 from v$archived log

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

8 from v$archived log); 9

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 end;

PL/SQL procedure successfully completed.

Первый вызов процедуры, DBMS LOGMNR.ADD LOGFILE, загрузил архивный файл журнала повторного выполнения в LogMiner. Я передал имя архивного файла журнала повторного выполнения и опцию DBMS LOGMNR.NEW. Поскольку этот файл добавляется первым, надо указывать опцию DBMS LOGMNR.NEW. Поддерживаются также опции ADDFILE для добавления еще одного файла журнала в существующий



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

список файлов, а также REMOVEFILE - для удаления файла из списка рассматриваемых. После загрузки нужных файлов журнала можно вызывать процедуру DBMS LOGMNR.START LOGMNR, передавая ей имя созданного файла словаря. При вызове START LOGMNR передается минимум информации - только имя файла словаря. Другие опции процедуры START LOGMNR мы рассмотрим в разделе Опции и использование .

Теперь, после загрузки файла журнала и запуска LogMiner, все готово для просмотра содержимого представления V$LOGMNR CONTENTS. Представление V3LOGMNR CONTENTS содержит большое количество информации; для начала рассмотрим только небольшую ее часть. В частности, выберем значения столбцов SCN, SQL REDO и SQL UNDO. Если вы этого еще не знаете, SCN (порядковый номер системного изменения) - это простой механизм отсчета времени, который сервер Oracle пользуетдля упорядочения транзакций и восстановления базы данных после сбоев. Эти номера также используются для обеспечения согласованности по чтению и при обработке контрольных точек в базе данных. SCN можно рассматривать как счетчик: при фиксации каждой транзакции значение SCN увеличивается на единицу. Вот запрос из предыдущего примера, в котором имена в таблицах ЕМР и DEPT переводятся в нижний регистр:

tkyte@TKYTE816>column sql redo format a2 0 word wrapped tkyte@TKYTE816> column sql undo format a20 word wrapped

tkyte@TKYTE816> select scn, sql redo, sql undo from v$logmnr contents

SCN SQL REDO SQL UNDO

6.443 0E+12 set transaction read write;

6.4430E+12 update TKYTE.EMP set update TKYTE.EMP set ENAME = smith ENAME - SMITH

where ROWID = where ROWID =

AAAHdYAAGAAAAJKAAA AAAHdYAAGAAAAJKAAA

6.4430E+12

6.443 0E+12 update TKYTE.EMP set update TKYTE.EMP set ENAME = allen ENAME = ALLEN

where ROWID = where ROWID =

AAAHdYAAGAAAAJKAAB AAAHdYAAGAAAAJKAAB

...(несколько аналогичных строк выброшено).. .

6.4430E+12 update TKYTE.DEPT update TKYTE.DEPT

set DNAME = sales set DNAME = SALES

where ROWID = where ROWID =

AAAHdZAAGAAAAKKAAC AAAHdZAAGAAAAKKAAC 6.4430E+12 update TKYTE.DEPT update TKYTE.DEPT

set DNAME = set DNAME =



Пакет DBMS LOGMNR 1643

operations where OPERATIONS where ROWID = ROWID =

AAAHdZAAGAAAAKKAAD AAAHdZAAGAAAAKKAAD

6.443 0E+12 coit; 22 rows selected.

Как видите, SQL-операторы сгенерировали в журнале повторного выполнения не две строки, а намного больше. Журнал повторного выполнения содержит измененные биты и байты, а не SQL-операторы. Поэтому многострочный оператор UPDATE EMP SET ENAME = LOWER(ENAME) представляется средствами LogMiner в виде набора одно-строчн1х изменений. В настоящее время LogMiner не позволяет получить реально выполненные SQL-операторы. Можно создать только делающие то же самое SQL-опера-торы, но в виде набора отдельных операторов.

В этом примере мы пойдем на шаг дальше. В представлении V$LOGMNR CONTENTS есть столбцы-заместители ( placeholder columns). Столбцы-заместители позволяют найти изменения, выполненные в пяти (но не более) столбцах таблицы. Столбцы-заместители позволяют узнать имя измененного столбца, а также значение столбца до и после изменения. Поскольку эти столбцы в]делены из текста SQL-операторов, очень легко найти транзакцию, изменившую, скажем, значение в столбце ENAME (в столбце-заместителе имени будет значение ENAME) с KING (в столбце предварительного значения будет KING) на king. Чтобы продемонстрировать это, выполним еще один небольшой пример с оператором UPDATE и создадим файл сопоставления столбцов (column mapping file). Файл сопоставления столбцов (будем сокращенно называть его файл colmap) позволяет указать средствам LogMiner, какие столбцы в таблице вас интересуют. Можно сопоста-витьдо пяти столбцов в каждой таблице со столбцами-заместителями. Файл colmap имеет следующий формат:

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

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

При просмотре строки в таблице DEPT столбцу DEPT DEPTNO будет сопоставлен первый столбец-заместитель. А при просмотре строки в таблице ЕМР этому столбцу-заместителю будет сопоставлен столбец ЕМР EMPNO.

Файл сопоставления столбцов в общем случае состоит из строк следующей структуры (полужирным в]делены константы, <sp> представляет обязательный пробел)

colmap<sp>-<sp>ВЛАДЕЛЕЦ<sp>ИМЯ ТАБЛИЦЫ<sp> (1, <sp>ИМЯ СТОЛБЦА[, <sp>2, <sp> ->ИМЯ СТОЛБЦА] ...) ;

Регистр символов везде имеет значение: ВЛАДЕЛЬЦА надо задавать в верхнем регистре, имя таблицы - с соблюдением регистра (обычно - в верхнем регистре, если только при создании объекта не использовались идентификаторы в кавычках). Пробелы указывать тоже обязательно. Для того чтобы упростить использование файла сопоставления столбцов я использую следующий сценарий:

set linesize 500 set trimspool on set feedback off



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

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