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

<image>
	<url>https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2018/07/blog-icon-150x150.png</url>
	<title>バックアップ &#8211; SRA OSS Tech Blog</title>
	<link>https://www.sraoss.co.jp/tech-blog/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>PostgreSQLバックアップの基礎</title>
		<link>https://www.sraoss.co.jp/tech-blog/pgsql/backup_basic/</link>
		
		<dc:creator><![CDATA[データベース技術グループ]]></dc:creator>
		<pubDate>Wed, 07 Jan 2026 03:06:37 +0000</pubDate>
				<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[バックアップ]]></category>
		<guid isPermaLink="false">https://www.sraoss.co.jp/tech-blog/?p=19162</guid>

					<description><![CDATA[本記事では PostgreSQLのバックアップについて、基本的な概念と、取りうるいくつかの手段について、基本的な解説をします。 データベース全般におけるバックアップ データベースのバックアップには、PostgreSQLに ...]]></description>
										<content:encoded><![CDATA[<p>本記事では PostgreSQLのバックアップについて、基本的な概念と、取りうるいくつかの手段について、基本的な解説をします。</p>
<p><span id="more-19162"></span></p>
<h3>データベース全般におけるバックアップ</h3>
<p>データベースのバックアップには、PostgreSQLに限らず、一般的に論理/物理、また、オンライン/オフラインがあります。まず、この分類の説明をします。また、RPO/RTOという考え方についても説明します。</p>
<h4>論理バックアップ/物理バックアップ</h4>
<p>論理バックアップは、データベースの内容をSQL文のテキスト形式や同内容のバイナリ形式でバックアップすることです。リストアはそのSQL文を実行することで行います。物理バックアップとは、データベースのOS上のデータ格納ファイルをそのままの形でバックアップすることです。利用しているOSやデータベースソフトウェアのみ理解できる形式です。</p>
<h4>オンラインバックアップ/オフラインバックアップ</h4>
<p>オンラインバックアップは、データベースサービスが起動している状態で行うバックアップです。ホットバックアップとも言います。オフラインバックアップとは、データベースサービスが停止している状態で行うバックアップです。コールドバックアップとも言います。</p>
<p>後述するPostgreSQLのバックアップ用のコマンドは全てオンラインバックアップを実行します。オフラインバックアップは、サービスが停止している状態で、OSのコマンド(cp, tar 等)や、ストレージ装置や仮想化基盤によるスナップショット機能で、データベースの格納ディレクトリを丸ごとコピーして、それを物理バックアップとすることで実現できます。</p>
<h4>RPO/RTO</h4>
<p>RPO（Recovery Point Objective）はおおまかに「障害発生時にどの時点までデータベースをリカバリするか」という意味です。バックアップ方式によって実現可能なRPOが異なりますので、RPOはバックアップ方式を選択するときの判断基準の一つです。データが日々更新される状況において、データベースに障害が発生した場合、理想は障害の直前のデータまで復旧することになります。</p>
<p>RPO と同じ文脈でよく語られる言葉としてRTO（Recovery Time Objective）があります。これは「リカバリ作業にどのくらい時間がかかるか」という意味です。こちらもバックアップ方式の重要な選択基準となります。</p>
<h3>PostgreSQL におけるバックアップ</h3>
<p>ここからはPostgreSQL についての説明になります。なお、文中で PostgreSQLドキュメントのリンクを提示するときにはバージョン17文書のURLを使用していますので、皆さんが実際に使っている PostgreSQLバージョンに読み替えてください。</p>
<h4>バックアップ対象</h4>
<p>バックアップ対象となるデータベースサーバの構成を図示すると下記の様になります。物理的な見方と論理的な見方があります。前者はファイルとディレクトリであり、後者は利用者から見えるデータベース内の要素です。</p>
<p><img decoding="async" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/01/pgsql_backup_phys.png" alt="バックアップ対象（物理）" /></p>
<p><img decoding="async" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/01/pgsql_backup_logi.png" alt="バックアップ対象（論理）" /></p>
<p>PostgreSQLは1つのデータベースクラスタとWALファイル群に対応して、1つのサービスを起動します。データベースクラスタは<a href="https://www.postgresql.jp/document/17/html/app-initdb.html" target="_blank" rel="noopener">initdb</a>コマンドで作成するものです。</p>
<p>「データベースクラスタ」の中には「データベース」がいくつか存在します。「データベース」の中には「スキーマ」がいくつか存在します。スキーマにはデータベースを作成した時に自動的に作成されるパブリックスキーマの他に、ユーザがそれぞれの用途で使用するスキーマがあります。</p>
<p><a href="https://www.postgresql.jp/document/17/html/app-pgdump.html" target="_blank" rel="noopener">pg_dump</a> は論理バックアップを行い、その対象は「データベース」や「スキーマ」です。テーブル単位の指定も可能です。実行時にデータベースやスキーマを指定することで、それぞれの単位でバックアップファイルを作成します。<a href="https://www.postgresql.jp/document/17/html/app-pg-dumpall.html" target="_blank" rel="noopener">pg_dumpall</a>も論理バックアップを行い、その対象は「データベースクラスタ」です。実行するとデータベースクラスタ全体のバックアップファイルを作成します。<a href="https://www.postgresql.jp/document/17/html/app-pgbasebackup.html" target="_blank" rel="noopener">pg_basebackup</a>のバックアップは物理バックアップを行い、対象は「データベースクラスタ」です。</p>
<h5>グローバルオブジェクト</h5>
<p>データベースクラスタにはグローバルオブジェクトが存在します。グローバルオブジェクトとは、個々のデータベースに属さないロール情報やアクセス制限に関する情報などです。これらは各データベースから共通して使用されます。</p>
<h5>WALファイル</h5>
<p>WALファイルとは更新情報が書き込まれるファイルです。データベースクラスタの更新よりも先にWALファイルが更新されます。データベースへの更新（INSERT等）が発生した場合、データの更新の順序は下記の通りです。</p>
<ol>
<li>データ更新は共有バッファ（メモリ）上のデータで実行されます。</li>
<li>更新内容はWALファイルに書き出されます。</li>
<li>共有バッファ上のデータ更新は下記のタイミングでデータベースクラスタ内のファイルに反映されます。
<ul>
<li>時間経過や更新量に応じて発生するチェックポイント処理で</li>
<li>共有バッファが不足したとき</li>
<li>バックグラウンドライターの動作で</li>
</ul>
</li>
</ol>
<p>このようにすることで、データ更新中にデータベースサーバの電源が落ちたり、PostgreSQLサーバプロセスが強制終了されたりしても、次にサービス起動するときには、WALファイルを読み込んで記録されている変更を適用することで、整合性のあるデータ状態に復旧する仕組みになっています。</p>
<p>対応する更新内容をデータベースクラスタに反映し終えたWALファイルは、チェックポイント処理の時に順次削除されます。</p>
<h4>バックアップ方法</h4>
<p>それではPostgreSQLの具体的なバックアップ方法を見ていきます。</p>
<h5>ダンプ</h5>
<p><img decoding="async" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/01/pgsql_backup_dump.png" alt="ダンプ" /></p>
<p>PostgreSQL付属コマンドの<a href="https://www.postgresql.jp/document/17/html/app-pgdump.html" target="_blank" rel="noopener">pg_dump</a>と<a href="https://www.postgresql.jp/document/17/html/app-pg-dumpall.html" target="_blank" rel="noopener">pg_dumpall</a>を使用して、オンライン論理バックアップを取得することができます。このバックアップはダンプと呼ばれます。<a href="https://www.postgresql.jp/document/17/html/app-pgdump.html" target="_blank" rel="noopener">pg_dump</a>は1つのデータベース、または、その中の指定スキーマや指定テーブルを対象とします。<a href="https://www.postgresql.jp/document/17/html/app-pg-dumpall.html" target="_blank" rel="noopener">pg_dumpall</a> はグローバルオブジェクトを含むデータベースクラスタ全体を対象とします。<a href="https://www.postgresql.jp/document/17/html/app-pg-dumpall.html" target="_blank" rel="noopener">pg_dumpall</a> を <code>-g (--globals-only)</code> オプションで実行して、グローバルオブジェクトのみをバックアップすることも可能です。</p>
<p>pg_dumpと<a href="https://www.postgresql.jp/document/17/html/app-pg-dumpall.html" target="_blank" rel="noopener">pg_dumpall</a>はPostgreSQLのクライアントアプリケーションとして動作します。したがって、データベースサーバ内からでも、リモートサーバからでもバックアップの取得が可能です。</p>
<p>バックアップファイルの形式は、<a href="https://www.postgresql.jp/document/17/html/app-pgdump.html" target="_blank" rel="noopener">pg_dump</a>ではテキスト形式かいくつかのバイナリ形式を選択できます。<a href="https://www.postgresql.jp/document/17/html/app-pg-dumpall.html" target="_blank" rel="noopener">pg_dumpall</a>はテキスト形式のみです。バイナリ形式は<a href="https://www.postgresql.jp/document/17/html/app-pgrestore.html" target="_blank" rel="noopener">pg_restore</a>でテキスト形式に変換できます（<a href="https://www.postgresql.jp/document/17/html/app-pgrestore.html" target="_blank" rel="noopener">pg_restore</a>で直接リストアすることもできます）。これらのコマンドはデータ定義だけのバックアップ、データだけのバックアップなども可能です。対象のデータベース、スキーマ、テーブルを限定することもできます。</p>
<p>ダンプは論理バックアップであるため、PostgreSQLのメジャーアップデート時のデータ移行にも利用できます。ただし、PostgreSQL固有のSQL文(COPY等やSET文)が含まれるため、他のデータベースソフトウェアむけにそのまま適用することはできません。<a href="https://www.postgresql.jp/document/17/html/app-pgdump.html" target="_blank" rel="noopener">pg_dump</a>に<code>--inserts</code>オプションを指定して、COPY文をINSERT文に変えて出力することはできます。</p>
<h5>ベースバックアップ</h5>
<p><img decoding="async" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/01/pgsql_backup_basebackup.png" alt="ベースバックアップ" /></p>
<p>PostgreSQL付属コマンドの<a href="https://www.postgresql.jp/document/17/html/app-pgbasebackup.html" target="_blank" rel="noopener">pg_basebackup</a>ではオンラインの物理バックアップを取得できます。これにより取得するバックアップはベースバックアップと呼ばれます。取得されるのはデータベースクラスタディレクトリのコピー、または、それをいくつかのtar形式のファイルに纏めたものです。デフォルト動作ではバックアップ取得中に生じたWALファイルも取得されます。</p>
<p>ベースバックアップは、動作プラットフォームやPostgreSQLのメジャーバージョンに依存しています。異なる環境むけにリストアすることができません。が異なる場合は利用できません。PostgreSQLマイナーバージョンが異なる環境にはリストア可能ですが追加の対処が必要なケースもあるので、個別のバージョンの情報の確認も必要になります。</p>
<p>ディレクトリをバックアップする任意の手段でベースバックアップを取得することもできます。バックアップの取得前に管理者ユーザ（一般的にはpostgresユーザ）でデータベースに接続し、<a href="https://www.postgresql.jp/document/17/html/functions-admin.html#FUNCTIONS-ADMIN-BACKUP-TABLE" target="_blank" rel="noopener">pg_backup_start()</a>関数を実行して、オフラインバックアップと同様に、OSのコマンドでデータベースのディレクトリ構成を丸ごとコピーして、最後に同じセッションで<a href="https://www.postgresql.jp/document/17/html/functions-admin.html#FUNCTIONS-ADMIN-BACKUP-TABLE" target="_blank" rel="noopener">pg_backup_stop()</a>関数を実行し、応答行のbackup_label列、tablespace_map列の内容をそれぞれ列名と同じファイル名でバックアップ先のデータベースクラスタディレクトリ下に保存します。これらの手順を行なうことで整合性のあるリストアが可能となります。これは<a href="https://www.postgresql.jp/document/17/html/app-pgbasebackup.html" target="_blank" rel="noopener">pg_basebackup</a>コマンドが内部で実行していることとほぼ同じです。なお、PostgreSQL 14 までは、pg_backup_start()、pg_backup_stop() 関数はそれぞれ、pg_start_backup()、pg_stop_backup() という名前でした。</p>
<p>ベースバックアップ取得は、SQLとしてのデータ参照を行わないため、ダンプ取得と比べると稼働中のPostgreSQLに対する負荷が低いという特徴があります。一般的には取得のための所要時間もより短くなります。</p>
<h4>リストア方法</h4>
<h5>ダンプのリストア</h5>
<p>ダンプのリストアは、稼働中のPostgreSQLサービスに対して、ダンプに書かれているSQLを実行することで行います。ダンプを取得開始した時点のデータ状態に戻すことができます。</p>
<p>テキスト形式のダンプをリストアするには<a href="https://www.postgresql.jp/document/17/html/app-psql.html" target="_blank" rel="noopener">psql</a>コマンドでダンプに書かれているSQLを実行します。<code>-f (--file=)</code> オプションで指定する、リダイレクションで標準入力として与える、接続後に \iメタコマンドで読み込む、など、いずれの方法でも構いません。</p>
<p>バイナリ形式のダンプのリストアには<a href="https://www.postgresql.jp/document/17/html/app-pgrestore.html" target="_blank" rel="noopener">pg_restore</a>コマンドを使用します。<a href="https://www.postgresql.jp/document/17/html/app-pgrestore.html" target="_blank" rel="noopener">pg_restore</a>コマンドでテキスト形式に戻して、SQL文を<a href="https://www.postgresql.jp/document/17/html/app-psql.html" target="_blank" rel="noopener">psql</a>コマンドで実行することも可能です。</p>
<p><a href="https://www.postgresql.jp/document/17/html/app-pg-dumpall.html" target="_blank" rel="noopener">pg_dumpall</a>で取得したテキスト形式のダンプをリストアする場合には、initdb コマンドで初期状態のデータベースクラスタを作成して、そこでPostgreSQLサービスを起動して、そこにpsqlコマンドでダンプファイルを実行します。</p>
<h5>ベースバックアップのリストア</h5>
<p>ベースバックアップのリストアは、バックアップを元通りのデータベースクラスタディレクトリとして配置して、そこでPostgreSQLサービスを起動することで行います。取得中のWALファイルを含むベースバックアップであれば、起動過程でWALファイルの適用が行われて、バックアップ取得が完了した時点の整合性のあるデータ状態にリストアされます。</p>
<p>WALファイルを含まないベースバックアップのリストアには、別途WALファイルを適用させる手順が必要です。これについて次節で述べます。</p>
<p>ベースバックアップからのリストアは、一般にダンプからのリストアよりも高速です。ダンプからのリストアは全データを復元するSQLの実行であるのに対して、ベースバックアップからのリストアはバックアップ取得中の差分のWALを適用するだけであるからです。</p>
<h4>PITR (Point-In-Time Recovery)</h4>
<p><img decoding="async" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2026/01/pgsql_backup_pitr.png" alt="PITR" /></p>
<p>ベースバックアップからのリストアでは、バックアップ取得時だけでなく、その後の任意の時点にリストアすることができます。これを PITR（Point-In-Time Recovery）と呼びます。</p>
<p>PostgreSQL の設定でWALファイルを指定したディレクトリに退避して保管(アーカイブ)させることができます。具体的には、postgresql.conf の <a href="https://www.postgresql.jp/document/17/html/runtime-config-wal.html#GUC-ARCHIVE-MODE" target="_blank" rel="noopener">archive_mode</a>を on に、<a href="https://www.postgresql.jp/document/17/html/runtime-config-wal.html#GUC-ARCHIVE-COMMAND" target="_blank" rel="noopener">archive_command</a>に WALファイルをアーカイブ格納先にコピーするコマンドを設定します。</p>
<p>古いWAL ファイルは自動的に削除されますが、アーカイブとしてWALファイルを退避してすることで、それらのWAL書き込みがあった時点まで復元することが可能になります。この処理はバックアップ取得の操作とは別個に、バックグラウンドで適時実行されます。ベースバックアップに加えてWALファイルのアーカイブを使うことで、PITRが実現できます。障害が発生した直前までのアーカイブWALをベースバックアップからのリストアに使用することで、RPO を障害直前時点とすることができます。また、誤操作を復旧するために、誤操作した時刻直前を指定してリストアする使い方もできます。</p>
<p>WALアーカイブを使ったベースバックアップからのリストアを行うには、データベースクラスタディレクトリにrecovery.signalファイル（空ファイルで良い）を置いて、postgresql.conf の <a href="https://www.postgresql.jp/document/17/html/runtime-config-wal.html#GUC-RESTORE-COMMAND" target="_blank" rel="noopener">restore_command</a>にアーカイブからWALをコピーするコマンドを設定したうえで、PostgreSQLサービスを起動します。</p>
<p>PITRを行うときに復元時点がベースアップ取得時点から離れていると、その分リストアに時間がかかり、保存しておくWALアーカイブも大量に必要となります。そのため、定期的にベースバックアップを取得して、古いベースバックアップを削除して、その削除したベースバックアップのリストアのために必要だったWALもアーカイブから削除していくのが一般的です。あるベースバックアップがどのアーカイブWALファイルまでを必要としているかは、ベースバックアップ時に生成される .backup サフィックスのファイルに書かれています。このファイルは WALと同じディレクトリに作られて、WALと共にアーカイブもされます。<a href="https://www.postgresql.jp/document/17/html/pgarchivecleanup.html" target="_blank" rel="noopener">pg_archivecleanup</a>コマンドに残したい最も古いベースバックアップに対応した .backupファイルを指定すれば、不要なアーカイブWALファイルを削除してくれますので、これが簡単な方法です。</p>
<p><a href="https://www.postgresql.jp/document/17/html/continuous-archiving.html" target="_blank" rel="noopener">PITRの具体的な構成手順とリストア手順</a>はPostgreSQLドキュメントに記載があります。</p>
<h4>増分バックアップ</h4>
<p>PostgreSQL 17以降、<a href="https://www.postgresql.jp/document/17/html/app-pgbasebackup.html" target="_blank" rel="noopener">pg_basebackup</a>でベースバックアップの増分バックアップを行う<code>-i（--incremental)</code>オプションが利用可能になりました。ベースバックアップを比較的短い周期で何世代も取得する場合、ほとんど同じ内容のバックアップを多数持つことになります。増分バックアップでは、前回のベースバックアップを指定して、それに対するデータベースクラスタの変更分だけをバックアップします。これにより、格納サイズを節約できます。増分バックアップを行うためには、postgresql.conf で <a href="https://www.postgresql.jp/document/17/html/runtime-config-wal.html#GUC-SUMMARIZE-WAL" target="_blank" rel="noopener">summarize_wal</a> = on の設定と、<a href="https://www.postgresql.jp/document/17/html/runtime-config-wal.html#GUC-WAL-SUMMARY-KEEP-TIME" target="_blank" rel="noopener">wal_summary_keep_time</a>にバックアップ周期以上の期間を設定することが必要です。</p>
<p>リストアには完全なフルバックアップとその後に実行した複数の増分バックアップを全てマージする必要があります。マージには<a href="https://www.postgresql.jp/document/17/html/app-pgcombinebackup.html" target="_blank" rel="noopener">pg_combinebackup</a>コマンドを利用し、フルバックアップのパス、増分バックアップのパス(複数指定可)、出力先を指定して実行します。マージすると完全なベースバックアップが作られて、以降のリカバリ手順は通常のベースバックアップと同じです。</p>
<p>なお、WALファイルも変更差分が書かれたものですが、1つのベースバックアップと大量のWALファイルからリストアするよりも、完全なベースバックアップといくつかの増分バックアップ、少量のWALファイルでリストアする方が、一般的に所要時間が短くて済みます。</p>
<h4>設定ファイルのバックアップ</h4>
<p>設定ファイルもバックアップが必要です。ダンプバックアップの場合、設定ファイルは対象外ですので、<a href="https://www.postgresql.jp/document/17/html/app-pgdump.html" target="_blank" rel="noopener">pg_dump</a>や <a href="https://www.postgresql.jp/document/17/html/app-pg-dumpall.html" target="_blank" rel="noopener">pg_dumpall</a>コマンドの実行に加えて、postgresql.conf 等の .confファイルを明示的にバックアップ先にコピーしておくことが必要です。<a href="https://www.postgresql.jp/document/17/html/app-pgbasebackup.html" target="_blank" rel="noopener">pg_basebackup</a>はデータベースクラスタディレクトリをまるまるバックアップするので、設定ファイルもバックアップデータに含まれる結果となります。</p>
<h3>まとめ</h3>
<p>最後にこれまで説明してきたバックアップ方式について一覧にまとめます。</p>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<th>バックアップ方式</th>
<th>形態</th>
<th>バックアップコマンド</th>
<th>リストアコマンド</th>
<th>稼働PostgreSQLへの負荷</th>
<th>RPO</th>
<th>RTO</th>
<th>設定ファイル</th>
</tr>
<tr>
<td>ダンプ（テキスト形式）</td>
<td>オンライン／論理</td>
<td>pg_dumpall</td>
<td>psql、initdb</td>
<td>やや負荷あり</td>
<td>取得時点</td>
<td>やや長時間</td>
<td>含まれない</td>
</tr>
<tr>
<td>ダンプ（バイナリ形式）</td>
<td>オンライン／論理</td>
<td>pg_dumpall、pg_dump 組み合わせ</td>
<td>psql、pg_restore</td>
<td>やや負荷あり</td>
<td>取得時点</td>
<td>やや長時間</td>
<td>含まれない</td>
</tr>
<tr>
<td>ベースバックアップ</td>
<td>オンライン／物理</td>
<td>pg_basebackup</td>
<td>サービス起動のみ</td>
<td>低負荷</td>
<td>取得時点</td>
<td>短時間</td>
<td>含まれる</td>
</tr>
<tr>
<td>ベースバックアップ/PITR</td>
<td>オンライン／物理</td>
<td>pg_basebackup と WALアーカイブ設定</td>
<td>サービス起動のみ</td>
<td>低負荷</td>
<td>障害直前または任意時点</td>
<td>WAL数次第</td>
<td>含まれる</td>
</tr>
<tr>
<td>差分ベースバックアップ</td>
<td>オンライン／物理</td>
<td>pg_basebackup</td>
<td>pg_combinebackupとサービス起動</td>
<td>低負荷</td>
<td>取得時点</td>
<td>差分数次第</td>
<td>含まれる</td>
</tr>
<tr>
<td>差分ベースバックアップ/PITR</td>
<td>オンライン／物理</td>
<td>pg_basebackup と WALアーカイブ設定</td>
<td>pg_combinebackupとサービス起動</td>
<td>低負荷</td>
<td>障害直前または任意時点</td>
<td>WAL数、差分数次第</td>
<td>含まれる</td>
</tr>
<tr>
<td>オフラインバックアップ</td>
<td>オフライン／物理</td>
<td>OSコマンド</td>
<td>OSコマンド</td>
<td>要サービス停止</td>
<td>取得時点</td>
<td>短時間</td>
<td>含まれる</td>
</tr>
</tbody>
</table>
<p>本稿がPostgreSQLバックアップ方式の検討、選定に役立てば幸いです。</p>
<div>
<a href="https://www.sraoss.co.jp/prod_serv/support/pgsql-mainte/?utm_source=sraoss-techblog&utm_medium=referral&utm_campaign=under-article-pgsql" rel="noopener" style="color:initial;" target="_blank" class="no-ext"></p>
<div style="background-color:#DAEFF6; padding:20px; border-radius:8px; text-align:center;">
SRA OSSでは、PostgreSQL/Pgpool-II のサポートを提供しております。<br />
詳しくは<strong style="color:#2581c4;">弊社ホームページ</strong>をご覧ください。
</div>
<p></a>
</div>

]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PostgreSQL 17 増分バックアップの実践活用と運用上の考慮点</title>
		<link>https://www.sraoss.co.jp/tech-blog/pgsql/postgresql17-incremental-backup-guide/</link>
		
		<dc:creator><![CDATA[越野 太基 (Taiki Koshino)]]></dc:creator>
		<pubDate>Tue, 16 Dec 2025 05:00:10 +0000</pubDate>
				<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[PostgreSQL 17]]></category>
		<category><![CDATA[バックアップ]]></category>
		<guid isPermaLink="false">https://www.sraoss.co.jp/tech-blog/?p=18967</guid>

					<description><![CDATA[この記事は SRA Advent Calendar 2025 18 日目の記事です。 PostgreSQL には様々なバックアップの方法が提供されています。 それぞれのバックアップの方法は利点が違い、運用方法も手順も異な ...]]></description>
										<content:encoded><![CDATA[<p>この記事は <a href="https://qiita.com/advent-calendar/2025/sra" target="_blank" rel="noopener">SRA Advent Calendar 2025</a> 18 日目の記事です。</p>
<p>PostgreSQL には様々なバックアップの方法が提供されています。<br />
それぞれのバックアップの方法は利点が違い、運用方法も手順も異なります。<br />
今回はバックアップ方法の簡単なおさらいと、PostgreSQL 17 で標準機能として追加された増分バックアップについて紹介します。</p>
<p><span id="more-18967"></span></p>
<h1>PostgreSQLのバックアップの種類</h1>
<p>PostgreSQL のバックアップは大きく論理バックアップ と 物理バックアップの 2 種類に分類できます。</p>
<h2>論理バックアップ</h2>
<p>SQL レベルでデータを取得する方式です。<br data-start="855" data-end="858" />CREATE TABLE や INSERT 文などで現在のデータベースの状態を再現できるファイルを生成します。<br data-start="917" data-end="920" />異なるOSアーキテクチャ間や PostgreSQL メジャーバージョン間でもリストア可能という柔軟性が大きな利点です。</p>
<h2>物理バックアップ</h2>
<p>データベースクラスタ全体のディレクトリを丸ごと保存する方式です。<br data-start="1018" data-end="1021" />Linux の cp コマンドや PostgreSQL 標準ツールである pg_basebackup を利用できます。<br data-start="1084" data-end="1087" />pg_basebackup では PITR（Point-In-Time Recovery）や PostgreSQL 17 で追加された 増分バックアップ を利用できる点が最大の特徴です。</p>
<p>今回は、この「増分バックアップ」について詳しく紹介します。</p>
<h1>増分バックアップとメリット</h1>
<p><img fetchpriority="high" decoding="async" class="alignnone wp-image-19195" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/dd52debf533c5c5cea3a99fcffb0e201-300x168.png" alt="" width="637" height="357" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/dd52debf533c5c5cea3a99fcffb0e201-300x168.png 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/dd52debf533c5c5cea3a99fcffb0e201-1024x575.png 1024w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/dd52debf533c5c5cea3a99fcffb0e201-768x431.png 768w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/dd52debf533c5c5cea3a99fcffb0e201-304x171.png 304w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/dd52debf533c5c5cea3a99fcffb0e201-282x158.png 282w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/dd52debf533c5c5cea3a99fcffb0e201.png 1364w" sizes="(max-width: 637px) 100vw, 637px" /></p>
<p>増分バックアップは、ある時点で取得したフルバックアップをベースとし、その後に変更された部分だけを保存する方式です。</p>
<p data-start="530" data-end="614">たとえば、10 TB のデータベースを毎日 30 日分フルバックアップで保存すると、<br data-start="572" data-end="575" />10 TB × 30 日 = 300 TB もの容量が必要になります。</p>
<p data-start="616" data-end="686">しかし増分バックアップであれば、<br data-start="632" data-end="635" />初日のフル 10 TB + 毎日の変更分のみを保存すればよく、大幅なストレージ削減が可能です。<br />
上記の図は毎日の変更分を10GBと想定した場合の比較図となります。</p>
<p data-start="688" data-end="801">また、バックアップ取得時間も短縮できます。<br />
フルバックアップではすべてのデータをコピーするため時間がかかりますが、増分バックアップは変更分だけを取得するためバックアップ時間の短縮につながります。<br />
また結果としてサーバー負荷の軽減にも寄与します。</p>
<h1>増分バックアップの手順</h1>
<p data-start="824" data-end="936">従来、PostgreSQL で増分バックアップを行いたい場合は、サードパーティツールである pg_rman の利用が一般的でした。<br data-start="896" data-end="899" />ただし、pg_rman は Windows 非対応という課題がありました。</p>
<p data-start="938" data-end="1010">PostgreSQL 17 ではこれらの問題が解消され、標準機能として増分バックアップがサポートされました。<br data-start="991" data-end="994" />主な追加項目は以下のとおりです。</p>
<ol>
<li>pg_basebackup に増分バックアップを取得する -​-incremental オプションが追加</li>
<li>フルバックアップと増分バックアップを統合する pg_combinebackup コマンドの追加</li>
<li>増分バックアップの制御にかかわる summarize_wal, wal_keep_summary パラメータの追加</li>
</ol>
<p>これらによって増分バックアップの取得が可能になっています。<br />
それぞれのコマンドやパラメータの扱い方について詳しく見ていきましょう。</p>
<p>動作確認環境と postgresql.conf のパラメータは以下です。</p>
<p><strong>動作環境</strong></p>
<table width="1218">
<tbody>
<tr>
<td width="406"><b>領域</b></td>
<td width="406"><b>パス</b></td>
<td width="406"><b>備考</b></td>
</tr>
<tr>
<td width="406">データベースクラスタ</td>
<td width="406">data</td>
<td width="406"></td>
</tr>
<tr>
<td width="406">WAL領域</td>
<td width="406">data/pg_wal</td>
<td width="406"></td>
</tr>
<tr>
<td width="406">バックアップ格納先</td>
<td width="406">backup</td>
<td width="406">フルバックアップ、<br />
増分バックアップを保存</td>
</tr>
</tbody>
</table>
<p><strong>postgresql.conf パラメータ</strong></p>
<table width="1218">
<tbody>
<tr>
<td width="406"><b>パラメータ名</b></td>
<td width="406"><b>設定値</b></td>
<td width="406"><b>備考</b></td>
</tr>
<tr>
<td width="406">summarize_wal</td>
<td width="406">on(off がデフォルト)</td>
<td width="406">on でないと<br />
増分バックアップ不可</td>
</tr>
<tr>
<td width="406">wal_level</td>
<td width="406">replica(デフォルト) 以上</td>
<td width="406">summarize_wal が on の時は replica 以上が必須</td>
</tr>
</tbody>
</table>
<h2>増分バックアップのコマンド</h2>
<p>増分バックアップの手順は大きく分けて以下です。</p>
<ol>
<li>pg_basebackup によるフルバックアップの取得</li>
<li>pg_basebackup -​-incremental による増分バックアップの取得</li>
<li>pg_combinebackup によるフルバックアップと増分バックアップの統合</li>
</ol>
<p>コマンド実行例をもとに見ていきましょう。</p>
<p>フルバックアップ取得前の時点では full_backup というテーブルがあるのみです。</p>
<p>これから各増分バックアップ取得時点でテーブルを追加していき、各世代のバックアップの状態にリストアできるかを見ていきます。</p>
<pre>$ psql
psql (17.6)
"help"でヘルプを表示します。
postgres=# \d
               リレーション一覧
 スキーマ |    名前     |  タイプ  |  所有者
----------+-------------+----------+----------
 public   | full_backup | テーブル | postgres
(1 行)</pre>
<p>最初に pg_basebackup コマンドでフルバックアップを取得します。</p>
<pre># -P オプションでサイズや進捗を確認可能
$ pg_basebackup  -D backup/full -P
23818/23818 kB (100%), 1/1 テーブル空間</pre>
<p>その後 inc1 テーブルを作成し、一回目の増分バックアップを取得します。</p>
<p>ここで pg_basebackup に新規で追加された -​-incremental オプションを用います。<br />
引数には前回取得したバックアップ、つまりフルバックアップの backup_manifest ファイルを指定します。<br />
backup_manifest ファイルはバックアップのトップディレクトリにあるのでそちらのパスを指定してください。</p>
<pre>postgres=# create table inc1 (i int);
CREATE TABLE
$ pg_basebackup --incremental=backup/full/backup_manifest -D backup/inc1</pre>
<p>二回目の増分バックアップも同様に inc2 テーブルを作成後取得します。</p>
<p>この時注意が必要なのが前回のバックアップを指定することです。<br />
今回だとフルバックアップではなく一回目の増分バックアップの backup_manifest を指定します。</p>
<pre>postgres=# create table inc2 (i int);
CREATE TABLE
$ pg_basebackup --incremental=backup/inc1/backup_manifest -D backup/inc2</pre>
<p>最後に pg_combinebackup で各世代を統合していきます。<br />
pg_combinebackup の -o オプションでは統合バックアップの出力先を指定し、その後の引数はフルバックアップから統合したい世代までの増分バックアップをすべて指定します。</p>
<p>統合後はpg_verifybackupでバックアップの整合性も忘れずチェックするようにしてください。</p>
<pre># フルバックアップからinc1(inc1 テーブルがある時点)まで
$ pg_combinebackup -o backup/combine_full_inc1 backup/full/ backup/inc1
# フルバックアップからinc2(inc1, inc2 テーブルがある時点)まで
$ pg_combinebackup -o backup/combine_full_inc2 backup/full/ backup/inc1 backup/inc2/
# 各統合バックアップを pg_verifybackup で検証
$ pg_verifybackup backup/combine_full_inc1
バックアップが正常に検証されました
$ pg_verifybackup backup/combine_full_inc2
バックアップが正常に検証されました</pre>
<h2>各世代増分バックアップの中身を確認</h2>
<p data-start="97" data-end="132">では、各世代のバックアップが正しく取得できているか確認してみましょう。</p>
<p data-start="134" data-end="235">統合バックアップを、それぞれ異なる port 番号 に設定して起動すると、各世代におけるinc1、inc2テーブルの状態が、作成時点の内容として保持されていることが分かります。</p>
<p data-start="237" data-end="283">この検証により、全ての世代でバックアップが正しく取得されていることを確認できました。</p>
<pre>$ pg_ctl -o "-p 5433" start -D backup/combine_full_inc1/
$ psql –p 5433
postgres=# \d
               リレーション一覧
 スキーマ |    名前     |  タイプ  |  所有者
----------+-------------+----------+----------
 public   | full_backup | テーブル | postgres
 public   | inc1        | テーブル | postgres
$ pg_ctl -o "-p 5434" start -D backup/combine_full_inc2/
$ psql –p 5434
postgres=# \d
               リレーション一覧
 スキーマ |    名前     |  タイプ  |  所有者
----------+-------------+----------+----------
 public   | full_backup | テーブル | postgres
 public   | inc1        | テーブル | postgres
 public   | inc2        | テーブル | postgres</pre>
<h2>増分バックアップのストレージコストと取得時間</h2>
<p data-start="100" data-end="190">最初に挙げたメリットとして、ストレージコストとバックアップ取得時間を抑えられる点がありました。<br data-start="158" data-end="161" />ここでは、実際にどの程度削減できているのか確認してみます。</p>
<p data-start="192" data-end="307">まずストレージ使用量を比較すると、初回に取得したフルバックアップは 888 MB と比較的大きなサイズでした。<br data-start="251" data-end="254" />一方、続いて取得した増分バックアップは どれも約 4 MB 程度 と非常に小さく抑えられています。</p>
<p data-start="309" data-end="439">これを「すべての世代をフルバックアップで保存する場合」と比べてみると、毎回 888 MB 近く消費することになります。<br data-start="367" data-end="370" />それに対して増分バックアップは変更分のみを保存すればよいため、世代を重ねてもバックアップ容量を大幅に抑えられる ことが分かります。</p>
<pre>$ du -h  --max-depth=1 backup/
888M     backup/full
6M     backup/inc1
4M     backup/inc2</pre>
<p>また time コマンドでバックアップ取得の時間も比べてみましょう。</p>
<p>pg_basebackup -​-incremental と -​-incremental オプションなしのフルバックアップの取得時間を比べてみると、-​-incremental での増分バックアップは取得時間がかなり短いことが分かります。</p>
<pre>$ time pg_basebackup -D backup/inc_3 --incremental=backup/inc2/backup_manifest -c fast -P
  4045/888986 kB (100%), 1/1 テーブル空間
real    0m4.391s
$ time pg_basebackup -D backup/full_3 -c fast -P
888986/888986 kB (100%), 1/1 テーブル空間
real    0m32.777s</pre>
<h2>pg_combinebackup のオプション</h2>
<p>pg_combinebackup には統合のファイルコピーを高速化するオプションが用意されています。</p>
<p><strong>ファイルコピーを高速化するオプション</strong></p>
<table width="1441">
<tbody>
<tr>
<td width="273"><b>オプション</b></td>
<td width="395"><b>説明</b></td>
<td width="413"><b>環境</b></td>
<td width="360"><b>メリット</b></td>
</tr>
<tr>
<td width="273">-​-copy</td>
<td width="395">ファイルをコピー<br />
[デフォルト]</td>
<td width="413"></td>
<td width="360"></td>
</tr>
<tr>
<td width="273">-​-copy-file-range</td>
<td width="395">copy_file_rangeを利用したファイル部分コピー</td>
<td width="413">FreeBSDか<br />
カーネル4.5+の Linux</td>
<td width="360">カーネル空間で<br />
完結するため高速</td>
</tr>
<tr>
<td width="273">-​-clone</td>
<td width="395">Reflink機能での<br />
ファイルクローンコピー</td>
<td width="413">カーネル 4.5+の Linux の<br />
Btrfs、Reflinkが有効なXFS<br />
macOS の APFS</td>
<td width="360">Inodeとブロックマップコピーのみのため高速</td>
</tr>
<tr>
<td width="273">-k, -​-link(v18で追加)</td>
<td width="395">ハードリンクを作成する<br />
コピー</td>
<td width="413"></td>
<td width="360">リンク作成のみのため<br />
高速</td>
</tr>
</tbody>
</table>
<p>デフォルトのオプション以外はすべて高速化できるものの、すべて入出力のディレクトリが同じファイルシステムである必要がある点には注意してください。<br />
-​-copy-file-range, -​-clone については実行できる環境に上記表のような制限もあります。</p>
<p><strong>同期のオプション</strong></p>
<table width="1361">
<tbody>
<tr>
<td width="303"><b>オプション</b></td>
<td width="650"><b>バックアップ統合の対象</b></td>
<td width="408"><b>メリット</b></td>
</tr>
<tr>
<td width="303">-​-fsync</td>
<td width="650">バックアップディレクトリ内全ファイル<br />
[デフォルト]</td>
<td width="408">最小限のバックアップで済む</td>
</tr>
<tr>
<td width="303">-​-plain</td>
<td width="650">WALファイルとテーブル空間全体の<br />
シンボリックリンクまで</td>
<td width="408">左記をバックアップに含められる</td>
</tr>
<tr>
<td width="303">-​-syncfs</td>
<td width="650">バックアップディレクトリを含む<br />
ファイルシステム全体</td>
<td width="408">ファイル一つ一つを開かないため統合が早い</td>
</tr>
</tbody>
</table>
<p>同期する範囲を指定できるオプションもあり、<br data-start="202" data-end="205" />同期対象を増やすほどディスクへの書き込みがより確実に行われるようになります。</p>
<p>デフォルトではバックアップ対象のディレクトリのみですが、-​-plain で WAL ファイルとテーブル空間全体のシンボリックリンクまで、-​-syncfs ではバックアップディレクトリを含むファイルシステム全体を同期の対象とできます。</p>
<p>-​-syncfs はファイルを一つ一つ開かず同期をチェックするため同期が素早く完了できるというメリットもあります。</p>
<h2>増分バックアップ使用上の注意点</h2>
<p>注意点は大きく分けて以下の3つです。それぞれ見ていきます。</p>
<ol>
<li>パラメータの管理</li>
<li>フルバックアップ～増分バックアップの保存</li>
<li>ストレージ容量</li>
</ol>
<h3>パラメータの管理</h3>
<p>増分バックアップで管理すべきパラメータは以下です。</p>
<ol>
<li>summarize_wal</li>
<li>wal_level</li>
<li>wal_summary_keep_time</li>
</ol>
<p>summarize_wal は pg_basebackup -​-incremental をする際に参照する wal の情報をまとめたサマリファイルを作成するか否かを制御するパラメータです。</p>
<p>このファイルがない状態で増分バックアップを取得しようとするとエラーとなり取得に失敗してしまいます。<br />
デフォルトでは off となっていますので忘れずに on としてください。</p>
<pre># summarize_wal が off で取得したフルバックアップを対象とするとエラー
$ pg_basebackup --incremental=backup/full/backup_manifest -D backup/inc1
pg_basebackup: エラー: ベースバックアップを開始できませんでした: 
ERROR:  WAL集約が有効でなければ差分バックアップは取得できません</pre>
<p>wal_level についても replica 以上が必要です。<br />
これが replica 以上でないと summarize_wal のパラメータが無効となる仕様となっています。</p>
<p>wal_summary_keep_time はサマリファイルを保存する期間を指定するパラメータです。<br />
例えば以下のように 1d に設定し、2 日後に増分バックアップを取得しようとすると必要なサマリファイルが削除されているため、取得に失敗してしまいます。<br />
そのため、増分バックアップを取得する運用間隔よりも長い期間を設定する必要があります。</p>
<pre># postgresql.conf の wal_summary_keep_time を 1d に設定
wal_summary_keep_time = '1d'

$ ls –l  data/pg_wal/summaries/
-rw-------. 1 postgres postgres 32 11月 1 16:52 0000000100000001CF00002800000001D0000028.summary
# 2 日後に増分バックアップを取得しようとすると失敗
$ date
2025年 11月 3日 月曜日 15:37:55 JST
$ pg_basebackup -D backup/inc_1 --incremental=backup/full/backup_manifest -P -c fast
pg_basebackup: エラー: ベースバックアップを開始できませんでした:
ERROR:  WAL集計がタイムライン1上の1/CD000060から1/CF000028まで必要ですが、そのタイムライン上のそのLSN範囲での集計は不完全です
DETAIL:  この範囲で集計されていない最初のLSNは1/CD000060です</pre>
<h3>フルバックアップ～増分バックアップの保存</h3>
<p>pg_combinebackup をする際に引数フルバックアップ～統合したい世代までのフルバックアップがすべてないと以下エラーとなります。</p>
<pre># 最初の引数にフルバックアップを指定せずに実行
$ pg_combinebackup -o backup/combine_test backup/inc1 backup/inc2
pg_combinebackup: エラー: "backup/inc1"のバックアップは差分バックアップですが、最初のバックアップはフルバックアップである必要があります
# backup/inc_1 を引数に渡さず実行
# LSN 位置に飛びが見られエラーとなる
$ pg_combinebackup -o backup/combine_1 backup/full/ backup/inc_2
pg_combinebackup: エラー: "backup/full/"のバックアップはLSN 1/1A000060で始まっていますが、1/1C000028を期待していました</pre>
<p data-start="68" data-end="234">そのため、実際の運用ではフルバックアップと、最新世代までのすべての増分バックアップを保持しておく必要があります。<br data-start="134" data-end="137" />削除のタイミングとしては、定期的に pg_combinebackup を実行し、統合によって 不要になった過去のフルバックアップおよび増分バックアップを削除するフローになります。</p>
<p data-start="236" data-end="342">また、統合して生成されたバックアップは、次回の pg_combinebackup におけるフルバックアップとして利用可能 であるため、統合元となった古いフルバックアップは削除して問題ありません。</p>
<h3>ストレージ容量</h3>
<p>ストレージコストの低さがメリットの増分バックアップですが、pg_combinebackup をした直後は古いバックアップと統合バックアップが共存する状態になりますので、それらすべてを保存できるストレージサイズを確保する必要があります。</p>
<h1>増分バックアップと<br />
PITR と両立したリストア手順</h1>
<p>増分バックアップ PITR と両立しての増分バックアップを利用することができます。</p>
<p>&nbsp;</p>
<p><img decoding="async" class="alignnone wp-image-19042" src="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/8986e7ebde3bc9e7dd90e1b7e207af06-300x158.png" alt="" width="680" height="358" srcset="https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/8986e7ebde3bc9e7dd90e1b7e207af06-300x158.png 300w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/8986e7ebde3bc9e7dd90e1b7e207af06-1024x540.png 1024w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/8986e7ebde3bc9e7dd90e1b7e207af06-768x405.png 768w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/8986e7ebde3bc9e7dd90e1b7e207af06-1536x810.png 1536w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/8986e7ebde3bc9e7dd90e1b7e207af06-304x160.png 304w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/8986e7ebde3bc9e7dd90e1b7e207af06-282x149.png 282w, https://www.sraoss.co.jp/tech-blog/wp-content/uploads/2025/12/8986e7ebde3bc9e7dd90e1b7e207af06.png 1859w" sizes="(max-width: 680px) 100vw, 680px" /></p>
<p>PITR(Point In Time Recovery) は WAL アーカイブをもとにして任意の時点までのリストアを可能にするリストア方法です。</p>
<p>WAL アーカイブはデータの変更履歴が記載されたもので、事前に取得しておいたフルバックアップに WAL アーカイブの変更履歴を任意の時点まで適用することで任意の時点に復旧できることが強みのリストア方法です。</p>
<p>この PITR と増分バックアップと両立することで以下メリットが得られます。</p>
<ol>
<li>増分バックアップによるバックアップ取得でストレージコストや取得時間を短く抑えられる</li>
<li>PITR によるリストアでより任意の時点に復旧することができる</li>
</ol>
<p>今回はこれらを両立する設計で具体的な設定手順を紹介します。</p>
<p>まずパラメータの設定を行います。</p>
<pre>#wal をアーカイブする設定
#%p は保管するWALファイルの相対パス, %f がWALのファイル名に置き換わる
archive_mode = on
archive_command = 'cp "%p" "/pg_arc/%f"'
#restore を行う設定
restore_command = 'cp "/pg_arc/%f" "%p"'</pre>
<p>その後増分バックアップ取得を行います。<br />
フルバックアップ、増分バックアップ取得、バックアップの統合、検証の手順で取得します。</p>
<pre># フルバックアップ～バックアップの取得・統合、検証まで実施
$ pg_basebackup  -D backup/full
$ pg_basebackup --incremental=backup/full/backup_manifest -D backup/inc1
$ pg_combinebackup -o backup/combine_full_inc1 backup/full/ backup/inc1
$ pg_verifybackup backup/combine_full_inc1</pre>
<p>その後 mv コマンドで疑似的にデータベースのデータが消えてしまった状態を作ります。</p>
<p>そして統合したバックアップを元のデータディレクトリに mv で移動し、recovery.signal を作成して起動すると PITR のリカバリモードで起動します。<br />
リカバリ終了後に状態を見に行くとデータが指定した時点に復旧していることが分かります。</p>
<pre># データを移動して障害を疑似的に起こす
$ mv data data_crash
# 統合したバックアップを元ディレクトリにコピー
$ cp –r databackup/combine_full_inc1 data
# リカバリモードで起動するよう指示するrecovery.signal を作成して起動
$ touch data/recovery.signal
# 必要に応じて postgresql.conf を設定し復旧タイミングを指定
recovery_target_time = '2025-10-20 14:05:00'
$ pg_ctl start
# ログに以下が出力されていれば復旧完了
LOG: starting archive recovery
LOG: archive recovery complete</pre>
<h1>まとめ</h1>
<p>今回は PostgreSQL 17 で追加された増分バックアップの運用方法と注意点について紹介しました。</p>
<p>PostgreSQL18ではさらに機能が追加されたりと今後より便利になっていく注目の手法です。<br />
紹介した手順を参考に増分バックアップの利用を検討いただけると幸いです。</p>
<div>
<a href="https://www.sraoss.co.jp/prod_serv/support/pgsql-mainte/?utm_source=sraoss-techblog&utm_medium=referral&utm_campaign=under-article-pgsql" rel="noopener" style="color:initial;" target="_blank" class="no-ext"></p>
<div style="background-color:#DAEFF6; padding:20px; border-radius:8px; text-align:center;">
SRA OSSでは、PostgreSQL/Pgpool-II のサポートを提供しております。<br />
詳しくは<strong style="color:#2581c4;">弊社ホームページ</strong>をご覧ください。
</div>
<p></a>
</div>

]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
