J'ai trouvé un certain nombre de sites qui parlent de faire exactement cela, mais je manque quelques détails importants. Les étapes générales sont
- Courir
FLUSH TABLES WITH READ LOCK
- Prenez l'instantané ZFS
- Courir
UNLOCK TABLES
Diverses sources signalent qu'InnoDB, que j'utilise, ne respecte pas réellement a FLUSH
. Le manuel d'utilisation de MySQL note qu'il existe une FLUSH TABLES...FOR EXPORT
variante à utiliser avec InnoDB, mais qui nécessite de spécifier chaque table individuellement, plutôt que de sauvegarder l'intégralité de la base de données. Je préfère éviter de spécifier chaque table individuellement car il y a de fortes chances que la liste des tables ne soit plus synchronisée avec les tables qui existent réellement.
L'autre problème que j'ai, c'est que j'avais prévu de faire quelque chose comme ça mysql -h"$HOST" -u"$USERNAME" -p"$PASSWORD" --execute="FLUSH TABLES WITH READ LOCK"
. Toutefois, cela supprime le verrou immédiatement après la fin de la session. Cela a du sens, mais est également assez ennuyeux car je dois maintenir le verrou de lecture lorsque je prends mon instantané.
Mon autre idée est de faire une sauvegarde à chaud en utilisant un outil comme Percona XtraBackup et de prendre des instantanés de la sauvegarde, mais je préférerais ne pas payer le coût d'écrire toutes mes données vers un deuxième emplacement juste pour les instantaner.
Réponses:
Si vous utilisez uniquement InnoDB pour toutes les tables et que vous définissez
innodb_flush_log_at_trx_commit
sur:1
(le contenu du tampon de journalisation InnoDB est écrit dans le fichier journal à chaque validation de transaction et le fichier journal est vidé sur le disque) ou,2
(le contenu du tampon de journalisation InnoDB est écrit dans le fichier journal après chaque validation de transaction et le fichier journal est vidé sur le disque environ une fois par seconde),alors vous n'avez pas besoin de FLUSH TABLES avant de faire un instantané, exécutez simplement l'instantané ZFS directement. InnoDB peut récupérer les données des journaux de validation des transactions sans perte de données.
Réf: https://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit
la source
Vous avez besoin d'un verrou de base de données complet pour sauvegarder une (la plupart) base (s) de données de manière cohérente.
Le manuel https://dev.mysql.com/doc/refman/5.5/en/backup-methods.html indique que TABLES DE RINÇAGE AVEC VERROUILLAGE EN LECTURE est correct pour les instantanés ZFS en particulier.
C'est un peu ridicule qu'ils aient omis le fait que vous ayez besoin
FLUSH TABLES table_a, table_b, table_c FOR EXPORT
d' InnoDB dans ces instructions. C'est aussi stupide de devoir spécifier chaque table comme ça. Mais comme le dit l'EEAA, vous pouvez générer une liste de tables lorsque vous commencez la sauvegarde assez facilement.En ce qui concerne le maintien du verrou, vous devez garder la connexion db active pendant l'exécution de l'instantané
En général, j'utiliserais quelque chose comme Perl ou un autre langage de programmation qui peut se connecter, verrouiller la base de données et tout en maintenant la connexion db prendre l'instantané, puis déverrouiller et déconnecter. Ce n'est pas complexe. Je parierais qu'il existe déjà des outils qui le font déjà, mais en écrire un est facile.
Je dis facile, pas complexe, etc. à quelques reprises. Je suppose que vous avez une programmation de base ou de bonnes compétences en script.
la source
FLUSH TABLES WITH READ LOCK
et ensuiteFLUSH TABLES...FOR EXPORT
, alors que ma lecture du manuel MySQL dit qu'une seule devrait être nécessaire.Je l' ai arnaqué et adapté un script conceptuel simple Bash que j'ai trouvé dans un autre serveur de défaut après par Tobia . Cela devrait vous amener à environ 90% du chemin.
Ici, la
mysql
commande que vous utilisez est exécutée en arrière-plan et touche un fichier. Il attend en arrière-plan que le fichier disparaisse avant de quitter et donc de déverrouiller les tables. Pendant ce temps, le script principal attend que le fichier existe, puis crée l'instantané et supprime le fichier.Le fichier indiqué par
$mysql_locked
doit être accessible aux deux machines, ce que vous devriez pouvoir faire assez facilement car ils peuvent tous deux accéder à un ensemble de données commun (bien qu'ils puissent utiliser des chemins différents, et vous devez en tenir compte).la source
system zfs snapshot...
à l'intérieur du script principal? Ou le composant logiciel enfichable shotting ont à exécuter dans un processus distinct?SYSTEM
commande exécute les choses localement. Si j'exécute le client mysql sur la boîte FreeBSD et l'exécuteLOCK; SYSTEM zfs snapshot; UNLOCK
, cela semble fonctionner.Vous avez besoin de TABLES DE RINÇAGE AVEC VERROUILLAGE DE LECTURE pour myisam car il ne s'agit pas de journalisation.
Vous n'avez vraiment pas besoin de quoi que ce soit pour innodb, OMI, parce que c'est de la journalisation. Il sera cohérent de toute façon, restaure automatiquement le journal si quelque chose se passe à l'instant atomique où vous prenez l'instantané.
Si vous souhaitez une cohérence au niveau de l'application, votre application doit utiliser des transactions. Si votre application utilise des transactions et innodb, tout instantané sera cohérent et demandera automatiquement le chemin jusqu'au niveau de l'application.
la source
Voici ma solution pour créer un instantané ZFS tout en gardant le verrou:
la source