Oracle: statement-level write consistency question.

User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Post by tengiz »

Merle wrote:...Разборки происходят не при фиксации, вместо этого, в случае конфликта версий происходит откат опоздпвшей транзакции. Тоесть поздавшая транзакция не порождает новую версию в надежде на неуспех более ранней транзакции, а откатывается.

Спасибо за ссылку - я внимательно всё прочитал. А Вы не знаете, как IB делает восстановление после краха? Описанные алгоритмы аккуратно обходят этот вопрос. Если бы IB работал так как я полагал (каждая транзакция создаёт свою версию, проверка конфликтов и сброс страниц делается при фиксации,) то с восстановлением всё было бы более-менее понятно - версии созданные незавершёнными транзакциями просто чистились бы при перезапуске сервера. Однако, если старая версия строки реально меняется непосредственно при обновлении, то всё повисает в воздухе начиная с этого момента и до момента фиксации, когда делается сброс на диск. И вообще, остутствие журнала делает высокопроизводительную и одновременно надёжную работу довольно проблематичной, на первый взгляд.

В общем, у Вас нет под рукой никаких ссылок с приличным описанием процедуры восстановления в IB?
Cheers
Merle
Уже с Приветом
Posts: 109
Joined: 26 Sep 2002 12:24

Post by Merle »

tengiz wrote: А Вы не знаете, как IB делает восстановление после краха? Описанные алгоритмы аккуратно обходят этот вопрос.

Увы... :(

tengiz wrote:Однако, если старая версия строки реально меняется непосредственно при обновлении, то всё повисает в воздухе начиная с этого момента и до момента фиксации, когда делается сброс на диск.

На сколько мне известно, реально она не меняется. Как я понял актуальное состояние базы считается на момент самой старшей незафиксированной транзакции.
Впрочем, давайте не будем гадать, я лучше попытаюсь по спрашивать про ссылки на первоисточники... :)

tengiz wrote:И вообще, остутствие журнала делает высокопроизводительную и одновременно надёжную работу довольно проблематичной, на первый взгляд.

Да вот самому любопытно, что там с журналом.. Вроде он как бы там есть, но явно его как бы нет. Непонятно вообщем.
А в руках я IB не держал..

tengiz wrote:В общем, у Вас нет под рукой никаких ссылок с приличным описанием процедуры восстановления в IB?

Alas. :(
Но зато кажется есть у кого спросить...
Big Cheese
Уже с Приветом
Posts: 1211
Joined: 02 Jul 2000 09:01
Location: SFBA

Post by Big Cheese »

Tengiz, Merle - спасибо за инфу. После прочтения мне тоже (хотя я и не специалист) кажется, что с восстановлением после сбоя у Interbase не все так гладко, как это описано в агитках :( - во всяком случае (как совершенно справедливо отметил Тенгиз) отсутствие такого достаточно очевидного решения, как журнализирование наводит на нехорошие подозрения. Услуги по ремонту баз данных Interbase, Firebird, Yaffil - тоже как-то неуютно становится... Вобщем, еще раз спасибо - будет о чем поговорить с interbase team - посмотрим, что они скажут...
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Post by tengiz »

Big Cheese,

На всякий случай во избежание недоразумений хочу почётче сказать, что я имел в виду: даже при остутствии журналирования несомненно можно обеспечить надёжное восстановление, но плата за это - производительность. То есть без журнала будет одно из двух - либо быстрые обновления, но остутствие автоматического восстановления; либо гарантия целостности при авариях даже в самые неудобные моменты, но медленные обновления (или, что почти то же самое - быстрые обновления при медленной фиксации).
Cheers
Big Cheese
Уже с Приветом
Posts: 1211
Joined: 02 Jul 2000 09:01
Location: SFBA

Post by Big Cheese »

tengiz wrote:На всякий случай во избежание недоразумений хочу почётче сказать, что я имел в виду: даже при остутствии журналирования несомненно можно обеспечить надёжное восстановление, но плата за это - производительность. То есть без журнала будет одно из двух - либо быстрые обновления, но остутствие автоматического восстановления; либо гарантия целостности при авариях даже в самые неудобные моменты, но медленные обновления (или, что почти то же самое - быстрые обновления при медленной фиксации).
Tengiz,

Спасибо за уточнение, хотя в Вашем постинге на мой взгляд и так все достаточно однозначно; это скорее я несколько неопределенно высказался, из-за того, что из технологий crash recovery я кроме журналирования ничего не знаю, навскидку тоже на ум ничего не приходит. Не могли бы Вы порекомендовать что-нибудь из литературы на эту тему (организация систем хранения, восстановление после сбоя)?
Merle
Уже с Приветом
Posts: 109
Joined: 26 Sep 2002 12:24

Post by Merle »

Вот, что удалось найти:
http://ibase.ru/devinfo/inplupd.htm
http://ibase.ru/devinfo/oitoat.htm
И вот еще любопытный FAQ.
http://ibase.ru/devinfo/db_repair.htm#corrupt
Вообщем похоже полноценного журнала все-таки нет... Но с другой стороны все изменения порождают новою версию и до их фиксации актуальной считается старое состояние базы. Таким образом в случае сбоя база находится в согласованом состоянии, проблемы возникают лишь в том случае, если сбой произошел во время сборки мусора (устаревших зафиксированных версий) и вот здесь бы журнал не помешал.
Big Cheese
Уже с Приветом
Posts: 1211
Joined: 02 Jul 2000 09:01
Location: SFBA

Post by Big Cheese »

Merle wrote:Вообщем похоже полноценного журнала все-таки нет... Но с другой стороны все изменения порождают новою версию и до их фиксации актуальной считается старое состояние базы. Таким образом в случае сбоя база находится в согласованом состоянии, проблемы возникают лишь в том случае, если сбой произошел во время сборки мусора (устаревших зафиксированных версий) и вот здесь бы журнал не помешал.
Может, я не прав, но если операция по сборке мусора происходит на одной странице данных, и если запись страницы считать атомарной операцией, тогда проблем тоже быть не должно - не получилось стереть старую запись сейчас, сотрем в следующий раз. А вот как при отсутствии журнала безопасно оперировать с индексными страницами B-Tree (вставлять, удалять страницы) - мне непонятно... Вообще, насколько я понимаю, любая операция, которая переводит образ базы на диске из одного согласованного состояния в другое и при этом не атомарна с точки зрения disk I/O (пишет более одного disk I/O unit) - должна быть сначала прописана в журнале, иначе восстановление после сбоя в общем случае невозможно. Оговорюсь еще раз - я в этом вопросе дилетант, хотелось бы узнать, что об этом думают специалисты...
Merle
Уже с Приветом
Posts: 109
Joined: 26 Sep 2002 12:24

Post by Merle »

Я вот здесь вот http://www.rsdn.ru/?forum/?mid=438892
Развел наших IB краеведов на обсуждение восстановления и вообще IB'ной версионности.
Много любопытных вещей рассказали...
Вообщем если интерес остался, то вот, велкам.
Меня, правда, боюсь на много не хватит, до меня юкон с PDC доехал и я в него погружаюсь... :P
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Post by tengiz »

Big Cheese wrote:А вот как при отсутствии журнала безопасно оперировать с индексными страницами B-Tree (вставлять, удалять страницы) - мне непонятно...

Это можно делать в "системной транзакции" - при необходимости "расщепить/склеить" страницы индекса делается отдельная транзакция, причём изменения, внесённые такой транзакцией не являются частью доступного пользователю состояния базы данных. Техника обеспечения атомарности при этом ничем не отличается от обычных пользовательских транзакций.
Вообще, насколько я понимаю, любая операция, которая переводит образ базы на диске из одного согласованного состояния в другое и при этом не атомарна с точки зрения disk I/O (пишет более одного disk I/O unit) - должна быть сначала прописана в журнале, иначе восстановление после сбоя в общем случае невозможно. Оговорюсь еще раз - я в этом вопросе дилетант, хотелось бы узнать, что об этом думают специалисты...

Для обеспечения восстанавливаемости по алгоритму WAL необходима инфомация undo и redo, информация о том, как завершились транзакции (commit, abort), а также информация о том, какая часть базы уже не требует актуализации, так как recovery для неё уже успешно закончился. В IB, судя по по ссылкам от Merle, информации undo и redo находятся прямо в страницах данных; никакой дополнительной информация о том, до какой точки дошёл recovery не нужна, так как транзакция ни будет зафиксирована, пока страницы данных не окажутся сброшенными на диск; а информация о завершении транзакций хранится отдельно.

B итоге, так как страницы данных самодостаточны для успешого undo и redo, в том числе и для recovery, то этот самый transaction inventory table или как она там в IB называется, фактически и является журналом. В каком-то смысле это как журнал координатора распределённой транзакции, а каждая отдельная странице со своим набором изменений - это как самодостаточный участник распределённой транзакции, при условии, что координатор всегда может всем сообщить общий итог.

Поэтому если информация об итоге всех транзакций всегда идёт сначала в отдельный transaction inventory, то восстанавливаемость гарантируется. Но при условии атомарности отдельной операции со страницей (что на самом деле не может быть 100% обеспечено с существующей технологией дисков, для защиты от таких проблем в том же SQL Server имеется torn page detection). Но слабое место у IB здесь, как уже было сказано, производительность - ввиду необходимости перед подтверждением commit сбросить на диск все грязные страницы, тронутые транзакцией.
Cheers
Big Cheese
Уже с Приветом
Posts: 1211
Joined: 02 Jul 2000 09:01
Location: SFBA

Post by Big Cheese »

Tengiz,

Спасибо большое за ответ! Если позволите, у меня еще пара вопросов
WAL - это Write Ahead Logic?
tengiz wrote:
Big Cheese wrote:А вот как при отсутствии журнала безопасно оперировать с индексными страницами B-Tree (вставлять, удалять страницы) - мне непонятно...

Это можно делать в "системной транзакции" - при необходимости "расщепить/склеить" страницы индекса делается отдельная транзакция, причём изменения, внесённые такой транзакцией не являются частью доступного пользователю состояния базы данных. Техника обеспечения атомарности при этом ничем не отличается от обычных пользовательских транзакций.
Вот тут я честно признаться, не понял. Т.е. опять же, при наличии журнала все более-менее понятно (надеюсь, что хоть здесь я не ошибаюсь): сначала пишется log entry, потом пишутся затронутые страницы (если не рассматривать performance improvements типа checkpointing). Для data pages в Interbase тоже (теперь) понятно - они сами себе log entries, но тогда для обеспечения recoverability нужно и non-leaf pages делать версионными, что на первый взгляд выглядит как-то дико...
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Post by tengiz »

Big Cheese,

WAL - это Write Ahead Logging. Страницы b-tree индекса, как внутренние (non-leaf), так и внешние (leaf) обычно имеют такую же или почти такую же структуру как и нормальные страницы со строками данных. В случае leaf pages в этих строках содержатся пары колонок (key, rowid строки данных), в случае внутренних страниц - пары (key, pageid страницы следующего уровня). Так что любые трюки, применяемые для страниц с данными, вполне могут работать для индексов тоже.
Cheers
Big Cheese
Уже с Приветом
Posts: 1211
Joined: 02 Jul 2000 09:01
Location: SFBA

Post by Big Cheese »

tengiz wrote:Big Cheese,

WAL - это Write Ahead Logging. Страницы b-tree индекса, как внутренние (non-leaf), так и внешние (leaf) обычно имеют такую же или почти такую же структуру как и нормальные страницы со строками данных. В случае leaf pages в этих строках содержатся пары колонок (key, rowid строки данных), в случае внутренних страниц - пары (key, pageid страницы следующего уровня). Так что любые трюки, применяемые для страниц с данными, вполне могут работать для индексов тоже.
Tengiz, еще раз спасибо. Если в Interbase действительно все реализовано подобным образом (мультиверсионность всех структур вплоть до non-leaf B-Tree pages), то мне это представляется весьма странным архитектурным решением, т.к. недостатки здесь, я полагаю, очевидны, а вот преимущества мне лично совершенно неочевидны. Впрочем, при всем богатстве выбора, другой альтернативы нет (с). Может, не так все и плохо окажется :) Еще раз спасибо всем!
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Post by tengiz »

Продолжения истории пока нет. Каждый раз, когда у меня было время на попытку запостить на AskTom.oracle.com, там висел статус с backlog, поэтому мне до сих пор никак не удалось найти окно, когда они принимают вопросы. Даже с учётом всех рекомендаций о правильных периодах времени, как с самого сайта, так и от vc (спасибо ему за информацию). Хотя на самом деле, судя по датам, некоторые настойчивые люди умудряются-таки впихнуть туда свои сообщения.
Cheers
vc
Уже с Приветом
Posts: 664
Joined: 05 Jun 2002 01:11

Post by vc »

tengiz wrote:Продолжения истории пока нет. Каждый раз, когда у меня было время на попытку запостить на AskTom.oracle.com, там висел статус с backlog, поэтому мне до сих пор никак не удалось найти окно, когда они принимают вопросы. Даже с учётом всех рекомендаций о правильных периодах времени, как с самого сайта, так и от vc (спасибо ему за информацию). Хотя на самом деле, судя по датам, некоторые настойчивые люди умудряются-таки впихнуть туда свои сообщения.


Just a gentle reminder... I am pretty sure you can post a follow-up to the original thread since your question would be entirely relevant. If you post a follow-up, you do not need to wait in line. It never hurts to try ;)

Rgds.
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Два вопроса на AskToM.Oracle.com

1. Почему исчез вопрос о баге в Oracle ?
2. Куда делся tengiz ?
:)
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014

Return to “Вопросы и новости IT”