第5章の動作確認
完了要件
クライアントアプリケーションと関連するSQL文の動作を確認します。
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表にコピーしています。なお、表へのコピーは追加になっていることも確認できます。