InnoDB の場合、レプリケーションを使用しない最適なソリューションは次のようになります。
mysqldump mydbname --result-file=mydbname.sql --verbose --single-transaction
これは InnoDB のトランザクション スナップショット機能を使用し、通常の (書き込み!) データベース操作をまったく中断することなく許可します。スナップショットのバイナリ ログの位置を自動的に記録すること--master-data=1
もできます。ただし、同じサーバー上の複数のデータベースで個別にこれを行う場合、バイナリ ログの位置はほとんど価値がないようです。
欠点は、いくつかの MyISAM テーブルがある場合、これが適切に機能しないことです。私自身、パーティション化されていない MyISAM テーブルを必要とする MySQL のフルテキスト インデックスを利用しています。ただし、必要に応じて MyISAM テーブルを最初から再構築できるように、MyISAM テーブルが、InnoDB テーブルに既に存在するテキストをダンプするセカンダリ データ セットにすぎないように調整することもできます。データベースのテーブルの種類をチェックし、1 つの DB 内に InnoDB テーブルしかない場合--single-transaction
の代わりに使用するスクリプトがあります。--lock-tables
別の解決策は、LVM などのディスクまたはファイルシステムのスナップショット機能を使用することです。しかし、スナップショットが存在する間に書き込みを行うと、LVM の非常に馬鹿げた書き込み時のバックアップ メカニズム (これは COW であると誤って主張されていますが、これは常識ではありません) のため、パフォーマンスが大幅に低下します。したがって、かなり良い解決策は、Solaris ZFS または FreeBSD UFS 上の MySQL のようです。効率的なスナップショットをサポートし、古いため比較的安定しています。Btrfs にも効率的なスナップショットがありますが、まだベータ版です。