5.4 データベースのバックアップ

以下を確認します。

  • pg_dump/pg_restoreコマンド
  • \copyメタコマンド/COPY文

pg_dump/pg_restoreコマンド

ossdbデータベースをpg_dumpコマンドの2種類の方法でダンプして、それぞれ別のデータベースにリストアします。

[postgres@host1 ~]$ pg_dump ossdb > ossdb1.sql ※平文形式でのダンプ
[postgres@host1 ~]$ cat ossdb1.sql
--
-- PostgreSQL database dump
--

-- Dumped from database version 13.14
-- Dumped by pg_dump version 13.14

SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;

※中略

--
-- PostgreSQL database dump complete
--

[postgres@host1 ~]$ createdb ossdb1 ※リストア先のデータベース作成
[postgres@host1 ~]$ psql -d ossdb1 -f ossdb1.sql ※平文形式でのリストア
SET
SET
SET
SET
SET
 set_config
------------

(1 行)

SET
SET
SET
SET
SET
SET
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
COPY 6
COPY 5
COPY 4
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
[postgres@host1 ~]$ psql ossdb1
psql (13.14)
"help"でヘルプを表示します。

ossdb1=# \d
             リレーション一覧
 スキーマ |   名前   |  タイプ  |  所有者
----------+----------+----------+----------
 public   | customer | テーブル | postgres
 public   | orders   | テーブル | postgres
 public   | prod     | テーブル | postgres
(3 行)

ossdb1=# \q
[postgres@host1 ~]$ pg_dump -Fc ossdb > ossdb2.dump ※アーカイブ形式でのダンプ
[postgres@host1 ~]$ createdb ossdb2 ※リストア先のデータベース作成
[postgres@host1 ~]$ pg_restore -d ossdb2 ossdb2.dump ※アーカイブ形式でのリストア
[postgres@host1 ~]$ psql ossdb2
psql (13.14)
"help"でヘルプを表示します。

ossdb2=# \d
             リレーション一覧
 スキーマ |   名前   |  タイプ  |  所有者
----------+----------+----------+----------
 public   | customer | テーブル | postgres
 public   | orders   | テーブル | postgres
 public   | prod     | テーブル | postgres
(3 行)

ossdb2=# \q
[postgres@host1 ~]$

最初に、pg_dumpコマンドでossdbデータベースのダンプをossdb1.sqlファイルに平文形式で取得しています。 ossdb1.sqlはSQLのスクリプトになっているため、psqlコマンドでリストアできます。
次に、ossdbのダンプをossdb2.dumplファイルにアーカイブ形式で取得しています。 ossdb2.dumpはpg_restoreコマンドで別のデータベースにリストアしています。

\copyメタコマンド/COPY文

\copyメタコマンドとCOPY文を使ってprod表のコピーを行います。SQLからファイルへのアクセスができるようにするため、最初にSELinuxの設定を一時的にPermissiveに変更しておきます。

[admin@host1 ~]$ sudo setenforce 0 ※adminユーザによるSELinuxの設定変更
[sudo] admin のパスワード:
[admin@host1 ~]$ getenforce
Permissive
[admin@host1 ~]$ sudo -iu postgres ※postgresユーザでログイン
[postgres@host1 ~]$ psql ossdb
psql (13.14)
"help"でヘルプを表示します。

ossdb=# \copy prod to 'data1.txt' ※text形式のファイルに出力
COPY 4
ossdb=# \! cat data1.txt
3       メロン  100
4       バナナ  30
2       りんご  72
1       みかん  52
ossdb=# CREATE TABLE prod2 (prod_id INTEGER, prod_name text, price INTEGER); ※コピー先の表を作成
CREATE TABLE
ossdb=# \copy prod2 from data1.txt with (delimiter E'\t')
COPY 4
ossdb=# SELECT * FROM prod2;
 prod_id | prod_name | price
---------+-----------+-------
       3 | メロン    |   100
       4 | バナナ    |    30
       2 | りんご    |    72
       1 | みかん    |    52
(4 行)

ossdb=# COPY prod TO '/home/postgres/data2.csv' WITH (FORMAT csv, HEADER true); ※CSV形式のファイルに出力
COPY 4
ossdb=# \! cat data2.csv
prod_id,prod_name,price
3,メロン,100
4,バナナ,30
2,りんご,72
1,みかん,52
ossdb=# COPY prod2 FROM '/home/postgres/data2.csv' WITH (FORMAT csv, HEADER true);
COPY 4
ossdb=# SELECT * FROM prod2;
 prod_id | prod_name | price
---------+-----------+-------
       3 | メロン    |   100
       4 | バナナ    |    30
       2 | りんご    |    72
       1 | みかん    |    52
       3 | メロン    |   100
       4 | バナナ    |    30
       2 | りんご    |    72
       1 | みかん    |    52
(8 行)

ossdb=#

postgresユーザでossdbデータベースに接続後、\copyコマンドでprod表の内容をdata1.txtファイルに出力しています。data1.txtは、タブ区切りのテキストファイルになっていることを確認後、その内容をprod2表にコピーしています。
次に、COPY文でprod表の内容をFORMATオプション付きでdata2.csvファイルに出力しています。data2.csvは、ヘッダ付きカンマ区切りのCSVファイルになっていることを確認後、その内容をprod2表にコピーしています。なお、表へのコピーは追加になっていることも確認できます。