В 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, свободный.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.