パーティションテーブルのバックアップ・リストア2023/03/26に公開・約6,100字ツイートPostgreSQLtech概要DB全体ではなくパーティションテーブル単体をバックアップ・リストアする方法パーティションテーブルをpg_dumpするにはコマンドオプションの指定に要注意パーティションテーブルとは公式よりパーティショニングとは、論理的には一つの大きなテーブルであるものを、物理的により小さな部品に分割することを指します。パーティショニングによって得られる利点は以下のようにいくつかあります。特定の条件下で問い合わせのパフォーマンスが劇的に向上することがあります。テーブル内のアクセスが集中する行の殆どが単一または少数のパーティションに存在している場合がそうです。パーティショニングは実質的にインデックスの上位木レベルの代わりになり、インデックスの頻繁に使われる部分がメモリに収まりやすくなるようにします。問い合わせや更新が一つのパーティションの大部分にアクセスする場合、インデックス使用してテーブル全体にまたがるランダムアクセス読み取りをする代わりに、そのパーティションへの順次アクセスをすることでパフォーマンスを向上させることができます。一括挿入や削除について、その使い方のパターンをパーティションの設計に組み込んでいれば、それをパーティションの追加や削除で実現することが可能です。PARTITIONを実行することにより、一括の操作をするよりも遥かに高速です。これらのコマンドはまた、一括のDELETEで引き起こされるVACUUMのオーバーヘッドを完全に回避できます。滅多に使用されないデータを安価で低速なストレージメディアに移行することができます。https://www.postgresql.jp/document/14/html/ddl-partitioning.html事前準備デモリポジトリ以降はこちらのリポジトリの実装を元に解説します。https://github.com/i-zacky/psql-partition-table-demo前提条件リポジトリの実装を動かすにあたって必要なツール等は以下の通り。v16.xツールのインストール手順やDockerコンテナの起動方法等については割愛する。今回バックアップ対象のテーブルとして以下のような入金テーブルを作成する。)を範囲パーティションを使って分割している点。簡単なNodeスクリプトを実装してあるので、それを使ってCSV形式のデータを生成する。第1引数にランダム生成する入金日の年を指定し、第2引数に生成するCSVのレコード数を指定する。以下の例では2021年1月1日から2021年12月31日の期間で入金日をランダムに生成し、CSVを100万行生成する。サンプルリポジトリのルートディレクトリをボリュームマウントしてあるので、前項で生成したCSVファイルを参照してCOPYコマンドを実行する。テーブルのバックアップを取得する。ポイントとしては2つ。--file=/usr/share/app/dump_source-db.tar.gzpg_restoreによるリストアpg_restoreコマンドを使い、前項で取得したバックアップファイルからリストア先DB(dest-db)へのリストアを行う。INTOモードでベンチマークを取ろうと思ったけど面倒くさくてやめた。今回のデモのようにCOPYモードであれば圧倒的に速いことは違いない。本題pg_dumpによるバックアップpg_restoreによるリストア補足おわりにZennエンジニアのための情報共有コミュニティAboutZennについて運営会社お知らせ・リリースGuides使い方Publicationよくある質問LinksTwitterGitHubメディアキットLegal利用規約プライバシーポリシ。