mysqldumps con InnoDB e MyISAM insieme sono considerati reciprocamente esclusivi. Ecco perché:
Se riesci ad accedere a mysql mentre è in corso un mysqldump, vedrai qualcosa del genere:
SELECT /* SQL_NO_CACHE */ * FROM tblname
Per impostazione predefinita, mysqldump eseguirà le seguenti operazioni:
- Ogni database viene scaricato in ordine alfabetico
- Ogni tabella scaricata per database viene scaricata in ordine alfabetico (indipendentemente dal motore di archiviazione)
Questo dovrebbe andare bene per un'istanza MySQL che non ha altre attività di database. Le tabelle InnoDB e le tabelle MyISAM non si influenzano a vicenda.
L'uso --single-transaction
contro un'istanza MySQL all-InnoDB crea un checkpoint e scarica tutte le tabelle dallo stesso punto temporale. Quando viene rilevata una tabella MyISAM, tutte le scommesse vengono disattivate. Potrebbe causare il dump di tutte le tabelle InnoDB dopo MyISAM da un punto temporale diverso.
Per disporre di un dump temporizzato coerente per una combinazione di InnoDB e MyISAM, sono disponibili opzioni
OPZIONE 1
Riavvia mysql in modo che nessun altro possa accedere tramite TCP / IP e quindi mysqldump
service mysql restart --skip-networking --skip-grant-tables
mysqldump --routines --triggers --all-databases > MySQLData.sql
service mysql restart
OPZIONE 2
Se tutte le tabelle MyISAM sono di sola lettura, basta usare mysqldump usando --single-transazione
OPZIONE # 3
Se vengono scritte delle tabelle MyISAM, la transazione singola non è sufficiente
Dovrai fare quanto segue:
mysql -u... -p... -e"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400)"
sleep 30
mysqldump --routines --triggers --all-databases > MySQLData.sql
Immediatamente dopo aver completato mysqldump, accedi a mysql ed esegui show processlist;
. Cerca la query SELECT SLEEP(86400)
, trova l'ID processo ed eseguiKILL <procidnumn>;