Что такое instance (экземпляр) в Microsoft SQL Server?

«Что такое instance (экземпляр) в Microsoft SQL Server?» — вопрос из категории SQL и базы данных, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Microsoft SQL Server instance (экземпляр) — это отдельная, изолированная установка ядра СУБД SQL Server. На одном физическом или виртуальном сервере может работать несколько независимых экземпляров.

Ключевые характеристики экземпляра:

  • Собственные системные БД: Каждый экземпляр имеет свои копии master, model, msdb и tempdb.
  • Изолированная конфигурация: Настройки памяти, процессора, безопасности и другие параметры конфигурируются отдельно для каждого экземпляра.
  • Уникальное сетевое имя: К экземпляру обращаются по уникальному имени.
  • Отдельные службы Windows: Для каждого экземпляра запускаются свои службы SQL Server (INSTANCE_NAME) и SQL Server Agent (INSTANCE_NAME).

Типы экземпляров:

  1. Экземпляр по умолчанию (Default Instance):

    • На сервере может быть только один.
    • Доступен по сетевому имени компьютера (например, DBSERVER).
    • Использует стандартный порт 1433.
  2. Именованный экземпляр (Named Instance):

    • На сервере может быть несколько.
    • Имеет собственное имя, добавляемое к имени сервера через обратную черту: DBSERVERDEVELOPMENT, DBSERVERREPORTING.
    • Использует динамические порты (если не настроен статический).

Зачем использовать несколько экземпляров?

  • Изоляция сред: Разделение разработки, тестирования и производства на одном сервере.
  • Разные версии/редакции: Возможность запуска разных версий SQL Server (например, 2019 и 2022) для миграции или тестирования.
  • Распределение ресурсов: Назначение разных квот памяти и CPU для разных приложений или команд.
  • Безопасность: Изоляция БД с разными требованиями к доступу.

Практические команды:

-- Показать имя текущего экземпляра
SELECT @@SERVERNAME AS 'InstanceName';
SELECT SERVERPROPERTY('InstanceName') AS 'InstanceName'; -- Для именованных экземпляров

-- Показать все базы данных на текущем экземпляре
SELECT name FROM sys.databases;

Важно: Каждый экземпляр потребляет ресурсы сервера (память, CPU). Создание множества экземпляров на слабом железе может привести к деградации производительности всех.