В этой статье я научу вас устанавливать 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 ~/.bashrc
3) 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-server
SQL команды для подробной информации о сервере
SELECT Name from sys.databases;
SELECT @@VERSION as Version
SELECT SERVERPROPERTY('ServerName') as 'Container ID'
SELECT SERVERPROPERTY('Edition') as Edition
SELECT CURRENT_USER;
GO
Full-Text Search on Linux
Полнотекстовый поиск позволяет выполнять полнотекстовые запросы к символьным данным в таблицах SQL Server. Это позволит нам выполнить загрузку данных из .csv файлов в БД.
RHEL
sudo yum install -y mssql-server-fts
sudo yum check-update
sudo yum update mssql-server-fts
Ubuntu
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];
GO
delete.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
Теперь у вас есть тестовая база данных =)