web-dev-qa-db-ja.com

MySQLで古いデータをアーカイブするためのベストプラクティス

MySQLデータベースを使用して、複数のサーバーからのログを保存しています。データベースの平均増加量は1日あたり50 GBです。現在、その合計サイズは1.7 TBです。

ID列とdatetime列があります。

1週間より古いデータを同じサーバー上の別のデータベースに移動したい。

これに必要な手順は何ですか?

今のところ私はこれをします:

  1. アーカイブデータベースとテーブルを作成します。
  2. Insert into ArchiveDB.table select * from old_tbl where datetime <= Archivedate
  3. 次にDELETE FROM old_tbl WHERE datetime <= Archivedate

これを次の条件で実装したい:

  • バッチ経由で挿入および削除します。
  • 古いデータベースから削除した後、スペースを再利用してください。
  • ダウンタイムなしで統計を更新します。

...または、ベストプラクティスをご存知の場合はお知らせください。

6
Bhuvanesh

InnoDBとPARTITIONsを使用すると、毎日PARTITION BY RANGE(TO_DAY(...))を設定し、「トランスポータブルテーブルスペース」を使用して1日とテーブルの関連付けを解除し、個別に移動できます。これは、INSERT...SELECTおよびDELETEを実行するために必要なクエリよりもはるかに高速です。デタッチされると、パーティション(現在は独自のテーブル)を別のデータベースまたはサーバーに移動でき、データの取り込みに影響を与えることはありません。

1つの欠点:InnoDBのディスクフットプリントは、アーカイブよりもはるかに大きいです。

どのような種類のクエリをログに適用しますか?

ブログ: partitioning および chunking longy deletes

6
Rick James

Perconaのpt-archiver (行をMySQLテーブルから別のテーブルまたはファイルにアーカイブするために使用)と Perconaのpt-online-schema-change (ニュートラルALTERを使用して「オンライン」で実行すると、innodb_file_per_table=ON)。

3
Riedsio