Обеспечение целостности данных. Управление транзакциями в СУБД Oracle и SQL Server, страница 6

Фиксация изменений в SQL Server

Запись и удаление страниц буферов

В MS SQL Server одна и та же система отвечает за:

·  запись измененных буферных страниц на диск;

·  пометку страниц как свободных, если к ним определенное время не обращаются.

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

Кэш-буфер (Buffer cache) – это структура, находящаяся в памяти. Каждая страница буфера имеет заголовок, который содержит счетчик ссылок и индикатор того, является ли эта страница “грязной” (dirty). Каждый раз, когда SQL-запрос ссылается на страницу буфера, значение счетчика увеличивается на один. Периодически кэш-буфер сканируется от начала до конца. Во время сканирования значение счетчика ссылок (находящегося в заголовке каждой страницы буфера) делится на 4, а остаток от деления отбрасывается. Когда значение счетчика достигает 0, проверяется индикатор dirty-страницы. Если страница «грязная», производится ее запись на диск. После записи измененной страницы на диск, или если запись не требовалась, страница буфера освобождается. Удаляется информация о связи между страницей буфера и страницей данных, находящейся в ней, и этот буфер помещается в список свободных буферных страниц. Благодаря этому часто используемые страницы остаются в памяти, в то время как страницы, используемые от случая к случаю, из памяти удаляются. Размер списка свободных буферных страниц SQL Server определяет самостоятельно с учетом размера кэш-буфера, он не может задаваться при конфигурировании сервера.

Когда SQL Server работает на Windows NT, работа по сканированию кэш-буфера, записи dirty-страниц и ведению списка свободных буферов, в основном, выполняется отдельными рабочими потоками. Рабочий поток (worker thread) получает адрес следующего раздела пула буферов, который необходимо просканировать из центральной структуры данных, затем сканирует этот раздел асинхронно с выполнением чтения. Если должна выполняться запись, то она планируется и осуществляется асинхронно, не влияя на готовность потока завершить необходимое ему чтение.

Каждый экземпляр SQL Server имеет отдельный поток «ленивой записи» (lazywriter thread), который тоже выполняет сканирование кэш-буфера. Поток «ленивой записи» периодически находится в пассивном состоянии. При каждом пробуждении он проверяет размер списка свободных буферов. Если этот список меньше определенного размера (что зависит от размера кэша), процесс сканирует кэш-буфер для выявления неиспользуемых страниц и записывает на диск dirty-страницы, счетчик ссылок которых имеет значение 0. В Windows NT подавляющая часть работы по ведению списка свободных буферов и записи dirty-страниц выполняется отдельными потоками, поэтому на долю потока «ленивой записи» потока выпадает незначительный объем работы. MS Windows 95/98 не поддерживает асинхронную запись, поэтому вся работа по ведению списка свободных буферов и записи dirty-страниц достается потоку «ленивой записи».

Процесс контрольной точки (checkpoint process) также периодически сканирует кэш-буфер с целью обнаружения dirty-страниц, и записывает на диск любую страницу буфера. Отличием является то, что процесс контрольной точки не помещает страницу буфера в список свободных буферных страниц. Работа процесса контрольной точки предназначена для минимизации числа dirty-страниц в памяти, что уменьшает потери при восстановлении в случае аварии сервера, а не для обслуживания списка свободных буферов. Обычно этот процесс находит всего несколько dirty-страниц, поскольку большинство dirty-страниц записываются рабочими потоками или потоком «ленивой записи» в период между двумя контрольными точками.

Поток записи в журнал (logwriter thread) обычно планирует операции записи журнальных строк в журнальные файлы. Исключением являются случаи, когда:

·  Подтверждение транзакции (commit) заставляет скинуть на диск журнальные записи, относящиеся к данной транзакции.

·  Контрольная точка (checkpoint) заставляет скинуть на диск журнальные записи, относящиеся ко всем транзакциям.

Регистрация транзакций

Каждая база данных SQL Server журналирует информацию о транзакциях и изменениях, произведенных транзакциями в базе данных. Этот список транзакций и изменений имеет три предназначения:

·  Восстановление отдельных транзакций.

Если в приложении встречается выражение ROLLBACK или SQL Server обнаруживает ошибку, например, разрыв связи с клиентом, для отката транзакции используются журнальные записи.

·  Восстановление незавершенных транзакций при начале работы SQL Server.

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

·  Прокрутка вперед в точку возникновения аварии.

Литература

1.  Вильям Дж. Пэйдж Использование Oracle8/8i: пер. с англ. – М.: Издательский дом "Вильямс", 1999.

2.  Архитектура современного SQL-сервера // Технология Клиент-Сервер [Электронный ресурс]. -- М.: АО Аудит-Оптим, 1999. -- Режим доступа: http://www.optim.ru/cs/1999/2/Sql7Architecture/Sql7Architecture.asp, свободный.