Вопрос о журнале транзакций базы данных - PullRequest
6 голосов
/ 02 августа 2011

Я прочитал следующее утверждение:

SQL Server не записывает данные сразу на диск. Хранится в буферный кэш, пока этот кэш не заполнится или пока SQL Server не выдаст контрольная точка, а затем данные записываются. Если сбой питания происходит, пока кеш все еще заполняется, тогда эти данные теряются. Однако, когда питание возвращается, SQL Server запускается с состояние последней контрольной точки и любые обновления после последней контрольной точки, которые были зарегистрированы как успешные транзакции будут выполнены из журнал транзакций.

И возникает пара вопросов:

  1. Что если сбой питания произойдет после SQL Server выдаст контрольная точка и перед буферный кеш фактически записывается в диск? Не отсутствует ли постоянно содержимое в буферном кеше?

  2. Журнал транзакций также сохраняется как файл на диске, который не отличается от фактического файла базы данных. Так как же мы можем гарантировать целостность файла журнала?

Итак, правда ли, что никакой реальной транзакции не существует? Это всего лишь вопрос вероятность .

Ответы [ 2 ]

8 голосов
/ 02 августа 2011

Это правильное утверждение в том, что данные могут быть записаны в кэш, но при этом упускается жизненно важный момент, что SQL Server использует метод, называемый Write Ahead Logging (WAL). Записи в журнал не кэшируются, и транзакция считается завершенной только после записи записей транзакций в журнал.

http://msdn.microsoft.com/en-us/library/ms186259.aspx

В случае сбоя журнал воспроизводится, как вы упомянули, но ситуация с страницами данных, которые все еще находятся в памяти и не записаны на диск, не имеет значения, поскольку журнал их модификации хранится и может быть получен .

Это не правда, что нет реальной транзакции, но если вы работаете в режиме простого ведения журнала, то возможности воспроизведения нет.

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

2 голосов
/ 02 августа 2011

Что если сбой питания произойдет после того, как SQL Server введет контрольную точку, и до того, как буферный кеш будет фактически записан на диск?Разве содержимое в буферном кеше постоянно отсутствует?

Начало и конец контрольной точки - это разные записи в журнале транзакций.

Контрольная точка помечается как успешная только после окончанияконтрольная точка была записана в журнал, а LSN самой старой действующей транзакции (включая саму контрольную точку) записывается в базу данных.

Если контрольная точка не завершается, база данных возвращается кprevious LSN, при необходимости беря данные из журнала транзакций.

Журнал транзакций также сохраняется в виде файла диска, который ничем не отличается от фактического файла базы данных.Так как же мы можем гарантировать целостность файла журнала?

Мы не могли.Просто данные хранятся в двух местах, а не в одном.

Если кто-то украдет ваш сервер с данными и файлами журналов на нем, ваши транзакции будут потеряны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...