|
Программирование >> Oracle
1656 Приложение А CHAR(2000). Я использую в базе данных блоки размером 8 Кбайт, так что, если во всех девяти столбцах будут непустые значения, строка будет иметь размер 18000 байт, что слишком много для одного блока. Эта строка будет фрагментирована не менее чем на три блока. Для демонстрации этого используем следующую таблицу: tkyte@TKYTE816> create table t (x int primary key.
Table created. Теперь, чтобы продемонстрировать проблему, я вставлю строку в таблицу T со значениями только в столбцах X и А. Размер этой строки будет составлять чуть больше 2000 байт. Поскольку столбцы В, С, D и т.д. пусты, они не будут занимать места. Эта строка поместится в один блок. Затем изменим строку, задав значения для столбцов В, С, D и E. Поскольку значения типа CHAR всегда дополняются до заданной длины пробелами, размер строки увеличится с немногим более 2000 байт до примерно 10000 байт, в результате чего будет фрагментирована на два блока. Изменим значение всех столбцов строки, увеличив ее размер до 18 Кбайт и вызвав фрагментацию на три блока. Затем загрузим содержимое журнала повторного выполнения с помощью LogMiner и по-смотоим. как оно будет обработано: tkyte@TKYTE816> begin 2 sys.dbms logmnr d.build(miner dictionary.dat, 3 c:\temp); 4 end; PL/SQL procedure successfully completed. tkyte@TKYTE816> alter system archive log current; System altered. tkyte@TKYTE816> insert into t (x, a) values (1, non-chained); 1 row created. tkyte@TKYTE816> commit; Coit complete. tkyte@TKYTE816> update t set a = chained row, 2 b = x, c = x, 3 d = x, e = x 4 where x = 1; 1 row updated. tkyte@TKYTE816> commit; Пакет DBMS LOGMNR 1657 Commit complete. tkyte@TKYTE816> update t set a chained row,
1 row updated. tkyte@TKYTE816> commit; Commit complete. tkyte@TKYTE816> alter system archive log current; System altered. Создав состояние, которое мы хотим проанализировать, можно загружать соответствующий журнал с помощью LogMiner. Не забудьте: после создания таблицы T мы должны пересоздать файл словаря данных, или результат нельзя будет проанализировать! tkyte@TKYTE816> declare 8 9 10 11 12 l name v$archived log.name%type; begin select name into l name from v$archived log where completion time = (select max(completion time) fromv$archived log); sys.dbms logmnr.add logfile(l name, dbms logmnr.NEW) ; end; 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. tkyte@TKYTE816> select scn, sql redo, sql undo 2 from v$logmnr contents 3 where sql redo is not null or sql undo is not null SCN SQL REDO SQL UNDO 6442991118354 set transaction read write; 6442991118354 insert into TKYTE.T(X,A) va delete from TKYTE.T where lues (1,non-chained = 1 and A = non-chained 1658 Приложение А ); and ROWID = AAAHdgAAGAAAACKAAA; 6442991118355 commit; 6442991118356 set transaction read write; 6442991118356 Unsupported (Chained Row) Unsupported (Chained Row) 6442991118356 Unsupported (Chained Row) Unsupported (Chained Row) 6442991118357 commit; 6442991118358 set transaction read write; 6442991118358 Unsupported (Chained Row) Unsupported (Chained Row) 6442991118358 Unsupported (Chained Row) Unsupported (Chained Row) 6442991118358 Unsupported (Chained Row) Unsupported (Chained Row) 6442991118359 commit; 12 rows selected. Как видите, исходный оператор INSERT представлен средствами Log Miner, как ожидалось. А оператор UPDATE, фрагментировавший строку, в результатах LogMiner не значится. Вместо этого выдано Unsupported (Chained Row). Интересно отметить, что эта конструкция выдана дважды для первого оператора UPDATE и трижды - для второго. Пакет LogMiner выдает информацию об изменениях в базе данных по блокам. ли строка находится в двух блоках, в представлении V$LOGMNR CONTENTS будет две записи об изменениях. Если строка фрагментирована на три блока, будет три записи. Поэтому следует учитывать, что средства LogMiner не позволяют полностью воспроизвести SQL-операторы для повторного выполнения или отмены изменений во фрагментированных и перемещенных строках. Другие ограничения Кроме рассмотренных выше, средства LogMiner имеют ряд других ограничений. В настоящее время также не поддерживается: анализ таблиц, организованных по индексу; анализ таблиц и индексов кластеров. Представление V$LOGMNR CONTENTS Представление V$LOGMNR CONTENTS содержит по одной строке для каждого логического изменения в базе данных, выбранного из обработанных файлов журнала повторного выполнения. Мы уже неоднократно использовали это представление, но обращались лишь к отдельным его столбцам. В следующей таблице, созданной на основе документации Oracle, описаны все столбцы этого представления, включая доступную в них информацию: Столбец Описание SCN Номер системного изменения для транзакции, выполнившей изменение.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |