Как работают моментальные снимки базы данных

Моментальные снимки базы данных дают статическое представление базы данных-источника в режиме «только для чтения» в том виде, в котором она существовала при создании моментального снимка за вычетом незафиксированных транзакций. В процессе создания моментального снимка базы данных незафиксированные транзакции откатываются, поскольку компонент Database Engine после создания моментального снимка выполняет восстановление (транзакции в базе данных не затрагиваются).

Моментальные снимки базы данных зависят от базы данных-источника. Они должны находиться на одном экземпляре сервера вместе с базой данных. Более того, если по какой-либо причине база данных становится недоступной, все ее моментальные снимки также становятся недоступными.

Моментальные снимки можно использовать для составления отчетов. Кроме того, при возникновении пользовательской ошибки в базе данных-источнике эту базу данных можно вернуть к состоянию, в котором она находилась на момент создания моментального снимка. Произойдет только потеря изменений в базе данных, произведенных после создания моментального снимка. Также создание моментального снимка базы данных может быть полезно непосредственно перед крупными изменениями в базе данных, например изменением схемы или структуры таблицы. Дополнительные сведения об использовании моментальных снимков см. в разделе Типовые варианты использования моментальных снимков баз данных.

Чтобы использовать моментальные снимки, не обязательно знать принцип их работы, однако такие знания могут оказаться полезными. Моментальные снимки базы данных работают на уровне страниц данных. Перед первым изменением базы данных-источника исходная страница копируется из нее в моментальный снимок. Этот процесс называется операцией копирования при записи. Моментальный снимок хранит исходную страницу, оставляя записи данных в том виде, в котором они существовали на момент создания моментального снимка. Последующие обновления записей на измененной странице не влияют на содержимое моментального снимка. Процесс повторяется для каждой страницы, изменяемой впервые. Таким образом, моментальный снимок сохраняет исходные страницы всех записей данных, измененных с момента создания моментального снимка.

Для хранения исходных страниц моментальный снимок использует один или более разреженных файлов. Изначально разреженный файл представляет собой пустой файл, который не содержит никаких пользовательских данных, и ему еще не выделено место на диске для пользовательских данных. По мере обновления страниц в базе данных-источнике размер файла увеличивается. Когда производится моментальный снимок, разреженный файл занимает не много места на диске. По мере обновления базы данных разреженный файл может достигнуть больших размеров. Дополнительные сведения о разреженных файлах см. в разделе Основные сведения о размере разреженных файлов в моментальных снимках базы данных.

На этом рисунке показана операция копирования при записи. Светло-серый прямоугольник в диаграмме моментального снимка представляет потенциальное пространство разреженного файла как еще не распределенное. Получая первое обновление страницы в базе данных-источнике, компонент Database Engine записывает файл, и операционная система выделяет место в разреженном файле моментального снимка и копирует в него исходные страницы. Затем компонент Database Engine обновляет страницы в базе данных-источнике. На этом рисунке показана такая операция копирования при записи.

Операция считывания в моментальный снимок после обновления страницы

Важное примечаниеВажно!

Так как для моментальных снимков базы данных не предоставляется дополнительного хранилища, они не защищают от ошибок диска или иного рода повреждений. Создание регулярных резервных копий и тестирование плана восстановления необходимы для защиты базы данных. Если необходимо восстановить базу данных-источник на момент времени, в который был создан моментальный снимок базы данных, реализуйте политику резервного копирования, позволяющую это делать.

Операции считывания моментального снимка базы данных

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

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

Операция считывания перед копированием первой страницы в моментальный снимок

После обновления страницы операция считывания на моментальном снимке по-прежнему обращается к исходной странице, которая теперь хранится в разреженном файле. На этом рисунке показана операция считывания на моментальном снимке, которая обращается к странице после обновления в базе данных-источнике. Считывание происходит из разреженного файла моментального снимка.

Операция копирования при записи

Действие обновления конфигурации на рост моментального снимка базы данных

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

ПримечаниеПримечание

Сведения об определении фактического и потенциального размера моментального снимка см. в разделе Основные сведения о размере разреженных файлов в моментальных снимках базы данных.

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

На этом рисунке показано действие двух различных конфигураций обновления на размер моментального снимка. Конфигурация обновления А отражает условия, при которых в течение жизни моментального снимка обновляется только 30% всех исходных страниц. Конфигурация обновления Б отражает условия, при которых в течение жизни моментального снимка обновляется только 80% всех исходных страниц.

Другие шаблоны обновления и размеры моментальных снимков

Метаданные о моментальном снимке базы данных

Метаданные базы данных для моментального снимка базы данных включают свойство source_database_id, которое хранится в столбце представления каталога sys.databases. Дополнительные сведения об этом свойстве см. в разделе sys.databases (Transact-SQL).

Обычно моментальные снимки базы данных представляют не свои метаданные, а метаданные базы данных-источника. Такие метаданные включают, например, данные, возвращенные следующей инструкцией:

USE <database_snapshot> SELECT * FROM sys.database_files 

где <database_snapshot> — имя моментального снимка базы данных.

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