InnoDBとMyISAMを組み合わせたmysqldumpは、相互に排他的なものとして扱われます。理由は次のとおりです。
mysqldumpの進行中にmysqlにログインできる場合は、次のように表示されます。
SELECT /* SQL_NO_CACHE */ * FROM tblname
デフォルトでは、mysqldumpは次のことを行います。
- すべてのデータベースはアルファベット順にダンプされます
- データベースごとにダンプされるすべてのテーブルは、アルファベット順にダンプされます(ストレージエンジンに関係なく)。
これは、他のデータベースアクティビティがないMySQLインスタンスには問題ありません。InnoDBテーブルとMyISAMテーブルは互いに影響しません。
--single-transaction
すべてInnoDB MySQLインスタンスに対して使用すると、チェックポイントが作成され、同じ時点からすべてのテーブルがダンプされます。MyISAMテーブルが見つかると、すべてのベットがオフになります。MyISAM後のすべてのInnoDBテーブルが異なる時点からダンプされる可能性があります。
InnoDBとMyISAMの混合に対して一貫したポイントインタイムダンプを取得するには、オプションがあります
オプション1
mysqlを再起動して、他の誰もTCP / IPを介してログインできないようにし、次にmysqldumpを実行します。
service mysql restart --skip-networking --skip-grant-tables
mysqldump --routines --triggers --all-databases > MySQLData.sql
service mysql restart
オプション#2
すべてのMyISAMテーブルが読み取り専用の場合は、mysqldumpで--single-transactionを使用します
オプション#3
MyISAMテーブルが書き込まれている場合、-single-transactionでは不十分です
次のことを行う必要があります。
mysql -u... -p... -e"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400)"
sleep 30
mysqldump --routines --triggers --all-databases > MySQLData.sql
mysqldumpが完了したらすぐに、mysqlにログインして実行しますshow processlist;
。クエリSELECT SLEEP(86400)
を探し、プロセスIDを見つけて実行しますKILL <procidnumn>;