La base de données MYSQL (ibdata1) a une taille de 73 Go et est configurée pour s'exécuter en tant que serveur de base de données dédié sur Windows 2008 O / S pour les tables INNODB. Nous exécutons la sauvegarde en utilisant mysqldump mysqldump --skip-opt --quick --single-transaction --create-options --extended-insert --disable-keys --add-drop-table --complete-insert - set-charset - compress --log-error = Proddb0635.err -u root -pjohndoe Proddb> \ devNas \ devNas \ sqlbackup \ LIVE \ db \ Proddb0635.sql
Le fichier de sauvegarde Proddb0635.sql est stocké sur un serveur distinct du serveur de base de données. La RAM est de 12 Go. La taille du pool de mémoire tampon INNODB est de 6 Go. Mem.pool supplémentaire est de 32 Mo. La taille du cache de requête est de 2 Go. La longueur du tampon net est de 16 M max. taille du paquet 1 Go.
la version de mysql est 5.0.67.
Lorsque la sauvegarde n'est pas en cours d'exécution, les utilisateurs sont satisfaits des performances.
Lorsque la sauvegarde est en cours d'exécution, le taux de succès du pool de mémoire tampon INNODB est proche de 100%. Il n'y a aucune lecture ou écriture en attente. innodb wait free is 0. L'utilisation du processeur n'est pas élevée min 9% à max 15% Le taux de succès du cache de requête est faible d'environ 40% avec ou sans mysqlbackup en cours d'exécution. Actuellement, le Gestionnaire des tâches de Windows affiche que 10 Go de RAM sont utilisés. Dois-je augmenter le cache de requête avec seulement 2 Go de RAM disponibles? mysqlld-nt prend 9,2 Go de RAM et mysqldump prend 5 Mo de RAM. Alos, a noté que la taille du fichier de vidage est la même en présence ou en l'absence de l'option --compress.
Dois-je diminuer la taille du pool de tampons iNNODB?
Merci
Voici quelques réflexions que j'ai sur l'amélioration des performances de mysqldump, compte tenu de votre situation. Voici votre commande:
La première chose que je remarque est que vous redirigez la sortie vers un système de fichiers. Il indique «devNas», donc je vais supposer qu'il s'agit d'un stockage en réseau . Je suis un fan du NAS pour les sauvegardes, mais il doit être connecté sur une carte réseau physique distincte du trafic de production . Vous ne saturez peut-être pas la bande passante, mais ils rivalisent toujours. Cela va être plus problématique en raison de l'indicateur --quick, car il vide toutes les lignes au lieu de les conserver en mémoire.
La prochaine chose que je vois est que vous avez invoqué --compress. Il semble que vous exécutiez mysql localement puisque vous n'avez pas utilisé le commutateur -h. Cela peut utiliser un processeur local inutile dans ce contexte. --Compress est-il nécessaire? Il compresse uniquement les données entre le client mysqldump et le serveur mysql, pas le contenu du fichier.
Ensuite, je vois que vous utilisez l'indicateur --single-transaction. Cela va entraîner un processeur supplémentaire car il teste chaque sélection dans le cadre de mysqldump.
Cela n'a rien à voir avec les performances, mais vous utilisez --disable-keys qui ne fonctionne que sur MyISAM ( manuel ).
Vous voudrez peut-être essayer d'exécuter mysqldump à distance à partir d'un hôte hors ligne et de déplacer le fichier de vidage vers le NAS après la fin pour supprimer le plus possible cette opération de la bande.
la source
OBSERVATION # 1
Voici quelque chose à garder à l'esprit lors de l'exécution d'un mysqldump contre InnoDB.
Les pages sales présentes dans le pool de tampons InnoDB doivent d'abord être vidées sur le disque. Un mysqldump déclenchera le vidage d'une table InnoDB qui contient encore des pages sales.
Il y a une option de serveur appelé innodb_max_dirty_pages_pct . La valeur par défaut est 75 est MySQL 5.5 et 90 dans les versions de MySQL antérieures à 5.5. Dans un environnement de production, il est OK de laisser ce nombre à la valeur par défaut.
Pour voir si vous avez beaucoup de pages sales dans le pool de tampons InnoDB, exécutez ceci:
BTW une page est 16K comme le montrent de ceci:
En ce qui concerne InnoDB et mysqldump, vous pouvez réduire ce nombre dans deux circonstances.
CIRCONSTANCE 1: Réglez-le en permanence sur 0
Ajoutez simplement ceci à my.ini:
Cela gardera le pool de tampons InnoDB maigre et méchant. L'étape de vidage de la table InnoDB qui est en cours de vidage sera rapide car quelques pages sales que possible (peut-être 0) devront être vidées avant que mysqldump ne fonctionne dessus.
Le seul inconvénient est que si vous mysqldump à partir d'une base de données à fort trafic, il peut y avoir une augmentation plus faible des E / S d'écriture en raison du vidage plus fréquent des pages sales. Vous pouvez déterminer si c'est le cas sans redémarrer mysql en exécutant ceci:
Laissez le paramètre pendant 12 à 24 heures, si les performances d'écriture sont acceptables, vous êtes prêt à partir. Sinon, réglez-le avec:
CIRCONSTANCE 2: Réglez-le à 0 environ 1 heure avant mysqldump
Exécutez le mysqldump
OBSERVATION # 2
Vous avez --complete-insert comme option mysqldump. Cela incorporera les noms de colonne à chaque statament INSERT avant la clause VALUES. Même avec --extended-insert, sur chaque lot de lignes insérées, les noms de colonnes sont envoyés dans mysqldump. Vous pouvez réduire la quantité d'octets envoyés à mysqldump en supprimant --complete-insert.
RECOMMANDATION
Si vous avez un autre serveur Windows qui peut être configuré en tant qu'esclave, faites les mysqldumps depuis cet esclave plutôt que depuis la machine de production.
la source