Je recherche pratique des conseils pour définir les valeurs des BUFFERCOUNT
, BLOCKSIZE
et MAXTRANSFERSIZE
des BACKUP
commander. J'ai fait un peu de recherche (voir ci-dessous), j'ai fait un peu de test, et je suis pleinement conscient que toute réponse vraiment valable commencera par "Eh bien, cela dépend ...". Mes préoccupations concernant les tests que j'ai effectués et les tests indiqués dans l'une des ressources que j'ai trouvées (voir ci-dessous) sont que les tests sont effectués dans le vide, très probablement sur un système sans autre charge.
Je suis curieux de connaître les bonnes orientations/meilleures pratiques concernant ces trois options basées sur une expérience à long terme: de nombreux points de données sur des semaines ou des mois. Et je ne recherche pas de valeurs spécifiques car c'est principalement une fonction du matériel disponible, mais je voudrais savoir:
BUFFERCOUNT
* MAXTRANSFERSIZE
) ne dépasse pas la RAM disponible? Contention d'E/S possible?Ce que j'ai rassemblé jusqu'à présent:
BLOCKSIZE
:
Si vous définissez manuellement, la valeur doit être> = la taille de bloc utilisée pour créer le (s) fichier (s) de données, sinon vous obtiendrez l'erreur suivante:
Msg 3272, niveau 16, état 0, ligne 3
Le périphérique 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Backup\BackupTest.bak' a une taille de secteur matériel de 4096, mais le paramètre de taille de bloc spécifie une valeur de remplacement incompatible de 512 Relancez l'instruction à l'aide d'une taille de bloc compatible.
BUFFERCOUNT
:
Défaut [2], [8]:
SQL Server 2005 et versions ultérieures:
(NumberofBackupDevices * [mystery_multiplier]) + NumberofBackupDevices + (2 * NumberofVolumesInvolved)
[mystery_multiplier]: Il existe une certaine incohérence concernant cette valeur. Je l'ai vu s'exprimer sous 3 formes:
3
[2]GetSuggestedIoDepth
[8]GetSuggestedIoDepth + 1
[8]
Le test qui montre que le multiplicateur doit être 3
A été effectué sur SQL Server 2005 SP2 [9].
Mes tests sur SQL Server 2008 R2 et 2012, et un commentaire utilisateur concernant SQL Server 2014 [8], indiquez que le multiplicateur est 4
. Signification, étant donné la valeur indiquée pour GetSuggestedIoDepth
(directement ci-dessous), soit:
GetSuggestedIoDepth
est maintenant 4
, ouGetSuggestedIoDepth + 1
GetSuggestedIoDepth
renvoie 3
pour les périphériques DISK [9]BUFFERCOUNT
* MAXTRANSFERSIZE
), il semblerait qu'une valeur max pratique soit: BUFFERCOUNT <= (available_memory / MAXTRANSFERSIZE)
MAXTRANSFERSIZE
: 3213
Affiche les paramètres de configuration de sauvegarde/restauration lors des opérations de sauvegarde/restauration, et 3605
Exporte la sortie vers le [~ # ~] journal des erreurs [~ # ~] fichier: DBCC TRACEON (3213, 3605, -1);
DISK = N'NUL:'
(Équivalent DOS/Windows de /dev/null
Sous UNIX) pour tester plus facilement certaines mesures (mais vous n'aurez pas une bonne idée du temps total du processus car il ignore l'écriture que je/O)Ressources
J'ai testé avec:
--DBCC TRACEON (3213, 3605, -1);
BACKUP DATABASE [Test] TO
DISK = 'NUL:'
--,DISK = 'NUL:'
-- DISK = 'BackupTest1.bak'
-- ,DISK = 'BackupTest2.bak'
WITH
STATS = 5,
FORMAT,
CHECKSUM,
NO_COMPRESSION,
COPY_ONLY
--,BUFFERCOUNT = 40
--,MAXTRANSFERSIZE = 4194304--2097152,
--,BLOCKSIZE = 16384
--DBCC TRACEOFF (3213, 3605, -1);
[~ # ~] mise à jour [~ # ~]
Il semble que j'oublie parfois d'ajouter certaines informations que je demande toujours aux autres lorsque je réponds à une question ;-). J'ai donné quelques informations ci-dessus concernant ma situation actuelle, mais je peux fournir plus de détails:
Je travaille pour un client qui fournit une application 24/7/365,25 SaaS. Il est donc possible que les utilisateurs soient activés à tout moment, mais en réalité, les utilisateurs sont tous basés aux États-Unis ( pour l'instant) et ont tendance à travailler principalement des heures "standard": 7 h du Pacifique (soit 10 h 00 de l'Est) à 7 PM Pacifique (c.-à-d. 10 PM de l'Est) , mais 7 jours sur 7, pas seulement du lundi au vendredi, bien que la charge du week-end soit un peu plus légère.
Ils sont configurés de telle sorte que chaque client possède sa propre base de données. C'est une industrie de niche, il n'y a donc pas des dizaines de milliers (ou plus) de clients potentiels. Le nombre de bases de données client varie selon l'instance, la plus grande instance contenant 206 clients. La plus grande DB est d'env. 8 Go, mais seulement environ 30 bases de données dépassent 1 Go. Par conséquent, je n'essaie pas spécifiquement de maximiser les performances d'un VLDB.
Quand j'ai commencé avec ce client, leurs sauvegardes étaient toujours PLEINES, une fois par jour, et aucune sauvegarde LOG. Ils avaient également défini MAXTRANSFERSIZE sur 4 Mo et BUFFERCOUNT sur 50. J'ai remplacé cette configuration par une version légèrement personnalisée du script de sauvegarde de la base de données Ola Hallengren . La partie légèrement personnalisée est qu'elle est exécutée à partir d'un outil multithread (que j'ai écrit et que j'espère commencer à vendre bientôt) qui découvre dynamiquement les bases de données lors de sa connexion à chaque instance et permet la limitation par instance (par conséquent, j'exécute actuellement le trois instances simultanément, mais les bases de données pour chaque instance séquentiellement, car je n'étais pas sûr des ramifications de leur exécution simultanée).
La configuration consiste maintenant à effectuer une sauvegarde COMPLÈTE un jour par semaine et des sauvegardes DIFF les autres jours; Les sauvegardes LOG sont effectuées toutes les 10 minutes. J'utilise les valeurs par défaut pour les 3 options que je recherche ici. Mais, sachant comment ils avaient été définis, je voulais m'assurer que je n'annulais pas une optimisation (simplement parce qu'il y avait des défauts majeurs dans l'ancien système ne veut pas dire que tout était faux ). Actuellement, pour les 206 bases de données, il faut environ 62 minutes pour les sauvegardes COMPLÈTES (une fois par semaine) et entre 7 et 20 minutes pour les sauvegardes DIFF les jours restants (7 le premier jour après la PLEINE et 20 le dernier jour avant le prochain COMPLET). Et cela les exécute séquentiellement (un seul thread). Le processus de sauvegarde LOG, au total (toutes les bases de données sur les 3 instances), prend de 50 à 90 secondes à chaque fois (encore une fois, toutes les 10 minutes).
Je me rends compte que je peux exécuter plusieurs fichiers par base de données, mais a) je ne sais pas à quel point cela sera amélioré grâce au multithreading et à la taille petite à moyenne des bases de données, et b) je ne veux pas compliquer le processus de restauration ( il existe plusieurs raisons pour lesquelles il est préférable de traiter un seul fichier).
Je me rends également compte que je pouvais activer la compression (ma requête de test l'a intentionnellement désactivée), et je l'avais recommandé à l'équipe, mais il a été porté à mon attention que la compression intégrée est un peu excitante. Une partie de l'ancien processus consistait à compresser chaque fichier en un fichier RAR, et j'ai fait mes propres tests et j'ai constaté que oui, la version RAR est au moins 50% plus petite que la version compressée en mode natif. J'ai essayé d'utiliser la compression native d'abord pour accélérer les choses, puis RAR les fichiers, mais ces fichiers, bien que plus petits que ceux compressés nativement, étaient toujours un peu plus grands que la version compressée RAR uniquement, et par suffisamment de différence pour justifier n'utilise pas la compression native. Le processus de compression des sauvegardes est asynchrone et s'exécute toutes les X minutes. S'il trouve un fichier .bak
Ou .trn
, Il le compresse. De cette façon, le processus de sauvegarde n'est pas ralenti par le temps nécessaire pour compresser chaque fichier.
Vous avez abordé une cargaison d'articles dans votre question. Merci d'être si complet!
Juste deux ou trois choses que je remarque de loin:
- Comment divers facteurs matériels/de charge influencent ce qui doit être fait.
Exécutez-vous une instance 24x7? Quelle est la charge 24h/24? Je remarque que la compression de sauvegarde est désactivée; est-ce par conception pour le test, ou est-il souhaitable pour une raison quelconque de le désactiver lorsque vous le mettez en production? Si vous avez des tonnes de marge de sécurité matérielle (CPU/RAM), et que terminer la sauvegarde dans les plus brefs délais est d'une importance capitale, alors vous voudrez régler ces paramètres pour le matériel particulier que vous avez avec cet objectif en tête. Si vous voulez vous assurer que les charges de travail OLTP sont entretenues 24 heures sur 24 et que vous ne voulez pas que la sauvegarde ait un impact, vous devrez probablement régler ces paramètres dans l'autre sens. Vous n'avez pas identifié vos objectifs de conception puisque vous demandez des conseils généraux cependant, comme vous le dites si sagement "ça dépend ™".
- Existe-t-il des circonstances dans lesquelles aucune de ces valeurs ne doit être remplacée?
Vous voudriez conserver les paramètres par défaut si vous étiez préoccupé par la prise en charge sur la route après que vous ne mainteniez plus l'instance et que vous ne soyez pas sûr des capacités de votre remplaçant. Vous voudrez probablement laisser les valeurs par défaut en place, sauf si vous avez un besoin spécifique de les régler. Laissez les chiens endormis mentir, comme on dit.
- Y a-t-il des écueils pour passer outre à ceux qui ne sont pas immédiatement évidents? Vous utilisez trop de mémoire et/ou d'E/S disque? Vous compliquez les opérations de restauration?
Comme l'indiquent clairement les documents auxquels vous faites référence, une augmentation excessive de ces paramètres peut certainement avoir des impacts négatifs sur la disponibilité. Comme pour tout ce qui est basé sur la production, vous devez le tester soigneusement avant de le déployer et laisser les paramètres seuls, sauf si cela est absolument nécessaire.
- Si j'ai un serveur avec plusieurs instances de SQL Server en cours d'exécution (une instance par défaut et deux instances nommées), et si j'exécute simultanément les sauvegardes des 3 instances, cela affecte-t-il la façon dont je définit ces valeurs au-delà de m'assurer que le collectif (BUFFERCOUNT * MAXTRANSFERSIZE) ne dépasse pas la RAM disponible? Contention d'E/S possible?
Vous voudrez vous assurer de laisser beaucoup de RAM pour des circonstances imprévues. Je serais certainement préoccupé par l'utilisation de plus de 60% ou 70% du bélier disponible pour les opérations de sauvegarde sauf si je savais avec 100% de certitude que rien d'autre ne se produirait pendant la fenêtre de sauvegarde.
J'ai écrit un article de blog avec du code qui montre comment je fais des tests de performances de sauvegarde, sur SQLServerScience.com
ce n'est peut-être pas la meilleure réponse que j'aie jamais écrite, mais comme le disait The Great One ™, "vous manquez 100% des photos que vous ne prenez pas"