Подобно любым другим данным, хранящимся на компьютере, базы данных, создаваемые в SQL Server, должны храниться на жестком диске. SQL Server использует для хранения баз данных три различных типа файлов: первичные файлы, данных, вторичные файлы данных и файлы журнала транзакций.
Первичные файлы данных имеют расширение .MDF. Это файлы, создаваемые в базе данных в первую очередь и содержащие создаваемые пользователем объекты, такие как таблицы и представления, а также системные таблицы, необходимые SQL Server для поддержки базы данных. Если база данных разрастается так, что объема одного жесткого диска ей не хватает, вы можете создать вторичные файлы данных, имеющие расширение .NDF, на другом жестком диске, таким образом расширяя общее пространство, доступное базе данных.
Вторичные файлы данных могут быть сгруппированы. Файловой группой называют логическую группировку файлов; при этом физически файлы могут размещаться на разных дисках, но SQL Server будет их интерпретировать как единое целое. Свойство группировки незаменимо при поддержке громадных баз данных (VLDB), занимающих терабайты дискового пространства.
Файлы журнала транзакций. Они имеют расширение .LDF и не содержат объектов базы данных, таких как таблицы или представления. Чтобы понять сущность журнала транзакций, нужно иметь некоторое представление о механизме записи данных SQL Server на диск.
Когда пользователь хочет внести некоторые изменения в данные таблицы, эти изменения не выполняются непосредственно в файле на диске. Вместо этого сервер извлекает подлежащие изменению данные в оперативную память, где пользователь уже и вносит изменения. Через определенные промежутки времени (примерно через каждые 5 минут) SQL Server берет все изменения, содержащиеся в памяти, и записывает их в файл журнала транзакций. После того как изменения попали в журнал транзакций, они записываются в файл базы данных. Такой журнал называется упреждающим, так как запись в него выполняется перед записью в саму базу данных.
Вы спросите, зачем все это нужно? На то есть две причины, и первая из них — скорость. Память в сотни раз быстрее жесткого диска, поэтому, извлекая данные в память и выполняя изменения в ней, а не непосредственно на диске, мы сокращаем время записи в сотни раз. Вторая причина состоит в том, что журнал транзакций можно использовать для восстановления данных. Предположим, что прошлой ночью в 10 часов было выполнено резервирование данных, а сбой диска произошел сегодня в 11 часов утра, когда с базой данных уже велась работа несколько часов. Если при восстановлении воспользоваться только резервной копией базы данных, то будет потеряна вся работа за утро. Однако с помощью журнала транзакций данные могут быть восстановлены по состоянию на момент сбоя диска (разумеется, если журнал транзакций хранился на отдельном, рабочем диске). Журнал транзакций сохраняет данные и их изменения в режиме реального времени, и его можно рассматривать как оперативную резервную копию.
Теперь давайте заглянем внутрь файлов базы данных. Подумайте, что случилось бы, если бы они не имели внутреннего порядка или организации, т.е. если бы программа SQL Server записывала информацию в первое попавшееся свободное пространство. В этом случае потребовалась бы вечность, чтобы найти нужную информацию, и работа сервера замедлилась бы донельзя. Чтобы такого не случилось, SQL Server имеет невидимый нижний уровень хранения данных внутри файлов — страницы и экстенты.