Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

SQL Server : Bug sur le SCOPE_IDENTITY() et parallélisme enfin résolu après plus de 3 ans !

Ce bug est un vieux bug, à en juger par sa description sur le site Connect qui date de 2008 avec un problème remonté sous SQL Server 2005.

https://connect.microsoft.com/SQLServer/feedback/details/328811/scope-identity-sometimes-returns-incorrect-value

Ce problème particulièrement grave, puisqu'il y a reste de renvoie d'une valeur erronée de l'Identity c'est-à-dire la dernière valeur affectée à une colonne de type compteur. Ce problème ne se produit que lorsqu'une insertion est faite avec un plan d'exécution parallélisé c'est-à-dire une requête très complexe.

Il existe plusieurs détournée de résoudre le problème :

  • Utiliser la clause OUPUT lors la commande INSERT, qui elle ne subit pas ce bug
  • Ne pas utiliser le parallélisme en forçant le MAXDOP à 1 (au niveau serveur ou de la requête)

Ces 2 solutions sont expliquées ici sur le site de support de Microsoft : http://support.microsoft.com/kb/2019779

Sinon la bonne nouvelle est que ce bug est corrigé… Dans SQL Server 2012 !

Ok ce dernier n'est pas encore en version finale, mais sa sortie est pour très bientôt… En attendant reste à espérer que Microsoft sortira un correctif pour les autres versions, ce qui a l'air assez improbable tant le temps est déjà passé depuis la que le bug sous Connect a été marqué comme résolu.

En attente de SQL Server 2012…

Posté le par christian | 0 commentaire(s)

SQL Server : Virtualisation illimitée

C'est une question à laquelle j'ai eu mois même du mal à répondre… Quels sont les licences requises pour virtualiser de manière illimitée SQL Server ? Par virtualisation illimitée j'entends le fait de pouvoir installer autant de machines virtuelles exécutant une ou plusieurs instances SQL Server, sur un hôte, c'est-à-dire une machine physique.

La réponse est au final assez simple :

Il suffit juste de licences SQL Server Enterprise par Processeur (ou par cœur pour la prochaine version de SQL Server : 2012) en combinaison de la Software Assurance.

Nul besoin de l'édition Datacenter qui disparait avec l'arrivé de SQL Server 2012… Le principe est que SQL Server 2008 permet la virtualisation illimitée en édition Enterprise, et que la Software Assurance permet de préserver les droits de licence de la version précédente. Ce qui fait qu'un SQL Server 2008 R2 Enterprise avec une Software Assurance conserve les avantages de la version 2008. De plus dès la version prochaine (SQL Server 2012), cela devient la règle, puisqu'il faut l'édition Enterprise avec une Software Assurance pour bénéficier de la virtualisation illimitée.

Côté nombre de licences la règle est simple, tous les processeurs de la machine hôte doivent être licenciés. A partir de SQL Server 2012, tous les cœurs physiques de la machines (cœurs non Hyperthreadés) doivent être licenciés.

Un dernier point, et Windows dans tout ça ? Windows réclame pour la virtualisation illimité un Windows Server édition Datacenter et c'est tout.

Pour avoir accès à la virtualisation illimité on achètera :

  • SQL Server 2008 R2 Enterprise par Processeur avec Software Assurance
    • ou
  • SQL Server 2012 Enterprise par Cœurs avec Software Assurance
  • Windows Server 2008 R2 Datacenter par Processeur

Et c'est tout…

 

Posté le par christian | 0 commentaire(s)

Afterworks des communautés Microsoft édition Suisse à Genève, le 17 Janvier 2012

Ce n'est pas tout à fait la première édition, c'est la seconde à Genève. Venez nous rencontrer et discuter des thèmes qui vous sont cher autour d'un verre en toute convivialité.

Le concept des Afterworks :

  • Animé par les acteurs des communautés
  • Organisé de manière informelle et conviviale
  • Ouvert à tous

Les personnes intéressées peuvent s'inscrire ici:
http://www.facebook.com/events/229609147113572/

L'inscription est non obligatoire mais aidera grandement à savoir si on doit réserver une table, si beaucoup de personnes sont présentes.

Le lieu est situé juste en face de la gare principale de Genève (Gare de Cornavin).

Venez nombreux…

Posté le par christian | 1 commentaire(s)

Bonne année 2012, ma 6ème année de MVP, et SQL Server 2012

Bonne année 2012 à tous, j'espère que cette année sera un bon cru.

Pour ma part ça va être difficile de faire mieux que 2011, mais on va essayer.

L'année 2011 a été l'année des changements j'ai rejoint la société Trivadis. En 2011 j'ai obtenu la certification Master sur SQL Server 2008 et eu l'opportunité de co-organiser l'évènement les journées SQL Server, qui a été un succès avec plus de 310 participants !

L'année 2012 attaque fort, je viens tout juste d'être renouvelé en tant que MVP SQL Server pour la 6ème année consécutive. Je ne suis pas pour autant le plus ancien dans ce titre, c'est M. Fred Brouard qui est le plus ancien MVP SQL Server français.

Et enfin 2012 est l'année de sortie de SQL Server 2012 !!! Qui sera un grand cru !

Encore une bonne année à tous

Posté le par christian | 0 commentaire(s)

Les journées SQL Server : La conférence est officiellement Sold-Out



Nous pouvons être tous fiers du niveau des inscriptions, nous avons en effet franchis la barre des 400 personnes pour atteindre les 417 inscrits. C’est un niveau bien au-delà de nos attentes et nous en sommes très contents, mais nous sommes obligées d’arrêter les inscriptions à ce stade, le centre de conférence de Microsoft France n’offrant pas une capacité suffisante pour plus de personnes.

Néanmoins pour les personnes qui souhaitaient participer et qui ne peuvent s’inscrire, bonne nouvelle, l’évènement sera intégralement Wecasté et les Webcast mise à disposition publiquement quelques semaines après l’évènement. Au nombre desquels HP, Quest, Waisso et nien sûr Microsoft.

En passant, j’en profite pour remercier les sponsors grâce auquel l’évènement est possible, et grâce auxquels vous pourrez voir et revoir l’évènement en vidéo.
Pour tous ceux ayant leur ticket pour la conférence, nous vous attendons, non sans une certaine impatience, dès lundi pour 2 jours consacrés à SQL Server.
A lundi pour la première conférence communautaire francophone consacrée à SQL Server !

Posté le par christian | 0 commentaire(s)

SQL Server 2012 : Tableau complet des fonctionnalités par édition

C'est ici que ça se passe ici :

http://msdn.microsoft.com/en-us/library/cc645993(v=sql.110).aspx

Rien de bien nouveau, la plupart des nouvelles fonctionnalités majeures sont dans l'édition Enterprise (Power View, AlwaysOn), et pas mal d'autres sont disponibles dès l'édition Express (moteur sémantique, …)

Bonne lecture…

Posté le par christian | 0 commentaire(s)

Les journées SQL Server édition 2011 à Paris les 12 et 13 Décembre prochain, inscrivez-vous

La conférence est gratuite et totalise plus de 40 sessions animés par des MVP, des experts et même de personnes de chez Microsoft dont certains qui viennent de loin.

C'est sur 2 jours totalement dédié au monde du moteur relationnel et de la BI. Venez nombreux et prouvez nous que cet évènement sera un succès.

Programme détaillé des sessions ici

http://www.guss.fr/accueil/les-journées-sql-server.aspx

Inscription

https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032496260&Culture=fr-FR

En passant un grand merci aux sponsors qui nous soutiennent, dont Microsoft, HP, et les autres… Et à mes 2 acolytes et co-organisateurs Arian et Jean-Pierre.

A dans moins d'un mois…

 

Posté le par christian | 0 commentaire(s)

SQL Server 2012 : Dernière Beta (Release Candidate) de SQL Server nom de Code Denali disponible en téléchargement

Dernière ligne droite pour Microsoft pour la prochaine version majeure de SQL Server, dont la dernière (généralement la Release Candidate précède de quelques mois la version finale)

Ça se passe ici en anglais et en français :
http://www.microsoft.com/download/en/details.aspx?id=28145

Le téléchargement est gratuit, profitez et testez bien.

Bon téléchargement…

Posté le par christian | 0 commentaire(s)

PASS Summit 2011 : Première plénière présentée par Ted Kummert

Après une présentation du PASS, qui atteint cette année les 80000 membres et les projets du moment.

Ted Kummert commence à nous parler de SQL Azure qui a été introduit il y a 18 mois. On passe ensuite sur une vision de la communauté avec les 80000 membres du PASS et les 300 MVP SQL Server au niveau mondial.

Petite retour en arrière, en revenant sur le lancement des solutions intégrées avec le matériel, les appliances, avec l'édition Parallel Datawarehouse lancé il y a 1 an.

Retour sur SQL Server Denali, avec les fonctions clef tel que AlwaysOn, l'ajout du moteur sémantique. La mise à disposition de la BI au niveau des utilisateurs avec le projet Crescent. Le projet Juneau pour mettre à disposition des outils gratuitement aux développeurs de bases de données.

La CTP3 a été lancé durant l'été avec de nombreux retour de clients. Et l'annonce du nom de SQL Server Denali qui deviant SQL Server 2012 et est annoncé pour le premier semestre 2012.

On continue sur l'initiative Big Data. Microsoft va fournir des drivers (y compris pour PDW, dispo ici : http://www.microsoft.com/download/en/details.aspx?id=27584 ) pour Hadoop et un framework pour ce dernier et un addon pour Excel pour la connectivité sur Hive. Tout cela annoncé pour le courant de l'année 2012.

Crescent ou l'Adhoc reporting sous SQL Server 2012 avec Silverlight et Sharepoint 2010 a lui aussi un nom, çà sera « Power View ». Juneau obtient lui aussi un nom final, il s'appellera SQL Server Data Tools (SSDT).

Introduction du composant Data Explorer, un composant qui permet de découvrir les données associées à d'autres à partir d'analyse sémantique. Combiné bien sûr avec le Market Place de SQL Azure. Ce composant sera fourni plus tard dans l'année sur la plateforme Azure.

L'annonce presse : http://www.microsoft.com/Presspass/press/2011/oct11/10-12PASS1PR.mspx

Bonnes nouvelles…

Posté le par christian | 0 commentaire(s)

PASS Summit 2011 : SQL Server nom de code Denali se pare d’un nom définitif…

Ca sera… SQL Server 2012 !

Et il sortira durant le premier semestre 2012 !!!

Bonne nouvelle

Posté le par christian | 3 commentaire(s)

PASS Summit 2011 : Découvrez la première plénière dans un peu plus d’une heure en direct…

Quelques annonces de prévues durant les 2 premières plénières du PASS Summit 2011 dont le premier jour de conférence est aujourd'hui. Les 2 précédents étant dédiés au pré conférence et à des sessions sous NDA concernant les MVP SQL Server.

Dès 8h15 heure locale (17h15 en heure européenne centrale), vous pourrez suivre la plénière en direct sur le site du PASS, retransmis en streaming.

Pour accéder à la retransmission c'est ici :
http://www.sqlpass.org/summit/2011/Live/LiveStreaming.aspx

Il vous suffira de rentrer votre adresse email et votre pays et le tour est joué.

La première plénière est présenté par Ted Kummert, Senior Vice President de la division Business Platform. Division chargée entre autre de SQL Server.

Bonne plénière…

Posté le par christian | 0 commentaire(s)

SQL Server : Service Pack 3 de SQL Server 2008 disponible en téléchargement

Le Service Pack 3 pour SQL Server 2008 est maintenant disponible en téléchargement public.

Plus de détails ici : http://www.sqlnco.ch/2011/10/service-pack-3-de-sql-server-2008-disponible-en-telechargement/

Bonne installation…

Posté le par christian | 1 commentaire(s)

Azure : Installation de Wordpress sur Windows Azure et SQL Azure

Cet article fait suite au précédent sur le sujet sur l'installation de PHP sur une couche Azure… C'est maintenant au tour de Wordpress au grand complet.

C'est dans la suite : http://www.sqlnco.ch/2011/09/installation-de-wordpress-sous-windows-azure-et-sql-azure/

Bonne installation…

Posté le par christian | 0 commentaire(s)

SQL Server - FAQ SQL : Pourquoi mon fichier de log/ldf est il aussi gros ? Comment diminuer sa taille ?

Qu'est-ce que le journal de transactions ou (Transaction Log en anglais) ?

Il est souvent confondu avec le fichier LDF de la base de données. En fait, le journal de transactions n'est pas un seul fichier, mais peut être composé de plusieurs fichiers LDF (extension par défaut du fichier). Mais il est vrai que dans l'énorme majorité des cas, seul 1 fichier LDF est présent dans une base de données, et c'est lui seul qui représente le journal (voir ici pour l'utilisation de plusieurs fichiers : http://www.sqlnco.ch/2011/10/quel-est-l-interet-d-avoir-2-fichiers-et-plus-pour-le-journal-de-transactions-tlog-ldf-dans-sql-server/).

Pour connaître le ou les fichiers du journal de transactions dans la base de données courante, utilisez le script suivant.

select * from sys.master_files
where type = 1 and database_id = DB_ID()

Ne pas confondre ces fichiers multiples avec les VLFs (Virtual Log Files) qui contrairement à leur nom ne sont pas des fichiers, mais des blocs qui composent le fichier LDF.

Le journal de transactions contient l'ensemble des transactions exécutées sur la base de données courante. Pour simplifier imaginez que toutes les requêtes réalisant des écritures sont stockées dans ce journal avant même que les données soient inscrites sur le disque. Un certain nombre d'opérations systèmes génère aussi des écritures dans le journal.

La finalité de ce journal est double. Il permet de maintenir les données dans le cache mémoire de SQL Server, le plus longtemps possible sans avoir à les écrire dans les fichiers de données. Mais aussi de permettre la récupération de la base de données en cas d'arrêt non prévu. En effet les données restant longtemps dans le cache, sans journal traçant les opérations d'écritures la base de données serait corrompu en cas de redémarrage du serveur. Il sert donc à améliorer les performances en limitant les écritures sur le disque, mais aussi permet de remettre la base de données dans un état cohérent en cas de redémarrage (et aussi en cas de restauration d'une base de données).

Sans journal, le risque de corruption de la base de données est énorme et le serveur risque de ne pas tolérer le moindre arrêt sans pouvoir vider son cache vers le disque, ce qui est clairement aberrant dans un environnement de production.

Pourquoi le journal de transactions grossi-t-il ?

Toutes les modifications effectuées sur la base de données génèrent des transactions et font donc grossir les fichiers du journal de transactions. Il est donc normal que ce fichier grossisse au fil de l'activité de la base de données.

Seulement sans aucunes actions de la part de l'administrateur de base de données, le journal grossira à l'infinie et cela sans aucuns avantages. En effet périodiquement les données présentes dans le cache sont inscrites sur le disque l'intérêt de la récupération des données est donc nul pour des transactions anciennes. Par contre, en cas de perte des disques où sont situées les données, ces anciennes transactions peuvent se révéler précieuses.

C'est là que rentre en ligne de compte, la sauvegarde du journal de transactions. En effet comme indiqué ci-dessus les informations du journal de transactions anciennes ne servent pas au moteur pour redémarrer le serveur et remonter une base de données, mais peuvent être intéressante en cas de perte de fichier, et par extension en cas de perte disque ou de crash serveur sévère. Sans les transactions seules les sauvegardes complètes sont disponibles, or la restauration à un point fixe dans le temps vous expose à une perte systématique de données.

Donc, utiliser des morceaux du journal de transactions et les combiner avec les sauvegardes complètes, permet de remonter la base de données à n'importe quel point dans le temps y compris le moment exact du crash serveur. De plus, une fois la sauvegarde du journal de transactions réalisée, la portion copié vers le fichier de sauvegarde, n'est plus utile dans le journal et peut être supprimée (à quelques conditions détaillées plus loin).

Sauvegarder régulièrement le journal de transactions, permet de libérer de l'espace à l'intérieur des fichiers LDF. Cela ne changera rien à la taille des fichiers en eux même (attention à ne pas utiliser des options tel que Auto Shrink, voir plus loin), mais permet la réutilisation de l'espace interne des fichiers LDF.

La commande DBCC SQLPERF(LOGSPACE) renvoie des informations sur la taille du journal de transaction et le pourcentage d'occupation de ce dernier. Cela peut se révéler très utile pour savoir où en est l'occupation du ou des fichiers. Attention cette commande requiert des privilèges sysadmin sur l'instance où elle est exécutée.

Database name

Log Size (MB)

Log Space Used (%)

Status

Master

1.242188

36.79245

0

Tempdb

0.4921875

75.89286

0

Model

0.7421875

44.21053

0

Msdb

8.179688

16.0936

0

Il est important de créer des fichiers LDF avec une taille correcte dès le départ. L'avantage est multiple, d'une part on évite de tomber sur trop d'opérations d'incrément de fichier (quand le fichier est plein), d'autre part la fréquence de sauvegarde du journal de transactions peut être réduite (passer de toutes les 15 minutes à toutes les 30 minutes par exemple) et finalement, en termes de performance, on diminue la fragmentation interne des fichiers, le traitement des transactions est plus rapide.

On utilise souvent, comme valeur arbitraire de départ, le chiffre de 20%. C'est-à-dire que l'on met 20% de la taille estimée des données, comme taille de départ pour le journal de transactions. Cette valeur est une estimation qui variera grandement avec les différents modes de récupération et l'usage de la base de données. En cas d'écritures intensives, cette valeur peut avoisiner les 30 à 40% facilement. Dans des scénarios de chargement de données de Datawarehouse, y compris avec une base de données en mode de récupération simple, la taille du journal de transactions sera très importante.

Comment diminuer la taille du ou des fichier(s) LDF ?

Le seul moyen est de vider le journal est de sauvegarder ce dernier au travers de la commande suivante.

-- Sauvegarde du journal de transaction de la base de données courante
-- Par convention on donne l'extension de fichier TRN à ce type de sauvegarde

BACKUP
LOG MaBaseDeDonnees

TO DISK = 'c:\monrepertoire\monfichier.trn'

A ce moment-là, une partie du journal de transactions est vidé. La plupart du temps, exécuter cette commande régulièrement suffira à maintenir la taille des fichiers du journal de transactions à une taille constante.

Cependant, un certains nombres de situations risques de nécessiter de manuellement réduire la taille du ou des fichier(s) LDF.

Parmi les raisons possibles :

  • Chargement de données, ayant augmenté la taille du journal plus que nécessaire
  • Opérations de maintenance d'index, ayant augmenté la taille du journal plus que nécessaire
  • Pas de sauvegarde du journal de transactions sur un environnement de développement ou de pré-production

Dans tous les cas, cherchez la cause du problème et ne voyez pas le fait de tronquer le journal et de réduire la taille des fichiers comme la solution.

Parmi les solutions possibles :

  • Augmenter la fréquence de sauvegarde du journal de transactions.
  • Manuellement exécuter une sauvegarde du journal lors d'étapes clef de maintenance de base de données ou de chargement.
  • Changer le mode récupération temporairement lors d'étapes clef de maintenance de base de données ou de chargement.
  • Vérifiez qu'un processus, tel que la réplication transactionnelle, le Database Mirroring ne bloquent pas la vidange du journal de transactions.

Une fois la sauvegarde effectuée, il nous reste à réduire la taille du ou des fichiers grâce à la commande DBCC SHRINKFILE. J'insiste bien sur le fait que c'est SHRINKFILE et non SHRINKDATABASE qui est à utiliser. Le second fait réduire la taille de tous les fichiers et pas uniquement le contenu des fichiers du journal de transactions. C'est non seulement inutile et long, mais cela engendre de la fragmentation dans les données, ce qui est un effet de bord inadmissible pour les performances.

De plus, ne passez jamais une base de données en AUTO_SHRINK, faute de quoi vous risquez de graves problèmes de performances, pour toutes les raisons évoqué ci-dessus. Vos fichiers de base de données risquent de passer le temps à jouer au yoyo en termes de taille !

Le SHRINKFILE a de très fortes chances d'échouer à la première exécution. C'est pourquoi je vous conseille ce script.

-- Vide le début du journal

BACKUP LOG MaBase TO DISK = 'C:\...'

 

-- Tente de convaincre le moteur d'utiliser

-- le début du journal de transactions

CHECKPOINT

 

-- Si la portition active n'est plus à la fin

-- du journal de transactions, vide cette partie

BACKUP LOG MaBase TO DISK = 'C:\...'

 

-- Le Shrink est maintenant possible

DBCC SHRINKFILE(2, 10, TRUNCATEONLY)

 

-- En cas d'échec retentez la liste ci-dessus

 

Le script force le recyclage interne des portions du journal de transactions. La portion, dite active, du journal de transactions doit se déplacer au début du fichier grâce à la commande CHECKPOINT. La sauvegarde du journal de transactions peut alors vider la fin du fichier, et le SHRINKFILE libérer l'espace libre à la fin de ce dernier.

Au niveau de la syntaxe de SHRINKFILE, le premier argument est le numéro du fichier à réduire (vous l'obtenez avec la requête du début de cet article). Le deuxième argument est la taille cible en Méga Octets. Le 3ème est optionnel dans le cas du journal de transactions, il permet d'indique que l'on souhaite uniquement libérer l'espace disque, sans réarranger le contenu interne du fichier.

Sachez que ce script n'aura pas toujours d'effet, quelques causes possibles :

  • La partie active du journal se trouve actuellement à la fin du fichier du journal de transactions
  • Une sauvegarde du journal de transactions ou de données est actuellement en cours d'exécution
  • Une transaction longue est en cours d'exécution
  • Une réplication transactionnelle existe et les transactions associées n'ont pas encore été envoyées au distributeur
  • Un Database Mirroring est en place sur cette base de données et une ou plusieurs n'ont pas été inscrites dans le journal de transactions du miroir
  • Le Change Data Capture a été mis en place et des transactions n'ont pas encore été traitées par celui-ci.

De plus, jamais la totalité du journal n'est jamais vidé, et donc la taille du fichier n'atteindra jamais 0 octets après un DBCC SHRINKFILE. Attention aussi à ne pas trop diminuer la taille du fichier, Je vous conseille de mettre une taille cible correcte en argument de cette commande pour éviter, à nouveau, des incréments sur les fichiers LDF, qui se révèlent très couteux.

Changer le mode de récupération de la base de données ?

Autre solution, passez votre base de données en mode de récupération simple ou journalisé en bloc. En effet en procédant de cette manière, le volume de transactions enregistré dans le journal diminuera fortement pour certaines opérations.

C'est particulièrement intéressant pour les opérations de maintenance d'index ou de création d'index, les chargements de données (BULK INSERT / SELECT INTO / INSERT avec TF610) et les opérations de traitement de données volumineuses (plus de 8ko binaires ou texte). Celles-ci se retrouvent faiblement journalisées et écrivent beaucoup moins d'information dans le journal de transactions.

Une exception cependant, la maintenance d'index en ligne, qui s'exécute toujours en journalisation complète, quel que soit le mode de récupération de la base de données.

Il existe 3 modes de récupération : simple, journalisé en bloc (BULK LOGGED) et complet… Plus de détails sur ces derniers : http://blogs.codes-sources.com/christian/archive/2010/01/05/sql-server-les-modes-de-r-cup-ration-de-bases-de-donn-es-et-les-mythes-autour-du-mode-simple.aspx

Un autre avantage non négligeable du mode de récupération Simple en plus de la journalisation simple de certaines opérations, est le fait qu'il est tronqué automatiquement. Dès que le moteur réalise un CHECKPOINT, le journal est vidé de sa portion inactive. Plus besoin de réaliser de sauvegarde du journal de transaction dans ce mode.

-- Modifie le mode de récupération de la base de données
-- Dans ce mode les BACKUP LOG ne peuvent se faire
-- Le journal est tronqué automatiquement mais peut quand même grossir
ALTER DATABASE MaBaseDeDonnees SET RECOVERY SIMPLE

En contrepartie il est impossible de restaurer la base de données autrement que par une sauvegarde compète ou différentielle. On ne peut pas profiter du journal pour récupérer une base de données, avec un RESTORE LOG. Pas de restauration fine dans le temps, pas de restauration jusqu'à la période du crash serveur en cas panne sévère.

Tronquer le journal sans le sauvegarder

Il était possible jusqu'à SQL Server 2008 de tronquer le journal de transactions. C'est-à-dire de le vider sans sauvegarder son contenu. Cette option est assez dangereuse et je ne saurais que la déconseiller, particulièrement sur un environnement de production.

Dans certains cas particulier, elle est néanmoins nécessaire (sur des environnements de développement par exemple). Elle doit être impérativement suivie d'une sauvegarde complète, sinon votre base de données restera implicitement en mode de récupération simple (quel que soit la méthode utilisée ci-dessous).

Sous SQL Server 2000 ou 2005, vous pouvez utiliser les commandes suivantes.

 

-- Ces 2 méthode ne sont plus supportées

-- depuis SQL Server 2008

BACKUP LOG MaBase WITH NO_LOG

BACKUP LOG MaBase WITH TRUNCATE_ONLY

Cependant je vous conseille la méthode suivante qui fonctionne sur toutes les versions du moteur de base de données de 2000 à 2008 R2.

-- Remplace NO_LOG et TRUNCATE_ONLY
-- Passe en mode simple --> réalise un TRUNCATE jusqu'au point de contrôle
ALTER DATABASE MaBaseDeDonnees SET RECOVERY SIMPLE


-- Repasse en mode complet
ALTER DATABASE MaBaseDeD
onnees SET RECOVERY FULL

Vous pouvez faire de même avec le mode journalisé en bloc, en remplaçant FULL par BULK LOGGED. Après ces commandes, exécutez la sauvegarde complète pour rétablir le mode de récupération. La base de données reste en mode de récupération simple tant que la sauvegarde n'est pas exécutée, même si les paramètres de base de données prétendent le contraire.


-- Impérativement faire une sauvegarde complète après
BACKUP DATABASE MaBaseDeDonnees TO DISK = 'monFichier.BAK'

Une alternative existe pour sauvegarder le journal de transactions sans conserver les fichiers de sauvegarde : http://blogs.codes-sources.com/christian/archive/2008/05/06/sql-server-envoyer-une-sauvegarde-vers-le-p-riph-rique-nul.aspx

Je conseille cette technique sur les serveurs de développement, là où la base de données doit conserver le même mode de récupération qu'en production sans d'embarrasser avec les sauvegardes.

En conclusion

  • Sauvegardez régulièrement le journal de transaction
  • Sinon pensez à passer en mode de récupération simple
  • Ne réduisez la taille que des fichiers LDF, via SHRINKFILE, pour le remettre à une taille initiale correcte
  • N'utilisez jamais de SHRINKDATABASE
  • N'utilisez jamais l'option AUTO_SHRINK sur une base de données

Versions applicables

SQL Server 2000 (avec certaines restrictions sur certains scripts utilisant des vues systèmes ou des DMV)

SQL Server 2005
SQL Server 2008
SQL Server 2008 R2

SQL Server nom de code Denali

Bon shrink…

Posté le par christian | 1 commentaire(s)
Classé sous : ,

SQL Server : Vues indexées y compris sur Edition Express ou l'utilisation du NOEXPAND

Les vues indexées sont supportées dans toutes les éditions de SQL Server, et celèrent depuis SQL Server 2000, version dans laquelle elles ont fait leur apparition. Ceci est valable y compris sur SQL Server Express. La particularité de l’édition Enterprise en matière de vues indexées est la manière de les supporter.

Petit rappel sur ce qu’est une vue indexée. La vue indexée a pour effet de matérialiser les données ; le résultat de la requête (contenu dans la vue) est stocké dans un index unique de type CLUSTERED (ordonné). Ce résultat est maintenu à jour en fonction des modifications effectuées sur les tables de base de la vue. À tout moment le contenu de l’index de la vue est le reflet exact du résultat de la requête.

La vue indexée est très efficace sur des requêtes utilisant beaucoup de jointures et/ou réalisant des agrégations sur les données. En contrepartie, elle est très couteuse sur les tables sources de la vue, si celles-ci sont fréquemment mise à jour. En effet la mise à jour de la vue se fait de manière synchrone. Tant que tous les index de toutes les vues indexées qui référencent la table ne sont pas à jour, la requête de modification de la table de base ne sera pas terminée.

Le très gros avantage de l'utilisation des vues indexées sous SQL Server Edition Enterprise (Et Datacenter et Developer), c'est que leur utilisation est totalement automatique. Vous n'avez rien d'autre à faire que créer la vue indexée. L'optimiseur de requêtes utilisera la vue indexée dès qu’il trouvera qu'une requête à une définition proche de celle de la vue. Ceci est très pratique si vous ne pouvez pas toucher au code des requêtes. Attention tout de même, l’optimiseur de requêtes ne considérera l’usage d’une vue indexée que si la requête est considérée comme couteuse.

Voici un exemple où la vue indexée se révèle intéressante. Cet exemple est réalisé sur la base de données AdventureWorks. 

CREATE VIEW v1
     WITH SCHEMABINDING
AS
     SELECT PRD.Name, CST.AccountNumber,
     SUM(SOD.OrderQty) AS SommeQte, COUNT_BIG(*) AS Compte
     FROM Sales.SalesOrderHeader AS SOH
         JOIN Sales.SalesOrderDetail AS SOD ON SOH.SalesOrderID = SOD.SalesOrderID
         JOIN Production.Product AS PRD ON SOD.ProductID = PRD.ProductID
         JOIN Sales.Customer AS CST ON SOD.CustomerID = CST.CustomerID AND SOH.CustomerID = CST.CustomerID
     GROUP BY PRD.Name, CST.AccountNumber
GO 

Dans l'exemple je cumule les jointures et les agrégats qui sont le domaine de prédilection des vues indexées.

Notez les éléments surlignés dans le code, ceux-ci sont obligatoires dans le cadre de la création d’une vue indexée.
Pour que cette vue devienne une vue indexée, j'ai juste à ajouter un index unique de type CLUSTERED.

CREATE UNIQUE CLUSTERED INDEX IX_v1 ON v1(Name, AccountNumber)

Les données sont maintenant matérialisées et stockées dans l’index.

Sur SQL Server édition Enterprise, vous n'avez rien de plus à faire, dès qu'une requête se rapproche suffisamment de la définition de la vue le moteur va automatiquement utiliser les données de la vue indexée.

-- Dans l'édition Entreprise la vue indexée est utilisée automatiquement
SELECT PRD.Name, CST.AccountNumber, SUM(SOD.OrderQty)
FROM Sales.SalesOrderHeader AS SOH
     JOIN Sales.SalesOrderDetail AS SOD ON SOH.SalesOrderID = SOD.SalesOrderID
     JOIN Production.Product AS PRD ON SOD.ProductID = PRD.ProductID
     JOIN Sales.Customer AS CST ON SOD.CustomerID = CST.CustomerID AND SOH.CustomerID = CST.CustomerID
GROUP BY PRD.Name, CST.AccountNumber

Par contre sur les autres éditions il faut requêter directement la vue et forcer l'utilisation de l'index par l'utilisation du Hint NOEXPAND.

-- Execute la requête de la vue
-- On remplace le nom de la vue par sa définition
-- Comme on le fait pour une vue normale
SELECT * FROM dbo.v1 

-- Renvoie les données de la vue indexée
-- Dans ce cas on demande explicitement à lire les données
-- de l'index créée précédement
SELECT * FROM dbo.v1 WITH(NOEXPAND) 

À titre de comparaison, la 1re requête qui traite environ 20 Mo de données, met 13 secondes à s'exécuter (dont 8 secondes par le CPU). La deuxième (qui utilise donc les données matérialisées) traite seulement 6 Mo de données en 4 secondes (dont 1 seconde par le CPU). Le gain est très net et il est même possible d’avoir des ratios plus importants.

Petit conseil, avant de vous lancer dans la création de vues indexées, lisez l'aide en ligne à ce sujet. Il y a en effet énormément de restrictions quant aux requêtes qu'il est possible d'utiliser dans une vue indexée.

Et tous ces tests ont été réalisés avec SQL Server Express :o)
Comme quoi ça marche bien !

Bons tests et bons développements...

Posté le par christian | 0 commentaire(s)
Classé sous : ,

SQL Server : Exécuter un fichier de script SQL dans un autre script SQL

Si vous souhaitez exécuter un fichier de script SQL depuis un autre, c'est possible avec SQLCMD. Disponible depuis SQL Server2005, il succède à OSQL, qui a lui-même succédé à ISQL.
Il n'y a rien de plus simple. Dans votre premier fichier de script, il vous suffit d'ajouter l'élément suivant pour appeler un second fichier de script. Ce second fichier s'appelle ici « second.sql » :  
:r .\second.sql
On présumera que les fichiers sont situés dans le même répertoire. Les scripts ressembleront à ce qui suit.

Le contenu du fichier premier.sql
-- Contenu de premier.sql
PRINT 'Début premier'
:r .\second.sql
PRINT 'Fin Premier'
Le contenu du fichier second.sql
-- Contenu de second.sql
PRINT 'Début Second'
-- Ce que vous voulez ici
PRINT 'Fin Second'

Pour exécuter le fichier de script « premier.sql », faites appel à SQLCMD.EXE  avec la syntaxe suivante. Ici, le serveur est local et on utilise l’authentification Windows, c’est pour cela que je n’ai pas besoin d’argument supplémentaire.

sqlcmd -i premier.sql

Vous pouvez aussi tester cette fonction dans SQL Server Management Studio en cliquant sur « SQLCMD Mode » dans la barre d'outils. Option que vous retrouvez dans le menu « requêtes ».

Attention, il y a une limite qui est tout de même assez importante, le fichier de script SQL qui est exécuté est situé sur la machine où le script exécuté par SQLCMD est appelé. Dans mon exemple, c’est la même machine, mais suivant votre situation cela risque d’être une machine radicalement différente. Je vous conseille dans ce cas de passer par des chemins réseau qui sont visibles par toutes les machines depuis lesquelles vous exécuterez les scri

Pour approfondir le sujet, un article qui détaille quelques fonctionnalités supplémentaires de SQLCMD : http://www.sqlnco.ch/2011/09/sqlcmd-et-l-utilisation-de-variables-en-parametre-pour-rendre-ses-scripts-generique/

Bon codage…


SQL Server : Comparaison des prix par édition et mode de licence pour la France

Voici un tableau de synthèse des prix de SQL Server par édition et par mode de licence. Réactualisé et pour la France, en Euro.

Pour les prix en Franc Suisse pour la Suisse, c'est ici : http://www.sqlnco.ch/2011/09/comparaison-des-prix-par-edition-et-mode-de-licence-de-sql-server-pour-la-suisse/

Version actuelle : SQL Server 2008 R2, toutes les licences offres un droit d'installation d'une version précédente. Il est donc possible d'installer SQL Server 2008 ou SQL Server 2005.

Date de mise à jour : 10.09.2011

Produit en Boite (FPP)

Les licences en boîtes ne sont soumises à aucun minimum d'achat, contrairement aux licences classiques types OPEN ou SELECT. Elles sont le plus souvent plus cher que les licences simples, mais inclues un support minimal.

Je ne ferais pas de comparatif sur ce modèle de licence, en effet la plupart du temps pour un déploiement SQL Server vous serez largement éligible à un type de licence OPEN.

Produit par Licence

Tous les prix ci-dessous s'entendent en Euro et hors TVA, sur un type de licence OPEN NL. Ce contrat de licence permet une obtention d'un droit d'usage perpétuel avec un paiement comptant. Il est disponible à l'achat à partir de 5 licences (CAL et serveur confondu). Ils s'entendent sans Software Assurance, c'est-à-dire sans droit de mise à jour gratuit. Le DVD d'installation n'est pas livré dans ce mode, il est à acheter séparément (si vous l'avez par le biais de TechNet ou MSDN, c'est tout aussi bien).

Les prix qui s'appliquent à votre situation peuvent varier. Particulièrement en fonction de votre contrat de licence, mais aussi si vous souhaitez souscrire à la Software Assurance. De même, pour le cas particulier de l'éducation, des administrations publiques et des associations qui ont des prix dédiés (et bien moins élevés que pour les entreprises).

 

Limitations

Serveur + CAL

Processeur

 

CPU

Mémoire

Autres

Par Serveur

Par CAL (Device ou User)

Par Processeur

Les éditions gratuites

Compact

N/A

N/A

Mono utilisateur

Gratuite

Express

1 CPU

1 Go

Base de données limitée à 10Go

Gratuite

Les éditions spécialisées

Workgroup

2 CPU

4 Go

 

884,57 €

5 gratuites + 179.00 €

4 540,52 €

Web

4 CPU

64 Go

Usage pour Web ou Web Service exclusivement

N/A

N/A

4 246,41 €

For Small Business

4 CPU

64 Go

Avec SBS uniquement, 75 utilisateurs max

942,99 €

160,84 €

N/A

Developer

illimités

illimitée

 

N/A

44,36 €

N/A

Azure

Tarification par stockage maximum alloué et utilisation réseau sortante

Les éditions Premiums

Standard

4 CPU

64 Go

 

1 088,59 €

198,71 €

8 700,08 €

Enterprise

8 CPU

illimitée

 

10 423,82 €

33 360,42 €

Datacenter

illimités

illimitée

Par processeur uniquement

N/A

N/A

66 721,02 €

Parallel Data Warehouse

illimités

illimitée

Par processeur uniquement. Appliance, achat de matériel et licence en commun

   

66 721,02 €

 

Quelques chiffres de plus…

Software Assurance (voir plus bas pour les avantages)

  • La Software Assurance représente 50 % des prix indiqués ci-dessus, et pour un contrat de type Open Business est valable 2 ans. Ce qui fait 25 % du prix de la licence à acquitter par an (mais les versements sont à faire tous les 2 ans).

Ratio de prix entre éditions

  • Ratio entre DataCenter et Enterprise est de 2.05
  • Ratio entre Enterprise et Standard 3.83 en mode processeur et de 9.57 en mode Serveur + CAL
  • Ratio entre Standard et WorkGroup 2.00 en mode processeur et de 1.23 en mode Serveur + CAL

Seuil de passage entre licence par processeur et serveur + CAL

  • Seuil de passage à une licence CPU pour Enterprise 115 utilisateurs par processeur.
  • Seuil de passage à une licence CPU pour Standard 38 utilisateurs par processeur.
  • Seuil de passage à une licence CPU pour Workgroup 20 utilisateurs par processeur.
    Mais gardez à l'esprit que le serveur est fourni avec 5 CAL gratuites, donc en pratique 25 puis, puis 20 pour le CPU suivant.

Notez que le mode Serveur + CAL reste intéressant si vous avez déjà des CAL existantes dans votre entreprise qui sont bien entendu valables pour tout nouveau serveur SQL Server.

Changement sur SQL Server 2008 R2.

Depuis SQL Server 2008 R2, un certain nombre de modifications a eu lieu sur le mode de licences. La virtualisation illimitée n'est plus disponible que sur l'édition Datacenter (sauf si vous avez une Software Assurance avec un serveur Enterprise SQL Server 2008 et mettez à jour), cette dernière édition est d'ailleurs celle qui dispose du nombre de processeurs illimités et de la mémoire illimitée.

L'édition Enterprise reste illimitée du côté de la mémoire, mais n'est plus illimitée en matière de nombre de processeurs ni en termes de virtualisation sauf à avoir acheté la Software Assurance avec la version précédente. L'édition standard est maintenant limitée en termes de mémoire, vous ne pourrez pas installer plus de 64 Go de mémoire sur ce type de serveur. Attention si vous comparez la limitation mémoire avec celle de Windows Serveur en édition Standard, qui elle est limitée à 32 Go.

Licence par processeur et non pas par cœurs.

Le mode de licences SQL Server permet d'acheter une licence par processeur et non pas par nombre de cœurs. C'est très important, car de nos jours nous trouvons de plus en plus de processeurs avec de 2 à 6 cours ce qui permet de limiter le nombre de licences par processeur acheter, et de limiter le coût des licences en améliorant les performances des serveurs.

Plateforme

Au niveau du type de la plate-forme (32 bits et 64 bits), les licences SQL Server sont indépendantes de cette dernière. Il est possible d'acheter une licence identique pour un serveur 32 bits ou un serveur 64 bits, le prix sera strictement le même. La dénomination des licences, par le passé, était différente (malgré le fait que la licence est identique), mais depuis SQL Server 2008 le même intitulé s'applique.

Où acheter ses licences

L'achat des licences se fait auprès d'un revendeur agréé Microsoft. Pour ce qui est des licences de type OPEN, il est possible de les acheter chez la plupart des revendeurs à condition de respecter les minima d'achat (5 licences). Pour ce qui est des licences de type SELECT, celles-ci ne peuvent s'acheter que chez des revendeurs de grand compte là aussi à condition de respecter les minima généralement 250 postes ou un minimum de licence.

CAL – Client Access Licence

C'est un droit d'accès au serveur, qui est défini par utilisateur ou par périphérique. Les coûts sont rigoureusement identiques entre les 2 types de licences cliente. Là aussi, pas de distinction entre les plates-formes pour ce type de licences

Droit pour serveur de basculement gratuit

Il n'est pas nécessaire d'acheter une licence pour serveur qui sert de basculement. Quelle que soit la technique utilisée : Clustering, Database Mirroring, Log Shipping, Replication… À condition de ne pas utiliser ce serveur de secours plus de 30 jours par ans. A noter que les fonctionnalités de Clustering et Database Mirroring sont disponibles dès l'édition Standard.

Software Assurance

L'achat de la Software Assurance avec la licence offre quelques avantages supplémentaires :

  • Droit de mise à jour
  • Heures support gratuites incluses
  • Formation (suivant les contrats)
  • Utilisation de System Center Advisor (actuellement en Beta, mais très bientôt disponible)
  • Etc.

Accès client ou processeur.

Dans le cas où SQL Server est connecté de manière directe ou indirecte à Internet, il est indispensable d'acheter des licences de type processeur. En effet, c'est le nombre d'utilisateurs qui se connectent au site Internet qui est à prendre en compte. Or dans le cas d'un usage Internet, il n'est pas possible de quantifier le nombre d'utilisateurs unique qui se connectera au serveur.

Pour tous les autres usages de SQL Server ce qui déterminera le choix entre licences processeur et licences clients et le nombre d'utilisateurs qui seront connectés au serveur. En effet au-delà d'un certain nombre d'utilisateurs le mode processeur devient intéressant, mais tout dépend du nombre de processeurs qui est disponible sur le serveur de base de données (voir plus haut après le tableau de prix).

Bon achat…

Posté le par christian | 0 commentaire(s)
Classé sous :

Azure : Déployer un site PHP sur le cloud avec Windows Azure et SQL Azure…

Depuis quelques jours je m'étais lancé dans la mise en place d'un blog sous Wordpress, mais pas sous sa plateforme classique, sous Windows Azure et SQL Azure comme moteur de base de données.

Loin d'être la migration complète de mon blog, c'est plus une manière de tester le comportement de Wordpress par rapport à Community Server et de voir si un blog hébergé est viable en termes technique et de coût (en effet même si les avantages MSDN sont très intéressants, on reste limité en termes de taille de base de données et d'instance dans le cadre de l'offre gratuite).

L'article détaillé expliquant comment installer PHP et les drivvers SQL Server sur Windows Azure est ici :
http://www.sqlnco.ch/2011/08/deployer-un-site-php-sur-windows-azure/

De plus ça permet de voir le travail accompli par la communauté et Microsoft pour faire en sorte que l'intégration de solutions PHP sur ses plateformes fonctionne le mieux possible. Ca n'est pas encore parfait, mais on s'en approche.

Les principaux points négatifs étant plutôt du fait des tiers qui développent des plugins PHP, qui ne fonctionne que avec mySQL et non pas de manière générique comme on le voudrait.

Les principaux point positifs, sont au niveau des performances, que j'avoue trouver bonne, la génération de la base de données SQL Azure c'est fait tellement vite que je me suis demandé si la page n'était pas buggé (non ce n'est pas le cas, la base de données a bien été générée).

En passant je me suis fortement inspiré du billet ci-dessous, qui malheureusement datait un peu et qui nécessitait remise à jour…

http://blogs.msdn.com/b/windows-azure-support/archive/2010/08/10/microsoft-cloud-computing-windows-azure-host-wordpress-on-windows-azure-using-sql-azure-and-windows-azure-storage-run-php-application-in-windows-azure.aspx

L'article est en 2 parties, l'installation de Wordpress viendra par la suite.

Bonne lecture...

Posté le par christian | 0 commentaire(s)

SQL Server : La fin du support de l’OLEDB annoncé ?

Un étrange article sur un des blogs des équipes de développement de Microsoft :

http://blogs.msdn.com/b/sqlnativeclient/archive/2011/08/29/microsoft-is-aligning-with-odbc-for-native-relational-data-access.aspx

et

http://social.technet.microsoft.com/Forums/en/sqldataaccess/thread/e696d0ac-f8e2-4b19-8a08-7a357d3d780f

Il semblerait que pour la partie drivers SQL Server, Denali serait la dernière version à supporter l'OLEDB.

Ce choix est surprenant à mon sens, car beaucoup d'outils reposent encore sur OLEDB sur la connectivité à SQL Server et y compris au sein de SQL Server ce n'est que très récemment que Integration Services (SSIS) supporte correctement les clients natifs .net.

D'un autre côté, la couche de connectivité sera alignée avec ce qui se fait du côté du Cloud, en effet SQL Azure ne supporte que l'ODBC et le client natif .Net SQL Server. L'OLEDB n'a jamais été supporté sur cette plateforme sans qu'il y ai beaucoup d'explications d'ailleurs à ce sujet.

Rip OLEDB…

Posté le par christian | 0 commentaire(s)
Plus de Messages Page suivante »


Les 10 derniers blogs postés

- MBA : Pourquoi faire et comment le choisir ? par Blog Technique de Romelard Fabrice le il y a 16 heures et 25 minutes

- Y'a des erreurs qui peuvent rendre le développeur violent par Aleks's Blog le 02-02-2012, 16:33

- [Hyper-V 3] Présentation des commandlets PowerShell par Blog de SPBrouillet (Pierrick BROUILLET) le 01-31-2012, 16:01

- IIS7 – Compression GZIP par Atteint de JavaScriptite Aiguë [Cyril Durand] le 01-31-2012, 15:52

- SharePoint 15 Technical Preview Managed Object Model Software Development Kit par Matthew le 01-31-2012, 12:34

- Office 15 Technical Preview - Open specification Update par Matthew le 01-31-2012, 10:14

- TFS Integration Tools – Installation par Vivien Fabing le 01-31-2012, 00:06

- Test par RonnyK le 01-30-2012, 16:56

- [SharePoint 2010] Désactiver le correcteur orthographique dans les pages d’un site de publication par Jean-Christophe Brabant le 01-30-2012, 09:30

- [SharePoint 2010] Site internet et performances : poids et nombre des ressources par Arnault Nouvel le 01-30-2012, 00:52