MySQLの大きなテーブルの一括削除


9

通知テーブルには、Amazon IODSに1000 IOPSのホストである約1億行が含まれており、1か月より古い行を削除したいと思います。

実行するとDELETE FROM NOTIFICATION WHERE CreatedAt < DATE_SUB(CURDATE(), INTERVAL 30 day);、すべてのIOPSが取得され、プロセスに数時間かかり、「ロック待機タイムアウトが超過しました。トランザクションを再起動してください」という理由で、多くの新しいエントリを挿入できません。

ここで説明する方法を実行しようとしました:http : //mysql.rjweb.org/doc.php/deletebig ただし、増分IDの代わりにUUIDを使用しています。

挿入/更新される新しいデータに影響を与えずにそれらの行を削除するための正しい効率的な方法は何ですか?


あなたは正しいypercubeです、私はそれを修正しました。指摘してくれてありがとう!
Tianyi Cong

小さなチャンク内のレコードを削除、挿入操作には影響しません、私はループでそれを試みたが、それは時間未満で7000万レコードを削除終了rathishkumar.in/2017/12/...
Rathish

回答:


11

一時テーブルを作成し、切り替えて、過去30日間のデータをコピーします。

#
# Make empty temp table
#
CREATE TABLE NOTIFICATION_NEW LIKE NOTIFICATION;
#
# Switch in new empty temp table
#
RENAME TABLE NOTIFICATION TO NOTIFICATION_OLD,NOTIFICATION_NEW TO NOTIFICATION;
#
# Retrieve last 30 days data 
#
INSERT INTO NOTIFICATION SELECT * FROM NOTIFICATION_OLD
WHERE CreatedAt >= DATE_SUB(CURDATE(), INTERVAL 30 DAY);

営業時間外に、古いテーブルをドロップしてください

DROP TABLE NOTIFICATION_OLD;

このようなDELETEを実行する利点は次のとおりです

  1. NOTIFICATION 空のテーブルに切り替えることにより、空に速く空にされます。
  2. NOTIFICATION 新しいINSERTですぐに利用可能
  3. 残りの30日はNOTIFICATION、新しいINSERTを実行できる間に追加されます。
  4. 古いバージョンのをNOTIFICATION削除しても、新しいINSERTは妨害されません
  5. 注:以前にテーブルDELETEのベイトアンドスイッチを実行することをお勧めしました:(2012年7月19日の投稿:MySQL MEMORYテーブルでのDELETEクエリの最適化を参照)

試してみる !!!


返信ありがとうRolando!MySqlはドロップテーブルを内部でどのように処理しますか?最初にすべての列を削除してから、テーブルなどを削除しますか?それらのクロームを削除するよりもはるかに短い時間がかかりますか?
Tianyi Cong

ステージングにこの戦略を適用していますが、renameコマンドは「RENAME TABLE」で始める必要がありますか?
Tianyi Cong

ロック待機のタイムアウトを念頭に置いてトランザクションブロック内で使用すると、何か違いがありますか?また、実際のテーブルが実際に巨大になり、名前を変更して削除する必要がある場合は、
デメリット

1
その場合、@ MuhammadOmerAslamの場合、ibdata1ファイル(システムテーブルスペース)は、元に戻すログで大きくなるだけです。これは特に、ibdata1がファイルサイズが大きくなり始める場合に当てはまります(私の古い投稿dba.stackexchange.com/questions/40730/…を参照)。akuzminskyの回答に記載されているように、pt-archiverを使用してさらに注意を払う必要があります。チャンク内の行を削除し、pt-online-schema-changeを使用して実行ALTER TABLE ENGINE=InnoDB してテーブルを縮小することができます。
RolandoMySQLDBA

1
@MuhammadOmerAslam上記のアプローチは、ダウンタイムを予定している場合に最適です。akuzminskyの回答のリンクをたどる(percona.com/doc/percona-toolkit/LATEST/pt-archiver.html)。pt-archiverを使用すると、データをアーカイブしたり、アーカイブせずにデータを削除したりできます。
RolandoMySQLDBA

3

私のお気に入りは、Percona Toolkitのpt- archiverです。MySQLの負荷、レプリケーションラグを処理します。


返信ありがとうakuzminsky!私はそれを徹底的に調べます。私はこの通知テーブルをpt-online-schema-changeで変更したいときにPerconaを試してみました。ただし、変更を行うにはSUPER特権が必要でしたが、これはRDSでは提供されていません。ところであなたは巨大なテーブルを変更するための良い方法を知っていますか?
Tianyi Cong

@TianyiCong新しい質問があります。新しい質問として質問し、リンクを使用してここにコメントしてください。このサイトの動作とは異なるコメントで質問しないでください。
ジャックはtopanswers.xyzを2014年

-2

CreatedAt <DATE_SUB(CURDATE()、INTERVAL 30 day)である通知*からselect * fromとしてテーブルnotification_tempを作成します。

ドロップテーブル通知。

RENAME notification_temp TO NOTIFICATION;


そして、これは挿入/更新される新しいデータには影響しませんか?私はそうは思いません。
Colin 't Hart

この方法には2つの問題があります。1)DROP TABLEの期間中はNOTIFICATIONを使用できません。2)中に発生するINSERT CREATE TABLEは失われます。
RolandoMySQLDBA 2014年

別の問題:それは言うべきですRENAME TABLE notification_temp ...
RolandoMySQLDBA '20
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.