SQL Server на Linux - это тот же движок базы данных, что и на Windows, а не порт и не урезанная переделка. T-SQL идентичен, файлы .bak взаимозаменяемы, SSMS и любой драйвер подключаются к нему одинаково, и приложение не может определить, какая операционная система под ним. Отличается всё, что вокруг движка: он настраивается через mssql-conf и переменные окружения вместо SQL Server Configuration Manager, его файлы лежат в /var/opt/mssql, пути чувствительны к регистру, а целого списка ориентированных на Windows возможностей нет вовсе. Для базы приложения ни одна из отсутствующих возможностей обычно не важна. Для DBA, который приносит привычки из Windows, некоторые важны.
Это руководство разбирает SQL Server 2022 на Linux, включая редакцию Express, на которой работают небольшие хостинговые серверы, и аккуратно разделяет, какие различия идут от Linux, а какие - от Express.
Как Microsoft запускает движок Windows на Linux#
SQL Server тридцать лет писался под Windows, и Microsoft не стала его переписывать. Начиная с SQL Server 2017 движок работает поверх SQL Platform Abstraction Layer, SQLPAL - небольшой библиотечной операционной системы, которая даёт движку привычные ему службы в стиле Windows (управление памятью, потоки, ввод-вывод) и под капотом переводит их в вызовы Linux. Процесс, который вы видите в ps, называется sqlservr, работает от пользователя mssql, и в обычной установке им управляет systemd как службой mssql-server.
Практические следствия:
- Производительность сопоставима. Microsoft публикует результаты тестов для обеих платформ, и на обычных нагрузках вы не найдёте заметной разницы, которую можно было бы приписать операционной системе.
- Версия движка та же. SQL Server 2022 на Linux получает те же накопительные обновления, тот же уровень совместимости 160 и тот же оптимизатор запросов, что и на Windows.
- Памятью управляет движок, а не ядро. SQL Server на Linux сам себя ограничивает, по умолчанию 80 процентами видимой ему памяти, чтобы его не убил OOM killer. Внутри контейнера свежие сборки читают лимит памяти контейнера, а не общий объём хоста.
Последний пункт важен на хостинговых серверах. SQL Server, уверенный, что у него есть 128 ГБ хоста, будет бодро расти, пока контейнер не остановят на его реальном лимите. Если вы запускаете SQL Server в собственном контейнере, задайте лимит явно, а не полагайтесь на определение; на Linux поведение ядра при нехватке памяти беспощадно, как объясняет статья swap в Linux и OOM killer.
Редакции на Linux и что добавляет Express#
На Linux есть все редакции: Express, Developer, Standard, Enterprise, а также Evaluation. Редакция выбирается при установке - интерактивно через mssql-conf setup или переменной окружения MSSQL_PID в контейнере (Express, Developer, Standard, Enterprise или ключ продукта).
Express бесплатен и полностью функционален в пределах фиксированных потолков, одинаковых для обеих операционных систем:
| Ограничение | SQL Server 2022 Express |
|---|---|
| Размер базы | 10 ГБ данных на базу (файлы журнала не считаются) |
| Вычисления | Меньшее из 1 сокета или 4 ядер |
| Память buffer pool | 1410 МБ на экземпляр |
| Columnstore и in-memory OLTP | По 352 МБ |
| SQL Server Agent | Не входит |
| Сжатие backup | Недоступно (сжатые backup восстанавливать можно) |
Это ограничения редакции, а не Linux, но они определяют поведение сервера Express на Linux. В частности, потолок buffer pool означает, что 6 ГБ памяти для экземпляра Express не дают ему кэш на 6 ГБ: кэш данных останавливается примерно на 1,4 ГБ, а остальное идёт на кэш планов, рабочую память запросов, соединения и операционную систему. Больше памяти всё равно помогает, но не линейно. Когда этих потолков достаточно, разбирает статья хостинг SQL Server Express.
Настройка: mssql-conf и переменные окружения#
На Windows параметры уровня экземпляра меняют в SQL Server Configuration Manager и реестре. На Linux аналог - mssql-conf, скрипт, который редактирует /var/opt/mssql/mssql.conf:
$ sudo /opt/mssql/bin/mssql-conf set memory.memorylimitmb 3072$ sudo /opt/mssql/bin/mssql-conf set network.tcpport 1433$ sudo /opt/mssql/bin/mssql-conf set filelocation.defaultbackupdir /var/opt/mssql/backup$ sudo /opt/mssql/bin/mssql-conf traceflag 1222 on$ sudo systemctl restart mssql-serverБольшинство изменений вступает в силу только после перезапуска. Сам файл - обычный INI, и его легко читать:
[memory]memorylimitmb = 3072[network]tcpport = 1433[filelocation]defaultbackupdir = /var/opt/mssql/backup[traceflag]traceflag0 = 1222Параметры, которые вы, скорее всего, будете трогать:
| Параметр | Что он определяет |
|---|---|
memory.memorylimitmb | Сколько всего памяти может использовать SQL Server; по умолчанию 80% от видимой |
network.tcpport | Порт для подключений, по умолчанию 1433 |
filelocation.defaultdatadir / defaultlogdir | Куда новые базы кладут свои файлы |
filelocation.defaultbackupdir | Место BACKUP по умолчанию |
filelocation.errorlogfile | Куда пишется журнал ошибок |
network.tlscert / network.tlskey / network.forceencryption | Сертификат TLS и обязательность шифрования |
sqlagent.enabled | Включает SQL Server Agent (не в Express) |
language.lcid | Язык сообщений сервера |
В контейнере те же параметры обычно передают переменными окружения при первом запуске: ACCEPT_EULA=Y, MSSQL_SA_PASSWORD, MSSQL_PID, MSSQL_COLLATION, MSSQL_TCP_PORT, MSSQL_MEMORY_LIMIT_MB, MSSQL_DATA_DIR, MSSQL_LOG_DIR и MSSQL_BACKUP_DIR. Старая переменная SA_PASSWORD на некоторых образах ещё работает, но объявлена устаревшей.
max server memory, задаваемый через sp_configure, на Linux по-прежнему существует и по-прежнему ограничивает buffer pool и связанные кэши. Он находится внутри memory.memorylimitmb, который ограничивает весь процесс. Если вы управляете обоими, задайте memorylimitmb равным тому, что машина может выделить, а max server memory - несколько ниже.
На управляемом хостинге запускать mssql-conf обычно вообще нельзя - конфигурацией экземпляра владеет хостер, а вам выдаёт sa. Всё, что можно изменить из T-SQL (sp_configure, ALTER DATABASE, ALTER SERVER CONFIGURATION), по-прежнему работает, и этого хватает почти для всего, что нужно приложению.
Файлы, пути и чувствительность к регистру#
Установка по умолчанию держит всё в /var/opt/mssql:
/var/opt/mssql/ data/ system and user database files (.mdf, .ldf), default backups log/ errorlog, errorlog.1 ... and extended event files secrets/ the machine key mssql.conf the configuration fileИсполняемые файлы лежат в /opt/mssql/, а инструменты командной строки - в /opt/mssql-tools18/bin/ для текущих пакетов версии 18 (/opt/mssql-tools/bin/ для более старых). Журнал ошибок - текстовый файл, который можно читать любым инструментом, и часто это быстрее, чем открывать его через SSMS:
$ sudo tail -n 50 /var/opt/mssql/log/errorlogДве особенности путей ловят тех, кто переходит с Windows:
- Файловая система чувствительна к регистру.
/var/opt/mssql/Data/app.mdfи/var/opt/mssql/data/app.mdf- разные файлы.BACKUPилиRESTORE ... WITH MOVEс неправильным регистром завершается ошибкой операционной системы 2. - Пути принадлежат серверу.
RESTORE DATABASE ... FROM DISK = 'C:\backups\app.bak', запущенный из SSMS на вашем ноутбуке, ищет этот файл на Linux-машине. Сначала скопируйте файл на сервер.
Чувствительность файловой системы к регистру - отдельный вопрос от чувствительности к регистру ваших данных. Равно ли 'Smith' = 'smith', решает collation, точно так же, как на Windows. Collation сервера по умолчанию на Linux - SQL_Latin1_General_CP1_CI_AS, нечувствительная к регистру, так что имена таблиц, столбцов и сравнения ведут себя так, как привыкли пользователи Windows. Она выбирается при установке через MSSQL_COLLATION или mssql-conf set-collation, а подробности разбирает статья collation и Unicode в SQL Server.
Чего нет на Linux#
Microsoft ведёт официальный список возможностей, не поддерживаемых на Linux, и он меняется между версиями и накопительными обновлениями, так что сверяйтесь с ним для своей конкретной сборки. На момент SQL Server 2022 главные пробелы такие:
| Нет на Linux | Что это означает на практике |
|---|---|
| Reporting Services, Analysis Services | Запускайте их на Windows-сервере, направленном на базу на Linux |
| FILESTREAM и FileTable | Храните файлы в объектном хранилище или в varbinary(max) |
xp_cmdshell и большинство системных расширенных процедур | Никаких вызовов оболочки из T-SQL; скрипты вне движка |
Сборки CLR с пометкой EXTERNAL_ACCESS или UNSAFE | CLR SAFE работает; всё, что трогает ОС, - нет |
| Репликация слиянием | Транзакционная репликация и репликация моментальных снимков поддерживаются |
| Связанные серверы с источниками не SQL Server | Связанные серверы с другими SQL Server работают |
| Расширение buffer pool | На NVMe всё равно не нужно |
| Подсистемы Agent: CmdExec, PowerShell, SSIS, оповещения | Только шаги заданий на T-SQL, а Agent в Express нет |
Среди того, чего поначалу не было, а теперь есть: сам SQL Server Agent (в платных редакциях), полнотекстовый поиск (отдельный пакет mssql-server-fts), Database Mail, распределённые транзакции через MSDTC, аутентификация Active Directory с дополнительной настройкой и группы доступности Always On на Pacemaker вместо Windows Server Failover Clustering.
Одно различие в безопасности важно для импорта. На Linux фиксированная серверная роль bulkadmin не поддерживается, поэтому BULK INSERT и OPENROWSET(BULK ...) требуют sysadmin. Логин только с правами на базу не может загружать файлы с диска сервера; используйте вместо этого bcp или массовое копирование на стороне приложения по сети - это разбирает статья sqlcmd и bcp.
Вторая привычка, от которой придётся отказаться, - Windows-аутентификация. Хостинговый экземпляр на Linux использует SQL-аутентификацию: имя логина и пароль, в том числе sa. Строки подключения с Integrated Security=true или Trusted_Connection=yes с ним работать не будут.
Как запустить SQL Server на Linux самостоятельно#
На машине под вашим управлением поддерживаются Red Hat Enterprise Linux, SUSE Linux Enterprise Server и Ubuntu (точные версии смотрите в актуальном списке Microsoft, он меняется с каждым выпуском), а также официальный образ контейнера. Контейнер - самый быстрый способ получить локальный экземпляр для разработки:
$ docker run -d --name sql2022 \ -e ACCEPT_EULA=Y \ -e MSSQL_SA_PASSWORD='Choose-a-long-one-9' \ -e MSSQL_PID=Express \ -p 1433:1433 \ -v sqldata:/var/opt/mssql \ mcr.microsoft.com/mssql/server:2022-latestПароль должен соответствовать политике по умолчанию - не меньше восьми символов из трёх классов из четырёх: заглавные, строчные, цифры и символы, - иначе контейнер запустится и сразу завершится с ошибкой пароля в журнале. Подключите том в /var/opt/mssql, иначе базы исчезнут вместе с контейнером. Начиная с SQL Server 2019 образ работает от непривилегированного пользователя mssql, так что примонтированный каталог должен быть доступен на запись этому идентификатору пользователя.
Что касается CPU, SQL Server для Linux требует x86-64. Нативной сборки под ARM нет, и это стоит знать до покупки ноутбука для разработки на ARM или ARM-сервера.
В RE:NODE линейка SQL Server работает на SQL Server 2022 Express под Linux в собственном контейнере. Пароль sa генерируется, база создаётся для вас и назначается базой по умолчанию для sa, а SSMS подключается по имени сервера, записанному как host,port через запятую. Вы работаете через T-SQL и уже знакомые инструменты, а конфигурацией уровня экземпляра занимаются за вас.
Обновления и версии на Linux#
На Windows накопительные обновления приходят в виде установщиков, часто через Windows Update. На Linux SQL Server - обычный пакет из репозитория Microsoft, и обновление - это обновление пакета с последующим перезапуском службы:
$ sudo apt-get update$ sudo apt-get install mssql-server # Ubuntu$ sudo yum update mssql-server # Red HatОсновную версию и канал обновлений определяет репозиторий, который вы подключили. Для каждой основной версии Microsoft публикует репозиторий накопительных обновлений и репозиторий GDR (только исправления безопасности), и вы выбираете один из них при добавлении. Откат означает установку конкретной более ранней версии пакета, и менеджер пакетов это сделает, если её назвать, - установщик Windows никогда не делал это так же просто.
В контейнерах версия - это тег образа. mcr.microsoft.com/mssql/server:2022-latest сдвигается с каждым накопительным обновлением, что удобно для разработки и плохо для всего, что вам дорого, потому что заново скачанный контейнер может незаметно сменить сборку. В рабочей среде закрепите конкретный тег накопительного обновления и обновляйтесь осознанно. Файлы баз на томе обновляются на месте при первом открытии более новой сборкой, и, как восстановленный backup, после этого не открываются более старой. Делайте backup перед каждым обновлением - правило то же, что и на Windows, и столь же важное.
Чтобы увидеть, что у вас на самом деле запущено, из любого клиента:
SELECT @@VERSION;SELECT SERVERPROPERTY('ProductVersion') AS version, SERVERPROPERTY('ProductUpdateLevel') AS cu, SERVERPROPERTY('Edition') AS edition;@@VERSION на Linux называет и дистрибутив, и сборку, и это самый быстрый способ убедиться, что хостинговый экземпляр работает на Linux, и узнать его редакцию.
Что меняется для вашего приложения#
Обычно ничего. Драйверы говорят с тем же движком по тому же протоколу TDS, так что строка подключения, работающая с Windows, работает и с Linux, если указывает на правильный хост и порт и использует SQL-аутентификацию. Что стоит проверить:
- Шифрование по умолчанию. Свежие драйверы -
Microsoft.Data.SqlClient4.0 и новее, ODBC Driver 18, инструменты командной строки версии 18 - шифруют по умолчанию и проверяют сертификат. Самоподписанный сертификат тогда не проходит проверку; либо явно доверьтесь ему (TrustServerCertificate=True), либо установите нормальный. Точные ключевые слова для каждого драйвера есть в статье строки подключения SQL Server. - Порт. Хостинговые экземпляры часто слушают нестандартный порт, и в SQL Server он записывается через запятую:
db.example.net,14330, а не через двоеточие. - Пути к файлам в вашем коде. Всё, что собирает выражения
BACKUP,BULK INSERTилиCREATE DATABASEс путямиC:\, нуждается в путях Linux. - Всё, что использует `xp_cmdshell`, OLE automation или небезопасный CLR. Это придётся вынести из базы в приложение или скрипт.
Перенос существующей базы - это обычный backup и восстановление с WITH MOVE, указывающим каждому файлу путь Linux; пошагово это разобрано в статье перенос базы на хостинг SQL Server.
Решение проблем с экземпляром на Linux#
Служба не запускается после изменения конфигурации. Читайте /var/opt/mssql/log/errorlog и journalctl -u mssql-server. Обычные причины - лимит памяти ниже минимума движка, файл сертификата TLS, который пользователь mssql не может прочитать, или каталог данных с неправильным владельцем.
Ошибка операционной системы 5 или 13 при BACKUP или RESTORE. Права. Пользователь mssql должен иметь возможность читать файл backup и писать в целевой каталог.
Не удаётся подключиться удалённо. Проверьте, что порт слушается (ss -ltnp | grep 1433), что firewall его пропускает и что клиент указывает порт через запятую. Ошибки «Named Pipes Provider» на клиенте означают, что он вообще не добрался до сервера.
Login failed for user 'sa'. На Linux нет запасного варианта с Windows-аутентификацией. Сбросьте пароль через mssql-conf set-sa-password при остановленной службе, на машине под вашим управлением; на хостинговом сервере используйте пароль, сгенерированный хостером.
FAQ#
SQL Server на Linux медленнее, чем на Windows?
Не настолько, чтобы вы заметили на базе приложения. Это тот же движок с тем же оптимизатором, и Microsoft поддерживает обе платформы одинаково. Скорость хранилища, память и устройство запросов дают куда большую разницу, чем операционная система.
Можно ли использовать SSMS с SQL Server на Linux?
Да. SSMS работает на Windows и подключается по сети к экземпляру на любой платформе. Несколько возможностей SSMS, которые опираются на Windows на стороне сервера, например некоторые типы шагов заданий Agent, работать не будут, но просмотр, запросы, backup и планы выполнения работают.
Нужна ли лицензия на SQL Server Express на Linux?
Нет. Express бесплатен для рабочего использования на Linux так же, как на Windows, в пределах своих ограничений: 10 ГБ на базу, четыре ядра и около 1,4 ГБ памяти buffer pool. Редакция Developer тоже бесплатна, но только для разработки и тестирования.
Поддерживает ли SQL Server на Linux Windows-аутентификацию?
Только с дополнительной настройкой Active Directory на Linux-машине. Хостинговые экземпляры используют SQL-аутентификацию с логином и паролем, которую поддерживает любой драйвер. Уберите Trusted_Connection и Integrated Security из строк подключения.
Чувствительны ли имена таблиц к регистру на Linux?
По умолчанию нет. Имена объектов подчиняются collation базы, а она по умолчанию нечувствительна к регистру, так что Orders и orders - одна и та же таблица. А вот пути к файлам чувствительны к регистру, потому что принадлежат файловой системе Linux.




Комментарии
Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.