Hologres は、Hologres バイナリログをコンシュームできるように、バイナリロギング機能を提供しています。これは、データレプリケーション機能の向上と、データ処理のエンドツーエンドのレイテンシの短縮に役立ちます。データレプリケーションまたは同期の目的で Hologres データベースイベントをキャプチャする場合、または Hologres データベースイベントをメッセージとしてコンシューマーに転送する場合に、バイナリロギング機能を使用できます。このトピックでは、Hologres バイナリログおよび関連操作のサブスクライブ方法について説明します。
バイナリログの概要
従来の MySQL データベースと同様に、Hologres はバイナリログを使用して、データベースのすべてのデータ変更イベントをログに記録します。Hologres バイナリログにより、データレプリケーションと同期が便利で柔軟になります。ただし、ほとんどの場合、Hologres バイナリログはデータ同期にのみ使用されます。従来のデータベースのバイナリログは、プライマリインスタンスとセカンダリインスタンス間の同期やデータ復旧シナリオなどの高可用性シナリオでも使用されます。Hologres バイナリログの実装と従来のデータベースバイナリログの実装は、以下の点で異なります。
Hologres バイナリログは、データ定義言語(DDL)操作を記録しません。
ビジネス要件に基づいて、Hologres テーブルのバイナリロギング機能を有効または無効にすることができます。また、テーブルごとに異なる Time to Live(TTL)設定を構成することもできます。
バイナリログは、Hologres の分散構成もサポートしています。
Hologres バイナリログは簡単にクエリできます。
ビッグデータシナリオでは、Flink を使用して Hologres バイナリログを直接コンシュームできます。従来のデータウェアハウスレイヤリングと比較して、Flink と Hologres バイナリログは、Operational Data Store(ODS)レイヤーから Data Warehouse Detail(DWD)レイヤー、および DWD レイヤーから Data Warehouse Summary(DWS)レイヤーへのエンドツーエンドのリアルタイム処理ジョブを実装できます。これは、階層型ガバナンスによる統合ストレージの要件を満たします。また、データ再利用機能の向上、データ処理のエンドツーエンドのレイテンシの短縮、およびユーザーへのワンストップのリアルタイムデータウェアハウスソリューションの提供にも役立ちます。
制限事項
Hologres でバイナリログをサブスクライブする前に、以下の点に注意してください。
Hologres V0.9 以降のみがバイナリログのサブスクリプションをサポートしています。Hologres インスタンスのバージョンが V0.9 より前の場合は、技術サポートを受けるために Hologres DingTalk グループに参加してください。Hologres DingTalk グループへの参加方法の詳細については、「Hologres のオンラインサポートを受ける」をご参照ください。
Hologres V0.9 および V0.10 では、テーブルプロパティを変更することで既存のテーブルのバイナリロギングを有効にすることはできません。テーブルのバイナリロギングを有効にするには、テーブルの作成時にこの機能を有効にする必要があります。Hologres V1.1 以降では、ビジネス要件に基づいて既存のテーブルのバイナリロギングを有効にすることができます。
V1.3.14 より前のマイナーバージョンの Hologres インスタンス、または V1.1.82 より前のすべてのバージョンの Hologres インスタンスの場合、スーパーユーザーのみが Hologres バイナリログをコンシュームできます。権限の低いアカウントを使用して Hologres バイナリログをコンシュームすると、
"permission denied for table hg_replication_slot_properties"というエラーメッセージが返されます。Hologres V1.3.14 以降のすべてのバージョン、または V1.1.82 以降のマイナーバージョンでは、Flink を使用して Hologres バイナリログをコンシュームする場合、クエリ権限を持つアカウントを使用できます。Java Database Connectivity(JDBC)ドライバーを使用して Hologres バイナリログをコンシュームする場合は、レプリケーションロールの権限を持つアカウントを使用する必要があります。Hologres では、単一行指向または列指向テーブルのバイナリログをサブスクライブできます。次の表に、さまざまなサブスクリプションモードのサポートについて説明します。
Flink タイプ
Hologres 行指向テーブルのバイナリログのサブスクリプション
Hologres 列指向テーブルのバイナリログのサブスクリプション
Hologres 行列ハイブリッドテーブルのバイナリログのサブスクリプション(Hologres V1.1 以降でサポート)
Blink ベースの Realtime Compute
サポートされています
サポートされています
サポートされています
フルマネージド Flink
サポートされています
サポートされています
サポートされています
オープンソース Flink
サポートされていません
サポートされていません
サポートされていません
JDBC
Hologres V1.1 からサポートされています
Hologres V1.1 からサポートされています
Hologres V1.1 からサポートされています
Blink ベースの Realtime Compute は、TIMESTAMP タイプのデータを含む Hologres バイナリログをサポートしていません。Hologres でテーブルを作成するときは、関連フィールドに TIMESTAMPTZ データ型を指定します。また、Blink ベースの Realtime Compute は、SMALLINT などの特殊なタイプのデータを含む Hologres バイナリログをサポートしていません。
親テーブルのバイナリログをサブスクライブすることはできません。子テーブルまたは非パーティションテーブルのバイナリログをサブスクライブできます。Hologres V1.3.24 以降では、ビジネス要件に基づいて子テーブルのバイナリログの TTL を構成できます。子テーブルのバイナリログの TTL を明示的に指定しない場合、親テーブルのバイナリログの TTL が子テーブルのバイナリログの TTL として使用されます。バイナリログの TTL は正確ではありません。システムは、バイナリログの有効期限が切れた直後に削除されることを保証するのではなく、有効期限が切れた後、特定の時間にバイナリログを削除します。
理論的には、列指向テーブルのバイナリロギングのオーバーヘッドは、行指向テーブルのオーバーヘッドよりも高くなります。テーブルが頻繁に更新される場合は、行指向テーブルのバイナリロギングを有効にすることをお勧めします。テーブルにオンライン分析処理(OLAP)クエリも含まれる場合は、行列ハイブリッドストレージモードを使用することをお勧めします。詳細については、「テーブルのストレージモード」をご参照ください。
Hologres 内部テーブルに対してのみバイナリロギングを有効にできます。外部テーブルに対してバイナリロギングを有効にすることはできません。
バイナリログのフォーマットと原則
バイナリログのフィールドは、システムフィールドとユーザー定義テーブルフィールドで構成されます。次の表に、フィールドについて説明します。
フィールド | データ型 | 説明 |
hg_binlog_lsn | BIGINT | 現在のバイナリログの序数。これはシステムフィールドです。同じシャード内のバイナリログのこのフィールドの値は単調に増加し、不連続になる場合があります。異なるシャード内のバイナリログのこのフィールドの値は、同一で順序が異なる場合があります。 説明 バイナリログデータがシャードにどのように分散されるかの詳細については、「分散キー」をご参照ください。 |
hg_binlog_event_type | BIGINT | 現在のバイナリログに記録された操作のタイプ。これはシステムフィールドです。
|
hg_binlog_timestamp_us | BIGINT | システムのタイムスタンプ。単位:マイクロ秒。これはシステムフィールドです。 |
user_table_column_1 | ユーザー定義 | ユーザー定義テーブルフィールド。 |
... | ... | ... |
user_table_column_n | ユーザー定義 | ユーザー定義テーブルフィールド。 |
UPDATE 操作では、バイナリログに 2 つのレコードが生成されます。これらは、更新前のレコードと更新後のレコードを示します。バイナリロギングにより、2 つのレコードの序数が連続しており、正しい順序であることが保証されます。更新後に生成されたレコードは、更新前に生成されたレコードの後に続きます。
Holo Client、Flink コネクタ、DataWorks の Data Integration など、Hologres コネクタを使用して UPDATE 操作を実行した場合、UPDATE 操作の同じイベントが異なる値として記録されます。たとえば、Hologres コネクタを使用すると、hg_binlog_event_type フィールドの BEFORE_UPDATE 値は DELETE に変更され、フィールドの AFTER_UPDATE 値は INSERT に変更されます。その結果、
hg_binlog_event_typeフィールドには値 2 と 5 が表示されます。ユーザーには違いは認識されません。SQL 文を使用して UPDATE 操作を実行した場合にのみ、
hg_binlog_event_typeフィールドに BEFORE_UPDATE 値と AFTER_UPDATE 値を使用できます。
Hologres テーブルのバイナリログは、特殊な行指向テーブルと考えることができます。ビジネス テーブルのバイナリ ロギング機能を有効にすると、テーブルの行指向テーブルが作成されます。行指向テーブルでは、hg_binlog_lsn フィールドがキーで、ビジネス テーブルのユーザー定義フィールドと hg_binlog_event_type フィールドおよび hg_binlog_timestamp_us フィールドが値です。バイナリログのフィールドは、強力なスキーマで固定されています。ユーザー定義フィールドの順序は、ビジネス テーブルの DDL 文で定義されている順序と同じです。そのため、バイナリ ロギング機能を有効にするテーブルには、行指向ストレージ モードまたは行と列のハイブリッド ストレージ モードを使用することをお勧めします。これにより、バイナリログの読み取りパフォーマンスが向上します。
バイナリロギングを有効にする
デフォルトでは、Hologres テーブルのバイナリロギングは無効になっています。テーブルプロパティ binlog.level と binlog.ttl を構成することで、Hologres テーブルのこの機能を有効にできます。次のサンプルコードは、バイナリロギングを有効にする方法の例を示しています。テーブル作成のパラメータの詳細については、「概要」をご参照ください。
理論的には、列指向テーブルのバイナリロギングのオーバーヘッドは、行指向テーブルのオーバーヘッドよりも高くなります。テーブルが頻繁に更新され、テーブルのバイナリロギングを有効にする場合は、テーブルに行指向ストレージモードを使用することをお勧めします。
Hologres V2.1 以降でサポートされている構文:
Hologres 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 を指定します。単位:秒。 );すべての Hologres バージョンでサポートされている構文:
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'); -- binlog.level プロパティを構成して、バイナリロギングを有効にします。 call set_table_property('test_message_src', 'binlog.ttl', '86400'); -- バイナリログの TTL を指定します。単位:秒。 commit;
次の表に、プロパティについて説明します。
プロパティ | 説明 |
| バイナリロギングを有効にするかどうかを指定します。有効な値:
|
| バイナリログの TTL。単位:秒。デフォルト値:2592000(30 日)。 |
ビジネス要件に基づいて既存のテーブルのバイナリロギング機能を構成する
Hologres V1.1 以降では、ビジネス要件に基づいて既存のテーブルのバイナリロギングを有効または無効にすることができます。既存のテーブルのバイナリロギングを有効にするために、テーブルを再作成する必要はありません。また、バイナリログの TTL を指定して、特定の期間バイナリログを保持することもできます。これは、特定のビジネスシナリオでの制限付き保存期間の要件を満たします。
このセクションで説明する操作は、Hologres V1.1 以降にのみ適用されます。Hologres インスタンスのバージョンが V1.1 より前の場合は、Hologres コンソールで Hologres インスタンスを手動でアップグレードするか、技術サポートを受けるために Hologres DingTalk グループに参加してください。 Hologres コンソールで Hologres インスタンスを手動でアップグレードする方法の詳細については、「手動アップグレード(ベータ)」をご参照ください。技術サポートを受ける方法の詳細については、「Hologres のオンラインサポートを受ける」をご参照ください。
バイナリロギングを有効にする
次の文を実行して、既存のテーブルのバイナリロギングを有効にし、バイナリログの TTL を指定できます。
-- binlog.level プロパティを構成して、バイナリロギングを有効にします。 begin; call set_table_property('<table_name>', 'binlog.level', 'replica'); commit; -- binlog.ttl プロパティを構成して、バイナリログの TTL を指定します。単位:秒。 begin; call set_table_property('<table_name>', 'binlog.ttl', '2592000'); commit;table_name パラメータは、バイナリロギングを有効にするテーブルの名前を指定します。
バイナリロギングを無効にする
次の文を実行して、テーブルのバイナリロギングを無効にできます。
-- binlog.level プロパティを構成して、バイナリロギングを無効にします。 begin; call set_table_property('<table_name>', 'binlog.level', 'none'); commit;table_name パラメータは、バイナリロギングを無効にするテーブルの名前を指定します。
バイナリログの TTL を変更する
次の文を実行して、テーブルのバイナリログの TTL を変更できます。このようにして、ビジネス要件に基づいて適切なログ保存期間を指定できます。
説明Hologres V1.3.24 以降では、ビジネス要件に基づいて子テーブルのバイナリログの TTL を構成できます。子テーブルのバイナリログの 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 関数を使用してクエリを実行できます。構文:
-- シャードの最も古いバイナリログをクエリします。
SELECT * FROM hg_get_binlog_cursor('<table_name>','OLDEST',<shard_id>);
-- シャードの最新のバイナリログをクエリします。
SELECT * FROM hg_get_binlog_cursor('<table_name>','LATEST',<shard_id>);次のステートメントは例を示しています。
SELECT * FROM hg_get_binlog_cursor('test_message_src','OLDEST',0);次の図は、クエリ結果を示しています。

バイナリログの LSN に基づいてバイナリログのタイムスタンプをクエリするバイナリログの LSN
hg_get_binlog_cursor_by_lsn 関数を使用して、バイナリログのタイムスタンプをクエリできます。この関数は、LSN がクエリで指定された値以上である最初のバイナリログのタイムスタンプを返します。LSN が無効な場合、この関数は hg_binlog_timestamp_us フィールドの値として現在のタイムスタンプを返します。構文:
SELECT * FROM hg_get_binlog_cursor_by_lsn('<table_name>',<lsn>,<shard_id>);-- BIGINT タイプの LSN を指定します。次のステートメントは例を示しています。
SELECT * FROM hg_get_binlog_cursor_by_lsn('test_message_src',152,0);次の図は、クエリ結果を示しています。

バイナリログのタイムスタンプに基づいてバイナリログの LSN をクエリするそのタイムスタンプに基づくバイナリログ
hg_get_binlog_cursor_by_timestamp 関数を使用して、バイナリログの LSN をクエリできます。この関数は、タイムスタンプ値がクエリで指定された値以上である最初のバイナリログの LSN を返します。タイムスタンプが最新の場合、この関数は hg_binlog_timestamp_us フィールドの値として現在のタイムスタンプを返し、hg_binlog_lsn フィールドの値として次のデータレコードに割り当てられる LSN を返します。構文:
クエリで指定されたタイムスタンプが現在の時刻より後の場合、「get binlog cursor in future time」というエラーメッセージが返されます。now() 関数を使用して現在の時刻をクエリできます。
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 バイナリログをコンシュームできます。詳細については、以下のトピックをご参照ください。
バイナリロギングが有効になっているテーブルを確認する
次の 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関数を使用して、データのストレージサイズとバイナリログのストレージサイズを含む、テーブルのストレージの詳細をクエリできます。詳細については、「テーブルとデータベースのストレージサイズのクエリ」Topic の「テーブルのストレージの詳細をクエリする」をご参照ください。
テーブル関連の DML 文のバイナリロギングを無効にする
Grand Unified Configuration(GUC)パラメータを使用して、テーブルのデータ操作言語(DML)文のバイナリロギングを無効にできます。DML 文の前に次の SET コマンドを追加し、セッションレベルでコミットする必要があります。
-- セッションレベルで次の SET コマンドを実行します。
SET hg_experimental_generate_binlog=off;