Использовал литературу: Кэри Миллсап, Джефф Хольт Oracle. Оптимизация производительности
Запускаем трассировку запроса.
alter session set max_dump_file_size=unlimited;
alter session set timed_statistics=true;
alter session set events '10046 trace name context forever, level 12';
select 'Hello, world; today is '||sysdate from dual;
exit;
=====================================================================================
Каждая из строк PARSE, EXEC и FETCH (WAIT) отражает выполнение одного вызова базы данных.
Другие статистические показатели:
p - количество блоков Oracle, полученных системными вызовами чтения
cr - обращения к кэшу буферов базы данных, для чтения в согласованном режиме
cu - обращения к кэшу буферов базы данных, для чтения в текущем режиме
mis - количество непопаданий в библиотечный кэш
r - количество возвращенных вызовом строк
tim - позволяет приблизительно оценить время, когда этот вызов был завершен
=====================================================================================
ERROR, UNMAP и SORT UNM
c -
Общее процессорное время, потраченное процессом Oracle в ходе
вызова. Oracle9i измеряет с в микросекундах (1 ис = 0,000001 се-
кунды). В более ранних версиях ядра значение с выражалось в со-
тых долях секунды.
e -
Фактическая продолжительность вызова. Oracle9i измеряет е в мик-
росекундах (1 цс = 0,000001 секунды). В более ранних версиях ядра
значение е выражалось в сотых долях секунды.
p -
Количество блоков базы данных Oracle, полученных вызовом за счет
обращения к дисковой подсистеме ОС. Предполагается, что р озна-
чает первую букву слова - физический, но имейте в ви-
ду, что не каждое так называемое <физическое> чтение Oracle обра-
щается к физическому дисковому устройству. Многие такие чтения
обслуживаются различными кэшами, расположенными между
ядром Oracle и физическим диском.
cr -
Количество блоков базы данных Oracle, полученных вызовом в ре-
жиме согласованного чтения из кэша буферов базы данных Oracle.
Чтение в согласованном режиме может потребовать дополнитель-
ных согласованных чтений из блоков отката, хранящихся в сегмен-
тах отката.
cu -
Количество блоков базы данных Oracle, полученных вызовом в режи-
ме текущего чтения из кэша буферов базы данных Oracle. Чтение
в текущем режиме - это просто чтение текущего содержимого блока.
mis -
Количество непопаданий в библиотечный кэш в ходе вызова. Ре-
зультатом каждого непопадания в библиотечный кэш является опе-
рация полного разбора (hard parse).
r - Количество строк, возвращаемых вызовом.
dep -
Рекурсивная глубина курсора. Курсор глубиной dep=n + 1 является
потомком некоторого курсора глубины dep=n (п = 0, 1, 2, ...).
робнее об этом рассказано ниже в разделе <Двойной учет рекурсив-
ного SQL> данной главы.
og -
1 ALL_R0WS
2 FIRST_ROWS
3 RULE
4 CHOOSE
=====================================================================================
Событие ожидания Oracle.
WAIT сообщает о продолжительности определенной последовательности инструкций,
выполняемой внутри процесса ядра Oracle.
nam -
Имя, присвоенное кем-то из разработчиков ядра Oracle для обозна-
чения того, какая часть ядра Oracle отвечает за данную часть време-
ни отклика.
ela -
Фактическое время, потраченное на исполнение названного события.
Oracle9i измеряет ela в микросекундах (1 цс = 0,000001 секунды).
В более ранних версиях ядра значение ela выражалось в сотых до-
лях секунды.
р1, р2, рЗ -
Значения данных параметров зависят от значения пат. Полный пе-
речень описаний параметров для всех типов событий можно полу-
чить, выполнив такой SQL-код:
select name, parameter"!, parameter2, parameter3
from v$event_name order by name
Cтроки WAIT появляются в файле трассировки до
строки того вызова базы данных, результатом которого является данное
событие ожидания.
=====================================================================================
Строки STAT содержат сведения о плане выполнения и времени отклика, выбранном
оптимизатором запросов Oracle для выполнения команд SQL.
=====================================================================================
Cтрока XCTEND появляется в том случае, когда исследуемое приложение выполняет
команду фиксации или отката.
=====================================================================================
Каждая лексема PARSING IN CURSOR указывает на рождение (или возрождение)
курсора.
Каждая строка файла трассировки соответствует одному <действию>,
выполненному процессом ядра Oracle. Имеющиеся в каждой строке
символы #ID идентифицируют курсор, согласно которому ядро выпол-
няло действие. Например, приведенная ниже строка соответствует вы-
борке по курсору #1:
FETCH #1:с=0,е=177,р=0,cr=1,cu=2,mis=0,r=1,dep=O,og=4,tim=1038931660054596
Строка, начинающаяся с лексемы ***, указывает системное время, полученное непосредственно
перед передачей строки *** в файл трассировки. Эта информация помогает аналитику по
производительности установить соответствие между показаниями времени tim в статистике Oracle.
Это удобно, потому что позволяет восстановить синхронизацию событий с фактическим временем
после больших интервалов строк WAIT, содержащих приблизительное истекшее время (ela), а не
значения внутренних часов (tim).
Строка, содержащая лексему SESSION ID: (m. л), идентифицирует строки файла трассировки,
следующие за ней, как относящиеся к сеансу Oracle с идентификатором V$SESSION.SID=m
и порядковым номером V$SESSION SERIAL#=n.
Сама строка PARSING IN CURSOR содержит информацию об идентификато-
ре курсора #ID. Текст между строкой PARSING IN CURSOR и соответствую-
щей строкой END OF STMT - это собственно SQL-текст курсора
len - Длина текста SQL.
dep -
Рекурсивная глубина курсора. Курсор глубиной dep=ra + 1 является
потомком некоторого курсора глубиной dep=n (п = 0,1, 2,...). Некото-
рые действия приводят к использованию рекурсивного SQL, напри-
мер вызовы базы данных, которым необходима информация из сло-
варя БД; команды, запускающие триггеры; PL/SQL-блоки, содер-
жащие команды SQL. В разделе <Двойной учет рекурсивного SQL>
далее в этой главе мы продолжим разговор о рекурсивных отноше-
ниях в SQL.
uid - Идентификатор пользователя, выполняющего разбор команды.
oct - Идентификатор типа команды Oracle [Oracle OCI (1999)].
lid -
Идентификатор пользователя, обладающего привилегиями. Так,
если пользователь FRED вызывает пакет, принадлежащий пользова-
телю JOE, то для команды SQL, выполненной внутри пакета, uid бу-
дет ссылаться на FRED, a lid - на JOE.
Проверка в Oracle версии 9 показала, что независимо от того, вы-
полнялась ли программа под привилегиями владельца или под при-
вилегиями вызвавшего ее пользователя, uid и lid в файле трасси-
ровки имеют одно и то же значение: идентификатор пользователя,
зарегистрировавшегося в системе и вызвавшего эту программу.
tim -
Если значение tim равно 0, значит, параметр инициализации T1MED_
STATISTICS имел значение FALSE в момент, когда должно было подсчи-
тываться время вызова. Таким образом, на основе значений tim мож-
но сделать вывод о том, какое значение имел параметр инициализа-
ции TIMED_STATISTICS. В процессе работы мы с коллегами пришли к
выводу о том, что конкретные ненулевые значения tim, относящиеся
к секциям PARSING IN CURSOR, не представляют особого интереса.
В Огас1е9г значение tim измеряется в микросекундах (1 ис = 0,000001
секунды). В некоторых системах (например, на наших Linux-серве-
рах) значения поля tim - это чистые значения gettimeofday. В дру-
гих системах (например, на наших Windows-компьютерах) проис-
хождение значений поля tim может быть весьма загадочным. В вер-
сиях, предшествующих Oracle9?, tim было значением V$TIMER. HSECS,
выраженным в сотых долях секунды.
hv -
Идентификатор команды SQL. Может показаться, что значение hv
уникально, но это не так Может случиться (хотя это бывает редко),
что разные тексты SQL имеют одинаковые значения hv.
ad - Адрес курсора в библиотечном кэше, как это показано в V$SQL.
когда ядро Oracle связывает значения с заполнителями в SQL-тексте приложе-
ния, то ядро выводит в файл трассировки секцию BIND. Номер,
следующий за словом , указывает позицию (порядковый номер,
начиная с 0) переменной связывания в тексте SQL.
dty
Внешний тип данных значения, переданного приложением [Oracle
OCI (1999)]. В Oracle определены два набора типов данных: внут-
ренний и внешний. Определения внутреннего типа данных показы-
вают, каким образом ядро Oracle хранит свои данные в операцион-
ной системе, а определения внешнего типа - каким образом ядро
Oracle взаимодействует с SQL-кодом приложения.
Внешний тип данных переменной связывания весьма важен. Время
от времени встречаются команды SQL, для которых оптимизатор
запросов Oracle отказывается использовать индекс, безусловно, по-
могающий делу. Иногда это вызвано несоответствием типа столбца
типу значения, что может привести к выполнению для столбца
функции неявного приведения типа, что не позволит оптимизатору
выбрать данный индекс.
avl
Длина связываемого значения (в байтах).
value
Значение, которое передается в выполняемую команду. Ядро Oracle
может усекать значения, передаваемые в файл трассировки. По-
нять, что это произошло, несложно - усечение будет иметь место
всегда, когда значение avl превышает длину поля value.
Если значение value не попало в файл трассировки, значит, пере-
менная-заполнитель была связана со значением NULL. Так, в приве-
денном выше примере f nd_profile. get_specif ic отсутствие поля value
в секции bind 4 говорит о том, что приложение передало NULL в ка-
честве значения заполнителя :val. Это подтверждается нулевой
длиной (avl=OO) значения переменной связывания.
Если в момент закрытия курсора включена трассировка SQL уровня 1,
то ядро Oracle передает в файл трассировки по одной строке STAT для
Справочник по данным расширенной трассировки SQL 119
каждой операции над источником строк из плана выполнения запро-
са
id
Уникальный идентификатор операции над источником строк внут-
ри множества строк STAT.
cnt
Количество строк, возвращенных данной операцией над источни-
ком строк.
pid
Идентификатор операции, родительской по отношению к данной.
pos
Произвольное число - ничего лучше не придумать. Можно предпо-
ложить, что это значение могло бы определять <позицию> операции
над источником данных во множестве операций, принадлежащих
одному родителю, но похоже, что сестринские операции над источ-
ником данных упорядочены по возрастанию идентификаторов.
obj
Идентификатор объекта для операции над источником строк, если
операция выполняется над <базовым объектом>.1 Такие операции
над источником строк, как NESTED LOOPS, которые сами не обращают-
ся к базовому объекту, имеют obj =0. (Дочерние операции для NESTED
LOOPS обращаются к базовым объектам, но сама операция NESTED
LOOPS над источником данных этого не делает.)
op
Имя операции над источником данных. Начиная с версии Oracle
9.2.0.2.0, ядро передает дополнительную информацию в строки
STAT [Rivenes (2003)]. Новая информация включает в себя ряд по-
лезных характеристик для каждой операции над источником
строк, а именно:
cr - Количество чтений в согласованном режиме.
r - Количество блоков Oracle, прочитанных вызовами чтения ОС.
w - Количество блоков Oracle, записанных вызовами записи ОС.
time -
Фактическая длительность (в микросекундах).
Статистика для родительской операции над источником строк
включает в себя статистики для ее потомков.
Каждая строка XCTEND содержит следующие сведения о работе, выпол-
няемой в ходе фиксации или отката транзакции:
rlbk
Истина (1) - в том и только в том случае, если транзакция была от-
качена.
rd_only
Истина (1) - в том и только в том случае, если транзакция не изме-
нила никаких данных в базе данных.
Рекурсивный SQL - это SQL, соответствующий вызову базы данных,
значение dep которого больше нуля. Вызов базы данных глубиной
dep=n + 1 (п = О, 1, 2, ...) можно рассматривать как потомка какого-то
вызова базы данных со значением dep=ra
По логам увидел, что переключение на пике работы происходит 3 или 30 секунд. Обычная работа базы - переключение 3-6 минут. Oracle рекомендует 15-20 минут.
#смотрим чтобы удаляемый logfile не был текущим или активным. Хоть Оракл и проругается #береженого бог бережет. select * from v$log;
alter system switch logfile; alter database drop logfile group 1; alter database add logfile group 1 ('g:\oracle\...\acs_log1a','h:\oracle\...\acs_log1b') size 100M reuse;
alter system switch logfile; alter database drop logfile group 2; alter database add logfile group 2 ('g:\oracle\...\acs_log2a','h:\oracle\...\acs_log2b') size 100M reuse;
alter system switch logfile; alter database drop logfile group 3; alter database add logfile group 3 ('g:\oracle\...\acs_log3a','h:\oracle\...\acs_log3b') size 100M reuse;
alter system switch logfile; alter database drop logfile group 4; alter database add logfile group 4 ('g:\oracle\...\acs_log4a','h:\oracle\...\acs_log4b') size 100M reuse;
alter system switch logfile; alter database drop logfile group 5; alter database add logfile group 5 ('g:\oracle\...\acs_log5a','h:\oracle\...\acs_log5b') size 100M reuse;
alter system switch logfile; alter database drop logfile group 6; alter database add logfile group 6 ('g:\oracle\...\acs_log6a','h:\oracle\...\acs_log6b') size 100M reuse;
ALTER DATABASE CREATE STANDBY CONTROLFILE AS 'e:\oracle\...\stbycf.f';
#Выполняем на Standby conn / as sysdba alter database recover managed standby database cancel; shutdown immediate
#Копируем ручками вместо старых новые controlfile #из e:\oracle\admin\acs\backup\stbycf.f в #f:\oracle\oradata\acs_ctrl1 #g:\oracle\oradata\acs_ctrl2 #h:\oracle\oradata\acs_ctrl3
#Выполняем запуск на Standby conn / as sysdba startup nomount alter database mount standby database; alter database recover managed standby database disconnect; или #alter database recover managed standby database disconnect from session;
#Зделать на боевой alter system switch logfile; #посмотреть логи на Standby убедиться, что архивлог файлы принимаются.
Каждый дата файл делится на блоки. Размер блока указан в файле инициализации, параметр DB_BLOCK_SIZE. Каждый дата файл имеет заголовок размер которого 20 байт, (further the number of blocks in the data file can be found 24 bytes into the file) Эту строку я для себя перевел как: если количество блоков большое то 24 байта. Блоки различаются по типам: табличные данные, индексные данные, cluster data(шо за зверь пока незнаю). Каждый блок подразделен на секции. Картинка показывает эти секции. Заголовок блока содержит: тип блока; object id таблицы, индекса или кластера; контрольную сумму. Ниже расположен table directory и еще ниже row directory. Оба переменной длины. row directory содержит информацию о том как много строк с данными в блоке и для каждой этой строки выделено 2 байта, указатель(смещение) на фактическое расположение данных. Чтобы получить адрес данных, нужно отсчитывать смещение от начала row directory. Данные заполняются снизу вверх(от конца блока). При вставке новой строки сами данные заполняют нижнюю часть свободной области, а ссылка на данные (смещение) в row directory соответственно сверху свободной области. Когда блок полностью заполнен, начинается заполнение нового блока. Каждая строка в блоке имеет 3х байтовый заголовок. Первый байт содержит набор флагов показывающих состояние строки. Как пример установленный 5 бит показывает, что строка удалена. Обычно первый байт содержит 0х2С, если строка удалена 0х3С. Второй байт показывает блокирована ли строка. Третий байт показывает количество столбцов в строке. Если общая сумма превышает 255 байт, то заголовок строки 4 байта учитывающих 65536 байт. После заголовка строки идут данные. Каждый столбец(колонка таблицы) начинается с 1 байта указывающего на размер столбца. Если значение столбца NULL то поле заполняется значением 0xFF. Пример дампа 189d3790h: 3C 01 11 189d37a0h: 04 C3 06 13 2F 04 C3 06 13 2F 02 C1 37 0D 4D 59 189d37b0h: 5F 54 45 4D 50 5F 54 41 42 4C 45 02 C1 02 FF 02 189d37c0h: C1 03 07 78 6B 03 17 12 08 38 07 78 6B 03 17 12 189d37d0h: 08 38 07 78 6B 03 17 12 08 38 02 C1 02 FF FF 01 189d37e0h: 80 FF 02 C1 07 02 C1 02 Пример столбцов Col 1 04 C3 06 13 2F Col 2 04 C3 06 13 2F Col 3 02 C1 37 Col 4 0D 4D 59 5F 54 45 4D 50 5F 54 41 42 4C 45 Col 5 02 C1 02 Col 6 FF Col 7 02 C1 03 Col 8 07 78 6B 03 17 12 08 38 Col 9 07 78 6B 03 17 12 08 38 Col 10 07 78 6B 03 17 12 08 38 Col 11 02 C1 02 Col 12 FF Col 13 FF Col 14 01 80 Col 15 FF Col 16 02 C1 07 Col 17 02 C1 02
Когда строка удалена, пространство становится доступным для записи. Но сами данные все еще находятся в блоке, хоть место и помечено как свободное.
Пример как согласовавать файлы данных. Приводим к одному SCN
[oracle@localhost ~]$ sqlplus /nolog SQL*Plus: Release 10.2.0.1.0 - Production on Tue Jun 2 19:07:46 2009 Copyright (c) 1982, 2005, Oracle. All rights reserved.
Как обычно делаю выборку файлов. SQL> conn / as sysdba; Connected.
Хочу посмотреть как себя будут чувствовать данные. Поэтому делаю выборку до изменеий. SQL> select * from scott.emp; EMPNO ENAME JOB MGR HIREDATE SAL COMM ---------- ---------- --------- ---------- --------- ---------- ---------- DEPTNO ---------- 7369 SMITH CLERK 7902 17-DEC-80 800 20 7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30 7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30 7566 JONES MANAGER 7839 02-APR-81 2975 20 7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30 7698 BLAKE MANAGER 7839 01-MAY-81 2850 30 7782 CLARK MANAGER 7839 09-JUN-81 2450 10 7788 SCOTT ANALYST 7566 19-APR-87 3000 20 7839 KING PRESIDENT 17-NOV-81 5000 10 7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30 7876 ADAMS CLERK 7788 23-MAY-87 1100 20 7900 JAMES CLERK 7698 03-DEC-81 950 30 7902 FARD ANALYST 7566 03-DEC-81 3000 20 7934 MILLER CLERK 7782 23-JAN-82 1300 10 14 rows selected.
Тушим базу и копируем файл данных /home/oracle/oracle/product/10.2.0/oradata/pahom/users01.dbf Затем поднимаем базу.Делаем пару каких либо движений. Я решил апдейтить многострадальную строку.
Неудачная попытка. Данные есть но условие выбора не отрабатывает. Потому как мы издевались над этой же строкой в части 2. Перестроим индекс все пойдет. В теории :) SQL> update scott.emp set ename='FAAD' where empno=7902; 0 rows updated. SQL> select * from scott.emp where empno=7902; no rows selected
Все равно меняем эту же строку :) SQL> update scott.emp set job='ANULIST' where ename='FARD'; 1 row updated. SQL> commit; Commit complete.
Смотрим чего наменяли SQL> select * from scott.emp; EMPNO ENAME JOB MGR HIREDATE SAL COMM ---------- ---------- --------- ---------- --------- ---------- ---------- DEPTNO ---------- 7369 SMITH CLERK 7902 17-DEC-80 800 20 7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
* * * * * *
7902 FARD ANULIST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10 14 rows selected.
Тушим базу и переименовываем файл данных /home/oracle/oracle/product/10.2.0/oradata/pahom/users01.dbf и копируем на его место файл бэкапа. SCN которого неправильный. SQL> shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down.
Поднимаем базу. И получили ожидаемое. SQL> startup; ORACLE instance started. Total System Global Area 167772160 bytes Fixed Size 1218316 bytes Variable Size 71305460 bytes Database Buffers 92274688 bytes Redo Buffers 2973696 bytes Database mounted. ORA-01113: file 4 needs media recovery ORA-01110: data file 4: '/home/oracle/oracle/product/10.2.0/oradata/pahom/users01.dbf' --------------------------------------------------------------
Начинаем лечебные процедуры. BBED> set list '/home/oracle/oracle/product/10.2.0/bbed/list2.txt' LISTFILE /home/oracle/oracle/product/10.2.0/bbed/list2.txt
Смотрим файл /home/oracle/oracle/product/10.2.0/oradata/pahom/system01.dbf. Будет эталоном. BBED> set file 1 FILE# 1
Так как я ленивый и мне лень переворачивать байты. Делаю дамп блока. Ссылки у нас есть. BBED> dump /v dba 1,1 offset 140 count 24 File: /home/oracle/oracle/product/10.2.0/oradata/pahom/system01.dbf (1) Block: 1 Offsets: 140 to 163 Dba:0x00400001 ------------------------------------------------------- 3a000000 6e480929 39000000 00000000 l :...nH.)9....... 00000000 00000000 l ........ <16 bytes per line>
BBED> dump /v dba 1,1 offset 484 count 24 File: /home/oracle/oracle/product/10.2.0/oradata/pahom/system01.dbf (1) Block: 1 Offsets: 484 to 507 Dba:0x00400001 ------------------------------------------------------- 3e540800 00000000 b8bf0929 01000a00 l >T...... .).... 04000000 54f50000 l ....T <16 bytes per line>
Переходим к файлу который будем лечить. BBED> set file 4 FILE# 4
Вот непонял чего артачится видать слишком большое число. Офигела система маленько BBED> modify /x b8bf0929 dba 4,1 offset 492 BBED-00209: invalid number (b8bf0929)
Выведем дамп, чтобы убедиться что мы нашли что искали. BBED> dump /v dba 4,32 offset 7668 count 64 File: /home/oracle/oracle/product/10.2.0/oradata/pahom/users01.dbf (4) Block: 32 Offsets: 7668 to 7731 Dba:0x01000020 ------------------------------------------------------- 464f5244 07414e41 4c595354 03c24c43 l FORD.ANALYST. LC 0777b50c 03010101 02c21fff 02c1152c l .w ...... ... ., 010802c2 50054a41 4d455305 434c4552 l ... P.JAMES.CLER 4b03c24d 630777b5 0c030101 0103c20a l K. Mc.w ...... . <16 bytes per line>
Пытаемся изменить данные напрямую в файле. У нас ошибка :( Читай хелп по BBED. BBED> modify /c FARD dba 4,32 offset 7668 BBED-00215: editing not allowed in BROWSE mode
Включаем режим редактирования. Специально не убрал ошибку. Часто забываю включить этот режим. BBED> set mode edit MODE Edit
Меняем значение. Когда поменял FORD на PAHOM мой блок сказал что он с ошибкой. Потому аккуратнее. Меняем на равное количество символов. BBED> modify /c FARD dba 4,32 offset 7668 File: /home/oracle/oracle/product/10.2.0/oradata/pahom/users01.dbf (4) Block: 32 Offsets: 7668 to 7731 Dba:0x01000020 ------------------------------------------------------------------------ 46415244 07414e41 4c595354 03c24c43 0777b50c 03010101 02c21fff 02c1152c 010802c2 50054a41 4d455305 434c4552 4b03c24d 630777b5 0c030101 0103c20a <32 bytes per line>
Мы могли не менять значение, просто чтоб видеть что и такое можно сделать. Смотрим что наменяли. BBED> dump /v dba 4,32 offset 7668 count 64 File: /home/oracle/oracle/product/10.2.0/oradata/pahom/users01.dbf (4) Block: 32 Offsets: 7668 to 7731 Dba:0x01000020 ------------------------------------------------------- 46415244 07414e41 4c595354 03c24c43 l FARD.ANALYST. LC 0777b50c 03010101 02c21fff 02c1152c l .w ...... ... ., 010802c2 50054a41 4d455305 434c4552 l ... P.JAMES.CLER 4b03c24d 630777b5 0c030101 0103c20a l K. Mc.w ...... . <16 bytes per line>
Так как мы наглые и меняем значение сразу в файле. Контрольная сумма у нас не сростается. BBED> sum dba 4,32 Check value for File 4, Block 32: current = 0x26a0, required = 0x28a0
Правим контрольную сумму. BBED> sum dba 4,32 apply Check value for File 4, Block 32: current = 0x28a0, required = 0x28a0
Чтобы увидеть изменения в запросе нужно или перестартануть базу или сбросить буфер. SQL> alter system flush buffer_cache; System altered.
Проверяем что так оно и есть. SQL> select * from scott.emp where ename='FORD'; no rows selected
SQL> select * from scott.emp where ename='FARD'; EMPNO ENAME JOB MGR HIREDATE SAL COMM ---------- ---------- --------- ---------- --------- ---------- ---------- DEPTNO ---------- 7902 FARD ANALYST 7566 03-DEC-81 3000 20
Берем дамп блока файла. Чтобы сравнить что происходит до и после нашего опыта с восстановлением удаленной строки. SQL> alter system dump datafile 4 block 32; System altered.
/home/oracle/oracle/product/10.2.0/db_1/admin/pahom/udump/pahom_ora_7134.trc Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options ORACLE_HOME = /home/oracle/oracle/product/10.2.0/db_1 System name: Linux Node name: localhost.localdomain Release: 2.6.9-78.0.0.0.1.ELsmp Version: #1 SMP Fri Jul 25 14:41:56 EDT 2008 Machine: i686 Instance name: pahom Redo thread mounted by this instance: 1 Oracle process number: 15 Unix process pid: 7134, image: oracle@localhost.localdomain (TNS V1-V3)
data_block_dump,data header at 0xb7220e64 =============== tsiz: 0x1f98 hsiz: 0x2e pbl: 0xb7220e64 bdba: 0x01000020 76543210 flag=-------- ntab=1 nrow=14 frre=-1 fsbo=0x2e fseo=0x1d61 avsp=0x1d33 tosp=0x1d5a 0xe:pti[0] nrow=14 offs=0 0x12:pri[0] offs=0x1f72 0x14:pri[1] offs=0x1f47 0x16:pri[2] offs=0x1f1c 0x18:pri[3] offs=0x1ef3 0x1a:pri[4] offs=0x1ec6 0x1c:pri[5] offs=0x1e9d 0x1e:pri[6] offs=0x1e74 0x20:pri[7] offs=0x1e4c 0x22:pri[8] offs=0x1e26 0x24:pri[9] offs=0x1dfb 0x26:pri[10] offs=0x1dd5 0x28:pri[11] offs=0x1daf 0x2a:pri[12] offs=0x1d88 0x2c:pri[13] offs=0x1d61 block_row_dump: tab 0, row 0, @0x1f72 tl: 38 fb: --H-FL-- lb: 0x0 cc: 8 col 0: [ 3] c2 4a 46 col 1: [ 5] 53 4d 49 54 48 col 2: [ 5] 43 4c 45 52 4b col 3: [ 3] c2 50 03 col 4: [ 7] 77 b4 0c 11 01 01 01 col 5: [ 2] c2 09 col 6: *NULL* col 7: [ 2] c1 15 tab 0, row 1, @0x1f47 tl: 43 fb: --H-FL-- lb: 0x0 cc: 8 col 0: [ 3] c2 4b 64 col 1: [ 5] 41 4c 4c 45 4e col 2: [ 8] 53 41 4c 45 53 4d 41 4e col 3: [ 3] c2 4d 63 col 4: [ 7] 77 b5 02 14 01 01 01 col 5: [ 2] c2 11 col 6: [ 2] c2 04 col 7: [ 2] c1 1f tab 0, row 2, @0x1f1c tl: 43 fb: --H-FL-- lb: 0x0 cc: 8 col 0: [ 3] c2 4c 16 col 1: [ 4] 57 41 52 44 col 2: [ 8] 53 41 4c 45 53 4d 41 4e col 3: [ 3] c2 4d 63 col 4: [ 7] 77 b5 02 16 01 01 01 col 5: [ 3] c2 0d 33 col 6: [ 2] c2 06 col 7: [ 2] c1 1f tab 0, row 3, @0x1ef3 tl: 41 fb: --H-FL-- lb: 0x0 cc: 8 col 0: [ 3] c2 4c 43 col 1: [ 5] 4a 4f 4e 45 53 col 2: [ 7] 4d 41 4e 41 47 45 52 col 3: [ 3] c2 4f 28 col 4: [ 7] 77 b5 04 02 01 01 01 col 5: [ 3] c2 1e 4c col 6: *NULL* col 7: [ 2] c1 15 tab 0, row 4, @0x1ec6 tl: 45 fb: --H-FL-- lb: 0x0 cc: 8 col 0: [ 3] c2 4d 37 col 1: [ 6] 4d 41 52 54 49 4e col 2: [ 8] 53 41 4c 45 53 4d 41 4e col 3: [ 3] c2 4d 63 col 4: [ 7] 77 b5 09 1c 01 01 01 col 5: [ 3] c2 0d 33 col 6: [ 2] c2 0f col 7: [ 2] c1 1f tab 0, row 5, @0x1e9d tl: 41 fb: --H-FL-- lb: 0x0 cc: 8 col 0: [ 3] c2 4d 63 col 1: [ 5] 42 4c 41 4b 45 col 2: [ 7] 4d 41 4e 41 47 45 52 col 3: [ 3] c2 4f 28 col 4: [ 7] 77 b5 05 01 01 01 01 col 5: [ 3] c2 1d 33 col 6: *NULL* col 7: [ 2] c1 1f tab 0, row 6, @0x1e74 tl: 41 fb: --H-FL-- lb: 0x0 cc: 8 col 0: [ 3] c2 4e 53 col 1: [ 5] 43 4c 41 52 4b col 2: [ 7] 4d 41 4e 41 47 45 52 col 3: [ 3] c2 4f 28 col 4: [ 7] 77 b5 06 09 01 01 01 col 5: [ 3] c2 19 33 col 6: *NULL* col 7: [ 2] c1 0b tab 0, row 7, @0x1e4c tl: 40 fb: --H-FL-- lb: 0x0 cc: 8 col 0: [ 3] c2 4e 59 col 1: [ 5] 53 43 4f 54 54 col 2: [ 7] 41 4e 41 4c 59 53 54 col 3: [ 3] c2 4c 43 col 4: [ 7] 77 bb 04 13 01 01 01 col 5: [ 2] c2 1f col 6: *NULL* col 7: [ 2] c1 15 tab 0, row 8, @0x1e26 tl: 38 fb: --H-FL-- lb: 0x0 cc: 8 col 0: [ 3] c2 4f 28 col 1: [ 4] 4b 49 4e 47 col 2: [ 9] 50 52 45 53 49 44 45 4e 54 col 3: *NULL* col 4: [ 7] 77 b5 0b 11 01 01 01 col 5: [ 2] c2 33 col 6: *NULL* col 7: [ 2] c1 0b tab 0, row 9, @0x1dfb tl: 43 fb: --H-FL-- lb: 0x0 cc: 8 col 0: [ 3] c2 4f 2d col 1: [ 6] 54 55 52 4e 45 52 col 2: [ 8] 53 41 4c 45 53 4d 41 4e col 3: [ 3] c2 4d 63 col 4: [ 7] 77 b5 09 08 01 01 01 col 5: [ 2] c2 10 col 6: [ 1] 80 col 7: [ 2] c1 1f tab 0, row 10, @0x1dd5 tl: 38 fb: --H-FL-- lb: 0x0 cc: 8 col 0: [ 3] c2 4f 4d col 1: [ 5] 41 44 41 4d 53 col 2: [ 5] 43 4c 45 52 4b col 3: [ 3] c2 4e 59 col 4: [ 7] 77 bb 05 17 01 01 01 col 5: [ 2] c2 0c col 6: *NULL* col 7: [ 2] c1 15 tab 0, row 11, @0x1daf tl: 38 fb: --H-FL-- lb: 0x0 cc: 8 col 0: [ 2] c2 50 col 1: [ 5] 4a 41 4d 45 53 col 2: [ 5] 43 4c 45 52 4b col 3: [ 3] c2 4d 63 col 4: [ 7] 77 b5 0c 03 01 01 01 col 5: [ 3] c2 0a 33 col 6: *NULL* col 7: [ 2] c1 1f tab 0, row 12, @0x1d88 tl: 2 fb: --HDFL-- lb: 0x2 tab 0, row 13, @0x1d61 tl: 39 fb: --H-FL-- lb: 0x0 cc: 8 col 0: [ 3] c2 50 23 col 1: [ 6] 4d 49 4c 4c 45 52 col 2: [ 5] 43 4c 45 52 4b col 3: [ 3] c2 4e 53 col 4: [ 7] 77 b6 01 17 01 01 01 col 5: [ 2] c2 0e col 6: *NULL* col 7: [ 2] c1 0b end_of_block_dump End dump data blocks tsn: 4 file#: 4 minblk 32 maxblk 32
Берем дамп со смещением в начало блока. BBED> dump /v dba 4,32 offset 7652 count 64 File: /home/oracle/oracle/product/10.2.0/oradata/pahom/users01.dbf (4) Block: 32 Offsets: 7652 to 7715 Dba:0x01000020 ------------------------------------------------------- 0102c20e ff02c10b 3c020803 c2500304 l .. ... .<... P.. 46415244 07414e41 4c595354 03c24c43 l FARD.ANALYST. LC 0777b50c 03010101 02c21fff 02c1152c l .w ...... ... ., 000802c2 50054a41 4d455305 434c4552 l ... P.JAMES.CLER <16 bytes per line>
По дампу мы видим что строка 12 со смещением от начала блока @0x1d88. Смотрим с чего начинается строка. BBED> p *kdbr[12] rowdata[39] ----------- ub1 rowdata[39] @7660 0x3c
Ну это я привел дамп на начало строки. BBED> dump /v dba 4,32 offset 7660 count 64 File: /home/oracle/oracle/product/10.2.0/oradata/pahom/users01.dbf (4) Block: 32 Offsets: 7660 to 7723 Dba:0x01000020 ------------------------------------------------------- 3c020803 c2500304 46415244 07414e41 l <... P..FARD.ANA 4c595354 03c24c43 0777b50c 03010101 l LYST. LC.w ..... 02c21fff 02c1152c 000802c2 50054a41 l . ... .,... P.JA 4d455305 434c4552 4b03c24d 630777b5 l MES.CLERK. Mc.w <16 bytes per line>
Надо бы разобраться подробнее почему вычесть 16(десятичн) нужно от значения 1 байта строки. Пока возьму как аксиому. BBED> modify /x 2c offset 7660 File: /home/oracle/oracle/product/10.2.0/oradata/pahom/users01.dbf (4) Block: 32 Offsets: 7660 to 7723 Dba:0x01000020 ------------------------------------------------------------------------ 2c020803 c2500304 46415244 07414e41 4c595354 03c24c43 0777b50c 03010101 02c21fff 02c1152c 000802c2 50054a41 4d455305 434c4552 4b03c24d 630777b5 <32 bytes per line>
Для наглядности смотрим чего произошло. BBED> dump /v dba 4,32 offset 7660 count 64 File: /home/oracle/oracle/product/10.2.0/oradata/pahom/users01.dbf (4) Block: 32 Offsets: 7660 to 7723 Dba:0x01000020 ------------------------------------------------------- 2c020803 c2500304 46415244 07414e41 l ,... P..FARD.ANA 4c595354 03c24c43 0777b50c 03010101 l LYST. LC.w ..... 02c21fff 02c1152c 000802c2 50054a41 l . ... .,... P.JA 4d455305 434c4552 4b03c24d 630777b5 l MES.CLERK. Mc.w <16 bytes per line>
Правим контрольную сумму. BBED> sum dba 4,32 Check value for File 4, Block 32: current = 0x16d8, required = 0x16c8
BBED> sum dba 4,32 apply Check value for File 4, Block 32: current = 0x16c8, required = 0x16c8
Сбрасываем буфер. SQL> alter system flush buffer_cache; System altered.
Проверяем что у нас все вернулось. SQL> select * from scott.emp where ename='FARD'; EMPNO ENAME JOB MGR HIREDATE SAL COMM ---------- ---------- --------- ---------- --------- ---------- ---------- DEPTNO ---------- 7902 FARD ANALYST 7566 03-DEC-81 3000 20
SQL> select * from scott.emp; EMPNO ENAME JOB MGR HIREDATE SAL COMM ---------- ---------- --------- ---------- --------- ---------- ---------- DEPTNO ---------- 7369 SMITH CLERK 7902 17-DEC-80 800 20 7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30 7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30 7566 JONES MANAGER 7839 02-APR-81 2975 20 7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30 7698 BLAKE MANAGER 7839 01-MAY-81 2850 30 7782 CLARK MANAGER 7839 09-JUN-81 2450 10 7788 SCOTT ANALYST 7566 19-APR-87 3000 20 7839 KING PRESIDENT 17-NOV-81 5000 10 7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30 7876 ADAMS CLERK 7788 23-MAY-87 1100 20 7900 JAMES CLERK 7698 03-DEC-81 950 30 7902 FARD ANALYST 7566 03-DEC-81 3000 20 7934 MILLER CLERK 7782 23-JAN-82 1300 10 14 rows selected.
Для Linux програмка есть в поставке, но в разобраном виде. Поэтому выполняем следующие действия
cd $ORACLE_HOME/rdbms/lib make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
Имеет смысл скопировать bbed в каталог $ORACLE_HOME/bin. После запуска программки требуется ввод пароля. Для RedHat4 и Oracle10 пароль по умолчанию "blockedit".
[oracle@localhost lib]$ bbed Password:
BBED: Release 2.0.0.0.0 - Limited Production on Sat May 23 20:30:31 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
************* !!! For Oracle Internal Use only !!! ***************
Команды: help all - я бы сказал очень краткая помощь
BBED> help all SET DBA [ dba | file#, block# ] SET FILENAME 'filename' SET FILE file# SET BLOCK [+/-]block# SET OFFSET [ [+/-]byte offset | symbol | *symbol ] SET BLOCKSIZE bytes SET LIST[FILE] 'filename' SET WIDTH character_count SET COUNT bytes_to_display SET IBASE [ HEX | OCT | DEC ] SET OBASE [ HEX | OCT | DEC ] SET MODE [ BROWSE | EDIT ] SET SPOOL [ Y | N ] SHOW [ | ALL ] INFO MAP[/v] [ DBA | FILENAME | FILE | BLOCK ] DUMP[/v] [ DBA | FILENAME | FILE | BLOCK | OFFSET | COUNT ] PRINT[/x|d|u|o|c] [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ] EXAMINE[/Nuf] [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ] : N - a number which specifies a repeat count. u - a letter which specifies a unit size: b - b1, ub1 (byte) h - b2, ub2 (half-word) w - b4, ub4(word) r - Oracle table/index row f - a letter which specifies a display format: x - hexadecimal d - decimal u - unsigned decimal o - octal c - character (native) n - Oracle number t - Oracle date i - Oracle rowid FIND[/x|d|u|o|c] numeric/character string [ TOP | CURR ] COPY [ DBA | FILE | FILENAME | BLOCK ] TO [ DBA | FILE | FILENAME | BLOCK ] MODIFY[/x|d|u|o|c] numeric/character string [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ] ASSIGN[/x|d|u|o] = : [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ] : [ value | ] SUM [ DBA | FILE | FILENAME | BLOCK ] [ APPLY ] PUSH [ DBA | FILE | FILENAME | BLOCK | OFFSET ] POP [ALL] REVERT [ DBA | FILE | FILENAME | BLOCK ] UNDO HELP [ | ALL ] VERIFY [ DBA | FILE | FILENAME | BLOCK ] CORRUPT [ DBA | FILE | FILENAME | BLOCK ]
show - показывает текущие настройки. Какой файл данных смотрим, размер блока, где располагается список файлов данных и т.д.
BBED> show FILE# 0 BLOCK# 1 OFFSET 0 DBA 0x00000000 (0 0,1) FILENAME BIFILE bifile.bbd LISTFILE BLOCKSIZE 8192 MODE Browse EDIT Unrecoverable IBASE Dec OBASE Dec WIDTH 80 COUNT 512 LOGFILE log.bbd SPOOL No
BLOCKSIZE - Размер стандартного блока в байтах. MODE - Режим запуска программы (browse or edit) SILENT - Suppreses output to standart out (Y or N) SPOOL - Spools output to bbed.log file (Y or N) LISTFILE - Список датафайлов для редактирования CMDFILE - Имя файла со списком команд для выполнения BIFILE - Filename of before-image file (undo) file. Default name is bifile.bbd LOGFILE - Filename of user logfile. Default name is log.bbd PARFILE - Parameter file with above option listed. Почему-то я не наше этого параметря в Oracle10. Поэтому настройки менял вручную.
Если присмотреться к листингу предудщей команды и текущей, то нетрудно догадаться что выполнение команды SET DBA приведет к изменению параметра DBA в команде show. к примеру: выполнение команды set file 2 приведет к ошибке. И действительно если посмотреть на листинг команды show увидим что параметр LISTFILE пустой.
BBED> set file 2 BBED-00312: no LISTFILE specified
Исправить это можно выполнив следующие действия. Запрос к базе SQL> select file#||' '||name||' '||bytes from v$datafile; FILE#||''||NAME||''||BYTES --------------------------------------------------------------------------------1 /home/oracle/oracle/product/10.2.0/oradata/pahom/system01.dbf 503316480 2 /home/oracle/oracle/product/10.2.0/oradata/pahom/undotbs01.dbf 36700160 3 /home/oracle/oracle/product/10.2.0/oradata/pahom/sysaux01.dbf 251658240 4 /home/oracle/oracle/product/10.2.0/oradata/pahom/users01.dbf 5242880 5 /home/oracle/oracle/product/10.2.0/oradata/pahom/example01.dbf 104857600
Результат выполнения сохраним в файле /home/oracle/oracle/product/10.2.0/bbed/fileunix.log
И выполним команду BBED> set list '/home/oracle/oracle/product/10.2.0/bbed/fileunix.log' LISTFILE /home/oracle/oracle/product/10.2.0/bbed/fileunix.log Теперь запрос на установку параметра set file 2 выполнится. BBED> set file 2 FILE# 2
Изучив новый листинг команды show, заметим что текущие значения FILENAME, FILE#, DBA, LISTFILE изменились. BBED> show FILE# 2 BLOCK# 1 OFFSET 0 DBA 0x00800001 (8388609 2,1) FILENAME /home/oracle/oracle/product/10.2.0/oradata/pahom/undotbs01.dbf BIFILE bifile.bbd LISTFILE /home/oracle/oracle/product/10.2.0/bbed/fileunix.log BLOCKSIZE 8192 MODE Browse EDIT Unrecoverable IBASE Dec OBASE Dec WIDTH 80 COUNT 512 LOGFILE log.bbd SPOOL No
info - показывает список датафайлов. BBED> info File# Name Size(blks) ----- ---- ---------- 1 /home/oracle/oracle/product/10.2.0/oradata/pahom/system01. 61440 2 /home/oracle/oracle/product/10.2.0/oradata/pahom/undotbs01 4480 3 /home/oracle/oracle/product/10.2.0/oradata/pahom/sysaux01. 30720 4 /home/oracle/oracle/product/10.2.0/oradata/pahom/users01.d 640 5 /home/oracle/oracle/product/10.2.0/oradata/pahom/example01 12800
Конечно если указал файл с этим списком. Иначе получим результат: BBED> info File# Name Size(blks) ----- ---- ----------
set dba - Data Block Address. set dba "file_id","block"
set filename - Указываем имя текущего обрабатываемого датафайла
set file - Указываем file_id текущего обрабатываемого датафайла
set block - Указываем текущий блок данных обрабатываемого датафайла. Возможно использование set block +16. Если текущий блок 16, то после этой команды текущим станет 32 блок.
set offset - Незнакомое мне понятие. Кажется относительная ссылка в блоке(в байтах). Описание аналогично set block
set width - Ширина экрана. По умолчанию 80 символов
set count - Количество байт выводимых при команде dump. По умолчанию 512.
set ibase - Формат чисел используемый при работе с BBED. По умолчанию decimal (hexadecimal or octal)
map - The map command shows a map of the current block. Structure/Element Description Struct kcbh, 20 bytes ==Block Header Structure ub1 type_kcbh ==Block type (see Header Block Types below) ub1 frmt_kcbh ==Block format 1=Oracle7, 2=Oracle8+ ub1 spare1_kcbh ==Not used ub1 spare2_kcbh ==Not used ub4 rdba_kcbh ==RDBA – Relative Data Block Address ub4 bas_kcbh ==SCN Base ub2 wrp_kcbh ==SCN Wrap ub1 seq_kcbh ==Sequence number, incremented for every change made to the bock at the same SCN ub1 flg_kcbh ==Flag: 0x01 New block 0x02 delayed Logging Change advanced SCN/seq 0x04 Check value saved – block XOR’s to zero 0x08 Temporary block ub2 chkval_kcbh ==Optional block checksum ( if DB_BLOCK_CHECKSUM=TRUE) ub2 spare3_kcbh ==Not used struct ktbbh, 72 bytes ==Transaction Fixed Header Structure ub1 ktbbhtyp ==Block type (1=DATA, 2=INDEX) union ktbbhsid, 4 bytes ==Segment/Object ID struct ktbbhcsc, 8 bytes ==SCN at last block cleanout b2 ktbbhict ==Number of ITL slots ub1 ktbbhflg ==0=on the freelist ub1 ktbbhfsl ==ITL TX freelist slot ub4 ktbbhfnx ==DBA of next block on the freelist struct ktbbhitl[2], 48 bytes ==ITL list index struct kdbh, 14 bytes ==Data Header Structure ub1 kdbhflag ==N=pctfree hit(clusters); F=do not put on freelist; K=flushable cluster keys b1 kdbhntab ==Number of tables (>1 in clusters) b2 kdbhnrow ==Number of rows sb2 kdbhfrre ==First free row entry index; -1=you have to add one sb2 kdbhfsbo ==Freespace begin offset sb2 kdbhfseo ==Freespace end offset b2 kdbhavsp ==Available space in the block b2 kdbhtops ==Total available space when all TXs commit struct kdbt[1], 4 bytes ==Table Directory Entry Structure b2 kdbtofs b2 kdbtnrow sb2 kdbr[1] ==Row Directory ub1 freespace[8030] ==Free Space ub1 rowdata[38] ==Row Data ub4 tailchk ==(See Tailchecks below)
Header Block Types ID Type 01 Undo segment header 02 Undo data block 03 Save undo header 04 Save undo data block 05 Data segment header(temp,index,data and so on) 06 KTB managed data block (with ITL) 07 Temp table data block (no ITL) 08 Sort Key 09 Sort Run 10 Segment free list block 11 Data file header
Cache Layer Block Types
This is a list of the block type numbers found in cache layer block headers.
Code= Block Type= Versions 1= Undo header block (limited extents)= all, but superseded by type 14 from 8.0 2= Undo data block= all 3= Save undo header block (limited extents)= all, but superseded by type 15 from 8.0 4= Save undo data block= all 5= Data segment header block (limited extents, no freelist groups)= all, but superseded by type 16 from 8.0 6= Table/cluster/index segment data block= all 7= Temporary segment data block= all 8= Sort key block= all 9= Sort run block= all 10= Free list block= all, but superseded by type 22 from 8.0 11= Data file header block= all 12= Data segment header block (limited extents, with freelist groups)= all, but superseded by type 17 from 8.0 13= Compatibility segment= all 14= Undo header block (unlimited extents)= from 7.3 15= Save undo header block (unlimited extents)= from 7.3 16= Data segment header block (unlimited extents, no freelist groups)= from 7.3 17= Data segment header block (unlimited extents, with freelist groups)= from 7.3 18= Extent map block= from 7.3 19= Backup set piece header= from 8.0 20= Backup set directory block= from 8.0 21= Controlfile block= from 8.0 22= Free list block with free block count= from 8.0 23= LOB segment header block= from 8.0 24= LOB segment freelist block= from 8.0 25= LOB segment space usage index block= from 8.0 26= LOB segment space usage bitmap block= from 8.0 27= LOB segment chunk data block= from 8.0 28= don't know 29= LMT space map header block= from 8.1 30= LMT space map block= from 8.1 31= don't know 32= ASSM level 1 bitmap block= from 9.0 33= ASSM level 2 bitmap block= from 9.0 34= ASSM level 3 bitmap block= from 9.0 35= ASSM segment header block= from 9.0 36= ASSM extent map block= from 9.0 37= don't know 38= System managed undo header block= from 9.0
Tailchecks SCN base Type SCN seq 9728 06 02 A tail check of 0x97280602 stored on an Intel machine would be written to disk as "02062897".
(d)ump -The dump command dumps the content of the block to the screen. It can be combinet with the /v option to produce a more verbose output. Описание первых 16 байтов блока 06020000 0с00с001 16830300 00000104 Type Format Unused RDBA SCN Base SCN Wrap Seq Flag 06 02 0000 0c00c001 16830300 0000 01 04
(p)rint - Насколько понял печатает содержимое описания блока. Описание формата вывода Unit Size* | Name | Offset | Value
BBED> p offset 16 kcbh.chkval_kcbh ub2 chkval_kcbh @16 0x38aa
Switch Display Format /x Hex /d signed decimal /u uncigned decimal /o Octal /c Character /n Oracle Number /t Oracle Date /i Oracle ROWID
BBED> p /c offset 14 - получим в поле Value “.” вместо 0x01
e(x)amine - Надо разобраться. Чего-то там проверяет. Не совсем понятна строка BBED> x /rcnn
(f)ind - Поиск в блоке. Поиск можно задавать в различных типах данных /x Hexadecimal /d Decimal /u unsigned decimal /o Octal /c character (native) Если использовать TOP то поиск начинается с начала блока (offset 0) BBED> find /c ar TOP -поиск строки “ar” в текущем блоке. Начиная с начала блока.
copy - Копирование содержимого блока в другой блок. BBED> copy dba 2,16 to dba 1,16
(m)odify - Изменение данных в блоке. Начиная с 8170 байта BBED> modify /c Eisen dba 7,16 offset 8170
assign - The assign command does symbolic assignment, with type and range checking. Eithen target or source can be omitted for the current offset. Exemple assign structure at current offset to file 4, block 2’s first ITL entry BBED> assign dba 4,2 ktbbhitl[0]
sum - The sum command is used to check and set the block checksum. The apply directive can be used to update the checksum. Example shows the block checksum of file 7, block 16 being checked and then updated. BBED> sum dba 7, 16 Check value for File 7 Block 16: Current = 0x02d1, required = 0x09da BBED> sum dba 7, 16 apply Check value for File 7 Block 16: Current = 0x09da, required = 0x09da
push/pop - Записываем в память содержимое блока. Извлекаем из памяти в текущий блок. BBED> push dba 7, 16 BBED> set dba 6, 1 BBED> pop
revert - The revert command is used to restore a file, filename, block or DBA to it’s original state when bbed was started. BBED> revert dba 7, 16
undo - The undo command rolls back the last modify or assign command.
verify - The verify command is used to verify the integrity of the block. It performs a similar function to the "dbverify" utility.
corrupt - The corrupt command is used to mark blocks as media corrupt. Note: The undo command does not undo a corruption. The revert command however does.
It is often useful to dump the internal contents of Oracle internal structures such as the control files, library cache, and redo log headers. The following undocumented Oracle commands can be used for this purpose.
For each of these commands, a trace file will be generated in your UDUMP directory. After issuing the command, you can go to your UDUMP directory to view the contents of the dump.
1 – SCN Dump - This command dumps the control file contents to see SCN information. The SCN information is especially useful when doing a database recovery.
alter session set events 'immediate trace name CONTROLF level 10';
2 – File Header Dump - Here is the command to dump file headers. This dump is also quite useful if you have a corrupt database or a failure from rman in doing a database recovery.
alter session set events 'immediate trace name FILE_HDRS level 10';
3 - Dump redo log headers – This command will dump all of the redo log header information.
alter session set events 'immediate trace name REDOHDR level 10';
4 – System state dump – This command will dump the system state to your trace file.
alter session set events 'immediate trace name SYSTEMSTATE level 10';
5 – Process state dump – This command will dump the process state for all active processes in your database:
alter session set events 'immediate trace name PROCESSSTATE level 10';
6 – Library Cache Dump – This command is very useful for examining library Cache details, especially when you are having high library cache reloads or SQL access contention:
alter session set events 'immediate trace name library_cache level 10';
Here is a partial listing from this dump. As you can see, Oracle provides a wealth of detailed information about the internals of the library cache:
Совет с www.sql.ru Не пробовал, но запомнить стоит.
-- Действия при падении системы (когда уже нечего не помогает ) Проверенно -- set oracle_sid=oraSID -- sqlplus "/ as sysdba" -- sqlplus sys/sys@oraSID as sysdba sqlplus sys/sys_password@oraSID as sysdba -- create spfile from pfile; -- монтируем диски startup nomount; -- отключаем все сегменты отката alter system set "_corrupted_rollback_segments"='_SYSSMU1$','_SYSSMU2$','_SYSSMU3$','_SYSSMU4$','_SYSSMU5$','_SYSSMU6$','_SYSSMU7$','_SYSSMU8$','_SYSSMU9$','_SYSSMU10$' scope=spfile; -- запускаем с недокументироваными параметрами startup mount force; -- удаляем фаел UNDO alter database datafile 'C:\oracle\product\10.2.0\oradata\ora01d\UNDOTBS01.DBF' offline drop; -- правим базу recover database; -- пытаемся открыть alter database open;
Понадобилось мне как-то просмотреть wrap-ленную программку. Жадные разработчики хотели денешку за каждый чих, описания таблиц не дали. Но ведь МЫ скромные админы сами могем сделать отчет, а на каждый wrapper у нас есть свой болт с определенно насеченной резьбой. На тот момент я долго искать информацию как это зделать. Нашел капризную *.exe программу, которая ощасливила мое начальство. Нооо! Есть путь более правильный. Сам Oracle нам в помощь. В моем случае это Oracle 10. $ORACLE_HOME/rdbms/admin/diana.sql $ORACLE_HOME/rdbms/admin/diutil.sql $ORACLE_HOME/rdbms/admin/pipidl.sql – эти замечательные пакеты должны стоять в БД. Плюс процедурка дяди Пети Финнигана. До полного понимания чего происходит внутри мне еще ломать и ломать. Но того что проверено на первое время хватит. Да! источник информации вот тута. create procedure unwrap_r(aname varchar2) is root sys.pidl.ptnod; status sys.pidl.ub4; -- procedure recurse (n sys.pidl.ptnod) is -- seq sys.pidl.ptseqnd; len integer; -- begin -- --dbms_output.put_line('Node :'||n); --dbms_output.put_line('code (DEC) :'||pidl.ptkin(n)); --dbms_output.put_line('Node Type :'||pidl.ptattnnm(pidl.ptkin(n))); --dbms_output.put_line('--'); if(pidl.ptkin(n) = diana.d_comp_u) then recurse(diana.a_unit_b(n)); elsif (pidl.ptkin(n) = diana.d_s_body) then dbms_output.put_line('CREATE OR REPLACE '); recurse(diana.a_d_(n)); recurse(diana.a_header(n)); recurse(diana.a_block_(n)); dbms_output.put_line('END;'); dbms_output.put_line('/'); elsif(pidl.ptkin(n) = diana.di_proc) then dbms_output.put_line('PROCEDURE '||diana.l_symrep(n)); elsif(pidl.ptkin(n) = diana.d_p_) then recurse(diana.as_p_(n)); elsif(pidl.ptkin(n) = diana.ds_param) then -- not implemented null; elsif(pidl.ptkin(n) = diana.d_block) then dbms_output.put_line('IS '); recurse(diana.as_item(n)); dbms_output.put_line('BEGIN'); recurse(diana.as_stm(n)); recurse(diana.as_alter(n)); elsif(pidl.ptkin(n) = diana.ds_item) then -- not implemented null; elsif(pidl.ptkin(n) = diana.ds_stm) then seq := diana.as_list(n); len := pidl.ptslen(seq) - 1; for i in 0..len loop recurse(pidl.ptgend(seq,i)); end loop; elsif(pidl.ptkin(n) = diana.d_null_s) then dbms_output.put_line('NULL;'); elsif(pidl.ptkin(n) = diana.ds_alter) then -- not implemented null; else dbms_output.put_line('****ERROR*****'); end if; -- end recurse; -- begin
if (status <> sys.diutil.s_ok) then sys.dbms_output.put_line('Error: couldn''t find diana; status: ' || to_char(status)); raise sys.diutil.e_subpNotFound; end if; -- -- recurse through the DIANA nodes -- recurse(root); -- end unwrap_r;
Остается только выполнить пару действий, которые каждый может сделать по своему. SQL>set serveroutput on size 1000000 SQL>exec unwrap_r(‘’); Вах! Получили результат
Натолкнулся на перечень пользователей оракла с паролями по умолчанию. Бегом менять пароли. Хотя, проверил самого крутого пользователя dmsys и менее страшного outln которые были у меня в базе. Эти товарисчи заблокированны. Но чем черт не шутит. 1. Oracle Product Internet Directory Service User ID cn=orcladmin Password welcome 2. Oracle Product Oracle User ID LBACSYS Password LBACSYS 3. Oracle Product Oracle User ID OAS_PUBLIC Password OAS_PUBLIC 4. Oracle Product Oracle User ID MXAGENT Password MXAGENT 5. Oracle Product Oracle User ID MTS_USER Password MTS_PASSWORD 6. Oracle Product Oracle User ID MASTER Password PASSWORD 7. Oracle Product Oracle User ID LIBRARIAN Password SHELVES 8. Oracle Product Oracle User ID IMEDIA Password IMEDIA 9. Oracle Product Oracle User ID FROSTY Password SNOWMAN 10. Oracle Product Oracle User ID ESTOREUSER Password ESTORE 11. Oracle Product Oracle User ID EJSADMIN Password EJSADMIN 12. Oracle Product Oracle User ID DES Password DES 13. Oracle Product Oracle User ID DBI Password MUMBLEFRATZ 14. Oracle Product Oracle User ID CQSCHEMAUSER Password PASSWORD 15. Oracle Product Oracle User ID COMPIERE Password COMPIERE 16. Oracle Product Oracle User ID ADMIN Password WELCOME Level Administrator 17. Oracle Product Oracle User ID CISINFO Password CISINFO 18. Oracle Product Oracle User ID CIS Password CIS 19. Oracle Product Oracle User ID CIDS Password CIDS 20. Oracle Product Oracle User ID BC4J Password BC4J 21. Oracle Product Oracle User ID AQ Password AQ 22. Oracle Product Oracle User ID CENTRA Password CENTRA 23. Oracle Product Oracle User ID ADMIN Password JETSPEED 24. Oracle Product Oracle User ID ADAMS Password WOOD 25. Oracle Product Oracle User ID ADLDEMO Password ADLDEMO 26. Oracle Product Oracle User ID APPLSYS Password FND 27. Oracle Product Oracle User ID APPLSYSPUB Password FNDPUB 28. Oracle Product Oracle User ID APPS Password APPS 29. Oracle Product Oracle User ID AQDEMO Password AQDEMO 30. Oracle Product Oracle User ID AQJAVA Password AQJAVA 31. Oracle Product Oracle User ID AQUSER Password AQUSER 32. Oracle Product Oracle User ID AUDIOUSER Password AUDIOUSER 33. Oracle Product Oracle User ID AURORA$JIS$UTILITY$ Password (none) 34. Oracle Product Oracle User ID AURORA$ORB$UNAUTHENTICATED Password INVALID 35. Oracle Product Oracle User ID BLAKE Password PAPER 36. Oracle Product Oracle User ID CATALOG Password CATALOG 37. Oracle Product Oracle User ID CDEMO82 Password CDEMO82 38. Oracle Product Oracle User ID CDEMORID Password CDEMORID 39. Oracle Product Oracle User ID CDEMOUCB Password CDEMOUCB 40. Oracle Product Oracle User ID CLARK Password CLOTH 41. Oracle Product Oracle User ID COMPANY Password COMPANY Notes All Privs 42. Oracle Product Oracle User ID CSMIG Password CSMIG 43. Oracle Product Oracle User ID CTXDEMO Password CTXDEMO 44. Oracle Product Oracle User ID CTXSYS Password CTXSYS 45. Oracle Product Oracle User ID DBSNMP Password DBSNMP 46. Oracle Product Oracle User ID MDSYS Password MDSYS Notes All Privileges with Admin 47. Oracle Product Oracle User ID DEMO9 Password DEMO9 48. Oracle Product Oracle User ID EMP Password EMP 49. Oracle Product Oracle User ID EVENT Password EVENT 50. Oracle Product Oracle User ID FINANCE Password FINANCE 51. Oracle Product Oracle User ID FND Password FND 52. Oracle Product Oracle User ID GPLD Password GPLD 53. Oracle Product Oracle User ID GPFD Password GPFD 54. Oracle Product Oracle User ID HLW Password HLW 55. Oracle Product Oracle User ID HR Password HR 56. Oracle Product Oracle User ID IMAGEUSER Password IMAGEUSER 57. Oracle Product Oracle User ID JMUSER Password JMUSER 58. Oracle Product Oracle User ID JONES Password STEEL 59. Oracle Product Oracle User ID MFG Password MFG Notes All Privs 60. Oracle Product Oracle User ID MIGRATE Password MIGRATE 61. Oracle Product Oracle User ID MILLER Password MILLER 62. Oracle Product Oracle User ID MMO2 Password MMO2 63. Oracle Product Oracle User ID MOREAU Password MOREAU 64. Oracle Product Oracle User ID MODTEST Password YES 65. Oracle Product Oracle User ID MTSSYS Password MTSSYS 66. Oracle Product Oracle User ID NAMES Password NAMES 67. Oracle Product Oracle User ID OCITEST Password OCITEST 68. Oracle Product Oracle User ID ODS Password ODS 69. Oracle Product Oracle User ID OE Password OE 70. Oracle Product Oracle User ID OLAPDBA Password OLAPDBA 71. Oracle Product Oracle User ID PM Password PM 72. Oracle Product Oracle User ID OLAPSVR Password INSTANCE 73. Oracle Product Oracle User ID OLAPSYS Password MANAGER 74. Oracle Product Oracle User ID ORACACHE Password (random password) 75. Oracle Product Oracle User ID ORDPLUGINS Password ORDPLUGINS 76. Oracle Product Oracle User ID ORDSYS Password ORDSYS 77. Oracle Product Oracle User ID OSE$HTTP$ADMIN Password (random password) 78. Oracle Product Oracle User ID OUTLN Password OUTLN 79. Oracle Product Oracle User ID PERFSTAT Password PERFSTAT 80. Oracle Product Oracle User ID PO Password PO Notes DBA 81. Oracle Product Oracle User ID PO7 Password PO7 82. Oracle Product Oracle User ID PORTAL30 Password PORTAL31 83. Oracle Product Oracle User ID PORTAL30_DEMO Password PORTAL30_DEMO 84. Oracle Product Oracle User ID PORTAL30_PUBLIC Password PORTAL30_PUBLIC 85. Oracle Product Oracle User ID PORTAL30_SSO Password PORTAL30_SSO 86. Oracle Product Oracle User ID PORTAL30_SSO_PS Password PORTAL30_SSO_PS 87. Oracle Product Oracle User ID PORTAL30_SSO_PUBLIC Password PORTAL30_SSO_PUBLIC 88. Oracle Product Oracle User ID POWERCARTUSER Password POWERCARTUSER 89. Oracle Product Oracle User ID PRIMARY Password PRIMARY 90. Oracle Product Oracle User ID PUBSUB Password PUBSUB Notes DBA 91. Oracle Product Oracle User ID QS Password QS 92. Oracle Product Oracle User ID QS_ADM Password QS_ADM 93. Oracle Product Oracle User ID QS_CB Password QS_CB 94. Oracle Product Oracle User ID QS_CBADM Password QS_CBADM 95. Oracle Product Oracle User ID QS_CS Password QS_CS 96. Oracle Product Oracle User ID QS_ES Password QS_ES 97. Oracle Product Oracle User ID QS_OS Password QS_OS 98. Oracle Product Oracle User ID QS_WS Password QS_WS 99. Oracle Product Oracle User ID RE Password RE 100. Oracle Product Oracle User ID REPADMIN Password REPADMIN 101. Oracle Product Oracle User ID RMAIL Password RMAIL 102. Oracle Product Oracle User ID RMAN Password RMAN 103. Oracle Product Oracle User ID SAMPLE Password SAMPLE Notes DBA 104. Oracle Product Oracle User ID SECDEMO Password SECDEMO 105. Oracle Product Oracle User ID SH Password SH 106. Oracle Product Oracle User ID SYSADM Password SYSADM 107. Oracle Product Oracle User ID TRACESVR Password TRACE 108. Oracle Product Oracle User ID TSDEV Password TSDEV 109. Oracle Product Oracle User ID TSUSER Password TSUSER 110. Oracle Product Oracle User ID USER0 Password USER0 111. Oracle Product Oracle User ID USER1 Password USER1 112. Oracle Product Oracle User ID USER2 Password USER2 113. Oracle Product Oracle User ID USER3 Password USER3 114. Oracle Product Oracle User ID USER4 Password USER4 115. Oracle Product Oracle User ID USER5 Password USER5 116. Oracle Product Oracle User ID USER6 Password USER6 117. Oracle Product Oracle User ID USER7 Password USER7 118. Oracle Product Oracle User ID USER8 Password USER8 119. Oracle Product Oracle User ID USER9 Password USER9 120. Oracle Product Oracle User ID UTLBSTATU Password UTLESTAT 121. Oracle Product Oracle User ID VIDEOUSER Password VIDEO USER 122. Oracle Product Oracle User ID VIF_DEVELOPER Password VIF_DEV_PWD 123. Oracle Product Oracle User ID VIRUSER Password VIRUSER 124. Oracle Product Oracle User ID VRR1 Password VRR1 125. Oracle Product Oracle User ID WKSYS Password WKSYS 126. Oracle Product Oracle User ID CTXSYS Password (none) 127. Oracle Product Oracle User ID DEMO8 Password DEMO8 128. Oracle Product Oracle User ID CDEMOCOR Password CDEMOCOR 129. Oracle Product Oracle User ID ODSCOMMON Password ODSCOMMON 130. Oracle Product Oracle User ID OEMADM Password OEMADM 131. Oracle Product Oracle User ID OMWB_EMULATION Password ORACLE 132. Oracle Product Oracle User ID OPENSPIRIT Password OPENSPIRIT 133. Oracle Product Oracle User ID ORAREGSYS Password ORAREGSYS 134. Oracle Product Oracle User ID OSP22 Password OSP22 135. Oracle Product Oracle User ID OWA Password OWA 136. Oracle Product Oracle User ID OWA_PUBLIC Password OWA_PUBLIC 137. Oracle Product Oracle User ID PANAMA Password PANAMA 138. Oracle Product Oracle User ID PATROL Password PATROL 139. Oracle Product Oracle User ID PLSQL Password SUPERSECRET 140. Oracle Product Oracle User ID REP_MANAGER Password DEMO 141. Oracle Product Oracle User ID REP_OWNER Password DEMO 142. Oracle Product Oracle User ID REP_OWNER Password REP_OWNER 143. Oracle Product Oracle User ID SAP Password SAPR3 144. Oracle Product Oracle User ID SDOS_ICSAP Password SDOS_ICSAP 145. Oracle Product Oracle User ID SITEMINDER Password SITEMINDER 146. Oracle Product Oracle User ID SLIDE Password SLIDEPW 147. Oracle Product Oracle User ID STARTER Password STARTER 148. Oracle Product Oracle User ID STRAT_USER Password STRAT_PASSWD 149. Oracle Product Oracle User ID SWPRO Password SWPRO 150. Oracle Product Oracle User ID SWUSER Password SWUSER 151. Oracle Product Oracle User ID SYMPA Password SYMPA 152. Oracle Product Oracle User ID SYSMAN Password OEM_TEMP 153. Oracle Product Oracle User ID TAHITI Password TAHITI 154. Oracle Product Oracle User ID TDOS_ICSAP Password TDOS_ICSAP 155. Oracle Product Oracle User ID TESTPILOT Password TESTPILOT 156. Oracle Product Oracle User ID TRAVEL Password TRAVEL 157. Oracle Product Oracle User ID TURBINE Password TURBINE 158. Oracle Product Oracle User ID ULTIMATE Password ULTIMATE 159. Oracle Product Oracle User ID USER Password USER 160. Oracle Product Oracle User ID WEBCAL01 Password WEBCAL01 161. Oracle Product Oracle User ID WEBDB Password WEBDB 162. Oracle Product Oracle User ID WEBREAD Password WEBREAD 163. Oracle Product Oracle User ID WWW Password WWW 164. Oracle Product Oracle User ID WWWUSER Password WWWUSER 165. Oracle Product Oracle User ID XPRT Password XPRT 166. Oracle Product Oracle User ID ADMINISTRATOR Password ADMINISTRATOR Level Administrator 167. Oracle Product Oracle User ID ADMINISTRATOR Password admin Level Administrator 168. Oracle Product Oracle User ID ANDY Password SWORDFISH 169. Oracle Product Oracle User ID AP Password AP 170. Oracle Product Oracle User ID APPUSER Password APPUSER 171. Oracle Product Oracle User ID BRIO_ADMIN Password BRIO_ADMIN 172. Oracle Product Oracle User ID DEV2000_DEMOS Password DEV2000_DEMOS 173. Oracle Product Oracle User ID DISCOVERER_ADMIN Password DISCOVERER_ADMIN 174. Oracle Product Oracle User ID DSGATEWAY Password DSGATEWAY 175. Oracle Product Oracle User ID DSSYS Password DSSYS 176. Oracle Product Oracle User ID GL Password GL 177. Oracle Product Oracle User ID HCPARK Password HCPARK 178. Oracle Product Oracle User ID JWARD Password AIROPLANE 179. Oracle Product Oracle User ID L2LDEMO Password L2LDEMO 180. Oracle Product Oracle User ID MDDEMO Password MDDEMO 181. Oracle Product Oracle User ID MDDEMO_CLERK Password CLERK 182. Oracle Product Oracle User ID MDDEMO_MGR Password MGR 183. Oracle Product Oracle User ID MGWUSER Password MGWUSER 184. Oracle Product Oracle User ID ODM Password ODM 185. Oracle Product Oracle User ID ODM_MTR Password MTRPW 186. Oracle Product Oracle User ID OEMREP Password OEMREP 187. Oracle Product Oracle User ID OO Password OO 188. Oracle Product Oracle User ID ORASSO Password ORASSO 189. Oracle Product Oracle User ID OWNER Password OWNER 190. Oracle Product Oracle User ID PLEX Password PLEX 191. Oracle Product Oracle User ID PORTAL30 Password PORTAL30 192. Oracle Product Oracle User ID PUBSUB1 Password PUBSUB1 193. Oracle Product Oracle User ID QDBA Password QDBA 194. Oracle Product Oracle User ID REPORTS_USER Password OEM_TEMP 195. Oracle Product Oracle User ID SERVICECONSUMER1 Password SERVICECONSUMER1 196. Oracle Product Oracle User ID SYS Password D_SYSPW 197. Oracle Product Oracle User ID SYSTEM Password D_SYSTPW 198. Oracle Product Oracle User ID internal Password oracle 199. Oracle Product Oracle User ID scott Password tiger or tigger 200. Oracle Product Oracle User ID system Password manager 201. Oracle Product Oracle User ID sys Password change_on_install 202. Oracle Product Oracle User ID demo Password demo 203. Oracle Product Oracle User ID oracle Password oracle 204. Oracle Product Oracle User ID sys Password sys 205. Oracle Product Personal Oracle Version 8 Method Multi User ID PO8 Password PO8 206. Oracle Product Oracle User ID DIP Password DIP 207. Oracle Product Oracle User ID EXFSYS Password EXFSYS 208. Oracle Product Database Version OC4J 10g (10.1.3) Developer Preview User ID admin Password welcome 209. Oracle Product Oracle BPEL Process Manager User ID bpel Password bpel