Configuration système, installation et tuning silencieux et automatique SQL Server 2008 R2 – Partie 1

Bonsoir,

SQL Server permet depuis de nombreuses versions l’utilisation de switch pour réaliser une installation silencieuse. Cependant, il est clairement obligatoire de faire certaines opérations manuelles afin de préparer le système à recevoir son petit SQL. Cet article va faire partie d’une suite de plusieurs articles qui amèneront à la création d’un script complet pour installer, paramétrer et tunner SQL Server 2008 R2 sur Windows 2008 R2 SP1. Pour le moment, ne sera pas abordé la partie Clustering, Mirroring et Log Shipping, en gros toutes les solutions de Haute dispo seront abordées dans de futurs articles. Notamment car je n’ai pas les plateformes nécessaires pour tester ça et qualifier mes scripts 😉

Dans cette première partie je vais m’atteler et répertorier quels sont les éléments indispensables au bon fonctionnement de SQL Server 2008 R2.

Alors pour commencer il va falloir définir ce que l’on souhaite faire avec cet installeur. Une petite liste va nous permettre d’y voir plus clair sur les éléments paramétrables :

  • Nom de l’instance
  • Port TCP Statique
  • Comptes de service
  • Répertoires
  • Séparation des modules
  • Tuning (ou pas) de l’instance pour la tempDB
  • Numéro de série
  • Activation des canaux nommés
  • Authentification Windows (ou pas)
  • Ajout du compte Administrateur
  • Définition du password SA

Tout ceci va nous permettre de définir les différents paramètres qui devront être passés au script

[powershell]

param(
[Parameter(Mandatory=$true)]
[string]$SAPassword,
[Parameter(Mandatory=$false)]
[Int]$TCPPort = 1433,
[Parameter(Mandatory=$true)]
[string]$Serial,
[String]$InstanceName = “MSSQLSERVER”,
[String]$TempDBSize = “256MB”,
[String]$TempDBMaxSize = “512MB”,
[String]$TempDBFileGrowth = “64MB”,
[String]$SQLCollation = “French_CI_AS”,
[Switch]$AutoTune,
[Switch]$NamedPipe,
[Switch]$WindowsAuthent,
[Switch]$AS,
[Switch]$RS,
[Switch]$IS,
[Switch]$TOOLS,
[ValidateSet(0,1,2,3)]
[Int]$FT = 0,
[String]$FILESTREAMSHARENAME,
[Switch]$SQLENGINE,
[Switch]$REPLICATION
)

[/powershell]

Les Services SQL Server

Chaque instance de SQL Server est composée de plusieurs services, certains sont optionnels:

  • SQL Server (InstanceName)
  • SQL Server Agent (InstanceName)
  • SQL Full-text Filter Daemon Launcher (InstanceName)
  • SQL Server Analysis Services (InstanceName)
  • SQL Server Reporting Services (InstanceName)

Ensuite on retrouvera un service unique par serveur SQL, quelque soit le nombre d’instances:

  • SQL Server Browser

En prenant comme acquis que le nom de l’instance sera définie en paramètre, voici comment l’on peut déclarer la liste des services SQL qui peuvent être installés:

 [powershell]

function New-SQLService {
param(
[string]$name,
[string]$shortname,
[string]$startup
)
$d = New-Object PSObject
$d.PsObject.TypeNames[0] = “PSSqlServerPath”
$d |
Add-Member -Name name -MemberType NoteProperty -Value $name -pass|
Add-Member -Name shortname -MemberType NoteProperty -Value $shortname -pass|
Add-Member -Name startup -MemberType NoteProperty -Value $startup -pass
}

$Services = @(
New-SQLService -name “SQL Server (” + $InstanceName + “)” -shortname “MSSQLSERVER” -startup “Automatic”;
New-SQLService -name “SQL Server Agent (” + $InstanceName + “)” -shortname “SQLSERVERAGENT” -startup “Automatic”;
New-SQLService -name “SQL Server Browser” -shortname “SQLBrowser” -startup “Automatic”;
New-SQLService -name “SQL Server Integration Services 10.0” -shortname “MsDtsServer100” -startup “Automatic”;
New-SQLService -name “SQL Server Analysis Services (” + $InstanceName + “)” -shortname “MSSQLServerOLAPService” -startup “Automatic”;
New-SQLService -name “SQL Server Reporting Services (” + $InstanceName + “)” -shortname “ReportServer” -startup “Automatic”;
New-SQLService -name “SQL Full-text Filter Daemon Launcher (” + $InstanceName + “)” -shortname “MSSQLFDLauncher” -startup “Automatic”;
)

[/powershell]

 Les Repertoires

Microsoft, conseille de par la possible complexité des bases de données SQL Server, et pour en réduire le temps de maintenance, de séparer les bases, configurations, logs, etc dans des répertoires différents. A l’époque Microsoft demandait même de les stocker sur des disques séparés. Chaque disque devait avoir un support physique unique et des niveaux de raid spécifiques pour améliorer les performances. De nos jours, la plupart des baies SAN sont suffisament puissantes et intelligente pour ne plus avoir à s’en préoccuper (Dixit un L3 Support Microsoft pendant un Workshop SQL Server 2012).

Attention: SQL Server ne peut pas stocker de données à la racine d’un disque dur !

Donc, dans le cadre d’une installation complète de SQL Server, voici les répertoires qu’il va falloir:

  • system_db
  • system_db_x86
  • AS_data
  • AS_log_db
  • backup_db
  • AS_temp
  • config_db
  • user_db
  • log_db
  • temp_db
  • temp_log_db
[powershell]

function New-SQLServerPath {
param(
[string]$Path,
[string]$Description,
[String]$Label
)
$d = New-Object PSObject
$d.PsObject.TypeNames[0] = “PSSqlServerPath”
$d |
Add-Member -Name Path -MemberType NoteProperty -Value $Path -pass|
Add-Member -Name Description -MemberType NoteProperty -Value $Description -pass|
Add-Member -Name Label -MemberType NoteProperty -Value $label -pass
}

$Paths = @(
New-SQLServerPath -Path $SystemDisk’system_db’ -Description “SystemDisk” -label “SQL”;
New-SQLServerPath -Path $SystemDBDisk’system_db_x86′ -Description “SystemDBDisk” -label “SQL”;
New-SQLServerPath -Path $ASDataDisk’AS_data’ -Description “ASDataDisk” -label “AS”;
New-SQLServerPath -Path $ASLogDisk’AS_log_db’ -Description “ASLogDisk” -label “AS”;
New-SQLServerPath -Path $BackupDisk’backup_db’ -Description “BackupDisk” -label “SQL”;
New-SQLServerPath -Path $ASTempDBDisk’AS_temp’ -Description “ASTempDBDisk” -label “AS”;
New-SQLServerPath -Path $ASConfigDisk’config_db’ -Description “ASConfigDisk” -label “AS”;
New-SQLServerPath -Path $UserDataDisk’user_db’ -Description “UserDataDisk” -label “SQL”;
New-SQLServerPath -Path $UserLogDisk’log_db’ -Description “UserLogDisk” -label “SQL”;
New-SQLServerPath -Path $TempDBDisk’temp_db’ -Description “TempDBDisk” -label “SQL”;
New-SQLServerPath -Path $TempLogDisk’temp_log_db’ -Description “TempLogDisk” -label “SQL”;
)

[/powershell]

 Le firewall

SQL Server 2008 R2 par défaut utilise des ports dynamiques, je considère ça comment étant la plus vaste connerie de l’univers donc je tiens pour acquis que chaque instance aura un port unique, ce qui dans le cadre d’une installation complète de SQL Server donnera la liste suivante des ports à ouvrir:

  • Le port TCP de l’instance (ex: 1433)
  • Le port UDP du listener de SQL Browser: 1434
  • Les ports TCP 80 et 443 pour Reporting Services
  • Le port TCP 2252 pour Analysis Services

[powershell]

netsh firewall set opmode enable
netsh firewall set service fileandprint enable
netsh firewall add portopening TCP $TCPPort “SQLServer($instanceName)” enable subnet
netsh firewall add portopening UDP 1434 “SQLBrowser($instanceName)” enable subnet
netsh firewall add portopening TCP 80 “Reporting Services – Http – ($instanceName)” enable subnet
netsh firewall add portopening TCP 443 “Reporting Services – Https – ($instanceName)” enable subnet
netsh firewall add portopening TCP 2252 “Analysis Services ($instanceName)” enable subnet

[/powershell]

Dans cet article nous avons vu des déclarations de variables, des créations d’objets personnalisés et le remplissage d’un tableau pour les services et les répertoires. J’ai utilisé la commande netsh (qui n’est pas propre à powershell, mais qui fonctionne tellement bien) pour ouvrir les flux dans le firewall Windows.

La prochaine partie de cette série d’articles verra intervenir d’autres techniques qui j’espère vous serviront 🙂

Bonne fin de week end.