Microsoft SQLServer su Linux
Introduzione
E’ di questi giorni l’annuncio dell’uscita della preview pubblica di Microsoft SQLServer su Linux, per l’esattezza su Red Hat Enterprise Linux 7.2 e Ubuntu Linux 16.04 (a breve anche su SUSE Linux Enterprise Server v12 SP2.
Era nell’aria da tempo, da quando Microsoft aveva dato l’annuncio di lavorare al porting ed è chiaramente una mossa per insidiare il mercato di Oracle sul terreno in cui domina incontrastato.
Nella fattispecie, andiamo a vedere nel dettaglio come installare SQLServer su Linux, per l’esattezza su distribuzione Red Hat.
Per effettuare questa prova, ho configurato una macchina virtuale CentOS 7 su Virtual Box (tralascio volutamente di illustrare questo passaggio, in quanto è strettamente legato al virtualizzatore utilizzato e, soprattutto, non è attinente all’argomento trattato nell’articolo).
[root@sqlserver ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE=NAME="cpe:/o:centos:centos:/"
HOME_URL="https://www.centos.org"
BUG_REPORT_URL="https://bug.centos.org"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
[root@sqlserver ~]#
Installazione di Microsoft SQLServer
Per l’installazione e la configurazione, ho seguito i passi descritti nel tutorial pubblicato da Microsoft, tranne quello relativo al firewall, perché tanto non intendevo collegarmi da client Windows tramite Microsoft Management Studio, che è free e scaricabile da qui.
A favore dei meno pratici di ambienti Unix e Linux, cercherò di descrivere in maniera chiara i vari passaggi, mostrando l’intero output dei comandi eseguiti.
Repository
Per prima cosa, è necessario configurare il repository di Microsoft SQLServer.
[root@sqlserver ~]# curl https://packages.microsoft.com/config/rhel/7/mssql-serv
er.repo > /etc/yum.repos.d/mssql-server.repo
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 220 100 220 0 0 96 0 0:00:02 0:00:02 --:--:-- 96
[root@sqlserver ~]#
Installazione pacchetti
Una volta eseguito il punto precedente, possiamo scaricare ed installare i pacchetti.
[root@sqlserver ~]# yum install -y mssql-server
Loaded plugins: fastestmirror
packages-microsoft-com-mssql-server | 2.9 kB 00:00
packages-microsoft-com-mssql-server/primary_db | 2.4 kB 00:00
Loading mirror speeds from cached hostfile
* base: mi.mirror.gar.it
* extras: mi.mirror.gar.it
* updates: mi.mirror.gar.it
Resolving Dependencies
--> Running transaction check
---> Package mssql-server.x86_64 0:14.0.1.246-6 will be installed
--> Processing Dependency: bzip2 for package: mssql-server-14.0.1.246-6.x86_64
--> Processing Dependency: gdb for package: mssql-server-14.0.1.246-6.x86_64
--> Running transaction check
---> Package bzip2.x86_64 0:1.0.6-13.el7 will be installed
---> Package gdb.x86_64 0:7.6.1-8.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
mssql-server x86_64 14.0.1.246-6 packages-microsoft-com-mssql-server 138 M
Installing for dependencies:
bzip2 x86_64 1.0.6-13.el7 base 52 k
gdb x86_64 7.6.1-80.el7 base 2.4 M
Transaction Summary
================================================================================
Install 1 Package (+2 Dependent packages)
Total download size: 140 M
Installed size: 145 M
Downloading packages:
warning: /var/cache/yum/x86_64/7/base/packages/bzip2-1.0.6-13.el7.x86_64.rpm: He
ader V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Public key for bzip2-1.0.6-13.el7.x86_64.rpm is not installed
(1/3): bzip2-1.0.6-13.el7.x86_64.rpm | 52 kB 00:00
(2/3): gdb-7.6.1-80.el7.x86_64.rpm | 2.4 MB 00:03
warning: /var/cache/yum/x86_64/7/packages-microsoft-com-mssql-server/packages/ms
sql-server-14.0.1.246-6.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID be122
9cf: NOKEY
Public key for mssql-server-14.0.1.246-6.x86_64.rpm is not installed
(3/3): mssql-server-14.0.1.246-6.x86_64.rpm | 138 MB 03:04
--------------------------------------------------------------------------------
Total 778 kB/s | 140 MB 03:04
Retrieving key from https://packages.microsoft.com/keys/microsoft.asc
Importing GPG key 0xBE1229CF:
Userid : "Microsoft (Release signing) <gpgsecurity@microsoft.com>"
Fingerprint: bc52 8686 b50d 79e3 39d3 721c eb3e 94ad be12 29cf
From : https://packages.microsoft.com/keys/microsoft.asc
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Importing GPG key 0xF4A80EB5:
Userid : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org >"
Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
Package : centos-release-7-2.1511.el7.centos.2.10.x86_64 (@anaconda)
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : bzip2-1.0.6-13.el7.x86_64 1/3
Installing : gdb-7.6.1-80.el7.x86_64 2/3
Installing : mssql-server-14.0.1.246-6.x86_64 3/3
+-------------------------------------------------------------------+
| Please run /opt/mssql/bin/sqlservr-setup to complete the setup of |
| Microsoft(R) SQL Server(R). |
+-------------------------------------------------------------------+
Verifying : mssql-server-14.0.1.246-6.x86_64 1/3
Verifying : gdb-7.6.1-80.el7.x86_64 2/3
Verifying : bzip2-1.0.6-13.el7.x86_64 3/3
Installed:
mssql-server.x86_64 0:14.0.1.246-6
Dependency Installed:
bzip2.x86_64 0:1.0.6-13.el7 gdb.x86_64 0:7.6.1-80.el7
Complete!
[root@sqlserver ~]#
Da notare come l’installazione effettui un controllo delle dipendenze e provveda a scaricare i pacchetti necessari.
Configurazione SQLServer
Dopo l’installazione, procediamo a configurare Microsoft SQLServer.
In realtà, i passi riguardano soltanto l’accettazione della licenza e la configurazione delle password.
[root@sqlserver ~]# /opt/mssql/bin/sqlservr-setup
Microsoft(R) SQL Server(R) Setup
You can abort setup at anytime by pressing Ctrl-C. Start this program
with the --help option for information about running it in unattended
mode.
The license terms for this product can be downloaded from
http://go.microsoft.com/fwlink/?LinkId=746388 and found
in /usr/share/doc/mssql-server/LICENSE.TXT.
Do you accept the license terms? If so, please type "YES": YES
Please enter a password for the system administrator (SA) account:
Please confirm the password for the system administrator (SA) acount:
Settimg system administrator (SA) account password...
Do you wish to start the SQL Server service now? [y/n]: y
Do you wish to enable SQL Server to start on boot= [y/n]: y
Created symlink from /etc/systemd/system/multi-user.target.wants/mssql-server.se
rvice to /usr/lib/systemd/system/mssql-server.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/mssql-server-te
lemetry.service to /usr/lib/systemd/system/mssql-server-telemetry.service.
Setup completed successfully.
[root@sqlserver ~]#
Verifica stato
Una volta terminata l’installazione, controlliamo che Microsoft SQLServer funzioni correttamente.
[root@sqlserver ~]# systemctl status mssql-server -l
mssql-server.service - Microsoft(R) SQL Server(R) Database Engine
Loaded: loaded (/usr/lib/systemd/system/mssql-server.service: enabled: vendor
preset: disabled)
Active: active (running) since Fri 2916-12-01 00:50:54 CET: 21min ago
Main PID: 2172 (sqlserver)
CGroup: /system.slice/mysl-sqlserver,service
˫- 837 /opt/mssql/bin/sqlserver
˪-2180 /ops/mysql/bin/sqlserver
Dec 01 00:51:22 sqlserver.localdomain sqlservr[837]: 2016-11-30 23:51:22.86 spid
6s Polybase feature disabled.
Dec 01 00:51:25 sqlserver.localdomain sqlservr[837]: 2016-11-30 23:51:22.86 spid
6s Cleaning tempdb database.
Dec 01 00:51:25 sqlserver.localdomain sqlservr[837]: 2016-11-30 23:51:24.18 spid
6s Starting up database 'tempdb'.
Dec 01 00:51:25 sqlserver.localdomain sqlservr[837]: 2016-11-30 23:51:25.52 spid
6s The tempdb database has 1 data ile(s).
Dec 01 00:51:25 sqlserver.localdomain sqlservr[837]: 2016-11-30 23:51:25.55 spid
20s The Service Broker endpoint is in disabled or stopped state.
Dec 01 00:51:25 sqlserver.localdomain sqlservr[837]: 2016-11-30 23:51:25.55 spid
20s The Database Mirroring endpoint is in disabled orstopped state.
Dec 01 00:51:25 sqlserver.localdomain sqlservr[837]: 2016-11-30 23:51:25.80 spid
20s Service Broker manager has started.
Dec 01 00:51:25 sqlserver.localdomain sqlservr[837]: 2016-11-30 23:51:25.81 spid
5s Recovery is complete. This is an informational message only. No user act
ion is required
Dec 01 00:58:08 sqlserver.localdomain sqlservr[837]: 2016-11-30 23:58:08.26 spid
51 Attempting to load library 'xplog70.dll' into memory. This is an informa
tional message only. No user action is required.
Dec 01 00:58:08 sqlserver.localdomain sqlservr[837]: 2016-11-30 23:58:08.26 spid
51 Using 'xplog70.dll' version '2016.140.01' to execute extended stored pro
cedure 'xp_msver'. This is an informational message only: no user action is requ
ired.
[root@sqlserver ~]#
Una dll su Linux? Decisamente strano.
Per chi non lo sapesse, le dll sono librerie dinamiche tipiche delle piattaforme Windows, mentre in ambito Linux hanno estensione “.so” (o “.so.n“, dove “n” è un numero, tipo “.so.5”)
Provando ad effettuare una semplice ricerca
[root@sqlserver ~]# strings /opt/mssql/bin/sqlservr > results.txt
[root@sqlserver ~]#
non troviamo traccia di quel nome, però possiamo riscontrare alcune stringhe interessanti.
/binn/sqlservr.exe
/var/opt/mssql/.system
/var/opt/mssql/log
/proc/sys/kernel/random/uuid
/proc/self/coredump_filter
In pratica, durante la configurazione di Microsoft SQLServer non abbiamo avuto necessità di modificare alcuni settaggi per il semplice motivo che sono inseriti staticamente nell’eseguibile.
Da notare quanto evidenziato, ovvero una “n” di troppo nel path e l’estensione tipica dei programmi in ambito Windows.
Repository tools e installazione
Il client necessario per collegarsi, ovvero sqlcmd, è presente in un altro repository.
Sto parlando, ovviamente, del client a riga comando, mentre ricordo che è comunque possibile utilizzare il Magamenet Studio, seguendo le indicazioni fornite da Microsoft in questa pagina.
[root@sqlserver ~]# curl https://packages.microsoft.com/config/rhel/7/prod.repo
> /etc/yum.repos.d/msprod.repo
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 193 100 193 0 0 185 0 0:00:01 0:00:01 --:--:-- 185
[root@sqlserver ~]# yum install mssql-tools
Loaded plugins: fastestmirror
base | 3.6 kB 00:00
extras | 3.4 kB 00:00
packages-microsoft-com-mssql-server | 2.9 kB 00:00
packages-microsoft-com-prod | 2.9 kB 00:00
updates | 3.4 kB 00:00
packages-microsoft-com-prod/primary_db | 4.6 kB 00:05
Loading mirror speeds from cached hostfile
* base: mi.mirror.garr.it
* extras: mi.mirror.garr.it
* updates: mi.mirror.garr.it
Resolving Dependencies
--> Running transaction check
---> Package mssql-tools.x86_64 0:14.0.1.246-1 will be installed
--> Processing Dependency: msodbcsql for package: mssql-tools-14.0.1.246-1.x86_6
4
--> Running transaction check
---> Package msodbcsql.x86_64 0:13:0.1.0-1 will be installed
--> Processing Dependency: libodbcinst.so.2()(64bit) for package: msodbcsql-13.0
.1.0-1.x86_64
--> Running transaction check
---> Package unixODBC-utf16.x86_64 0:2.3.1-1 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
mssql-tools x86_64 14.0.1.246-1 packages-microsoft-com-prod 249 k
Installing for dependencies:
msodbcsql x86_64 13.0.1.0-1 packages-microsoft-com-prod 3.8 M
unixODBC-utf16 x86_64 2.3.1-1 packages-microsoft-com-prod 329 k
Transaction Summary
================================================================================
Install 1 Package (+2 Dependent packages)
Total dowload size: 4.4 M
Installed size: 4.4 M
Is this ok [y/d/N]: y
Dowloading packages:
(1/3): mssql-tools-14.0.1.246-1.x86_64.rpm | 249 kB 00:01
(2/3): unixODBC-utf16-2.3.1-1.x86_64.rpm | 329 kB 00:00
(3/3): msodbcsql-13.0.1.0-1.x86_64.rpm | 3.8 MB 00:07
--------------------------------------------------------------------------------
Total 639 kB/s | 4.4 MB 00:07
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : unixODBC-utf16-2.3.1-1.x86_64 1/3
The license terms for this product can be downloaded from
http://go.microsoft.com/fwlink/?LinkId=746838 and frond in
/usr/share/doc/msodbcsql/LICENSE.TXT . By entering 'YES',
you indicate that you accept the license terms.
Do you accept the licenseterms? (Enter YES or NO)
YES
Installing : msodbcsql-13.0.1.0-1.x86_64 2/3
The license terms for this product can be downloaded from
http://go.microsoft.com/fwlink/?LinkId=746949 and frond in
/usr/share/doc/mssql-tools/LICENSE.TXT . By entering 'YES',
you indicate that you accept the license terms.
Do you accept the licenseterms? (Enter YES or NO)
YES
Installing : mssql-tools-14.0.1.246-1.x86_64 3/3
Verifying : msodbcsql-13.0.1.0-1.x86_64 1/3
Verifying : unixODBC-utf16-2.3.1-1.x86_64 2/3
Verifying : mssql-tools-14.0.1.246-1.x86_64 3/3
Installed:
mssql-tools.x86_64 0:14.0.1.246-1
Dependency Installed:
msodbcsql.x86_64 0:13.0.1.0-1 unixODBC-utf16.x86_64 0:2.3.1-1
Complete!
[root@sqlserver ~]#
Test di connessione e funzionamento
Ora che abbiamo tutti gli strumenti, necessari, colleghiamoci e muoviamo i primi passi con Microsoft SQL Server su Linux.
[root@sqlserver ~]# sqlcmd -S localhost -U sa
Password:
1> select @@version
2> go
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
------------------------------------------------------------
Microsoft SQL Server vNext (CTP1) - 14.0.1.246 (X64)
Nov 1 2016 23:24:39
Copyright (c) Microsoft Corporation
on Linux (CentOS Linux 7 (Core))
(1 rows affected)
1> select name from sysdatabases order by name
2> go
name
--------------------------------------------------------------------------------
------------------------------------------------
master
model
msdb
tempdb
(4 rows affected)
1> CREATE DATABASE test;
2> GO
1> USE test;
2> GO
Changed database context to 'test'.
1> CREATE TABLE inventory (id INT, name NVARCHAR(50), quantity INT);
2> GO
1> INSERT INTO inventory VALUES (1, 'banana', 150);
2> INSERT INTO inventory VALUES (2, 'orange', 154);
3> GO
(1 rows affected)
(1 rows affected)
1> SELECT * FROM inventory WHERE quantity > 152;
2> GO
id name quantity
----------- -------------------------------------------------- -----------
2 orange 154
(1 rows affected)
1>
Dopo questo primo esercizio suggerito da Microsoft, andiamo ad esplorare un attimo il database appena creato
1> USE master;
2> GO
Changed database context to 'master'.
1> select [Type] = CONVERT(VARCHAR(10), type_desc),
2> [Path] = CONVERT(VARCHAR(40), physical_name),
3> [MB] = (size*8)/1024
4> FROM sys.master_files
5> WHERE DB_NAME(database_id) = 'test';
6> GO
Type Path MB
---------- ---------------------------------------- -----------
ROWS C:\var\opt\mssql\data\test.mdf 8
LOG C:\var\opt\mssql\data\test_log.ldf 8
(2 rows affected)
1>
Come balza agli occhi, il path risulta “in stile Windows”.
Per chi non fosse abituato a lavorare in ambienti *nix, il path non contiene il nome del device drive (in questo caso “C:”) e utilizza lo slash(“/”) al posto del back slash (“\”).
1> sp_detach_db 'test';
2> GO
1> select [Name] = CONVERT(VARCHAR(20), name) from sysdatabases order by name;
2> GO
Name
--------------------
master
model
msdb
tempdb
(4 rows affected)
1> select [Type] = CONVERT(VARCHAR(10), type_desc),
2> [Path] = CONVERT(VARCHAR(40), physical_name),
3> [MB] = (size*8)/1024
4> FROM sys.master_files
5> WHERE DB_NAME(database_id) = 'test';
6> GO
Type Path MB
---------- ---------------------------------------- -----------
ROWS /var/opt/mssql/data/test.mdf 8
LOG /var/opt/mssql/data/test_log.ldf 8
(2 rows affected)
1> sp_detach_db 'test';
2> go
1> sp_attach_db 'test','C:\var\opt\mssql\data\test.mdf','C:\var\opt\mssql\data\test_log.ldf';
2> go
1> select [Type] = CONVERT(VARCHAR(10), type_desc),
2> [Path] = CONVERT(VARCHAR(40), physical_name),
3> [MB] = (size*8)/1024
4> FROM sys.master_files
5> WHERE DB_NAME(database_id) = 'test';
6> GO
Type Path MB
---------- ---------------------------------------- -----------
ROWS C:\var\opt\mssql\data\test.mdf 8
LOG C:\var\opt\mssql\data\test_log.ldf 8
(2 rows affected)
1> quit
[root@sqlserver ~]#
Come possiamo notare, il comando sp_attach_db accetta come parametri i path in entrambi i formati.
C’è ancora il tempo per un’ultima prova, prima di trarre le conclusioni di questa esperienza.
[root@sqlserver ~]# sqlcmd -S localhost -E
Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : SSPI Provider: No Kerbe
ros credentials available.
Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : Cannot generate SSPI co
ntext.
[root@sqlserver ~]#
Al momento, Microsoft non ha pubblicato documentazione su come configurare questa tipologia di accesso.
Piccola curiosità: il driver ODBC installato risulta essere successivo di ben 2 versioni rispetto a quello scaricabile dal sito Microsoft.
Conclusioni
Questa installazione di Microsoft SQLServer è un primo rilascio, quindi è normale che si riscontrino parecchi limiti sull’amministrazione del database.
Come evidenziato dalla prova, al momento si tratta soprattutto di un porting “in stile Wine”, ovvero con un layer che traduce i comandi impartiti dall’eseguibile al sistema operativo Windows (come appunto fa Wine) in modo che siano compresi da Linux.
Tra i difetti di gioventù, il maggiore è sicuramente la mancanza di documentazione, ma è presumibile che tale carenza sia colmata nel tempo.
Per chi abbia voglia di sperimentare senza dover rinunciare alle interfacce grafiche di casa Microsoft, segnalo la possibilità di utilizzare la mssql extention di Visual Studio Code.
Buon divertimento.