Les tables InnoDB sont-elles verrouillées pendant mysqldump lorsqu'elles sont mélangées avec MyISAM?

9

Je suis à la recherche d'une solution de sauvegarde pour mes serveurs mysql et j'ai besoin d'autant de temps d'arrêt que possible. J'ai les éléments suivants:

  • Serveurs MySQL
  • ils ne sont pas répliqués
  • chaque serveur représente son propre

Ce nombre peut augmenter, donc la configuration d'une réplication maître / esclave ne sera pas une bonne idée.

La méthode de sauvegarde la plus simple que je vois serait d'utiliser mysqldump avec un logiciel tel que "automysqlbackup". Mes données les plus importantes utilisent InnoDB. Mes tables InnoDB sont assez lourdes.

La question est: si je fais un mysqldump sur toutes les bases de données du serveur, est-ce que cela verrouillera mes tables Innodb?

tounano
la source

Réponses:

7

mysqldumps avec InnoDB et MyISAM ensemble sont traités comme s'excluant mutuellement. Voici pourquoi:

Si vous pouvez vous connecter à mysql pendant qu'un mysqldump est en cours, vous verrez quelque chose comme ceci:

SELECT /* SQL_NO_CACHE */ * FROM tblname

Par défaut, mysqldump fera ce qui suit:

  • Chaque base de données est sauvegardée par ordre alphabétique
  • Chaque table sauvegardée par base de données est sauvegardée par ordre alphabétique (quel que soit le moteur de stockage)

Cela devrait convenir à une instance MySQL qui n'a aucune autre activité de base de données. Les tables InnoDB et MyISAM ne s'affectent pas.

L'utilisation --single-transactioncontre une instance MySQL entièrement InnoDB crée un point de contrôle et sauvegarde toutes les tables à partir du même point dans le temps. Une fois qu'une table MyISAM est rencontrée, tous les paris sont désactivés. Cela pourrait entraîner le vidage de toutes les tables InnoDB après MyISAM à partir d'un point dans le temps différent.

Pour avoir un vidage ponctuel cohérent pour un mélange d'InnoDB et de MyISAM, vous avez là des options

OPTION 1

Redémarrez mysql pour que personne d'autre ne puisse se connecter via TCP / IP, puis mysqldump

service mysql restart --skip-networking --skip-grant-tables
mysqldump --routines --triggers --all-databases > MySQLData.sql
service mysql restart 

OPTION 2

Si toutes les tables MyISAM sont en lecture seule, juste mysqldump en utilisant --single-transaction

OPTION # 3

Si des tables MyISAM sont en cours d'écriture, --single-transaction n'est pas suffisant

Vous devrez faire ce qui suit:

mysql -u... -p... -e"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400)"
sleep 30
mysqldump --routines --triggers --all-databases > MySQLData.sql

Immédiatement après la fin de mysqldump, connectez-vous à mysql et faites show processlist;. Recherchez la requête SELECT SLEEP(86400), recherchez l'ID de processus et exécutezKILL <procidnumn>;

RolandoMySQLDBA
la source
5

mysqldump --single-transactionne verrouille pas les tables mais les tables MyISAM ne sont pas garanties d'avoir des vidages cohérents avec cette option. Il est préférable d'utiliser mydumper, mydumperverrouille les tables MyISAM et ne verrouille pas InnoDB afin que le vidage soit cohérent.

Alex
la source
Wow, merci pour ce super outil! Connaissez-vous un outil qui peut automatiser les sauvegardes quotidiennes, hebdomadaires et mensuelles avec mydumper? Quelque chose comme "automysqlbackup", juste avec mydumper? Merci.
tounano
0

mysqldump verrouille la table pendant le vidage. Utilisez des instantanés LVM ou Xtrabackup .

Wasif
la source