15.11.25

Начальные номера последовательностей VLF и размер файла журнала по умолчанию

Автор: Paul Randal, Initial VLF sequence numbers and default log file size

Мы проводим двухнедельное корпоративное обучение у финансового клиента в Нью‑Йорке, и на сегодняшней сессии по архитектуре журнала транзакций меня спросили, почему номера последовательностей 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 значения почти наверняка будут другими.




Комментариев нет:

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