В этой статье я научу вас устанавливать Microsoft SQL Server 2022 на Linux и мы развернем тестовую базу данных от Microsoft в операционной системе Linux.
Мы будем использовать пакетным менеджером Yum для Linux дистрибутивов: RedHat (RHEL), CentOS, Scientific Linux и DPKG (Debian Package) – система управления пакетами в Debian и дистрибутивах на его основе, например Ubuntu и набирающем популярность Astra Linux, в связи с импортозамещением. Поэтому команды я приведу для обоих пакетных менеджеров. Так же рассмотрим универсальный способ запуска через Docker.
Microsoft SQL Server — система управления реляционными базами данных (СУБД), разработанная корпорацией Microsoft. Основной используемый язык запросов (диалект SQL) — Transact-SQL (T-SQL).
Для взаимодействия с СУБД MS SQL Server используются 2 основных способа:
1. Служебная программа sqlcmd
2. Microsoft SQL Server Management Studio (SSMS)
Конечно вы можете использовать привычный для вас DBeaver или DataGrip или любой другой инструмент администрирования базы данных.
Оглавление:
Установка MS SQL Server на Ubuntu 20.04.6 LTS (Debian, Astra Linux)
Установка MS SQL Server на Oracle Linux Server 8.7 (RedHat (RHEL), CentOS)
Выбор вы��уска
Выпуски SQL Server имеют бесплатные лицензии: Evaluation, Developer и Express.
Express является бесплатной для использования редакцией. Функционал довольно ограничен, самое ощутимое ограничение экспресс версии — максимальный размер базы 10 ГБ. Эта редакция подойдет для небольших проектов, например, студенческих работ или для обучения SQL/T-SQL.
Developer редакция так же как и Enterprise не имеет никаких ограничений и её можно использовать бесплатно, но она может использоваться только для разработки и тестирования приложений.
Web редакция почти ничем не отличается от standard, кроме как более сильными ограничениями в функционале и соответственно более низкой стоимости лицензирования;
Standard это полноценная платная редакция, но многих функций всё еще нет. Максимальный объём оперативной памяти, который сможет использовать SQL Server – 128 ГБ, также отсутствуют группы доступности AlwaysOn и другие компоненты. Standard предназначен для приложений в небольших организациях.
Evaluation — ознакомительная редакция SQL Server, которая предоставляет полный функционал Enterprise и работает в течении 180 дней (может быть обновлена до полноценной версии).
Enterprise включает в себя все возможные функции и компоненты, никаких ограничений нет. Корпоративная редакция обычно используется крупными корпорациями или компаниями, которым необходим функционал этой версии.
SQL Server Developer — идеальный выбор для людей, которые создают и тестируют приложения.
Запуск MS SQL Server через Docker
# Извлечь образ, при необходимости, и запустить контейнер c MS SQL Server на порту 1433 и именем контейнера mssql1
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=strongPassword123" -p 1433:1433 --name mssql1 -d mcr.microsoft.com/mssql/server:2022-latest
# Вывести список всех контейнеров
docker ps -a
# Служебная программа sqlcmd позволяет вводить инструкции Transact-SQL
docker exec -it mssql1 /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P strongPassword123
# Удалить созданный вами контейнер
docker rm mssql1 -fПодробнее:
Установка MS SQL Server на Ubuntu 20.04.6 LTS (Debian, Astra Linux)
Подробнее: https://learn.microsoft.com/ru-ru/sql/linux/quickstart-install-connect-ubuntu?view=sql-server-ver16
wget -qO- https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
sudo add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/20.04/mssql-server-2022.list)"
sudo apt-get update
sudo apt-get install -y mssql-server
sudo /opt/mssql/bin/mssql-conf setup
systemctl status mssql-serverОткрыть порты
# Восстановление настроек по умолчанию
sudo ufw default deny incoming
sudo ufw default allow outgoing
# Разрешаем подключение
sudo ufw allow 1433
# активировать UFW
sudo ufw enable
# Дополнительно:
# диапазоны портов и протокол
sudo ufw allow 6000:6007/tcp
sudo ufw allow 6000:6007/udpПодробнее:
https://learn.microsoft.com/ru-ru/sql/linux/quickstart-install-connect-red-hat?view=sql-server-ver16
Установка MS SQL Server на Oracle Linux Server 8.7 (RedHat (RHEL), CentOS)
sudo curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/8/mssql-server-2022.repo
sudo yum install -y mssql-server
sudo /opt/mssql/bin/mssql-conf setup
systemctl status mssql-serverОткрыть порты
sudo firewall-cmd --zone=public --add-port=1433/tcp --permanent
sudo firewall-cmd --reloadСлужебная программа sqlcmd
Для работы программы sqlcmd требуется установка ODBC Driver for SQL Server, подводным камнем тут является то, что нам нужна именно 17 версия для работы с Microsoft SQL Server 2022 (RTM-CU4) (KB5026717).
1) Для работы из-под Windows 10 из Windows Terminal (PowerShell)
Download ODBC Driver for SQL Server
2) RHEL 8
sudo curl -o /etc/yum.repos.d/msprod.repo https://packages.microsoft.com/config/rhel/8/prod.repo
sudo yum remove unixODBC-utf16 unixODBC-utf16-devel
sudo yum install -y mssql-tools unixODBC-devel
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
source ~/.bashrc3) Ubuntu 20.04
sudo apt-get update
sudo apt install curl
curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list | sudo tee /etc/apt/sources.list.d/msprod.list
sudo apt-get update
sudo apt-get install mssql-tools unixodbc-dev
sudo apt-get update
sudo apt-get install mssql-tools
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
source ~/.bashrcЛокальное подключение
sqlcmd -S localhost -U sa -P strongPassword123
# Выход из приглашения команды sqlcmd
QUITПодробнее:
Microsoft SQL Server Management Studio (SSMS)
SQL Server Management Studio (SSMS) — это интегрированная среда для управления любой инфраструктурой SQL.
Скачивание SQL Server Management Studio (SSMS)

Работа со службой Database Engine
#Проверьте состояние службы Database Engine
sudo systemctl status mssql-server
#Остановить, запустить или перезапустить службу Database Engine
sudo systemctl stop mssql-server
sudo systemctl start mssql-server
sudo systemctl restart mssql-serverSQL команды для подробной информации о сервере
SELECT Name from sys.databases;
SELECT @@VERSION as Version
SELECT SERVERPROPERTY('ServerName') as 'Container ID'
SELECT SERVERPROPERTY('Edition') as Edition
SELECT CURRENT_USER;
GOFull-Text Search on Linux
Полнотекстовый поиск позволяет выполнять полнотекстовые запросы к символьным данным в таблицах SQL Server. Это позволит нам выполнить загрузку данных из .csv файлов в БД.
RHEL
sudo yum install -y mssql-server-fts
sudo yum check-update
sudo yum update mssql-server-ftsUbuntu
sudo apt-get update
sudo apt-get install -y mssql-server-ftsПодробнее: Install SQL Server Full-Text Search on Linux
Простой пример развертывания БД для Linux
Это упрощенный пример создания тестовой базы данных от Microsoft.
Этот пример нужен для самостоятельной корректировки SQL-скриптов создания тестовой БД Microsoft на Linux.
Воспроизвести работу примера:
Создать sql-скрипты описанные ниже
Перенести SQL файлы на сервер (например через MobaXTerm)
Настроить права доступа для пользователя и группы
Выполнить скрипты в порядке их следования
Команды Linux (для новичков):
# Создаем папку TestMe в директории вашего пользователя - мой пользователь: admin
# /home/admin/
mkdir TestMe
# Загружаем файлы на сервер через ftp встроенный в MobaXTerm
# просто выделив их и перенеся в директорию вашего пользователя
# Переключаемся на root (суперпользователя)
sudo su
cd /var
mkdir sqlbackup
cd sqlbackup
mkdir TestMe
# переносим файлы в директорию TestMe - cp /home/admin/TestMe/* /var/sqlbackup/TestMe
chown mssql -R sqlbackup/
chgrp mssql -R sqlbackup/Запуск sql скриптов через sqlcmd при подключении к удаленному серверу по SSH через MobaXTerm
sqlcmd -S localhost -U SA -P strongPassword123 -i /var/sqlbackup/TestMe/ddl.sqlСами тестовые данные - AddressType.csv
1 Billing {B84F78B1-4EFE-4A0E-8CB7-70E9F112F886} 2008-04-30 00:00:00
2 Home {41BC2FF6-F0FC-475F-8EB9-CEC0805AA0F2} 2008-04-30 00:00:00
3 Main Office {8EEEC28C-07A2-4FB9-AD0A-42D4A0BBC575} 2008-04-30 00:00:00
4 Primary {24CB3088-4345-47C4-86C5-17B535133D1E} 2008-04-30 00:00:00
5 Shipping {B29DA3F8-19A3-47DA-9DAA-15C84F4A83A5} 2008-04-30 00:00:00
6 Archive {A67F238A-5BA2-444B-966C-0467ED9C427F} 2008-04-30 00:00:00Файл | Описание |
ddl.sql | Удаляет БД, если ранее она была создана Создает БД Создает таблицу |
insert.sql | Вставляет в таблицу данные |
select.sql | Делает выборку данных из таблицы |
delete.sql | Удаляет все записи из таблицы |
ddl.sql
:setvar SqlSamplesSourceDataPath "/var/sqlbackup/TestMe/data/"
:setvar DatabaseName "TestMe"
IF '$(SqlSamplesSourceDataPath)' IS NULL OR '$(SqlSamplesSourceDataPath)' = ''
BEGIN
RAISERROR(N'The variable SqlSamplesSourceDataPath must be defined.', 16, 127) WITH NOWAIT
RETURN
END;
SET NOCOUNT OFF;
GO
PRINT CONVERT(varchar(1000), @@VERSION);
GO
PRINT '';
PRINT 'Started - ' + CONVERT(varchar, GETDATE(), 121);
GO
USE [master];
GO
-- ****************************************
-- Drop Database
-- ****************************************
PRINT '';
PRINT '*** Dropping Database';
GO
IF EXISTS (SELECT [name] FROM [master].[sys].[databases] WHERE [name] = N'$(DatabaseName)')
DROP DATABASE $(DatabaseName);
-- If the database has any other open connections close the network connection.
IF @@ERROR = 3702
RAISERROR('$(DatabaseName) database cannot be dropped because there are still other open connections', 127, 127) WITH NOWAIT, LOG;
GO
-- ****************************************
-- Create Database
-- ****************************************
PRINT '';
PRINT '*** Creating Database';
GO
CREATE DATABASE $(DatabaseName);
GO
PRINT '';
PRINT '*** Checking for $(DatabaseName) Database';
/* CHECK FOR DATABASE IF IT DOESN'T EXISTS, DO NOT RUN THE REST OF THE SCRIPT */
IF NOT EXISTS (SELECT TOP 1 1 FROM sys.databases WHERE name = N'$(DatabaseName)')
BEGIN
PRINT '*******************************************************************************************************************************************************************'
+char(10)+'********$(DatabaseName) Database does not exist. Make sure that the script is being run in SQLCMD mode and that the variables have been correctly set.*********'
+char(10)+'*******************************************************************************************************************************************************************';
SET NOEXEC ON;
END
GO
ALTER DATABASE $(DatabaseName)
SET RECOVERY SIMPLE,
ANSI_NULLS ON,
ANSI_PADDING ON,
ANSI_WARNINGS ON,
ARITHABORT ON,
CONCAT_NULL_YIELDS_NULL ON,
QUOTED_IDENTIFIER ON,
NUMERIC_ROUNDABORT OFF,
PAGE_VERIFY CHECKSUM,
ALLOW_SNAPSHOT_ISOLATION OFF;
GO
USE $(DatabaseName);
GO
CREATE TYPE [Name] FROM nvarchar(50) NULL;
GO
CREATE TABLE [Person].[AddressType](
[AddressTypeID] [int] IDENTITY (1, 1) NOT NULL,
[Name] [Name] NOT NULL,
[rowguid] uniqueidentifier ROWGUIDCOL NOT NULL CONSTRAINT [DF_AddressType_rowguid] DEFAULT (NEWID()),
[ModifiedDate] [datetime] NOT NULL CONSTRAINT [DF_AddressType_ModifiedDate] DEFAULT (GETDATE())
) ON [PRIMARY];
GO
insert.sql
USE [TestMe];
GO
BULK INSERT [Person].[AddressType] FROM '/var/sqlbackup/AdventureWorks/AddressType.csv'
WITH (
CHECK_CONSTRAINTS,
DATAFILETYPE = 'char',
FIELDTERMINATOR= '\t',
ROWTERMINATOR = '\n',
KEEPIDENTITY,
TABLOCK
);
GO
SELECT * FROM [PERSON].[AddressType];
GO
select.sql
USE [TestMe];
GO
SELECT * FROM [PERSON].[AddressType];
GOdelete.sql
USE [TestMe];
GO
DELETE FROM [Person].[AddressType];
GO
SELECT * FROM [Person].[AddressType];
GOРазвертывание тестовой БД Microsoft для Linux
Создадим на сервере Linux директорию /var/sqlbackup/AdventureWorks
SQL samples -> GitHub Repository -> adventure-works -> oltp-install-script
Нам нужен пункт: To install AdventureWorks
Из него скачиваем zip архив с данными и sql скриптом для расскатки БД.
Разархивируем zip
Отредактируем файл instawdb.sql
...
:setvar SqlSamplesSourceDataPath "/var/sqlbackup/AdventureWorks/"
...
:setvar DatabaseName "AdventureWorks"Удаляем все строчки с: CODEPAGE='ACP', в instawdb.sql
ACP это ANSI, а Linux использует UTF-8, а UTF-8 это расширенный ANSI, а кодовые страницы в Linux не используются, поэтому убрав строки всё будет работать
После переносим .csv данные и единственный sql-скрипт в /var/sqlbackup/AdventureWorks на нашем сервере Linux
Выполняем sql-скрипт
sqlcmd -S localhost -U SA -P strongPassword123 -i /var/sqlbackup/AdventureWorks/instawdb.sqlТеперь у вас есть тестовая база данных =)
