septembre 2009 - Messages
Comme quoi même les Dieux peuvent se planter :)
Dans le white Paper Haute disponibilité publié par MSDN par Paul Randal, dont je parle ici, celui ci indique (à la fin) que le mirroring est disponible uniquement en mode asynchrone sur du SQL Server Standard.
En fait c’est le contraire, il faut lire “Sql Server Standard ne gère QUE le mode Synchrone” alors que “Sql Server Entreprise gère les deux modes : Synchrone ET Asynchrone”
J’ai prévenu Paul, qui va apporter la correction “As Soon As Possible”
Comme quoi …
Paul Randal, Dieu vivant, vient de publier un white paper sur la haute disponibilité avec SQL SERVER 2008, disponible sur MSDN
High Availability with SQL Server 2008
Il y aborde les différentes façons de maintenir une haute disponibilité sur une base de données.
Chaque situation a sa solution technique, dépendant de beaucoup de choses, comme le temps de non disponibilité acceptable, les maintenances sur le(s) serveur(s), les contraintes budgétaire ou physique, Simple Instance, Multi Instances etc …
C’est vrai que c’est important .. ces petits détails qu’on appelle “les contraintes” , mais ces contraintes font aussi parti de la “bonne” solution à adopter.
L’écosystème … (bon ça fallait que je place, c’est un mot à la mode ces temps-ci. On sait jamais, ça pourrait faire bondir mes visites ! :))
Ne pensez pas forcément “Failover Clustering” immédiatement, bien que ce soit là une excellente solution technique. Il en existe d’autres, et pour reprendre l’expression consacrée, “pour tous les budgets m’dame !”
Voici les différentes solutions qu’il aborde :
- Failover Clustering (biensur)
- Database Mirroring
- Log Shipping
- Réplication Transactionnelle, modèle Peer to peer.
- Stratégie de backups, Full, différentiel et Transaction Log
- Database Snapshot
Voilà encore un must read !
PS : Tiens j’ai mis dans un même Post “Mirroring” et “Snapshot”. Vous saviez qu’on peut créer un snapshot d’une base de donnée Mirroir (et qui est donc de ce fait non accessible) ?
J’ai découvert ça aujourd’hui, et j’adore le concept :)
Rendre les données sur le serveur Mirroir accessibles, en lecture seule certes, alors que la base de données est en état de recouvrement partiel, c’est génial :) Bon c’est sûr il faut compter avec le delta des mises à jour correspondant à la date du Snapshot.
Enfin bref, une mise en commun de deux technos s’avère des fois un très bon compromis !
Pour le moment, l’utilitaire aspnet_regsql.exe ne fonctionne pas directement sur une base de données SQL AZURE.
Voici un script de création de la base de données Membership, épuré des incompatibilités de la plateforme SQL AZURE.
N’oubliez pas de créer la base de données auparavant depuis l’interface d’administration SQL AZURE.
Voici le script, compressé : http://www.dotmim.com/sitefiles/SqlAzureScriptAspnetDb.zip
Je viens de publier la deuxième partie de ma série d’articles consacrée à la migration d’une application existante vers Azure.
Aujourd’hui, il s’agit de “Load balancer” (ou répartir la charge en français ) la première partie de la plateforme déjà en place sur Azure, sur plusieurs noeuds (web roles).
Nous utiliserons le système de gestion de sessions personnalisés pour SQL Azure Database pour arriver à nos fins.
Voici un petit aperçu de ce que nous obtenons à la fin :

Plateforme Azure : Migrez ! Part II
Bonne lecture :)
Déployer un site web sous Azure est quelque chose de parfaitement maitrisé, simple et efficace.
Mieux, le load balancing se résume à une ligne de configuration dans un fichier xml azure. Ainsi, en quelques clics, il est possible de déployer plusieurs instances, ou noeuds, ou web roles, le tout load balancé automatiquement.
Que du bonheur donc !!
… ou pas :)
Petit problème du jour : Les noeuds (web roles) Azure sont “State less” : Ils ne gèrent pas l’affinité de la session.
Du coup, vous n’êtes pas garantie qu’une requête HTTP soit correctement redirigée vers le bon web role.
Bref un site web avec une gestion poussée de la session ne peut pas être load balancé en l’état actuel des choses, sur AZURE.
Pour pallier à ce problème, il est possible d’utiliser un système personnalisé de gestion des sessions. Il existe de base un fournisseur (provider) de session SQL : le SqlSessionsStateStore.
Malheureusement pour nous, celui ne fonctionne PAS sur azure, dû notamment à l’utilisation de fonction SQL non autorisées dans SQL AZURE pour le moment

Utilisation de la procédure stockée système sysobjects non autorisé sur SQL Azure
Autre problème : Le provider SQL utilise l’agent SQL pour effacer les sessions expirées. Et ce fameux agent n’est pas disponible sur SQL AZURE…
Il ne manque pas grand chose pour faire fonctionner ce système sur Sql Azure
- Résoudre les problèmes de T-SQL non autorisé
- Utiliser un Worker Role pour réaliser le travail de l’agent SQL
J’ai donc développé une solution complète qui résout ces problèmes et permet ainsi de gérer la session d’un site web load balancé sous Azure !
Note : Pour autoriser le fonctionnement de votre fournisseur de session personnalisé, n’oubliez pas d’activer l’option “Enable Full Trust” de votre Web Role
Vous trouverez la solution complète sur Codeplex à l’adresse suivante : http://azuresqlsession.codeplex.com/
Au final, vous pourrez mettre facilement en place :
Un site web gérant la session via le fournisseur de session personnalisé pour SQL AZURE

Je viens de tomber sur une étude de cas très très intéressante.
Il s’agit de la mise en place d’une réplication transactionnelle avec SQL SERVER 2008, en mode Peer to peer.
L’étude de cas débute par l’inspection de la solution actuelle, basée sur SQL SERVER 2005, des lots SSIS, un peu de BCP in and out et du FTP pour rallier le tout. Bref, tripant pour les neurones et les nuits blanches :)
Les différentes solutions de haute disponibilité sont ensuite analysées, et mise en concurrence vis à vis des demandes du client :
- Sql Server Cluster Failover
- Database Mirroring
- Log Shipping
- Replication Transactionnelle Peer to peer
Vous l’aurez compris, la Transactionelle P2P est celle retenue dans ce cas concret.
Ensuite vient le temps de l’analyse des bases de production et des points bloquants potentiels : Taille de champs texte maximum pour la réplication, Colonnes Identity, Triggers, Mises à jour en cascade etc …
L’analyse de la structure même des bases de données et la répartition des disques / bases est passée en revue.
Pour s’intéresser enfin à l’architecture Physique, réutilisation de serveurs existants, et des serveurs non utilisés.
Bref, voici l’architecture finale, mais n’ayez pas peur, elle est vraiment détaillée tout au long de l’article !
Viendra ensuite les tests de performance, suivant différentes options comme l’utilisation du PUSH ou du PULL sur le distributeur etc … Tableaux à l’appui, la meilleure configuration est retenue.
Ensuite, viendra la mise en production de l’architecture complète avec un arrêt de service total de … 12 minutes :)
Bref, un must read !
Using Replication for High Availability and Disaster Recovery in SQL Server 2008
Bonne lecture :)
Voilà je viens de publier ma mallette Renault du parfait petit consultant SQL SERVER en vadrouille :)
Vous trouverez le tout sur http://sqlmim.codeplex.com
Update : Si l’application plante au lancement, c’est que vous devez avoir l’UAC activée. Démarrez l’exe en mode Administrateur. Promis à la prochaine version, j’inclus le manifest qui permettra à l’UAC de vous demander ‘ou non’ l’autorisation de lancer l’exécutable…
Bon pour être honnête, la mallette est loin d’être terminée, c’est plus une démonstration de ce que ça pourrait être qu’un outil final !
Mais quand même; en l’état, elle m’a permis récemment de résoudre un problème de goulet d’étranglement sur une File Group pas bien dimensionné :) (Et je vous raconte pas la tête de mon client)
Ah y’a pas à dire, une application “jolie”, ça vaut toutes les prouesses techniques pour un utilisateur final !
Qui a dit qu’on ne pouvait pas allier l’utile à l’agréable (à regarder :))
Voilà n’hésitez pas à me faire quelques retours dessus, vous pouvez me contacter à l’adresse '(enlevez le NO_SPAM )
sebatient[NO_SPAM].pertus@bewise[NO_SPAM].fr
Une nouveauté bien sympa dans SSRS 2008 R2, avec le Report Builder 3 : La possibilité d’embarquer dans vos rapports du géospatial !
Le tout accompagné d’assistant en tout genre. Voici quelques copies d’écrans de création de mon premier rapport incluant du géospatial, et couplé à .. bing maps !
Remarquez lors de la création d’un rapport l’icone d’ajout d’une “maps”
Bon, ça reste une CTP et l’assistant ne vous propose que les cartes des Etats Unis. Biensur rien ne vous empêche d’inclure des maps générés grace à vos données géospatiales issues de SQL SERVER 2008
Choix d’une contrée parmis tant d’autres, depuis l’assistant de création.
L’intégration avec Bing maps se fait tout simplement, et ce depuis l’assistant :
Les différents choix de vue : Road, Aerial ou Hybrid
Une fois l’assistant terminé, vous avez encore accès à pas mal d’options
Intégration de votre “map” dans le design de votre rapport
Enfin, le rendu. Notez que je n’ai absolument rien raccordé, je n’ai fais que du “clic and point”
Le rendu final
Suite suite !
Voici une nouvelle tache à ajouter à ma malette :) L’analyse des index fragmentés d’une base de données.
Evidemment, savoir qu’un index est fragmenté ne suffit pas ! Est 'il utilisé ? Quel est son niveau de fragmentation, quel est sa taille ? son nombre de pages ? Est il cluster non cluster ? Est il bien utilisé (Seek ou Scans) ?
Voilà donc un nouvel écran résumant toutes ses informations :
- Nom de l’index
- % de fragmentation
- Taille (MO)
- Nombre de seeks
- Dernière opération de seek
- Nombre de scans
- Dernière opération de scan
- Dernier update
- Nombre de pages
- Nombre de lignes
Attention. Ces statistiques n’ont de valeur que depuis le dernier redémarrage du serveur. Vous pouvez avoir un index en apparence peu utilisé, mais il se peut que son “cycle de vie” ne soit qu’à peine entamé :)
Voici une copie d’écran de cette nouvelle fonctionnalité :
Ah oui, une dernière chose, rien à voir avec SQL Server sur ce coup, mais en rapport avec l’application. Un collègue a soulevé le fait que le noir y’a mieux (enfin c’est lui qui dit ça hein, pas moi :))
Allez hop, mise en place des thèmes, à la volée monsieur ! (Bon faut faire l’écran d’options …)
Voilà, apparition du Dark Theme et du Light Theme
Vous en pensez quoi ? :)
Setup in progress….
Sinon, vu que j’ai 5 minutes là, juste une petite remarque sympa dans le setup : La possibilité d’installer une version allégée ou complète de SSMS (Sql Server management Studio)
La version allégée:
Elle comprend :
- SSMS pour le Database Engine
- SSMS pour Sql Server 2008 Express
- Les outils en lignes de commandes SqlCmd
- Le provider PowerShell
La version complète :
Elle comprends, en plus :
- SSMS pour Reporting Services
- SSMS pour Analysis Services
- SSMS pour Integrations Services
- SQL Server Profiler
- Database Engine Advisor
- Sql Server Utility management
Voilà, à vous de choisir 
Je viens d’écrire un article sur la migration sur Azure. Il vient d’être publié sur Techheadbrothers
Il s’agit de migrer une application complète sur Azure. Cette migration aura lieu en plusieurs étapes, et l’objectif de ce premier article est de migrer
- L’application Web
- La base de données
Je vous invite donc à le lire, vous trouverez pas mal d’infos sur Azure, ainsi que sur la migration vers SQL Azure Database.
Un petit résumé :
“Lors de la PDC 2009, qui aura lieu en Novembre, la plateforme AZURE va passer de son statut de BETA à Release Commerciale. Les principales briques métiers qui la composent, avec dernièrement l’arrivée de SQL Azure Database, sont maintenant à disposition du grand public en Béta-Test.
Il est donc temps de songer à migrer nos applications sur le Cloud.”
Un petit schéma de l’architecture de l’application à migrer, et qui fait l’objet de cet article :

Bonne lecture !
Je continue dans ma série “Malette etc ….” :)
Aujourd’hui, je me suis dis qu’il serait peut être intéressant d’avoir un écran qui résume l’ensemble des informations essentielles sur un serveur donné.
Outre les infos de bases (nom du serveur, édition, service pack, classement, mémoire dispo etc…) j’ai rajouté le nombre de sessions en cours ainsi que les transactions actives. Puis le nb de connexions utilisateurs et le nombre de connexions logiques.
Enfin, j’ai rajouté une série de camemberts représentant le total I/O par base (le grand sur le screenshot suivant), le total de reads par base et enfin le total de writes par base (les deux petits camemberts, donc. )
Voilà, de quoi donner un bon aperçu de l’activité d’un serveur, enfin du moins coté I/O. Disons que c’est un bon début !

Bon je continue dans ma série ” Malette Renault du parfait petit consultant itinérant ”
Je viens de finir l’écran présentant l’activité globale des bases de données :
Depuis le dernier démmarrage de SQL SERVER, je récupère le nombre de Mo qu’a généré en Read et en Write la base de données, puis le nombre total de Reads et le nombre total de Writes :
Voici en substance le script utilisé :
Declare @OneMo float = cast ((1024 * 1024) as float);
SELECT vfs.sample_ms as EllapsedTimeMs
, db_name(vfs.database_id) as DatabaseName
, vfs.database_id
, sum(vfs.num_of_bytes_read / @OneMo) as [ReadsMo]
, sum(vfs.num_of_reads) as [Reads]
, sum(vfs.num_of_bytes_written / @OneMo) as [WritesMo]
, sum(vfs.num_of_writes) as [Writes]
, sum(vfs.num_of_bytes_read + num_of_bytes_written) / @OneMo as [TotalIoMo]
, sum(vfs.num_of_writes + num_of_reads) as [TotalIo]
From sys.dm_io_virtual_file_stats(null, null) vfs
Where vfs.file_id <> (Select mf.file_id from sys.master_files mf where mf.type = 1 and mf.database_id = vfs.database_id)
And vfs.database_id > 4
Group by vfs.sample_ms, vfs.database_id
Order By DatabaseName asc
En en couleur, ça donne ça :
On peut voir par exemple que la première base génère pas mal de trafic : 750 Mo de Reads pour 206 Mo de Writes.
Ce qui est remarquable c’est qu’il y a peu de Reads en comparaison des Writes : 3577 Reads pour 22255 Writes
On peut donc conclure que les Select qui sont fait sont peu nombreux mais ramènent un volume de données important à contrario des opérations CUD (Create Update Delete) qui eux génèrent bcp de trafics sur peu de volume de données.
D’une manière générale, ça c’est bien ! Les opérations CUD doivent toujours être rapides, pour éviter au maximum les Locks…
Pour la deuxième base : Peu de Writes, Beaucoup de Reads : Normal, c’est mon blog et quelques internautes égarés viennent (beaucoup :)) lire, alors que je fais en comparaison, peu d’opérations CUD !
Enfin, pour la dernière base, on peut remarquer qu’il n’y a que des Reads, pratiquement pas de Writes : Normal c’est base de données est en lecture seulement (sauf exception)
Ah tiens, allons quand même vérifier comment est réparti la taille des fichiers sur cette dernière :
Ah, peu d’espace libre sur le seul FileGroup PRIMARY : Normal, pour une base de données où seul des récupérations de données sont faites ;)
Voilà une bonne analyse non ?
Stay Tuned !
J’utilise régulièrement des scripts pour effectuer des audits sur mes bases SQL.
J’en trouve même pas mal sur le net, d’autres administrateurs qui ont eux même la même habtiude.
Je me suis toujours dis qu’un jour il faudrait mettre tout ça un peu plus en relief, tout aggréger dans une application, une sorte de Malette-Renault–J’arrive-J’épate-J’analyse-Et-J’Répare .
C’est vrai que lire des lignes et des colonnes de données, c’est intéressant, mais voir ces même données sous une forme plus conviviale, ça peut aussi changer la vie.
Bref, cette idée me trote dans la tête depuis un bon moment et je me suis finalement lancé aprés avoir utilisé un script pondu par Christophe qui se prète trés bien au jeu.
Ce script a pour vocation de mettre en évidence sur toutes vos bases de données la répartition des tailles des fichiers de chaque filegroups.
A l’exécution, le Script de Christophe donne ça :
Alors certes ça suffit, mais une vue plus … “visuelle” me semble une bonne idée.
Allez hop, un coup de Visual Studio, un projet WPF, développée avec le Patern MVVM et voilà ce que donne la Béta 1 :
Oui, C’est plus clair :)
Surtout l’analyse est beaucoup plus rapide à faire pour des administrateurs système, on va dire, moins expérimentés que Christophe ;)
Biensur l’analyse de chaque filegroup sur chaque base va dépendre du contexte : Base de données en lecture seule, trafic important, opérations CUD élevées, Lecture des données stratégique etc …
Bref, un exemple simple, volontairement exagéré pour l’occasion : Si je prend ma première base, répartie sur 4 filegroups, on voit clairement que les filegroups sont mal partitionnés.
Un contient 99,9 % des données et deux autres sont vides … La répartition des données est donc à revoir ;)
Voilà pour une première mise en oeuvre.
Je compte bien ne pas m’arréter en si bon chemin, j’ai déjà pas mal d’idées, comme l’intégration d’un compteur de performances fait maison en WPF avec les compteurs que j’utilise le plus souvent
Alors oui, certains me diront que ce genre de compteurs existent via le moniteur d’activité de SSMS 2008, mais aussi faut il l’avoir à disposition sur le serveur que l’on veut auditer ! Et ça c’est loin d’être gagné :)
Bref, je fourmille d’idées, la prochaine étape va consister à rendre sous forme plus visuelle, un script de visualisation des index, et de leur fragmentation (encore une fois, un petit script de la maison Christophe )
Et si biensûr vous avez des idées de scripts à intégrer, n’hésitez pas à m’en faire part !