SAP HANAデータファイルの縮小

SAP HANAを運用してると、実際のデータ使用サイズと比較して、OS上のデータファイルの ( Persistence Data Storage ) サイズが異常に大きくなることがあります。
このような状態では、SAP HANAサーバの物理メモリには余裕があるのにデータファイルの領域 ( /hana/data ) に空がなくなり、領域の拡張が必要になってきます。
しかし、大きくなったデータファイルには、使用されてない領域 ( 断片化 ) が多く存在する場合があり、その際は領域の拡張ではなく、データファイルを縮小させることで、/hana/data領域の空を確保することができます。
今回は、SAP HANAデータベースのデータファイルの縮小方法をご紹介します。
◆ データファイルのサイズ確認方法
データファイルのサイズ ( ディスクサイズ ) および 実際に使用しているデータのサイズ、データファイルの断片化率は、以下で確認することができます。
(1) データファイルのサイズ
① HANA Studio ( Administration Console -> Overview )
※対象データベースで確認

② SAP GUI ( Trcd:DBACOCKPIT -> 現在のステータス -> 概要 )

(2) 実際に使用しているデータのサイズと、全体との割合
① HANA Studio ( Administration Console -> Volumes )
※対象データベースで確認

(3) データファイルの断片化率
① SQL Statement の SQL: “HANA_Disks_Overview”
SAP Note 1969700 – SQL Statement Collection for SAP HANA
※対象データベースで実施

FLAG_PCT列が断片化率を表しています。SAP社の推奨では、通常は30%未満であれば許容されます。値が大きい場合はデータファイルの縮小 ( 断片化の解消 ) を検討した方が良いです。
◆ なぜ使用されていない領域が増えるのか
データファイルの使用されいない領域 ( 断片化 )が増えるのは、一度データに割り当てられたディスク領域は自動で縮小されないためで、ディスク上の使用領域が以前よりも大幅に小さくなった場合等に起こります。
一般的な断片化が発生するケースは以下になります。
① アーカイブや削除操作によるデータ削減
② ブロックされたガベージコレクションのクリーンアップ
③ 大きなテーブルの最適化 ( マージ、圧縮 )
④ スナップショット、セーブポイントの長時間保存
<参考>
SAP Note 2400005 – FAQ: SAP HANA Persistence
SAP Note 3100336 – SAP HANA パーシスタンスのコンテキストにおける断片化とは何ですか。
10億件を超えるレコードのテーブルパーティショニング後やデルタマージ後にデータファイルの大幅な拡張 ( /hana/data領域の使用量の増加 ) がみられたケースもあります。
◆ データファイルの縮小方法
断片化したデータファイルを縮小するには、データベースに対してRECLAIMコマンドを実行することで、ディスク領域を解放することができます。( データファイル内に存在するページが前面に移動し、後方の空き領域が解放される。)
<コマンド>
ALTER SYSTEM RECLAIM DATAVOLUME 120 DEFRAGMENT
※ 120=既存の使用中データサイズの120%までファイルサイズを縮小する。120は推奨値。
※ DEFRAGMENT = Shrinkモードを指定。現在は DEFRAGMENT のみ

<参考>
SAP Note 2499913 – How to shrink SAP HANA Data Volume size
SAP Help – ALTER SYSTEM RECLAIM DATAVOLUME Statement (System Management)
過去に運用している環境で断片化したデータファイルの縮小を実行した時は、以下の表のような結果になりました。

RECLAIMコマンドを実行したことで、データファイルのサイズは4,200GBから1,800GBが解放されて2,400GBまで縮小されました。未使用サイズも2,200GBから400GBまで縮小されました。
未使用領域が解放されるだけなので、実際に使用しているデータのサイズは変更されません。
◆ 注意点
SAP HANA System Replication環境では、RECLAIMコマンドを実行するにあたり注意点があります。
注意点① 直接セカンダリサイトにRECLAIMコマンドを実行することはできない。
SAP HANA System Replication環境ではセカンダリサイトでユーザがコマンド ( SQLクエリ ) を実行することはできません。
このため、セカンダリサイトのデータファイルを縮小するには、以下のいずれかの方法で実施する必要があります。
① 1度セカンダリサイトの登録解除とレプリケーションの同期を解除した状態で、セカンダリサイトでRECLAIMコマンドを実行
② セカンダリサイトにテイクオーバーを実行し、セカンダリサイトでRECLAIMコマンドを実行
③ プライマリサイトでRECLAIMコマンドを実行。セカンダリサイトを停止してフルデータ転送 ( force_full_replica ) を実行し、セカンダリサイトのデータボリュームを初期化
SAP Note 2348397 – Shrink the Data Volume on Secondary Site with SAP HANA System Replication
注意点② プライマリサイトでRECLAIMコマンドを実行した場合でもレプリケーションによって随時取得されるスナップショットが原因でRECLAIM処理が強制終了する。
これは、スナップショットの作成とRECLAIM処理が競合してしまうために起きる仕様となります。
本処理を実行する場合は、以下のどちらかの方法を実施する必要があります。
① レプリケーション ( データ転送 ) 間隔をあける ( パラメータ datashipping_min_time_interval、datashipping_logsize_threshold を変更する )
② レプリケーションを中止して、スナップショットが作成されない状態にして、RECLAIMコマンドを実行する
SAP Note 2332284 – Data volume reclaim failed because of snapshot pages
◆ データファイルの自動縮小
これまで手動でのデータファイルの縮小方法を説明してきましたが、SAP HANA 2.0 SPS06 ( リビジョン 063.00 ) 以降は、自動でデータボリュームの未使用領域を解放して、データファイルのサイズを縮小する機能が追加されました。
各サービスの構成ファイル ( .ini ) またはglobal.ini に、以下のパラメータを設定することで、自動でRECLAIMを実行してくれるようになります。

デフォルトで有効化されているため、手動で変更する必要はありません。
自動縮小 ( 再利用 ) が有効化されている場合は、SAP HANA System Replication構成でのセカンダリサイトの考慮は不要となります。
SAP Note 3198269 – Enable Automatic Data Volume Reclaim in SAP HANA 2 SPS06
SAP Note 3268013 – SAP HANA Automatic Data Volume Reclaim
SAP Note 3308833 – Automatic Data Volume Reclaim works in HANA system replication scenario