Red Hat et dérivées version SERVEUR

Red Hat 8, Alma Linux 8 : Installer et utiliser SQL Server

Cet article a été mis à jour, vous consultez ici une archive de cet article!
Table des matières

sql-server-logo



Introduction



Dans cet article, nous allons voir comment installer Microsoft SQL Server 2019 Express sur CentOS 8.
Testé, cela fonctionne très bien et permet d'économiser des licences Windows Server, Anrtivirus et le système est plus stable avec CentOS qu'avec Windows Server.

Il existe d'autres éditions que Express, toutes les infos sur les licences sont ici : https://www.microsoft.com/fr-fr/sql-server/sql-server-2019-pricing

A noter que le dépôts PowerTools et EPEL ne sont pas nécessaires.

Installation de SQL Server 2019



Dans un premier temps, on va ajouter les dépôts de Microsoft sur notre CentOS 8 :

Code BASH :
curl https://packages.microsoft.com/config/rhel/8/mssql-server-2019.repo -o /etc/yum.repos.d/mssql-server-2019.repo
curl https://packages.microsoft.com/config/rhel/8/prod.repo -o /etc/yum.repos.d/msprod.repo


On installe ensuite le moteur de base de données, les outils et le connecteur ODBC :

Code BASH :
dnf install mssql-server mssql-tools unixODBC-devel


Après acceptation de la clé GPG de Microsoft, au moment de l'install, il faut valider à deux reprises les termes de la licence sur les paquets msodbcsql17 et mssql-server en saisissant YES :

Code TEXT :
The license terms for this product can be downloaded from
https://aka.ms/odbc17eula and found in
/usr/share/doc/msodbcsql17/LICENSE.txt . By entering 'YES',
you indicate that you accept the license terms.
Do you accept the license terms? (Enter YES or NO) 


Et voilà, c'est installé, maintenant il faut configurer.

Si sudo n'est pas installé, il faut l'installer (si vous avez installé comme moi une CentOS très très minimale) :

Code BASH :
dnf install sudo


Configurer MSSQL Server et le système



Configurer MSSQL Server



Pour lancer l'assistant de configuration, on va lancer la commande suivante :

Code BASH :
/opt/mssql/bin/mssql-conf setup


Nous sommes invités à sélectionner une édition de SQL Server :

Code TEXT :
Choisissez une édition de SQL Server :
  1) Evaluation (gratuit, aucun droit d'utilisation en production, 180 jours)
  2) Developer (gratuit, aucun droit d'utilisation en production)
  3) Express (gratuit)
  4) Web (PAYANT)
  5) Standard (PAYANT)
  6) Enterprise (PAYANT) - Utilisation du cœur de processeur limitée à 20 cœurs physiques/40 cœurs hyperthread
  7) Enterprise Core (PAYANT) - Utilisation du cœur de processeur jusqu'au maximum du système d'exploitation
  8) J'ai acheté une licence chez un détaillant et je dois entrer une clé de produit.
Vous trouverez des détails sur les éditions sur
https://go.microsoft.com/fwlink/?LinkId=2109348&clcid=0x40c
L'utilisation d'éditions PAYANTES de ce logiciel nécessite l'achat d'une licence distincte dans un
programme de licence en volume Microsoft.
Si vous choisissez une édition PAYANTE, vérifiez que vous avez le
nombre approprié de licences en place pour installer et exécuter ce logiciel.
Entrer votre édition(1-8):


On choisi 3 ici pour la version Express

On doit encore valider les termes de la licence :

Code TEXT :
Vous trouverez les termes du contrat de licence de ce produit dans
/usr/share/doc/mssql-server ou vous pouvez les télécharger à partir de :
https://go.microsoft.com/fwlink/?LinkId=2104294&clcid=0x40c
Vous pouvez consulter la déclaration de confidentialité à l'adresse :
https://go.microsoft.com/fwlink/?LinkId=853010&clcid=0x40c
Acceptez-vous les termes du contrat de licence ? [Yes/No]: Yes


On choisi la langue de SQL Server (4 pour le Français) :

Code :
Choisissez la langue de SQL Server :
(1) English
(2) Deutsch
(3) Español
(4) Français
(5) Italiano
(6) 日本語
(7) 한국어
(8) Português
(9) Русский
(10) 中文 – 简体
(11) 中文 (繁体)
Entrez l'option 1-11 :


On est invité à saisir le mot de passe du compte admin (sa) :

Code TEXT :
Entrez le mot de passe de l'administrateur système de SQL Server : 
Confirmez le mot de passe de l'administrateur système de SQL Server : 


La configuration se poursuit.

La gestion du service se fait avec systemd :

Code BASH :
systemctl status mssql-server


On vérifie que c'est démarré et bien activé au reboot.

Ajouter les commandes MSSQL dans le PATH



Les commandes se situent dans /opt/mssql-tools/bin. On va donc ajouter ce chemin dans notre variable $PATH :

Code BASH :
echo 'export PATH=$PATH:/opt/mssql-tools/bin' > /etc/profile.d/mssql.sh


Et on charge la modif :

Code BASH :
source /etc/profile.d/mssql.sh


Ouvrir le pare-feu



On n'oublie pas d'ouvrir le port 1433 si des applications externes doivent se connecter à notre serveur MS SQL :

Code BASH :
firewall-cmd --add-port=1433/tcp --permanent
firewall-cmd --reload


Utiliser MSSQL Server



Se connecter depuis Linux



On va utiliser l'outil sqlcmd :

Code BASH :
sqlcmd -S localhost -U sa


On va lister les bases de données pour vérifier que tout fonctionne bien (avec MS SQL, GO permet d'exécuter les requêtes) :

Code SQL :
SELECT name, database_id, create_date FROM sys.DATABASES;
GO


Code TEXT :
name          database_id create_date
------------- ----------- -----------------------
master                  1 2003-04-08 09:13:36.390
tempdb                  2 2020-07-23 17:34:13.040
model                   3 2003-04-08 09:13:36.390
msdb                    4 2020-06-10 19:01:05.513
(4 rows affected)


On peut aussi afficher les utilisateurs :

Code SQL :
SELECT name FROM sysusers;
GO


Code TEXT :
name
------
##MS_AgentSigningCertificate##
##MS_PolicyEventProcessingLogin##
db_accessadmin
db_backupoperator
db_datareader
db_datawriter
db_ddladmin
db_denydatareader
db_denydatawriter
db_owner
db_securityadmin
dbo
guest
INFORMATION_SCHEMA
public
sys
(16 rows affected)


Quelques commandes SQL pour créer une base, table et jeu de test



Je ne rentrerai pas dans la syntaxe de création de tables, ou de requetes CRUD.

Je vous mets juste ici des requêtes pour créer une base "linuxtricks" , une table et y insérer des infos :


Code SQL :
USE [master]
GO
CREATE DATABASE [linuxtricks]
GO
USE [linuxtricks]
GO
CREATE TABLE messages
   (
      ID INT NOT NULL PRIMARY KEY,
      texte VARCHAR(100) NOT NULL,
      dte DATETIME NOT NULL DEFAULT getdate()
   );
GO
INSERT INTO messages (ID, texte) VALUES (1, 'Bonjour message 1');
INSERT INTO messages (ID, texte) VALUES (2, 'Comment ça va message 2');
INSERT INTO messages (ID, texte) VALUES (3, 'Ceci est un message 3');
INSERT INTO messages (ID, texte) VALUES (4, 'Et là un quatrième message');
INSERT INTO messages (ID, texte) VALUES (5, 'Au revoir 5');
GO
SELECT * FROM messages;
GO


Se connecter depuis un client Windows



Pour se connecter depuis un client Windows, on téléchargera SSMS : https://docs.microsoft.com/fr-fr/sql/ssms/download-sql-server-management-studio-ssms

Ensuite on se connecte à la base :

mssql-centos-win-login



Et on peut utiliser les requêtes SQL propre à MS SQL :

mssql-centos-win-requete




Sauvegarder et restaurer des bases



Pour sauvegarder une base de données avec sqlcmd (ici base nommée linuxtricks) :

Code BASH :
sqlcmd -S localhost -U SA -Q "BACKUP DATABASE [linuxtricks] TO DISK = N'/var/opt/mssql/data/linuxtricks.bak' WITH NOFORMAT, NOINIT, NAME = 'linuxtricks-full', SKIP, NOREWIND, NOUNLOAD, STATS = 10"


Exemple de sortie :

Code TEXT :
11 pour cent traités.
22 pour cent traités.
30 pour cent traités.
41 pour cent traités.
50 pour cent traités.
61 pour cent traités.
70 pour cent traités.
81 pour cent traités.
90 pour cent traités.
100 pour cent traités.
376 pages traitées pour la base de données 'linuxtricks', fichier 'linuxtricks' dans le fichier 1.
2 pages traitées pour la base de données 'linuxtricks', fichier 'linuxtricks_log' dans le fichier 1.
BACKUP DATABASE a traité avec succès 378 pages en 0.044 secondes (67.027 Mo/s).
 



Pour restaurer la base :

Code BASH :
sqlcmd -S localhost -U SA -Q "RESTORE DATABASE [linuxtricks] FROM DISK = N'/var/opt/mssql/data/linuxtricks.bak' WITH FILE = 1, NOUNLOAD, REPLACE, NORECOVERY, STATS = 10"


Exemple de sortie :

Code TEXT :
11 pour cent traités.
22 pour cent traités.
30 pour cent traités.
41 pour cent traités.
50 pour cent traités.
61 pour cent traités.
70 pour cent traités.
81 pour cent traités.
90 pour cent traités.
100 pour cent traités.
376 pages traitées pour la base de données 'linuxtricks', fichier 'linuxtricks' dans le fichier 1.
2 pages traitées pour la base de données 'linuxtricks', fichier 'linuxtricks_log' dans le fichier 1.
RESTORE DATABASE a traité avec succès 378 pages en 0.018 secondes (163.845 Mo/s).
 


Pour automatiser le processus dans un script, on pourra utiliser l'option -P suivi du mot de passe :

Code BASH :
sqlcmd -S localhost -U sa -P sasupermotdepasse



Juste pour le fun, utiliser SQL Server avec PHP



Sur le serveur CentOS, on va installer PHP et causer avec notre base MS SQL.

Je n’aborderai pas tous les connecteurs MS SQL, c'est juste pour vérifier que ça fonctionne. Laissons le développement aux développeurs.
J'utilise la même base que celle créée précédemment dans l'exemple (linuxtricks).
L'exemple de page PHP est adaptée de https://www.php.net/manual/fr/function.sqlsrv-fetch-array.php avec la table créée précédemment.

Il sera nécessaire de modifier le booléen SELinux httpd_can_network_connect_db via :
Code BASH :
setsebool -P httpd_can_network_connect_db 1


En plus du serveur Apache + PHP installé (voir https://www.linuxtricks.fr/wiki/centos-installer-et-configurer-un-serveur-lamp-7-et-8 ) installer des outils supplémentaires pour compiler le module :

Code BASH :
dnf install gcc make php-pear php-pdo php-devel


Grâce à PECL, on va compiler les modules concernés :

Code BASH :
pecl install sqlsrv pdo_sqlsrv


Et on créé les fichiers de config pour indiquer à PHP de les utiliser :

Code BASH :
echo 'extension=pdo_sqlsrv.so' > /etc/php.d/30-pdo_sqlsrv.ini
echo 'extension=sqlsrv.so' > /etc/php.d/30-sqlsrv.ini


On redémarre php-fpm et httpd pour que PHP prenne en compte les modules :

Code BASH :
systemctl restart php-fpm
systemctl restart httpd



On créé une page de test :

Code BASH :
vi /var/www/html/test_mssql.php


Code PHP :
<?php
$serverName = "localhost";
$connectionInfo = array( "Database"=>"linuxtricks", "UID"=>"sa", "PWD"=>"sasupermotdepasse");
$conn = sqlsrv_connect( $serverName, $connectionInfo );
if( $conn === false ) {
    die( print_r( sqlsrv_errors(), true));
}
$sql = "SELECT * FROM messages";
$stmt = sqlsrv_query( $conn, $sql );
if( $stmt === false) {
    die( print_r( sqlsrv_errors(), true) );
}
while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) {
      echo "Id : ".$row['ID']."<br />Texte : ".$row['texte']."<br />Date : ".$row['dte']->format('Y-m-d H:i:s')."<hr />";
}
sqlsrv_free_stmt( $stmt);
?>