/var/lib/mysql にある counters.ibd のファイルサイズが毎日増加し 90% 消費しています。
mysql クエリを使用して、運用環境に影響を与えることなく古い日付のタイムスタンプを削除できますか? たとえば、2020 年より前のレコードをcounters.ibdから削除できますか?
リリース : 10.x
コンポーネント : CA API Gateway
二つのアプローチがあります。
counters.idb mysql ファイルには、counters テーブルのデータが保持されます。データ/情報は、Apply Throughput Quota アサーションによって設定されます。定義されているキュー制限ごとに新しい行があります (Authenticated User, Client IP, SOAP operation, SOAP namespace, Gateway cluster, Custom) 。
ssg.counters テーブルから行を削除するメカニズムはありませんので、テーブル をパージします。
mysql 8.0 での counters テーブル をパージする手順:
SET FOREIGN_KEY_CHECKS = 0;
truncate table ssg.counters;
SET FOREIGN_KEY_CHECKS = 1;
analyze table ssg.counters;
注意: mysql がマルチモードの場合、パージは両方のノードで実行する必要があります。または、マスター DB パージ後に、マスター/スレーブ間のレプリケーションを再初期化して、マスター DB をスレーブにクローン作成します。
レプリケーションKB: API Gateway: マルチノードクラスターでのレプリケーション再初期化
重要: パージ後、各Gatewayを再起動します。これによりパージされた Apply Throughput Quota データをメモリからクリアされます。
すべてのレコードを削除したくない場合は、mysql 最適化の手順を実行できます。
概略手順:
MySQL コマンド:
手順 1 & 2:
mysql> use ssg;
mysql> CREATE TABLE newcounters LIKE counters;
mysql> INSERT INTO newcounters SELECT * FROM counters WHERE last_update / 1000 > UNIX_TIMESTAMP(NOW() - INTERVAL 15 DAY);
重要: 運用時間帯を避けるためにバックグラウンドで実行する必要があります(行数に応じて、これには 1 ~ 2 時間かかる可能性があることに注意してください)。
# mysql -e "INSERT INTO ssg.newcounters SELECT * FROM ssg.counters WHERE last_update / 1000 > UNIX_TIMESTAMP(NOW() - INTERVAL 20 DAY)" &
補足:
当サポートでは 1,800 万行のテストを実施しました。
・開始: 07:16
root 8702 7333 0 07:16 pts/1 00:00:00 mysql -e INSERT INTO ssg.newcounters SELECT * FROM ssg.counters WHERE last_update / 1000 > UNIX_TIMESTAMP(NOW() - INTERVAL 20 DAY)
・終了: 08:29 (所要時間: 1時間13分 )
手順 3~6:
mysql> RENAME TABLE counters TO countersbackup;
mysql> RENAME TABLE newcounters TO counters;
mysql> DROP TABLE countersbackup;
mysql> analyze table counters;