MSSQL

Материал из ALT Linux Wiki
Есть рецепт в epm!
epm play -y mssql-server mssql-tools


Установка MS SQL

Посредством eepm

(будет установлена 15 версия, она же 2019)

epm play -y mssql-{server,tools}

На Альт Сервер 8

Установить необходимое ПО: apt-get install -y eepm wget lftp unixODBC

Собственно сервер

  1. С https://packages.microsoft.com/rhel/7/mssql-server-2019/ скачать пакет mssql-server-15.0.2000.5-5.x86_64.rpm или более новый.
  2. Установить с пересборкой под Альт: epmi -y --repack `ls mssql-server-1*`
  3. Создать пользователя: useradd mssql
  4. Создать рабочий каталог для сервера: install -o mssql -g mssql -d /var/opt/mssql
  5. Прописать автоматический запуск службы: systemctl enable mssql-server
  6. Пройти мастер первоначального конфигурирования: /opt/mssql/bin/mssql-conf setup
    SQL Server будет запущен.
  7. Проверить подключение: /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P'Pa$$word' -Q 'sp_databases'
    Можно делать это с другой машины и из другой программы — например, из Management Studio.
  • Если SQL Server отвергает все попытки подключения с ошибкой "Error code 0x2746"
    1. Доустановить библиотеку и скорректировать загрузку:
      apt-get install libssl10
      systemctl stop mssql-server
      systemctl edit mssql-server
      
    2. В открывшемся редакторе ввести и сохранить следующее:
      [Service]
      Environment="LD_LIBRARY_PATH=/opt/mssql/lib"
      
    3. Создать ссылки на библиотеки, которые будет использовать SQL Server, и запустить его:
      ln -s /lib64/libssl.so.1.0.2r /opt/mssql/lib/libssl.so
      ln -s /lib64/libcrypto.so.1.0.2r /opt/mssql/lib/libcrypto.so
      systemctl start mssql-server
      

Полнотекстовый поиск

После установки основного пакета MS SQL, но до пункта настройки сервера, стóит аналогичным образом установить пакет msqsql-server-fts:

  1. Скачать последнюю версию:
    $ wget $(lftp -e 'ls;quit' https://packages.microsoft.com/sles/15/mssql-server-preview/Packages/m | \
    awk '/mssql-server-fts/{a=$5}END{print "https://packages.microsoft.com/sles/15/mssql-server-preview/Packages/m" a}')
    
  2. Установить её с пересборкой: epmi --repack `ls -1 mssql-server-fts*`

Драйвер ODBC

Требуется как для работы sqlcmd из mssql-tools, так и для других приложений. Ставится в месте установки приложений.

  1. Скачать свежую сборку msodbcsql для SUSE (версия для rhel работает, но имеет проблемы с зависимостями в ALT):
    wget $(lftp -e 'ls;quit' https://packages.microsoft.com/sles/15/prod/Packages/m | \
    awk '/msodbcsql/{a=$5}END{print "https://packages.microsoft.com/sles/15/prod/Packages/m" a}')
    
  2. Установить её с пересборкой: epm install --repack `ls -1 msodbcsql*`
  3. Прописать символические ссылки на libssl и libcrypto (нужные имена файлов видно в выводе пересборки):
    for N in ssl crypto; do ln -s /lib64/lib$N.so.10 /lib64/lib$N.so.1.0.0; done
    
    (при изменении способа загрузки библиотек, вероятно, потребуется выполнить ldconfig)
  4. Прописать как драйвер ODBC: odbcinst -i -d -f /opt/microsoft/msodbcsql18/etc/odbcinst.ini &>/dev/null
  5. Проверка установки: # odbcinst -q -d
    [PostgreSQL]
    [MySQL]
    [ODBC Driver 18 for SQL Server]
    

mssql-tools

Уже должны быть установлены unixODBC и сопутствующие установке msodbcsql пакеты.

  1. Скачать свежую сборку для SUSE:
    wget $(lftp -e 'ls;quit' https://packages.microsoft.com/sles/15/prod/Packages/m | \
    awk '/mssql-tools/{a=$5}END{print "https://packages.microsoft.com/sles/15/prod/Packages/m" a}')
    
  2. Установить её с перепаковкой: epmi -y --repack `ls -1 mssql-tools1*`

На Альт p11

...слишком новая libldap, с которой mssql-2022 работать отказывается, релиз 2025-го в доступе не обнаружен, а его превьюшка пересобирается, ставится, но при первоначальной настройке...

выдаёт следующее.  
Настраивается SQL Server...

This program has encountered a fatal error and cannot continue running at Tue Sep 30 01:01:51 2025
The following diagnostic information is available:

         Reason: 0x00000004
        Message: ASSERT: Expression=(NT_SUCCESS(status)) File=LibOS\Windows\Kernel\DRtl\sqlpalstubs.cpp Line=886
    Stack Trace:
                 file://package6/windows/system32/sqlpal.dll+0x000000000000A5F2
                 file://package6/windows/system32/sqlpal.dll+0x0000000000009925
                 file://package6/windows/system32/sqlpal.dll+0x0000000000005584
                 file://package6/windows/system32/sqlpal.dll+0x0000000000005412
                 file://package6/windows/system32/sqlpal.dll+0x00000000000E85B4
                 file://package6/windows/system32/sqlpal.dll+0x00000000000AA761
                 file://package6/windows/system32/sqlpal.dll+0x00000000000AAE14
                 file://package6/windows/system32/sqlpal.dll+0x00000000000AA35A
                 file://package6/windows/system32/sqlpal.dll+0x00000000000AC780
                 file://package6/windows/system32/sqlpal.dll+0x0000000000006FDC
                 file://package6/windows/system32/sqlpal.dll+0x00000000000065CE
                 file://package6/windows/system32/sqlpal.dll+0x0000000000006A69
                 file://package6/windows/system32/sqlpal.dll+0x0000000000121971
        Process: 11103 - sqlservr
         Thread: 11109 (application thread 0x8)
    Instance Id: 134469de-268c-4713-ad99-7b90ab61d017
       Crash Id: c8c7b308-36e6-4a5f-af38-e4d6ae6c333d
    Build stamp: e266b19e8c32885ac1d0e974fa41c964c0b27ba131ee6c57cad539c137992c76
   Distribution: ALT Container
     Processors: 2
   Total Memory: 270435598336 bytes
      Timestamp: Tue Sep 30 01:01:51 2025
     Last errno: 22
Last errno text: Недопустимый аргумент
Capturing a dump of 11103
FAILED to capture a dump. Details in paldumper log.
Executing: /opt/mssql/bin/handle-crash.sh with parameters
     handle-crash.sh
     /opt/mssql/bin/sqlservr
     11103
     /opt/mssql/bin
     /var/opt/mssql/log/
     
     134469de-268c-4713-ad99-7b90ab61d017
     c8c7b308-36e6-4a5f-af38-e4d6ae6c333d


ALT Container
Capturing core dump and information to /var/opt/mssql/log...
Capture info: Kernel Version
Capture info: OS release
Capture info: System memory information
Capture info: Command line
Capture info: Start Time
Capture info: Process limits
Capture info: Thread list
Capture info: Processor topology
Capture info: Process mounts
Capture info: Process statistics
Capture info: Process status
Capture info: Process memory maps
Capture info: Process memory maps (detailed)
Capture info: Core Dump filter
Capture info: Process CGroup information
cat: /sys/fs/cgroup/user.slice/user-0.slice/session-48168.scope/memory.reclaim: Отказано в доступе
Capture info: Process scheduler information
Capture info: Process list
Capture info: Process handle information
Capture info: Process environment variables
/opt/mssql/bin/system-info-functions.sh: строка 346: hash: dpkg: не найден
dmesg: чтение буфера ядра завершилось неудачно: Операция не позволена
Hint: You are currently not seeing messages from other users and the system.
      Users in groups 'adm', 'systemd-journal', 'wheel' can see all messages.
      Pass -q to turn off this notice.
No journal files were opened due to insufficient permissions.
Hint: You are currently not seeing messages from other users and the system.
      Users in groups 'adm', 'systemd-journal', 'wheel' can see all messages.
      Pass -q to turn off this notice.
No journal files were opened due to insufficient permissions.
Capture info: Current application configuration
Вт 30 сен 2025 01:01:52 UTC Capturing program information
Вт 30 сен 2025 01:01:52 UTC Attempting to capture a dump with paldumper for pid 11103
WARNING: Capture attempt failure detected
Attempting to capture a filtered dump with paldumper for pid 11103
WARNING: Attempt to capture dump failed.  Reference /var/opt/mssql/log/core.sqlservr.11103.temp/log/paldumper-debug.log for details
Вт 30 сен 2025 01:01:52 UTC Attempting to capture a dump with gdb
Вт 30 сен 2025 01:01:52 UTC Captured a dump with gdb: /var/opt/mssql/log/core.sqlservr.11103.temp/core.sqlservr.11103
Вт 30 сен 2025 01:01:52 UTC Capturing program binaries
/usr/bin/find: ‘/usr/lib/chkpwd’: Отказано в доступе
/usr/bin/find: ‘/usr/lib/openssh’: Отказано в доступе
/usr/bin/find: ‘/usr/libexec/ping’: Отказано в доступе
Вт 30 сен 2025 01:01:52 UTC Compressing the dump files
Core dump and information are being compressed (pbzip2) in
the background. When complete, they can be found in the following location:
  /var/opt/mssql/log/core.sqlservr.09_30_2025_01_01_51.11103.tbz2
Произошел сбой при начальной установке Microsoft SQL Server. Ознакомьтесь с ERRORLOG.
в /var/opt/mssql/log для получения дополнительных сведений.

И хотя после этого запускается, однако некоторое время спустя падает — так что в ожидании релиза довольствуемся p10.

На Альт p10

(будет установлена 16 версия, она же 2022)

Работает не только в виртуальной машине, но и в контейнере.

Подготовка

  1. Установить недостающее: # apt-get update && apt-get install -y eepm libatomic1 lftp wget unixODBC
  2. Освежить систему: # epm -y full-upgrade

Установка

Чтоб не прыгать между репозиториями, лучше взять всё из SLES, поскольку не все пакеты из RHEL «одинаково полезли».

Можно сделать всё одним скриптом, при успешном завершении которого запустится первоначальная настройка, а за ней и сам сервис:

mssql-install  
#!/bin/sh

apt-get update && apt-get install -y eepm libatomic1 lftp wget unixODBC
epm -y full-upgrade
useradd mssql
install -o mssql -g mssql -d /var/opt/mssql

for RPM in mssql-{server-{1,fts},tools} msodbcsql; do
    case $RPM in
        *-server-*)
            DIR=${RPM%-*}-2022;;
        *)  DIR=prod
    esac
    URL="https://packages.microsoft.com/sles/15/$DIR/Packages/m"
    wget $URL/`lftp -e 'ls;quit' $URL | awk '/'$RPM'/{a=$5}END{print a}'` &&
    epmi -y --repack `ls -1 ${RPM}*`
done

systemctl enable mssql-server
sed -i 's|PATH=.*|&:/opt/mssql-tools18/bin|' ~/.bashrc
sed -i 's|su $whitelistArg|su|' /opt/mssql/lib/mssql-conf/invokesqlservr.sh
odbcinst -i -d -f /opt/microsoft/msodbcsql18/etc/odbcinst.ini &>/dev/null
odbcinst -q -d # проверка доступности драйвера.

# Можно попробовать настроить сервис автоматически:
#PASS="DerPar0!"
#/opt/mssql/bin/mssql-conf setup <<<`echo 2; echo Y; echo 9; echo $PASS; echo $PASS`

# Или по обыкновению вручную:
/opt/mssql/bin/mssql-conf setup

После чего останется только проверить «подключабельность»:
# /opt/mssql-tools18/bin/sqlcmd -C -S localhost -U sa -P '<пароль>' -Q 'sp_databases'


Либо поэтапно...

  1. Сам сервер:
    RPM=mssql-server-1; URL="https://packages.microsoft.com/sles/15/${RPM%-*}-2022/Packages/m"
    wget $URL/`lftp -e 'ls;quit' $URL | awk '/'$RPM'/{a=$5}END{print a}'` && epmi -y --repack `ls -1 ${RPM}*`
    
    • Cоздать пользователя и каталог для службы:
      # useradd mssql; install -o mssql -g mssql -d /var/opt/mssql
    • Во избежание такой ошибки (su: invalid option -- 'p') поправить кривой вызов su:
      # sed -i 's/su $whitelistArg/su/' /opt/mssql/lib/mssql-conf/invokesqlservr.sh
    • Провести первоначальную настройку:
      # /opt/mssql/bin/mssql-conf setup
    • Навсегда запустить службу:
      # systemctl enable --now mssql-server
  2. Полнотекстовый поиск:
    RPM=mssql-server-fts; URL="https://packages.microsoft.com/sles/15/${RPM%-*}-2022/Packages/m"
    wget $URL/`lftp -e 'ls;quit' $URL | awk '/'$RPM'/{a=$5}END{print a}'` && epmi -y --repack `ls -1 ${RPM}*`
    
  3. Драйвер ODBC:
    RPM=msodbcsql; URL="https://packages.microsoft.com/sles/15/prod/Packages/m"
    wget $URL/`lftp -e 'ls;quit' $URL | awk '/'$RPM'/{a=$5}END{print a}'` && epmi -y --repack `ls -1 ${RPM}*`
    
    • Зарегистрировать драйвер и проверить его доступность:
      # odbcinst -i -d -f /opt/microsoft/msodbcsql18/etc/odbcinst.ini &>/dev/null; odbcinst -q -d
      [PostgreSQL]
      [MySQL]
      [ODBC Driver 18 for SQL Server]
      
  4. MSSQL-tools:
    RPM=mssql-tools; URL="https://packages.microsoft.com/sles/15/prod/Packages/m"
    wget $URL/`lftp -e 'ls;quit' $URL | awk '/'$RPM'/{a=$5}END{print a}'` && epmi -y --repack `ls -1 ${RPM}*`
    
    • Проверить подключение (пароль по запросу вводить из первоначальной настройки):
      # /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -Q 'sp_databases' -C
      Password:
      DATABASE_NAME DATABASE_SIZE REMARKS
      ------------- ------------- -------
      master                 7936 NULL
      model                 16384 NULL
      msdb                  24192 NULL
      tempdb                24576 NULL
      

Примеры работы с базами данных

Подстановка в примерах ниже
sa логин администратора
Pa$$word пароль, указанный при mssql-conf setup

Использование MSSQL-tools

Дабы не вызывать sqlcmd всякий раз с полным путём, имеет смысл добавить этот путь в переменную PATH:

$ sed -i 's|PATH=.*|&:/opt/mssql-tools18/bin|' ~/.bashrc
  1. Просмотр доступных баз:
    sqlcmd -C -S localhost -U sa -P 'Pa$$word' -Q 'sp_databases'
    
  2. Создание базы test:
    sqlcmd -C -S localhost -U sa -P 'Pa$$word' -Q 'create database test'
    
  3. Резервное копирование базы test:
    sqlcmd -C -S localhost -U sa -P 'Pa$$word' -Q "BACKUP DATABASE [test] TO DISK='/path/to/test.bak' WITH COMPRESSION"
    
  4. Восстановление базы test из резервной копии:
    sqlcmd -C -S localhost -U sa -P 'Pa$$word' -Q "RESTORE DATABASE [test] FROM DISK='/path/to/test.bak' WITH RECOVERY"
    

Подключение через ODBC

Пример для сервера на локалхосте

  1. Настройка источника созданием файла /etc/odbc.ini или добавлением в него секции:
    [MSSQL]
    Driver = ODBC Driver 18 for SQL Server
    Description = Test database on linux MSSQL Server
    Trace = No
    Server = 127.0.0.1
    Port = 1433
    TrustServerCertificate = yes
    TDS version = 0.95
    
  2. Проверка источника по имени секции (MSSQL) из /etc/odbc.ini:
    echo 'SELECT name FROM sys.databases' | isql MSSQL sa 'Pa$$word' -b -v
    +-------------------------------------------------------------------------------------------------------+
    | name                                                                                                  |
    +-------------------------------------------------------------------------------------------------------+
    | master                                                                                                |
    | tempdb                                                                                                |
    | model                                                                                                 |
    | msdb                                                                                                  |
    | test                                                                                                  |
    +-------------------------------------------------------------------------------------------------------+
    SQLRowCount returns 0
    5 rows fetched
    

Подключение из LibreOffice Base

Установка JDBC

  1. Загрузить архив:
    $ wget -O ~/sqljdbc_13.2.tgz https://go.microsoft.com/fwlink/?linkid=2330477&clcid=0x419
    
  2. Извлечь оттуда jar-файл:
    $ tar -zxvf ~/sqljdbc_13.2.tgz sqljdbc_13.2/enu/jars/mssql-jdbc-13.2.0.jre11.jar -C /tmp/
    # mv /tmp/sqljdbc_13.2/enu/jars/mssql-jdbc-13.2.0.jre11.jar /usr/share/java/

Подключение к базе

Дальнейшие действия выполняются от обычного пользователя.

При входе из LibreOffice Base по паролю не тестируйте подключение в мастере создания БД: это приводит к зависанию приложения.
Указание базы данных через / (как в подсказке) не работает [пример от Microsoft].
  1. По методике из статьи о Microsoft Access добавить в LO Writer раздобытый на предыдущем шаге класс /usr/share/java/mssql-jdbc-13.2.0.jre11.jar.
  2. Перезапустить LibreOffice.
  3. В LibreOffice Base выбрать подключение к базе через JDBC, заполнив поля источника и драйвера:
    URL источника данных (сервер 10.4.4.26, порт стандартный, база данных test)
    sqlserver://10.4.4.26:1433;database=test
    Класс драйвера JDBC
    com.microsoft.sqlserver.jdbc.SQLServerDriver
    LibreOffice-MSSQL-JDBC.png
  4. Указать имя пользователя и необходимость пароля для подключения.
  5. Сохранить базу данных LO Base в виде файла.
  6. После чего можно работать на сервере MSSQL:
    LibreOffice-MSSQL-Connected.png