Hologres は、データベースイベントをキャプチャするためのバイナリロギング (binlog) をサポートしています。この機能を使用して、データをレプリケーションまたは同期できます。また、これらのイベントをメッセージストリームとしてさまざまなコンシューマーに転送することもできます。Hologres のバイナリログを消費することで、データの再利用性が向上し、データ変換のエンドツーエンドレイテンシが削減されます。このトピックでは、Hologres のバイナリログをサブスクライブし、関連する操作を実行する方法について説明します。
バイナリログの概要
従来の MySQL データベースと同様に、Hologres はバイナリロギングを使用して、データベース内のすべてのデータ変更イベントを記録します。Hologres のバイナリログにより、柔軟で便利なデータレプリケーションとデータ同期が可能になります。ただし、Hologres のバイナリログは通常、データ同期にのみ使用されます。対照的に、従来のデータベースのバイナリログは、プライマリ-レプリカインスタンスの同期やデータ復元など、高可用性 (HA) シナリオにも使用されます。その結果、それらの実装にはいくつかの違いがあります:
Hologres のバイナリロギングは DDL 操作を記録しません。
Hologres のバイナリログは柔軟で、テーブルレベルで動作します。必要に応じて有効または無効にしたり、テーブルごとに異なる Time to Live (TTL) 値を設定したりできます。
分散型リアルタイムデータウェアハウスとして、Hologres は分散バイナリログを備えています。
Hologres のバイナリログは簡単にクエリできます。
ビッグデータシナリオでは、Flink は Hologres のバイナリログを直接消費できます。従来のデータウェアハウスの階層化と比較して、Flink と Hologres のバイナリログの組み合わせは、完全なイベント駆動型アーキテクチャを作成します。このアーキテクチャは、オペレーショナルデータストア (ODS) からデータウェアハウスディメンション (DWD) レイヤーへ、そして DWD レイヤーからデータウェアハウスサービス (DWS) レイヤーへのエンドツーエンドのリアルタイムデータ変換ジョブを容易にします。このソリューションは、階層化された管理をサポートする統一されたストレージを提供し、データの再利用性を向上させ、エンドツーエンドのデータ変換レイテンシを削減して、ワンストップのリアルタイムデータウェアハウスソリューションを提供します。
制限事項
Hologres のバイナリログをサブスクライブする際は、次の制限事項にご注意ください:
Hologres のバイナリログのサブスクリプションは、Hologres V0.9 以降でのみサポートされています。ご利用のインスタンスのバージョンが V0.9 より前の場合は、オンラインサポートの DingTalk グループにご参加ください。詳細については、「オンラインサポートの利用方法」をご参照ください。
Hologres V0.9 および V0.10 では、テーブルプロパティを変更して既存のテーブルのバイナリログを有効にすることはできません。代わりに、テーブルを再作成する必要があります。Hologres V1.1 以降では、必要に応じてバイナリログを有効にできます。
Hologres V1.3.14 および V1.1.82 より前のバージョンでは、スーパーユーザーのみがバイナリログを消費できます。権限の少ないアカウントでバイナリログを消費しようとすると、
permission denied for table hg_replication_slot_propertiesという権限エラーが発生します。Hologres V1.3.14、V1.1.82 以降では、Flink を使用してバイナリログを消費する場合、アカウントにはテーブルをクエリする権限のみが必要です。Java Database Connectivity (JDBC) を使用して Hologres のバイナリログを消費するには、アカウントに Replication Role が必要です。Hologres は、行指向テーブルと列指向テーブルの両方で、テーブルレベルでバイナリログ機能をサポートしています。次の表に、Hologres バイナリログのサブスクリプションのサポート状況を示します。
Flink の分類
Hologres 行指向テーブルのバイナリログ
Hologres 列指向テーブルのバイナリログ
Hologres 行列表ハイブリッドテーブルのバイナリログ (Hologres V1.1 以降でサポート)
Realtime Compute (Blink)
サポート対象
サポート対象
サポート対象
フルマネージド Flink
サポート対象
サポート対象
サポート対象
オープンソース Flink
サポート対象外
サポート対象外
サポート対象外
JDBC
Hologres V1.1 以降でサポート
Hologres V1.1 以降でサポート
Hologres V1.1 以降でサポート
Blink を使用して Hologres のバイナリログを消費する場合、TIMESTAMP データ型はサポートされていません。Hologres でテーブルを作成する際には、TIMESTAMPTZ データ型を使用する必要があります。SMALLINT などの他のデータ型もサポートされていません。
パーティションテーブルの親テーブルからバイナリログを消費することはできません。子テーブルまたは標準 (非パーティション) テーブルを使用する必要があります。Hologres V1.3.24 以降では、必要に応じてパーティションテーブルの子テーブルのバイナリログ TTL を変更できます。子テーブルのバイナリログ TTL を明示的に指定しない場合、親テーブルのバイナリログ TTL が継承されます。バイナリログ TTL は正確な値ではないことに注意してください。システムは、バイナリログが期限切れになった直後に削除されることを保証しません。バイナリログは有効期限が切れた後のいずれかの時点で削除されます。
頻繁な更新を伴うシナリオでは、列指向テーブルでバイナリログを有効にすると、理論上、行指向テーブルよりもオーバーヘッドが大きくなります。バイナリログを有効にした行指向テーブルを使用することを推奨します。テーブルがオンライン分析処理 (OLAP) クエリにも使用される場合は、行列表ハイブリッドストレージフォーマットを使用することを推奨します。詳細については、「テーブルのストレージフォーマット」をご参照ください。
Hologres の内部テーブルのみがバイナリログをサポートします。外部テーブルはサポートしません。
バイナリログのフォーマットと原則
Binlog レコードは、Binlog システムフィールドとユーザーテーブルフィールドで構成されます。これらについては、以下の表で説明します。
フィールド名 | フィールドタイプ | 説明 |
hg_binlog_lsn | BIGINT | バイナリログのシリアル番号を表すバイナリログシステムフィールドです。シャード内では単調に増加しますが、連続していることは保証されません。異なるシャード間での一意性や順序は保証されません。 説明 シャード内でのバイナリログデータの分散方法の詳細については、「ディストリビューションキー」をご参照ください。 |
hg_binlog_event_type | BIGINT | 現在のレコードが表す変更のタイプを示すバイナリログシステムフィールドです。
|
hg_binlog_timestamp_us | BIGINT | マイクロ秒 (us) 単位のシステムタイムスタンプであるバイナリログシステムフィールドです。 |
user_table_column_1 | ユーザー定義 | ユーザーテーブルフィールドです。 |
... | ... | ... |
user_table_column_n | ユーザー定義 | ユーザーテーブルフィールドです。 |
UPDATE 操作は、更新前の状態と更新後の状態の 2 つの binlog レコードを生成します。バイナリログのサブスクリプション機能により、これら 2 つのレコードが連続していることが保証されます。更新前のレコードは、更新後のレコードの前にあります。
Holo Client、Flink Connector、Data Integration などの Hologres コネクタを使用して実行される UPDATE 操作の場合、コネクタは BEFORE_UPDATE を DELETE に、AFTER_UPDATE を INSERT に変換します。そのため、
hg_binlog_event_typeフィールドには 2 と 5 の値が表示されます。ただし、コネクタはデータの結果整合性を保証します。hg_binlog_event_typeフィールドは、純粋な SQL ステートメントを使用して UPDATE 操作が実行された場合にのみ、BEFORE_UPDATE と AFTER_UPDATE を記録します。
Hologres のバイナリログは、特殊な行指向テーブルと見なすことができます。テーブルのバイナリログを有効にすることは、hg_binlog_lsn をキーとする新しい行指向テーブルを作成することに似ています。ビジネステーブルの元のフィールドは、hg_binlog_event_type および hg_binlog_timestamp_us と組み合わされて値を形成します。バイナリログテーブルのフィールドは固定されており、強力なスキーマを持っていることを意味します。ユーザーフィールドの順序は、ビジネステーブルの DDL で定義された順序と一致します。したがって、バイナリログを読み取る際のパフォーマンスを向上させるために、バイナリログを有効にする際には行指向または行列表ハイブリッドテーブルを使用することを推奨します。
バイナリログの有効化
Hologres では、バイナリログ機能はデフォルトで無効になっています。binlog.level と binlog.ttl のテーブルプロパティを設定することで有効にできます。次の例は、バイナリログを有効にする方法を示しています。テーブルを作成するために使用されるパラメーターの詳細については、「CREATE TABLE」をご参照ください。
理論上、列指向テーブルでバイナリログを有効にするオーバーヘッドは、行指向テーブルよりも高くなります。テーブルが頻繁に更新される場合は、行指向テーブルを使用してバイナリログを有効にすることを推奨します。
V2.1 以降でサポートされる構文:
テーブルプロパティ名
binlog.levelおよびbinlog.ttlは、binlog_levelおよびbinlog_ttlに更新されました。CREATE TABLE test_message_src ( id int PRIMARY KEY, title text NOT NULL, body text ) WITH ( orientation = 'row', clustering_key = 'id', binlog_level = 'replica', binlog_ttl = '86400' -- バイナリログの TTL (秒単位)。 );すべてのバージョンでサポートされる構文:
begin; create table test_message_src( id int primary key, title text not null, body text); call set_table_property('test_message_src', 'orientation', 'row');-- 行指向テーブル test_message_src を作成します。 call set_table_property('test_message_src', 'clustering_key', 'id');-- id 列にクラスター化インデックスを作成します。 call set_table_property('test_message_src', 'binlog.level', 'replica');-- テーブルプロパティを設定してバイナリログ機能を有効にします。 call set_table_property('test_message_src', 'binlog.ttl', '86400');-- バイナリログの TTL (秒単位)。 commit;
次の表にパラメーターを示します。
パラメーター | 説明 |
| バイナリログを有効にするかどうかを指定します。有効な値:
|
| バイナリログの TTL (秒単位)。デフォルト値は 30 日 (2592000 秒) です。 |
必要に応じたバイナリログの有効化
Hologres V1.1 以降では、ビジネスニーズに基づいてバイナリログ機能を有効または無効にできます。また、さまざまなビジネスシナリオの保存期間要件を満たすように TTL を設定することもできます。既存のテーブルのバイナリログを再作成することなく有効にでき、これは迅速で便利なプロセスです。
次の機能は Hologres V1.1 以降でのみ利用可能です。ご利用のインスタンスのバージョンが V1.1 より前の場合は、「一般的なアップグレード準備の失敗エラー」をご参照いただくか、Hologres DingTalk グループに参加してフィードバックを提供してください。詳細については、「オンラインサポートの利用方法」をご参照ください。
バイナリログの有効化
次のステートメントを使用して、既存のテーブルのバイナリログを有効にし、バイナリログの TTL を設定できます。
-- テーブルプロパティを設定してバイナリログ機能を有効にします。 begin; call set_table_property('<table_name>', 'binlog.level', 'replica'); commit; -- テーブルプロパティを設定してバイナリログの TTL を秒単位で設定します。 begin; call set_table_property('<table_name>', 'binlog.ttl', '2592000'); commit;table_name は、バイナリログを有効にするテーブルの名前です。
バイナリログの無効化
次のステートメントを使用して、テーブルのバイナリログを無効にできます。
-- テーブルプロパティを設定してバイナリログ機能を無効にします。 begin; call set_table_property('<table_name>', 'binlog.level', 'none'); commit;table_name は、バイナリログを無効にするテーブルの名前です。
バイナリログ TTL の変更
次のステートメントを使用して、バイナリログが有効になっているテーブルの TTL を変更できます。これにより、ビジネスのさまざまな保存期間要件を満たすことができます。
説明Hologres V1.3.24 以降では、必要に応じてパーティションテーブルの子テーブルのバイナリログ TTL を有効にできます。子テーブルのバイナリログ TTL を明示的に変更しない場合、デフォルトで親テーブルのバイナリログ TTL が継承されます。
call set_table_property('<table_name>', 'binlog.ttl', '8640000'); -- 単位: 秒table_name は、バイナリログ TTL を変更するテーブルの名前です。
バイナリログのクエリ
Hologres テーブルのバイナリログデータは、強力なスキーマフォーマットを使用します。特定のテーブルのバイナリログをクエリするには、組み込みのバイナリログフィールドと元のテーブルフィールドを組み合わせることができます。Hologres は、最新または最も古いバイナリログをクエリしたり、既知の LSN とタイムスタンプを使用してバイナリログ情報をクエリしたりする機能も提供します。
組み込みの特殊フィールドを使用したバイナリログの直接クエリ
組み込みのバイナリログフィールドと元のテーブルフィールドを組み合わせて、バイナリログをクエリできます。次のコードは例を示しています。
SELECT hg_binlog_lsn,hg_binlog_event_type,hg_binlog_timestamp_us,* FROM test_message_src;次の図は、クエリ結果のサンプルを示しています。

テーブルの指定されたシャードにおける最も古いまたは最新のバイナリログのクエリ
hg_get_binlog_cursor 関数を使用してバイナリログをクエリできます。構文は次のとおりです。
-- OLDEST: このシャードで最も古いバイナリログ。
SELECT * FROM hg_get_binlog_cursor('<table_name>','OLDEST',<shard_id>);
-- LATEST: このシャードで最新のバイナリログ。
SELECT * FROM hg_get_binlog_cursor('<table_name>','LATEST',<shard_id>);次のコードは例を示しています。
SELECT * FROM hg_get_binlog_cursor('test_message_src','OLDEST',0);次の図は、クエリ結果のサンプルを示しています。

LSN によるバイナリログのタイムスタンプのクエリ
hg_get_binlog_cursor_by_lsn 関数を使用して、バイナリログのタイムスタンプをクエリします。この関数は、指定されたログシーケンス番号 (LSN) 以上の LSN を持つ最初のバイナリログに関する情報を返します。指定された LSN が存在しない場合、結果の hg_binlog_timestamp_us フィールドは現在の時刻になります。構文は次のとおりです。
SELECT * FROM hg_get_binlog_cursor_by_lsn('<table_name>',<lsn>,<shard_id>);--LSN 値 (bigint 型)以下に例を示します。
SELECT * FROM hg_get_binlog_cursor_by_lsn('test_message_src',152,0);以下にクエリ結果のサンプルを示します。

タイムスタンプによるバイナリログの LSN のクエリ
hg_get_binlog_cursor_by_timestamp 関数を使用して、バイナリログのログシーケンス番号 (LSN) をクエリできます。この関数は、指定された時刻以上のタイムスタンプを持つ最初のバイナリログに関する情報を返します。指定された時刻が最新のバイナリログエントリのタイムスタンプより後の場合、結果の hg_binlog_timestamp_us フィールドには現在の時刻が含まれ、hg_binlog_lsn フィールドには次のデータ挿入に割り当てられる LSN が含まれます。構文は次のとおりです。
指定されたタイムスタンプが現在の時刻 (now() 関数によって返される) より大きい場合、SQL クエリは「Get binlog cursor in future time」例外をスローします。
SELECT * FROM hg_get_binlog_cursor_by_timestamp('<table_name>',<timestamp>,<shard_id>);例:
SELECT *,to_timestamp(hg_binlog_timestamp_us/1000000.0) FROM hg_get_binlog_cursor_by_timestamp('test_message_src','2024-05-20 19:34:53.791+08',0);以下にクエリ結果のサンプルを示します。

Hologres バイナリログのリアルタイム消費
Flink、Blink、および JDBC (Holo Client を含む) を使用して Hologres のバイナリログを消費できます。詳細については、次のトピックをご参照ください:
Flink および Blink を使用してバイナリログをリアルタイムで消費するには、「Flink または Blink を使用した Hologres バイナリログのリアルタイム消費」をご参照ください。
JDBC を使用してバイナリログをリアルタイムで消費するには、「JDBC を使用した Hologres バイナリログの消費」をご参照ください。
バイナリログが有効なテーブルの表示
次の SQL ステートメントを使用して、バイナリログが有効になっているテーブルを表示できます。
SELECT
*
FROM
hologres.hg_table_properties
WHERE
property_key = 'binlog.level'
AND property_value = 'replica';次の図は、結果のサンプルを示しています。
バイナリログストレージサイズの表示
Hologres では、
pg_relation_size関数を使用してテーブルのストレージサイズを取得できます。このサイズには、バイナリログのストレージサイズが含まれます。詳細については、「テーブルのストレージサイズの表示」をご参照ください。Hologres V2.1 以降では、
hologres.hg_relation_size関数を使用して、データ、バイナリログ、その他のストレージ詳細を含む、テーブルの詳細なストレージ情報を表示できます。詳細については、「テーブルストレージ詳細の表示」をご参照ください。
テーブルでの DML 操作中のバイナリログの無効化
次の Grand Unified Configuration (GUC) パラメーターを使用して、DML 操作中にテーブルがバイナリログを生成しないようにすることができます。このパラメーターはセッションレベルで有効にし、DML ステートメントと一緒に実行する必要があります。
--セッションレベルで有効にします。
SET hg_experimental_generate_binlog=off;