You are on page 1of 4

特2-4 標準ツール 03.10.

2 19:51 ページ90

04
pter の
Cha
SQ L せ
tgre い 倒
Pos を 使
ー ル tore,
ツ _res
付属 pg_dump,db の Tips 集
pg

psq
l, acuum
v
データベースへ接続
はじめに
データベースに接続するには,サーバ名(またはIP
本章ではPostgreSQL の付属ツールについて解説し アドレス),ポート番号,接続ユーザ名,データベー
ます.ツールの全機能を1 つひとつ解説するには誌面 ス名を指定します(図1)
.デフォルト値をそのまま使
が足りませんので,ここでは開発現場ですぐに使える うときは省略可能です.たとえば図1 の例ではポート
Tips を列挙し解説することにします. 番号5432を-pオプションで指定していますが,これは
デフォルト値ですのでほとんどの場合において省略で
psql きます.オプション省略時のデフォルト値は環境変数
∼対話型クライアント∼ の設定によっても変わってきます.psql --help でコマ
psql はPostgreSQL の端末型フロントエンド(クラ ンドオプションの解説と現在のデフォルト値が表示さ
イアント)で,データベースに接続して対話的に処理 れますので,それを参考にしてください.
を行うときに使用するツールです.システム開発時は データベースに接続されると入力プロンプトが表示
CREATE文によるスキーマ作成やシステムで使用する されますが(本特集ではweb_db=#)
,PostgreSQL の
クエリの実行確認などで使用し,システム運用時は保 設定(pg_hba.conf)によっては,パスワードの入力
守管理によく使用されます. が求められたり,接続が拒否されたりすることがあり
ます.クライアント側に問題がないと思われるときは,
サーバ側の設定を確認してください.

図 1 データベースへ接続 SQL の実行


% psql -h 192.168.0.10 -p 5432 -U postgres -d web_db
Welcome to psql 7.3.2, the PostgreSQL interactive terminal.
... psql ではSQL を使った対話的な処理が実行できま

図 2 SQL の実行 す.文の終わりにはセミコロン“;”を入れます(図2)



web_db=# SELECT version(); SQL 文を1 回しか実行しないようなときは,psql コ
version
------------------------------------------------------------- マンドの-cオプションを使うと便利です(図3)

PostgreSQL 7.3.2 on i686-pc-linux-gnu, compiled by GCC 2.96
(1 row)
ヘルプの表示
図 3 SQL を 1 回しか実行しない
% psql -U postgres -d web_db -c "SELECT version()"
psql では,\?,\h といったメタコマンドでヘルプ

90● WEB +DB PRESS Vol.15


特2-4 標準ツール 03.10.2 19:51 ページ91

PostgreSQL の付属ツールを使い倒せ
psql,pg_dump,pg_restore,vacuumdb の Tips 集 04
を表示することができます.メタコマンドとはバック 図 4 SQL コマンドについての詳しいヘルプを表示
web_db=# \h SELECT
スラッシュ(または円記号)で始まる特別なコマンド Command: SELECT
Description: retrieve rows from a table or view
のことで,開発や管理に役に立つ便利なコマンドを簡 Syntax:
SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
単に呼び出せるようになっています.メタコマンドの
...
一覧は,\?で表示できます.\h では,SQL コマンド
図 5 外部コマンドの実行
の一覧を表示できます.\h の後にSQL コマンドを指 web_db=# \! ls
output.dat test.sql
定することで,そのSQLコマンドに関する詳しいヘル
図 6 ファイルから SQL を実行
プを表示することができます(図4)

web_db=# \! cat test.sql
SELECT version()
外部コマンドの実行 web_db=# \i test.sql
version
-------------------------------------------------------------
psql のプロンプト上からOS の外部コマンドを実行 PostgreSQL 7.3.2 on i686-pc-linux-gnu, compiled by GCC 2.96
(1 row)
するには,\!メタコマンドを使います(図5)

図 7 実行結果をファイルに出力
web_db=# \o output.dat
ファイル入出力 web_db=# select version();
web_db=# \o
SQLをテキストファイルに書いておき,\iメタコマ web_db=# \! cat output.dat
version
ンドを使って読み込んで実行することができます(図 -------------------------------------------------------------
PostgreSQL 7.3.2 on i686-pc-linux-gnu, compiled by GCC 2.96
6)
. (1 row)

実行したいSQL が非常に長い場合や,時間をおい 図 8 データベース一覧表示

て同じSQLを何回も実行する場合などは便利です. web_db=# \l
List of databases
実行結果をファイルに出力するには\o メタコマン Name | Owner | Encoding
-----------+----------+----------
ドを使います.\o の後に出力したいファイル名を指 template0 | postgres | EUC_JP
template1 | postgres | EUC_JP
定すると,SQLの実行結果がそのファイルに出力され web_db | postgres | EUC_JP
(3 rows)
ます.\o だけを実行すると実行結果出力先が標準出
力(デフォルト)にリセットされますので,ファイル SELECT文を駆使すれば取得できますが,メタコマン
出力が済んだら\oだけを実行するとよいでしょう(図 ドを使えばもっと簡単に取得できます.一覧取得用と
7)
. して,データベースオブジェクトごとに以下のような
なお,\oで指定されたファイルは上書きされてしま メタコマンドが用意されています.
いますので気をつけてください.
¡\di :インデックス一覧表示
データベース一覧表示 ¡\ds :シーケンス一覧表示
¡\dt :テーブル一覧表示
psql コマンドで-l オプションを付けると,データベ
¡\dv :ビュー一覧表示
ース一覧を表示して終了します.psql ですでにデータ
¡\dS :システムテーブル一覧表示
ベースに接続しているときは,\l メタコマンドを実行
¡\du :ユーザ一覧表示
すると同じ出力が得られます(図8)

¡\df :ファンクション一覧表示
データベースオブジェクトの
¡\dT :型一覧表示
情報表示
\d系メタコマンドを使うことでデータベースオブジ テーブル,ビュー,インデックス,シーケンスにつ
ェクトに関する情報を簡単に取得できます.これらの いては,\d メタコマンドを使って詳細が表示できま
情報はPostgreSQL の内部で管理されているテーブル す.図9 はitem テーブルの詳細を表示した例です.
群(システムカタログ)に格納されていますので 単に\dと入力したときは\dtvsが実行されたものと

WEB +DB PRESS Vol.15 ●91


特2-4 標準ツール 03.10.2 19:51 ページ92

みなされ,テーブル,ビュー,シーケンスの一覧が表 % pg_dump web_db > web_db.dat

示されます.

テーブル⇔ファイル間の 引数には出力したいデータベース名を指定します.
データコピー デフォルトの出力先は標準出力ですので,ファイルと
\copy メタコマンドでは,テーブルとファイル間で して保存したいときはこの例のようにリダイレクト“>”
データをコピーできます.図10は,itemテーブルのデ を使って出力先をファイルに切り替える必要がありま
ータをitem.datファイルに出力します. す(-fオプションで指定する方法もあります)

このとき,item.datファイルはクライアント側(psql この方法でバックアップされたデータをリストア(シ
を実行したディレクトリ)に作成されるので注意して ステムの復元)するにはpsql コマンドを使います.
ください.出力ファイルのフォーマットは1行1レコー
% psql -d web_db -f web_db.dat
ドとなっています.カラムの区切り(デリミタ)は,
デフォルトではタブコードになっています.変更した pg_dumpはコマンド実行時のデータベースを再構築
いときはusing delimiters 句でデリミタ文字を指定し するようなSQL コマンドをプレーンテキストファイル
ます.たとえばデリミタ文字をカンマにしたいときは として出力しますので,psql コマンドの-f オプション
図11 のようになります. で保存ファイルを指定すれば簡単にリストアが行えま
逆にファイルからテーブルへデータを読み込みたい す.
ときはtoではなくfrom句を使います(図12)
.このと
圧縮しながらバックアップ
き,テーブルは事前に作成しておく必要があります.
pg_dumpの出力はプレーンテキストですので,圧縮
pg_dump & pg_restore することでファイル容量を大幅に小さくすることがで
∼バックアップとリストア∼ きます.
pg_dumpは,PostgreSQLデータベースをSQLスク
% pg_dump web_db | gzip > web_db.dat.gz
リプトファイルとして保存するためのツールです.バ
ックアップ用コマンドとしてよく利用されます. 圧縮済みファイルとして保存するのであれば,この
例のようにpg_dumpとgzipコマンドをパイプ“|”で
ノーマルなバックアップとリストア
繋げて実行するとよいでしょう.
pg_dumpはデータベースをSQLスクリプトとして出 この圧縮済みファイルをリストアするには,gzip と
力します. psql コマンドをパイプで繋げて実行します.

図 9 テーブル詳細表示 % gzip -dc web_db.dat.gz | psql -d web_db


web_db=# \d item
Table "item"
Column | Type | Modifiers
ラージオブジェクトを含む
-----------+---------+----------- バックアップとリストア
item_id | integer | not null
name | text | 画像データなどの巨大なデータの保存にラージオブ
itemgroup | text |
price | integer | ジェクト(巨大なデータを格納するための型)を使う
Primary key: item_pkey
ことがよくありますが,先述のpg_dump の使い方で
図 10 テーブルのデータをファイルにコピー
はラージオブジェクトのデータは出力されません.
web_db=# \copy item to item.dat
ラージオブジェクトも含めて保存したいときは-F オ
図 11 デリミタ文字にカンマ“,”を指定
web_db=# \copy item to item.dat using delimiters ',' プションを使います.
図 12 ファイルのデータをテーブルにコピー
web_db=# \copy item from item.dat

92● WEB +DB PRESS Vol.15


特2-4 標準ツール 03.10.2 19:51 ページ93

PostgreSQL の付属ツールを使い倒せ
psql,pg_dump,pg_restore,vacuumdb の Tips 集 04
¡tar アーカイブ ADD CONSTRAINT orderdata_pkey

% pg_dump -Ft -b web_db > web_db.tar PRIMARY KEY (order_id);

¡カスタムアーカイブ

% pg_dump -Fc -b web_db > web_db.dat とはいえ,表現の仕方が異なるというだけで意味と


しては同じですのでご安心ください.
-Ft はtar アーカイブでの出力で,SQL スクリプトと
その他の用途
ラージオブジェクトをtar形式で結合したデータが出力
されます.-Fcはカスタムアーカイブでの出力で,SQL pg_dumpの出力はSQLコマンドの羅列ですので,フ
スクリプトとラージオブジェクトを結合したものに圧 ァイルに保存した後で任意のテキストエディタで編集
縮をかけたデータが出力されます. したり,Perl などでちょっとしたスクリプトを作成し
これらのデータのリストアには,pg_restore を使用 てフィルタをかけて加工する,といったことが簡単に
します. 行えます.そのため,PostgreSQL 以外の他のデータ
ベースに移行するときでも,pg_dump の出力が利用
¡tar アーカイブ
できます.
% pg_restore -d web_db web_db.tar

¡カスタムアーカイブ vacuumdb
% pg_restore -d web_db web_db.dat ∼運用段階での定期バキュームに∼
pg_restore では-d オプションでリストア先データベ vacuumdb はVACUUM コマンドのシェルスクリプ
ース名を指定し,末尾でバックアップファイル名を指 トラッパです.ソースコードを見てみるとわかります
定します. がvacuumdb はシェルスクリプトとなっていて,psql
を使ってVACUUM コマンドを実行しています.運用
スキーマだけを抽出
段階でVACUUM コマンドを定期的に実行する必要が
pg_dumpの-sオプションで,スキーマ(定義)だけ あるときはvacuumdbを使うとよいでしょう.
を抽出することができます. vacuumdb を定期的に実行するにはOS が提供して
いる機能を使うとよいでしょう.Linux などのUNIX
% pg_dump -s web_db > web_db.sql
系 OS ではcron を使います(cygwin でも使えます).
抽出したファイルを使ってスキーマを構築するには, たとえば午前5 時に全データベースに対しVACUUM
リストア時と同様psql を使います. を実行するには,下記エントリをcron に追加します.

% psql -d web_db -f web_db.sql 00 05 * * * /usr/local/pgsql/bin/vacuumdb

-sオプションで抽出したスキーマ定義はCREATE文
などの羅列になっていますが,ユーザがスキーマ作成 まとめ
時に入力したCREATE文とまったく同じになっている
というわけではありません.たとえば,本特集で使用 この章ではPostgreSQL の付属ツールでよく利用さ
したスキーマ(第1章リスト1)ではCREATE TABLE れるものについて解説しました.これらのツールの熟
文内でPRIMARY KEY設定を行っていますが,-sオプ 練度によっても開発作業の進み具合が大幅に変わって
ションでの出力では下記のとおりALTER TABLE文で きますので,付属マニュアルなども参考にして的確な
追加する形になっています. 使い方が素早くできるようにしておきましょう.#

ALTER TABLE ONLY orderdata

WEB +DB PRESS Vol.15 ●93

You might also like