<?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>PostgreSQL | Kemmy&#039;s Blog</title>
	<atom:link href="https://www.kemmy-it.com/category/database/postgresql/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.kemmy-it.com</link>
	<description>データベースやプログラミング言語等の基本的事項を、図や表を使ってアウトプットしています。</description>
	<lastBuildDate>Sun, 09 Nov 2025 09:49:13 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://www.kemmy-it.com/wp-content/uploads/2024/09/Kemmy_vga-150x150.png</url>
	<title>PostgreSQL | Kemmy&#039;s Blog</title>
	<link>https://www.kemmy-it.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【PostgreSQL】 「pgAdmin 4」が起動しない？　現象・原因・対策 トップ５！</title>
		<link>https://www.kemmy-it.com/2025/11/09/pgadmin_not_start/</link>
		
		<dc:creator><![CDATA[Kemmy]]></dc:creator>
		<pubDate>Sun, 09 Nov 2025 06:56:49 +0000</pubDate>
				<category><![CDATA[PostgreSQL]]></category>
		<guid isPermaLink="false">https://www.kemmy-it.com/?p=6849</guid>

					<description><![CDATA[目次 はじめに動作環境第1位　「The pgAdmin 4 server could not be contacted」エラーpgAdmin 4 起動時の現象原因対策第2位　PostgreSQLサービスが停止しているpg [&#8230;]]]></description>
										<content:encoded><![CDATA[

  <div id="toc" class="toc tnt-number-detail toc-center tnt-number_detail border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a><ol><li><a href="#toc2" tabindex="0">動作環境</a></li></ol></li><li><a href="#toc3" tabindex="0">第1位　「The pgAdmin 4 server could not be contacted」エラー</a><ol><li><a href="#toc4" tabindex="0">pgAdmin 4 起動時の現象</a></li><li><a href="#toc5" tabindex="0">原因</a></li><li><a href="#toc6" tabindex="0">対策</a></li></ol></li><li><a href="#toc7" tabindex="0">第2位　PostgreSQLサービスが停止している</a><ol><li><a href="#toc8" tabindex="0">pgAdmin 4 起動時の現象</a></li><li><a href="#toc9" tabindex="0">原因</a></li><li><a href="#toc10" tabindex="0">対策</a><ol><li><a href="#toc11" tabindex="0">サービスが起動していない場合</a></li><li><a href="#toc12" tabindex="0">PostgreSQLが未インストールの場合</a></li><li><a href="#toc13" tabindex="0">サービス登録が失敗している場合</a></li></ol></li></ol></li><li><a href="#toc14" tabindex="0">第3位　プロキシ設定がlocalost通信を妨害している</a><ol><li><a href="#toc15" tabindex="0">pgAdmin 4 起動時の現象</a></li><li><a href="#toc16" tabindex="0">原因</a></li><li><a href="#toc17" tabindex="0">対策</a><ol><li><a href="#toc18" tabindex="0">localhost通信をプロキシから除外する</a></li></ol></li></ol></li><li><a href="#toc19" tabindex="0">第4位　管理者権限で起動していない</a><ol><li><a href="#toc20" tabindex="0">pgAdmin 4 起動時の現象</a></li><li><a href="#toc21" tabindex="0">原因</a></li><li><a href="#toc22" tabindex="0">対策</a></li></ol></li><li><a href="#toc23" tabindex="0">第5位　pgAdminのバージョンが古い</a><ol><li><a href="#toc24" tabindex="0">pgAdmin 4 起動時の現象</a></li><li><a href="#toc25" tabindex="0">原因</a></li><li><a href="#toc26" tabindex="0">対策</a><ol><li><a href="#toc27" tabindex="0">コマンドの実行で「入力条件に一致するパッケージが見つかりませんでした」が表示される場合</a></li></ol></li></ol></li><li><a href="#toc28" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">はじめに</span></h2>



<p>Windows 11環境で「pgAdmin 4が起動しない」不具合について、その現象の具体例と、原因・対策を紹介します。</p>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc2">動作環境</span></h3>



<ul class="wp-block-list">
<li>Windows 11 Pro 24H2</li>



<li>PostgreSQL 17.6</li>



<li>pgAdmin 4 ：Ver. 9.6　Python Ver. 3.13.6</li>
</ul>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc3">第1位　「The pgAdmin 4 server could not be contacted」エラー</span></h2>



<h3 class="wp-block-heading"><span id="toc4">pgAdmin 4 起動時の現象</span></h3>



<p>起動時にブラウザが開くが、上記エラー「The pgAdmin 4 server could not be contacted」が表示されて操作不能となる</p>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc5">原因</span></h3>



<p>セッションファイルの破損、または前回の異常終了</p>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc6">対策</span></h3>



<p>以下のようにRoamingフォルダ内の「pgAdmin」フォルダを削除する</p>



<pre class="wp-block-code bash"><code>Remove-Item "$env:APPDATA\pgAdmin" -Recurse -Force</code></pre>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<p>又は、手動で削除</p>



<pre class="wp-block-code bash"><code>C:\Users\ユーザー名\AppData\Roaming\pgAdmin</code></pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<p>再起動後、正常に起動するかどうかを確認する。</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<div class="linkcard"><div class="lkc-external-wrap"><a rel="noopener" class="lkc-link no_icon" href="https://amzn.to/4hQ2L3v" data-lkc-id="102" target="_blank"><div class="lkc-card"><div class="lkc-info"><div class="lkc-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=amzn.to" alt="" width="16" height="16" /></div><div class="lkc-domain">amzn.to</div></div><div class="lkc-content"><figure class="lkc-thumbnail"><img decoding="async" class="lkc-thumbnail-img" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Famzn.to%2F4hQ2L3v?w=200" width="170px" height="200px" alt="" /></figure><div class="lkc-title">Bigme B6、カラー電子書籍リーダー、4GB+64GB 6インチ電子ペーパータ 、Android 14...</div><div class="lkc-excerpt">レビュー：ストレージ容量が増やせないKindleが不便で購入しました。SDも使えて、持っている本を全部ダウンロードしてオフラインでもいつでも読めるのは便利ですね。PlayBooksでも何冊か買っているので1つの端末で完結するのも便利です。</div></div><div class="clear"></div></div></a></div></div>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc7">第2位　PostgreSQLサービスが停止している</span></h2>



<h3 class="wp-block-heading"><span id="toc8">pgAdmin 4 起動時の現象</span></h3>



<p>pgAdminは起動するが、データベースに接続できない</p>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc9">原因</span></h3>



<p>PostgreSQLサービスに異常があるため、pgAdminがサービスに接続できない。</p>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc10">対策</span></h3>



<p>PostgreSQLサービスの存在とその状態（起動中か停止中）を確認する</p>



<p>確認方法（例）</p>



<pre class="wp-block-code bash"><code># PostgreSQLサービスの存在と状態を確認
Get-Service | Where-Object { $_.Name -like "postgresql*" }</code></pre>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<p><strong>出力例</strong></p>



<ul class="wp-block-list">
<li>サービスは存在しているが、起動していない場合</li>
</ul>



<pre class="wp-block-code bash"><code>Status   Name               DisplayName
------   ----               -----------
Stopped  postgresql-x64-17  PostgreSQL 17</code></pre>



<p>サービスが存在しない場合は、何も表示されません。</p>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc11">サービスが起動していない場合</span></h4>



<p>サービスを起動する。<br>起動例：サービス名はPostgreSQLのバージョンによって異なるので注意</p>



<pre class="wp-block-code bash"><code>Start-Service -Name "postgresql-x64-17"</code></pre>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc12">PostgreSQLが未インストールの場合</span></h4>



<p>下記のコマンドでインストールするか、公式ダウンロードサイトからインストーラーをダウンロードしてインストールする。</p>



<pre class="wp-block-code bash"><code>New-Service -Name "postgresql-x64-17" -BinaryPathName "C:\Program Files\PostgreSQL\17\bin\pg_ctl.exe runservice" -DisplayName "PostgreSQL 17" -StartupType Automatic</code></pre>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc13">サービス登録が失敗している場合</span></h4>



<p>以下のようにサービスを登録する（パスは環境に応じて調整）</p>



<pre class="wp-block-code bash"><code>New-Service -Name "postgresql-x64-17" -BinaryPathName "C:\Program Files\PostgreSQL\17\bin\pg_ctl.exe runservice" -DisplayName "PostgreSQL 17" -StartupType Automatic</code></pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<div class="linkcard"><div class="lkc-external-wrap"><a rel="noopener" class="lkc-link no_icon" href="https://amzn.to/4ot6UwB" data-lkc-id="103" target="_blank"><div class="lkc-card"><div class="lkc-info"><div class="lkc-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=amzn.to" alt="" width="16" height="16" /></div><div class="lkc-domain">amzn.to</div></div><div class="lkc-content"><figure class="lkc-thumbnail"><img decoding="async" class="lkc-thumbnail-img" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Famzn.to%2F4ot6UwB?w=200" width="170px" height="200px" alt="" /></figure><div class="lkc-title">Amazon Kindle - 目に優しい、かさばらない、大きな画面で読みやすい</div><div class="lkc-excerpt">レビュー：初めてのKindleタブレット。サイズ選びに迷いましたが、軽くて持ち運びやすく、寝転んで読むのにも快適です。読書がますます楽しくなりこちらを選んで正解でした。</div></div><div class="clear"></div></div></a></div></div>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc14">第3位　プロキシ設定がlocalost通信を妨害している</span></h2>



<h3 class="wp-block-heading"><span id="toc15">pgAdmin 4 起動時の現象</span></h3>



<ul class="wp-block-list">
<li>ブラウザは開くが「The pgAdmin 4 server could not be contacted」と表示される</li>



<li>真っ白な画面のまま何も表示されない</li>
</ul>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc16">原因</span></h3>



<p>Windowsのプロキシ設定がlocalhost通信を外部に転送しようとして失敗する。</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<p>pgAdmin 4は、起動時にローカルHTTPサーバー（通常 http://127.0.0.1:5050）を立ち上げてUIを表示します。<br>しかし、Windowsのプロキシ設定が有効になっていると、<strong>localhostへの通信がプロキシ経由になり、pgAdminのローカルサーバーに接続できなくなる</strong>ことがあります。</p>



<ul class="wp-block-list">
<li>この問題が起こり易い環境
<ul class="wp-block-list">
<li>VPN接続中</li>



<li>企業ネットワークでグローバルプロキシが強制されている</li>



<li>Windowsの「自動プロキシ検出」が有効になっている</li>
</ul>
</li>
</ul>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc17">対策</span></h3>



<h4 class="wp-block-heading"><span id="toc18">localhost通信をプロキシから除外する</span></h4>



<ul class="wp-block-list">
<li><strong>環境変数 <code>NO_PROXY</code> を設定する（推奨）</strong><br>pgAdminの起動時にこの環境変数が設定されていれば、<strong>localhost通信がプロキシを経由せず直接処理されます</strong>。</li>
</ul>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<p>PowerShellで設定（ユーザー環境変数：pgAdmin 4 再起動必要）</p>



<pre class="wp-block-code bash"><code>&#091;System.Environment]::SetEnvironmentVariable("NO_PROXY", "127.0.0.1,localhost", "User")</code></pre>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<p>コマンドプロンプトで設定（永続化：：pgAdmin 4 再起動必要）</p>



<pre class="wp-block-code bash"><code>setx NO_PROXY "127.0.0.1,localhost"</code></pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<div class="linkcard"><div class="lkc-external-wrap"><a rel="noopener" class="lkc-link no_icon" href="https://amzn.to/3LvPVv8" data-lkc-id="104" target="_blank"><div class="lkc-card"><div class="lkc-info"><div class="lkc-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=amzn.to" alt="" width="16" height="16" /></div><div class="lkc-domain">amzn.to</div></div><div class="lkc-content"><figure class="lkc-thumbnail"><img decoding="async" class="lkc-thumbnail-img" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Famzn.to%2F3LvPVv8?w=200" width="170px" height="200px" alt="" /></figure><div class="lkc-title">【Kindle (2024年発売・2022年発売) 用】Amazon純正 ファブリックカバー (マッチャ)</div><div class="lkc-excerpt">レビュー：純正の製品かそうでないものを購入するか迷いましたが、結論これで大満足でした。触り心地が良く、ピンクの発色もとても良いです。カバーの開閉で画面がオンオフされるなど機能性も全く問題ありません。女性にプレゼントしましたが、ケースに起因する重量感は特段感じなかったとのこと。ケースに迷っている方はマストバイの商品かと思います。</div></div><div class="clear"></div></div></a></div></div>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc19">第4位　管理者権限で起動していない</span></h2>



<h3 class="wp-block-heading"><span id="toc20">pgAdmin 4 起動時の現象</span></h3>



<p>起動はするが、設定変更や接続が反映されない。</p>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc21">原因</span></h3>



<p>pgAdminは一部の操作に管理者権限が必要。</p>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc22">対策</span></h3>



<p>ショートカットを右クリック → 「管理者として実行」。</p>



<ul class="wp-block-list">
<li>常に管理者として実行する方法
<ul class="wp-block-list">
<li>ショートカットの「プロパティ」</li>



<li>「互換性」タブ</li>



<li>「管理者としてこのプログラムを実行」にチェック</li>
</ul>
</li>
</ul>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="469" height="579" src="https://www.kemmy-it.com/wp-content/uploads/2025/11/01_pgadmin_notStrt_01.png" alt="pgAdmin 4 プロパティ、「管理者としてこのプログラムを実行する」設定画面" class="wp-image-6867" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/11/01_pgadmin_notStrt_01.png 469w, https://www.kemmy-it.com/wp-content/uploads/2025/11/01_pgadmin_notStrt_01-243x300.png 243w" sizes="(max-width: 469px) 100vw, 469px" /></figure>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<div class="linkcard"><div class="lkc-external-wrap"><a rel="noopener" class="lkc-link no_icon" href="https://amzn.to/49sIgIb" data-lkc-id="137" target="_blank"><div class="lkc-card"><div class="lkc-info"><div class="lkc-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=amzn.to" alt="" width="16" height="16" /></div><div class="lkc-domain">amzn.to</div></div><div class="lkc-content"><figure class="lkc-thumbnail"><img decoding="async" class="lkc-thumbnail-img" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Famzn.to%2F49sIgIb?w=200" width="170px" height="200px" alt="" /></figure><div class="lkc-title">【Android16 タブレット 11インチ 世界初登場】</div><div class="lkc-excerpt">価格が安いのでさほど期待はしていませんでしたが、画質は悪くないYouTube動画も問題なくみれます。ゲームはやらないので、普段使いなら十分な性能だと思います。また付属品が充実している点も購入ポイントでした。</div></div><div class="clear"></div></div></a></div></div>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc23">第5位　pgAdminのバージョンが古い</span></h2>



<h3 class="wp-block-heading"><span id="toc24">pgAdmin 4 起動時の現象</span></h3>



<p>Windows 11で起動しない、またはUIが崩れる。</p>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc25">原因</span></h3>



<p>古いバージョンでは互換性に問題がある。</p>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc26">対策</span></h3>



<p>最新版のpgAdmin 4をインストールする。</p>



<pre class="wp-block-code bash"><code>winget install --id=pgAdmin.pgAdmin4</code></pre>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc27">コマンドの実行で「入力条件に一致するパッケージが見つかりませんでした」が表示される場合</span></h4>



<ul class="wp-block-list">
<li><strong>原因１</strong><br><strong>リポジトリが不足している</strong></li>
</ul>



<p>リポジトリの確認とリセット。Powershellで以下のコマンドを実行</p>



<pre class="wp-block-code bash"><code>winget source list</code></pre>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<p>winget と msstore の両方が表示されない場合は、以下のコマンドでリセットし、再度「winget source list」コマンドで確認。</p>



<pre class="wp-block-code bash"><code>winget source reset --force</code></pre>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<p>筆者の場合は、「winget と msstore 」の両方が入ってました。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="724" height="160" src="https://www.kemmy-it.com/wp-content/uploads/2025/11/01_pgadmin_notStrt_02.png" alt="winget source list　コマンドの実行結果　画像" class="wp-image-6869" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/11/01_pgadmin_notStrt_02.png 724w, https://www.kemmy-it.com/wp-content/uploads/2025/11/01_pgadmin_notStrt_02-300x66.png 300w" sizes="(max-width: 724px) 100vw, 724px" /></figure>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li><strong>原因２</strong><br>IDが誤っているか登録されていない。pgAdmin.pgAdmin4というIDが現在のwingetリポジトリに存在しない可能性があるので、正しいIDを以下のコマンドで検索します。</li>
</ul>



<pre class="wp-block-code bash"><code>winget search pgAdmin</code></pre>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<p>筆者の環境では、正しいIDは「PostgreSQL.pgAdmin」でした。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="866" height="213" src="https://www.kemmy-it.com/wp-content/uploads/2025/11/01_pgadmin_notStrt_03.png" alt="winget search pgAdmin　コマンドの実行結果　画像" class="wp-image-6871" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/11/01_pgadmin_notStrt_03.png 866w, https://www.kemmy-it.com/wp-content/uploads/2025/11/01_pgadmin_notStrt_03-300x74.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/11/01_pgadmin_notStrt_03-768x189.png 768w" sizes="(max-width: 866px) 100vw, 866px" /></figure>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<p>正しいIDが分かったので、以下のコマンドでインストールします。</p>



<pre class="wp-block-code"><code>winget install --id=PostgreSQL.pgAdmin</code></pre>



<figure class="wp-block-image size-full"><img decoding="async" width="874" height="201" src="https://www.kemmy-it.com/wp-content/uploads/2025/11/01_pgadmin_notStrt_05.png" alt="winget install --id=PostgreSQL.pgAdmin　コマンドの実行結果　画像" class="wp-image-6872" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/11/01_pgadmin_notStrt_05.png 874w, https://www.kemmy-it.com/wp-content/uploads/2025/11/01_pgadmin_notStrt_05-300x69.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/11/01_pgadmin_notStrt_05-768x177.png 768w" sizes="(max-width: 874px) 100vw, 874px" /></figure>



<p>インストール中は、下記のプログレスバーが表示されます。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="499" height="392" src="https://www.kemmy-it.com/wp-content/uploads/2025/11/01_pgadmin_notStrt_04.png" alt="インストール中のプログレスバー　画像" class="wp-image-6873" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/11/01_pgadmin_notStrt_04.png 499w, https://www.kemmy-it.com/wp-content/uploads/2025/11/01_pgadmin_notStrt_04-300x236.png 300w" sizes="(max-width: 499px) 100vw, 499px" /></figure>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc28">まとめ</span></h2>



<p>pgAdmin 4の起動トラブルは「環境ファイル」「サービス」「権限」「プロキシ設定」等、多岐にわたります。特にプロキシがlocalhost通信を妨害するケースでは、環境変数 <code>NO_PROXY</code> の設定やWindowsのプロキシ除外設定が有効です。ログファイルやポート状態を確認しながら、再現性のある手順で対処することで、初心者でも安定した起動環境を構築できます。</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【PostgreSQL】非同期レプリケーション WAL遅延・肥大化の対処法（Windows）</title>
		<link>https://www.kemmy-it.com/2025/10/24/postgesql_wal_taisaku_1-2/</link>
		
		<dc:creator><![CDATA[Kemmy]]></dc:creator>
		<pubDate>Fri, 24 Oct 2025 11:45:06 +0000</pubDate>
				<category><![CDATA[PostgreSQL]]></category>
		<guid isPermaLink="false">https://www.kemmy-it.com/?p=6346</guid>

					<description><![CDATA[目次 WALの遅延と肥大化とは？WALが遅延・肥大化するとどうなる？スタンバイの同期不能フェルオーバーが不可能になるディスク容量不足によるPostgreSQLの停止バックアップが失敗するWAL遅延の原因スタンバイ側のI/ [&#8230;]]]></description>
										<content:encoded><![CDATA[

  <div id="toc" class="toc tnt-number-detail toc-center tnt-number_detail border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">WALの遅延と肥大化とは？</a></li><li><a href="#toc2" tabindex="0">WALが遅延・肥大化するとどうなる？</a><ol><li><a href="#toc3" tabindex="0">スタンバイの同期不能</a></li><li><a href="#toc4" tabindex="0">フェルオーバーが不可能になる</a></li><li><a href="#toc5" tabindex="0">ディスク容量不足によるPostgreSQLの停止</a></li><li><a href="#toc6" tabindex="0">バックアップが失敗する</a></li></ol></li><li><a href="#toc7" tabindex="0">WAL遅延の原因</a><ol><li><a href="#toc8" tabindex="0">スタンバイ側のI/O性能不足</a></li><li><a href="#toc9" tabindex="0">ネットワーク帯域の不足・不安定な接続</a></li><li><a href="#toc10" tabindex="0">スタンバイのWAL適用処理の遅延</a></li><li><a href="#toc11" tabindex="0">プライマリ側の送信プロセス不足（max_wal_senders）</a></li><li><a href="#toc12" tabindex="0">wal_keep_size の不足によるWAL早期削除</a></li><li><a href="#toc13" tabindex="0">アーカイブ処理の詰まり（archive_command）</a></li></ol></li><li><a href="#toc14" tabindex="0">遅延状況の確認方法 と LSN（Log Sequence Number）</a></li><li><a href="#toc15" tabindex="0">WAL遅延と肥大化を防ぐ対処法</a><ol><li><a href="#toc16" tabindex="0">スタンバイ側 I/O性能の向上</a></li><li><a href="#toc17" tabindex="0">ネットワーク帯域の不足・不安定な接続の解消</a></li><li><a href="#toc18" tabindex="0">スタンバイ WAL適用処理の遅延対策</a></li><li><a href="#toc19" tabindex="0">プライマリ側の送信プロセス不足対策</a></li><li><a href="#toc20" tabindex="0">wal_keep_size の不足によるWAL早期削除 対策</a></li><li><a href="#toc21" tabindex="0">アーカイブ処理の詰まり 対策</a></li></ol></li><li><a href="#toc22" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">WALの遅延と肥大化とは？</span></h2>



<p>PostgreSQLの非同期レプリケーションで最も多く発生するトラブルが、WALの遅延と肥大化です。</p>



<p>WALの遅延と肥大化とは、プライマリの変更情報がスタンバイ側に反映されるのが遅れ、その結果、反映されないWALが溜まってディスク容量を圧迫する事をいいます。</p>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc2">WALが遅延・肥大化するとどうなる？</span></h2>



<h3 class="wp-block-heading"><span id="toc3">スタンバイの同期不能</span></h3>



<p>未だスタンバイに反映されていないWALが削除され、スタンバイの再構築が必要になります。</p>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc4">フェルオーバーが不可能になる</span></h3>



<p>スタンバイが遅延してもプライマリは動作を続ける為、プライマリの状態に追いつけなくなります。よって、プライマリが故障した場合、スタンバイがプライマリとして動作できなくなります。</p>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc5">ディスク容量不足によるPostgreSQLの停止</span></h3>



<p>WALファイルは プライマリ側の<code>pg_wal</code> ディレクトリに蓄積されますが、最終的に書き込み不能となり、PostgeSQLが停止します。</p>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc6">バックアップが失敗する</span></h3>



<p>WALアーカイブが遅延すると、PITR（ポイントインリカバリ）が不可能になります。</p>



<ul class="wp-block-list">
<li><strong>PITR（ポイントインリカバリ）</strong><br>ベースバックアップ（物理バックアップ）とWALアーカイブを使用してバックアップ取得時点から任意の時刻までWALを「再生」する機能。障害直前や指定時刻の状態に復元できる。</li>
</ul>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="384" src="https://www.kemmy-it.com/wp-content/uploads/2025/05/01_blg-001-1024x384.png" alt="" class="wp-image-4877" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/05/01_blg-001-1024x384.png 1024w, https://www.kemmy-it.com/wp-content/uploads/2025/05/01_blg-001-300x113.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/05/01_blg-001-768x288.png 768w, https://www.kemmy-it.com/wp-content/uploads/2025/05/01_blg-001-1536x576.png 1536w, https://www.kemmy-it.com/wp-content/uploads/2025/05/01_blg-001.png 1600w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>




<a rel="noopener" href="https://amzn.to/48HBRs4" title="PostgreSQL&#24505;&#24213;&#20837;&#38272; &#31532;4&#29256; &#12452;&#12531;&#12473;&#12488;&#12540;&#12523;&#12363;&#12425;&#27231;&#33021;&#12539;&#20181;&#32068;&#12415;&#12289;&#12450;&#12503;&#12522;&#20316;&#12426;&#12289;&#31649;&#29702;&#12539;&#36939;&#29992;&#12414;&#12391; | &#36817;&#34276; &#38596;&#22826;, &#27491;&#37326; &#35029;&#22823;, &#22338;&#20117; &#28500;, &#40165;&#36234; &#28147;, &#31520;&#21407; &#36784;&#20161;, &#30707;&#20117; &#36948;&#22827; |&#26412; | &#36890;&#36009; | Amazon" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Famzn.to%2F48HBRs4?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">PostgreSQL&#24505;&#24213;&#20837;&#38272; &#31532;4&#29256; &#12452;&#12531;&#12473;&#12488;&#12540;&#12523;&#12363;&#12425;&#27231;&#33021;&#12539;&#20181;&#32068;&#12415;&#12289;&#12450;&#12503;&#12522;&#20316;&#12426;&#12289;&#31649;&#29702;&#12539;&#36939;&#29992;&#12414;&#12391; | &#36817;&#34276; &#38596;&#22826;, &#27491;&#37326; &#35029;&#22823;, &#22338;&#20117; &#28500;, &#40165;&#36234; &#28147;, &#31520;&#21407; &#36784;&#20161;, &#30707;&#20117; &#36948;&#22827; |&#26412; | &#36890;&#36009; | Amazon</div><div class="blogcard-snippet external-blogcard-snippet">Amazonで近藤 雄太, 正野 裕大, 坂井 潔, 鳥越 淳, 笠原 辰仁, 石井 達夫のPostgreSQL徹底入門 第4版 インストールから機能・仕組み、アプリ作り、管理・運用まで。アマゾンならポイント還元本が多数。近藤 雄太, 正野...</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://amzn.to/48HBRs4" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">amzn.to</div></div></div></div></a>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc7">WAL遅延の原因</span></h2>



<h3 class="wp-block-heading"><span id="toc8">スタンバイ側のI/O性能不足</span></h3>



<p>HDDや低IOPSのクラウドストレージでは、WALの書き込み・適用が追いつかず <code>replay_lag</code> が発生しやすくなります。特に読み取りクエリと競合する場合、顕著になります。</p>



<ul class="wp-block-list">
<li><strong>IOPS（アイオプス）</strong><br>1秒間に何回の「読み込み（Read）」や「書き込み（Write）」操作ができるかの指標</li>



<li><code><strong>replay_lag</strong></code><br>スタンバイサーバがプライマリサーバにどれだけ遅れているかを示す指標<br>例）<code>00:00:03.456</code> → 約3.4秒の遅延</li>
</ul>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc9">ネットワーク帯域の不足・不安定な接続</span></h3>



<p>プライマリ→スタンバイ間のWAL転送が詰まり、<code>write_lag</code> や <code>flush_lag</code> が発生します。VPNやクラウド間通信で多発し易い遅延です。</p>



<ul class="wp-block-list">
<li><code><strong>write_lag</strong></code><br>プライマリがWALを送信してから、スタンバイがそれを受信してメモリに書き込むまでにかかった時間</li>



<li><code><strong>flush_lag</strong></code><br>スタンバイがWALをディスクに書き込むまでにかかった時間</li>
</ul>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc10">スタンバイのWAL適用処理の遅延</span></h3>



<p>スタンバイでのクエリ実行やバックグラウンドプロセスがWALの適用を妨げたり、CPU競合やメモリ不足により発生する遅延です。</p>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc11">プライマリ側の送信プロセス不足（max_wal_senders）</span></h3>



<p>複数のスタンバイがある場合、送信プロセスが足りずにWAL送信が滞り発生します。</p>



<ul class="wp-block-list">
<li><code>max_wal_senders</code><br>PostgreSQL の設定パラメータ。WALをスタンバイやバックアップツールに送信するプロセスの最大数を指定する。</li>
</ul>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc12">wal_keep_size の不足によるWAL早期削除</span></h3>



<p>スタンバイが遅延しているのに、プライマリが未反映のWALを削除してしまいます。</p>



<ul class="wp-block-list">
<li><code>wal_keep_siz</code>e<br>PostgreSQL の設定パラメータ。プライマリサーバが保持しておくWALファイルのサイズを指定する。</li>
</ul>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc13">アーカイブ処理の詰まり（archive_command）</span></h3>



<p>アーカイブ先の容量不足やスクリプトエラーによってWALが溜まり、遅延や肥大化が発生します。</p>



<ul class="wp-block-list">
<li><code><strong>archive_command</strong></code><br>WALを外部に保存（アーカイブ）するためのコマンド。特に PITR（Point-In-Time Recovery）や長期バックアップ、スタンバイ再同期において重要な役割を果たします。</li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="384" src="https://www.kemmy-it.com/wp-content/uploads/2025/02/01_blg-004-1024x384.png" alt="レプリケーション　WALの遅延イメージ画像" class="wp-image-4116" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/02/01_blg-004-1024x384.png 1024w, https://www.kemmy-it.com/wp-content/uploads/2025/02/01_blg-004-300x113.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/02/01_blg-004-768x288.png 768w, https://www.kemmy-it.com/wp-content/uploads/2025/02/01_blg-004-1536x576.png 1536w, https://www.kemmy-it.com/wp-content/uploads/2025/02/01_blg-004.png 1600w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc14">遅延状況の確認方法 と LSN（Log Sequence Number）</span></h2>



<ul class="wp-block-list">
<li><strong>LSN（Log Sequence Number）</strong><br>WALファイルの中で「どの位置までWALが処理されたか」を示す表記方法。WALの位置を上下32ビットで、X/Y の様に表記します。
<ul class="wp-block-list">
<li>X：0 ⇀ WALセグメントの先頭（最初のファイル）</li>



<li>Y：16B6C60 ⇀ そのセグメント内のオフセット位置（バイト単位）<br></li>
</ul>
</li>
</ul>



<p>LSNの進み方（イメージ）</p>



<pre class="wp-block-code plaintext"><code>0/00000000 → 0/00001000 → 0/00002000 → ... → 0/16B6C60 → ...</code></pre>



<p>WALが書き込まれるたびに、LSNは進みます。<span class="marker-under"><strong>スタンバイが <code>replay_lsn</code> を報告することで、プライマリは「どこまで追いついているか」を把握できます。</strong></span></p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li><strong>遅延状況の確認</strong></li>
</ul>



<pre class="wp-block-code sql"><code>SELECT
  application_name,
  write_lag,
  flush_lag,
  replay_lag,
  write_lsn,
  flush_lsn,
  replay_lsn
FROM pg_stat_replication;</code></pre>



<ul class="wp-block-list">
<li><strong>write_lag</strong><br>プライマリがWALを送信してからスタンバイが受信してメモリに書き込むまでにかかった時間</li>



<li><strong>flush_lag</strong><br>スタンバイがWALをディスクに書き込むまでにかかった時間</li>



<li><strong>replay_lag</strong><br>スタンバイサーバがプライマリサーバにどれだけ遅れているかの時間</li>



<li><strong>write_lsn</strong><br>スタンバイが WALをメモリ上に書き込んだLSN</li>



<li><strong> flush_lsn</strong><br>スタンバイがWALをディスクにフラッシュ（書き込み）LSN</li>



<li><strong>replay_lsn</strong><br>スタンバイがWALを適用し、データベース状態に反映したLSN</li>
</ul>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>




<a rel="noopener" href="https://amzn.to/4hnA8KB" title="&#65339;&#25913;&#35330;3&#29256;&#65341;&#20869;&#37096;&#27083;&#36896;&#12363;&#12425;&#23398;&#12406;PostgreSQL&#8213;&#35373;&#35336;&#12539;&#36939;&#29992;&#35336;&#30011;&#12398;&#37444;&#21063; (Software Design plus) | &#19978;&#21407; &#19968;&#27193;, &#21213;&#20451; &#26234;&#25104;, &#20304;&#20271; &#26124;&#27193;, &#21407;&#30000; &#30331;&#24535; |&#26412; | &#36890;&#36009; | Amazon" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Famzn.to%2F4hnA8KB?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">&#65339;&#25913;&#35330;3&#29256;&#65341;&#20869;&#37096;&#27083;&#36896;&#12363;&#12425;&#23398;&#12406;PostgreSQL&#8213;&#35373;&#35336;&#12539;&#36939;&#29992;&#35336;&#30011;&#12398;&#37444;&#21063; (Software Design plus) | &#19978;&#21407; &#19968;&#27193;, &#21213;&#20451; &#26234;&#25104;, &#20304;&#20271; &#26124;&#27193;, &#21407;&#30000; &#30331;&#24535; |&#26412; | &#36890;&#36009; | Amazon</div><div class="blogcard-snippet external-blogcard-snippet">Amazonで上原 一樹, 勝俣 智成, 佐伯 昌樹, 原田 登志の［改訂3版］内部構造から学ぶPostgreSQL―設計・運用計画の鉄則 (Software Design plus)。アマゾンならポイント還元本が多数。上原 一樹, 勝俣 ...</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://amzn.to/4hnA8KB" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">amzn.to</div></div></div></div></a>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc15">WAL遅延と肥大化を防ぐ対処法</span></h2>



<h3 class="wp-block-heading"><span id="toc16">スタンバイ側 I/O性能の向上</span></h3>



<ul class="wp-block-list">
<li><strong>スタンバイ側のSSDへの移行</strong><br>HDDでは <code>flush_lag</code> や <code>replay_lag</code> が顕著に出るため、SSD化は最優先の対処法となります。</li>



<li><strong>IOPS保証付きインスタンス選定</strong><br>クラウド環境では IOPS制限が遅延要因になります。</li>



<li><strong>スタンバイでのクエリ制限</strong><br>読み取り専用用途に限定し、WAL適用を妨げないようにします。<br></li>
</ul>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc17">ネットワーク帯域の不足・不安定な接続の解消</span></h3>



<ul class="wp-block-list">
<li><strong>同一AZ配置</strong><br>クラウドではプライマリ・スタンバイを同一地域の独立したセンター郡に配置します。</li>



<li><strong>VPNやファイアウォールの最適化</strong><br>パケットロスや遅延の原因を排除します。</li>
</ul>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc18">スタンバイ WAL適用処理の遅延対策</span></h3>



<ul class="wp-block-list">
<li><strong>スタンバイのhot_standby_feedbackの設定<br></strong>設定を on にし、VACUUMとの衝突を防いでWAL適用をスムーズに実行できるようにします。
<ul class="wp-block-list">
<li><strong>VACUUM</strong><br>不要になったデータ（デッドタプル）を物理的に除去し、テーブルのサイズやパフォーマンスを最適化するメンテナンス処理</li>
</ul>
</li>
</ul>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc19">プライマリ側の送信プロセス不足対策</span></h3>



<ul class="wp-block-list">
<li><strong>プライマリ側の送信プロセス数を増やす</strong><br>例）max_wal_senders = 10</li>
</ul>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc20">wal_keep_size の不足によるWAL早期削除 対策</span></h3>



<ul class="wp-block-list">
<li><strong>プライマリ側でWALを保持できるファイルサイズを増やす</strong><br>例）wal_keep_size = &#8216;512MB&#8217; 　# スタンバイの遅延に応じて調整</li>
</ul>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc21">アーカイブ処理の詰まり 対策</span></h3>



<ul class="wp-block-list">
<li><strong>アーカイブ先の容量を十分に確保すると共に、容量を監視する</strong></li>



<li><strong>強制アーカイブの実施</strong><br>WALセグメントが満たされていなくても、定期的にWALファイルをアーカイブ先へ排出します。その結果、pg_wal内のWALを早めに削除でき、肥大化やスタンバイの遅延を抑制できます。</li>
</ul>



<pre class="wp-block-code plaintext"><code>archive_timeout = 60  # 60秒ごとにWALを強制アーカイブ</code></pre>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc22">まとめ</span></h2>



<p>WAL遅延と肥大化は上述したように、適切な監視と対応を実施すれば防ぐ事が可能です。使用していて異常が感じられないからといって、そのままにしておくと、ある日 突然 異常が発生し、業務が停止するばかりでなく、原因の究明と復旧に時間と労力を費やす事となります。又、場合によっては大きな損失を被る事になりまねません。</p>



<p>そうならないためにも、適切な監視を実施して異常を早めに発見し、対策する事が重要です。</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【PostgreSQL】ストリーミングレプリケーション運用ガイド：動作状況の確認（Windows）</title>
		<link>https://www.kemmy-it.com/2025/10/09/postgesql_s_rep_unyo1/</link>
		
		<dc:creator><![CDATA[Kemmy]]></dc:creator>
		<pubDate>Wed, 08 Oct 2025 21:45:22 +0000</pubDate>
				<category><![CDATA[PostgreSQL]]></category>
		<guid isPermaLink="false">https://www.kemmy-it.com/?p=6329</guid>

					<description><![CDATA[目次 はじめにレプリケーションの動作状況の確認プライマリ動作の確認スタンバイ側動作の確認PowerShellでの監視例レプリケーション監視の重要性 はじめに PostgreSQLのストリーミングレプリケーションは、データ [&#8230;]]]></description>
										<content:encoded><![CDATA[

  <div id="toc" class="toc tnt-number-detail toc-center tnt-number_detail border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6" checked><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a></li><li><a href="#toc2" tabindex="0">レプリケーションの動作状況の確認</a><ol><li><a href="#toc3" tabindex="0">プライマリ動作の確認</a></li><li><a href="#toc4" tabindex="0">スタンバイ側動作の確認</a></li><li><a href="#toc5" tabindex="0">PowerShellでの監視例</a></li></ol></li><li><a href="#toc6" tabindex="0">レプリケーション監視の重要性</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">はじめに</span></h2>



<p>PostgreSQLのストリーミングレプリケーションは、データの可用性と冗長性を高める強力な仕組みです。しかし、構築しただけでは安心できません。運用フェーズでは、レプリケーションの状態監視、障害対応、遅延対策など、複数の観点から注意を払う必要があります。</p>



<p>本ブログでは、Windows環境でPostgreSQLのストリーミングレプリケーションを構築済みの方を対象に、運用時の状態監視方法を紹介します。</p>



<p>ストリーミングレプリケーションの構築方法は下記ブログを参照ください。</p>



<p><a href="https://www.kemmy-it.com/2025/10/05/postgesql_s_replication/" data-type="link" data-id="https://www.kemmy-it.com/2025/10/05/postgesql_s_replication/">ストリーミングレプリケーション構築方法</a></p>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="384" src="https://www.kemmy-it.com/wp-content/uploads/2025/05/01_blg-001-1024x384.png" alt="状態監視方法のイメージ画像" class="wp-image-4877" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/05/01_blg-001-1024x384.png 1024w, https://www.kemmy-it.com/wp-content/uploads/2025/05/01_blg-001-300x113.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/05/01_blg-001-768x288.png 768w, https://www.kemmy-it.com/wp-content/uploads/2025/05/01_blg-001-1536x576.png 1536w, https://www.kemmy-it.com/wp-content/uploads/2025/05/01_blg-001.png 1600w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc2">レプリケーションの動作状況の確認</span></h2>



<p>まずは、レプリケーションが正常に動作しているかを定期的に確認することが重要です。</p>



<h3 class="wp-block-heading"><span id="toc3">プライマリ動作の確認</span></h3>



<p>以下のSQLで、スタンバイとの接続状況や遅延を確認します。</p>



<pre class="wp-block-code"><code>SELECT pid, client_addr, state, sync_state, write_lag, flush_lag, replay_lag
FROM pg_stat_replication;</code></pre>



<ul class="wp-block-list">
<li><code><strong>state</strong></code><br>ストリーミングレプリケーションなので、streaming なら正常</li>
</ul>



<p></p>



<ul class="wp-block-list">
<li><code><strong>sync_state</strong></code><br>同期レプリケーションなので、sync  なら正常</li>
</ul>



<p></p>



<ul class="wp-block-list">
<li><strong>write_lag</strong><br>WALをスタンバイに送信した後、スタンバイがそのWALを書き込むまでにかかった時間。<br>正常値は、0～数百ミリ秒。５秒以上ならば、スタンバイのI/O性能低下、ネットワーク障害、WAL送信設定不備などが疑われる。</li>
</ul>



<p></p>



<ul class="wp-block-list">
<li><strong>flush_lag</strong><br>プライマリサーバがWALを送信してから、スタンバイサーバがそのWALを「ディスクにフラッシュ（書き込み確定）」するまでにかかった時間を示す指標。<br>正常値は、0～数百ミリ秒。５秒以上は異常と考えられる。</li>
</ul>



<p></p>



<ul class="wp-block-list">
<li><strong>replay_lag</strong><br>スタンバイサーバがプライマリから受信したWALを「実際に適用（replay）」するまでにかかった時間を示す指標。<br>正常値は、0～数百ミリ秒。５秒以上は異常と考えられる。</li>
</ul>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li>コマンドの実行例</li>
</ul>



<div style="height:0px" aria-hidden="true" class="wp-block-spacer"></div>



<div style="height:0px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="163" src="https://www.kemmy-it.com/wp-content/uploads/2025/10/01_Postgres_Unyou-1024x163.png" alt="プライマリ動作の確認画面" class="wp-image-6338" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/10/01_Postgres_Unyou-1024x163.png 1024w, https://www.kemmy-it.com/wp-content/uploads/2025/10/01_Postgres_Unyou-300x48.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/10/01_Postgres_Unyou-768x122.png 768w, https://www.kemmy-it.com/wp-content/uploads/2025/10/01_Postgres_Unyou.png 1054w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>※write_lag、flush_log、replay_log がNULLなのは、現在新しいWALが生成されていない為。</p>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="684" src="https://www.kemmy-it.com/wp-content/uploads/2025/02/01_blg-006-1024x684.jpg" alt="プライマリ動作確認イメージ画像＿１" class="wp-image-4119" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/02/01_blg-006-1024x684.jpg 1024w, https://www.kemmy-it.com/wp-content/uploads/2025/02/01_blg-006-300x200.jpg 300w, https://www.kemmy-it.com/wp-content/uploads/2025/02/01_blg-006-768x513.jpg 768w, https://www.kemmy-it.com/wp-content/uploads/2025/02/01_blg-006-1536x1025.jpg 1536w, https://www.kemmy-it.com/wp-content/uploads/2025/02/01_blg-006.jpg 1600w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc4">スタンバイ側動作の確認</span></h3>



<p>スタンバイ側では、WAL受信状況を以下で確認できます。</p>



<pre class="wp-block-code"><code>SELECT status, receive_start_lsn, receive_start_tli, written_lsn, flushed_lsn, latest_end_lsn, latest_end_time FROM pg_stat_wal_receiver;</code></pre>



<ul class="wp-block-list">
<li><strong>status</strong><br>ストリーミングレプリケーションなので、streaming なら正常</li>
</ul>



<p></p>



<ul class="wp-block-list">
<li><strong>receive_start_lsn</strong><br>WAL受信開始位置。<br>通常運用では頻繁に変化しないため、急な変更があれば再構築や障害の兆候有り。</li>
</ul>



<p></p>



<ul class="wp-block-list">
<li><strong>receive_start_tli</strong><br>受信開始時のタイムラインID。<br>フェイルオーバー後にタイムラインが変わるため、プライマリとの整合性確認に使用する。タイムラインが一致していない場合、スタンバイが古い状態である可能性がある。</li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="384" src="https://www.kemmy-it.com/wp-content/uploads/2025/02/01_blg-004-1024x384.png" alt="スタンバイ動作確認イメージ画像＿２" class="wp-image-4116" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/02/01_blg-004-1024x384.png 1024w, https://www.kemmy-it.com/wp-content/uploads/2025/02/01_blg-004-300x113.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/02/01_blg-004-768x288.png 768w, https://www.kemmy-it.com/wp-content/uploads/2025/02/01_blg-004-1536x576.png 1536w, https://www.kemmy-it.com/wp-content/uploads/2025/02/01_blg-004.png 1600w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<ul class="wp-block-list">
<li><strong>written_lsn</strong><br>スタンバイがWALを書き込んだ最新位置。<br><code>latest_end_lsn</code> との差が大きいと、WAL受信はしているが書き込みが遅れている可能性あり。</li>
</ul>



<p></p>



<ul class="wp-block-list">
<li><strong>flushed_lsn</strong><br>スタンバイがWALをフラッシュ（ディスクに確定書き込み）した最新位置。<br><code>written_lsn</code> より遅れている場合、フラッシュ処理が滞っている。</li>
</ul>



<p></p>



<ul class="wp-block-list">
<li><strong>latest_end_lsn</strong><br>プライマリが送信した最新のWALの位置。<br><code>written_lsn</code> や <code>flushed_lsn</code> と比較して遅延を把握する。位置。</li>
</ul>



<p></p>



<ul class="wp-block-list">
<li><strong>latest_end_time</strong><br><code>latest_end_lsn</code> に対応するWALのタイムスタンプ。<br>スタンバイが最新WALをどれだけ遅れて受信しているかの目安になる。<br></li>
</ul>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li><strong>コマンドの実行例</strong></li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="202" src="https://www.kemmy-it.com/wp-content/uploads/2025/10/02_Postgres_Unyou-1024x202.png" alt="スタンバイ動作の確認画面" class="wp-image-6339" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/10/02_Postgres_Unyou-1024x202.png 1024w, https://www.kemmy-it.com/wp-content/uploads/2025/10/02_Postgres_Unyou-300x59.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/10/02_Postgres_Unyou-768x151.png 768w, https://www.kemmy-it.com/wp-content/uploads/2025/10/02_Postgres_Unyou-1536x302.png 1536w, https://www.kemmy-it.com/wp-content/uploads/2025/10/02_Postgres_Unyou.png 1829w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<p>また、現在のWAL適用位置は以下で確認できます。</p>



<pre class="wp-block-code"><code>SELECT pg_last_wal_replay_lsn();</code></pre>



<figure class="wp-block-image size-full"><img decoding="async" width="852" height="160" src="https://www.kemmy-it.com/wp-content/uploads/2025/10/03_Postgres_Unyou.png" alt="現在のWAL適用位置の確認画面" class="wp-image-6340" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/10/03_Postgres_Unyou.png 852w, https://www.kemmy-it.com/wp-content/uploads/2025/10/03_Postgres_Unyou-300x56.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/10/03_Postgres_Unyou-768x144.png 768w" sizes="(max-width: 852px) 100vw, 852px" /></figure>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="384" src="https://www.kemmy-it.com/wp-content/uploads/2025/05/01_blg-003-1024x384.png" alt="現在のWAL適用位置確認画面" class="wp-image-4878" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/05/01_blg-003-1024x384.png 1024w, https://www.kemmy-it.com/wp-content/uploads/2025/05/01_blg-003-300x113.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/05/01_blg-003-768x288.png 768w, https://www.kemmy-it.com/wp-content/uploads/2025/05/01_blg-003-1536x576.png 1536w, https://www.kemmy-it.com/wp-content/uploads/2025/05/01_blg-003.png 1600w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading"><span id="toc5">PowerShellでの監視例</span></h3>



<p>Windows環境では、PowerShellを使って定期監視スクリプトを作成できます。タスクスケジューラで定期実行すれば、ログ監視や通知にも応用可能です。</p>



<ul class="wp-block-list">
<li><strong>スクリプト例</strong>（replication_monitor.ps1）</li>
</ul>



<pre class="wp-block-code"><code>#スクリプトの実行制限（ポリシー）の確認と変更
Get-ExecutionPolicy
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

# PostgreSQL接続情報
$PGUSER = "postgres"
$PGDATABASE = "postgres"
$PGHOST = "localhost"
$PGPORT = "5432"

# psqlコマンドのパス（環境に応じて変更）
$PSQL = "C:\Program Files\PostgreSQL\17\bin\psql.exe"

# ログファイル出力先
$LOGFILE = "C:\pg_backup\pg_shell_log\replication_monitor.log"

# 日時取得
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"

# pg_stat_replicationの取得（プライマリ側のレプリケーション状態の取得）
$replication = &amp; $PSQL -U $PGUSER -d $PGDATABASE -h $PGHOST -p $PGPORT -c "SELECT state, sync_state, write_lag, flush_lag, replay_lag FROM pg_stat_replication;" 2&gt;&amp;1

# pg_stat_wal_receiverの取得（スタンバイ側のWAL受信状態取得）
$receiver = &amp; $PSQL -U $PGUSER -d $PGDATABASE -h $PGHOST -p $PGPORT -c "SELECT status, written_lsn, flushed_lsn, latest_end_lsn FROM pg_stat_wal_receiver;" 2&gt;&amp;1

# ログ出力
Add-Content -Path $LOGFILE -Value "&#91;$timestamp] Replication Status:"
Add-Content -Path $LOGFILE -Value $replication
Add-Content -Path $LOGFILE -Value "&#91;$timestamp] WAL Receiver Status:"
Add-Content -Path $LOGFILE -Value $receiver
Add-Content -Path $LOGFILE -Value "----------------------------------------"
</code></pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li><strong>実行結果</strong></li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="657" height="281" src="https://www.kemmy-it.com/wp-content/uploads/2025/10/04_Postgres_Unyou.png" alt="PowerShellでの監視例画面" class="wp-image-6344" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/10/04_Postgres_Unyou.png 657w, https://www.kemmy-it.com/wp-content/uploads/2025/10/04_Postgres_Unyou-300x128.png 300w" sizes="(max-width: 657px) 100vw, 657px" /></figure>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc6">レプリケーション監視の重要性</span></h2>



<p>レプリケーション監視は、PostgreSQLの高可用性とデータ整合性を維持するために不可欠です。</p>



<p>プライマリとスタンバイ間の遅延（write_lag、flush_lag、replay_lag）や接続状態（state、sync_state）を定期的に確認することで、障害の予兆を早期に検知できます。</p>



<p>遅延が蓄積すれば、スタンバイの昇格時にデータ不整合が生じるリスクがあり、業務停止や復旧困難につながります。監視を自動化し、可視化することで、安定運用と迅速な障害対応が可能になります。</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【PostgreSQL】2025年最新版 ストリーミングレプリケーション構築手順（Windows対応）</title>
		<link>https://www.kemmy-it.com/2025/10/05/postgesql_s_replication-2/</link>
		
		<dc:creator><![CDATA[Kemmy]]></dc:creator>
		<pubDate>Sun, 05 Oct 2025 11:23:50 +0000</pubDate>
				<category><![CDATA[PostgreSQL]]></category>
		<guid isPermaLink="false">https://www.kemmy-it.com/?p=6281</guid>

					<description><![CDATA[目次 はじめにPostgreSQLレプリケーションとは？ なぜ必要？レプリケーションのアーキテクチャストリーミングレプリケーションの特徴使用環境ストリーミングレプリケーションの設定プライマリサーバの設定postgresq [&#8230;]]]></description>
										<content:encoded><![CDATA[

  <div id="toc" class="toc tnt-number-detail toc-center tnt-number_detail border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-8" checked><label class="toc-title" for="toc-checkbox-8">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a></li><li><a href="#toc2" tabindex="0">PostgreSQLレプリケーションとは？ なぜ必要？</a></li><li><a href="#toc3" tabindex="0">レプリケーションのアーキテクチャ</a></li><li><a href="#toc4" tabindex="0">ストリーミングレプリケーションの特徴</a></li><li><a href="#toc5" tabindex="0">使用環境</a></li><li><a href="#toc6" tabindex="0">ストリーミングレプリケーションの設定</a><ol><li><a href="#toc7" tabindex="0">プライマリサーバの設定</a><ol><li><a href="#toc8" tabindex="0">postgresql.confの設定</a></li><li><a href="#toc9" tabindex="0">pg_hba.confファイルの設定</a></li><li><a href="#toc10" tabindex="0">レプリケーション権限を持つユーザーの作成</a></li><li><a href="#toc11" tabindex="0">PostgreSQLサービス再起動（PowerShell）</a></li></ol></li><li><a href="#toc12" tabindex="0">スタンバイサーバーの設定</a><ol><li><a href="#toc13" tabindex="0">初期同期の実行</a></li><li><a href="#toc14" tabindex="0">postgresql.auto.conf の内容追加</a></li><li><a href="#toc15" tabindex="0">standby.signal ファイルの作成（自動作成されていない場合）</a></li><li><a href="#toc16" tabindex="0">postgresql.conf の調整</a></li><li><a href="#toc17" tabindex="0">サービスの登録と起動（初回のみ）</a></li></ol></li></ol></li><li><a href="#toc18" tabindex="0">レプリケーション動作の確認</a></li><li><a href="#toc19" tabindex="0">ストリーミングレプリケーションのまとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">はじめに</span></h2>



<p>本ブログでは、初心者〜中級者向けにPostgreSQLのレプリケーション構築手順を紹介します。レプリケーションは大きく分けると、</p>



<ul class="wp-block-list">
<li>データベースクラスタを一括して複製する「<strong>ストリーミングレプリケーション</strong>（物理レプリケーション）」</li>



<li>テーブル単位やデータベース単位に複製する「<strong>ロジカルレプリケーション</strong>（論理レプリケーション）」</li>
</ul>



<p>があります。<strong>ここでは「ストリーミングレプリケーション」の構築を中心に紹介します。</strong></p>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc2">PostgreSQLレプリケーションとは？ なぜ必要？</span></h2>



<p>レプリケーションとは、1つのデータベース（プライマリ）から別のデータベース（スタンバイ）へリアルタイムでデータを複製する仕組みです。</p>



<p>複製を作成するメリットは、</p>



<ul class="wp-block-list">
<li><strong>障害時の迅速な復旧</strong>（フェイルオーバー）<br>プライマリが故障した場合、複製のスタンバイを使用する</li>



<li><strong>読み取り負荷の分散</strong>（参照系クエリの負荷分散）<br>ユーザーからの多くのクエリ（参照系）スタンバイに分散させる事で、全体として処理能力を高める</li>



<li><strong>災害対策（DR）</strong><br>スタンバイを遠くの地域に置く事で、災害からのデータ損失のリスクを減少させる</li>
</ul>



<p>等です。</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="397" src="https://www.kemmy-it.com/wp-content/uploads/2025/10/02_Postgres-1024x397.png" alt="レプリケーションのフェイルオーバーと負荷分散の画像" class="wp-image-6284" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/10/02_Postgres-1024x397.png 1024w, https://www.kemmy-it.com/wp-content/uploads/2025/10/02_Postgres-300x116.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/10/02_Postgres-768x298.png 768w, https://www.kemmy-it.com/wp-content/uploads/2025/10/02_Postgres.png 1072w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc3">レプリケーションのアーキテクチャ</span></h2>



<p>ストリーミングでもロジカルでも、基本的な仕組みは「ＷＡＬ」を使用している事です。</p>



<p>「ＷＡＬ」（Write Ahead Log）とは、データベースへの変更内容が全て記録されているログの事で、この「ＷＡＬ」を別のPostgreSQLに転送・リカバリして複製を作成し、レプリケーションを実現しています。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="908" height="233" src="https://www.kemmy-it.com/wp-content/uploads/2025/10/03_Postgres.png" alt="レプリケーションのアーキテクチャ図" class="wp-image-6287" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/10/03_Postgres.png 908w, https://www.kemmy-it.com/wp-content/uploads/2025/10/03_Postgres-300x77.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/10/03_Postgres-768x197.png 768w" sizes="(max-width: 908px) 100vw, 908px" /></figure>



<ul class="wp-block-list">
<li>①クエリにより「WAL」が生成され、テーブルが更新される。</li>



<li>②スタンバイに転送されてきた「WAL」をそのまま「WAL」ファイルに書き込み、「WAL」の内容で、テーブルを更新する。</li>
</ul>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<p>※プライマリから送られてきた「WAL」をそのまま適用する為、以下の条件が必要となります。</p>



<ul class="wp-block-list">
<li><strong>PostgreSQLのメジャーバージョンが同じであること</strong>
<ul class="wp-block-list">
<li>マスタとスタンバイは<strong>同じWALフォーマット・バージョン</strong>である必要あり</li>
</ul>
</li>



<li>ハードウェアやOSのアーキテクチャが同じである事</li>
</ul>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc4">ストリーミングレプリケーションの特徴</span></h2>



<p>ストリーミングレプリケーションは、<strong>WAL（Write-Ahead Logging）ファイルをリアルタイムでスタンバイサーバに転送</strong>することで、プライマリとスタンバイ間のデータ同期を実現します。</p>



<ul class="wp-block-list">
<li><strong>特徴</strong>
<ul class="wp-block-list">
<li>プライマリで生成されたWALファイルを、TCP接続を通じてスタンバイに送信</li>



<li>ファイルコピーではなく、ストリーム転送なので即時性が高い</li>



<li>スタンバイ側はSELECTのみ可能（書き込み不可）</li>
</ul>
</li>
</ul>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc5">使用環境</span></h2>



<ul class="wp-block-list">
<li>Windows 11 Pro 24H2</li>



<li>PostgreSQL 17.6</li>



<li>プライマリサーバのＩＰ　：192.168.0.80</li>



<li>スタンバイサーバーのＩＰ：192.168.0.60</li>
</ul>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc6">ストリーミングレプリケーションの設定</span></h2>



<h3 class="wp-block-heading"><span id="toc7">プライマリサーバの設定</span></h3>



<h4 class="wp-block-heading"><span id="toc8">postgresql.confの設定</span></h4>



<p>postgresql.confは<strong>メイン設定ファイル</strong>であり、データベースの動作に関するさまざまなパラメータを定義する重要な役割を担っています</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<div style="height:0px" aria-hidden="true" class="wp-block-spacer"></div>



<p>先ずは、postgresql.confをプライマリサーバ用に設定します。</p>



<ul class="wp-block-list">
<li>基本接続</li>
</ul>



<pre class="wp-block-code plaintext"><code>listen_addresses = '*'　　　　　　　#外部からの全ての接続を許可
port = 5432　　　　　　　　　　　　 #デフォルトの待ち受けポート</code></pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li>WAL（Write-Ahead Logging）関連設定</li>
</ul>



<pre class="wp-block-code plaintext"><code>wal_level = replica　　　　　　　　#レプリケーション用にreplicaを指定
　　　　　　　　　　　　　　　　　 #ロジカルなら logical を指定
max_wal_senders = 5　　　　　　　　#スタンバイ接続数の上限（必要に応じて設定）
wal_keep_size = '256MB'　　　　　　#WALファイルの保持サイズ。遅延対策に有効。</code></pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li>同期レプリケーション設定</li>
</ul>



<pre class="wp-block-code plaintext"><code>synchronous_commit = on                        #同期レプリケーションを明示的に指定
　　　　　　　　　　　　　　　　　　　　　　　 #標準は、on
synchronous_standby_names = 'standby01'　　　　#同期レプリケーションを使用する場合の
　　　　　　　　　　　　　　　　　　　　　　　 #スタンバイ側の名称を指定</code></pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li>ログ出力設定（トラブルシューティング）</li>
</ul>



<pre class="wp-block-code plaintext"><code>logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_connections = on
log_disconnections = on</code></pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li>メモリ・パフォーマンス関連（環境に応じて調整）</li>
</ul>



<pre class="wp-block-code plaintext"><code>shared_buffers = '512MB'　　　　#PostgreSQLが使用するメモリ領域。物理メモリの
                                #25〜40%が目安。
effective_cache_size = '1GB'　　#OS側のキャッシュ見積もり。クエリプランに影響。
work_mem = '4MB'　　　　　　　　#ソートやハッシュ処理に使うメモリ。
                                #複雑なクエリが多い場合は増やす。
maintenance_work_mem = '64MB'   #PostgreSQLが「メンテナンス系の処理」を
                                #行うときに使うメモリの上限</code></pre>



<p>上記の値は必要に応じて設定してください。</p>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc9">pg_hba.confファイルの設定</span></h4>



<p>pg_hba.confは<strong>接続認証の制御ファイル</strong>で、<strong>誰が・どこから・どの方法で接続できるか</strong>を定義します。</p>



<p>インストールされたファイルはUNIX用なので、以下の様にWndows用に書き換えます。</p>



<pre class="wp-block-code plaintext"><code># TYPE  DATABASE        USER            ADDRESS                 METHOD
# IPv4 local connections:
host    all             all             127.0.0.1/32         scram-sha-256


# IPv6 local connections:
host    all             all             ::1/128                 scram-sha-256

# Allow replication connections from localhost, by a user with the replication privilege.
host    replication     replicator      192.168.0.60/24         scram-sha-256</code></pre>



<ul class="wp-block-list">
<li>host all all 127.0.0.1/24 scram-sha-256<br>すべてのデータベースに対して、全てのユーザーから接続を許可しています。</li>



<li>host replication replicator 192.168.0.60/24 scram-sha-256<br>レプリケーション専用接続で、ID：replicatorで（192.168.0.1～254：スタンバイサーバー）からプライマリサーバ（192.168.0.80）にアクセスを許可しています。</li>
</ul>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc10">レプリケーション権限を持つユーザーの作成</span></h4>



<ul class="wp-block-list">
<li>下記コマンドで作成します。</li>
</ul>



<pre class="wp-block-code sql"><code>CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD 'reppass';</code></pre>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc11">PostgreSQLサービス再起動（PowerShell）</span></h4>



<ul class="wp-block-list">
<li>PostgreSQLが正常に再起動するか確認します。</li>
</ul>



<pre class="wp-block-code bash"><code>Restart-Service -Name postgresql-x64-17</code></pre>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc12">スタンバイサーバーの設定</span></h3>



<h4 class="wp-block-heading"><span id="toc13">初期同期の実行</span></h4>



<p>pg_basebackupでプライマリからデータを取得し、初期同期を実行します。</p>



<ul class="wp-block-list">
<li>C:\pgsql　フォルダを作成</li>
</ul>



<pre class="wp-block-code bash"><code>mkdir C:\pgsql</code></pre>



<ul class="wp-block-list">
<li>下記コマンドで初期同期を実行</li>
</ul>



<pre class="wp-block-code bash"><code>cd "C:\Program Files\PostgreSQL\17\bin"
.\pg_basebackup.exe -h 192.168.0.80 -D "C:\pgsql\standby_data" -U replicator -P -R -W</code></pre>



<p><strong><span class="marker-under-red">これから以後のファイル設定は、&#8221;C:\pgsql\standby_data&#8221;　内のファイルに対して行います。</span></strong></p>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc14">postgresql.auto.conf の内容追加</span></h4>



<p>postgresql.auto.conf に下記の内容を追加します。<code>application_name</code> はプライマリ側の <code>synchronous_standby_names</code> に一致させると同期レプリケーションが可能となります。</p>



<pre class="wp-block-code plaintext"><code>primary_conninfo = 'host=192.168.0.80 port=5432 user=replicator password=reppass application_name=standby01'</code></pre>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc15">standby.signal ファイルの作成（自動作成されていない場合）</span></h4>



<p>内容は無くてもよいが、このファイルが存在することで、PostgreSQLはスタンバイモードで起動します。作成方法は下記コマンドを実行。</p>



<pre class="wp-block-code bash"><code>New-Item -Path "C:\pgsql\standby_data\standby.signal" -ItemType File</code></pre>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc16">postgresql.conf の調整</span></h4>



<p>postgresql.conf ファイルの内容が、下記のようになるよう調整します。</p>



<pre class="wp-block-code plaintext"><code># 接続関連
listen_addresses = '*'                 # 外部からの接続を許可
port = 5432                            # 通常のPostgreSQLポート

# WAL受信と適用
wal_level = replica                    # WALを受信する最低レベル
hot_standby = on                       # スタンバイでもSELECTなどの読み取りを許可
wal_receiver_status_interval = 1s     # プライマリへの受信状況報告間隔
wal_retrieve_retry_interval = 3s      # WAL取得失敗時の再試行間隔

# ログ出力（トラブル時の診断に必須）
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_min_messages = info
log_connections = on
log_disconnections = on</code></pre>



<p>hot_standby = on により、スタンバイでも読み取りクエリが可能になります。</p>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc17">サービスの登録と起動（初回のみ）</span></h4>



<ul class="wp-block-list">
<li><strong>サービスの登録</strong><br>スタンバイ側で下記のコマンドを実行して「pgsql-standby」サービスを登録します。 C:\Program Files\PostgreSQL\17\bin にパスを通すか、ディレクトリに移動して実行。</li>
</ul>



<pre class="wp-block-code bash"><code>cd "C:\Program Files\PostgreSQL\17\bin"
./pg_ctl register -N "pgsql-standby" -D "C:\pgsql\standby_data"</code></pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li>サービスの起動<br>下記コマンドを実行</li>
</ul>



<pre class="wp-block-code bash"><code>Start-Service -Name pgsql-standby</code></pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li>動作確認<br>下記SELECT文で、trueが返ればスタンバイとして動作中です。</li>
</ul>



<pre class="wp-block-code sql"><code>SELECT pg_is_in_recovery();</code></pre>



<figure class="wp-block-image size-full"><img decoding="async" width="592" height="146" src="https://www.kemmy-it.com/wp-content/uploads/2025/10/06_Postgres.png" alt="" class="wp-image-6321" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/10/06_Postgres.png 592w, https://www.kemmy-it.com/wp-content/uploads/2025/10/06_Postgres-300x74.png 300w" sizes="(max-width: 592px) 100vw, 592px" /></figure>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc18">レプリケーション動作の確認</span></h2>



<p>プライマリ側のテーブルに１件のレコードを追加した場合、スタンバイ側にも同様に追加されるか確認してみます。</p>



<ul class="wp-block-list">
<li><strong>プライマリ側の操作</strong><br>articlesテーブルに1件のレコードを追加</li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="430" src="https://www.kemmy-it.com/wp-content/uploads/2025/10/04_Postgres-1024x430.png" alt="プライマリ側のレコード追加画面。" class="wp-image-6310" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/10/04_Postgres-1024x430.png 1024w, https://www.kemmy-it.com/wp-content/uploads/2025/10/04_Postgres-300x126.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/10/04_Postgres-768x323.png 768w, https://www.kemmy-it.com/wp-content/uploads/2025/10/04_Postgres.png 1031w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li><strong>スタンドバイ側の状態</strong><br>プライマリ側に追加されたレコードが、スタンドバイ側にも追加され、同期している事が確認できます。</li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="201" src="https://www.kemmy-it.com/wp-content/uploads/2025/10/05_Postgres-1024x201.png" alt="スタンドバイ側の同期状態の画像" class="wp-image-6311" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/10/05_Postgres-1024x201.png 1024w, https://www.kemmy-it.com/wp-content/uploads/2025/10/05_Postgres-300x59.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/10/05_Postgres-768x151.png 768w, https://www.kemmy-it.com/wp-content/uploads/2025/10/05_Postgres.png 1032w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc19">ストリーミングレプリケーションのまとめ</span></h2>



<p>ストリーミングレプリケーションは、基本的にデータベース全体を複製します。レプリケーションの元となるサーバーは１台だけ設定できますが、スタンバイは複数台設定できます。又、スタンバイサーバーで実行できるのは参照系のクエリのみです。</p>



<p>冒頭でも述べましたが、ストリーミングレプリケーションは、PostgreSQLの高可用性を実現する重要な機能です。設定はシンプルですが、細部の確認が成功の鍵。この記事を参考に、安全で再現性の高い構成を作成して下さい。</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【PostgreSQL】フルテキスト検索入門｜pg_trgmとLIKE検索を徹底比較（初心者向）</title>
		<link>https://www.kemmy-it.com/2025/09/28/pgadmin_fulltext/</link>
		
		<dc:creator><![CDATA[Kemmy]]></dc:creator>
		<pubDate>Sun, 28 Sep 2025 01:28:38 +0000</pubDate>
				<category><![CDATA[PostgreSQL]]></category>
		<guid isPermaLink="false">https://www.kemmy-it.com/?p=6231</guid>

					<description><![CDATA[目次 PostgreSQLで全文検索を使う理由使用環境LIKE検索とpg_trgmの違いLIKE検索pg_trgmGINインデックスLIKE検索・pg_trgm　どちらを使用すべきか？LIKE検索・pg_trgm 比較準 [&#8230;]]]></description>
										<content:encoded><![CDATA[

  <div id="toc" class="toc tnt-number-detail toc-center tnt-number_detail border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-10" checked><label class="toc-title" for="toc-checkbox-10">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">PostgreSQLで全文検索を使う理由</a></li><li><a href="#toc2" tabindex="0">使用環境</a></li><li><a href="#toc3" tabindex="0">LIKE検索とpg_trgmの違い</a><ol><li><a href="#toc4" tabindex="0">LIKE検索</a></li><li><a href="#toc5" tabindex="0">pg_trgm</a></li><li><a href="#toc6" tabindex="0">GINインデックス</a></li><li><a href="#toc7" tabindex="0">LIKE検索・pg_trgm　どちらを使用すべきか？</a></li></ol></li><li><a href="#toc8" tabindex="0">LIKE検索・pg_trgm 比較準備</a><ol><li><a href="#toc9" tabindex="0">サンプルテーブルの作成とデータ登録</a></li><li><a href="#toc10" tabindex="0">SQLでの拡張機能「pg_trgm」の有効化</a></li></ol></li><li><a href="#toc11" tabindex="0">LIKE検索・pg_trgm検索結果の比較</a><ol><li><a href="#toc12" tabindex="0">pgAdmin4 による検索結果の比較</a><ol><li><a href="#toc13" tabindex="0">pgAdmin4 のクエリ完了時間 とは</a></li><li><a href="#toc14" tabindex="0">サーバー側の実行処理のみの時間や、実行前の準備の時間を知りたい場合</a></li><li><a href="#toc15" tabindex="0">pgAdmin4 による検索結果</a></li></ol></li></ol></li><li><a href="#toc16" tabindex="0">インデックスの作成とパフォーマンス比較</a><ol><li><a href="#toc17" tabindex="0">GINインデックス作成</a></li></ol></li><li><a href="#toc18" tabindex="0">PostgreSQL 「フルテキスト検索入門」 まとめ</a></li><li><a href="#toc19" tabindex="0">脚　注</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">PostgreSQLで全文検索を使う理由</span></h2>



<p>Webアプリや業務システムで「検索機能」は欠かせません。PostgreSQLは、標準SQLだけでなく強力な全文検索機能を備えており、特に<code>pg_trgm</code>拡張を使うことで、LIKE検索より高速かつ柔軟な検索が可能になります。</p>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc2">使用環境</span></h2>



<ul class="wp-block-list">
<li>Windows 11 Pro 24H2</li>



<li>PostgreSQL 17.6</li>



<li>pgAdmin4 9.6</li>



<li>Chrome 134.0.6998.205</li>
</ul>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc3">LIKE検索とpg_trgmの違い</span></h2>



<h3 class="wp-block-heading"><span id="toc4">LIKE検索</span></h3>



<ul class="wp-block-list">
<li><strong>SQL標準の部分一致検索にしか過ぎない</strong>
<ul class="wp-block-list">
<li>例：WHERE content LIKE &#8216;%検索%&#8217;</li>



<li><code>%</code>は任意の文字列を表すワイルドカード</li>
</ul>
</li>



<li><strong>問題点</strong>
<ul class="wp-block-list">
<li>インデックスが効きにくい（特に先頭に<code>%</code>がある場合）</li>



<li>大量データになると検索が遅くなる</li>
</ul>
</li>
</ul>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc5">pg_trgm</span></h3>



<ul class="wp-block-list">
<li><strong>全文検索をする為の拡張機能</strong>
<ul class="wp-block-list">
<li>文字列を「3文字ずつの断片（トライグラム）」に分解して類似度を計算</li>



<li>例：<code>WHERE content % '検索'</code>（<code>%</code>はpg_trgm演算子）</li>
</ul>
</li>
</ul>



<ul class="wp-block-list">
<li><strong>利点</strong>
<ul class="wp-block-list">
<li>類似検索が可能（完全一致でなくてもヒット）</li>



<li>インデックス（GINインデックス）と組み合わせると高速</li>
</ul>
</li>
</ul>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc6">GINインデックス</span></h3>



<ul class="wp-block-list">
<li><strong>Generalized Inverted Index（汎用反転インデックス<sup data-fn="2449c5a2-0efc-4872-9dd6-aab14e58a3d6" class="fn"><a href="#2449c5a2-0efc-4872-9dd6-aab14e58a3d6" id="2449c5a2-0efc-4872-9dd6-aab14e58a3d6-link">1</a></sup>）</strong>
<ul class="wp-block-list">
<li><code>pg_trgm</code>と組み合わせることで、<strong>トライグラム単位</strong><sup data-fn="37b7f8e9-c1c4-426b-a07a-df163b57473e" class="fn"><a href="#37b7f8e9-c1c4-426b-a07a-df163b57473e" id="37b7f8e9-c1c4-426b-a07a-df163b57473e-link">2</a></sup>で高速検索可能</li>
</ul>
</li>
</ul>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc7">LIKE検索・pg_trgm　どちらを使用すべきか？</span></h3>



<ul class="wp-block-list">
<li><strong>小規模・簡易検索</strong>
<ul class="wp-block-list">
<li>LIKEで十分</li>
</ul>
</li>



<li><strong>大量データ・類似検索・高速化</strong>
<ul class="wp-block-list">
<li>pg_trgm＋GINインデックスが圧倒的に有利</li>
</ul>
</li>
</ul>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc8">LIKE検索・pg_trgm 比較準備</span></h2>



<h3 class="wp-block-heading"><span id="toc9">サンプルテーブルの作成とデータ登録</span></h3>



<ul class="wp-block-list">
<li><strong>下記サンプルプログラムを作成します。サンプルプログラムの目的は、</strong>
<ul class="wp-block-list">
<li>LIKE検索とpg_trgm検索の違いを体感する</li>



<li>GINインデックスの有無による速度差を確認する</li>



<li>類似語や誤字でもヒットするかを試す(下記プログラムの、WHEN i % 3 = 1 THEN &#8216;PosgrelSQLは高速な検索が可能です。’　では、<span class="marker-under-red"><strong>PostgreSQL</strong> </span>を<span class="marker-under-red"> <strong>PosgrelSQL </strong></span>にしています。)</li>
</ul>
</li>
</ul>



<pre class="wp-block-code sql"><code>-- サンプルプログラム

CREATE TABLE articles (
  id SERIAL PRIMARY KEY,
  title TEXT,
  content TEXT
);

-- 10000件のサンプルデータを生成（実験用）
INSERT INTO articles (title, content)
SELECT
  '記事' || i,
  CASE
    WHEN i % 3 = 0 THEN '<strong><span class="marker-under-red">PostgreSQL</span></strong>の全文検索は便利です。'
    WHEN i % 3 = 1 THEN '<strong><span class="marker-under-red">PosgrelSQL</span></strong>は高速な検索が可能です。'
    ELSE 'PostgreSQLはオープンソースのRDBMSです。'
  END
FROM generate_series(1, 10000) AS s(i);</code></pre>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc10">SQLでの拡張機能「pg_trgm」の有効化</span></h3>



<ul class="wp-block-list">
<li><strong>psql</strong> で以下のSQLを実行</li>
</ul>



<pre class="wp-block-code sql"><code>CREATE EXTENSION IF NOT EXISTS pg_trgm;</code></pre>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc11">LIKE検索・pg_trgm検索結果の比較</span></h2>



<h3 class="wp-block-heading"><span id="toc12">pgAdmin4 による検索結果の比較</span></h3>



<p>ここでは、初心者向けでもある為、pgAdmin4の「クエリツール」で確認します。</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc13">pgAdmin4 のクエリ完了時間 とは</span></h4>



<p>pgAdmin 4がクエリをPostgreSQLに送信し、サーバーが処理して結果を返し、pgAdminがそれを受け取って表示するまでの<strong>一連の流れにかかった時間</strong>です。（以下の表の合計時間）</p>



<figure class="wp-block-flexible-table-block-table"><table class=""><thead><tr><th>処理ステップ</th><th style="text-align:center">内   容</th></tr></thead><tbody><tr><td>クエリ送信</td><td style="text-align:left">pgAdmin → PostgreSQLサーバーへSQLを送信</td></tr><tr><td>実行計画構築</td><td style="text-align:left">PostgreSQLが最適な実行方法を決定（Planning Time）</td></tr><tr><td>実行処理</td><td style="text-align:left">実際にデータを読み込んで処理（Execution Time</td></tr><tr><td>結果返却</td><td style="text-align:left">PostgreSQL → pgAdminへ結果を返す</td></tr><tr><td>表示処理</td><td style="text-align:left">表示処理</td></tr></tbody></table></figure>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc14">サーバー側の実行処理のみの時間や、実行前の準備の時間を知りたい場合</span></h4>



<p><strong>以下のコマンドを使用します。</strong></p>



<ul class="wp-block-list">
<li><strong>LIKE検索</strong></li>
</ul>



<pre class="wp-block-code sql"><code>EXPLAIN ANALYZE SELECT * FROM articles WHERE content LIKE '%PostgreSQL%';</code></pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li><strong>pg_trgm検索</strong></li>
</ul>



<pre class="wp-block-code sql"><code>EXPLAIN ANALYZE SELECT * FROM articles WHERE content % 'PostgreSQL';</code></pre>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc15">pgAdmin4 による検索結果</span></h4>



<ul class="wp-block-list">
<li><strong>LIKEの実行確認用SQL</strong></li>
</ul>



<pre class="wp-block-code sql"><code>-- 部分一致検索（検索語：PostgreSQL）
SELECT * FROM articles WHERE content LIKE '%PostgreSQL%';</code></pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li><strong>実行結果と実行時間</strong>
<ul class="wp-block-list">
<li>検索件数：6,666件</li>



<li>検索時間：0.170ms</li>
</ul>
</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="785" height="313" src="https://www.kemmy-it.com/wp-content/uploads/2025/09/10_PostgreSQL_fulltext.png" alt="" class="wp-image-6251" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/09/10_PostgreSQL_fulltext.png 785w, https://www.kemmy-it.com/wp-content/uploads/2025/09/10_PostgreSQL_fulltext-300x120.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/09/10_PostgreSQL_fulltext-768x306.png 768w" sizes="(max-width: 785px) 100vw, 785px" /></figure>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li><strong>pg_trgmの<strong>実行確認用SQL</strong></strong></li>
</ul>



<pre class="wp-block-code sql"><code>-- pg_trgm検索（類似度）
SELECT * FROM articles WHERE content % 'PostgreSQL';</code></pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li><strong>実行結果と実行時間</strong>
<ul class="wp-block-list">
<li>検索件数：10,000件</li>



<li>検索時間：0.197ms</li>



<li>類似文字（ここでは、<strong><span class="marker-under-red">PosgrelSQL</span></strong>）も検索されている為多少時間がかかっていると思われる。</li>
</ul>
</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="792" height="314" src="https://www.kemmy-it.com/wp-content/uploads/2025/09/12_PostgreSQL_fulltext.png" alt="pg_trgm　による検索結果画面。" class="wp-image-6252" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/09/12_PostgreSQL_fulltext.png 792w, https://www.kemmy-it.com/wp-content/uploads/2025/09/12_PostgreSQL_fulltext-300x119.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/09/12_PostgreSQL_fulltext-768x304.png 768w" sizes="(max-width: 792px) 100vw, 792px" /></figure>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc16">インデックスの作成とパフォーマンス比較</span></h2>



<h3 class="wp-block-heading"><span id="toc17">GINインデックス作成</span></h3>



<ul class="wp-block-list">
<li>下記のSQLを実行してGINインデックス作成を作成します</li>
</ul>



<pre class="wp-block-code sql"><code>CREATE INDEX articles_idx ON articles USING GIN (content gin_trgm_ops);</code></pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li><strong>インデックスが作成されているか？</strong></li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="812" height="181" src="https://www.kemmy-it.com/wp-content/uploads/2025/09/07_PostgreSQL_fulltext.png" alt="GINインデックスの確認画面。" class="wp-image-6243" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/09/07_PostgreSQL_fulltext.png 812w, https://www.kemmy-it.com/wp-content/uploads/2025/09/07_PostgreSQL_fulltext-300x67.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/09/07_PostgreSQL_fulltext-768x171.png 768w" sizes="(max-width: 812px) 100vw, 812px" /></figure>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li><strong>pg_trgm</strong>＋<strong>GINインデックスの実行結果</strong></li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="801" height="313" src="https://www.kemmy-it.com/wp-content/uploads/2025/09/13_PostgreSQL_fulltext.png" alt="pg_trgm＋GINインデックスの検索結果画面。" class="wp-image-6253" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/09/13_PostgreSQL_fulltext.png 801w, https://www.kemmy-it.com/wp-content/uploads/2025/09/13_PostgreSQL_fulltext-300x117.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/09/13_PostgreSQL_fulltext-768x300.png 768w" sizes="(max-width: 801px) 100vw, 801px" /></figure>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc18">PostgreSQL 「フルテキスト検索入門」 まとめ</span></h2>



<p>PostgreSQLでの文字列検索は、<code>LIKE '%文字列%'</code> が基本ですが、インデックスが効かず遅くなりがちです。そこで登場するのが <code>pg_trgm</code> 拡張。<strong>曖昧検索を高速化する強力な武器</strong>です。</p>



<ul class="wp-block-list">
<li><strong>LIKE検索の課題</strong>
<ul class="wp-block-list">
<li><code>%</code> で始まる検索はインデックスが使えない</li>



<li>全件走査（Seq Scan）になり、件数が多いと遅い</li>



<li>日本語や長文では特に非効率</li>
</ul>
</li>
</ul>



<ul class="wp-block-list">
<li><strong>pg_trgmとは？</strong>
<ul class="wp-block-list">
<li>「トライグラム（3文字単位）」で文字列を分割し、類似度を計算</li>



<li><code>%</code> 演算子で曖昧検索が可能（<code>content % '検索語'</code>）</li>



<li>GINインデックスと組み合わせることで爆速化</li>
</ul>
</li>
</ul>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc19">脚　注</span></h2>


<ol class="wp-block-footnotes"><li id="2449c5a2-0efc-4872-9dd6-aab14e58a3d6"><strong>GINインデックス</strong>（<strong>汎用反転インデックス</strong>）<br>通常のインデックス（BTREEなど）は「行単位」でインデックスを作りますが、<strong>反転インデックス</strong>は「値 → 行」の逆方向でインデックスを作ります。<br>例）<br>通常：<code>id → content</code><br>反転：<code>単語 → 含まれる行ID</code><br>つまり、検索語に対応する行を高速に引き出すための構造です。<br> <a href="#2449c5a2-0efc-4872-9dd6-aab14e58a3d6-link" aria-label="脚注参照1にジャンプ">↩︎</a></li><li id="37b7f8e9-c1c4-426b-a07a-df163b57473e"><strong>トライグラム単位</strong><br>・「Tri（3）」＋「gram（文字列単位）」＝<strong>3文字の連続部分列</strong><br>・文字列を3文字ずつの断片に分割して、検索語との<strong>共通部分の数</strong>で類似度を計算<br> <a href="#37b7f8e9-c1c4-426b-a07a-df163b57473e-link" aria-label="脚注参照2にジャンプ">↩︎</a></li></ol>


<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【PostgreSQL】ストアドファンクション・ストアドプロシジャ 違いと用途を徹底比較（初心者）</title>
		<link>https://www.kemmy-it.com/2025/09/20/pgadmin_stored/</link>
		
		<dc:creator><![CDATA[Kemmy]]></dc:creator>
		<pubDate>Sat, 20 Sep 2025 11:41:30 +0000</pubDate>
				<category><![CDATA[PostgreSQL]]></category>
		<guid isPermaLink="false">https://www.kemmy-it.com/?p=6135</guid>

					<description><![CDATA[目次 はじめに使用環境ストアドファンクション（Stored Function）とは？ストアドプロシジャ（Stored Procedure）とは？ストアドファンクション・ストアドプロシジャの作成と実行テーブルの作成ストアド [&#8230;]]]></description>
										<content:encoded><![CDATA[

  <div id="toc" class="toc tnt-number-detail toc-center tnt-number_detail border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-12" checked><label class="toc-title" for="toc-checkbox-12">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a></li><li><a href="#toc2" tabindex="0">使用環境</a></li><li><a href="#toc3" tabindex="0">ストアドファンクション（Stored Function）とは？</a></li><li><a href="#toc4" tabindex="0">ストアドプロシジャ（Stored Procedure）とは？</a></li><li><a href="#toc5" tabindex="0">ストアドファンクション・ストアドプロシジャの作成と実行</a><ol><li><a href="#toc6" tabindex="0">テーブルの作成</a></li><li><a href="#toc7" tabindex="0">ストアドファンクションの作成</a><ol><li><a href="#toc8" tabindex="0">psqlでの作成</a></li><li><a href="#toc9" tabindex="0">pgadmin4 での作成</a></li></ol></li><li><a href="#toc10" tabindex="0">ストアドプロシジャの作成</a><ol><li><a href="#toc11" tabindex="0">psqlでの作成</a></li><li><a href="#toc12" tabindex="0">pgadmin4 での作成</a></li></ol></li></ol></li><li><a href="#toc13" tabindex="0">ストアドファンクション・ストアドプロシジャの実行</a></li><li><a href="#toc14" tabindex="0">有効活用できる場面</a><ol><li><a href="#toc15" tabindex="0">ストアドファンクション</a></li><li><a href="#toc16" tabindex="0">ストアドプロシジャ</a></li></ol></li><li><a href="#toc17" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">はじめに</span></h2>



<p>PostgreSQLを使った業務システム開発において、ストアドプロシジャ（<code>PROCEDURE</code>）とストアドファンクション（<code>FUNCTION</code>）は、処理の再利用性や保守性を高める重要な要素です。</p>



<p>本ブログでは、「psql」と「pgAdmin4」を使って、簡単な「本の在庫管理システム」を題材に、両者の違いや使い方を紹介します。</p>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc2">使用環境</span></h2>



<ul class="wp-block-list">
<li>Windows 11 Pro 24H2</li>



<li>PostgreSQL 17.6</li>



<li>pgAdmin4 9.6</li>



<li>Chrome 134.0.6998.205</li>
</ul>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc3">ストアドファンクション（Stored Function）とは？</span></h2>



<p>ストアドファンクションは、<strong>値を返す処理を定義するSQLの関数</strong>です。たとえば「在庫数を取得する」「売上を計算する」といった処理を関数として定義し、<code>SELECT</code>文などから呼び出すことができます。</p>



<ul class="wp-block-list">
<li><strong>特徴</strong>
<ul class="wp-block-list">
<li>RETURNS で戻り値を定義</li>



<li>SELECT や PERFORM で呼び出し</li>



<li>単一の値や集計結果を返す用途に最適</li>
</ul>
</li>



<li><strong>基本構文</strong></li>
</ul>



<pre class="wp-block-code"><code>CREATE &#91;OR REPLACE] FUNCTION 関数名(引数 型, ...)
RETURNS 戻り値の型
LANGUAGE plpgsql
AS $$
DECLARE
  -- 変数宣言（任意）
BEGIN
  -- 処理内容
  RETURN 戻り値;
END;
$$;</code></pre>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc4">ストアドプロシジャ（Stored Procedure）とは？</span></h2>



<p>ストアドプロシジャは、<strong>複数ステップの処理や副作用を伴う業務ロジックをまとめた手続き型の処理</strong>です。たとえば「在庫を更新し、ログを記録する」といった一連の処理を1つのプロシジャにまとめることができます。</p>



<ul class="wp-block-list">
<li><strong>特徴</strong>
<ul class="wp-block-list">
<li>戻り値はなし（ただしOUTパラメータは使える）</li>



<li><code>CALL</code> で呼び出し</li>



<li><code>BEGIN</code>, <code>COMMIT</code>, <code>ROLLBACK</code> によるトランザクション制御が可能</li>



<li>複雑な業務処理に適している</li>
</ul>
</li>



<li><strong>基本構文</strong></li>
</ul>



<pre class="wp-block-code"><code>CREATE &#91;OR REPLACE] PROCEDURE プロシジャ名(引数 型, ...)
LANGUAGE plpgsql
AS $$
DECLARE
  -- 変数宣言（任意）
BEGIN
  -- 処理内容（複数ステップ可）
  -- トランザクション制御も可能
END;
$$;</code></pre>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc5">ストアドファンクション・ストアドプロシジャの作成と実行</span></h2>



<h3 class="wp-block-heading"><span id="toc6">テーブルの作成</span></h3>



<p>先ず 以下のテーブルを作成します。</p>



<ul class="wp-block-list">
<li>booksテーブル<br>在庫数テーブル。在庫数を入力しておき、ストアドファンクションから参照されます。</li>
</ul>



<pre class="wp-block-code"><code>CREATE TABLE books (
  book_id SERIAL PRIMARY KEY,
  title TEXT NOT NULL,
  stock INT DEFAULT 0
);</code></pre>



<figure class="wp-block-image size-full"><img decoding="async" width="928" height="507" src="https://www.kemmy-it.com/wp-content/uploads/2025/09/01_PostgreSQL_Stoerd.png" alt="booksテーブルのデータ表示画面" class="wp-image-6141" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/09/01_PostgreSQL_Stoerd.png 928w, https://www.kemmy-it.com/wp-content/uploads/2025/09/01_PostgreSQL_Stoerd-300x164.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/09/01_PostgreSQL_Stoerd-768x420.png 768w" sizes="(max-width: 928px) 100vw, 928px" /></figure>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li><strong>stock_logs</strong><br>在庫数の変化を記録するログテーブルです。ストアドプロシジャによって更新されます。</li>
</ul>



<pre class="wp-block-code"><code>CREATE TABLE stock_logs (
  log_id SERIAL PRIMARY KEY,
  book_id INT REFERENCES books(book_id),
  change INT,
  log_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);</code></pre>



<figure class="wp-block-image size-full"><img decoding="async" width="873" height="332" src="https://www.kemmy-it.com/wp-content/uploads/2025/09/02_PostgreSQL_Stoerd-1.png" alt="stock_logsの内容表示画面。" class="wp-image-6146" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/09/02_PostgreSQL_Stoerd-1.png 873w, https://www.kemmy-it.com/wp-content/uploads/2025/09/02_PostgreSQL_Stoerd-1-300x114.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/09/02_PostgreSQL_Stoerd-1-768x292.png 768w" sizes="(max-width: 873px) 100vw, 873px" /></figure>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc7">ストアドファンクションの作成</span></h3>



<p>在庫数を取得するストアドファンクションを作成します。</p>



<p>記号：$$は、<strong>「ドルクオート（dollar-quoting）」と呼ばれる構文で、関数やプロシジャの本体（つまりPL/pgSQLコード）を囲むための区切り記号です。</strong></p>



<pre class="wp-block-code"><code>-- 関数を作成または置き換える（既存の関数があれば上書き）
CREATE OR REPLACE FUNCTION get_stock(book_title TEXT)
-- 戻り値の型を指定（在庫数：整数）
RETURNS INT AS $$
-- 変数宣言部：在庫数を一時的に保持する変数
DECLARE
  current_stock INT;
BEGIN
  -- booksテーブルから、指定されたタイトルの在庫数を取得し、変数に格納
  SELECT stock INTO current_stock
  FROM books
  WHERE title = book_title;
  -- 取得した在庫数を関数の戻り値として返す
  RETURN current_stock;
END;
-- PL/pgSQL言語で記述された関数であることを指定
$$ LANGUAGE plpgsql;</code></pre>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc8">psqlでの作成</span></h4>



<p>psqlに「CREATE FUNCTION…」文を入力して作成。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="745" height="798" src="https://www.kemmy-it.com/wp-content/uploads/2025/09/10_PostgreSQL_Stoerd.png" alt="ストアドファンクションの作成画面。" class="wp-image-6163" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/09/10_PostgreSQL_Stoerd.png 745w, https://www.kemmy-it.com/wp-content/uploads/2025/09/10_PostgreSQL_Stoerd-280x300.png 280w" sizes="(max-width: 745px) 100vw, 745px" /></figure>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc9">pgadmin4 での作成</span></h4>



<ul class="wp-block-list">
<li><strong>「関数」右クリック⇀「作成」⇀「関数」</strong></li>
</ul>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="650" height="283" src="https://www.kemmy-it.com/wp-content/uploads/2025/09/03_PostgreSQL_Stoerd.png" alt="pgAdmin4による、ストアドファンクションの作成画面。" class="wp-image-6149" style="width:680px;height:auto" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/09/03_PostgreSQL_Stoerd.png 650w, https://www.kemmy-it.com/wp-content/uploads/2025/09/03_PostgreSQL_Stoerd-300x131.png 300w" sizes="(max-width: 650px) 100vw, 650px" /></figure>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li><strong>「一般」タブにストアドファンクションの名称を入力</strong></li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="681" height="359" src="https://www.kemmy-it.com/wp-content/uploads/2025/09/04_PostgreSQL_Stoerd.png" alt="" class="wp-image-6150" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/09/04_PostgreSQL_Stoerd.png 681w, https://www.kemmy-it.com/wp-content/uploads/2025/09/04_PostgreSQL_Stoerd-300x158.png 300w" sizes="(max-width: 681px) 100vw, 681px" /></figure>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li><strong>「定義」タブで、「返り値の型」「言語」「引数」を以下の様に設定</strong></li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="681" height="359" src="https://www.kemmy-it.com/wp-content/uploads/2025/09/05_PostgreSQL_Stoerd.png" alt="" class="wp-image-6152" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/09/05_PostgreSQL_Stoerd.png 681w, https://www.kemmy-it.com/wp-content/uploads/2025/09/05_PostgreSQL_Stoerd-300x158.png 300w" sizes="(max-width: 681px) 100vw, 681px" /></figure>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li><strong>「コード」タブには、「DECLARE」文から「END;」までを作成して入力</strong></li>
</ul>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="663" height="332" src="https://www.kemmy-it.com/wp-content/uploads/2025/09/06_PostgreSQL_Stoerd.png" alt="" class="wp-image-6154" style="width:678px;height:auto" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/09/06_PostgreSQL_Stoerd.png 663w, https://www.kemmy-it.com/wp-content/uploads/2025/09/06_PostgreSQL_Stoerd-300x150.png 300w" sizes="(max-width: 663px) 100vw, 663px" /></figure>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li><strong>「オプション」タグの動作属性に、「STABLE」を指定</strong></li>
</ul>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="699" height="331" src="https://www.kemmy-it.com/wp-content/uploads/2025/09/07_PostgreSQL_Stoerd-1.png" alt="" class="wp-image-6157" style="width:677px;height:auto" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/09/07_PostgreSQL_Stoerd-1.png 699w, https://www.kemmy-it.com/wp-content/uploads/2025/09/07_PostgreSQL_Stoerd-1-300x142.png 300w" sizes="(max-width: 699px) 100vw, 699px" /></figure>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li><strong>「パラメータ」タグには下記の値を指定</strong>
<ul class="wp-block-list">
<li><strong>client_min_messages</strong>
<ul class="wp-block-list">
<li>クライアント向けにどのレベルのログ情報出力を指定するかのパラメタ</li>
</ul>
</li>



<li><strong>debug1</strong>
<ul class="wp-block-list">
<li>一般的なデバッグ情報（ユーザー向け）</li>
</ul>
</li>
</ul>
</li>
</ul>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="707" height="352" src="https://www.kemmy-it.com/wp-content/uploads/2025/09/08_PostgreSQL_Stoerd.png" alt="" class="wp-image-6159" style="width:695px;height:auto" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/09/08_PostgreSQL_Stoerd.png 707w, https://www.kemmy-it.com/wp-content/uploads/2025/09/08_PostgreSQL_Stoerd-300x149.png 300w" sizes="(max-width: 707px) 100vw, 707px" /></figure>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li><strong>「保存」ボタンをクリック</strong><br>内容は、上記の指定でpgadmin4 が作成した「get_stock」ストアドファンクション</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="697" height="492" src="https://www.kemmy-it.com/wp-content/uploads/2025/09/09_PostgreSQL_Stoerd.png" alt="" class="wp-image-6161" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/09/09_PostgreSQL_Stoerd.png 697w, https://www.kemmy-it.com/wp-content/uploads/2025/09/09_PostgreSQL_Stoerd-300x212.png 300w" sizes="(max-width: 697px) 100vw, 697px" /></figure>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li>「ストアドファンクション」の詳細については、以下の公式サイトを参照ください。</li>
</ul>



<p><a href="https://www.postgresql.jp/document/17/html/sql-createfunction.html">CREATE FUNCTION（公式ドキュメント）</a></p>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc10">ストアドプロシジャの作成</span></h3>



<p>在庫数の変化を「stock_logs」テーブルに記録するストアドプロシジャを作成します。</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc11">psqlでの作成</span></h4>



<p>psqlに「CREATE PROCEDURE…」文を入力して作成。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="1015" height="912" src="https://www.kemmy-it.com/wp-content/uploads/2025/09/11_PostgreSQL_Stoerd.png" alt="" class="wp-image-6164" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/09/11_PostgreSQL_Stoerd.png 1015w, https://www.kemmy-it.com/wp-content/uploads/2025/09/11_PostgreSQL_Stoerd-300x270.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/09/11_PostgreSQL_Stoerd-768x690.png 768w" sizes="(max-width: 1015px) 100vw, 1015px" /></figure>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc12">pgadmin4 での作成</span></h4>



<ul class="wp-block-list">
<li><strong>「プロシージャ」右クリック⇀「作成」⇀「<strong>プロシージャ</strong>」</strong></li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="624" height="245" src="https://www.kemmy-it.com/wp-content/uploads/2025/09/12_PostgreSQL_Stoerd.png" alt="" class="wp-image-6165" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/09/12_PostgreSQL_Stoerd.png 624w, https://www.kemmy-it.com/wp-content/uploads/2025/09/12_PostgreSQL_Stoerd-300x118.png 300w" sizes="(max-width: 624px) 100vw, 624px" /></figure>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li><strong>「一般」タブにストアドプロシジャの名称を入力</strong></li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="698" height="406" src="https://www.kemmy-it.com/wp-content/uploads/2025/09/13_PostgreSQL_Stoerd.png" alt="" class="wp-image-6166" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/09/13_PostgreSQL_Stoerd.png 698w, https://www.kemmy-it.com/wp-content/uploads/2025/09/13_PostgreSQL_Stoerd-300x174.png 300w" sizes="(max-width: 698px) 100vw, 698px" /></figure>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li><strong><strong>「定義」タブで、「言語」「引数」を以下の様に設定</strong></strong></li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="695" height="407" src="https://www.kemmy-it.com/wp-content/uploads/2025/09/14_PostgreSQL_Stoerd.png" alt="" class="wp-image-6167" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/09/14_PostgreSQL_Stoerd.png 695w, https://www.kemmy-it.com/wp-content/uploads/2025/09/14_PostgreSQL_Stoerd-300x176.png 300w" sizes="(max-width: 695px) 100vw, 695px" /></figure>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li><strong>「コード」タブには、「DECLARE」文から「END;」までを作成して入力</strong></li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="701" height="405" src="https://www.kemmy-it.com/wp-content/uploads/2025/09/15_PostgreSQL_Stoerd.png" alt="" class="wp-image-6168" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/09/15_PostgreSQL_Stoerd.png 701w, https://www.kemmy-it.com/wp-content/uploads/2025/09/15_PostgreSQL_Stoerd-300x173.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/09/15_PostgreSQL_Stoerd-120x68.png 120w" sizes="(max-width: 701px) 100vw, 701px" /></figure>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li>「パラメータ」タブは「ストアドファンクション」と同様に設定。</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="697" height="403" src="https://www.kemmy-it.com/wp-content/uploads/2025/09/16_PostgreSQL_Stoerd.png" alt="" class="wp-image-6169" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/09/16_PostgreSQL_Stoerd.png 697w, https://www.kemmy-it.com/wp-content/uploads/2025/09/16_PostgreSQL_Stoerd-300x173.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/09/16_PostgreSQL_Stoerd-120x68.png 120w" sizes="(max-width: 697px) 100vw, 697px" /></figure>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li><strong>「SQL」タグで内容を確認し、「保存」ボタンをクリック</strong>
<ul class="wp-block-list">
<li>内容は、上記の指定でpgadmin4 が作成した「update_stock_and_log」ストアドプロシジャ</li>
</ul>
</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="805" height="472" src="https://www.kemmy-it.com/wp-content/uploads/2025/09/17_PostgreSQL_Stoerd.png" alt="" class="wp-image-6170" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/09/17_PostgreSQL_Stoerd.png 805w, https://www.kemmy-it.com/wp-content/uploads/2025/09/17_PostgreSQL_Stoerd-300x176.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/09/17_PostgreSQL_Stoerd-768x450.png 768w" sizes="(max-width: 805px) 100vw, 805px" /></figure>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li>「ストアドプロシジャ」の詳細については、以下の公式サイトを参照ください。</li>
</ul>



<p><a href="https://www.postgresql.jp/document/17/html/sql-createprocedure.html">CREATE PROCEDURE（公式ドキュメント）</a></p>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc13">ストアドファンクション・ストアドプロシジャの実行</span></h2>



<p>手動実行（psql）して、「ストアドファンクション」及び「ストアドプロシジャ」が正常動作する事を確認します。</p>



<p>【結果】：psql でもadmin4 でも正常動作を確認できました。（当たり前です）</p>



<ul class="wp-block-list">
<li>ストアドファンクション</li>
</ul>



<p>psql SELECT 関数名(&#8230;&#8230;)</p>



<figure class="wp-block-image size-full"><img decoding="async" width="624" height="437" src="https://www.kemmy-it.com/wp-content/uploads/2025/09/18_PostgreSQL_Stoerd.png" alt="" class="wp-image-6173" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/09/18_PostgreSQL_Stoerd.png 624w, https://www.kemmy-it.com/wp-content/uploads/2025/09/18_PostgreSQL_Stoerd-300x210.png 300w" sizes="(max-width: 624px) 100vw, 624px" /></figure>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<p>pgadmin4 SELECT 関数名(&#8230;&#8230;)</p>



<figure class="wp-block-image size-full"><img decoding="async" width="446" height="248" src="https://www.kemmy-it.com/wp-content/uploads/2025/09/20_PostgreSQL_Stoerd.png" alt="" class="wp-image-6177" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/09/20_PostgreSQL_Stoerd.png 446w, https://www.kemmy-it.com/wp-content/uploads/2025/09/20_PostgreSQL_Stoerd-300x167.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/09/20_PostgreSQL_Stoerd-120x68.png 120w, https://www.kemmy-it.com/wp-content/uploads/2025/09/20_PostgreSQL_Stoerd-160x90.png 160w" sizes="(max-width: 446px) 100vw, 446px" /></figure>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="434" height="248" src="https://www.kemmy-it.com/wp-content/uploads/2025/09/21_PostgreSQL_Stoerd.png" alt="" class="wp-image-6178" style="width:446px;height:auto" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/09/21_PostgreSQL_Stoerd.png 434w, https://www.kemmy-it.com/wp-content/uploads/2025/09/21_PostgreSQL_Stoerd-300x171.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/09/21_PostgreSQL_Stoerd-120x68.png 120w, https://www.kemmy-it.com/wp-content/uploads/2025/09/21_PostgreSQL_Stoerd-160x90.png 160w" sizes="(max-width: 434px) 100vw, 434px" /></figure>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li>ストアドプロシジャ</li>
</ul>



<p>psql CALL プロシジャ名(&#8230;..)</p>



<figure class="wp-block-image size-full"><img decoding="async" width="609" height="476" src="https://www.kemmy-it.com/wp-content/uploads/2025/09/19_PostgreSQL_Stoerd.png" alt="" class="wp-image-6174" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/09/19_PostgreSQL_Stoerd.png 609w, https://www.kemmy-it.com/wp-content/uploads/2025/09/19_PostgreSQL_Stoerd-300x234.png 300w" sizes="(max-width: 609px) 100vw, 609px" /></figure>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<p>pgAdmin4 CALL プロシジャ名(&#8230;..)</p>



<figure class="wp-block-image size-full"><img decoding="async" width="884" height="415" src="https://www.kemmy-it.com/wp-content/uploads/2025/09/22_PostgreSQL_Stoerd.png" alt="" class="wp-image-6179" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/09/22_PostgreSQL_Stoerd.png 884w, https://www.kemmy-it.com/wp-content/uploads/2025/09/22_PostgreSQL_Stoerd-300x141.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/09/22_PostgreSQL_Stoerd-768x361.png 768w" sizes="(max-width: 884px) 100vw, 884px" /></figure>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc14">有効活用できる場面</span></h2>



<h3 class="wp-block-heading"><span id="toc15">ストアドファンクション</span></h3>



<ul class="wp-block-list">
<li>集計や計算ロジックを共通化したいとき</li>



<li>SELECT文の中で使用したいとき</li>



<li>トリガーで呼びたいとき</li>



<li>トリガーで呼び出したいとき
<ul class="wp-block-list">
<li>レコードを追加した後での自動処理等</li>
</ul>
</li>
</ul>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc16">ストアドプロシジャ</span></h3>



<ul class="wp-block-list">
<li>複数の更新・挿入処理をまとめたいとき
<ul class="wp-block-list">
<li>在庫更新＋ログ記録等</li>
</ul>
</li>



<li>トランザクション制御を含めたいとき
<ul class="wp-block-list">
<li> <code>BEGIN ... COMMIT</code> を明示的に扱える</li>
</ul>
</li>



<li>外部から明示的に呼び出す業務処理
<ul class="wp-block-list">
<li>バッチ処理やAPI連携のエントリポイントとして</li>
</ul>
</li>
</ul>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc17">まとめ</span></h2>



<p>本ブログでは以下の事項を紹介しました。</p>



<ul class="wp-block-list">
<li>ストアドファンクションとストアドプロシジャの違い</li>



<li>ストアドファンクションとストアドプロシジャの主な用途</li>



<li>psql と、pgadmin4（GUI）による作成方法</li>



<li>ストアドファンクションとストアドプロシジャの実行方法</li>



<li>有効活用できる場面</li>
</ul>



<p>ストアドファンクションやストアドプロシジャは、データベースの中で処理を共通化できる事、及びトリガーに応じて起動できる点で有効性が高いと考えられます。但し、ストアドプロシジャは、トリガー関数等を使用する必要が有りますが…。</p>



<p>今回、pgadmin4 でも作成しましたが、初心者にとっては最初の理解に役立つと思うが、一度覚えてしまったら手数の多さが気になって使用しなくなるのではないかと思いました。実際、処理の部分は自分で作成するわけで、ＧＵＩのメリットが十分生かされていないと感じた。但し、デバッグできるのは魅力。</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【Ubuntu】Server ProでPostgreSQLとpgAdmin4を導入する完全ガイド</title>
		<link>https://www.kemmy-it.com/2025/08/24/ubuntu_postgre-2/</link>
		
		<dc:creator><![CDATA[Kemmy]]></dc:creator>
		<pubDate>Sun, 24 Aug 2025 12:28:56 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<guid isPermaLink="false">https://www.kemmy-it.com/?p=5837</guid>

					<description><![CDATA[目次 はじめにUbuntu Server Pro についてPostgreSQLとPgadmin4 についてこのブログで習得できることUbutu Server Pro の更新と準備PostgreSQLのインストールインスト [&#8230;]]]></description>
										<content:encoded><![CDATA[

  <div id="toc" class="toc tnt-number-detail toc-center tnt-number_detail border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-14" checked><label class="toc-title" for="toc-checkbox-14">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a></li><li><a href="#toc2" tabindex="0">Ubuntu Server Pro について</a></li><li><a href="#toc3" tabindex="0">PostgreSQLとPgadmin4 について</a></li><li><a href="#toc4" tabindex="0">このブログで習得できること</a></li><li><a href="#toc5" tabindex="0">Ubutu Server Pro の更新と準備</a></li><li><a href="#toc6" tabindex="0">PostgreSQLのインストール</a><ol><li><a href="#toc7" tabindex="0">インストール直後のPostgreSQLサービス状態</a></li></ol></li><li><a href="#toc8" tabindex="0">PostgreSQLの初期設定（ユーザーとDBの作成）</a><ol><li><a href="#toc9" tabindex="0">新規ユーザーの作成</a></li><li><a href="#toc10" tabindex="0">新規データベースの作成</a></li></ol></li><li><a href="#toc11" tabindex="0">PgAdmin4（Web版）のインストール</a></li><li><a href="#toc12" tabindex="0">pgAdmin4にアクセスしてPostgreSQLを管理</a></li><li><a href="#toc13" tabindex="0">良くあるトラブルと対処法</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">はじめに</span></h2>



<p>Ubuntu Server Pro環境で、PostgreSQLとpgAdmin4を使って<strong>GUIベースでデータベース管理を始めたい方</strong>向けに、インストールから接続までの手順をわかりやすく解説します。</p>



<p>尚、本ブログではVMware Workstation Pro 環境下にUbuntu Server Proをインストールして作業を進めます。</p>



<p>Windows 11 への「VMware Workstation Pro」インストールは下記ブログを参考にして下さい。<br>参考：<a href="https://www.kemmy-it.com/2025/08/15/vmwer_ubuntu_install/" data-type="link" data-id="https://www.kemmy-it.com/2025/08/15/vmwer_ubuntu_install/">Windows 11 への「VMware Workstation Pro」インストール</a></p>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc2">Ubuntu Server Pro について</span></h2>



<p><strong>Ubuntu Server Pro</strong> は、通常のUbuntu Serverに「セキュリティ強化」と「長期サポート」を追加した<strong>プロ向けの拡張サービス</strong>です。</p>



<ul class="wp-block-list">
<li><strong>主な特徴</strong>
<ul class="wp-block-list">
<li><strong>最大10年間のセキュリティ更新</strong>（通常は5年）</li>



<li><strong>Livepatch機能</strong>：再起動なしでカーネルの脆弱性を修正</li>



<li><strong>ESM（Extended Security Maintenance）</strong>：古いパッケージも安全に使える</li>



<li><strong>FIPS準拠</strong>：政府・金融機関向けのセキュリティ基準に対応</li>



<li><strong>無料使用</strong>：個人なら最大5台まで無料で使用可能</li>
</ul>
</li>



<li><strong>主な使用者</strong>
<ul class="wp-block-list">
<li>サーバーを<strong>長期間安定運用</strong>したい人</li>



<li>セキュリティを重視する<strong>企業・開発者</strong></li>
</ul>
</li>
</ul>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc3">PostgreSQLとPgadmin4 について</span></h2>



<p>PostgreSQLは無料で使える高機能なデータベース管理システム（RDBMS）</p>



<ul class="wp-block-list">
<li><strong>主な特徴</strong>
<ul class="wp-block-list">
<li>オープンソースで信頼性が高く、世界中の企業や開発者に利用されています</li>



<li>複雑なデータ処理やトランザクション管理に強く、<strong>商用DBに匹敵する性能</strong>を持ちます</li>
</ul>
</li>
</ul>



<p><strong>pgAdmin4は、PostgreSQLをGUIで操作できる管理ツール</strong></p>



<ul class="wp-block-list">
<li><strong>主な特徴</strong>
<ul class="wp-block-list">
<li>Webブラウザやデスクトップアプリで動作し、初心者でも直感的に使えます</li>



<li>データベースの作成・編集・クエリ実行・バックアップなどが可能</li>
</ul>
</li>
</ul>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc4">このブログで習得できること</span></h2>



<ol class="wp-block-list">
<li><strong>Ubuntu Server Proの初期設定とパッケージ更新</strong></li>



<li><strong>PostgreSQLのインストールと基本設定</strong></li>



<li><strong>PostgreSQLとpgAdmin4の接続方法</strong></li>



<li><strong>よくあるトラブルとその対処法</strong></li>
</ol>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc5">Ubutu Server Pro の更新と準備</span></h2>



<p>まずはサーバー環境を最新に保ちます。これにより、依存関係の不具合を防げます。</p>



<pre class="wp-block-code"><code>sudo apt update &amp;&amp; sudo apt upgrade -y</code></pre>



<ul class="wp-block-list">
<li>apt update：パッケージ情報を最新に更新</li>



<li>apt upgrade -y：インストール済みのパッケージを一括アップグレード</li>
</ul>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc6">PostgreSQLのインストール</span></h2>



<p>Ubuntuでは公式リポジトリから簡単にPostgreSQLを導入できます。</p>



<pre class="wp-block-code"><code>sudo apt install postgresql postgresql-contrib -y</code></pre>



<ul class="wp-block-list">
<li><code>postgr</code>es<code>ql</code>：メインのデータベースサーバー</li>



<li>postgresql-contrib：便利な追加モジュール（例：uuid生成など）</li>
</ul>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc7">インストール直後のPostgreSQLサービス状態</span></h3>



<p>以下のコマンドで状態を確認します。</p>



<pre class="wp-block-code"><code>sudo systemctl status postgresql</code></pre>



<p>コマンドの実行結果。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="915" height="204" src="https://www.kemmy-it.com/wp-content/uploads/2025/08/01_ubuntu_postgreinstall.png" alt="" class="wp-image-5842" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/08/01_ubuntu_postgreinstall.png 915w, https://www.kemmy-it.com/wp-content/uploads/2025/08/01_ubuntu_postgreinstall-300x67.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/08/01_ubuntu_postgreinstall-768x171.png 768w" sizes="(max-width: 915px) 100vw, 915px" /></figure>



<ul class="wp-block-list">
<li><strong>Loaded（ユニットファイル読み込み状態）の 確認</strong>
<ul class="wp-block-list">
<li><strong>preset: enabled</strong> となっているので、「自動起動が許可されている」状態。</li>
</ul>
</li>
</ul>



<ul class="wp-block-list">
<li><strong>Active（サービス稼働状態）の確認</strong>
<ul class="wp-block-list">
<li><strong>active（exited）</strong>となっているのは、「サービスは起動したがすぐに終了した」状態を示しています。これは、正常な動作です。</li>
</ul>
</li>
</ul>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc8">PostgreSQLの初期設定（ユーザーとDBの作成）</span></h2>



<h3 class="wp-block-heading"><span id="toc9">新規ユーザーの作成</span></h3>



<ul class="wp-block-list">
<li>PostgreSQLでは、<code>postgres</code>が管理者なので、先ず管理者ユーザーに切り替えます。</li>
</ul>



<pre class="wp-block-code"><code>sudo -i -u postgres</code></pre>



<ul class="wp-block-list">
<li>新規スーパーユーザーの作成は下記コマンド作成します。</li>
</ul>



<pre class="wp-block-code"><code>createuser --interactive --pwprompt --superuser</code></pre>



<ul class="wp-block-list">
<li>新規ユーザーの名称を入力</li>



<li>パスワードの入力</li>
</ul>



<pre class="wp-block-code"><code>Enter name of role to add: myuser 
Enter password for role:*****
Enter it again:*****</code></pre>



<ul class="wp-block-list">
<li>myuser がスーパーユーザーとして登録されたかの確認
<ul class="wp-block-list">
<li>psql でPostgreSQLのシェルに入り</li>



<li>\du で確認</li>
</ul>
</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="832" height="217" src="https://www.kemmy-it.com/wp-content/uploads/2025/08/02_ubuntu_postgreinstall-1.png" alt="" class="wp-image-5873" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/08/02_ubuntu_postgreinstall-1.png 832w, https://www.kemmy-it.com/wp-content/uploads/2025/08/02_ubuntu_postgreinstall-1-300x78.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/08/02_ubuntu_postgreinstall-1-768x200.png 768w" sizes="(max-width: 832px) 100vw, 832px" /></figure>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc10">新規データベースの作成</span></h3>



<ul class="wp-block-list">
<li>PostgreSQLのシェルで、新規スーパーユーザー接続用のデータベースを作成する
<ul class="wp-block-list">
<li>１番目のmyuser：作成するデータベースの所有者</li>



<li>２番目のmyuser：作成するデータベース名称</li>
</ul>
</li>
</ul>



<pre class="wp-block-code"><code>\q                                #一旦、PostgreSQLのシェルから抜ける
createdb -U postgres -O myuser myuser</code></pre>



<ul class="wp-block-list">
<li>新規スーパーユーザーでPostgreSQLにログインする</li>
</ul>



<pre class="wp-block-code"><code>psql -U myuser -W -h 127.0.0.1</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="317" src="https://www.kemmy-it.com/wp-content/uploads/2025/08/03_ubuntu_postgreinstall-1024x317.png" alt="" class="wp-image-5879" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/08/03_ubuntu_postgreinstall-1024x317.png 1024w, https://www.kemmy-it.com/wp-content/uploads/2025/08/03_ubuntu_postgreinstall-300x93.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/08/03_ubuntu_postgreinstall-768x238.png 768w, https://www.kemmy-it.com/wp-content/uploads/2025/08/03_ubuntu_postgreinstall.png 1083w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc11">PgAdmin4（Web版）のインストール</span></h2>



<p>pgAdmin4はPostgreSQLをGUIで管理できる強力なツールです。下記コマンドで必要パッケージのインストールを行います。</p>



<ul class="wp-block-list">
<li>必要なパッケージの準備</li>
</ul>



<pre class="wp-block-code"><code>sudo apt update
sudo apt install curl gnupg lsb-release ca-certificates</code></pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li>pgAdminのGPG鍵の追加</li>
</ul>



<pre class="wp-block-code"><code>curl https://www.pgadmin.org/static/packages_pgadmin_org.pub | sudo gpg --dearmor -o /usr/share/keyrings/pgadmin-keyring.gpg</code></pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li>APTリポジトリの追加</li>
</ul>



<pre class="wp-block-code"><code>echo "deb &#91;signed-by=/usr/share/keyrings/pgadmin-keyring.gpg] https://ftp.postgresql.org/pub/pgadmin/pgadmin4/apt/$(lsb_release -cs) pgadmin4 main" | sudo tee /etc/apt/sources.list.d/pgadmin4.list</code></pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li>パッケージ情報を更新</li>
</ul>



<pre class="wp-block-code"><code>sudo apt update</code></pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li>pgAdmin Web版のインストール</li>
</ul>



<pre class="wp-block-code"><code>sudo apt install pgadmin4-web</code></pre>



<ul class="wp-block-list">
<li><strong>下記のエラーが出る場合</strong><br><strong>N: Ignoring file &#8216;pgadmin4.&#8217; in directory &#8216;/etc/apt/sources.list.d/&#8217; as it has an invalid filename ecxtendion </strong><br><strong>E: unable to locate package pgadmin4-web </strong>
<ul class="wp-block-list">
<li>これはリポジトリ設定ファイルの<strong>ファイル名の拡張子ミス</strong>が原因で、APT がそのファイルを無視しているために <code>pgadmin4-web</code> パッケージが見つからないというエラーです。</li>



<li>APT は <code>/etc/apt/sources.list.d/</code> にあるファイルのうち、<strong><code>.list</code> 拡張子が付いていないファイルを無視します</strong>。</li>



<li>つまり、<code>pgadmin4.</code> というファイル名は <code>.list</code> が付いていないため、APT にとって無効です。</li>
</ul>
</li>



<li><strong>エラーの対策</strong>
<ul class="wp-block-list">
<li>下記コマンドでファイル名を修正。これで <code>.list</code> 拡張子が付いた正しいファイル名になります。</li>
</ul>
</li>
</ul>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<pre class="wp-block-code"><code>sudo mv /etc/apt/sources.list.d/pgadmin4. /etc/apt/sources.list.d/pgadmin4.list</code></pre>



<ul class="wp-block-list">
<li>APTキャッシュの更新
<ul class="wp-block-list">
<li>これで、pgadminのリポジトリが読み込まれ、パッケージ情報が取得されます。</li>
</ul>
</li>
</ul>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<pre class="wp-block-code"><code>sudo apt update</code></pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li>pgAdmin Web版のインストール</li>
</ul>



<pre class="wp-block-code"><code>sudo apt install pgadmin4-web</code></pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li>Webモードの初期設定</li>
</ul>



<pre class="wp-block-code"><code>sudo /usr/pgadmin4/bin/setup-web.sh</code></pre>



<p>このスクリプトを実行すると、以下のような対話が始まります：</p>



<ul class="wp-block-list">
<li>初期ユーザーのメールアドレスとパスワードを入力</li>



<li>Apache の設定を自動で行うか確認（<code>y</code> を選択）</li>



<li>Apache を再起動して設定を反映</li>
</ul>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc12">pgAdmin4にアクセスしてPostgreSQLを管理</span></h2>



<ul class="wp-block-list">
<li>VMware上のUbuntu Server Pro のIPアドレスを確認</li>
</ul>



<pre class="wp-block-code"><code>ip a</code></pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li>ホストPCのブラウザで以下にアクセス</li>
</ul>



<pre class="wp-block-code"><code>http:&#47;&#47;&lt;サーバーのIPアドレス&gt;/pgadmin4</code></pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li>pgAdmin ログイン画面 </li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="472" src="https://www.kemmy-it.com/wp-content/uploads/2025/08/04_ubuntu_postgreinstall-1024x472.png" alt="" class="wp-image-5884" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/08/04_ubuntu_postgreinstall-1024x472.png 1024w, https://www.kemmy-it.com/wp-content/uploads/2025/08/04_ubuntu_postgreinstall-300x138.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/08/04_ubuntu_postgreinstall-768x354.png 768w, https://www.kemmy-it.com/wp-content/uploads/2025/08/04_ubuntu_postgreinstall-1536x708.png 1536w, https://www.kemmy-it.com/wp-content/uploads/2025/08/04_ubuntu_postgreinstall.png 1643w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<p>ログイン後、「新しいサーバーを追加」からPostgreSQLを追加します。</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="337" src="https://www.kemmy-it.com/wp-content/uploads/2025/08/05_ubuntu_postgreinstall-1024x337.png" alt="" class="wp-image-5885" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/08/05_ubuntu_postgreinstall-1024x337.png 1024w, https://www.kemmy-it.com/wp-content/uploads/2025/08/05_ubuntu_postgreinstall-300x99.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/08/05_ubuntu_postgreinstall-768x253.png 768w, https://www.kemmy-it.com/wp-content/uploads/2025/08/05_ubuntu_postgreinstall-1536x506.png 1536w, https://www.kemmy-it.com/wp-content/uploads/2025/08/05_ubuntu_postgreinstall.png 1909w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<ul class="wp-block-list">
<li><strong>Name</strong>: 任意（例：MyPostgres）</li>



<li><strong>Host</strong>: <code>localhost</code>またはサーバーのIP</li>



<li><strong>Username</strong>: 作成したユーザー（例：<code>myuser</code>）</li>



<li><strong>Password</strong>: そのユーザーのパスワード</li>
</ul>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc13">良くあるトラブルと対処法</span></h2>



<figure class="wp-block-flexible-table-block-table"><table class=""><thead><tr><th>№</th><th>トラブル</th><th>原因</th><th>解決方法</th></tr></thead><tbody><tr><td>１</td><td style="text-align:left">pgAdmin4にアクセスできない</td><td>ポート未開放</td><td style="text-align:left">sudo ufw allow 80で開放</td></tr><tr><td>２</td><td style="text-align:left">PostgreSQLに接続できない</td><td>認証エラー</td><td style="text-align:left"><code>pg_hba.conf</code>の設定を確認</td></tr><tr><td>３</td><td style="text-align:left">pgAdmin4ログイン失敗</td><td>パスワードミス</td><td style="text-align:left"><code>setup-web.sh</code>を再実行</td></tr><tr><td>４</td><td style="text-align:left">外部接続できない</td><td>listen_addressesが制限されている</td><td style="text-align:left"><code>postgresql.conf</code>で<code>'*'</code>に変更</td></tr></tbody></table></figure>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【PostgreSQL】「スキーマ」を適切に活用しよう！</title>
		<link>https://www.kemmy-it.com/2025/02/21/posgre_schema/</link>
					<comments>https://www.kemmy-it.com/2025/02/21/posgre_schema/#respond</comments>
		
		<dc:creator><![CDATA[Kemmy]]></dc:creator>
		<pubDate>Fri, 21 Feb 2025 12:11:45 +0000</pubDate>
				<category><![CDATA[PostgreSQL]]></category>
		<guid isPermaLink="false">https://www.kemmy-it.com/?p=4394</guid>

					<description><![CDATA[目次 【PostgreSQL】スキーマを活用しよう！スキーマとは？スキーマの基本操作スキーマの作成スキーマ内のオブジェクト作成スキーマの一覧表示スキーマの削除スキーマの活用方法アクセス制御スキーマ検索パスの設定マルチテナ [&#8230;]]]></description>
										<content:encoded><![CDATA[

  <div id="toc" class="toc tnt-number-detail toc-center tnt-number_detail border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-16" checked><label class="toc-title" for="toc-checkbox-16">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">【PostgreSQL】スキーマを活用しよう！</a></li><li><a href="#toc2" tabindex="0">スキーマとは？</a></li><li><a href="#toc3" tabindex="0">スキーマの基本操作</a><ol><li><a href="#toc4" tabindex="0">スキーマの作成</a></li><li><a href="#toc5" tabindex="0">スキーマ内のオブジェクト作成</a></li><li><a href="#toc6" tabindex="0">スキーマの一覧表示</a></li><li><a href="#toc7" tabindex="0">スキーマの削除</a></li></ol></li><li><a href="#toc8" tabindex="0">スキーマの活用方法</a><ol><li><a href="#toc9" tabindex="0">アクセス制御</a></li><li><a href="#toc10" tabindex="0">スキーマ検索パスの設定</a></li><li><a href="#toc11" tabindex="0">マルチテナント環境の実現</a></li></ol></li><li><a href="#toc12" tabindex="0">public スキーマ</a><ol><li><a href="#toc13" tabindex="0">public スキーマのリスク管理</a><ol><li><a href="#toc14" tabindex="0">CREATE 権限を削除する</a></li><li><a href="#toc15" tabindex="0">USAGE 権限は必要に応じて設定する</a></li><li><a href="#toc16" tabindex="0">search_path を適切に設定する</a></li><li><a href="#toc17" tabindex="0">スキーマを分離して管理する</a></li></ol></li></ol></li><li><a href="#toc18" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">【PostgreSQL】スキーマを活用しよう！</span></h2>



<p>PostgreSQLでは、スキーマを活用することでデータベースの管理や運用を柔軟に行うことができます。本ブログでは、スキーマの概念、基本的な操作方法、実用的な活用例について紹介します。</p>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc2">スキーマとは？</span></h2>



<p>スキーマとは、データベース内でテーブルやビュー、関数、シーケンスなどのオブジェクトをグループ化するための名前空間です。スキーマを適切に活用することで、以下のようなメリットがあります。</p>



<ul class="wp-block-list">
<li><strong>データの整理</strong><br>テーブルをカテゴリ別に整理できます<br><br></li>



<li><strong>アクセス制御</strong><br>スキーマごとに権限の設定が可能となります<br><br></li>



<li><strong>名前衝突の回避</strong><br>同じ名前のテーブルを異なるスキーマに作成可能となります<br><br></li>



<li><strong>マルチテナント環境の実現</strong><br>アプリケーションごとにスキーマを分けることで管理が容易になります<br><strong>※マルチテナント環境については後述します。</strong><br><br></li>
</ul>



<p>下図はcustomer_db内に地域毎のスキーマを作成した結果です。</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="310" height="474" src="https://www.kemmy-it.com/wp-content/uploads/2025/02/01_PostgreSQL_SCHEMA_01.png" alt="" class="wp-image-4404" style="width:315px;height:auto" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/02/01_PostgreSQL_SCHEMA_01.png 310w, https://www.kemmy-it.com/wp-content/uploads/2025/02/01_PostgreSQL_SCHEMA_01-196x300.png 196w" sizes="(max-width: 310px) 100vw, 310px" /></figure>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc3">スキーマの基本操作</span></h2>



<h3 class="wp-block-heading"><span id="toc4">スキーマの作成</span></h3>



<p>スキーマは <code>CREATE SCHEMA</code> コマンドで作成します。</p>



<pre class="wp-block-code"><code>CREATE SCHEMA sales;</code></pre>



<p>特定のユーザーが所有するスキーマを作成する場合は、以下のように指定します。</p>



<pre class="wp-block-code"><code>CREATE SCHEMA marketing AUTHORIZATION user_name;</code></pre>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc5">スキーマ内のオブジェクト作成</span></h3>



<p>スキーマを作成した後、そのスキーマ内にテーブルを作成するには、スキーマ名を明示的に指定します。</p>



<pre class="wp-block-code"><code>CREATE TABLE sales.orders (
    order_id SERIAL PRIMARY KEY,
    customer_name TEXT,
    total_amount NUMERIC(10,2)
);</code></pre>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc6">スキーマの一覧表示</span></h3>



<p>作成したスキーマの一覧を確認するには、<code>pg_namespace</code> システムカタログを参照します。</p>



<pre class="wp-block-code"><code>SELECT nspname FROM pg_namespace;</code></pre>



<p>または、<code>psql</code>の <code>\dn</code> コマンドでも一覧を表示できます。</p>



<pre class="wp-block-code"><code>\dn</code></pre>



<figure class="wp-block-image size-full"><img decoding="async" width="525" height="212" src="https://www.kemmy-it.com/wp-content/uploads/2025/02/02_PostgreSQL_SCHEMA.png" alt="" class="wp-image-4407" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/02/02_PostgreSQL_SCHEMA.png 525w, https://www.kemmy-it.com/wp-content/uploads/2025/02/02_PostgreSQL_SCHEMA-300x121.png 300w" sizes="(max-width: 525px) 100vw, 525px" /></figure>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc7">スキーマの削除</span></h3>



<p>スキーマを削除するには、<code>DROP SCHEMA</code> を使用します。</p>



<pre class="wp-block-code"><code>DROP SCHEMA sales;</code></pre>



<p>スキーマ内にオブジェクトがある場合は、<code>CASCADE</code> オプションを指定しないと削除できません。</p>



<pre class="wp-block-code"><code>DROP SCHEMA sales CASCADE;</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="576" src="https://www.kemmy-it.com/wp-content/uploads/2025/02/07_blg_001-1-1024x576.png" alt="" class="wp-image-4410" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/02/07_blg_001-1-1024x576.png 1024w, https://www.kemmy-it.com/wp-content/uploads/2025/02/07_blg_001-1-300x169.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/02/07_blg_001-1-768x432.png 768w, https://www.kemmy-it.com/wp-content/uploads/2025/02/07_blg_001-1-1536x864.png 1536w, https://www.kemmy-it.com/wp-content/uploads/2025/02/07_blg_001-1-120x68.png 120w, https://www.kemmy-it.com/wp-content/uploads/2025/02/07_blg_001-1-160x90.png 160w, https://www.kemmy-it.com/wp-content/uploads/2025/02/07_blg_001-1-320x180.png 320w, https://www.kemmy-it.com/wp-content/uploads/2025/02/07_blg_001-1-376x212.png 376w, https://www.kemmy-it.com/wp-content/uploads/2025/02/07_blg_001-1.png 1600w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc8">スキーマの活用方法</span></h2>



<h3 class="wp-block-heading"><span id="toc9">アクセス制御</span></h3>



<p>スキーマ単位で権限を設定することで、ユーザーのアクセスを制限できます。</p>



<p>例: <code>sales</code> スキーマへのアクセス権を <code>sales_user</code> に付与する</p>



<pre class="wp-block-code"><code>GRANT USAGE ON SCHEMA sales TO sales_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA sales TO sales_user;</code></pre>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc10">スキーマ検索パスの設定</span></h3>



<p>スキーマの検索パスを設定することで、スキーマ名を省略してオブジェクトを操作できます。</p>



<pre class="wp-block-code"><code>SET search_path TO sales, public;</code></pre>



<p>これにより、<code>sales</code> スキーマ内のテーブルを <code>sales.orders</code> ではなく <code>orders</code> として参照できるようになります。</p>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc11">マルチテナント環境の実現</span></h3>



<p>マルチテナントアプリケーションでは、各クライアントごとにスキーマを分けることでデータを分離できます。</p>



<pre class="wp-block-code"><code>CREATE SCHEMA tenant1;
CREATE SCHEMA tenant2;</code></pre>



<p>そして、クライアントごとに適切な検索パスを設定します。</p>



<pre class="wp-block-code"><code>SET search_path TO tenant1;</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="576" src="https://www.kemmy-it.com/wp-content/uploads/2025/02/07_blg_002-1024x576.png" alt="" class="wp-image-4411" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/02/07_blg_002-1024x576.png 1024w, https://www.kemmy-it.com/wp-content/uploads/2025/02/07_blg_002-300x169.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/02/07_blg_002-768x432.png 768w, https://www.kemmy-it.com/wp-content/uploads/2025/02/07_blg_002-1536x864.png 1536w, https://www.kemmy-it.com/wp-content/uploads/2025/02/07_blg_002-120x68.png 120w, https://www.kemmy-it.com/wp-content/uploads/2025/02/07_blg_002-160x90.png 160w, https://www.kemmy-it.com/wp-content/uploads/2025/02/07_blg_002-320x180.png 320w, https://www.kemmy-it.com/wp-content/uploads/2025/02/07_blg_002-376x212.png 376w, https://www.kemmy-it.com/wp-content/uploads/2025/02/07_blg_002.png 1600w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc12">public スキーマ</span></h2>



<p>public スキーマとは標準で作成されるスキーマです。デフォルトで全てのユーザーがpublicスキーマに対して以下の権限を持っています。</p>



<ul class="wp-block-list">
<li>アクセス権限<br><code>public</code> スキーマ内のオブジェクトにアクセスできる権限（USAGE）</li>
</ul>



<pre class="wp-block-code"><code>GRANT USAGE ON SCHEMA public TO PUBLIC;</code></pre>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li>作成権限<br><code>public</code> スキーマ内にテーブルやビューなどのオブジェクトを作成する権限</li>
</ul>



<pre class="wp-block-code"><code>GRANT CREATE ON SCHEMA public TO PUBLIC;</code></pre>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc13">public スキーマのリスク管理</span></h3>



<p> <code>public</code> スキーマは、デフォルトで <strong>すべてのユーザーがオブジェクトを作成できる</strong> 設定になっているため、適切なリスク管理をしないとセキュリティ上の問題が発生する可能性があります。</p>



<p>その為、リスクを最小限にする為には以下のような管理方法を取っても良いでしょう。</p>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc14">CREATE 権限を削除する</span></h4>



<p>一般ユーザーが <code>public</code> スキーマにオブジェクトを作成できないようにする。</p>



<pre class="wp-block-code"><code>REVOKE CREATE ON SCHEMA public FROM PUBLIC;</code></pre>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc15">USAGE 権限は必要に応じて設定する</span></h4>



<p>完全に <code>public</code> スキーマを使わない場合は、<code>USAGE</code> も削除する。ただし、これを行うと <code>public</code> スキーマ内のオブジェクトにアクセスできなくなるため、注意が必要です。</p>



<pre class="wp-block-code"><code>REVOKE USAGE ON SCHEMA public FROM PUBLIC;</code></pre>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc16">search_path を適切に設定する</span></h4>



<p>デフォルトで <code>public</code> スキーマが検索パスの先頭にあるため、不要ならば外す。</p>



<pre class="wp-block-code"><code>ALTER ROLE my_user SET search_path TO my_schema;</code></pre>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc17">スキーマを分離して管理する</span></h4>



<p><code>public</code> スキーマを使用せず、テナントごとや用途ごとにスキーマを分ける。</p>



<pre class="wp-block-code"><code>CREATE SCHEMA my_schema AUTHORIZATION my_user;</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="576" src="https://www.kemmy-it.com/wp-content/uploads/2025/02/07_blg_003-1024x576.png" alt="" class="wp-image-4412" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/02/07_blg_003-1024x576.png 1024w, https://www.kemmy-it.com/wp-content/uploads/2025/02/07_blg_003-300x169.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/02/07_blg_003-768x432.png 768w, https://www.kemmy-it.com/wp-content/uploads/2025/02/07_blg_003-1536x864.png 1536w, https://www.kemmy-it.com/wp-content/uploads/2025/02/07_blg_003-120x68.png 120w, https://www.kemmy-it.com/wp-content/uploads/2025/02/07_blg_003-160x90.png 160w, https://www.kemmy-it.com/wp-content/uploads/2025/02/07_blg_003-320x180.png 320w, https://www.kemmy-it.com/wp-content/uploads/2025/02/07_blg_003-376x212.png 376w, https://www.kemmy-it.com/wp-content/uploads/2025/02/07_blg_003.png 1600w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc18">まとめ</span></h2>



<p>本ブログでは、PostgreSQLのスキーマの基本操作から応用的な活用方法までを紹介しました。</p>



<p><strong>ポイントまとめ</strong></p>



<ul class="wp-block-list">
<li>スキーマを使うとデータを整理しやすくなる</li>



<li><code>CREATE SCHEMA</code> でスキーマを作成し、テーブルやビューを管理できる</li>



<li>アクセス制御や検索パスを活用すると、より柔軟な運用が可能になる</li>



<li>マルチテナント環境ではスキーマを分けることでデータの分離が容易になる</li>
</ul>



<p>スキーマを適切に活用し、より効率的なPostgreSQLの運用を目指しましょう！</p>



<p></p>



<p></p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.kemmy-it.com/2025/02/21/posgre_schema/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【PostgreSQL】メンテナンス ー VACUUM（基礎）</title>
		<link>https://www.kemmy-it.com/2025/02/14/posgre_mente-vacuum/</link>
					<comments>https://www.kemmy-it.com/2025/02/14/posgre_mente-vacuum/#respond</comments>
		
		<dc:creator><![CDATA[Kemmy]]></dc:creator>
		<pubDate>Fri, 14 Feb 2025 12:39:36 +0000</pubDate>
				<category><![CDATA[PostgreSQL]]></category>
		<guid isPermaLink="false">https://www.kemmy-it.com/?p=4295</guid>

					<description><![CDATA[目次 【PostgreSQL】メンテナンス　ー　VACUUM（基礎）VACUUMとは？【PostgreSQL】VACUUMの種類と実行方法基本的なVACUUMANALYZEを含めたVACUUM完全なVACUUM（VACU [&#8230;]]]></description>
										<content:encoded><![CDATA[

  <div id="toc" class="toc tnt-number-detail toc-center tnt-number_detail border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-18" checked><label class="toc-title" for="toc-checkbox-18">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">【PostgreSQL】メンテナンス　ー　VACUUM（基礎）</a><ol><li><a href="#toc2" tabindex="0">VACUUMとは？</a></li></ol></li><li><a href="#toc3" tabindex="0">【PostgreSQL】VACUUMの種類と実行方法</a><ol><li><a href="#toc4" tabindex="0">基本的なVACUUM</a></li><li><a href="#toc5" tabindex="0">ANALYZEを含めたVACUUM</a></li><li><a href="#toc6" tabindex="0">完全なVACUUM（VACUUM FULL）</a></li><li><a href="#toc7" tabindex="0">Windows環境でのVACUUM実行方法</a></li></ol></li><li><a href="#toc8" tabindex="0">Autovacuumの設定とカスタマイズ</a></li><li><a href="#toc9" tabindex="0">pgAgentを使ったVACUUMのスケジューリング実行</a><ol><li><a href="#toc10" tabindex="0">pgAgentのインストールとスケジュールの設定</a></li></ol></li><li><a href="#toc11" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">【PostgreSQL】メンテナンス　ー　VACUUM（基礎）</span></h2>



<p>PostgreSQLはデータベースのパフォーマンスを維持するために定期的なメンテナンスが必要です。その中でも特に重要なのがVACUUMコマンドによる不要データの回収です。</p>



<p>本ブログではWindows環境におけるVACUUMの基本から運用方法までを紹介します。</p>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc2">VACUUMとは？</span></h3>



<p>PostgreSQLは<strong>MVCC</strong>（Multi-Version Concurrency Control）を採用しており、更新や削除されたデータはすぐには物理的に消えず不要な領域（デッドタプル）として蓄積されていきます。</p>



<p><strong>データベース操作</strong>で不要になったデータ（デッドタプル）を再利用可能領域としてマークを付加し、ストレージの効率を最適化する機能がVACUUMコマンドです。</p>



<p>VACUUMを実行することでデッドタプルを整理し、<strong><span class="marker-under-red">ディスク使用量の増加やパフォーマンスの低下を防ぐ事が可能となります。</span></strong></p>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li><strong>図で示すと以下のようになります</strong>
<ul class="wp-block-list">
<li><strong>ID 002レコードの更新（テーブルA 変更後）</strong>
<ul class="wp-block-list">
<li>トランザクションコード106(XMAX)の処理でデータは更新されますが、レコード領域は残り、新たに ID 002のレコードが追加されます。</li>
</ul>
</li>



<li><strong>ID 004レコードの削除（テーブルA 変更後）</strong>
<ul class="wp-block-list">
<li>ID 004のレコードは、トランザクション107(XMAX)で削除されますがレコード領域は残ります。</li>
</ul>
</li>
</ul>
</li>



<li>VACUUMを実行すると、更新/削除された領域は削除されませんが再利用可能となります。</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="952" height="409" src="https://www.kemmy-it.com/wp-content/uploads/2025/02/19_PostgreSQL_VACUUM_02.png" alt="" class="wp-image-4310" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/02/19_PostgreSQL_VACUUM_02.png 952w, https://www.kemmy-it.com/wp-content/uploads/2025/02/19_PostgreSQL_VACUUM_02-300x129.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/02/19_PostgreSQL_VACUUM_02-768x330.png 768w" sizes="(max-width: 952px) 100vw, 952px" /></figure>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<ul class="wp-block-list">
<li><strong>ＶACUUMコマンド実行後</strong><br>ＶACUUMを実行すると、FSMに空き領域として登録され再利用されます。</li>
</ul>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="629" height="314" src="https://www.kemmy-it.com/wp-content/uploads/2025/02/19_PostgreSQL_VACUUM_03.png" alt="" class="wp-image-4315" style="width:541px;height:auto" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/02/19_PostgreSQL_VACUUM_03.png 629w, https://www.kemmy-it.com/wp-content/uploads/2025/02/19_PostgreSQL_VACUUM_03-300x150.png 300w" sizes="(max-width: 629px) 100vw, 629px" /></figure>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="576" src="https://www.kemmy-it.com/wp-content/uploads/2025/02/06_blg_001-1024x576.png" alt="" class="wp-image-4331" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/02/06_blg_001-1024x576.png 1024w, https://www.kemmy-it.com/wp-content/uploads/2025/02/06_blg_001-300x169.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/02/06_blg_001-768x432.png 768w, https://www.kemmy-it.com/wp-content/uploads/2025/02/06_blg_001-1536x864.png 1536w, https://www.kemmy-it.com/wp-content/uploads/2025/02/06_blg_001-120x68.png 120w, https://www.kemmy-it.com/wp-content/uploads/2025/02/06_blg_001-160x90.png 160w, https://www.kemmy-it.com/wp-content/uploads/2025/02/06_blg_001-320x180.png 320w, https://www.kemmy-it.com/wp-content/uploads/2025/02/06_blg_001-376x212.png 376w, https://www.kemmy-it.com/wp-content/uploads/2025/02/06_blg_001.png 1600w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc3">【PostgreSQL】VACUUMの種類と実行方法</span></h2>



<h3 class="wp-block-heading"><span id="toc4">基本的なVACUUM</span></h3>



<p><code>VACUUM</code>コマンドを実行する事によってデッドタプルを再利用できるようにします。ただし、ディスク領域自体の解放は行いません。</p>



<ul class="wp-block-list">
<li><strong>データベース内の全てのテーブルを対象とする場合</strong></li>
</ul>



<pre class="wp-block-code"><code>postgres-# VACUUM
postgres-#</code></pre>



<ul class="wp-block-list">
<li><strong>特定のテーブルを対象とする場合</strong></li>
</ul>



<pre class="wp-block-code"><code>postgres=# VACUUM customers;
VACUUM
postgres=#</code></pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc5">ANALYZEを含めたVACUUM</span></h3>



<p>ANALYZEはPostgreSQLの統計情報を更新するコマンドです。SQLクエリが最適な実行計画を選択できるようテーブルのデータ分布を分析します。</p>



<pre class="wp-block-code"><code>postgres=# VACUUM ANALYZE;
VACUUM
postgres=#</code></pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc6">完全なVACUUM（VACUUM FULL）</span></h3>



<p><code>VACUUM FULL</code>を実行すると未使用領域を解放し、テーブルのサイズを縮小できます。ただし、<code>VACUUM FULL</code> はデッドタプルを削除するだけでなく、<strong>新しい物理テーブルを作成しデータを再配置</strong> します。</p>



<p>そのため、<strong>テーブル全体が一時的にロック</strong> され、他のトランザクションがそのテーブルを読み書きできなくなり、処理負荷が大きくなるため頻繁な使用は避けましょう。</p>



<pre class="wp-block-code"><code>postgres=# VACUUM FULL;
VACUUM
postgres=#</code></pre>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc7">Windows環境でのVACUUM実行方法</span></h3>



<p>Windows環境で手動でVACUUMを実行するには以下の方法があります。</p>



<ul class="wp-block-list">
<li><strong>pgAdmin 4</strong>
<ul class="wp-block-list">
<li>「Query Tool」を開き、上記のVACUUMコマンドを実行します。</li>
</ul>
</li>



<li><strong>psqlコマンドライン</strong>
<ul class="wp-block-list">
<li><code>psql</code>を開き、データベースに接続後、VACUUMコマンドを実行します。</li>
</ul>
</li>
</ul>



<ul class="wp-block-list">
<li><strong>pgAgentを使用したスケジューリング実行</strong>（後述）</li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="576" src="https://www.kemmy-it.com/wp-content/uploads/2025/02/06_blg_002-1024x576.png" alt="" class="wp-image-4332" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/02/06_blg_002-1024x576.png 1024w, https://www.kemmy-it.com/wp-content/uploads/2025/02/06_blg_002-300x169.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/02/06_blg_002-768x432.png 768w, https://www.kemmy-it.com/wp-content/uploads/2025/02/06_blg_002-1536x864.png 1536w, https://www.kemmy-it.com/wp-content/uploads/2025/02/06_blg_002-120x68.png 120w, https://www.kemmy-it.com/wp-content/uploads/2025/02/06_blg_002-160x90.png 160w, https://www.kemmy-it.com/wp-content/uploads/2025/02/06_blg_002-320x180.png 320w, https://www.kemmy-it.com/wp-content/uploads/2025/02/06_blg_002-376x212.png 376w, https://www.kemmy-it.com/wp-content/uploads/2025/02/06_blg_002.png 1600w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc8">Autovacuumの設定とカスタマイズ</span></h2>



<p>PostgreSQLでは、自動的に<code>VACUUM</code>を実行する「Autovacuum」がデフォルトで有効になっています。</p>



<p>自動VACUUMは不要領域の割合が高くなったテーブルや、最後にANALYZEを実行してからの累計変更行数が多くなったテーブルに対して自動的に実行されます。</p>



<p><code>postgresql.conf</code>のパラメータを調整する事で自動実行時間を調整できますが、自動実行の間隔によってはパフォーマンスに影響する為注意が必要です。</p>



<pre class="wp-block-code"><code># Autovacuumの間隔を短くする
autovacuum_vacuum_threshold = 50
autovacuum_analyze_threshold = 50

# Autovacuumプロセスの最大並列実行数
autovacuum_max_workers = 3</code></pre>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc9">pgAgentを使ったVACUUMのスケジューリング実行</span></h2>



<p>Windows環境では、pgAgentを使用してVACUUMをスケジュール実行できます。</p>



<h3 class="wp-block-heading"><span id="toc10">pgAgentのインストールとスケジュールの設定</span></h3>



<p>pgAgentは、pgAdmin4のスタックビルダからインストールします。具体的なインストール方法とジョブのスケジューリングは以下のブログを参照下さい。</p>



<p>参考ブログ：<a href="https://www.kemmy-it.com/2024/08/19/pgadmin_3/">https://www.kemmy-it.com/2024/08/19/pgadmin_3/</a></p>



<figure class="wp-block-image size-full"><img decoding="async" width="606" height="409" src="https://www.kemmy-it.com/wp-content/uploads/2025/02/19_PostgreSQL_VACUUM_04.png" alt="" class="wp-image-4326" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/02/19_PostgreSQL_VACUUM_04.png 606w, https://www.kemmy-it.com/wp-content/uploads/2025/02/19_PostgreSQL_VACUUM_04-300x202.png 300w" sizes="(max-width: 606px) 100vw, 606px" /></figure>



<ul class="wp-block-list">
<li>VACUUM ANALYZE コマンドを実行するバッチファイルの例。</li>
</ul>



<pre class="wp-block-code"><code>@echo off
"C:\Program Files\PostgreSQL\16\bin\psql.exe" -U postgres -d test_db -c "VACUUM ANALYZE;"</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="576" src="https://www.kemmy-it.com/wp-content/uploads/2025/02/06_blg_004-1-1024x576.png" alt="" class="wp-image-4334" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/02/06_blg_004-1-1024x576.png 1024w, https://www.kemmy-it.com/wp-content/uploads/2025/02/06_blg_004-1-300x169.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/02/06_blg_004-1-768x432.png 768w, https://www.kemmy-it.com/wp-content/uploads/2025/02/06_blg_004-1-1536x864.png 1536w, https://www.kemmy-it.com/wp-content/uploads/2025/02/06_blg_004-1-120x68.png 120w, https://www.kemmy-it.com/wp-content/uploads/2025/02/06_blg_004-1-160x90.png 160w, https://www.kemmy-it.com/wp-content/uploads/2025/02/06_blg_004-1-320x180.png 320w, https://www.kemmy-it.com/wp-content/uploads/2025/02/06_blg_004-1-376x212.png 376w, https://www.kemmy-it.com/wp-content/uploads/2025/02/06_blg_004-1.png 1600w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc11">まとめ</span></h2>



<p>Windows環境でPostgreSQLを運用する際、<code>VACUUM</code>を適切に管理することは重要です。</p>



<ul class="wp-block-list">
<li><strong>基本的なVACUUM</strong><br>手動で実行する方法</li>



<li><strong>Autovacuumの設定</strong><br>自動メンテナンスの最適化</li>



<li><strong>pgAgentによるスケジュール実行</strong><br>運用の効率化</li>



<li><strong>バッチファイルとタスクスケジューラを活用</strong></li>
</ul>



<p>これらを適切に組み合わせることで、データベースのパフォーマンスを維持し、効率的な運用が可能になります。</p>



<p></p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.kemmy-it.com/2025/02/14/posgre_mente-vacuum/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【PostgreSQL】「pg_start_backup()」 によるオンライン物理バックアップ</title>
		<link>https://www.kemmy-it.com/2025/02/10/posgre_pg_startbackup/</link>
					<comments>https://www.kemmy-it.com/2025/02/10/posgre_pg_startbackup/#respond</comments>
		
		<dc:creator><![CDATA[Kemmy]]></dc:creator>
		<pubDate>Mon, 10 Feb 2025 11:29:30 +0000</pubDate>
				<category><![CDATA[PostgreSQL]]></category>
		<guid isPermaLink="false">https://www.kemmy-it.com/?p=4258</guid>

					<description><![CDATA[目次 【PostgreSQL】バックアップの種類と比較論理バックアップ特　徴メリットデメリットオフライン物理バックアップ特　徴メリットデメリットオンライン物理バックアップ (pg_start_backup())特　徴メリ [&#8230;]]]></description>
										<content:encoded><![CDATA[

  <div id="toc" class="toc tnt-number-detail toc-center tnt-number_detail border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-20" checked><label class="toc-title" for="toc-checkbox-20">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">【PostgreSQL】バックアップの種類と比較</a><ol><li><a href="#toc2" tabindex="0">論理バックアップ</a><ol><li><a href="#toc3" tabindex="0">特　徴</a></li><li><a href="#toc4" tabindex="0">メリット</a></li><li><a href="#toc5" tabindex="0">デメリット</a></li></ol></li><li><a href="#toc6" tabindex="0">オフライン物理バックアップ</a><ol><li><a href="#toc7" tabindex="0">特　徴</a></li><li><a href="#toc8" tabindex="0">メリット</a></li><li><a href="#toc9" tabindex="0">デメリット</a></li></ol></li><li><a href="#toc10" tabindex="0">オンライン物理バックアップ (pg_start_backup())</a><ol><li><a href="#toc11" tabindex="0">特　徴</a></li><li><a href="#toc12" tabindex="0">メリット</a></li><li><a href="#toc13" tabindex="0">デメリット</a></li></ol></li></ol></li><li><a href="#toc14" tabindex="0">【PostgreSQL】pg_start_backup() を使用したオンライン物理バックアップの手順</a><ol><li><a href="#toc15" tabindex="0">前提条件</a><ol><li><a href="#toc16" tabindex="0">wal_level が replica 以上に設定されている（WALログを適切に取得するために必要）</a></li></ol></li><li><a href="#toc17" tabindex="0">バックアップの取得手順</a><ol><li><a href="#toc18" tabindex="0">バックアップモードの開始（psql で実行）</a></li><li><a href="#toc19" tabindex="0">データディレクトリをコピー（コマンドプロンプトで実行）</a></li><li><a href="#toc20" tabindex="0">バックアップモードの終了（psql で実行）</a></li><li><a href="#toc21" tabindex="0">WALログを保存（コマンドプロンプトで実行）</a></li></ol></li></ol></li><li><a href="#toc22" tabindex="0">オンライン物理バックアップ（pg_basebackup）との違い</a></li><li><a href="#toc23" tabindex="0">【PostgreSQL】バックアップの復元</a><ol><li><a href="#toc24" tabindex="0">バックアップの復元手順</a><ol><li><a href="#toc25" tabindex="0">既存のデータディレクトリを削除（または別の場所に移動）</a></li><li><a href="#toc26" tabindex="0">バックアップをリストア</a></li><li><a href="#toc27" tabindex="0">WALログを適用</a></li><li><a href="#toc28" tabindex="0">PostgreSQLを起動</a></li></ol></li></ol></li><li><a href="#toc29" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">【PostgreSQL】バックアップの種類と比較</span></h2>



<p>PostgreSQLには主に以下の3種類のバックアップ方法があり、それぞれに特徴とメリット・デメリットがあります。</p>



<p>バックアップを実施するには目的に合った方法を理解し適切にバックアップを行う事が重要です。</p>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc2">論理バックアップ</span></h3>



<p>論理バックアップとはデータベースの内容をSQLスクリプトや圧縮ファイルとしてエクスポートするバックアップ方法です</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc3">特　徴</span></h4>



<ul class="wp-block-list">
<li><code>pg_dump</code> や <code>pg_dumpall</code> を使用</li>



<li>SQLスクリプトとしてエクスポート</li>



<li>テーブル単位、データベース単位での復元が容易</li>
</ul>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc4">メリット</span></h4>



<ul class="wp-block-list">
<li>柔軟な復元（テーブル単位、スキーマ単位など）</li>



<li>異なるバージョンのPostgreSQLへの移行が容易</li>
</ul>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc5">デメリット</span></h4>



<ul class="wp-block-list">
<li>大規模データベースでは時間がかかる</li>



<li>一貫性のあるスナップショットを取得するには注意が必要</li>
</ul>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<p><strong>論理バックアップ「pg_dump/pg_restore」については下記のブログを参考下さい。</strong><br><strong>参考ブログ</strong>：<a href="https://www.kemmy-it.com/2025/02/04/posgre_pg_dump/">【PostgreSQL】バックアップ・リストア 「pg_dump/pg_dumpall/pg_restore/psql</a>」</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="576" src="https://www.kemmy-it.com/wp-content/uploads/2025/02/05_blg-04-1024x576.png" alt="" class="wp-image-4286" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/02/05_blg-04-1024x576.png 1024w, https://www.kemmy-it.com/wp-content/uploads/2025/02/05_blg-04-300x169.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/02/05_blg-04-768x432.png 768w, https://www.kemmy-it.com/wp-content/uploads/2025/02/05_blg-04-1536x864.png 1536w, https://www.kemmy-it.com/wp-content/uploads/2025/02/05_blg-04-120x68.png 120w, https://www.kemmy-it.com/wp-content/uploads/2025/02/05_blg-04-160x90.png 160w, https://www.kemmy-it.com/wp-content/uploads/2025/02/05_blg-04-320x180.png 320w, https://www.kemmy-it.com/wp-content/uploads/2025/02/05_blg-04-376x212.png 376w, https://www.kemmy-it.com/wp-content/uploads/2025/02/05_blg-04.png 1600w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc6">オフライン物理バックアップ</span></h3>



<p>PostgreSQLを停止しデータディレクトリ全体を手動でコピーするバックアップ方法です。データの一貫性が確保されるシンプルで確実な手法ですが、バックアップ中はデータベースを使用できないという制約があります。</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc7">特　徴</span></h4>



<ul class="wp-block-list">
<li>PostgreSQLを停止し、データディレクトリ全体をコピー</li>
</ul>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc8">メリット</span></h4>



<ul class="wp-block-list">
<li>シンプルで確実な方法</li>



<li>すべてのデータが一貫性のある状態でバックアップされる</li>
</ul>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc9">デメリット</span></h4>



<ul class="wp-block-list">
<li>バックアップ中はデータベースを使用できない</li>



<li>柔軟性が低い（部分的な復元が困難）</li>
</ul>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc10">オンライン物理バックアップ (pg_start_backup())</span></h3>



<p>PostgreSQLを停止せずにデータディレクトリを手動でコピーするバックアップ方法です。</p>



<p>WAL (Write-Ahead Logging) を活用し、一貫性のあるスナップショットを取得できるため、PITR (ポイントインタイムリカバリ) にも対応可能です。<br></p>



<ul class="wp-block-list">
<li><strong>WAL（Write-Ahead Logging）とは？</strong><br>データの整合性を保つための技術で、データが変更される前にその変更内容をログに記録することで、システムがクラッシュしても、ログを使って変更を復元できるようにしています。<br><br></li>



<li><strong>PITR (ポイントインタイムリカバリ) とは？</strong><br>データベースの復旧方法の一つで、特定の時点にデータベースを戻すプロセスです。これにより、データベースがクラッシュしたり、誤ってデータを削除した場合でも、指定した時点まで正確に復旧することができます。<br><br></li>
</ul>



<h4 class="wp-block-heading"><span id="toc11">特　徴</span></h4>



<ul class="wp-block-list">
<li><code>pg_start_backup()</code> を使用し、PostgreSQLを停止せずにデータディレクトリを手動でコピー</li>



<li>Write-Ahead Logging (WAL) を利用</li>
</ul>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc12">メリット</span></h4>



<ul class="wp-block-list">
<li>サーバーを停止せずにバックアップ可能</li>



<li>一貫性のあるスナップショットを取得可能</li>



<li>PITR（Point-in-Time Recovery）に対応</li>
</ul>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc13">デメリット</span></h4>



<ul class="wp-block-list">
<li>手動操作が必要で手順が複雑</li>



<li>WALファイルの管理が必要</li>
</ul>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="576" src="https://www.kemmy-it.com/wp-content/uploads/2025/02/05_blg-001-1024x576.png" alt="" class="wp-image-4270" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/02/05_blg-001-1024x576.png 1024w, https://www.kemmy-it.com/wp-content/uploads/2025/02/05_blg-001-300x169.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/02/05_blg-001-768x432.png 768w, https://www.kemmy-it.com/wp-content/uploads/2025/02/05_blg-001-1536x864.png 1536w, https://www.kemmy-it.com/wp-content/uploads/2025/02/05_blg-001-120x68.png 120w, https://www.kemmy-it.com/wp-content/uploads/2025/02/05_blg-001-160x90.png 160w, https://www.kemmy-it.com/wp-content/uploads/2025/02/05_blg-001-320x180.png 320w, https://www.kemmy-it.com/wp-content/uploads/2025/02/05_blg-001-376x212.png 376w, https://www.kemmy-it.com/wp-content/uploads/2025/02/05_blg-001.png 1600w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc14">【PostgreSQL】pg_start_backup() を使用したオンライン物理バックアップの手順</span></h2>



<h3 class="wp-block-heading"><span id="toc15">前提条件</span></h3>



<h4 class="wp-block-heading"><span id="toc16">wal_level が replica 以上に設定されている（WALログを適切に取得するために必要）</span></h4>



<p><code>wal_level</code> は、PostgreSQLのWAL (Write-Ahead Logging) の詳細度を決定する設定パラメータで、以下の3つのレベルがあります。</p>



<ul class="wp-block-list">
<li><code><strong>minimal</strong></code><br>もっとも低いレベルで、クラッシュリカバリのみをサポート。レプリケーションや PITR (ポイントインタイムリカバリ) には対応しない。</li>



<li><strong><code>replica</code> (推奨)</strong><br>ストリーミングレプリケーションやアーカイブをサポートする標準設定。</li>



<li><code><strong>logical</strong></code><br>論理デコーディングをサポートし、データ変更を詳細に記録。<br></li>
</ul>



<p><strong>オンライン物理バックアップを行う場合は、<code>wal_level = replica</code> 以上に設定する必要があります。設定を変更するには、<code>postgresql.conf</code> を編集し、PostgreSQLを再起動してください。</strong></p>



<pre class="wp-block-code"><code>wal_level = replica</code></pre>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><span id="toc17">バックアップの取得手順</span></h3>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc18">バックアップモードの開始（psql で実行）</span></h4>



<p>pg_backup_start（）はスーパーユーザーで実行します。又、下記の「backup label」にはバックアップが特定できる一意の文字を入力します。</p>



<ul class="wp-block-list">
<li><strong>PostgreSQL 14以前</strong><br><code>pg_start_backup('backup_label');</code></li>



<li><strong>PostgreSQL 15以降</strong><br><code>pg_backup_start('backup_label', true);</code><br></li>
</ul>



<pre class="wp-block-code"><code>C:\&gt;psql -U postgres
psql (16.4)
"help"でヘルプを表示します。

postgres=# SELECT pg_backup_start('backup_label', true);
 pg_backup_start
-----------------
 0/2000028
(1 行)</code></pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc19">データディレクトリをコピー（コマンドプロンプトで実行）</span></h4>



<pre class="wp-block-code"><code>C:\>xcopy /E /I /EXCLUDE: "C:\Program Files\PostgreSQL\16\data" C:\backup_directory\data
C:\Program Files\PostgreSQL\16\data\backup_label.old
C:\Program Files\PostgreSQL\16\data\backup_manifest
                         ・
                         ・
                         ・
C:\Program Files\PostgreSQL\16\data\pg_wal\archive_status\000000010000000000000002.done
C:\Program Files\PostgreSQL\16\data\pg_xact\0000
2006 個のファイルをコピーしました

C:\></code></pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc20">バックアップモードの終了（psql で実行）</span></h4>



<ul class="wp-block-list">
<li><strong>PostgreSQL 14以前</strong><br><code><code>pg_stop_backup();</code></code></li>



<li><strong>PostgreSQL 15以降</strong><br><code>pg backup_stop();</code></li>
</ul>



<pre class="wp-block-code"><code>postgres=# SELECT pg_backup_stop();
NOTICE:  WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup
                              pg_backup_stop
---------------------------------------------------------------------------
 (0/3000060,"START WAL LOCATION: 0/2000028 (file 000000010000000000000002)+
 CHECKPOINT LOCATION: 0/2000060                                           +
 BACKUP METHOD: streamed                                                  +
 BACKUP FROM: standby                                                     +
 START TIME: 2025-02-10 06:08:54 JST                                      +
 LABEL: backup_label                                                      +
 START TIMELINE: 1                                                        +
 ","")
(1 行)

postgres=#</code></pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc21">WALログを保存（コマンドプロンプトで実行）</span></h4>



<pre class="wp-block-code"><code>C:\&gt;xcopy /E /I "C:\Program Files\PostgreSQL\16\data\pg_wal" C:\backup_directory\pg_wal
C:\Program Files\PostgreSQL\16\data\pg_wal\000000010000000000000002
C:\Program Files\PostgreSQL\16\data\pg_wal\000000010000000000000003
C:\Program Files\PostgreSQL\16\data\pg_wal\archive_status\000000010000000000000002.done
3 個のファイルをコピーしました</code></pre>



<div style="height:60px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc22">オンライン物理バックアップ（pg_basebackup）との違い</span></h2>



<p>データベースを停止しない<strong>オンライン物理バックアップには（<code><code>pg_basebackup</code>）</code></strong>コマンドを使用する方法もあります。<strong><code><code>pg_basebackup</code></code></strong>は主に以下の場合に使用されます。</p>



<ul class="wp-block-list">
<li>データディレクトリ全体のスナップショットを取得し、復旧のために必要な全てのデータを取得する場合</li>



<li>レプリケーションのスタンバイサーバをセットアップする場合</li>



<li>Point-In-Time Recovery (PITR) を行うための基盤となるバックアップを作成する場合</li>



<li>別のサーバーにPostgreSQLデータベースを移行する場合</li>



<li>定期的なバックアップを自動化する場合</li>
</ul>



<p><strong>「<code><code>pg_basebackup</code></code>」を使用したオンライン物理バックアップについては下記のブログを参考下さい。</strong><br><strong>参考ブログ</strong>：<a href="https://www.kemmy-it.com/2025/02/08/posgre_pg_basebackup-2/">【PostgreSQL】pg_basebackup によるオンライン物理バックアップ</a></p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-flexible-table-block-table"><table class=""><thead><tr><th>№</th><th>項目</th><th><code>pg_start_backup()</code></th><th><code>pg_basebackup</code></th></tr></thead><tbody><tr><td>１</td><td>操作方法</td><td>手動でコピー</td><td>コマンドで一括取得</td></tr><tr><td>２</td><td>柔軟性</td><td>高い（ディレクトリ選択可能）</td><td>低い（全体コピー）</td></tr><tr><td>３</td><td>WAL管理</td><td>手動で取得が必要</td><td>自動取得</td></tr><tr><td>４</td><td>使いやすさ</td><td>複雑</td><td>簡単</td></tr><tr><td>５</td><td>利用ケース</td><td>高度なバックアップ戦略</td><td>簡単なフルバックアップ</td></tr></tbody></table></figure>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="576" src="https://www.kemmy-it.com/wp-content/uploads/2025/02/05_blg-002-1024x576.png" alt="" class="wp-image-4273" srcset="https://www.kemmy-it.com/wp-content/uploads/2025/02/05_blg-002-1024x576.png 1024w, https://www.kemmy-it.com/wp-content/uploads/2025/02/05_blg-002-300x169.png 300w, https://www.kemmy-it.com/wp-content/uploads/2025/02/05_blg-002-768x432.png 768w, https://www.kemmy-it.com/wp-content/uploads/2025/02/05_blg-002-1536x864.png 1536w, https://www.kemmy-it.com/wp-content/uploads/2025/02/05_blg-002-120x68.png 120w, https://www.kemmy-it.com/wp-content/uploads/2025/02/05_blg-002-160x90.png 160w, https://www.kemmy-it.com/wp-content/uploads/2025/02/05_blg-002-320x180.png 320w, https://www.kemmy-it.com/wp-content/uploads/2025/02/05_blg-002-376x212.png 376w, https://www.kemmy-it.com/wp-content/uploads/2025/02/05_blg-002.png 1600w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc23">【PostgreSQL】バックアップの復元</span></h2>



<h3 class="wp-block-heading"><span id="toc24">バックアップの復元手順</span></h3>



<h4 class="wp-block-heading"><span id="toc25">既存のデータディレクトリを削除（または別の場所に移動）</span></h4>



<pre class="wp-block-code"><code>C:\>net stop postgresql-x64-16
postgresql-x64-16 - PostgreSQL Server 16 サービスを停止中です.
postgresql-x64-16 - PostgreSQL Server 16 サービスは正常に停止されました。

C:\>ren "C:\Program Files\PostgreSQL\16\data" "data_old"</code></pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc26">バックアップをリストア</span></h4>



<pre class="wp-block-code"><code>c:\>xcopy /E /I C:\backup_directory\data "C:\Program Files\PostgreSQL\16\data"
C:\backup_directory\data\000000010000000000000002
C:\backup_directory\data\000000010000000000000003
C:\backup_directory\data\backup_label.old
C:\backup_directory\data\backup_manifest
                         ・
                         ・
                         ・
C:\backup_directory\data\pg_wal\000000010000000000000003
C:\backup_directory\data\pg_wal\archive_status\000000010000000000000002.done
C:\backup_directory\data\pg_xact\0000
2009 個のファイルをコピーしました

C:\></code></pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc27">WALログを適用</span></h4>



<pre class="wp-block-code"><code>C:\>xcopy /E /I C:\backup_directory\pg_wal "C:\Program Files\PostgreSQL\16\data\pg_wal"
C:\backup_directory\pg_wal\000000010000000000000002
C:\backup_directory\pg_wal\000000010000000000000003
C:\backup_directory\pg_wal\archive_status\000000010000000000000002.done
3 個のファイルをコピーしました

C:\></code></pre>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><span id="toc28">PostgreSQLを起動</span></h4>



<pre class="wp-block-code"><code>C:\>net start postgresql-x64-16
postgresql-x64-16 - PostgreSQL Server 16 サービスを開始します.
postgresql-x64-16 - PostgreSQL Server 16 サービスは正常に開始されました。

C:\></code></pre>



<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading"><span id="toc29">まとめ</span></h2>



<p><code>pg_start_backup()</code> を使用すると、柔軟で細かい管理が可能になりますが、<code>pg_basebackup</code> の方が簡単にフルバックアップを取得できます。運用環境に応じて適切な方法を選択して下さい。</p>



<figure class="wp-block-flexible-table-block-table"><table class=""><tbody><tr><td>№</td><td>バックアップ方式</td><td>メリット</td><td>デメリット</td></tr><tr><td>1</td><td><strong>論理バックアップ</strong></td><td>柔軟な復元、異なるバージョン対応</td><td>大規模DBでは遅い、一貫性管理が必要</td></tr><tr><td>2</td><td><strong>オフライン物理バックアップ</strong></td><td>シンプルで確実</td><td>停止が必要、部分復元不可</td></tr><tr><td>3</td><td><strong>オンライン物理バックアップ (</strong><code><strong>pg_start_backup()</strong></code><strong>********)</strong></td><td>柔軟な管理が可能</td><td>手順が複雑、WAL管理が必要</td></tr><tr><td>4</td><td><code><strong>pg_basebackup</strong></code></td><td>簡単に取得可能</td><td>カスタマイズ性が低い</td></tr></tbody></table></figure>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.kemmy-it.com/2025/02/10/posgre_pg_startbackup/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
