counter.ibd サイズの増加 - /var/lib/mysql を 90% 消費
search cancel

counter.ibd サイズの増加 - /var/lib/mysql を 90% 消費

book

Article ID: 276876

calendar_today

Updated On:

Products

CA API Gateway

Issue/Introduction

/var/lib/mysql にある counters.ibd のファイルサイズが毎日増加し 90% 消費しています。

mysql クエリを使用して、運用環境に影響を与えることなく古い日付のタイムスタンプを削除できますか?  たとえば、2020 年より前のレコードをcounters.ibdから削除できますか?

Environment

リリース : 10.x
コンポーネント : CA API Gateway

Resolution

二つのアプローチがあります。

  1. counters テーブルのパージ
  2. mysql 最適化の実行


アプローチ 1 (counters テーブルのパージ)

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 データをメモリからクリアされます。

 

アプローチ 2(mysql 最適化の実行)

すべてのレコードを削除したくない場合は、mysql 最適化の手順を実行できます。 

概略手順:

  1. counters 同様な新しいテーブルを作成します。
  2. 特定の WHERE 句のレコードを新しいカウンターに INSERT します。
  3. counters テーブルの名前を変更します。
  4. 新しく作成したテーブルの名前を counters に変更します。
  5. 名称変更した古い counters テーブルを削除します。
  6. 次に counters テーブルを analyze します。

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;

Additional Information

[英文文書] counter.ibd size huge - consuming /var/lib/mysql to 90%