この記事では、ログアーカイブに関する概念と内部ロジックについて説明します。
ログアーカイブアーキテクチャ
ログアーカイブとは、データベースが生成するリカバリログを他のメディア(例えば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を管理・整理することです。
Piece
OceanBaseデータベースは、アーカイブログデータをPiece単位で組織・管理します。1つのPieceとは、特定のテナントにおいて一定期間にわたる完全なログの集合であり、左閉右開の区間となります。ここには以下の2つの重要な特徴が含まれています:
1つのPieceには連続した時間帯のログのみが含まれ、その時間帯は
1dである場合もあれば、例えば2dなど他の時間帯である場合もあります。この時間帯はLOG_ARCHIVE_DESTパラメータのpiece_switch_intervalプロパティによって制御されます。1つのPiece内のログは完全であり、これはそのテナントがこの期間内に生成したすべてのログストリームによるLog Groupが、そのPiece内に整理されていることを意味します。
LOG_ARCHIVE_DESTパラメータのpiece_switch_intervalプロパティが1dに設定されていると仮定すると、OceanBaseデータベースは1日ごとに1つのPieceを生成します。各アーカイブラウンドの最後のPieceを除き、他の各Pieceには完全な1日分のログが含まれており、すべてのログは規則に従ってこのPieceにアーカイブされます。例えば、'2022-06-01 06:00:00.000000'でログアーカイブが開始された後、生成される完全なPieceに含まれる現在のテナントのログのSCN範囲は['2022-06-01 06:00:00.000000' , '2022-06-02 06:00:00.000000')となります。
Pieceのいくつかの重要なプロパティ
PieceにはSTART_SCN、END_SCN、CHECKPOINT_SCN、STATUS、FILE_STATUSなど、いくつかの重要なプロパティがあります。
START_SCN
START_SCNフィールドは、Piece内の連続ログの開始点SCNを記述するために使用されます。
END_SCN
END_SCNフィールドは、Pieceの終了SCNを記述するために使用されます。END_SCN - START_SCNの値がpiece_switch_intervalプロパティの値となります。
例えば、LOG_ARCHIVE_DESTパラメータのpiece_switch_intervalプロパティが1dに設定され、アーカイブ開始時刻が2022-06-01 06:00:00である場合、このラウンドのアーカイブで生成される最初のPieceの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がこのPieceにアーカイブされることを意味します。2番目のPieceのSTART_SCNは'2022-06-02 06:00:00'、END_SCNは'2022-06-03 06:00:00'となります。
同一アーカイブサイクル内で、SCNが[START_SCN, END_SCN)範囲内のLog Groupはすべて同一のPieceに属し、一方でSCNが[START_SCN, END_SCN)範囲内のLog Entryは必ずしも同一のPieceに属するとは限りません。
例えば、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フィールドは、ピース内の連続ログの最大SCNを示します。これはそのピースに含まれるすべてのLog Groupの中で最も大きなSCNです。[START_SCN, CHECKPOINT_SCN]範囲内のすべてのSCNを持つLog Groupは、すでにそのピースにアーカイブされています。
STATUS
STATUSフィールドは、ピースの状態を示します。各ステータスとその説明は以下の表のとおりです。
| ステータス | 説明 |
|---|---|
| ACTIVE | アクティブなピース。システムがこのピースにログをアーカイブしていることを示します。 |
| FROZEN | フローズンのピース。このピース内のログは完全であり、今後このピースにログをアーカイブすることはありません。 |
FILE_STATUS
FILE_STATUSは、ピースのファイル状態を示します。各ステータスとその説明は以下の表のとおりです。
| フィールド | 説明 |
|---|---|
| AVAILABLE | Piece内のデータは完全であり、クリーンアップされておらず、損傷もない |
| INCOMPLETE | Piece内のデータが不完全で、特定のログストリームのデータが欠落している |
| DELETING | 切り捨て中の期限切れのPiece。 |
| DELETED | Pieceは既にクリーンアップされた |
| BROKEN | Piece内のデータが損傷している |