PostgreSQL for Solaris

目次

PostgreSQLはOracleの活躍の裏側で着々と人気を集めているRDBMSです。この初期設定から基本的な運用方法を説明します。

データベース初期設定
テーブル
シーケンス
インポートとエクスポート
バックアップとリカバリ
戻る

データベース初期設定

<環境変数>
インストール作業がすめばpostgresユーザーの環境変数をセットしてください。インストール方法はメインページのインストールログを参考にして下さい。

csh tcshの場合

$ setenv LD_LIBRARY_PATH /usr/local/pgsql/lib
$ set path=( $path /usr/local/pgsql/bin )
$ setenv
MANPATH /usr/local/pgsql/man

bash kshの場合

$ LD_LIBRARY_PATH=/usr/local/pgsql/lib
$ export LD_LIBRARY_PATH
$ PATH=$PATH: /usr/local/pgsql/bin
$ MANPATH=$MANPATH: /usr/local/pgsql/man
$ export PATH MANPATH

これらの環境変数のセットは.cshrc(.bashrc)やprofileに記述しておきましょう。

<初期化>
ユーザーpostgresとしてログインして次の様なコマンドを実行します。

$ initdb -D /usr/local/pgsql/data

Dオプションはデータが格納されている位置です。この位置はPGDATA環境変数でも設定できます。PGDATAを設定している場合は-Dオプションは必要ありません。
ここで"ld.so.1: /usr/local/pgsql/bin/pg_encoding: fatal: libgcc_s.so.1: open failed: No such file or directory"というエラーが出た場合はgccのライブラリパスが通っていない可能性があります。gccのライブラリは/usr/local/libに格納されていますので、LD_LIBRARY_PATHを/usr/local/libにセットしてからもう一度initdbコマンドを実行してみてください。ちなみに僕の場合は libgcc_s.so.1しか必要としていないと思われたので次の様にリンクをはりました。

$ su
# ln -s /usr/local/lib/libgcc_s.so.1 /usr/local/pgsql/lib/libgcc_s.so.1

data作成に成功すれば次に出力のとうりにpostmasterを起動します。このコマンドで/tmp/pgsql.logにデバック情報をリダイレクトされています。

$ /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start

フォアグラグランドで実行する場合は次の様になります。

$ /usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data

この処理はプロンプトにアクセスできなくなりますので、本稼働の時はバックグラウンドで実行する様にpg_ctlを使って下さい。pg_ctlはPostgresサーバーの開始と終了に大変便利なコマンドです。

<データベースの作成>
Postgresサーバーが稼働したのならば新しいデータベースを作成してみましょう。

# createdb testdb

testdbへのアクセスは次の様に行います。

# psql testdb
testdb=# SELECT * FROM pg_language;

テーブル

ここではtestdbをそのまま使用していきます。testdbを作成すればテーブルを作ります。尚、SQLの概要や仕組み等はその他のサイトや書籍を参考にして下さい。

<テーブルの作成>

testdb=# CREATE TABLE books (
testdb(# id integer UNIQUE,
testdb(# title text NOT NULL,
testdb(# author_id integer,
testdb(# subject_id integer,
testdb(# CONSTRAINT books_id_pkey PRIMARY KEY (id));
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index 'books_id_pkey' for table 'books'
CREATE

<テーブルの確認>
データベースにあるテーブルを表示する場合は次の様に実行して下さい。今回はtestdbのbooksを作成したのでそれを見てみましょう。

testdb=# \d books
List of relations

Name | Type | Owner
------------ +--------- +-----------
books | table | postgres

テーブルの情報を表示する場合は次の様に実行して下さい。先ほど作成したbooksテーブルの内容を表示してみましょう。

testdb=# \d books
Table "books"

Column | Type | Modifiers
------------ +--------- +-----------
id | integer | not null
title | text | not null
auther_id | integer |
subject_id | integer |

<テーブルの編集>
テーブル名の変更はALTER TABLEを使います。

testdb=# ALTER TABLE books
testdb-# RENAME TO newbooks ;

列名の変更は次の様に行って下さい。元の列名と変更後の列名をTOで区切ります。

testdb=# ALTER TABLE books
testdb-# RENAME title TO title1 ;

所有権の変更は次の様に行って下さい。

testdb=# ALTER TABLE books
testdb-# OWNER TO newuser;

データの入力はINSERTを使います。

testdb=# INSERT INTO books (id, title, author_id, subject_id)
testdb=# VALUES (10001, 'Running System V vol 12mon', 1000, 1);

行データの修正は次の様に行って下さい。

testdb=# UPDATE books
testdb=# SET title = 'Running System V vol 12mon'
testdb=# WHERE id = 10001;

SET句にカンマで区切って複数の式を記述する事によって1つの表内にある複数の列を1文で更新する事ができます。

testdb=# UPDATE books
testdb=# SET title = 'Running System V vol 12mon' ,auther_id = 2000
testdb=# WHERE id = 10001;

テーブルの削除は次の様に行って下さい。

testdb=# DROP TABLE books;

シーケンス

シーケンスはシリアル型でよく使われています。下の例は整数列、nextval()関数、そしてシーケンスを使ったシリアルデータ型のテーブル作成方法です。

testdb=# CREATE SEQUENCE auto_identified_id_seq;
testdb=# CREATE TABLE auto_identified
testdb=# (id integer UNIQUE DEFAULT nextval('auto_identified_id_seq'));

上記をみてもわかるようにシーケンスはCREATE SEQUENCEで作成します。シーケンスは増加または減少するように指定できます。CREATE SEQUENCEの構文を以下に示します。

CREATE SEQUENCE sequencename
[ INCREMENT increment ]
[ MINVALUE minvalue]
[ MAXVALUE maxvalue ]
[ START start]
[ CACHE cache]
[ CYCLE ]

この構文において、sequencenameは作成するシーケンスの名前です。必須なパラメータはこれだけです。シーケンスは必ず整数データ型を使用するので最大値と最小値は整数型と同じで+2147483647と-2147483647です。

インポートとエクスポート

データベースを構築するにあたりリソースの準備が必要です。データを格納してはじめてデータベースとして機能するわけですから。ここではUNIXプラットフォーム上でのインポートとエクスポートを紹介していきます。尚バックアップについては後で説明しますので目次よりデータベースのバックアップを参考にしてください。

<インポート>
外部ファイルからテーブルに値をインポートするにはCOPYコマンドと使います。COPYでインポートするために使用するファイル形式はフィールドを同一の記号で区切った標準ASCIIテキストかPostgresのバイナリ形式でなければいけません。ファイル内の各行を行データとし、同一データで区切られたフィールドを列の値として処理します。

testdb=# COPY books FROM '/usr/local/pgsql/datafile' ;

上の例は/usr/local/pgsql/datafileをインポートしている事になります。もちろんdatafileは[TAB]で区切られたフィールドを持ち、テーブルbooksの規定に従ったファイルでなけらばなりません。カンマで区切られたCSVファイルからのインポートは次の様に処理します。

testdb=# COPY books FROM '/usr/local/pgsql/datafile' USING DELIMITERS ',' ;

<エクスポート>
データを外部ファイルへエクスポートする場合にもCOPYコマンドは有効です。COPYでエクスポートするために使用するファイル形式はフィールドを同一の記号で区切られた標準ASCIIテキストかPostgresのバイナリ形式です。これはインポートと同様で行データとして処理します。

testdb=# COPY books TO '/usr/local/pgsql/datafile' USING DELIMITERS ',' ;

尚、データベース及び、テーブルのバックアップはエクスポートとは別です。バックアップリカバリについてはpg_dumpコマンドを使います。これについての説明は以降を参考にして下さい。

バックアップとリカバリ

<バックアップ>
Postgresにはバックアップコマンドpg_dumpが用意されています。これはPostgres データベースの内容をスクリプトファイルかアーカイブファイルへ抽出します。

データベースをダンプには次の様に実行します。pg_dumpはシェルから実行して下さい。

$ pg_dump mydb > db.out

もし仮に、SQL文のバックアップスクリプトでバックアップを保存する場合は以下の様に-dオプションを付けます。しかしこれはリカバリ時にとても処理時間を要するので注意してください。尚テーブル単位でバックアップを取る場合に-tオプションよりテーブル名を指定する事もできます。

$ pg_dump -d mydb > db.sql

これによりリカバリに必要なdb.sqlファイルにSQL分が吐き出されます。mydb と呼ばれる BLOB を含むデータベースを tar ファイルにダンプするには下記のようにします。

$ pg_dump -Ft -b mydb > db.tar

Postgresにはバックアップコマンドのpg_dumpの他にpg_dumpallがあります、これはクラスタの全ての Postgres データベースを一つのスクリプトファイルに書き出すときに用います。pg_dumpall は更に、全てのデータベースに 共通するグローバルオブジェクトもダンプします。全てのデータベースを書出す場合、以下のようにします。

$ pg_dumpall > db.out

<リストア>
データベースをリストアする場合はpsql又はpg_restoreを使用します。

$ psql mydb < db.out

SQL文のバックアップスクリプトよりリストアする場合は以下の様に-fオプションを指定します。

$ psql -d database -f db.sql

スキーマを復元しない場合は以下の様に実行してください。ユーザーが事なるデータベースにリストアする場合にとても有効です。

$ psql -a -d database -f db.sql

データベース(BLOBを含むもの)を既存の newdb と呼ばれるデータベースにリストアする場合は次の様に実行します。リストアにはtarから行うことが条件になっている様ですので、ダンプファイルはtarにしておいてください。

$ pg_restore -d newdb db.tar

pg_dumpallでバックアップを取ったデータベースを読み込む場合、以下のようにします。

$ psql -f db.out 

 


<戻る>