<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>馬 雪テイ (Xueting Ma) &#8211; SRA OSS Tech Blog</title>
	<atom:link href="https://www.sraoss.co.jp/tech-blog/author/ma/feed/index.xml" rel="self" type="application/rss+xml" />
	<link>https://www.sraoss.co.jp/tech-blog/</link>
	<description>OSS専門の技術ブログ。PostgreSQL、Zabbixを中心に10種類以上のOSSの解説、アップデート情報、運用ヒントを提供。</description>
	<lastBuildDate>Wed, 04 Nov 2026 06:55:48 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2018/07/blog-icon-150x150.png</url>
	<title>馬 雪テイ (Xueting Ma) &#8211; SRA OSS Tech Blog</title>
	<link>https://www.sraoss.co.jp/tech-blog/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Change Data Capture入門：Debezium で PostgreSQL のデータを解放しよう！</title>
		<link>https://www.sraoss.co.jp/tech-blog/pgsql/debezium-postgresql-cdc-introduction/</link>
		
		<dc:creator><![CDATA[馬 雪テイ (Xueting Ma)]]></dc:creator>
		<pubDate>Wed, 17 Dec 2025 00:27:24 +0000</pubDate>
				<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[CDC]]></category>
		<category><![CDATA[Debezium]]></category>
		<category><![CDATA[Kafka]]></category>
		<category><![CDATA[WAL]]></category>
		<guid isPermaLink="false">https://www.sraoss.co.jp/tech-blog/?p=19017</guid>

					<description><![CDATA[この記事は SRA Advent Calendar 2025 23日目の記事です。 PostgreSQL が基幹系 DB などに採用されるケースが増えるとともに、そのデータを外部にニアリアルタイムで取り出して、負荷分散や ...]]></description>
										<content:encoded><![CDATA[<p>この記事は <a href="https://qiita.com/advent-calendar/2025/sra" target="_blank" rel="noopener">SRA Advent Calendar 2025</a> 23日目の記事です。</p>
<p>PostgreSQL が基幹系 DB などに採用されるケースが増えるとともに、そのデータを外部にニアリアルタイムで取り出して、負荷分散や分析などの用途で利活用したいケースが増えています。</p>
<p>このようなニーズに対して、Debezium は PostgreSQL の WAL をデコードし、テーブルの変更を自動検知・配信できる OSS です。本記事では、その仕組みや構成例、運用上の注意点を紹介します。</p>
<p>&nbsp;</p>
<p><span id="more-19017"></span></p>
<h2>はじめに — なぜ CDC が必要なのか</h2>
<p data-start="228" data-end="336">近年、システム連携や分析基盤においてリアルタイム性が求められる場面が増えてきました。しかし、既存の RDB では日次バッチによるデータ同期が一般的であり、以下の課題がしばしば発生します。</p>
<ul>
<li data-start="340" data-end="357">リアルタイム処理が困難：既存 DB に負荷がかかり、追加業務が性能面で NG</li>
<li data-start="360" data-end="390">データ鮮度不足：日次バッチ連携では顧客要求を満たせない</li>
<li data-start="393" data-end="414">過負荷状態：OLTP/OLAP が同居し、既存システムの性能限界</li>
<li data-start="417" data-end="440">データサイロ化：複数 DB に分断され、分析用にデータを集約しづらい</li>
</ul>
<p data-start="442" data-end="488">そこで注目されているのが <strong data-start="455" data-end="484">CDC (Change Data Capture)</strong> です。</p>
<h2 data-start="442" data-end="488">CDC（Change Data Capture）とは</h2>
<p>CDC（Change Data Capture）とは、データベースへの変更を観察し、その変更内容を他のシステムへレプリケーション可能な形式で取り出すためのプロセスです。例えば PostgreSQL で発生した更新内容（INSERT / UPDATE / DELETE など）を取得し、分析用途として <a href="https://www.elastic.co/jp/elasticsearch" target="_blank" rel="noopener">Elasticsearch</a> や別のデータベースへ投入するといった利用が可能です。</p>
<p>CDC 製品は、同期速度が比較的高速であることを特徴としており、数秒オーダー以下で他システムに反映できるものが一般的です。日次バッチによる連携とは異なり、データ鮮度を保ちながらシステム間連携を実現できます。</p>
<p>また、PostgreSQL 本体には、物理レプリケーションおよび論理レプリケーション機能が標準で備わっています。これらは送信元と送信先のいずれも PostgreSQL 同士であることが前提です。一方、CDC のアプローチでは、送信元が PostgreSQL であっても、送信先は多様な選択肢があります。</p>
<p data-start="534" data-end="677">そのため、異種データベース間のリアルタイム同期や分析基盤へのデータ配信など、より柔軟なデータ活用が可能になります。</p>
<h3 data-start="534" data-end="677">CDC 実現後のイメージ</h3>
<p><strong>① リアルタイム連携による新業務の実現</strong></p>
<p>既存システムの DB でデータ更新が発生すると、その変更が即座に新しい DB へ反映されます。そのため、新 DB 側では最新データを用いた高リアルタイムな業務を実行できます。</p>
<p><img fetchpriority="high" decoding="async" class="wp-image-19068 aligncenter" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/0c2c3fa08d7d60bafd871f1b0cc6230e-300x135.jpg" alt="" width="347" height="156" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/0c2c3fa08d7d60bafd871f1b0cc6230e-300x135.jpg 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/0c2c3fa08d7d60bafd871f1b0cc6230e-304x137.jpg 304w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/0c2c3fa08d7d60bafd871f1b0cc6230e-282x127.jpg 282w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/0c2c3fa08d7d60bafd871f1b0cc6230e.jpg 608w" sizes="(max-width: 347px) 100vw, 347px" /></p>
<p><strong>② バッチ処理の削減・負荷分散</strong></p>
<p>日次の大量バッチ処理は、システム負荷の集中や業務運用の複雑化の原因になるケースがあります。CDC に置き換えることで、これらの課題を解消できます。</p>
<p><img decoding="async" class="size-medium wp-image-19069 aligncenter" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/d86065dc46f1cf3c2e23b874e7bdf1d3-300x111.jpg" alt="" width="300" height="111" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/d86065dc46f1cf3c2e23b874e7bdf1d3-300x111.jpg 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/d86065dc46f1cf3c2e23b874e7bdf1d3-304x112.jpg 304w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/d86065dc46f1cf3c2e23b874e7bdf1d3-282x104.jpg 282w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/d86065dc46f1cf3c2e23b874e7bdf1d3.jpg 533w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p><strong>③ 既存 DB のオフロードと分析基盤の強化</strong></p>
<p>CDCを用いて、参照系や分析系の処理を別 DB へ切り離す構成も可能です。</p>
<p><img decoding="async" class=" wp-image-19070 aligncenter" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/262285e7be0be5ea013031265d6b8d1a-300x106.jpg" alt="" width="314" height="111" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/262285e7be0be5ea013031265d6b8d1a-300x106.jpg 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/262285e7be0be5ea013031265d6b8d1a-304x108.jpg 304w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/262285e7be0be5ea013031265d6b8d1a-282x100.jpg 282w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/262285e7be0be5ea013031265d6b8d1a.jpg 528w" sizes="(max-width: 314px) 100vw, 314px" /></p>
<p><strong>④ マルチデータストアの連携</strong></p>
<p>CDC により、異なるDBから必要なデータだけ抽出し統合することができます。</p>
<p><img loading="lazy" decoding="async" class=" wp-image-19071 aligncenter" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/61e4089dfc90821338bf69c07854e849-300x83.jpg" alt="" width="336" height="93" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/61e4089dfc90821338bf69c07854e849-300x83.jpg 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/61e4089dfc90821338bf69c07854e849-304x84.jpg 304w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/61e4089dfc90821338bf69c07854e849-282x78.jpg 282w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/61e4089dfc90821338bf69c07854e849.jpg 742w" sizes="auto, (max-width: 336px) 100vw, 336px" /></p>
<h3>CDC の実現方法</h3>
<p>CDC には以下2つの方式があります。</p>
<p><strong>① トランザクションログベース：</strong>データベースのトランザクションログ（WAL）に記録された変更内容をデコードし、論理的な変更情報として抽出して、ターゲット側のデータベースへ反映する方式です。</p>
<p><strong>② Trigger ベース：</strong>データベースのテーブルにトリガーを設定し、変更を検知して別のログテーブルへ記録し、その内容を定期的にターゲット DB へ反映する方式です。</p>
<p>なお、本記事で紹介する Debezium はトランザクションログベース方式を採用しています。</p>
<h2>Debezium について</h2>
<p data-start="86" data-end="247"><a href="https://debezium.io/" target="_blank" rel="noopener">Debezium</a> は、データベースの変更データをリアルタイムに取得し、配信することができるオープンソースの CDC プラットフォームです。複数種類のデータベースに対応しており、バージョン 3.3 における Source Connector 対応一覧は以下の通りです。</p>
<ul>
<li>MySQL</li>
<li>MariaDB</li>
<li>MongoDB</li>
<li>PostgreSQL</li>
<li>Oracle</li>
<li>SQL Server</li>
<li>DB2</li>
<li>Cassandra</li>
<li>Vitess</li>
<li>Spanner</li>
<li>Informix</li>
</ul>
<p data-start="249" data-end="356">ライセンスは Apache License 2.0 で公開されており、主に Red Hat が中心となって開発を進めています。また、Debezium プロジェクトは <a href="https://www.commonhaus.org/" target="_blank" rel="noopener">Commonhaus Foundation</a> に参加しており、広くコミュニティによって支えられています。</p>
<p data-start="358" data-end="584">Debezium は単体で動作するのではなく、Apache Kafka と連携して CDC を実現する仕組みになっています。各データベースからの変更イベントは Debezium の Source Connector によって取得され、Kafka を経由して配信されます。その後、Sink Connector を介して Elasticsearch や JDBC、Data Warehouse など、さまざまなシステムへ転送可能です。</p>
<p><img loading="lazy" decoding="async" class="wp-image-19060 aligncenter" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/debezium-architecture-300x68.png" alt="" width="869" height="197" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/debezium-architecture-300x68.png 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/debezium-architecture-1024x233.png 1024w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/debezium-architecture-768x175.png 768w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/debezium-architecture-1536x349.png 1536w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/debezium-architecture-304x69.png 304w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/debezium-architecture-282x64.png 282w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/debezium-architecture.png 1712w" sizes="auto, (max-width: 869px) 100vw, 869px" /></p>
<p style="text-align: center;"><a href="https://debezium.io/documentation/reference/stable/architecture.html" target="_blank" rel="noopener">https://debezium.io/documentation/reference/stable/architecture.html</a></p>
<h2>Kafka について</h2>
<p data-start="100" data-end="166">CDC で取得した変更データは、どのようにして外部のシステムへ届けられるのでしょうか？その中継地点となるのが <a href="https://kafka.apache.org/" target="_blank" rel="noopener">Kafka（Apache Kafka）</a>です。</p>
<p data-start="202" data-end="248">Kafka は、以下の特徴を持つオープンソースの分散メッセージングシステムです。</p>
<ul>
<li data-start="252" data-end="283">送られてきたメッセージを蓄積し、別システムへ渡す仕組み</li>
<li data-start="286" data-end="310">複数ノード構成による高いスケーラビリティ</li>
<li data-start="313" data-end="338">送達保証（確実に相手に届ける仕組み）がある</li>
</ul>
<h3>Kafka の構成要素</h3>
<p>Kafka の主要な構成要素は以下の通りです。</p>
<ul>
<li>Producer : メッセージの送信元（例：Debezium、アプリケーション等）</li>
<li>Broker : Kafka クラスタのサーバ群。Topic を保持し、データを分散管理</li>
<li>Topic : メッセージの入れ物。RDB 連携では「テーブル 1つ＝Topic 1つ」が一般的</li>
<li>Consumer : メッセージの取得側（分析基盤やアプリなど）</li>
</ul>
<p><img loading="lazy" decoding="async" class=" wp-image-19072 aligncenter" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/abd83c9003ad14a845ccadf6d8adf77b-300x118.jpg" alt="" width="620" height="244" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/abd83c9003ad14a845ccadf6d8adf77b-300x118.jpg 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/abd83c9003ad14a845ccadf6d8adf77b-1024x402.jpg 1024w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/abd83c9003ad14a845ccadf6d8adf77b-768x302.jpg 768w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/abd83c9003ad14a845ccadf6d8adf77b-304x119.jpg 304w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/abd83c9003ad14a845ccadf6d8adf77b-282x111.jpg 282w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/abd83c9003ad14a845ccadf6d8adf77b.jpg 1337w" sizes="auto, (max-width: 620px) 100vw, 620px" /></p>
<p data-start="187" data-end="263">そして、Kafka ではメッセージを格納する単位である Topic をさらに複数のパーティションに分割して管理します。</p>
<p data-start="265" data-end="273">こうすることで、</p>
<ul>
<li data-start="277" data-end="318">1つの Topic でも複数の Broker（Kafka サーバ）で分散処理できる</li>
<li data-start="321" data-end="345">大量のメッセージが来てもスケールアウトで対応可能</li>
<li data-start="348" data-end="386">Consumer は複数パーティションを並列処理できるため、高速に処理できる</li>
</ul>
<p data-start="388" data-end="401">というメリットがあります。</p>
<p style="text-align: left;"><img loading="lazy" decoding="async" class=" wp-image-19073 aligncenter" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/b1b08ef2993886bcc1c39f5e78a5b13b-300x123.jpg" alt="" width="632" height="259" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/b1b08ef2993886bcc1c39f5e78a5b13b-300x123.jpg 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/b1b08ef2993886bcc1c39f5e78a5b13b-1024x419.jpg 1024w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/b1b08ef2993886bcc1c39f5e78a5b13b-768x314.jpg 768w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/b1b08ef2993886bcc1c39f5e78a5b13b-304x124.jpg 304w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/b1b08ef2993886bcc1c39f5e78a5b13b-282x115.jpg 282w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/b1b08ef2993886bcc1c39f5e78a5b13b.jpg 1447w" sizes="auto, (max-width: 632px) 100vw, 632px" /></p>
<h2>Kafka Connect について</h2>
<p data-start="22" data-end="296">Kafka Connect は、Kafka と外部システムを容易に連携するためのデータ連携フレームワークです。</p>
<p data-start="22" data-end="296">Kafka Connect では、接続対象に応じたコネクタプラグインを利用します。例えば、PostgreSQL から Kafka へ変更データを取り込む場合には PostgreSQL 用の Source Connector を利用します。逆に、Kafka に蓄積されたデータを Elasticsearch やデータウェアハウス、RDB などへ転送する場合には Sink Connector を使用します。</p>
<p data-start="298" data-end="437">Debezium は、Kafka Connect で利用できるコネクタプラグインの集合です。PostgreSQL、MySQL、Oracle、MongoDB など、さまざまなデータベースの変更データ取得を実現する Source Connector を提供しています。</p>
<p data-start="439" data-end="537">ポイントとして、Debezium は Kafka Connect 上で動作する Source Connector の 1つであり、Kafka 本体とは独立したコンポーネントです。</p>
<h2><b>Debezium</b><b> 利用時の </b><b>PostgreSQL </b><b>から </b><b>Kafka </b><b>へのデータの流れ</b></h2>
<h3><b>Debezium </b><b>による </b><b>PostgreSQL</b><b>からのデータ取得</b></h3>
<p>Debezium は、PostgreSQL の<a href="https://www.sraoss.co.jp/PostgreSQL/Manual/document/17/logicaldecoding.html" target="_blank" rel="noopener">ロジカルデコーディング</a> 機能を利用して、データベース内で発生した変更内容（INSERT／UPDATE／DELETE など）を取得します。</p>
<p>ロジカルデコーディングは、WAL に記録された変更データを外部システムでも読める形式に変換して出力する仕組みです。PostgreSQL の WAL は元々クラッシュリカバリや物理レプリケーションのための内部形式で保存されていますが、ロジカルデコーディングを利用することで、論理的な変更イベントとして抽出できます。</p>
<p data-start="398" data-end="500">WAL の変換形式は Output Plugin によって決まります。Debezium では、以下の 2 種類のプラグインが利用可能です。</p>
<div class="TyagGW_tableContainer">
<div class="group TyagGW_tableWrapper flex w-fit flex-col-reverse" tabindex="-1">
<table class="w-fit min-w-(--thread-content-width)" data-start="614" data-end="765">
<thead data-start="614" data-end="629">
<tr data-start="614" data-end="629">
<th data-start="614" data-end="623" data-col-size="sm">Plugin</th>
<th data-start="623" data-end="629" data-col-size="sm">説明</th>
</tr>
</thead>
<tbody data-start="648" data-end="765">
<tr data-start="648" data-end="702">
<td data-start="648" data-end="663" data-col-size="sm"><strong data-start="650" data-end="662">pgoutput</strong></td>
<td data-col-size="sm" data-start="663" data-end="702">PostgreSQL 標準形式。論理レプリケーションに使用される</td>
</tr>
<tr data-start="703" data-end="765">
<td data-start="703" data-end="721" data-col-size="sm"><a href="https://github.com/debezium/postgres-decoderbufs" target="_blank" rel="noopener"><strong data-start="705" data-end="720">decoderbufs</strong></a></td>
<td data-col-size="sm" data-start="721" data-end="765">Debezium 独自形式</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>本記事では、一般的な利用例として pgoutput を前提に説明していきます。</p>
<h3><b>CDC </b><b>アーキテクチャの全体像</b></h3>
<p>ここでは、Debezium を利用して PostgreSQL の変更データを Kafka へ取り込み、さらに下流システムへ連携するまでの全体的なデータフローを説明します。</p>
<p><img loading="lazy" decoding="async" class="wp-image-19065 aligncenter" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/1ffae156db23a9885156653900809da9-300x145.jpg" alt="" width="734" height="355" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/1ffae156db23a9885156653900809da9-300x145.jpg 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/1ffae156db23a9885156653900809da9-1024x494.jpg 1024w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/1ffae156db23a9885156653900809da9-768x371.jpg 768w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/1ffae156db23a9885156653900809da9-304x147.jpg 304w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/1ffae156db23a9885156653900809da9-282x136.jpg 282w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/1ffae156db23a9885156653900809da9.jpg 1326w" sizes="auto, (max-width: 734px) 100vw, 734px" /></p>
<p data-start="22" data-end="68">まず、PostgreSQL 内部で変更データがどのように処理されるかについて解説します。</p>
<p data-start="70" data-end="144">PostgreSQL 内部の walsender プロセス が WAL を読み込み、変更内容をロジカルデコード対象として取り出します。</p>
<p>次に、読み取った WAL の内容をデコードしてトランザクション単位で管理します。PostgreSQL では、変更内容をただ順番に処理するわけではなく、内部の ReorderBuffer という仕組みを利用して、1つのトランザクション内の変更をまとめて保持します。</p>
<p>その後、デコードされた変更は pgoutput のコールバック関数群によって処理されます。</p>
<ul>
<li data-start="619" data-end="640">begin_cb : トランザクション開始</li>
<li data-start="646" data-end="691">change_cb : 変更イベント（INSERT / UPDATE / DELETEなど）</li>
<li data-start="697" data-end="719">commit_cb : トランザクション終了</li>
</ul>
<p>そして、COMMIT が発生すると pgoutput はトランザクション全体を 1つの論理イベントとしてまとめ、walsender を通して外部へ送信します。</p>
<p data-start="519" data-end="596">Debezium Source Connector は、PostgreSQL から受け取った変更イベントを外部システムで扱いやすい形式に変換します。ここで変更イベントが JSON 形式のメッセージとして Kafka に送信されます。</p>
<p data-start="779" data-end="854">Kafka は受け取ったメッセージを Topic に格納します。Topic は用途やスケーラビリティに応じて複数のパーティションに分割することができます。</p>
<p data-start="779" data-end="854">最後に、Kafka 上のデータは、その後 Kafka Streams や Sink Connector によって下流システムへ転送されます。</p>
<h3><b>INSERT / UPDATE / DELETE </b><b>イベントの出力例</b></h3>
<h4>INSERT イベント（op=c）</h4>
<pre>INSERT INTO customers (id, first_name, last_name, email)VALUES (4, 'Debe', 'Test', 'd@example.com');

Key:
{"id": 4}
Value:
{
  "before": null,
  "after": {"id": 4, "first_name": "Debe", "last_name": "Test", "email": "d@example.com"},
  "op": "c",
  "source": {"db": "inventory", "schema": "public", "table": "customers", "lsn": 27013880, "txId": 1069},
  "ts_ms": 1760601142773
}</pre>
<h4>UPDATE イベント（op=u）</h4>
<pre>UPDATE customers SET last_name = ‘Updated’ WHERE id = 4;

Key:
{"id": 4}
Value:
{
  "before": {"id": 4, "first_name": "Debe", "last_name": "Test", "email": "d@example.com"},
  "after":  {"id": 4, "first_name": "Debe", "last_name": "Updated", "email": "d@example.com"},
  "op": "u",
  "source": {"db": "inventory", "schema": "public", "table": "customers", "lsn": 27013912, "txId": 1071},
  "ts_ms": 1760601144801
}</pre>
<h4>DELETE イベント（op=d）</h4>
<pre>DELETE FROM customers WHERE id = 4;

Key:
{"id": 4}
Value:
{
  "before": {"id": 4, "first_name": "Debe", "last_name": "Updated", "email": "d@example.com"},
  "after": null,
  "op": "d",
  "source": {"db": "inventory", "schema": "public", "table": "customers", "lsn": 27013944, "txId": 1072},
  "ts_ms": 1760601145902
}</pre>
<h3><b>初期同期スナップショット</b></h3>
<p data-start="46" data-end="167">Debezium の初期同期スナップショットとは、CDC を開始する際に、対象テーブルの既存データを整合性の取れた状態で一括取得する処理です。CDC 起動時の最初のステップとして実行され、変更履歴と現在のデータを正しく同期させるために利用されます。</p>
<h4 data-start="169" data-end="176">仕組み</h4>
<ul>
<li data-start="180" data-end="234">CDC 対象のテーブルに対して全件取得の SELECT クエリを実行し、既存データを取得する</li>
<li data-start="237" data-end="345">このスナップショット SELECT と同時並行で行われる更新処理は WAL に記録されるため、<br data-start="289" data-end="292" />スナップショット取得が完了した後、WAL の内容を追いかけることでデータ整合性を維持する</li>
</ul>
<p data-start="347" data-end="397">スナップショット処理が正常に完了すると、以降は通常の CDC に移行します。</p>
<h4 data-start="169" data-end="176">初期同期イベント<b>（</b><b>op=r</b><b>）</b></h4>
<pre>{
  "before": null,
  "after": { "id": 1, "first_name": "Sally", "last_name": "Thomas", "email": "sally.thomas@example.com" },
  "op": "r",
  "source": {
    "version": "3.2.3.Final",
    "connector": "postgresql",
    "name": "dbserver1",
    "snapshot": "first",
    "db": "inventory",
    "schema": "public",
    "table": "customers"
  },
  "ts_ms": 1759731208613
}</pre>
<h2><b>アーキテクチャなどから考える </b><b>Debezium </b><b>の注意点</b></h2>
<p>ここでは、アーキテクチャを踏まえた Debezium の運用上のポイントを説明します。</p>
<h3><b>PostgreSQL </b><b>論理デコードの制約と </b><b>Debezium </b><b>の関係</b></h3>
<h4>DDL は CDC 対象外</h4>
<p>DDL（CREATE / ALTER TABLE など）は CDC の対象外です。つまり、テーブル構造の変更は Debezium では検知できません。スキーマ変更を監視したい場合は、別の仕組みを組み合わせる必要があります。</p>
<h4>REPLICA IDENTITY について</h4>
<p>PostgreSQL では、論理レプリケーションやロジカルデコードを行う際に <a href="https://www.sraoss.co.jp/PostgreSQL/Manual/document/17/sql-altertable.html#SQL-ALTERTABLE-REPLICA-IDENTITY" target="_blank" rel="noopener">REPLICA IDENTITY</a> という設定が重要になります。これは、UPDATE や DELETE が発生した際にどの行が変更されたかを特定するための仕組みです。</p>
<p>この設定が DEFAULT のままで、かつ主キーが存在しないテーブルの場合、PostgreSQL は before値（旧値）を取得できず、行の特定もできません。そのため、該当テーブルを publication に含めている場合、UPDATE や DELETE を実行した時点でエラーとなります。</p>
<p>Debezium もこの PostgreSQL の制約に従って動作するため、主キーのないテーブルでは INSERT のみ取得可能で、UPDATE / DELETE は配信されないという制限があります。</p>
<p data-start="33" data-end="55">対策としては、次の 2 つの方法があります。</p>
<p data-start="57" data-end="109">1つ目は、主キーまたは一意キーを設定することです。これが最も自然であり、安全な方法です。</p>
<p data-start="111" data-end="258">2つ目は、REPLICA IDENTITY FULL を指定する方法です。この設定により、UPDATE や DELETE の実行時に全列の before 値を出力できるようになります。ただし、WAL の出力量が増加するため、性能への影響に注意が必要です。</p>
<h4>WAL デコードは対象のDBクラスタのWAL全てに実施される</h4>
<p data-start="34" data-end="268">Debezium の CDC 処理では、PostgreSQL の WAL を読み取り、変更内容をデコードします。このとき、publication で対象テーブルを絞り込んでいても、WAL の読取りとデコード処理は DB クラスタ全体に対して実行される点に注意が必要です。つまり、CDC 対象外のテーブルで大量に更新が発生しても、それらの WAL を含めてデコード処理が行われるため、CDC の対象データ量とは関係なく負荷が高くなる可能性があります。</p>
<p data-start="270" data-end="522">また、CDC 接続数が増えるほど、各接続が独立して WAL を読み取るため、WAL デコードの負荷も増加します。そのため、CDC 接続は最小限に保つ、publication を適切に管理する、負荷監視を行うといった設計・運用が重要です。更新量が少なくてもワークロードによって負荷が高まるケースがあるため、本番データベースでの安定運用には継続的な監視とチューニングが不可欠です。</p>
<h4>生成列の対応状況</h4>
<p data-start="36" data-end="237">PostgreSQL には<a href="https://www.sraoss.co.jp/PostgreSQL/Manual/document/17/ddl-generated-columns.html" target="_blank" rel="noopener">生成列（generated column）</a>と呼ばれる機能があり、他の列の値をもとに自動計算される列を定義できます。生成列には、計算結果をテーブルに保持する STORED 型 と、値を保存せず SELECT 時に都度計算して返す VIRTUAL 型 の 2 種類があります。なお、VIRTUAL 型は PostgreSQL 18 から導入された機能です。</p>
<p data-start="239" data-end="564">しかし、CDC において生成列を扱う場合は注意が必要です。PostgreSQL 12〜17 では、STORED 型の生成列であっても論理デコードの対象外であり、Debezium では値を取得できません。そのため、生成列を含むテーブルを CDC 対象にする場合は PostgreSQL 18 以降の利用が前提となります。</p>
<p data-start="239" data-end="564">PostgreSQL 18 では、<code data-start="443" data-end="470">publish_generated_columns</code> オプションが追加され、STORED 型の生成列が論理デコード対象として出力されるようになりました。この変更により、Debezium でも自動計算された列の値を取得可能となります。</p>
<p data-start="566" data-end="710">ただし注意すべき点として、VIRTUAL 型の生成列は値をディスクに保存しないため、論理デコードの対象外となり、Debezium では取得できません。つまり、Debezium で扱える生成列は STORED 型に限定されるため、スキーマ設計時に意識しておく必要があります。</p>
<h3><b>Commit </b><b>単位でまとめて送信</b></h3>
<p data-start="56" data-end="221">Debezium を利用する場合、PostgreSQL 側ではトランザクションの COMMIT 時にイベントを送信します。そのため、たとえば  1 つのトランザクションで数十万件の更新や削除を行う場合、COMMIT 完了まで変更イベントが Kafka へ送られず、反映が遅延する可能性があります。</p>
<p data-start="223" data-end="352">また、PostgreSQL 14 で導入された、実行中の大規模トランザクションをストリーム送信できる機能（トランザクション完了を待たずに途中の変更データを順次送信する仕組み）は、Debezium ではサポートされていません。</p>
<p data-start="354" data-end="469">以下は、<code data-start="358" data-end="385">pg_stat_replication_slots</code> の確認結果で、Debezium スロットでは <code data-start="412" data-end="425">stream_txns</code> および <code data-start="430" data-end="444">stream_bytes</code> が常に 0 になっており、ストリーム送信が行われていないことが確認できます。</p>
<pre data-start="354" data-end="469">SELECT slot_name, spill_txns, spill_bytes, stream_txns, stream_bytes,
total_txns, total_bytes
FROM pg_stat_replication_slots
WHERE slot_name='debezium_slot';

 slot_name | spill_txns | spill_bytes | stream_txns | stream_bytes | total_txns | total_bytes
----------------+------------+-------------+--------------+---------------+-------------+------------
debezium_slot | 1 | 135200000 | 0 | 0 | 91 | 274706394

</pre>
<h3><b>Debezium × Kafka </b><b>における「</b><b>1</b><b>トピック</b><b>1</b><b>パーティション」問題</b></h3>
<p>Debezium では、1 テーブルにつき 1 トピックがデフォルト動作となります。</p>
<p>トピック名は通常、以下の形式で自動生成されます。</p>
<pre>&lt;serverName&gt;.&lt;schemaName&gt;.&lt;tableName&gt;</pre>
<p data-start="248" data-end="398">また、このトピックに割り当てられる Kafka のパーティション数はデフォルトで 1 です。Kafka では 同じパーティション内でのみメッセージ順序が保証されるため、パーティション数を増やしてトピックを分割すると、同一行に対する更新順序が乱れる可能性があります。</p>
<p data-start="400" data-end="490">この理由から、CDC の特性を考慮すると、Debezium を利用する際に Kafka トピックのパーティション数を増やしてスケールアウトする構成は基本的に推奨されません。</p>
<p data-start="492" data-end="553">※ここでいう「パーティション」は Kafka の用語であり、PostgreSQL のパーティションテーブルとは無関係です。</p>
<h3><b>文字コードが </b><b>UTF-8 </b><b>以外だと </b><b>Debezium </b><b>がエラー発生</b></h3>
<p data-start="69" data-end="184">Debezium は PostgreSQL に接続する際、JDBC 経由で UTF-8 のセッションを使用します。初回のスナップショット取得時の SELECT も同じ UTF-8 セッションで実行されます。そのため、データベース側の文字コードが UTF-8 以外に設定されている場合、スナップショット処理中に文字コード変換エラーが発生する可能性があります。</p>
<pre>Caused by: org.postgresql.util.PSQLException: ERROR: invalid byte sequence for encoding "UTF8": 0x80</pre>
<p data-start="277" data-end="376">Debezium はこのエラーを検知すると、スナップショット処理を一旦中断して自動リトライに入りますが、文字コードの不一致が解消されない限り、処理は正常に再開されません。</p>
<p>そのため、使うときには、データベースもクライアントも UTF-8 で統一することが必要となります。これが最も安全で、Debezium が安定して動作する基本条件になります。</p>
<h2>まとめ</h2>
<p data-start="75" data-end="179">本記事では、PostgreSQL のデータをリアルタイムに取得して外部へ配信するための技術、CDC（Change Data Capture） と Debezium について紹介しました。</p>
<ul>
<li data-start="183" data-end="225">CDC によって、異種間データベース間のリアルタイムレプリケーションが可能になる</li>
<li data-start="228" data-end="286">Debezium はオープンソースの CDC 基盤であり、基本的に Apache Kafka と連携して動作する</li>
<li data-start="289" data-end="371">Debezium PostgreSQL Source Connector は PostgreSQL の論理デコードを利用して DB の変更を取得する</li>
<li data-start="374" data-end="414">CDC には仕様制約があるため、利用環境やワークロードに応じて事前検証が重要</li>
</ul>
<p data-start="416" data-end="530">Debezium を活用することで、既存 DB への影響を抑えつつ、リアルタイムなデータ活用基盤を実現できます。導入の際は、論理デコードの制約や文字コード、トランザクション特性などに注意しながら進めてください。</p>
<p data-start="416" data-end="530"><div>
<a href="https://www.sraoss.co.jp/prod_serv/support/pgsql-mainte/?utm_source=sraoss-techblog&utm_medium=referral&utm_campaign=under-article-pgsql" rel="noopener" style="color:initial;" target="_blank" class="no-ext"></p>
<div style="background-color:#DAEFF6; padding:20px; border-radius:8px; text-align:center;">
SRA OSSでは、PostgreSQL/Pgpool-II のサポートを提供しております。<br />
詳しくは<strong style="color:#2581c4;">弊社ホームページ</strong>をご覧ください。
</div>
<p></a>
</div>
</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PostgreSQL Conference Europe 2024 参加レポート</title>
		<link>https://www.sraoss.co.jp/tech-blog/event_reports/pgconfeu2024/</link>
		
		<dc:creator><![CDATA[馬 雪テイ (Xueting Ma)]]></dc:creator>
		<pubDate>Fri, 27 Dec 2024 01:00:49 +0000</pubDate>
				<category><![CDATA[イベントレポート]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[イベント]]></category>
		<category><![CDATA[参加レポート]]></category>
		<guid isPermaLink="false">https://www.sraoss.co.jp/tech-blog/?p=16064</guid>

					<description><![CDATA[2024/10/22〜25 にかけて、ギリシャのアテネで開催された PostgreSQL Conference Europe 2024 に参加しましたので報告いたします。 はじめに PGconfEU は、PostgreS ...]]></description>
										<content:encoded><![CDATA[<p>2024/10/22〜25 にかけて、ギリシャのアテネで開催された <a href="https://2024.pgconf.eu/" target="_blank" rel="external noopener noreferrer">PostgreSQL Conference Europe 2024</a> に参加しましたので報告いたします。</p>
<p><span id="more-16064"></span></p>
<h3>はじめに</h3>
<p>PGconfEU は、PostgreSQL Europe が主催する大規模なカンファレンスで、毎年ヨーロッパの都市で開催されます。このカンファレンスでは、世界中の開発者やユーザーが一堂に会し、PostgreSQL に関する最新の情報や技術を共有する貴重な機会となります。</p>
<figure id="attachment_15822" aria-describedby="caption-attachment-15822" style="width: 288px" class="wp-caption alignleft"><a href="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/place.png"><img loading="lazy" decoding="async" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/place-288x300.png" alt="PostgreSQL Conference Europe 2024 会場の写真" width="288" height="300" class="size-medium wp-image-15822" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/place-288x300.png 288w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/place-206x214.png 206w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/place-250x260.png 250w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/place.png 586w" sizes="auto, (max-width: 288px) 100vw, 288px" /></a><figcaption id="caption-attachment-15822" class="wp-caption-text">PostgreSQL Conference Europe 2024 会場</figcaption></figure>
<div class="clear"></div>
<p>筆者は今回はレポーターとしてこのイベントに参加しました。普段は PostgreSQL の技術サポートを業務としているので、今回のカンファレンスでは、多くの知識や経験を吸収し、自身のスキルを向上させることも参加目的の１つでした。</p>
<p>会場となった Divani Caravel Hotel は、アテネの中心に位置し、美しい景色を楽しむことができる場所でした。発表セッションが 4 つの部屋で並行して行われ、参加者はそれぞれ興味のあるトピックに応じてセッションを選ぶことができました。</p>
<p>本レポートではいくつかの印象的な発表をピックアップし、その要点や感想を紹介します。</p>
<h3>削除されたデータの復元方法</h3>
<figure id="attachment_15817" aria-describedby="caption-attachment-15817" style="width: 300px" class="wp-caption alignleft"><a href="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pg_dirty_read.png"><img loading="lazy" decoding="async" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pg_dirty_read-300x175.png" alt="写真：Christoph Berg による「削除されたデータの復元」についての解説" width="300" height="175" class="size-medium wp-image-15817" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pg_dirty_read-300x175.png 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pg_dirty_read-768x449.png 768w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pg_dirty_read-304x178.png 304w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pg_dirty_read-282x165.png 282w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pg_dirty_read.png 993w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-15817" class="wp-caption-text">Christoph Berg による「削除されたデータの復元」についての解説</figcaption></figure>
<div class="clear"></div>
<p>CYBERTEC の Christoph Berg の講演 <a href="https://www.postgresql.eu/events/pgconfeu2024/schedule/session/5630-undelete-data-from-table/" target="_blank" rel="external noopener noreferrer">&#8220;UNDELETE data FROM table;&#8221;</a> は、削除されたデータをどのようにして「復元」できるかというテーマでした。データを削除した場合、トランザクション内で削除されたデータならばロールバックによって元に戻すことができますし、<br />
ベースバックアップから PITR（Point-In-Time Recovery）を使ってデータを復旧する方法もあります。</p>
<p>今回はその他の手段として、<a href="https://github.com/df7cb/pg_dirtyread" target="_blank" rel="external noopener noreferrer">&#8220;pg_dirtyread&#8221;</a> という拡張機能を使うことで削除された行を読み取る方法が紹介されていました。</p>
<p>pg_dirtyread を使うと、テーブル内の削除された行も SELECT 文を使って表示できるようになります。特に、出力された行の xmax システムカラムを調べることで、それが削除された行であるかをチェックすることができます。（PostgreSQL では xmax というシステムカラムに行を削除したトランザクションの ID が格納されます。）このように、pg_dirtyread を使用することで、失われた行を再びテーブルに挿入することが可能になりますが、削除された行の内容がその後の更新や VACUUM によってページから失われていた場合には復元することができません。</p>
<p>ページから失われたデータを復元するには、PostgreSQL に同梱されているツールである pg_waldump を使うことで削除されたデータがどのように WAL に記録されているかを確認することができます。PostgreSQL では通常 FPW（Full Page Write）が ON となっており、CHECKPOINT 以降の初回のページ変更時にテーブルのページイメージ全体が WAL に出力されています。そのため、行が削除される前のテーブルページの状態を WAL から確認することができます。PostgreSQL 16 以降では pg_waldump に &#8211;save-fullpage オプションが追加され、フルページの内容を保存できるようになりました。この方法を使用することで、削除されたデータが含まれているページを特定のディレクトリに抽出し、それを元にデータを復元することができます。</p>
<p>もちろん普段からバックアップを取るのが重要であり、データ復旧には PITR を利用するのが一般的なのですが、以上のように pg_dirtyread と pg_waldump を使って削除されたデータを復元する方法もあることを紹介する発表でした。</p>
<h3>PostgreSQLのコネクションプーラーの比較</h3>
<p>コネクションプーラーは、PostgreSQL データベースのパフォーマンスを最適化するための重要なミドルウェアであり、特に接続管理において大きな役割を果たします。この機能によって接続数が過剰になる問題が解決され、データベースの負荷が軽減されます。CYBERTEC の Julian Markwort の講演<a href="https://www.postgresql.eu/events/pgconfeu2024/schedule/session/5846-comparing-connection-poolers-for-postgresql/" target="_blank" rel="external noopener noreferrer">&#8220;Comparing Connection Poolers for PostgreSQL&#8221; </a> では PostgreSQL におけるコネクションプーラーの役割や利点、課題、および代表的なプーラーの比較について学ぶことができました。SRA OSS が中心となって開発しているクラスタリングツールで、サポート業務で取り扱うことの多い <a href="https://www.pgpool.net/mediawiki/jp/index.php" target="_blank" rel="noopener">&#8220;Pgpool-II&#8221;</a> のコネクションプール機能についても紹介されていました。また、<a href="https://github.com/yandex/odyssey" target="_blank" rel="external noopener noreferrer">&#8220;Odyssey&#8221;</a> や <a href="https://github.com/agroal/pgagroal" target="_blank" rel="noopener">&#8220;pgagroal&#8221;</a> 、<a href="https://github.com/postgresml/pgcat" target="_blank" rel="external noopener noreferrer">&#8220;PgCat&#8221;</a> といった 2019 年以降に登場した比較的新しいプーラーについても、今回初めて知ることができました。</p>
<figure id="attachment_19403" aria-describedby="caption-attachment-19403" style="width: 335px" class="wp-caption alignleft"><a href="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_02.jpg"><img loading="lazy" decoding="async" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_02.jpg" alt="写真：Julian Markwort によるコネクションプーラーの比較の解説" width="335" height="236" class="size-full wp-image-19403" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_02.jpg 335w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_02-300x211.jpg 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_02-304x214.jpg 304w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_02-282x199.jpg 282w" sizes="auto, (max-width: 335px) 100vw, 335px" /></a><figcaption id="caption-attachment-19403" class="wp-caption-text">Julian Markwort によるコネクションプーラーの比較の解説</figcaption></figure>
<div class="clear"></div>
<p>紹介されていたコネクションプーラーには以下のものがありました：</p>
<ul>
<li>Pgpool-II: 様々な機能を持つクラスタリングツール。設定がやや複雑。</li>
<li>PgBouncer: コネクションプールの機能に特化した軽量のプーラー。</li>
<li>Odyssey: スケーラブルなマルチスレッド設計のプーラー。</li>
<li>pgagroal: 高性能を目的に新たに設計されたプーラー。</li>
<li>PgCat: シャーディング、ロードバランシング、フェイルオーバー機能を持つマルチスレッド設計のプーラー。</li>
<li>Supavisor: クラウドネイティブなコネクションプーラー。</li>
</ul>
<p>どのプーラーを選ぶべきかについては、発表者の直感に基づいた個人的意見であると断った上で、以下のような特徴をあげていました：</p>
<ul>
<li>PgBouncer は広く使われており、学習コストも低いのでおすすめ。</li>
<li>PgCat も機能の追加も進んでおり最有力な候補。</li>
<li>pgagroal は性能問題を時期尚早に解決しようとして行き詰まっているように見え、いくつかの機能も欠けている。</li>
<li>Odyssey は他のプーラーにも影響を与えた新しい試みだったが、メモリリークなどの問題が残っている。</li>
</ul>
<h3>論理レプリケーションのセットアップを高速化する</h3>
<p>EDB の Euler Taveira が発表した <a href="https://www.postgresql.eu/events/pgconfeu2024/schedule/session/5853-speeding-up-logical-replication-setup/" target="_blank" rel="external noopener noreferrer">&#8220;Speeding Up Logical Replication Setup&#8221;</a> では、<br />
論理レプリケーションのセットアップを迅速化する方法として、PostgreSQL 17 の新機能「pg_createsubscriber」が紹介されました。</p>
<figure id="attachment_19404" aria-describedby="caption-attachment-19404" style="width: 300px" class="wp-caption alignleft"><a href="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_03.jpg"><img loading="lazy" decoding="async" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_03-300x170.jpg" alt="写真：Euler Taveira による 論理レプリケーションのセットアップを迅速化する方法の解説" width="300" height="170" class="size-medium wp-image-19404" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_03-300x170.jpg 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_03-304x173.jpg 304w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_03-282x160.jpg 282w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_03.jpg 398w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-19404" class="wp-caption-text">Euler Taveira による 論理レプリケーションのセットアップを迅速化する方法の解説</figcaption></figure>
<div class="clear"></div>
<p>論理レプリケーションを構築したときには、最初にレプリケーションするテーブルデータの初期コピーが行われます。各テーブルごとに起動する tablesync ワーカプロセスの中で COPY … TO STDOUT を利用してデータを取得し、データが同期された後に、論理レプリケーションによる変更の適用が開始されます。しかし、この方法では各テーブルが個別に処理されるため、完了までに時間がかかる場合があります。一方で、pg_createsubscriber は物理ストリーミングレプリケーションのスタンバイサーバを元にして、論理レプリケーションのサブスクライバサーバを作るコマンドあり、テーブルの初期コピーを行わず、論理レプリケーションの構築を迅速に行うことが可能です。この講演では、サイズに応じたパフォーマンス改善の例も示され、例えば 20GB のデータで 13 倍の速度向上が見込まれるとされました。また、今後の pg_createsubscriber コマンドの機能改善のアイデアとして、ベースバックアップからのサブスクライバ構築、完了時のサーバー起動、指定されていないデータベースの削除、特定のテーブルの指定、サブスクライバ構築後に物理スタンバイを無効にしない、といったことを可能にするオプションの追加が挙げられていました。</p>
<h3>AI と地理情報システム</h3>
<p>Redgate Software の Grant Fritchey が発表した<a href="https://www.postgresql.eu/events/pgconfeu2024/schedule/session/5579-leveraging-ai-as-a-postgresql-dba/" target="_blank" rel="external noopener noreferrer">&#8220;Leveraging AI as a PostgreSQL DBA&#8221;</a> の講演では、データベース管理者（DBA）が AI をどのように活用できるか、またその効果的な使用法について詳しく説明されました。現在、人工知能（AI）は非常に注目されているテーマです。AI は単に「新しい技術」として存在するだけでなく、DBA の仕事をより効率的に行うための強力なツールとなり得ます。具体的な実践例として、いくつかのタスクにおける AI の活用方法が示されました。例えば、データベース設計、データ生成、テストスクリプト作成、クエリ最適化、コード評価などが挙げられます。紹介されたツールには、ChatGPT、Microsoft CoPilot、Google Gemini、Perplexity、You.com、Brave.com などが含まれていました。筆者自身も普段、ChatGPT や Microsoft CoPilot を使用しており、その効果を実感しています。また、AI の結果を鵜呑みにせず、「trust, but verify（信頼するが、確認する）」という考え方を持つことが重要ということが主張されていました。</p>
<figure id="attachment_19405" aria-describedby="caption-attachment-19405" style="width: 300px" class="wp-caption alignleft"><a href="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_04.jpg"><img loading="lazy" decoding="async" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_04-300x144.jpg" alt="写真：&gt;Grant Fritchey によるデータベース管理者向けAI活用方法の講演" width="300" height="144" class="size-medium wp-image-19405" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_04-300x144.jpg 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_04-304x145.jpg 304w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_04-282x135.jpg 282w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_04.jpg 462w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-19405" class="wp-caption-text">Grant Fritchey によるデータベース管理者向けAI活用方法の講演</figcaption></figure>
<div class="clear"></div>
<p>生成 AI を効果的に活用するためには、AI に与える命令や指示を記述した文であるプロンプトの質が非常に重要です。これに関してはは、以下のポイントが強調されていました。</p>
<ul>
<li>Clarity, clarity, clarity: 明確さが重要。</li>
<li>Use appropriate terms: 適切な用語を使用する。</li>
<li>More detail is better: より詳細な情報が結果を改善する。</li>
<li>Context matters: 文脈を理解することが必要。</li>
<li>Stop digging, start over: 回答の方向性がおかしい場合は、無理やり修正しようとしないで最初からやり直す。</li>
</ul>
<p>MICROSOFT の Varun Dhawan の講演 <a href="https://www.postgresql.eu/events/pgconfeu2024/schedule/session/5599-using-postgres-to-locate-the-best-coffee-near-you/" target="_blank" rel="external noopener noreferrer">&#8220;Using Postgres to locate the best coffee near you!&#8221;</a> では、PostgreSQL と地理情報を扱うための拡張モジュール <a href="https://postgis.net/" target="_blank" rel="external noopener noreferrer">&#8220;PostGIS&#8221;</a>、さらにベクトルデータを組み合わせて、自然言語クエリを活用する方法について説明がありました。特に、「最寄りのコーヒーショップはどこですか？」という質問に対して正確な結果を得る手法が紹介され、PostgreSQL の多様な機能を組み合わせることで、シンプルなキーワードマッチングから強力な文脈認識検索ソリューションへの進化が強調されました。さらに、AI を活用した方法として、ベクトル化されたデータセットから関連情報を抽出し、OpenAI の大規模言語モデルに渡すことで、より正確な回答を生成するアプローチも紹介されました。この手法は RAG（Retrieval-Augmented Generation）という技術で、簡単に言うと、ユーザーの質問に対して、データベースから関連する情報を検索し、その情報を文脈として与えることで、生成 AI からより適切な回答を得る方法です。</p>
<p>RAG のプロセスでは、まずユーザーのクエリ（例えばコーヒーショップの検索クエリ）を受け取り、それをベクトル化します。次に、ベクトルデータベース（PostgreSQL）から関連するコンテキスト（例えば、コーヒーショップのレビュー）を検索し、取得したコンテキストを大規模言語モデル（OpenAI）に渡し、言語モデルが応答を生成する流れとなります。この統合により、AI と PostgreSQL を活用した効果的な情報検索が実現可能となります。</p>
<figure id="attachment_15815" aria-describedby="caption-attachment-15815" style="width: 300px" class="wp-caption alignleft"><a href="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/map.jpg"><img loading="lazy" decoding="async" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/map-300x225.jpg" alt="写真：Jimmy Angelakos による OSM と、PostgreSQL + PostGIS の組み合わせの解説" width="300" height="225" class="size-medium wp-image-15815" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/map-300x225.jpg 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/map-1024x768.jpg 1024w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/map-768x576.jpg 768w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/map-285x214.jpg 285w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/map-282x212.jpg 282w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/map.jpg 1280w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-15815" class="wp-caption-text">Jimmy Angelakos による OSM と、PostgreSQL + PostGIS の組み合わせの解説</figcaption></figure>
<div class="clear"></div>
<p>Deriv の Jimmy Angelakos が発表した<a href="https://www.postgresql.eu/events/pgconfeu2024/schedule/session/5592-mom-can-we-have-ggle-maps-we-have-ggle-maps-at-home/" target="_blank" rel="external noopener noreferrer">&#8220;–Mom, can we have G**gle Maps? –We have G**gle Maps at home&#8221;</a> は、PostgreSQL と PostGIS を使って <a href="https://www.openstreetmap.org/about" target="_blank" rel="external noopener noreferrer">&#8220;OpenStreetMap (OSM)&#8221;</a> のデータを取り込み、GISの機能を実現する方法に焦点を当てています。この講演は「高価な API が本当に必要か？既存の無料で強力なオープンデータソースである OpenStreetMap と、PostgreSQL + PostGIS の組み合わせで十分では？」という問題提起から始まりました。OpenStreetMap (OSM) は無料で利用できる地理データベースであり、PostgreSQL と組み合わせることで、さまざまな空間データクエリやジオコーディング（情報に対して関連する地理座標を付加すること）を実現できます。OSM データは、PBF や XML 形式のダンプとしてエクスポート可能で、簡単に PostgreSQL に取り込めます。このプレゼンテーションでは、OSM データを PostgreSQL にインポートするツールとして <a href="https://pgosm-flex.com/" target="_blank" rel="external noopener noreferrer">&#8220;PgOSM Flex&#8221;</a> の使用が紹介されました。</p>
<h3>PostgreSQL セキュリティ</h3>
<p>CYBERTEC の Taras Kloba の講演 <a href="https://www.postgresql.eu/events/pgconfeu2024/schedule/session/5554-postgresql-security-from-attack-simulation-to-defense/" target="_blank" rel="external noopener noreferrer">&#8220;PostgreSQL Security:Defending Against External Attacks&#8221;</a> では、データベースセキュリティの重要性を再認識させられました。特に、過去の PostgreSQL の脆弱性が悪用されることで LinkedIn や OpenTable などで実際に発生した具体的なデータ漏洩事例に基づいて解説されたことで、PostgreSQL の脆弱性がどれほど危険であるかを深く理解することができました。これにより、データベースのセキュリティ対策が単なるオプションではなく、企業や組織の持続可能性にも直結する必須事項であることを強く認識しました。</p>
<p>具体的な対策として、PostgreSQL の最新パッチを適用すること、アクセス制御を強化すること、SSL 接続を強制すること、そしてTDE（透過的データ暗号化）を導入するなどが紹介されており、日々の業務において重要な手段として非常に参考になりました。さらに、権限昇格による脆弱性を回避するため、ユーザ関数定義時の SECURITY DEFINER の使用を制限することや、COPY FROM PROGRAM の実行権限をスーパーユーザのみに付与するといった実務的なアドバイスも示されており、これらは実際のシステム運用において非常に役立つ内容であったと感じます。</p>
<figure id="attachment_19408" aria-describedby="caption-attachment-19408" style="width: 300px" class="wp-caption alignleft"><a href="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_05.jpg"><img loading="lazy" decoding="async" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_05-300x171.jpg" alt="写真：Taras Kloba によるデータベースセキュリティの重要性の解説" width="300" height="171" class="size-medium wp-image-19408" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_05-300x171.jpg 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_05-304x173.jpg 304w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_05-282x161.jpg 282w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_05.jpg 353w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-19408" class="wp-caption-text">Taras Kloba によるデータベースセキュリティの重要性の解説</figcaption></figure>
<div class="clear"></div>
<p><strong><span style="font-size: x-large;">ワイヤプロトコル</span></strong></p>
<p>現在の PostgreSQL で使用している通信プロトコルは、2003 年にバージョン 7.4 で導入され、以来多くの新機能が追加されていますが、プロトコル自体は大きく変更されていません。このプロトコルは、PostgreSQL の効率的な操作を支え、様々なクライアントライブラリやミドルウェア、さらには他のDBMS実装でも広く利用されています。Neon,inc の Heikki Linnakangas の講演 <a href="https://www.postgresql.eu/events/pgconfeu2024/schedule/session/5897-the-wire-protocol/" target="_blank" rel="external noopener noreferrer">&#8220;The Wire Protocol&#8221;</a> はこの通信プロトコルを解説するもので、メッセージ構造、認証、クエリの実行やキャンセル、COPY、レプリケーション機能、将来に向けたプロトコルの拡張といったトピックが含まれていました。</p>
<p>筆者はプロトコルについての知識にあまり馴染みがなかったため、PostgreSQL のプロトコルの特に認証やクエリの実行方法、COPY プロトコルの使用など理解するのが難しい部分もありました。しかし、プロトコルを学ぶことで、データベースがどのように動作しているか、また、より効率的にクエリを実行したりエラーハンドリングを行ったりするための手助けになると感じられ、今後、この講演を機に少しずつでもプロトコルに関する知識を深めていきたいと思うようになりました。</p>
<h3>マテリアライズドビューの増分更新</h3>
<figure id="attachment_19410" aria-describedby="caption-attachment-19410" style="width: 300px" class="wp-caption alignleft"><a href="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_06.jpg"><img loading="lazy" decoding="async" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_06-300x163.jpg" alt="写真：弊社長田による 「pg_ivm」の解説" width="300" height="163" class="size-medium wp-image-19410" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_06-300x163.jpg 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_06-304x165.jpg 304w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_06-282x153.jpg 282w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_06.jpg 721w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-19410" class="wp-caption-text">弊社長田による 「pg_ivm」の解説</figcaption></figure>
<div class="clear"></div>
<p>弊社の長田の講演 <a href="https://www.postgresql.eu/events/pgconfeu2024/schedule/session/5748-pg_ivm-extensions-for-rapid-materialized-view-update/" target="_blank" rel="external noopener noreferrer">&#8220;pg_ivm: Extensions for Rapid Materialized View Update&#8221;</a> では、マテリアライズドビューを迅速に更新するための機能を PostgreSQL に提供するの拡張モジュール <a href="https://github.com/sraoss/pg_ivm" target="_blank" rel="external noopener noreferrer">&#8220;pg_ivm&#8221;</a> が紹介されました。マテリアライズドビューは、クエリの結果を保存するデータベースオブジェクトであり、クエリ応答を迅速にするために使用されますが、基になるテーブルが変更されると、その状態を最新に保つためにはビューの更新が必要です。pg_ivm は、Incremental View Maintenance（IVM）という手法を使用し、ビューの全ての行を更新するのではなく、「増分」のみを計算して、マテリアライズドビューを迅速に更新できる拡張モジュールです。</p>
<p>この拡張モジュールは、PostgreSQL 13 から 17 のバージョンで使用可能で、通常の REFRESH コマンドで 20 秒かかるビューをわずか 15 ミリ秒で更新できる例が紹介されていました。従来のマテリアライズドビューと比較して、更新が 500 倍以上速くなる場合もあり、大きなパフォーマンス向上が期待できます。また、今後の計画や機能要望として、外部結合や論理レプリケーションのサポートや、GROUPING SET や ROLLUP を含む高度な集計機能の対応があげられていました。</p>
<p>以前、pg_ivm について深く学ぶ機会はありませんでしたが、今回の講演を通じて、学習者としてだけでなく開発者の視点からも、その仕組みなどの難しさを実感することができました。</p>
<h3>ライトニングトーク</h3>
<p>最後に、最終日に行われたライトニングトークの様子についてご紹介します。</p>
<p>ライトニングトーク（Lighting talks）とは、通常、非常に短いプレゼンテーション形式のことを指します。一般的に、各プレゼンテーションは 5 分から 10 分程度の短時間で行われ、参加者が素早く情報を共有したり、新しいアイデアを紹介したりする場です。</p>
<p>今回のライトニングトークは 13 トピックがあり、その中で私に印象に残ったのは、motherduckdb の Jelte Fennema が発表した <a href="https://www.postgresql.eu/events/pgconfeu2024/sessions/session/6012/slides/594/Jelte_LT_%20pg_duckdb.pdf" target="_blank" rel="external noopener noreferrer">&#8220;pg_duckdb: Challenges and Benefits of Elephants with Eaks&#8221;</a> でした。</p>
<figure id="attachment_19411" aria-describedby="caption-attachment-19411" style="width: 300px" class="wp-caption alignleft"><a href="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_07.jpg"><img loading="lazy" decoding="async" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_07-300x167.jpg" alt="写真：Jelte Fennema による pg_duckdb の紹介" width="300" height="167" class="size-medium wp-image-19411" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_07-300x167.jpg 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_07-304x169.jpg 304w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_07-282x157.jpg 282w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/pgconfeu2024_07.jpg 377w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-19411" class="wp-caption-text">Jelte Fennema による pg_duckdb の紹介</figcaption></figure>
<div class="clear"></div>
<p><a href="https://github.com/duckdb/pg_duckdb" target="_blank" rel="external noopener noreferrer">&#8220;pg_duckdb&#8221;</a> は、<a href="https://duckdb.org/" target="_blank" rel="external noopener noreferrer">&#8220;DuckDB&#8221;</a> を PostgreSQL の内部で利用可能にする拡張モジュールです。DuckDB は「分析用の SQLite」とも呼ばれ、複雑な分析クエリをサポートするインメモリ型の分析データベースです。<a href="https://www.sqlite.org/" target="_blank" rel="external noopener noreferrer">&#8220;SQLite&#8221;</a> と同じく組み込み用途のデータベースですが、分析作業に特化しており、非常に効率的に動作します。</p>
<p>pg_duckdb の特徴として、DuckDB の強力な分析エンジンを PostgreSQL に統合することで、ユーザーは従来の SQL エンジンに比べて圧倒的に高速な分析処理を実現できます。この拡張機能は 2024 年 10 月に最初のリリース（v.0.1.0）が公開され、parquet や CSV 形式のデータを BLOB（バイナリデータストレージ）から読み書きする機能を提供します。また、PostgreSQL テーブル上で DuckDB エンジンを使用したり、DuckDB のカラム型フォーマットを利用して一時テーブルを作成したりすることができます。さらに、MotherDuck というサーバーレスのクラウド分析プラットフォームへの分析処理のオフロード機能もあり、より効率的なデータ処理を実現します。この技術は、まるで象がダックに乗っているようなイメージです。象は飛べたり歩けたり泳いだりすることができ、いろんなものを食べて生きていくことができます。同じように、pg_duckdb は環境の変化にも強く、高速な分析を可能にします。</p>
<h3>おわりに</h3>
<figure id="attachment_15814" aria-describedby="caption-attachment-15814" style="width: 300px" class="wp-caption alignleft"><a href="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/item.png"><img loading="lazy" decoding="async" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/item-300x228.png" alt="写真：受付証とスポンサーからのギフト" width="300" height="228" class="size-medium wp-image-15814" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/item-300x228.png 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/item-282x214.png 282w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2024/12/item.png 570w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-15814" class="wp-caption-text">受付証とスポンサーからのギフト</figcaption></figure>
<div class="clear"></div>
<p>PostgreSQL Conference Europe 2024 では、AI や PostgreSQL 17 の新機能、拡張機能に関する多くの講演がありました。普段の業務で知っているトピックもありましたが、知らなかった知識もたくさん得ることができました。特に、AI の活用方法や PostgreSQL 17 の新機能についての発表は、私にとって非常に興味深く、業務に活かせる具体的なナレッジを得ることができました。</p>
<p>また、発表者のトークスタイルやプレゼンテーション技術からも学ぶことが多く、技術的な内容だけでなく、コミュニケーションの大切さも再確認しました。さらに、ドイツや中国からの参加者とも交流し、お互いの仕事内容やカンファレンスの発表内容について話すこともできました。このような楽しい時間を過ごせたことは、私にとって貴重な経験でした。</p>
<p>参加者 781 名という大規模なイベントで、多くの方々と意見を交わし、さまざまな視点を学ぶことができたのは貴重な機会でした。アテネの美しい風景もこのカンファレンスを特別なものにしてくれました。青い空と古代遺跡が調和する光景は、まるで歴史が息づいているかのようで、街を歩くたびにその魅力に引き込まれました。コーヒーとビールもとても美味しかったです！</p>
<p>今回のカンファレンスでは、他国の参加者との出会いを通じて、それぞれの文化や背景を知ることで PostgreSQL に対する理解がさらに深まりました。このカンファレンスで得た知識やつながりを活かし、今後も自分の成長につなげていきたいと思います。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
