【IRIS/Cache】データベースの縮小を行う

はじめに

Cacheの古いバージョンでは、コマンド自体がバグっているのでコマンドの実施は控えて下さい。

データベースから特定のグローバルを削除すると、櫛の歯が抜けたようにデータブロックが歯抜けになります。

また、肥大化したデータベース(DATファイル)は、グローバルの削除と共に縮小する事はありません。
放置すると無駄にストレージを圧迫する事になります。

今回は、古参Cacheユーザ間では絶対に禁止とまで謳われた、レジェンドコマンド「データベースの縮小」をご紹介いたします。

実行前準備

データブロックの整理

縮小コマンドは、データベース後方の空きスペースを削除する事により、ファイルサイズを小さくします。

データベース後方に、縮小したい分の空きスペースがあれば、特に問題無くコマンドが実行できます。
ただ、拡張を続けたデータベースなどは、削除するべき後方のスペースがないケースが多いです。

データベースの後方に空きスペースを作る方法は2つあります。

  • デフラグを行う
  • データブロックを移動させる

デフラグを行う

デフラグに関しては記事にしているので、そちらを参照して下さい。

データブロックを移動させる

データベースの後方に空きスペースを作成するコマンドの紹介になります。

ネームスペースを「%SYS」にし、「DATABASE」コマンドを実行します。

d ^DATABASE
%SYS>d ^DATABASE
 
 
 1) Create a database
 2) Edit a database
 3) List databases
 4) Delete a database
 5) Mount a database
 6) Dismount a database
 7) Compact globals in a database
 8) Show free space for a database
 9) Show details for a database
10) Recreate a database
11) Manage database encryption
12) Return unused space for a database
13) Compact free space in a database
14) Defragment a database
15) Show background database tasks
 
Option? [13]
Database directory? [DATファイルのフォルダパス入力(D:\IRISDB\SAMPLE-DATA)]
Current Size: 8734 MB
Total freespace: 5729 MB
Freespace at end of file: 0 MB
 
Target freespace at end of file, in MB (0-5729):  [5729]

「13) Compact free space in a database」を実行します。
対象のデータベースを入力し、空きスペースのサイズを入力します。

今回は、限界(5729MB)まで空きスペースを作成したいため、5729を入力しました。

------------------------------------------------------------------------------
データベース容量を圧縮, ID=4, as of 2024-04-20 14:44:03
------------------------------------------------------------------------------
Start Time:     2024-04-20 14:44:02
Namespace:      %SYS
State:          Done  (PID: 348)
データベース:         d:\irisdb\sample-data\
Progress:       5729 / 5729 ファイル末尾の MB 空き容量 (100.00%)
                |############################################################|
ブロックをスキャンしました:  3891
Final Status:   OK
------------------------------------------------------------------------------
データベース容量を圧縮 ended (see status above)

作業自体はすぐ完了します。
移動するだけなので、デフラグとは大きく異なる点になります。

充填率を上げる

ついでなので、データ・ブロックの充填率も変更しておきましょう。
「%GSIZE」の詳細で取得できる「Packing」に該当します。

コマンドは同じく「DATABASE]コマンドで、「7) Compact globals in a database」になります。

 1) Create a database
 2) Edit a database
 3) List databases
 4) Delete a database
 5) Mount a database
 6) Dismount a database
 7) Compact globals in a database
 8) Show free space for a database
 9) Show details for a database
10) Recreate a database
11) Manage database encryption
12) Return unused space for a database
13) Compact free space in a database
14) Defragment a database
15) Show background database tasks
 
Option? [7]
Database directories to compact? [DATファイルのフォルダパス入力(D:\IRISDB\SAMPLE-DATA)]
 
Databases Selected
------------------
d:\irisdb\sample-data\
 
All Globals? Yes => [Enter(yes)]
 
55 items selected from
55 available globals
How full do you want the database blocks? 90 => [Enter]
Display compacted globals? No => [Enter]
Device: [ファイルパス入力(D:\Temp\output\compact_global2.txt)]
Parameters? "WNS" => [Enter]
Confirm compaction of databases? Yes => [Enter]

処理時間が結構かかるので、実行はお好みでお願い致します。

縮小コマンド

縮小コマンドも同様に「DATABASE]コマンドになります。
「12) Return unused space for a database」が実行コマンドになります。

 1) Create a database
 2) Edit a database
 3) List databases
 4) Delete a database
 5) Mount a database
 6) Dismount a database
 7) Compact globals in a database
 8) Show free space for a database
 9) Show details for a database
10) Recreate a database
11) Manage database encryption
12) Return unused space for a database
13) Compact free space in a database
14) Defragment a database
15) Show background database tasks
 
Option? [12]
Database directory? [DATファイルのフォルダパス入力(D:\IRISDB\SAMPLE-DATA)]
Current size 8734MB
 
Specify a desired file size (in MB), or 0 to return all: [0]
Returning space...
Database d:\irisdb\sample-data\ file size is now 3004MB

対象のデータベースを入力し、指定のファイルサイズ(MB)を入力します。

今回は最大限小さくしたい為、「0」を入力しました。

8.52GBあったデータベースが、2.93GBまで縮小する事が出来ました。
これでストレージにも少しだけ余裕が出来ましたね。

おわりに

データベースのメンテナンスは、システム運用上知っておいた方が良い知識となります。

長時間使用してもパフォーマンスの低下に関しては気にする必要はありません。

が、開発に関しては、結構データベースの内容が残念な事になっていたりします。
たまにはデータベースをメンテナンスする時間を使っても良いですね。