このセクションでは、ログアーカイブに関する概念と内部ロジックについて説明します。
ログアーカイブアーキテクチャ
ログアーカイブとは、データベースが生成するリドゥーログを他のメディア(例:NFS、OSSなど)に保存することで、データベースの全リドゥー操作履歴をより長期間保持できるようにする機能です。OceanBaseデータベースはマルチテナントデータベースであり、各テナントはログアーカイブ機能を有効にするかどうかを独立して決定でき、各テナント間でのログアーカイブは互いに影響しません。
同時に、OceanBaseデータベースはネイティブ分散型データベースでもあるため、テナント内の各ログストリーム間のアーカイブも相互に独立しています。単一のログストリームについて見ると、アーカイブされるログはログストリームのリーダーが担当し、各ログは1部しかアーカイブされません。アーカイブプロセスでは、RS Leaderが各ログストリームのアーカイブ進捗状況に基づき、現在のテナントのアーカイブ進捗度を計算します。
ログアーカイブのアーキテクチャは以下の図のとおりです。

ログアーカイブモード
ログアーカイブモードは、アーカイブ(ARCHIVELOG)モードと非アーカイブ(NOARCHIVELOG)モードの2種類があります。これはログアーカイブ機能のスイッチであり、テナントがアーカイブモードに設定されている場合にのみ、そのテナントでログアーカイブタスクを実行できます。
アーカイブ状態
ログアーカイブは、アーカイブ宛先のアーカイブ状態を記述するために有限状態集合を使用します。sysテナントはoceanbase.CDB_OB_ARCHIVELOGビューのSTATUSフィールドで確認できます。MySQLモードのユーザーテナントはoceanbase.DBA_OB_ARCHIVELOGビューのSTATUSフィールドで確認でき、Oracleモードのユーザーテナントはsys.DBA_OB_ARCHIVELOGビューのSTATUSフィールドで確認できます。
各アーカイブ状態とその説明は次の表のとおりです。
ステータス |
説明 |
|---|---|
| PREPARE | ログアーカイブを開始する初期状態。 |
| BEGINNING | ログアーカイブの起動を開始しています。この状態では、各ログストリームにアーカイブ開始の通知が送信されます。 |
| DOING | ログアーカイブ中です。この状態では、ログの連続チェックポイント、すなわちcheckpoint_scnが継続的に進められます。 |
| INTERRUPTED | アーカイブが中断されました。少なくとも1つのログストリームでアーカイブが中断された場合、この状態に入ります。 |
| SUSPENDING | ログアーカイブが一時停止中です。 |
| SUSPEND | ログアーカイブは一時停止されています。 |
| STOPPING | ログアーカイブを終了しています。 |
| STOP | ログアーカイブは停止しました。 |
アーカイブログの整理
###ロググループ
OceanBaseデータベースでは、各アーカイブログは実際には複数のLog Entryを含むログ集合であり、このアーカイブログをLog Groupと呼びます。各Log Entryには関連するSCNがあり、Log GroupにもSCNがあります。これはすべてのLog Entryの中で最大のSCNです。ログアーカイブの作業とは、アーカイブメディア上でLog Groupを管理・整理することです。
###ピース
OceanBaseデータベースは、アーカイブログデータをピース単位で組織・管理します。一つのピースは、特定のテナントの連続した期間にわたる完全なログの集合であり、左閉右開の区間です。ここには以下の二つの重要な特徴が含まれています:
一つのピースには連続した期間のログのみが含まれます。これは
1dの場合もあれば、例えば2dなど他の時間の場合もあります。この期間はLOG_ARCHIVE_DESTパラメータのpiece_switch_intervalプロパティによって制御されます。一つのピース内のログは完全であるということは、そのテナントがその期間内に生成したすべてのログストリームのLog Groupがそのピース内に整理されていることを意味します。
LOG_ARCHIVE_DESTパラメータのpiece_switch_intervalプロパティを1dに設定した場合、OceanBaseデータベースは1日ごとに一つのピースを生成します。各アーカイブサイクルの最後のピースを除き、他の各ピースには完全な1日分のログが含まれており、すべてのログは規則に従ってこのピースにアーカイブされます。例えば、'2022-06-01 06:00:00.000000'でログアーカイブを有効にした後、生成される完全なピースには、現在のテナントのログのSCN範囲が['2022-06-01 06:00:00.000000' , '2022-06-02 06:00:00.000000')含まれます。
###ピースの重要なプロパティ
ピースにはSTART_SCN、END_SCN、CHECKPOINT_SCN、STATUS、FILE_STATUSなど、いくつかの重要なプロパティがあります。
START_SCN
START_SCNフィールドは、ピース内の連続ログの開始点SCNを記述するために使用されます。
END_SCN
END_SCNフィールドは、ピースの終了SCNを記述するために使用されます。END_SCN - START_SCNの値がpiece_switch_intervalプロパティの値となります。
例えば、LOG_ARCHIVE_DESTパラメータのpiece_switch_intervalプロパティを1dに設定し、アーカイブ開始時刻を2022-06-01 06:00:00とした場合、そのアーカイブサイクルで生成される最初のピースのSTART_SCNは'2022-06-01 06:00:00'、END_SCNは'2022-06-02 06:00:00'となります。これは、'2022-06-01 06:00:00'以上、'2022-06-02 06:00:00'未満のすべてのLog Groupがこのピースにアーカイブされることを意味します。2番目のピースのSTART_SCNは'2022-06-02 06:00:00'、END_SCNは'2022-06-03 06:00:00'となります。
同一のアーカイブサイクル内で、SCNが[START_SCN, END_SCN)範囲内のLog Groupはすべて同じピースに属しますが、SCNが[START_SCN, END_SCN)範囲内のLog Entryが同じピースに属するとは限りません。
例えば、Piece 1のアーカイブ区間[START_SCN, END_SCN)が['2022-06-01 06:00:00', '2022-06-02 06:00:00')と仮定します。この時、あるLog Groupが2つのLog Entryを含んでおり、そのSCNはそれぞれ'2022-06-02 05:59:59'(区間内)と'2022-06-02 06:00:01'(区間外)です。このLog GroupのSCNは、これら2つのLog Entryの最大値、すなわち'2022-06-02 06:00:01'となります。この値はpiece 1のEND_SCNを超えているため、このLog Group内のすべてのLog Entryは次のPieceに属します。
CHECKPOINT_SCN
CHECKPOINT_SCN フィールドは、Piece内の連続するログの最大SCNを示します。これはそのPieceに含まれるすべてのLog Groupの中で最大のSCNです。すべてのSCNが[START_SCN, CHECKPOINT_SCN]の範囲内にあるLog Groupは、すでにそのPieceにアーカイブされています。
STATUS
STATUS フィールドはPieceの状態を示します。各状態とその説明は以下の表のとおりです。
ステータス |
説明 |
|---|---|
| ACTIVE | アクティブなPiece。システムがこのPieceにログをアーカイブしていることを示します |
| FROZEN | 凍結されたPiece。このPiece内のログは完全であり、今後このPieceにログをアーカイブすることはありません |
FILE_STATUS
FILE_STATUSはPieceのファイル状態を示します。各状態とその説明は以下の表のとおりです。
フィールド |
説明 |
|---|---|
| AVAILABLE | Piece内のデータは完全であり、クリーンアップされておらず、破損もしていない状態 |
| INCOMPLETE | Piece内のデータが不完全で、特定のログストリームのデータが欠落しています |
| DELETING | 期限切れでクリーンアップ中のPiece。 |
| DELETED | Pieceはクリーンアップ済み |
| BROKEN | Piece内のデータが破損しています |