powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Продолжение глубого понимания работы процесса LGWR
15 сообщений из 15, страница 1 из 1
Продолжение глубого понимания работы процесса LGWR
    #32156507
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В качестве опыта был написан и запущен следующий скрипт:
Код: plaintext
1.
2.
3.
4.
5.
6.
begin
 for i in  1 .. 100000  loop
  insert into alltab(table_name,owner) values(i||' '||sysdate,'SYS');
 end loop;
end;
/


Замечу сразу, что COMMIT не был сделан. А был сделан ROLLBACK.
В результате был сделан откат. Но сейчас не это главное.

База работает в режиме ARCHIVELOG.
В результате транзакции получилось 51 файлов журналов повторов(только для вставки).

Так вот после анализа LogMiner-ом выяснился следующий факт:
для этой транзакции было сформировано 947 уникальных номер SCN.
Причём на каждый SCN приходится неодинаковое количество операторо insert into...
Весь список публиковать не буду, только начало и конец:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
   SCN           Кол-во опер. insert на данный SCN
 --------------   ---------------------------------
 
    1137853            1 
    1137854            3 
    1137855            1 
    1137856            2 
    1137857            1 
    1137858            2 
    1137859            1 
    1137860            2 
    1137861            3 
    1137862            1 
    1137863            2 
    1137864            1 
    1137865            4 
    1137866            1 
    1137867            4 
    1137868            1 
    1137869            4 
    1137870            1 
    1137871            4 
   ..................
    1138832           43 
    1138833          108 
    1138834          152 
    1138835           69 
    1138836          160 
    1138837          100 
    1138838           25 
    1138839          125 
    1138840          144 
    1138841          116 
    1138842          120 
    1138843          139 
    1138844           76 
    1138846          130 
    1138847          130 
    1138848          130 
    1138849           16 
    1138850          112 
    1138851          148   


Делаем вывод, что реально SCN присваивается не
каждой отдельной транзакции, а группе операторов в транзакции.
Причём с первого вгляда понять логику - на какое количество операторов
в транзакции присваивается SCN трудно.
Я предполагаю, что на каждый сброс из буффера журнала повторов.

Народ, прокомментируйте кто как сможет.
...
Рейтинг: 0 / 0
Продолжение глубого понимания работы процесса LGWR
    #32157108
ShgGena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Один из серьезных курьезов в Oracle - это не точное понимание аббревиатуры SCN, поскольку это не одно а три разных по сути понятия:

SCN - Sytem Commit Number
SCN - System Checkpoint Number
SCN - System Change Number

В данном контексте мне видится что SCN означает - System Change Number, который используется Oracle как механизм внутренних блокировок. Этот номер увеличивается (счетчик) вне зависимости был выполнен commit или нет.
...
Рейтинг: 0 / 0
Продолжение глубого понимания работы процесса LGWR
    #32157125
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То что это именно "system change number" у меня сомнений нет.
Код: plaintext
1.
2.
3.
4.
Oracle8i Reference Release  2  ( 8 . 1 . 6 )
V$LOGMNR_CONTENTS
This view contains log history information.
SCN NUMBER( 15 ) The system change number


Поэтому вопрос остаётся открытым, по какому принципу происходит присвоение значения?

to ShgGena: Дай пример какой-нибудь таблицы, вью в котором есть столбец с именем "SCN" и это означает любое из:
SCN - Sytem Commit Number
SCN - System Checkpoint Number
...
Рейтинг: 0 / 0
Продолжение глубого понимания работы процесса LGWR
    #32157368
AI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все SCN в оракле используют одну и ту же последовательность. Разница в моментах времени, когда происходит изменение этой последовательности. При коммите назначается system commit number. Он же пишется в транзакционную таблицу блока и сегмента отката для пометки завершенности транзакции. System checkpoint number - это номер изменения системы, на который надо проводить синхронизацию, по окончании чекпойнта он прописывается в заголовки датафайлов. А в промежутках между коммитами, чекпойнтами и т.д. оракл проводит свои внутренние операции, которые помечаются как system change number. Поэтому различить их достаточно сложно.
...
Рейтинг: 0 / 0
Продолжение глубого понимания работы процесса LGWR
    #32157439
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"А в промежутках между коммитами, чекпойнтами и т.д. оракл проводит свои внутренние операции, которые помечаются как system change number. "

Ты наставиваешь на том, что именно внутренние?
...
Рейтинг: 0 / 0
Продолжение глубого понимания работы процесса LGWR
    #32157502
Фотография killed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В ОраМаг должна выйти (или уже вышла) статья Павла Шендрыгайлова "Что хранят редо-логи". Как раз на эту тему.
...
Рейтинг: 0 / 0
Продолжение глубого понимания работы процесса LGWR
    #32157511
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, интересно было бы почитать. Но вроде пока нет.
А он тебе на сайт еще не бросил?
...
Рейтинг: 0 / 0
Продолжение глубого понимания работы процесса LGWR
    #32157518
AI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть сомнения? В принципе, всю эту внутреннюю кухню и не надо знать. Какая разница, что означает scn, если он уникально определяет закоммиченную транзакцию? До коммита на scn ориентироваться нельзя, что опять-таки показывает ваш эксперимент - его просто нет. До фиксации уникальным идентификатором транзакции является положение транзакции в сегменте отката (поэтому одна транзакция и не может распределяться по разным сегментам отката). Это можно проверить по колонкам в v$logmnr_contents, относящимся к сегменту отката - xidusn, xidslt, xidsqn. Кстати, почему-то вы не посмотрели на столбец cscn - это как раз scn коммита.

Можно также сделать дампы блоков и посмотреть как занимаются транзакционные слоты, когда появляется номер коммита, как выставляются блокировки и т.п. Один раз это даже интересно сделать. Команда очень простая

alter system dump datafile {'filename'}|{fno} block {blockno}|block min {blockno} block max {blockno}.

Надеюсь, синтаксис понятен. Команда недокументирована, поэтому на вопросы о ней отвечать не буду.
...
Рейтинг: 0 / 0
Продолжение глубого понимания работы процесса LGWR
    #32157529
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Al: из вышесказано, меня заинтересовала мысль, что
"До фиксации уникальным идентификатором транзакции является положение транзакции в сегменте отката"

Вы хотите сказать что номер SCN для операторов в транзакции определяется положением в сегменте отката?
А что у сегментов отката уникальные номера в течении всей жизни БД?

Замечу что вызывает какое-то внутреннее несогласие фраза "положение транзакции в сегменте отката".
...
Рейтинг: 0 / 0
Продолжение глубого понимания работы процесса LGWR
    #32157611
AI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я буду ориентироваться на имена колонок в v$logmnr_contents. itl - interested transaction list - список транзакций в заголовке блока.

Вы хотите сказать что номер SCN для операторов в транзакции определяется положением в сегменте отката?
А что у сегментов отката уникальные номера в течении всей жизни БД?


Разумеется, у сегмента отката есть свой уникальный номер (usn), который не изменяется.

Архитектура транзакции следующая - в первой операции транзакции она распределяется в один из сегментов отката автоматически или по выбору разработчика xidusn. В транзакционной таблице в заголовке сегмента отката ей выделяется слот xidslt. Эта транзакционная таблица не бесконечна и переписывается по циклу. Каждый цикл переписывания этой таблицы увеличивает счетчик xidsqn. Таким образом, при активации транзакции ей назначается тройка чисел xidusn.xidslt.xidsqn. Эта же тройка чисел пишется и в itl блока данных, который модифицирруется транзакцией. Если транзакция затем меняет другие строки этого же блока, то в заголовках строк просто прописывается номер слота в itl блока для данной транзакции. Для других блоков, модифицируемых той же транзакцией, в itl пишутся та же тройка чисел xidusn.xidslt.xidsqn.

Это не предположение, а архитектура оракула. SCN в данном случае не играет определяющей роли в идентификации транзакции. Все изменения, проводимые транзакцией будут всегда характеризоваться одним и тем же идентификатором. В транзакционной таблице сегмента отката также находится ссылка на последний использованный блок отката (rba колонки в v$logmnr_contents) и признак активности/завершенности транзакции.

Если транзакция завершается аварийно, происходит откат изменений от последнего блока в usn по цепочке к первому в обратной последовательности изменений. В таблице транзакция помечается как неактивная и ей не назначается SCN, имеющий смысл system commit number. Если блок данных находится в кеше, то происходит откат "на месте", если блок был выбит из кеша, то он читается в ходе отката транзакции из датафайла в кеш и соответственно модифицируется.

При коммите, выделяется SCN (commit number), lgwr пишет журнальный буфер в журнальный файл, в транзакционную таблицу пишется выделенный номер коммита и транзакция там же помечается как неактивная. Если блок с изменениями не выбит на диск, то в itl также прописывается SCN транзакции (commit cleanout) - точный номер коммита. Если блок был выбит из кеша, то работает механизм delayed cleanout - транзакция в itl помечается как неактивная и блокировки снимаются следующими транзакциями. Тонкость в том, что не всегда возможно восстановить точный номер коммита в этом случае (переписана транзакционная таблица в USN). Тогда в блок прописывается приблизительный номер scn (минимальный, присутствующий в USN).

Замечу что вызывает какое-то внутреннее несогласие фраза "положение транзакции в сегменте отката".

Извините, ораклу наплевать на это.
...
Рейтинг: 0 / 0
Продолжение глубого понимания работы процесса LGWR
    #32157629
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to AI: спасибо конечно за большой обьём информации.
Но она несколько избыточна. По сути же очень мало. Только без обид, но меня интересует только SCN - system change number.

Я понял твою мыслю так, что один и тот-же SCN присваивается операторам, информация отмены для которых помещается в один сегмент?

То есть возвращаясь к моему примеру, и исходя из твоих слов - для транзакции было выделено 947 сегментов отката?
...
Рейтинг: 0 / 0
Продолжение глубого понимания работы процесса LGWR
    #32157719
AI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но она несколько избыточна. По сути же очень мало. Только без обид, но меня интересует только SCN - system change number.

То, что я написал - просто транзакционная архитектура оракла. Ориентироваться на scn в ней просто нельзя.

Я понял твою мыслю так, что один и тот-же SCN присваивается операторам, информация отмены для которых помещается в один сегмент?

Я этого не писал. Перечитай еще раз.

То есть возвращаясь к моему примеру, и исходя из твоих слов - для транзакции было выделено 947 сегментов отката?

Еще раз - scn это просто отметка о каком-то изменении состояния системы. В твоем примере под транзакцию был выделен только один сегмент отката, но в ходе выполнения транзакции система сменила свое состояние 947 раз. Ведь были невидимые транзакции в словаре типа выделения экстентов, переноса hwm, модификаций заголовков файлов от чекпойнтов, которые тоже приводили к увеличению scn.
...
Рейтинг: 0 / 0
Продолжение глубого понимания работы процесса LGWR
    #32157735
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ok, тогда забудем всё что ты сказал. И снова вернёмся к моему вопросу:
Код: plaintext
1.
2.
3.
4.
5.
Делаем вывод, что реально SCN присваивается не 
каждой отдельной транзакции, а группе операторов в транзакции. 
Причём с первого вгляда понять логику - на какое количество операторов 
в транзакции присваивается SCN трудно. 
Я предполагаю, что на каждый сброс из буффера журнала повторов. 


Как присваивается SCN?
...
Рейтинг: 0 / 0
Продолжение глубого понимания работы процесса LGWR
    #32160349
Фотография Andrew Campball
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно у Вас в момент вставки были активны другие транзакции, что вызвало переключение журналов повторов. При переключении журналов
SCH соответсвенно увеличивается.

Получается, что вы пишите транзакцию, журнал кончается на 1, 4 или более insert'ов
перключается журнал и увеличивается SCH.
...
Рейтинг: 0 / 0
Продолжение глубого понимания работы процесса LGWR
    #32160369
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Других транзакций не было и это не имеет значения
2) Естественно журналы переключаются при таком размере (512K) и таком количестве операторов - я же сказал, что 51 архивных файлов.
3) SCN определяется не в момент переключения журналов, а в момент когда элементы повтора помещаются в буфер журнала
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Продолжение глубого понимания работы процесса LGWR
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]