Comment sauvegarder une base de données mysql, mais à faible priorité?

15

Je veux sauvegarder une base de données, mais pendant la journée quand il y a une charge sur le serveur. Il est essentiel que la sauvegarde n'affecte pas apache et les autres bases de données s'exécutant sur le même serveur.

Il devrait être possible d'utiliser la commande mysqldump , mais exécutez la commande à faible priorité.

Comment puis-je faire ceci?

Mise à jour: Il semble que l' utilisation de nice avec mysqldump ne fonctionne pas car mysqldump génère un nouveau processus.

andyuk
la source
avez-vous regardé mysqlhotcopy?
@fsb comment mysqlhotcopy supporte-t-il ce que l'OP veut?
Tomas

Réponses:

8

Si vous disposez d'un serveur de rechange qui peut gérer la charge d'écriture de votre serveur, vous pouvez configurer la réplication sur ce serveur, puis effectuer une sauvegarde à partir du serveur esclave. Cela présente également l'avantage que vous pouvez arrêter la réplication pendant que vous effectuez la sauvegarde et obtenir un instantané cohérent de vos données dans toutes les bases de données ou toutes les tables d'une même base de données sans impact sur le serveur de base de données. C'est la configuration que je recommande toujours pour sauvegarder MySQL si vous avez les ressources.

En prime, vous disposez désormais d'un esclave en lecture seule que vous pouvez utiliser pour les requêtes lentes et de longue durée.

David Pashley
la source
Malheureusement, cette option semble être la plus efficace, mais je suppose que c'est la seule véritable option si je veux un impact minimal sur le serveur principal.
andyuk
2
C'est presque le seul moyen d'obtenir une sauvegarde correctement suspendue si vous ne souhaitez pas affecter les opérations. Étant donné que le ralentissement mysqldumpentraînera soit un verrouillage long soit les tables seront désynchronisées.
Dan Carley
15

Andy, maintenant je suppose que vous avez eu beaucoup de temps pour trouver une solution. J'ai récemment trouvé une solution à ce problème qui fonctionne très bien pour moi chez tsheets , et j'ai pensé que je la partagerais.

cstream est un outil de gestion de flux à usage général comme UNIX dd, généralement utilisé dans les canaux de ligne de commande. Ce qui rend cstream utile pour nous, c'est qu'il vous permet de spécifier la bande passante maximale pour toutes les entrées. Cela signifie que vous pouvez limiter l'IO disque de votre commande mysqldump avec une simple commande comme celle-ci:

mysqldump --single-transaction --quick -u <USER> -p<PASS> <Database> | cstream -t 1000000 > backup.sql

En supposant que vous sauvegardez une base de données qui utilise toutes les tables InnoDB, la commande ci-dessus est sûre (n'affectera pas les autres requêtes) et fera votre mysqldump tout en limitant ses lectures de disque à un seul mégaoctet par seconde. Ajustez la bande passante avec le paramètre -t à la valeur qui permettra à votre environnement d'effectuer la sauvegarde sans impact sur l'expérience de votre client.

Brandon
la source
Je viens de tester et je travaille comme un charme! Merci d'avoir partagé Brandon!
sucotronic
4

FWIW, vous devriez également pouvoir le faire avec pv ( http://linux.die.net/man/1/pv )

mysqldump --single-transaction --quick -u -p | pv --rate-limit 1m> destination (ou | nc ou | tar cfj backup.bz2 -)

La bonne chose à ce sujet est les différentes options de suivi des progrès et l'option -R qui vous permet de passer des options à un processus déjà en cours, par exemple; --rate-limit pour modifier le taux de transfert.

alex.pilon
la source
1

si vous utilisez innodb, vous pouvez essayer xtrabackup avec l' option --throttle .

vous pouvez également regarder ionice et exécuter mysqldump avec.

ou peut-être que vous souhaitez activer la journalisation binaire dans mysql et exécuter un vidage complet une fois par semaine / nuit, tout en copiant les journaux de bin dans un emplacement sûr toutes les 1-2 heures. et .. esclave en lecture seule à des fins de sauvegarde uniquement est également une option.

pQd
la source
0

Si vous l'exécutez sous Linux, ou une autre variante * nix, vous pouvez le faire avec ce qui suit:

nice -n ## mysqldump

Cela lui donnera une priorité de planification inférieure. Planification de la plage de priorité de -20 (priorité la plus élevée) à 19 (priorité la plus faible) la valeur par défaut pour nice est 10 si l'argument -n est omis.

Kevin K
la source
0

cron.d / mysql_dump:

17 22 * * * backup touch /home/backup/all_databases.sql && chmod 600 /home/backup \ 
/all_databases.sql && ionice -n 7 /usr/bin/mysqldump -u root -ppassword --opt --all- \
databases > /home/backup/all_databases.sql && nice -n 20 bzip2 -f \
/home/backupall_databases.sql

ionice pour la priorité d'E / S et agréable pour la priorité du processeur.

Exécutez vmstat 5, vérifiez la colonne qui indique WA. Une valeur élevée signifie que le processeur attend les E / S. Utilisez ionice, si sa charge CPU est juste, utilisez nice.

Réponse à la mise à jour:

Semble que vous avez raison. Il appelle mysql qui n'est pas nice. Je suppose que vous pouvez utiliser renice pour cela et définir la bonne valeur après son exécution.

Je n'ai pas de base de données suffisamment grande pour vider atm pour faire un script utile pour vous.

La réplication, comme le suggère votre lien, est une façon de procéder. Répliquer, arrêter et vider, sur l'hôte anthoer.

artifex
la source
0

Mettez vos données MySQL sur un LV et utilisez un travail de mylvmbackup qui prend un instantané du LV et tarit les fichiers de données MySQL. De cette façon, vous ne verrouillez pas les tables, minimisant l'impact sur vos applications à la seule charge d'E / S.

rodjek
la source
0

Vous pouvez toujours essayer de ne pas l'exécuter pendant les heures de pointe. Quelle que soit la priorité que vous utilisez, le vidage nécessitera toujours un verrou sur toutes vos tables.

Peter
la source
Ce n'est pas vrai: si les tables sont InnoDB, aucun verrou n'est placé dessus pour la lecture.
dr01