Мы проводим двухнедельное корпоративное обучение у финансового клиента в Нью‑Йорке, и на сегодняшней сессии по архитектуре журнала транзакций меня спросили, почему номера последовательностей VLF (virtual log file) в новой базе не начинаются с единицы.
Вот пример:
CREATE DATABASE foo;
GO
DBCC LOGINFO ('foo');
GO
FileId FileSize StartOffset FSeqNo Status Parity CreateLSN
——- ——— ———– —— ——- ——- ——————
2 253952 8192 137 2 64 0
2 253952 262144 0 0 0 0
Почему первый номер последовательности (FSeqNo) равен 137, а не 1? (Пояснение по полям вывода недокументированной команды DBCC LOGINFO см. в заметке Поговорим ещё о циклической природе журнала транзакций).
Ответ: это на единицу больше, чем максимальный номер последовательности VLF, который в данный момент есть в базе model. Посмотрим:
DBCC LOGINFO ('model');
GO
FileId FileSize StartOffset FSeqNo Status Parity CreateLSN
——- ——— ———– —— ——- ——- ——————
2 253952 8192 136 2 128 0
2 262144 262144 135 0 128 0
Максимальный FSeqNo во выводе — 136, отсюда и 137 в новой пользовательской базе.
Сейчас докажу это, повысив номер последовательности в базе model:
USE model;
GO
CREATE TABLE BigRows (c1 INT IDENTITY, c2 CHAR (8000) DEFAULT 'a');
GO
INSERT INTO BigRows DEFAULT VALUES;
GO 50
DBCC LOGINFO;
GO
FileId FileSize StartOffset FSeqNo Status Parity CreateLSN
——- ——— ———– —— ——- ——- ——————
2 253952 8192 136 0 128 0
2 262144 262144 137 2 128 0
А теперь создам ещё одну пользовательскую базу — первый номер последовательности VLF должен быть 138:
CREATE DATABASE foo2;
GO
DBCC LOGINFO ('foo2');
GO
FileId FileSize StartOffset FSeqNo Status Parity CreateLSN
——- ——— ———– —— ——- ——- ——————
2 253952 8192 138 2 64 0
2 360448 262144 0 0 0 0
Так и есть — доказано!
Самые наблюдательные заметят, что размер файла журнала только что созданной базы foo2 больше, чем у первоначально созданной базы foo. Причина в том, что размер файла журнала по умолчанию выбирается как большее из двух значений: 0.5 МБ или 25% суммы размеров создаваемых файлов данных. В данном случае файл данных копируется из базы model, а я увеличил его размер при создании таблицы BigRows, поэтому журнал для новой базы должен быть немного больше.
В комментариях к записи прозвучал вопрос: почему максимальный номер последовательности VLF в моей базе model равен 136? Особой причины нет — я делал в model множество операций, которые генерировали журнал транзакций, поэтому номера последовательностей VLF выросли. По этой же причине в ваших экземплярах SQL Server значения почти наверняка будут другими.

Комментариев нет:
Отправить комментарий