ページを選択

TestRail インスタンスからの重複データの削除

長期間にわたって TestRail Server を実行していると、データベースに重複するテスト ケースおよび/またはテストが蓄積されることがあります。テストおよびテスト ケースの重複は、以前のバージョンの TestRail の非効率的なコードが原因です。これは TestRail 5.5 で最適化されました。 

テスト ランの作成時およびクローズ時に選択されなかったテスト ケースに対して重複する行が作成されていました。アプリケーションは正常に動作していましたが、時間が経つにつれて重複データが蓄積し、最終的には、ケースおよびテスト テーブルのサイズによってパフォーマンスの低下が生じる場合があります。結果として、動作の遅延やロックのタイムアウトが発生する可能性があります。

データベースの存続期間やアクティビティによっては、90 % 以上の行が重複する場合もあります。

問題を解決するため、TestRail データベースの重複行を特定し、削除するスクリプトを使用しています。多くの要望を受けて、TestRail のパフォーマンスを改善するためにこのスクリプトを利用したいという Server 版の顧客がスクリプトを利用できるようにしました。

MySQL Innodb は行の一括削除に向いていないため、スクリプトはより高速な「コピー、削除、名前変更」というやり方を使用しています (顧客のデータベースでは、処理が何日も短くなる例もありました)。スクリプトは新しいバージョンのテーブルを作成し、有効な行を挿入します。また、重複行のテーブルも作成されます。スクリプトは効率的にテーブルを適切なテーブルと不適切なテーブルに分割します。テーブルを作成したら、古いテーブルを削除して適切なデータを持つテーブルが新しいバージョンのテーブルになるよう名前を変更します。 

結果のテーブルは、「念のため」にデータベースに残されます。十分な期間が経過して、問題がないことが確認できたら、テーブルを削除できます。この処理は、古いクローズされたテスト ランの削除も含めて、大幅にパフォーマンスを改善する可能性があります。

スクリプトはこちらから取得できます。ZIP には以下の2ファイルが含まれます。 

    • mr_newtest.php
    • mr_newcase.php

次のコマンドを使用してスクリプトを実行します。テーブルがロックされるため、業務時間外にスクリプトを実行することを推奨します。なお、スクリプトを実行する前にデータベースのバックアップを必ず作成してください。 

php [mr_newtest.php, mr_newcase.php] -h {host} -u {user} -p{password or leave blank and it prompts you} -d {database}

サンプル出力:

php mr_newtest.php -h <hostname> -u <user> -p -d <db>
03/04/2021 02:04:32 am: dropping new_tests table if it exists
03/04/2021 02:04:32 am: dropping deadwood_tests table if it exists
03/04/2021 02:04:32 am: dropping old_tests table if it exists
03/04/2021 02:04:32 am: creating new_tests table
03/04/2021 02:04:32 am: creating deadwood_tests table
03/04/2021 02:04:32 am: Locking all tables
03/04/2021 02:04:32 am: inserting is_selected = 1 tests into new_tests table
03/04/2021 02:04:32 am: insert into new_tests select * from tests where is_selected = 1
03/04/2021 02:48:56 am: inserting is_selected = 0 tests into deadwood_tests table
03/04/2021 02:48:56 am: insert into deadwood_tests select * from tests where is_selected = 0
03/04/2021 07:57:57 am: counting rows in new_tests table
03/04/2021 07:58:13 am: Number of rows in new_tests table: 17849816
03/04/2021 07:58:13 am: counting rows in deadwood_tests table
03/04/2021 08:01:42 am: Number of rows in deadwood_tests table: 796606952
03/04/2021 08:01:42 am: unlocking all tables
03/04/2021 08:01:42 am: Renaming tables
03/04/2021 08:01:42 am: dropping old_tests table
03/04/2021 08:01:49 am: Finished.

スクリプトを実行した後、データベースのフットプリントの全体的なサイズが小さくなっていない場合があります。これは、一時テーブルが作成され、重複データがコピーされているからです。上で説明したとおり、TestRail が適切なデータを使用して正常に動作していることが確認できたら、一時テーブルを削除すると、データベースの全体的なサイズが小さくなります。