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-transaction
contre 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>;