web-dev-qa-db-ja.com

ライブMySQLデータベースをアーカイブするための最良の方法

99%INSERT、毎秒約100のライブMySQLデータベースがあります。メインのライブデータベースに影響を与えることなくデータに対してクエリを実行できるように、データを毎日アーカイブしたいと考えています。さらに、アーカイブが完了したら、ライブデータベースをクリアします。

(可能であれば)INSERTをロックせずにこれを行うための最良の方法は何ですか?クエリにはINSERTDELAYEDを使用します。

26
DavidM

http://www.maatkit.org/ mk-archiver

テーブルから別のテーブルやファイルに行をアーカイブまたはパージします。重要なオンライントランザクション処理(OLTP)クエリに干渉することなく、非常に小さなチャンクでデータを効率的に「ニブル」するように設計されています。これは、クエリ間でテーブル内の位置を維持する非バックトラッキングクエリプランで実現されるため、後続の各クエリは、より多くのアーカイブ可能な行を見つけるための作業をほとんど行いません。

もう1つの方法は、毎日新しいデータベーステーブルを作成することです。 MyIsamには、これにいくつかの利点があります。これは、テーブルの最後へのINSERTは通常、ブロックされないためです。また、すべてを元に戻すためのマージテーブルタイプがあります。多くのWebサイトは、httpdトラフィックをそのようなテーブルに記録します。

Mysql 5.1には、ほとんど同じことができるパーティションテーブルもあります。

15
Alister Bulman

私はmysqlパーティションテーブルを使用しており、あらゆる面で素晴らしい結果を達成しています。

2
Eduardo Xavier

レプリケーションがこれに最適なソリューションのように聞こえます。最初の同期後、スレーブは Binary Log を介して更新を取得するため、マスターDBにはまったく影響しません。

レプリケーションの詳細

2
Jacob

MySQLレプリケーションはこれに対して完全に機能します。
マスター->ライブサーバー。
スレーブ->同じネットワーク上の別のサーバー。

1
Seun Osewa

MK-ARCHIVERは、MYSQLデータをアーカイブするための洗練されたツールです。

http://www.maatkit.org/doc/mk-archiver.html

1
Vinayak Saokar

ミラーリングされた2つのデータベースを維持できますか? 1つに書き込み、2つ目をアーカイブとして保持します。たとえば、24時間ごとに切り替えます(または適切と思われる時間)。アーカイブであったデータベースに、今日のすべてのアクティビティを挿入します。次に、2つのデータベースが一致する必要があります。これを新しいライブデータベースとして使用します。アーカイブされたデータベースを取得し、必要な処理を実行します。アクティブに書き込まれていないので、必要なものをすべてバックアップ/抽出/読み取ることができます。

これは、バックアップのために1つのドライブをオフラインにし、再同期してから、バックアップのためにもう1つのドライブを取り出すことができるミラーレイドのようなものです。

0
Doug T.