●インストール(rpm)
RPMバイナリをインストールします。
●インストール(tar)
RPMパッケージの削除
PostgresSQLのRPMパッケージがインストールされているか確認します。
postgresユーザの作成
PostgresSQLサーバのユーザにpostgresを作成します。PostgreSQLはrootで起動できないため、PostgreSQLを利用するユーザとしてpostgresを作成します。
PostgreSQLのダウンロード
以下のページより、最新版をダウンロードします。
http://www.postgresql.org/
または
ftp://ftp.postgresql.org/pub/
今回は、postgresql-8.3.7.tar.gzをダウンロードし、/usr/local/srcに保存しました。
PostgreSQLのインストール
環境変数の設定
postgresユーザの .bash_profileを編集します。
では、次にデータベースを初期化します。
PostgreSQLを使用できる状態にするには、一度データベースクラスタを初期化する必要があります。データベースクラスタとは、複数のデータベースを格納する領域です。データベースクラスタを初期化するには、postgresユーザでinitdbコマンドを実行します。
PostgreSQLでは、initdbコマンドを実行したユーザがスーパーユーザーになります。また、データベースクラスタはPGDATA変数で指定したディレクトリに作成されます。
--no-localeは、ロケールを使用しないことを設定するオプションです。ロケールとは、言語や文化に応じた処理をするOSの機構です。
PostgreSQLでは、このロケールを主にデータのソート処理に使用しますが、英語や日本語のデータを扱う場合には特に必要ありません。反対にロケールを設定すると、ロケール処理の分、ソート処理などが遅くなりますので、注意してください。
PostgreSQLの起動
postgresユーザで起動します。
停止する場合は以下のようにします。
強制停止1
全てのトランザクションをロールバックさせて、セッションは強制切断してデータベースを停止させる。
全てのトランザクション、セッションを強制的に切断してデータベースを停止させる。強制停止させられたトランザクションは、時間の起動の際リカバリーとしてロールバックされる。
他のホストからの接続
自動起動スクリプトの作成
ルート権限で、/etc/rc.d/init.d/postgresqlというファイルを作成します。
●初期設定
インストール及びPostgreSQL用ユーザの作成が完了したら、PostgreSQLを初期化します。
pg_ctl -o "-p 5432" -D /usr/local/pgsql/data -w start
$ ps -ef | grep postgres
/usr/bin/postgres -p 5432 -D (postgresユーザのホームディレクトリ)/data
PostgreSQLがシステム起動時に、自動起動するようにします。
●テストデータベース作成
postgresでログインします。以下のコマンドを実行して,データベースtestdbとテーブルtesttableを作成します。
●apacheとの連携
以下のコマンドを実行して,ユーザapacheを作成し,データベースtestdbのテーブルtesttableに対する参照のみのアクセス権を,ユーザapache(パスワード:test)に設定します。
php-pgsqlのインストールと利用
PHPとPostgreSQLの連携を可能にするため,以下のコマンドを実行して, php-pgsqlをインストールします。
接続できない場合は、「他のホストからの接続」を参照してください。
後始末
作成したユーザやデータベース等を削除します。
●PerlとPostgreSQLの連携
Perlから、PostgreSQLにアクセスするには大きく分けて二つのやり方があります。
1. Pg.pm を使う方法(速度重視)
2. DBI + DBD を使う方法(他DBとの互換性重視)
1. は、PostgreSQLに付属してくる、Perl用の接続インタフェースです。
Pg.pmを使用する場合は、既にバンドルされているPg.pmは利用できませんので、http://search.cpan.org/search%3fmodule=Pgから「pgsql_perl5-1.9.0」http://www.postgresql.org/ftp/projects/gborg/pgperl/stable/から「Pg-2.1.1.tar.gz」をダウンロードします。
CPANからモジュールダウンロードに関する環境設定はPerlの設定を参照してください。
・PostgreSQLをソースからインストールした場合(tar.gz)
・PostgreSQLをバイナリからインストールした場合(rpm)
バイナリからインストールした場合、「.bash_profile」を設定しなくても環境変数として設定済みの場合があります。その場合は、「.bash_profile」を編集する必要はありません。
Pg.pmのrpmがあれば下記の設定は必要ないのかも・・。
正常終了時は下記のように表示されます。
実際の状況は、下記のとおりです。
2. は、DBD と呼ばれるモジュールと、DBIと呼ばれるモジュールを組み合わせて使う方法です。DBDは、Oracleなど、各種データベース用のものが配布されており、DBIは各DBDに共通で使えます。階層的にあらわすと、「DBMS(PostgreSQL等) ⇔ DBD ⇔ DBI ⇔ Perl プログラム」というようになっており、つまり、DBMSとDBIの間をとりもち、DBMS毎の差異を吸収するのがDBDということになります。 これを用いることにより、DBMSが例えばOracleからPostgreSQLに変わっても、理論的にはプログラムの修正が不要(SQLレベルの変換は当然行われませんので、DBMS依存のSQLが含まれている場合は修正が必要です)となります。
CPANからモジュールダウンロードに関する環境設定はPerlの設定を参照してください。
PostgreSQLを利用しますので、CPANからDBIとDBD::Pgをダウンロードし、インストールします。
・cpanコマンドを使用する場合
サンプルデータベースの作成
今回は、氏名と電話番号および電子メールアドレスを管理する簡易アドレス帳のサンプルデータベースを作成します。
まず、PostgreSQLのプロンプトでcreate table文を発行して、テーブルを定義します。
Perlのプログラム(表示用) Pg.pm版
PerlでPostgreSQLに作成したデータベーステーブルの(コマンドベースで)表示を行うプログラムを作成してみます。以下は、先ほど作成したテーブルの内容を表示する簡単なプログラムのリストです。
13〜18行目までが表示を行う部分になります。まず15〜18行目でループを行い、1行ずつfetchを行ってレコードを取得し、printで出力します。
Perlのプログラム(追加用) Pg.pm版
次に(コマンドベースで)レコード追加を行うサンプルプログラムtest2_pgsql.plについて説明します。
13〜18行目はエラー処理を記述しています。処理がうまく実行できなかった場合は、resultStatusに“PGRES_COMMAND_OK”以外のステータスを戻してきます。
test2_pgsql.plを実行してから表示用のプログラムtest1_pgsql.plを実行すると、レコードの追加が行われているのが分かります
Perlのプログラム(表示用) DBI + DBD版
PerlでPostgreSQLに作成したデータベーステーブルの(コマンドベースで)表示を行うプログラムを作成してみます。以下は、先ほど作成したテーブルの内容を表示する簡単なプログラムのリストです。
Perlのプログラム(追記用) DBI + DBD版
PerlでPostgreSQLに作成したデータベーステーブルに(コマンドベースで)追記を行うプログラムを作成してみます。以下は、先ほど作成したテーブルの内容に追記する簡単なプログラムのリストです。
●RubyとPostgreSQLの連携
RubyとPostgreSQLを接続するためには,
1. ruby-pg
2. Ruby/DBI
3. rubygem-pg(Fedora 20等)
のいずれかをインストールする必要があります。
1.を使用するには、「yum」コマンドを利用して「ruby-postgres」をインストールする方法及びRubyのアプリケーションやライブラリhttps://bitbucket.org/ged/ruby-pg/downloadsから「ruby-postgres-0.7.9.2008.01.28.tar.gz」をダウンロードし、インストールする方法があります。
・yumコマンドを利用する場合
2.を使用するには、RubyForgeプロジェクトのRuby/DBIからダウンロードし、インストールします。Ruby DBIモジュールを使うが参考になります。
Ruby DBIモジュールのRPM版は無いようです・・。
postgres-0.7.9_extconf.rb.patch(結論からすると、このパッチは必要ありません)
postgres-0.7.9_postgres.c.patch(結論からすると、このパッチは必要ありません)
dbi-0.1.1_sql.rb.patch
/usr/local/src/ruby-1.8.7-p160/wince/io.hにありましたので、postgres.cを下記のとおり編集します。
2014年10月現時点で、新しいOS(Fedora 20等)ではrubygem-pgを使用します。
サンプルデータベースの作成
データベースは、PerlとPostgreSQLとの連携で作成したものを使用します。
Rubyのプログラム(表示用) Pg版
RubyでPostgreSQLに作成したデータベーステーブルの(コマンドベースで)表示を行うプログラムを作成してみます。以下は、先ほど作成したテーブルの内容を表示する簡単なプログラムのリストです。
conn = PGconn.connect("localhost", 5432, "", "", "addressdb", "postgres")
のように記載した場合、RubyはPerlと異なり、接続の際(上記「conn」の行)の「"localhost", 5432, "", "",」は省略できません。また、数字である「5432」を「"5432"」としてもいけません。どちらの場合もエラーが表示され、PostgreSQLに接続できません。
上記プログラムを実行すると、下記のような警告が表示される事があります(Ruby1.8.6で表示され、Ruby1.8.7では表示されませんでした)。
Perlからデータベースに接続できるのに、Rubyから接続すると下記のようなエラーが表示される場合があります
Rubyのプログラム(追加用) Pg版
(コマンドベースで)データを追加するプログラムを紹介します。
SQL文の記載方法は、
Rubyのプログラム(表示用) DBI + DBD版
PerlでPostgreSQLに作成したデータベーステーブルの(コマンドベースで)表示を行うプログラムを作成してみます。以下は、先ほど作成したテーブルの内容を表示する簡単なプログラムのリストです。
Rubyのプログラム(追加用) DBI + DBD版
PerlでPostgreSQLに作成したデータベーステーブルの(コマンドベースで)表示を行うプログラムを作成してみます。以下は、先ほど作成したテーブルの内容を表示する簡単なプログラムのリストです。
●データベースの作成
【PostgreSQL基本設定値】
【cityテーブルスキーマ】
【cityテーブル挿入データ】
上記データベースを作成します。
●バックアップとリストアについて
PostgreSQLのデータベースをバックアップする手段は、主に3通りあります。
表1 各バックアップ手段の特徴
(1)PostgreSQLのダンプツールを利用したバックアップ
PostgreSQLのダンプツールには、pg_dump、pg_dumpallがあります。また、pg_dumpallで作成したアーカイブのリストアにはpg_restoreが用意されています。
データベースのバックアップを作成:pg_dump
PostgreSQLにはpg_dumpというデータベースをバックアップするコマンドがあります。pg_dumpを利用すると、データベースを運用中であってもバックアップを作成できます。
そのため、ほかのユーザーによるデータベースへの読み書きをブロックすることなく、バックアップ開始時点における一貫性のあるバックアップを取得することが可能です。
pg_dumpの出力形式
出力形式はスクリプト形式とアーカイブ形式が選択できます。デフォルトはスクリプト形式で、バックアップ時のデータベースを復元するために必要なSQL文の羅列がプレーンテキストの形で出力されます。リストアはpsqlコマンドを使用します。
スクリプト形式の利点は、なんといってもプレーンテキストという点です。例えば、リストアの際にエラーが発生した場合、ファイルの中身を見てエラーの原因を探ることができますし、PostgreSQL固有のSQL文を多少編集すれば、ほかのデータベース製品にもリストアすることができます。
一方、アーカイブ形式はバイナリの形で出力されます。リストアはpsqlではなく、pg_restoreというリストア用のコマンドを使用します。アーカイブ形式の利点は、指定したテーブルのみといったように、データベースを部分的にリストアするなど、柔軟なリストアが可能になっている点です。そのかわり、バイナリのためファイルの中身を直接見たり編集したりすることはできません。また、アーカイブ形式には、custom形式とtar形式の2種類があり、custom形式はデフォルトで圧縮されるためファイルサイズが小さくなります。
なお、pg_dumpによって作成したバックアップファイルは、CPUアーキテクチャが異なるほかのマシンや、より新しいバージョンのPostgreSQLにもリストアすることができます。
pg_dumpの基本的な使用方法は次のとおりです。
アーカイブ形式のリストアは、pg_restoreを使用します。
以上が、pg_dumpを利用したバックアップ、リストア方法です。
pg_dumpは、データベース単位でバックアップを取得するコマンドですので、グローバルデータと呼ばれるロールやテーブルスペースなどの情報はバックアップされないことに注意してください。
データベースクラスタ全体のバックアップを作成:pg_dumpall
前述のように、pg_dumpコマンドではロールやテーブルスペースなどの情報はバックアップされません。これらの情報も含めてデータベースクラスタ全体をバックアップしたい場合は、pg_dumpallという便利なコマンドが用意されています。このコマンドは、-gオプションを指定して実行することで、グローバルデータのみをバックアップすることも可能です。
pg_dumpallの内部動作と出力
pg_dumpallは、内部動作としてはpg_dumpを呼び出しているため、ほぼ同じオプションを指定できます。ただし、出力形式を指定する-Fオプションは使えません。出力は常にスクリプト形式です。
pg_dumpallを使用すると、PostgreSQLを運用しているマシンの変更やPostgreSQLのバージョンアップを容易に行うことができます
pg_dump、pg_dumpallをcronで使う際の注意点
pg_dump、pg_dumpallは、cronなどを利用して定期的に実行されることが多いですが、その際、接続時にパスワードを設定していると、それらは実行時にパスワードの入力待ち状態になってしまいます。
これを防ぐには、コマンドを実行するユーザーのホームディレクトリに、以下の書式に従ってパスワードを記述したファイルを.pgpassという名前で配置しておいてください。そうすることで、パスワードはそのファイルに書かれているものが自動的に適用されるようになります。
ホスト名:ポート番号:データベース名:ユーザー名:パスワード
ただし、pg_dump、pg_dumpallでは、postgresql.confやpg_hba.confなどの設定ファイルはバックアップされないので注意が必要です。これらのファイルについては別途コピーする必要があります。これ以外のpg_dump、pg_dumpall、pg_restoreのオプションや詳細については、下記マニュアルを参照してください。
バックアップコマンドのマニュアル
バックアップコマンドのそのほかのオプションや詳細な使い方については下記日本語ドキュメントを参照ください(いずれも、NPO法人 PostgreSQLユーザ会Webサイト内掲載のオンラインマニュアル)。
(2)OSコマンド(rsyncなど)、バックアップツールによるバックアップ
OS側で用意されているコマンドやサードパーティ製のバックアップツールを利用したバックアップ方法は、PostgreSQLを停止してデータベースクラスタをコピーすれば完了です。リストアは、データベースクラスタのディレクトリを置き換えるだけです。この方法の利点は何といっても単純明快なことですが、以下の欠点があります。
rsyncによる差分バックアップ
rsync を利用する場合は、PostgreSQLを運用中にいったんrsyncを実行したうえでPostgreSQLを停止し、再度rsyncを実行する方法が多く取られます。2回目のrsyncは1回目のrsyncでコピーしたものの差分のみをコピーするため、コピー時間が短くなり、結果的にPostgreSQLの停止時間を最小限に抑えることができるからです。
図 rsyncによる差分バックアップの流れ
バックアップファイルはデータベースと別の信頼できるハードディスクに保存するか、テープなどのメディアに保存するよう検討してください。
(3)PITRによるバックアップ
記載は未定
●エラー対処
PerlプログラムでCan't locate (モジュール名) in @INCと出力された場合
また、-Iオプションを用いることにより、/home/user/libを検索PATHに加えたければ、
さらに環境変数PERL5LIBを用いれば、
Perl-Pgプログラム実行時にデータベースと接続できない場合の疑うべき箇所
(postgresユーザのホームディレクトリ)/data/pg_logにあるログを調査します。
データベースに接続する際のユーザ名が「postgres」の場合、パスワードを設定しなくてもデータベースに接続することができます。それなのに、結果が表示されない場合は「FATAL: ユーザ"postgres"のIdent認証に失敗しました」というエラーが表示されているはずです。
これは「pg_hba.conf」の設定に問題がありますので、下記の通り修正します。
org.postgresql.util.PSQLException: FATAL: Ident authentication failed for user "postgres"
プログラム名:20:行数 `initialize': FATAL: ユーザ"postgres"のIdent認証に失敗しました (PG::ConnectionBad)
対処方法は下記をのように変更してください。
org.postgresql.util.PSQLException: FATAL: role "myuser" dose not exist
コンテキストファイルで設定したユーザ「myuser」が、PostgreSQLで作成されていない場合に表示されるエラーです。対処方法は下記を参照してください。
org.postgresql.util.PSQLException: ERROR: permision denied for relation city
コンテキストファイルで設定したユーザが、テーブル「city」への参照権がない場合に表示されるエラーです。テーブル「city」に対し、少なくとも「select」権限を与えてください。なお、テーブル「city」はデータベース「auth」に存在するものとします。
LOG: アドレス"127.0.0.1"、ポート113のIdentサーバに接続できませんでした: 接続を拒否されました
Ruby-Pgプログラムを実行時に、(postgresユーザのホームディレクトリ)/data/pg_logに下記のようなエラーが表示される場合があります。
RPMバイナリをインストールします。
# yum install postgresql postgresql-libs postgresql-server postgresql-devel postgresql-contrib # sudo postgresql-setup initdb
●インストール(tar)
RPMパッケージの削除
PostgresSQLのRPMパッケージがインストールされているか確認します。
# rpm -qa | grep postgresqlインストールされている場合は、削除します。
# rpm -e postgresql* または # yum remove postgresql*上記により、依存するファイルも削除されます。
postgresユーザの作成
PostgresSQLサーバのユーザにpostgresを作成します。PostgreSQLはrootで起動できないため、PostgreSQLを利用するユーザとしてpostgresを作成します。
# groupadd postgres ← 「postgres」グループの作成 # useradd -g postgres -d /usr/local/pgsql postgres ↑ 所属グループを「postgres」、ホームディレクトリを「/usr/local/pgsql」として、 「postgres」ユーザを作成 # passwd postgres 補足:RPMパッケージを削除しても「postgres」ユーザが残る場合の対処 # usermod -g postgres -d /usr/local/pgsql -m postgres ↑ デフォルトグループを「postgres」、ホームディレクトリを「/usr/local/pgsql」に移動 -c comment login のコメントを変更する。 -d home_dir login のホームディレクトリをhome_dirに変更する。後ろに-mをつけると、 現在のホームディレクトリの中身が新しいホームディレクトリに移動する。 上記の場合、「/usr/local」までは作成しておくこと。 また、そのディレクトリが存在しない場合は新たに作られる。 -e expire_date アカウントが使用不能になる日付。日付はYYYY-MM-DDで指定する。 -f inactive_days パスワードの使用期限が切れてからアカウントが永久に使用不能になるまでの日数。 0とすると、パスワードの期限が切れると同時にこのアカウントは使用不可能になる。 -1を指定すると無期限に。 -g initial_group デフォルトのグループをinitial_groupに変更する -G group,[...] アカウントが属する、サブグループを追加。グループはコンマ区切り。 元々入っていたグループをここで指定しないと、そのグループから削除されます。 -l login_name ユーザのログイン名をloginからlogin_nameに変更する。パスワードとかもそのまま。 ホームディレクトリの名前くらいはを変えてあげましょう。 -s shell ログインシェルをshellに変更する。 -u uid ユーザのID番号を指定したものへ変更する。 -L ユーザのパスワードをロックする。 ロックされたアカウントは、パスワード認証でのログインができなくなります。 -U ユーザのパスワードをアンロックする。-Lの反対です。インストール先ディレクトリを作成します。
# mkdir /usr/local/pgsql # chown -R postgres:postgres /usr/local/pgsql
PostgreSQLのダウンロード
以下のページより、最新版をダウンロードします。
http://www.postgresql.org/
または
ftp://ftp.postgresql.org/pub/
今回は、postgresql-8.3.7.tar.gzをダウンロードし、/usr/local/srcに保存しました。
PostgreSQLのインストール
# cd /usr/local/src # tar zxvf postgresql-8.3.7.tar.gz ← 解凍 # su - postgres $ cd /usr/local/src/postgresql-8.3.7 $ ./configure ← 構成(configuration) インストールについては、PostgreSQL 8.3.7文書 第15章インストール手順15.5. インストール手順を参照 $ gmake all ← 構築 問題がなければ、最後に以下のような行が表示される。 All of PostgreSQL is successfully made. Ready to install. コンパイルの途中で下記のエラーが発生 /bin/sh: line 1: libpq.rc: 許可がありません 下記により対応 /usr/local/src/postgresql/src/interfaces/libpq/libpq-rc ファイルのパーミッションを変更 $ su - ← 一度rootに戻る # chmod 777 /usr/local/src/postgresql/src/interfaces/libpq/libpq-rc ← アクセス権変更 # su - postgres ← 再度、postgresユーザに戻る $ gmake all ← 再度、構築 $ gmake check ← テスト $ gmake install ← インストール インストールが完了すれば、下記のように表示されます。 PostgreSQL installation complete.
環境変数の設定
postgresユーザの .bash_profileを編集します。
$ vi ~/.bash_profile export PATH=$PATH:/usr/local/pgsql/bin export POSTGRES_HOME=/usr/local/pgsql export PGLIB=$POSTGRES_HOME/lib export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":"$PGLIB" export MANPATH="$MANPATH":$POSTGRES_HOME/man export PGDATA=/usr/local/pgsql/data設定を反映させます。
$ source ~/.bash_profile上記設定を、全ユーザに反映させたい場合は「/etc/bash_profile」を編集し、設定を反映させます。
では、次にデータベースを初期化します。
PostgreSQLを使用できる状態にするには、一度データベースクラスタを初期化する必要があります。データベースクラスタとは、複数のデータベースを格納する領域です。データベースクラスタを初期化するには、postgresユーザでinitdbコマンドを実行します。
PostgreSQLでは、initdbコマンドを実行したユーザがスーパーユーザーになります。また、データベースクラスタはPGDATA変数で指定したディレクトリに作成されます。
$ /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data または $ /usr/local/pgsql/bin/initdb --encoding=UTF8 --no-locale 初期化が完了すれば、下記のように表示されます。 「Success. You can now start the database 〜」--encodingは、データベースのデフォルトの文字エンコーディングを設定するオプションです。ここでは、文字エンコーディングにUTF-8を指定しています。
--no-localeは、ロケールを使用しないことを設定するオプションです。ロケールとは、言語や文化に応じた処理をするOSの機構です。
PostgreSQLでは、このロケールを主にデータのソート処理に使用しますが、英語や日本語のデータを扱う場合には特に必要ありません。反対にロケールを設定すると、ロケール処理の分、ソート処理などが遅くなりますので、注意してください。
PostgreSQLの起動
postgresユーザで起動します。
$ pg_ctl -w start「server started」と表示されれば成功です。
停止する場合は以下のようにします。
$ pg_ctl -w stop「server stopped」と表示されれば成功です。
強制停止1
全てのトランザクションをロールバックさせて、セッションは強制切断してデータベースを停止させる。
pg_ctl stop -m fast または pg_ctl stop -m f強制停止2
全てのトランザクション、セッションを強制的に切断してデータベースを停止させる。強制停止させられたトランザクションは、時間の起動の際リカバリーとしてロールバックされる。
pg_ctl stop -m immediate または pg_ctl stop -m i起動ステータスの確認
pg_ctl status
他のホストからの接続
# su - postgres Attempting to create directory /var/lib/pgsql/perl5 -bash-4.2$ psql -c "alter user postgres with password 'password'" ALTER ROLE -bash-4.2$ exit ログアウトpg_hba.confを編集します。
$ vi /usr/local/pgsql/data/pg_hba.conf または $ vi /var/lib/pgsql/data/pg_hba.conf # "local" is for Unix domain socket connections only local all all trust ← 変更 # IPv4 local connections: host all all 127.0.0.1/32 ident host all all 192.168.100.0/24 trust ← 追加 # IPv6 local connections: host all all :1/128 trust ← 変更 ◆以下は、例です。 # データベース名databaseへのすべての接続を許可 host database all 0.0.0.0/0 trust # パスワード認証を行なう host all all 0.0.0.0/0 password # 192.168.0.10からの接続を許可 host all all 192.168.0.10/32 trust上記の変更でも他のホストから接続できない場合は、postgresql.confを変更します。
# vi /var/lib/pgsql/data/postgresql.conf #listen_addresses = 'localhost' # what IP address(es) to listen on; ↓ 変更 listen_addresses = '*' # what IP address(es) to listen on;編集が完了したらPostgreSQLを再起動します。
# service postgresql restartインストール及び初期設定が完了しましたので、●テストデータベース作成を参照して、テストデータベースを作成してください。
自動起動スクリプトの作成
ルート権限で、/etc/rc.d/init.d/postgresqlというファイルを作成します。
# vi /etc/rc.d/init.d/postgresql #!/bin/sh # # postgres - This script is used to start/stop # the postgreSQL listener process. # # Usage # # You can use this script manually, and/or you # can install this script into the runlevel system # by running "sh postgres.init.sh install" # # Credits # # Thomas Lockhart # modified from other startup files in the # RedHat Linux distribution # # Clark Evans # cleaned up, added comments, etc. # # modified for PostgreSQL book written by Tatsuo Ishii # # RedHat Stuff # # chkconfig: 345 85 15 # description: Starts and stops the PostgreSQL backend daemon\ # that handles all database requests. # processname: postmaster # pidfile: /var/run/postmaster.pid # # Config Variables # # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network PGACCOUNT="postgres" ← PostgreSQLのユーザを指定 # # The non-root user account which will be used to run the # PostgreSQL executeable. For this script to work, the # shell for this account must be SH/BASH. # POSTGRES_HOME="/usr/local/pgsql" PGDATA="/usr/local/pgsql/data" POSTMASTER="/usr/local/pgsql/bin/postmaster" PG_CTL="/usr/local/pgsql/bin/pg_ctl" PGPORT="5432" PGLOG="/usr/local/pgsql/pgstartup.log" export PGPORT # # The executable program which is to be run, in this case # it is the listener, which waits for requests on the port # specified during configuration. # pidfile="/var/run/postmaster.pid" pidfile_make="ps -ef | grep -v grep | grep $POSTGRES_HOME | awk '{print \$2}' > $pidfile" ↑ PostgreSQLのプロセスID保存用ファイル作成 pidfile_del="rm -f $pidfile" ← プロセスID保存用ファイル削除 # # See how we were called. # case "$1" in start) # Start daemons. if [ -f /var/lock/subsys/postgresql ] ; then echo "PostgreSQL already started!" exit 1 fi echo -n "Starting PostgreSQL: " su - $PGACCOUNT -c "$POSTMASTER -p $PGPORT -D $PGDATA &" >> $PGLOG 2>&1 < /dev/null daemon $pidfile_make ← この行がないと、[ OK ]が表示されない RETVAL=$? echo [ $RETVAL = 0 ] && touch /var/lock/subsys/postgresql ;; stop) # Stop daemons. if [ ! -f /var/lock/subsys/postgresql ] ; then echo "PostgreSQL already stopped!" exit 1 fi echo -n "Stopping PostgreSQL: " su - $PGACCOUNT -c "$PG_CTL stop -m f -D $PGDATA" > /dev/null 2>&1 < /dev/null daemon $pidfile_del ← この行がないと、[ OK ]が表示されない RETVAL=$? echo [ $RETVAL = 0 ] && rm -f /var/lock/subsys/postgresql ;; status) status postgresql exit $? ;; restart) $0 stop sleep 1 ← $pidfileに一つ前のプロセスIDが残ってしまうための対処 $0 start ;; *) echo "Usage: $0 {start|stop|status|restart}" exit 1 esac exit 0作成したpostgresqlのモードを変更します。
# chmod 755 postgresqlchkconfigコマンドで、起動スクリプトを追加します。
# chkconfig --add postgresql上記ファイルはここからダウンロードできます。
●初期設定
インストール及びPostgreSQL用ユーザの作成が完了したら、PostgreSQLを初期化します。
# service postgresql initdb ← 初期化
or
# postgresql-setup initdb
初期化が完了したら、サービスを起動します。
# service postgresql start or # systemctl start postgresqlPostgreSQLを別のホストからも用する場合やFirewalldを有効にしている場合、PostgreSQLサービスへのアクセス許可が必要です。
# firewall-cmd --add-service=postgresql --permanent success # firewall-cmd --reload successpsコマンドで確認します。動作していれば、下記のように表示されます。
# ps -ef | grep postmaster
/usr/bin/postmaster -p 5432 -D (postgresユーザのホームディレクトリ)/data
補足:postgresユーザでpg_ctlを使用しての起動
pg_ctl -o "-p 5432" -D /usr/local/pgsql/data -w start
$ ps -ef | grep postgres
/usr/bin/postgres -p 5432 -D (postgresユーザのホームディレクトリ)/data
PostgreSQLがシステム起動時に、自動起動するようにします。
# chkconfig postgresql on ← PostgreSQL自動起動設定 # chkconfig --list postgresql ← PostgreSQL自動起動設定確認 postgresql 0:off 1:off 2:on 3:on 4:on 5:on 6:off ← ランレベル2〜5のonを確認 or # systemctl enable postgresql
◆PostgreSQLの設定ファイル
PostgreSQLの設定はpostgresql.confファイルとpg_hba.confファイルを使って行います。
postgresql.conf:サーバの実行時のリソースなどを設定するファイル
pg_hba.conf:クライアントからのアクセスコントロールを設定するファイル
◆サーバプロセスの起動と停止
PostgreSQLのサーバプロセスを起動・停止するには、postgresユーザでpg_ctlコマンドを実行します。$ pg_ctl -w start // 起動処理終了後プロンプトに戻る $ pg_ctl stop // サーバプロセスの停止起動時の-wはwaitを表し、起動処理が終了した時点でコマンドプロンプトに戻すようにするオプションです。
PostgreSQLのサーバプロセスを停止する際に、データベースに接続しているユーザがいる場合は、上記のコマンドでは停止できません。この場合は、-mオプションを使用して停止方法を指定します。$ pg_ctl -m 停止方法 [s|f|i] stop停止方法には、s、f、i を引数として指定できます。それぞれ、smart、fast、immediateを表します。引数s(smart)は、新規の接続を拒否し、既存の接続が切断されるまで待ってから停止します。前述の-mオプションを指定しない場合はこの方法で停止処理が行われます。
このほか、f(fast)は、既存の接続を強制的に切断してから停止し、i(immediate)は、適切な終了手順を踏まずにただちに停止します。
◆データベースに接続するには
PostgreSQLには、専用のターミナルとしてpsqlが付属しています。psqlを利用すると手軽にデータベースへ接続し、SQLを実行することができます。
psqlでデータベースに接続する最も単純なコマンドは次のとおりです。$ psql データベース名 ユーザ名PostgreSQLは独自のユーザ管理機構を持っています。そのため、OSのユーザとPostgreSQLのユーザ間に直接的な関連はありません。
ただし、一般的なPostgreSQLのコマンドは、データベースに接続するユーザの指定を省略した場合、そのコマンドを実行したOSのユーザの名前を使用して接続する仕組みになっています。上記のコマンドの場合もユーザ名を省略すると、postgresユーザでデータベースに接続します。
◆ユーザを作成するには
いまのところ、PostgreSQLのユーザはスーパーユーザのpostgresしか存在していないので、一般ユーザを作成します。
例えば、user1という名前の一般ユーザを作成するには、postgresユーザでcreateuserコマンドを実行します。このとき、PostgreSQLは起動している必要があります。$ createuser user1 Shall the new role be a superuser? (y/n) n Shall the new role be allowed to create databases? (y/n) y Shall the new role be allowed to create more new roles? (y/n) ncreateuserコマンド実行時の質問は、それぞれ以下のことを確認しています。
* 新しいロールをスーパーユーザとするか
* 新しいロールに対してデータベース作成を許可するか
* 新しいロールに対してロール作成を許可するか
ここでの「ロール」とは、ユーザとグループの両方を含む概念です。
◆psqlでデータベースに接続には
PostgreSQLでは、initdbコマンドでデータベースクラスタを初期化した時点で、template0、template1、postgresという3つのデータベースが自動的に作成されます。
template0とtemplate1データベースはユーザがデータベースを作る際にひな型として使用されるデータベースです。
また、postgresデータベースはPostgreSQL 8.1以降に用意されているデータベースで、主にPostgreSQLのコマンドによって使用されます。どれも必要なデータベースなので削除してはいけません。なお、template1とpostgresデータベースには接続することができます。
例えば、user1ユーザでpostgresデータベースに接続する場合、psqlコマンドで次のように接続します。$ psql postgres user1 Welcome to psql 8.3.1, the PostgreSQL interactive terminal. Type: \copyright for distribution terms \h for help with SQL commands \? for help with psql commands \g or terminate with semicolon to execute query \q to quit postgres=> //一般ユーザの場合のプロンプト表示一般ユーザでデータベースに接続した場合、プロンプトは 「=>」になり、スーパーユーザの場合は「=#」になります。
●テストデータベース作成
postgresでログインします。以下のコマンドを実行して,データベースtestdbとテーブルtesttableを作成します。
# su - postgres $ createdb testdb ← データベースtestdbの作成 $ psql -l ← 作成されたデータベースの確認 List of databases Name | Owner | Encoding -----------+----------+---------- postgres | postgres | UTF8 template0 | postgres | UTF8 template1 | postgres | UTF8 testdb | postgres | UTF8 ← データベースが作成されている (4 rows) $ psql testdb ← データベースtestdbに接続 Welcome to psql 8.3.5, the PostgreSQL interactive terminal. Type: \copyright for distribution terms \h for help with SQL commands \? for help with psql commands \g or terminate with semicolon to execute query \q to quit testdb=# create table testtable (name varchar(30), age varchar(3)); ← テーブルtesttableの作成 CREATE TABLE testdb=# \d ← テーブルtesttableが作成されているかどうかの確認 List of relations Schema | Name | Type | Owner --------+-----------+-------+---------- public | testtable | table | postgres (1 row) testdb=# insert into testtable values ('山田太郎', '18'); ← テーブルにデータの挿入 INSERT 0 1 testdb=# insert into testtable values ('福田一郎', '25'); ← テーブルにデータの挿入 INSERT 0 1 testdb=# select * from testtable; ← 挿入されたデータの確認 name | age ----------+----- 山田太郎 | 18 福田一郎 | 25 (2 rows) testdb=# \d testtable ← テーブルのカラム定義の確認 table "public.testtable" Column | Type | Modifiers --------+-----------------------+----------- name | character varying(30) | age | character varying(3) | testdb=# \q ← \qを入力して、データベースから切断
●apacheとの連携
以下のコマンドを実行して,ユーザapacheを作成し,データベースtestdbのテーブルtesttableに対する参照のみのアクセス権を,ユーザapache(パスワード:test)に設定します。
$ psql testdb testdb=# create user apache with password 'test'; ← ユーザapache(パスワード:test)の作成 CREATE ROLE testdb=# select usename from pg_user; ← ユーザの一覧表示 usename ---------- postgres apache ← ユーザapacheが作成されている (2 rows) testdb=# grant select on testtable to apache; ← ユーザapacheに参照のみのアクセス権を設定 GRANT testdb=# \z ← 存在するオブジェクトに対し与えられた権限の表示 Access privileges for database "testdb" Schema | Name | Type | Access privileges --------+-----------+-------+---------------------------------------------- public | testtable | table | {postgres=arwdxt/postgres,apache=r/postgres} (1 row) testdb=# \q ← \qを入力して、データベースから切断 $ exit ← postgresからログアウト logput
php-pgsqlのインストールと利用
PHPとPostgreSQLの連携を可能にするため,以下のコマンドを実行して, php-pgsqlをインストールします。
# yum -y install php-pgsqlApacheを再起動します。
# service httpd restart または # service apache restart/var/www/html/test_postgresql.phpを以下のように作成します。
# vi /var/www/html/test_postgresql.php <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>DB接続テスト</title> </head> <body> <h2>名簿</h2> <p> <?php // 初期設定 $dbname = "testdb"; $username = "apache"; $password = "test"; $sql = "select * from testtable"; // データベースに接続 $con = pg_connect("dbname=$dbname user=$username password=$password"); if (!$con) { die("データベースに接続できませんでした"); } // クエリの実行 $rs = pg_query($con, $sql); // 結果セットの行数を取得 $maxrows = pg_num_rows($rs); for ($i = 0; $i < $maxrows; $i++) { $row = pg_fetch_row($rs, $i); echo("$row[0] | $row[1]<br>\n"); } // データベースの接続終了 pg_close($con); ?> </p> </body> </html>http://(Webサーバ名)/test_postgresql.phpにアクセスすることにより、DBへの接続状況を確認することができます。
接続できない場合は、「他のホストからの接続」を参照してください。
後始末
作成したユーザやデータベース等を削除します。
testdb=# revoke select on testtable from apache; ← ユーザapacheから参照のみのアクセス権を解除 testdb=# revoke all on testtable from apache; ← ユーザapacheからすべてのアクセス権を解除 ← どちらかの方法でアクセス権を解除 testdb=# drop user apache; ← ユーザapacheの削除 DROP ROLE testdb=# drop table testtable; ← テーブルtesttableの削除 DROP table testdb=# \q ← データベースから切断 $ dropdb testdb ← データベースtestdbの削除 $ psql -l ← データベースtestdbが削除されたかの確認 List of databases Name | Owner | Encoding -----------+----------+---------- postgres | postgres | UTF8 template0 | postgres | UTF8 template1 | postgres | UTF8 (3 rows)
●PerlとPostgreSQLの連携
Perlから、PostgreSQLにアクセスするには大きく分けて二つのやり方があります。
1. Pg.pm を使う方法(速度重視)
2. DBI + DBD を使う方法(他DBとの互換性重視)
1. は、PostgreSQLに付属してくる、Perl用の接続インタフェースです。
Pg.pmを使用する場合は、既にバンドルされているPg.pmは利用できませんので、http://search.cpan.org/search%3fmodule=Pgから「pgsql_perl5-1.9.0」http://www.postgresql.org/ftp/projects/gborg/pgperl/stable/から「Pg-2.1.1.tar.gz」をダウンロードします。
CPANからモジュールダウンロードに関する環境設定はPerlの設定を参照してください。
$ cd /usr/local/src
$ wget http://search.cpan.org/CPAN/authors/id/M/ME/MERGL/pgsql_perl5-1.9.0.tar.gz
$ tar zxvf pgsql_perl5-1.9.0.tar.gz
$ cd pgsql_perl5-1.9.0
$ wget http://ftp.postgresql.org/pub/projects/gborg/pgperl/stable/Pg-2.1.1.tar.gz
$ tar zxvf Pg-2.1.1.tar.gz
$ cd Pg-2.1.1
$ perl Makefile.PL
この時、「Please set environment variables POSTGRES_INCLUDE and POSTGRES_LIB」と表示された場合は、下記のとおり対処してください。
・PostgreSQLをソースからインストールした場合(tar.gz)
$ vi (postgresユーザのホームディレクトリ)/.bash_profile export POSTGRES_HOME=/usr/local/pgsql export PATH=$PATH:$POSTGRES_HOME/bin export PGLIB=$POSTGRES_HOME/lib export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":"$PGLIB" export MANPATH="$MANPATH":$POSTGRES_HOME/man export PGDATA=$POSTGRES_HOME/data $ source (postgresユーザのホームディレクトリ)/.bash_profileとしてください。上記設定を、全ユーザに反映させたい場合は「/etc/profile」を編集し、設定を反映させます。
・PostgreSQLをバイナリからインストールした場合(rpm)
バイナリからインストールした場合、「.bash_profile」を設定しなくても環境変数として設定済みの場合があります。その場合は、「.bash_profile」を編集する必要はありません。
Pg.pmのrpmがあれば下記の設定は必要ないのかも・・。
$ vi (postgresユーザのホームディレクトリ)/.bash_profile export POSTGRES_HOME=(postgresユーザのホームディレクトリ) export PATH=$PATH:/usr/local/pgsql/bin export PGLIB=$POSTGRES_HOME/lib export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":"$PGLIB" export MANPATH="$MANPATH":$POSTGRES_HOME/man export PGDATA=$POSTGRES_HOME/data export POSTGRES_INCLUDE=/usr/include/pgsql export POSTGRES_LIB=(postgresユーザのホームディレクトリ) $ source (postgresユーザのホームディレクトリ)/.bash_profileまたは、
# export POSTGRES_INCLUDE=/usr/include/pgsql # export POSTGRES_LIB=/var/lib/pgsqlとしてください。上記設定を、全ユーザに反映させたい場合は「/etc/profile」を編集し、設定を反映させます。
正常終了時は下記のように表示されます。
Configuring Pg
Remember to actually read the README file !
OS: linux
Checking if your kit is complete...
Looks good
Writing Makefile for Pg
Configuring Pg
Remember to actually read the README file !
OS: linux
Checking if your kit is complete...
Looks good
Generating a Unix-style Makefile
Writing Makefile for Pg
Writing MYMETA.yml and MYMETA.json
その後、下記の作業を続行します。
$ make上記により、Pg.pmが「/usr/lib/perl5/vendor_perl/5.10.0/i386-linux-thread-multi/usr/local/lib/perl5」にインストールされます。cp Pg.pm blib/lib/Pg.pm AutoSplitting blib/lib/Pg.pm (blib/lib/auto/Pg) Running Mkbootstrap for Pg () chmod 644 Pg.bs /usr/bin/perl /usr/share/perl5/vendor_perl/ExtUtils/xsubpp -typemap /usr/share/perl5/ExtUtils/typemap -typemap typemap Pg.xs > Pg.xsc && mv Pg.xsc Pg.c gcc -c -I/usr/include/pgsql -D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -O2 -g -pipe -Wall -Wp,\ -D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m32 -march=i686 -mtune=atom -fasynchronous-unwind-tables \ -DVERSION=\"2.1.1\" -DXS_VERSION=\"2.1.1\" -fPIC "-I/usr/lib/perl5/CORE" Pg.c In file included from Pg.xs:12:0: ppport.h:43:38: 警告: コメント内に "/*" があります [-Wcomment] perl -x ppport.h *.c *.h *.xs foo/*.c [etc] ^ Pg.xs: 関数 ‘constant’ 内: Pg.xs:72:1: 警告: ラベル ‘not_there’ が定義されていますが使用されていません [-Wunused-label] not_there: ^ Pg.xs: 関数 ‘XS_Pg_conndefaults’ 内: Pg.xs:159:3: 警告: 真偽値として使われる代入のまわりでは、丸括弧の使用をお勧めします [-Wparentheses] if (infoOptions = PQconndefaults()) { ^ rm -f blib/arch/auto/Pg/Pg.so LD_RUN_PATH="/lib" gcc -shared -O2 -g -pipe -Wall -Wp,\ -D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m32 \ -march=i686 -mtune=atom -fasynchronous-unwind-tables -Wl,\ -z,relro -L/usr/local/lib Pg.o -o blib/arch/auto/Pg/Pg.so \ -L/var/lib/pgsql -lpq \ chmod 755 blib/arch/auto/Pg/Pg.so /usr/bin/perl -MExtUtils::Command::MM -e 'cp_nonempty' -- Pg.bs blib/arch/auto/Pg/Pg.bs 644 Manifying blib/man3/Pg.3pm$ su # export PGDATABASE=test # export PGUSER=postgres # make testPERL_DL_NONLAZY=1 /usr/bin/perl "-Iblib/lib" "-Iblib/arch" test.pl Pg::conndefaults ........ ok Pg::connectdb ........... ok $conn->exec ............. ok $conn->errorMessage ..... not ok: FATAL: データベース"rumpumpel"は存在しません make: *** [test_dynamic] エラー 255# PGDATABASE=test; export PGDATABASE # PGUSER=postgres; export PGUSER # createdb -U postgres rumpumpel # make testPERL_DL_NONLAZY=1 /usr/bin/perl "-Iblib/lib" "-Iblib/arch" test.pl Pg::conndefaults ........ ok Pg::connectdb ........... ok $conn->exec ............. ok $conn->errorMessage ..... not ok: at test.pl line 117. make: *** [test_dynamic] エラー 255エラーと表示されますが、このままインストールします。 # make installFiles found in blib/arch: installing files in blib/lib into architecture dependent library tree Installing /usr/local/lib/perl5/auto/Pg/Pg.so Installing /usr/local/lib/perl5/Pg.pm Installing /usr/local/lib/perl5/auto/Pg/autosplit.ix Installing /usr/local/share/man/man3/Pg.3pm Appending installation info to /usr/lib/perl5/perllocal.pod# perl -e "use Pg;" 何も表示されなければ、インストール成功です。
実際の状況は、下記のとおりです。
# make install
Files found in blib/arch: installing files in blib/lib into architecture dependent library tree
Installing /usr/local/lib/perl5/site_perl/5.10.0/i386-linux-thread-multi/auto/Pg/Pg.so
Appending installation info to /usr/lib/perl5/5.10.0/i386-linux-thread-multi/perllocal.pod
「libpq-fe.h」がありませんと出力された場合、「postgresql-devel」をインストールすると出力されなくなります。再度、makeしたところ「Pg.xs(XS_PG_…)」関係で警告等が出力されましたが、そのまま「make install」したらインストールできました。
2. は、DBD と呼ばれるモジュールと、DBIと呼ばれるモジュールを組み合わせて使う方法です。DBDは、Oracleなど、各種データベース用のものが配布されており、DBIは各DBDに共通で使えます。階層的にあらわすと、「DBMS(PostgreSQL等) ⇔ DBD ⇔ DBI ⇔ Perl プログラム」というようになっており、つまり、DBMSとDBIの間をとりもち、DBMS毎の差異を吸収するのがDBDということになります。 これを用いることにより、DBMSが例えばOracleからPostgreSQLに変わっても、理論的にはプログラムの修正が不要(SQLレベルの変換は当然行われませんので、DBMS依存のSQLが含まれている場合は修正が必要です)となります。
CPANからモジュールダウンロードに関する環境設定はPerlの設定を参照してください。
PostgreSQLを利用しますので、CPANからDBIとDBD::Pgをダウンロードし、インストールします。
・cpanコマンドを使用する場合
# cpan DBI /usr/bin/make install -- OK # cpan DBD::Pg /usr/bin/make install -- OK・ソースからインストールする場合
$ cd /usr/local/src $ wget http://cpan.perl.org/modules/by-module/DBI/DBI-1.608.tar.gz $ tar zxvf DBI-1.608.tar.gz $ cd DBI-1.608 $ perl Makefile.PL $ make $ su # make install $ cd /usr/local/src $ wget http://search.cpan.org/CPAN/authors/id/T/TU/TURNSTEP/DBD-Pg-2.13.1.tar.gz $ tar zxvf DBD-Pg-2.13.1.tar.gz $ cd DBD-Pg-2.13.1 $ perl Makefile.PL $ make $ su # make install実際の状況は、下記のとおりです。
・DBI-1.608
# make install
Files found in blib/arch: installing files in blib/lib into architecture dependent library tree
Installing /usr/local/lib/perl5/site_perl/5.10.0/i386-linux-thread-multi/DBI.pm
Appending installation info to /usr/lib/perl5/5.10.0/i386-linux-thread-multi/perllocal.pod
・DBD-Pg
# make install
Files found in blib/arch: installing files in blib/lib into architecture dependent library tree
Installing /usr/local/lib/perl5/site_perl/5.10.0/i386-linux-thread-multi/auto/DBD/Pg/Pg.so
Appending installation info to /usr/lib/perl5/5.10.0/i386-linux-thread-multi/perllocal.pod
サンプルデータベースの作成
今回は、氏名と電話番号および電子メールアドレスを管理する簡易アドレス帳のサンプルデータベースを作成します。
まず、PostgreSQLのプロンプトでcreate table文を発行して、テーブルを定義します。
# su - postgres $ createdb addressdb ← データベース「addressdb」の作成 $ psql -l ← 作成したデータベースの確認 List of databases Name | Owner | Encoding -----------+----------+---------- addressdb | postgres | UTF8 ← データベースが作成されている postgres | postgres | UTF8 template0 | postgres | UTF8 template1 | postgres | UTF8 $ psql addressdb ← データベース「addressdb」に接続 addressdb=# create table addrbook (name varchar(50), telno varchar(50), email varchar(50)); ↑ テーブル「addressdb」に接続 CREATE TABLE addressdb=# \d ← テーブルtesttableが作成されているかどうかの確認 List of relations Schema | Name | Type | Owner --------+----------+-------+---------- public | addrbook | table | postgres (1 row) addressdb=# \q ← psqlモードから抜ける以下の内容のテキストファイルを(postgreユーザ権限で)用意し、addrbook.txtというファイル名で保存します。セパレータの部分はTABにしてください。
# su - postgres # vi addrbook.txt R.Nomura 090-2298-**** nomura.r@mail.com D.Tanaka 080-****-**** dtanaka@post.co.jp I.Yanagida 090-1987-**** ichi.yanagida@elect.netこのファイルをcopyコマンドを使ってインポートします。
$ psql addressdb addressdb=# \copy addrbook from addrbook.txtコピーされた内容を確認します。
addressdb=# select * from addrbook; name | telno | email ------------+---------------+------------------------- R.Nomura | 090-2298-**** | nomura.r@mail.com D.Tanaka | 080-****-**** | dtanaka@post.co.jp I.Yanagida | 090-1987-**** | ichi.yanagida@elect.net (3 rows)以上でサンプルデータベースの用意ができました。
Perlのプログラム(表示用) Pg.pm版
PerlでPostgreSQLに作成したデータベーステーブルの(コマンドベースで)表示を行うプログラムを作成してみます。以下は、先ほど作成したテーブルの内容を表示する簡単なプログラムのリストです。
$ vi test1_pgsql.pl ← test1_pgsql.plの編集 #!/usr/bin/perl ← 環境に合わせる use Pg; $dbname = "addressdb"; $username = "postgres"; $tblname = "addrbook"; $sql = "select * from $tblname"; $conn = Pg::connectdb("dbname=$dbname user=$username"); #接続確認 if ($conn->status != PGRES_CONNECTION_OK) { print "データベースへの接続に失敗しました。\n"; # exit; } $res = $conn-> exec($sql); #コマンド実行確認 if ($res->resultStatus != PGRES_COMMAND_OK) { print "SQLコマンドの実行に失敗しました。\n"; # exit; } print "name telno email\n"; print "--------------------------------------\n"; while(@item = $res-> fetchrow) { print "@item[0] @item[1] @item[2]"; print ("\n"); } $ chmod +x test1_pgsql.pl ← test1_pgsql.plに実行権限の設定1行目はPerlの実行ファイルの絶対パスを指定します。whichなどのコマンドで調べて、各自の環境に合わせてください。5行目がデータベース名の指定、6行目がユーザ名の指定、7行目がテーブル名の指定、8行目がSQL文の指定で、11行目がデータベースに対して実際にSQL文を発行する部分です。
13〜18行目までが表示を行う部分になります。まず15〜18行目でループを行い、1行ずつfetchを行ってレコードを取得し、printで出力します。
Perlのプログラム(追加用) Pg.pm版
次に(コマンドベースで)レコード追加を行うサンプルプログラムtest2_pgsql.plについて説明します。
$ vi test2_pgsql.pl ← test2_pgsql.plの編集 #!/usr/bin/perl ← 環境に合わせる use Pg; $dbname = "addressdb"; $username = "postgres"; $tblname = "addrbook"; $sql = "insert into $tblname values('H.Takayanagi','070-1234-4321','H-Taka\@email.com')"; $conn = Pg::connectdb("dbname=$dbname user=$username"); #接続確認 if ($conn->status != PGRES_CONNECTION_OK) { print "データベースへの接続に失敗しました。\n"; # exit; } $res = $conn-> exec($sql); #コマンド実行確認 if ($res->resultStatus != PGRES_COMMAND_OK) { print "SQLコマンドの実行に失敗しました。\n"; # exit; } if ( $res -> resultStatus == PGRES_COMMAND_OK ) { print "データベースに追加されました。\n\n" } else { print "データベースの追加に失敗しました。\n\n" } #以下表示用 $sql2 = "select * from $tblname"; $res2 = $conn-> exec($sql2); print "name telno email\n"; print "--------------------------------------\n"; while(@item = $res2-> fetchrow) { print "@item[0] @item[1] @item[2]"; print ("\n"); } $ chmod +x test2_pgsql.pl ← test2_pgsql.plに実行権限の設定5行目まではtest1_pgsql.plと同じですが、6行目のSQL文の発行部分が異なる点に注目してください。また、“@”を入力するような場合は、“\”を使ってエスケープすることに注意してください(実際のデータに“\”は登録されません)。
13〜18行目はエラー処理を記述しています。処理がうまく実行できなかった場合は、resultStatusに“PGRES_COMMAND_OK”以外のステータスを戻してきます。
test2_pgsql.plを実行してから表示用のプログラムtest1_pgsql.plを実行すると、レコードの追加が行われているのが分かります
Perlのプログラム(表示用) DBI + DBD版
PerlでPostgreSQLに作成したデータベーステーブルの(コマンドベースで)表示を行うプログラムを作成してみます。以下は、先ほど作成したテーブルの内容を表示する簡単なプログラムのリストです。
$ vi test3_pgsql.pl ← test3_pgsql.plの編集 #!/usr/bin/perl ← 環境に合わせる use DBI; $dbname = "addressdb"; $username = "postgres"; $tblname = "addrbook"; $sql = "select * from $tblname"; $conn = DBI->connect("DBI:Pg:dbname=$dbname", $username); $res = $conn->prepare($sql); $st = $res->execute(); print "name telno email\n"; print "--------------------------------------\n"; while(@item = $res->fetchrow_array()) { print "@item[0] @item[1] @item[2]"; print ("\n"); } $res->finish; $conn->disconnect; $ chmod +x test3_pgsql.pl ← test3_pgsql.plに実行権限の設定10行目の詳細な記載方法は下記のとおりです。
$conn = DBI->connect("DBI:Pg:dbname=$dbname host=$host port=$port", "$user", "$pass");SQL文を用意し(大文字・小文字の区別はない)、「prepare()」でセットして、「execute()」で実行します。取得したデータは「fetchrow_array()」で1行ずつ取得します。戻り値に指定した配列に1行文のデータが格納されているので、取得できなくなるまでループさせます。データが1行しかないと分かっている場合は、ループさせる必要はない。
Perlのプログラム(追記用) DBI + DBD版
PerlでPostgreSQLに作成したデータベーステーブルに(コマンドベースで)追記を行うプログラムを作成してみます。以下は、先ほど作成したテーブルの内容に追記する簡単なプログラムのリストです。
$ vi test4_pgsql.pl ← test4_pgsql.plの編集 #!/usr/bin/perl ← 環境に合わせる use DBI; $dbname = "addressdb"; $username = "postgres"; $tblname = "addrbook"; $sql = "insert into $tblname values('S.Shirakawa','090-0000-6542','Shibakawa\@mailserver.net')"; $conn = DBI->connect("DBI:Pg:dbname=$dbname", $username); $res = $conn->prepare($sql); $st = $res->execute(); #以下、表示用 $sql2 = "select * from $tblname"; $res2 = $conn->prepare($sql2); $st = $res2->execute(); print "name telno email\n"; print "--------------------------------------\n"; while(@item = $res2->fetchrow_array()) { print "@item[0] @item[1] @item[2]"; print ("\n"); } $res->finish; $conn->disconnect; $ chmod +x test4_pgsql.pl ← test4_pgsql.plに実行権限の設定
●RubyとPostgreSQLの連携
RubyとPostgreSQLを接続するためには,
1. ruby-pg
2. Ruby/DBI
3. rubygem-pg(Fedora 20等)
のいずれかをインストールする必要があります。
1.を使用するには、「yum」コマンドを利用して「ruby-postgres」をインストールする方法及びRubyのアプリケーションやライブラリhttps://bitbucket.org/ged/ruby-pg/downloadsから「ruby-postgres-0.7.9.2008.01.28.tar.gz」をダウンロードし、インストールする方法があります。
・yumコマンドを利用する場合
# yum -y install ruby-postgres・ソースからインストールする場合
# cd /usr/local/src # tar zxvf ruby-postgres-0.7.9.2008.01.28.tar.gz # cd ruby-postgres # ruby extconf.rbこの時「ruby: No such file or directory -- extconf.rb (LoadError)」と表示された場合は
# ruby ext/extconf.rbを実行してください。さらに、「mkmf.rb can't find header files for ruby at /usr/lib/ruby/ruby.h」と表示された場合は、ruby-develをインストールしてください。
# yum -y install ruby-develPostgreSQLのインクルードファイル、ライブラリファイルのインストール場所をコンパイラが見付けることができない場合には以下を指定してください。
--with-pgsql-include-dir=<include file directory> --with-pgsql-lib-dir=<library directory>例えばこんな感じです
$ ruby ext/extconf.rb --with-pgsql-include-dir=/usr/local/pgsql/include --with-pgsql-lib-dir=/usr/local/pgsql/lib問題なければ下記のように表示されます。
# ruby ext/extconf.rb checking for main() in -lpq... yes checking for libpq-fe.h... yes checking for libpq/libpq-fs.h... yes checking for PQsetClientEncoding()... yes checking for pg_encoding_to_char()... yes checking for PQfreemem()... yes checking for PQserverVersion()... yes checking for PQescapeString()... yes checking for PQexecParams()... yes creating Makefileそして
# make # make installすれば完了です。
2.を使用するには、RubyForgeプロジェクトのRuby/DBIからダウンロードし、インストールします。Ruby DBIモジュールを使うが参考になります。
Ruby DBIモジュールのRPM版は無いようです・・。
$ cd /usr/local/src
$ wget http://rubyforge.org/frs/download.php/47537/dbi-0.4.1.tar.gz
$ tar zxvf dbi-0.4.1.tar.gz
$ cd dbi-0.4.1
$ ruby setup.rb config
$ ruby setup.rb setup
$ su
# ruby setup.rb install
上記の方法でDBIをインストールしてみましたが、「ruby setup.rb config」で「--with=dbi,dbd_pg」というオプションを指定することができず、うまく動作しませんでした。そこで、インターネット上で見つけた方法で、DBI等をインストールすることにしました。
postgres-0.7.9_extconf.rb.patch(結論からすると、このパッチは必要ありません)
postgres-0.7.9_postgres.c.patch(結論からすると、このパッチは必要ありません)
dbi-0.1.1_sql.rb.patch
$ cd /usr/local/src
$ tar zxvf ruby-postgres-0.7.9.2008.01.28.tar.gz
$ cd ruby-postgres/ext
$ patch extconf.rb < /usr/local/src/postgres-0.7.9_extconf.rb.patch ← 結論からすると、作業不必要
$ patch postgres.c < /usr/local/src/postgres-0.7.9_postgres.c.patch ← 結論からすると、作業不必要
$ ruby extconf.rb
$ make
makeすると「postgres.c:16:21: error ruby/io.h そのようなファイルやディレクトリはありません」と言うエラーが表示されましたので、rubyに関係するio.hを調べてみました。
/usr/local/src/ruby-1.8.7-p160/wince/io.hにありましたので、postgres.cを下記のとおり編集します。
$ vi postgres.c
#include "ruby/io.h" ← 編集前
#include "/usr/local/src/ruby-1.8.7-p160/wince/io.h" ← 編集後
makeしましたが、「・・・conflicting・・・」云々かんぬんとエラーが表示されましたので、「extconf.rb」及び「postgres.c」に対するパッチの摘要をやめ、通常の方法でインストールしました。
$ ruby extconf.rb
$ make
$ su
# make install
DBI(dbi-0.1.1.tar.gz)を、パッチを当てて普通にインストールします。このDBIはバージョン0.4.1より古いですが、DBD:Pgが同梱されています。
$ cd /usr/local/src $ wget http://rubyforge.org/frs/download.php/12368/dbi-0.1.1.tar.gz $ tar zxf dbi-0.1.1.tar.gz $ cd ruby-dbi $ patch lib/dbi/sql.rb < /usr/local/src/dbi-0.1.1_sql.rb.patch ↑ patchを適用しなくても動作する ($ ruby setup.rb config) ↑ このように実行した場合、DBI関連のドライバのみがインストール対象となります。 DBDドライバを追加インストールしたい場合、--with オプションにドライバの名前を列挙します。 例えば、DBIのメイン部分とPostgreSQLのDBDレベルのドライバをインストールするときは、次のようにします。 $ ruby setup.rb config --with=dbi,dbd_pg $ ruby setup.rb setup $ su # ruby setup.rb install実際の状況は下記のようになります。
$ ruby setup.rb config --with=dbi,dbd_pg
entering config phase...
config done.
$ ruby setup.rb setup
entering setup phase...
setting #! line to "#!/usr/bin/ruby"
setup.rb: skip bin/proxyserver(dbd_proxy) by user option
setup.rb: skip ext/dbd_sqlite(dbd_sqlite) by user option
setup.rb: skip ext/dbd_sybase(dbd_sybase) by user option
setup done.
$ su
# ruby setup.rb install
entering install phase...
mkdir -p /usr/local/bin
install sqlsh.rb /usr/local/bin
setup.rb: skip bin/proxyserver(dbd_proxy) by user option
mkdir -p /usr/local/lib/ruby/site_ruby/1.8/DBD/Pg
install Pg.rb /usr/local/lib/ruby/site_ruby/1.8/DBD/Pg/Pg.rb
mkdir -p /usr/local/lib/ruby/site_ruby/1.8/dbi
install row.rb /usr/local/lib/ruby/site_ruby/1.8/dbi
install version.rb /usr/local/lib/ruby/site_ruby/1.8/dbi
install utils.rb /usr/local/lib/ruby/site_ruby/1.8/dbi
install sql.rb /usr/local/lib/ruby/site_ruby/1.8/dbi
install trace.rb /usr/local/lib/ruby/site_ruby/1.8/dbi
install columninfo.rb /usr/local/lib/ruby/site_ruby/1.8/dbi
install dbi.rb /usr/local/lib/ruby/site_ruby/1.8
setup.rb: skip ext/dbd_sqlite(dbd_sqlite) by user option
setup.rb: skip ext/dbd_sybase(dbd_sybase) by user option
install done.
2014年10月現時点で、新しいOS(Fedora 20等)ではrubygem-pgを使用します。
# yum install rubygem-pgrubygem-pgを使用する場合、スクリプトを一部変更する必要があります。
require "postgres" ↓ require "rubygems" require "pg"変更後、実行すればrubyを使用してPostgreSQLに接続できるようになります。
サンプルデータベースの作成
データベースは、PerlとPostgreSQLとの連携で作成したものを使用します。
Rubyのプログラム(表示用) Pg版
RubyでPostgreSQLに作成したデータベーステーブルの(コマンドベースで)表示を行うプログラムを作成してみます。以下は、先ほど作成したテーブルの内容を表示する簡単なプログラムのリストです。
$ vi test1_pgsql.rb #!/usr/bin/ruby ← 環境に合わせる require "postgres" $hostname = "localhost" $port = 5432 $dbname = "addressdb"; $username = "postgres"; $sql = "select * from addrbook;" $encode = "UTF-8" conn = PGconn.connect($hostname, $port, "", "", $dbname, $username) ← 注意 conn.set_client_encoding($encode) #conn.query($sql).each do |row| # puts "#{row[0]} #{row[1]} #{row[2]}" #end #データ表示は、下記の書き方がスマート res = conn.exec($sql) rows = res.num_tuples cols = res.num_fields for i in 0..rows-1 do for j in 0..cols-1 do print res.getvalue(i,j)," " end print "\n" end conn.close注意:
conn = PGconn.connect("localhost", 5432, "", "", "addressdb", "postgres")
のように記載した場合、RubyはPerlと異なり、接続の際(上記「conn」の行)の「"localhost", 5432, "", "",」は省略できません。また、数字である「5432」を「"5432"」としてもいけません。どちらの場合もエラーが表示され、PostgreSQLに接続できません。
上記プログラムを実行すると、下記のような警告が表示される事があります(Ruby1.8.6で表示され、Ruby1.8.7では表示されませんでした)。
・・・warning: parenthesize arugument(s) for future versionこの場合は、「puts row.join ", "」を「puts row.join(", ")」に変更してください。
Perlからデータベースに接続できるのに、Rubyから接続すると下記のようなエラーが表示される場合があります
・・・:in `connect': FATAL: Ident authentication failed for user "postgres" (PGError)pg_logを見ると
FATAL: Ident authentication failed for user "postgres" LOG: could not connect to Ident server at address "::1", port 113: 接続が拒否されましたと記録されていました。これは、pg_hba.confを下記のように変更すると接続できるようになります。
# vi (postgresユーザのホームディレクトリ)/data/pg_hba.conf # IPv6 local connections: host all all ::1/128 ident sameuser ↓ 変更 host all all ::1/128 trust # service postgresql restart 設定変更反映のため再起動
Rubyのプログラム(追加用) Pg版
(コマンドベースで)データを追加するプログラムを紹介します。
$ vi test2_pgsql.rb #!/usr/bin/ruby ← 環境に合わせる require "postgres" $hostname = "localhost" $port = 5432 $dbname = "addressdb"; $username = "postgres"; $tblname = "addrbook" $sql = "select * from " + $tblname + ";" ← 注意 $encode = "UTF-8" # 表示メソッド def view(conn) res = conn.exec($sql) rows = res.num_tuples cols = res.num_fields for i in 0..rows-1 do for j in 0..cols-1 do print res.getvalue(i,j)," " end print "\n" end end conn = PGconn.connect($hostname, $port, "", "", $dbname, $username) conn.set_client_encoding($encode) begin # データの挿入 conn.exec("insert into " + $tblname + " (name,telno,email) values ('user1','user1','pass');") view(conn) # データの更新 # conn.exec("update " + $tblname + " set email = 'user1@mail1.dot.com' where name = 'user1';") # view(conn) # データの削除 # conn.exec("delete from " + $tblname + " where name = 'user1';") # view(conn) rescue => ex conn.exec("ROLLBACK;") print ex.message, "\n" ensure conn.close() end注意:
SQL文の記載方法は、
$sql = "select * from $tblname;"ではなく
$sql = "select * from " + $tblname + ";"のようにしなければエラーが表示されます。
Rubyのプログラム(表示用) DBI + DBD版
PerlでPostgreSQLに作成したデータベーステーブルの(コマンドベースで)表示を行うプログラムを作成してみます。以下は、先ほど作成したテーブルの内容を表示する簡単なプログラムのリストです。
$ vi test3_pgsql.rb #!/usr/bin/ruby ← 環境に合わせる require "dbi" $hostname = "localhost" $port = 5432 $dbname = "addressdb"; $username = "postgres"; $password = ""; $tblname = "addrbook" $sql = "select * from " + $tblname + ";" ← 注意 $encode = "UTF-8" dbh = DBI.connect("dbi:pg:" + $dbname + ":" + $hostname, $username, $password) sth = dbh.prepare($sql) sth.execute sth.each do |row| puts row.join ", " end #while row=sth.fetch do # p row #end sth.finish dbh.disconnect
Rubyのプログラム(追加用) DBI + DBD版
PerlでPostgreSQLに作成したデータベーステーブルの(コマンドベースで)表示を行うプログラムを作成してみます。以下は、先ほど作成したテーブルの内容を表示する簡単なプログラムのリストです。
$ vi test4_pgsql.rb #!/usr/bin/ruby ← 環境に合わせる require "dbi" $hostname = "localhost" $port = 5432 $dbname = "addressdb"; $username = "postgres"; $password = ""; $tblname = "addrbook" $sql = "select * from " + $tblname + ";" ← 注意 $encode = "UTF-8" dbh = DBI.connect("dbi:pg:" + $dbname + ":" + $hostname, $username, $password) sth = dbh.prepare($sql) sth.execute begin # データの挿入 dbh.do("insert into " + $tblname + " (name,telno,email) values ('user1','user1','pass');") # データの更新 # dbh.do("update " + $tblname + " set email = 'user1@mail1.dot.com' where name = 'user1';") # データの削除 # dbh.do("delete from " + $tblname + " where name = 'user1';") sth.each do |row| puts row.join ", " end rescue puts "transaction failed" dbh.rollback ensure sth.finish dbh.disconnect end
●データベースの作成
【PostgreSQL基本設定値】
設定項目 | 設定値 |
---|---|
データベース名 | auth |
ユーザID | myuser |
パスワード | mypass |
テーブル名 | city |
【cityテーブルスキーマ】
カラム名 | データ型 |
---|---|
country | varchar(20) |
capital | varchar(20) |
【cityテーブル挿入データ】
country | capital |
---|---|
Japan | Tokyo |
USA | NewYork |
上記データベースを作成します。
# su - postgres 補足:PostgreSQLサーバから切断方法 「\q」、「Control-D」のいずれかを入力します。 補足:接続に関する情報を知りたい バージョンを知るには $ psql( データベース名) postgres(または、データベース名)=# select version(); $ createdb auth ← データベース「auth」の作成 補足:データベースの所有者をpostgres以外で作成する方法 # su - postgres $ createdb -U postgres -O user_dev01 -E UTF8 database_dev01 ↑ 接続に使用するユーザ名「postgres」、データベースの所有者「user_dev01」、 データベースの文字コード「UTF8」でデータベース「database_dev01」を作成 結果は List of databases Name | Owner | Encoding -----------------+-------------+---------- database_dev01 | user_dev01 | UTF8 補足:postgres以外のデータベース所有者でテーブルを作成する方法 # su - postgres $ psql -U user_dev01 database_dev01 この時、「psql FATAL: Ident authentication failed for user "********"」 と表示される場合は、「pg_hba.conf」ファイルを編集(下記参照)してください。 database_dev01=> CREATE TABLE table_sample1(id int4); database_dev01=> INSERT INTO table_sample1 (id)values(1); database_dev01=> \d List of relations Schema | Name | Type | Owner --------+---------------+-------+------------ public | table_sample1 | table | user_dev01 (1 row) database_dev01=> select * from table_sample1; id ---- 1 (1 row) 補足:データベースの削除方法 $ dropdb データベース名; $ psql -l ← データベース「auth」が作成されているか確認 List of databases Name | Owner | Encoding -----------+----------+---------- postgres | postgres | UTF8 template0 | postgres | UTF8 template1 | postgres | UTF8 auth | postgres | UTF8 ← 作成されている (4 rows) $ psql auth ← データベース「auth」に接続 Welcome to psql 8.3.5, the PostgreSQL interactive terminal. Type: \copyright for distribution terms \h for help with SQL commands \? for help with psql commands \g or terminate with semicolon to execute query \q to quit auth=# create table city (country varchar(20), capital varchar(20)); ← テーブル「city」の作成 CREATE TABLE 補足:テーブルの削除方法 $ drop table テーブル名; auth=# \d ← テーブル「city」が作成されているか確認 List of relations Schema | Name | Type | Owner --------+------+-------+---------- public | city | table | postgres (1 row) auth=# \d city ← テーブル「city」のカラム定義の確認 table "public.city" Column | Type | Modifiers ---------+-----------------------+----------- country | character varying(20) | capital | character varying(20) | auth=# insert into city values ('JAPAN', 'TOKYO'); ← テーブルにデータの挿入 INSERT 0 1 auth=# insert into city values ('USA', 'NewYork'); ← テーブルにデータの挿入 INSERT 0 1 補足:複数行まとめてのデータの挿入 auth=# insert into city auth-# (country,capital) ← SQL文が続いている場合は「auth-#」となる auth-# values('JAPAN','TOKYO'), auth-# ('USA','NewYork'); ← データの作成 INSERT 0 2 補足:レコードの削除方法 auth=# delete from city where country='USA'; ← 「USA」レコードの削除 DELETE 1 auth=# delete from city; ← テーブル「city」の全レコード削除 auth=# select * from city; ← テーブル「city」の内容確認 country | capital ---------+--------- JAPAN | TOKYO USA | NewYork (2 rows) auth=# create user myuser with password 'mypass'; ← ユーザmyuser(パスワード:mypass)の作成 CREATE ROLE 補足:createuserコマンドで同上のことをする場合 $ createuser -P myuser Enter password for new role: ← パスワードの入力 Enter it again: ← パスワードの再入力 Shall the new role be a superuser? (y/n) n Shall the new role be allowed to create databases? (y/n) y Shall the new role be allowed to create more new roles? (y/n) n createuserコマンド実行時の質問は、それぞれ以下のことを確認しています。 * 新しいロールをスーパーユーザとするか * 新しいロールに対してデータベース作成を許可するか * 新しいロールに対してロール作成を許可するか 補足:ユーザの確認方法 $ psql # \du List of roles Role name | Superuser | Create role | Create DB | Connections | Member of -----------+-----------+-------------+-----------+-------------+----------- apache | no | no | no | no limit | {} postgres | yes | yes | yes | no limit | {} (2 rows) 補足:ユーザの削除方法 drop user myuser; ただし、下記の「grant」により権限を付与済みの場合は、 権限をすべて削除した後でなければユーザを削除することができません。 auth=# select usename from pg_user; ← ユーザの一覧表示 usename ---------- postgres myuser ← ユーザmyuserが作成されている (2 rows) auth=# grant select on city to myuser; ↑ テーブル「city」に対し、ユーザmyuserに参照のみのアクセス権を設定 GRANT 補足:アクセス権限の削除方法 auth=# revoke select on city from myuser; ↑ テーブル「city」に対し、ユーザmyuserから参照のアクセス権を削除 REVOKE auth=# \z ← 存在するオブジェクトに対し与えられた権限の表示 Access privileges for database "auth" Schema | Name | Type | Access privileges --------+------+-------+---------------------------------------------- public | city | table | {postgres=arwdxt/postgres,myuser=r/postgres} (1 row) 「Access privileges」に権限の状態が表示されています。「ロール名=権限/権限を与えたロール」の形で表示されます。 この場合でも所有者がデフォルトで持つ権限は表示されません。 各記号の意味は下記の通りです。 rolename=xxxx -- ロールに与えられた権限 =xxxx -- PUBLICに与えられた権限 r -- SELECT(読み取り(read)) w -- UPDATE(書き込み(write)) a -- INSERT (追加(append)) d -- DELETE x -- REFERENCES t -- TRIGGER X -- EXECUTE U -- USAGE C -- CREATE c -- CONNECT T -- TEMPORARY arwdxt -- 全ての権限(テーブル用) * -- 直前の権限に関するグラントオプション /yyyy -- この権限を付与したロール よって、「myuser=r/postgres」の意味は、「tmyuser」ロールに対して「postgres」ユーザが「SELECT」の権限が 与えれた、ということになります。 また「postgres=arwdxt/postgres」は「postgres」ロールが「全ての権限(テーブル用)」を持っている ことになります。 auth=# \q ← \qを入力して、データベースから切断 $ exit ← postgresからログアウト
●バックアップとリストアについて
PostgreSQLのデータベースをバックアップする手段は、主に3通りあります。
- PostgreSQLのダンプツールを利用する
- OSコマンドやサードパーティのバックアップツールを利用する
- PostgreSQLのPITR(Point In Time Recovery)機能を利用する
(1)PostgreSQLのダンプツール | (2)OSコマンド、 バックアップツール | (3)PITR | |
---|---|---|---|
PostgreSQL停止の必要性 | なし | あり | なし |
バックアップ・リストアの手順 | 単純 | 単純 | 複雑 |
リストア後のデータベースの状態 | バックアップ取得時点 | バックアップ取得時点 | 直前または任意の時点 |
マシン変更、メジャーバージョンアップへの利用 | 可能 | 不可能 | 不可能 |
バックアップファイルのサイズ比 | PostgreSQLのダンプツール<OSコマンド、 バックアップツール<PITR |
(1)PostgreSQLのダンプツールを利用したバックアップ
PostgreSQLのダンプツールには、pg_dump、pg_dumpallがあります。また、pg_dumpallで作成したアーカイブのリストアにはpg_restoreが用意されています。
データベースのバックアップを作成:pg_dump
PostgreSQLにはpg_dumpというデータベースをバックアップするコマンドがあります。pg_dumpを利用すると、データベースを運用中であってもバックアップを作成できます。
- pg_dumpの内部動作
そのため、ほかのユーザーによるデータベースへの読み書きをブロックすることなく、バックアップ開始時点における一貫性のあるバックアップを取得することが可能です。
pg_dumpの出力形式
出力形式はスクリプト形式とアーカイブ形式が選択できます。デフォルトはスクリプト形式で、バックアップ時のデータベースを復元するために必要なSQL文の羅列がプレーンテキストの形で出力されます。リストアはpsqlコマンドを使用します。
スクリプト形式の利点は、なんといってもプレーンテキストという点です。例えば、リストアの際にエラーが発生した場合、ファイルの中身を見てエラーの原因を探ることができますし、PostgreSQL固有のSQL文を多少編集すれば、ほかのデータベース製品にもリストアすることができます。
一方、アーカイブ形式はバイナリの形で出力されます。リストアはpsqlではなく、pg_restoreというリストア用のコマンドを使用します。アーカイブ形式の利点は、指定したテーブルのみといったように、データベースを部分的にリストアするなど、柔軟なリストアが可能になっている点です。そのかわり、バイナリのためファイルの中身を直接見たり編集したりすることはできません。また、アーカイブ形式には、custom形式とtar形式の2種類があり、custom形式はデフォルトで圧縮されるためファイルサイズが小さくなります。
なお、pg_dumpによって作成したバックアップファイルは、CPUアーキテクチャが異なるほかのマシンや、より新しいバージョンのPostgreSQLにもリストアすることができます。
pg_dumpの基本的な使用方法は次のとおりです。
$ pg_dump データベース名 > バックアップファイル名また、pg_dumpはローカル環境だけでなくリモート環境でも実行できます。
$ pg_dump -h ホスト名 -p ポート番号 データベース名 > バックアップファイル名リストアは次のように行います。
$ createdb データベース名 $ psql -f バックアップファイル名 データベース名上記はスクリプト形式でのバックアップ、リストアですが、アーカイブ形式でバックアップを行う場合は、-Fオプションを指定して実行します。
$ pg_dump -Fc データベース名 バックアップファイル名上の例で、cオプションはcustom形式を表し、代わりにt を指定するとtar形式になります。
アーカイブ形式のリストアは、pg_restoreを使用します。
$ pg_restore -C -d postgres バックアップファイル名-Cオプションを付けるとリストア前にデータベースを作成し、-dオプションは、その際に接続するデータベース名を指定します。そのため、-Cオプションと併用する場合は、接続さえできればどのデータベースでもかまいません。
以上が、pg_dumpを利用したバックアップ、リストア方法です。
pg_dumpは、データベース単位でバックアップを取得するコマンドですので、グローバルデータと呼ばれるロールやテーブルスペースなどの情報はバックアップされないことに注意してください。
データベースクラスタ全体のバックアップを作成:pg_dumpall
前述のように、pg_dumpコマンドではロールやテーブルスペースなどの情報はバックアップされません。これらの情報も含めてデータベースクラスタ全体をバックアップしたい場合は、pg_dumpallという便利なコマンドが用意されています。このコマンドは、-gオプションを指定して実行することで、グローバルデータのみをバックアップすることも可能です。
pg_dumpallの内部動作と出力
pg_dumpallは、内部動作としてはpg_dumpを呼び出しているため、ほぼ同じオプションを指定できます。ただし、出力形式を指定する-Fオプションは使えません。出力は常にスクリプト形式です。
pg_dumpallを使用すると、PostgreSQLを運用しているマシンの変更やPostgreSQLのバージョンアップを容易に行うことができます
pg_dump、pg_dumpallをcronで使う際の注意点
pg_dump、pg_dumpallは、cronなどを利用して定期的に実行されることが多いですが、その際、接続時にパスワードを設定していると、それらは実行時にパスワードの入力待ち状態になってしまいます。
これを防ぐには、コマンドを実行するユーザーのホームディレクトリに、以下の書式に従ってパスワードを記述したファイルを.pgpassという名前で配置しておいてください。そうすることで、パスワードはそのファイルに書かれているものが自動的に適用されるようになります。
ホスト名:ポート番号:データベース名:ユーザー名:パスワード
ただし、pg_dump、pg_dumpallでは、postgresql.confやpg_hba.confなどの設定ファイルはバックアップされないので注意が必要です。これらのファイルについては別途コピーする必要があります。これ以外のpg_dump、pg_dumpall、pg_restoreのオプションや詳細については、下記マニュアルを参照してください。
バックアップコマンドのマニュアル
バックアップコマンドのそのほかのオプションや詳細な使い方については下記日本語ドキュメントを参照ください(いずれも、NPO法人 PostgreSQLユーザ会Webサイト内掲載のオンラインマニュアル)。
- pg_dump: http://www.postgresql.jp/document/pg831doc/html/app-pgdump.html
- pg_dumpall: http://www.postgresql.jp/document/pg831doc/html/app-pg-dumpall.html
- pg_restore: http://www.postgresql.jp/document/pg831doc/html/app-pgrestore.html
(2)OSコマンド(rsyncなど)、バックアップツールによるバックアップ
OS側で用意されているコマンドやサードパーティ製のバックアップツールを利用したバックアップ方法は、PostgreSQLを停止してデータベースクラスタをコピーすれば完了です。リストアは、データベースクラスタのディレクトリを置き換えるだけです。この方法の利点は何といっても単純明快なことですが、以下の欠点があります。
- 一貫性を保ったバックアップを取得するために、PostgreSQLを停止しなければならない
- CPUアーキテクチャが異なる環境やメジャーバージョン(先頭2けた)が異なるPostgreSQLへはリストアできない
- バックアップファイルのサイズが、PostgreSQLのダンプツールを使用した場合に比べて大きくなりがち
rsyncによる差分バックアップ
rsync を利用する場合は、PostgreSQLを運用中にいったんrsyncを実行したうえでPostgreSQLを停止し、再度rsyncを実行する方法が多く取られます。2回目のrsyncは1回目のrsyncでコピーしたものの差分のみをコピーするため、コピー時間が短くなり、結果的にPostgreSQLの停止時間を最小限に抑えることができるからです。

図 rsyncによる差分バックアップの流れ
- バックアップ先は信頼できるメディアを
バックアップファイルはデータベースと別の信頼できるハードディスクに保存するか、テープなどのメディアに保存するよう検討してください。
(3)PITRによるバックアップ
記載は未定
●エラー対処
PerlプログラムでCan't locate (モジュール名) in @INCと出力された場合
% perl -le 'print for @INC' ← Perlのライブラリの検索PATHの確認
/usr/local/lib/perl5/5.8.8/BSDPAN
/usr/local/lib/perl5/site_perl/5.8.8/mach
/usr/local/lib/perl5/site_perl/5.8.8
/usr/local/lib/perl5/site_perl
/usr/local/lib/perl5/5.8.8/mach
/usr/local/lib/perl5/5.8.8
配列なので、プログラム中、
unshift @INC, '/home/user/lib/';の様に追加も可能。
また、-Iオプションを用いることにより、/home/user/libを検索PATHに加えたければ、
% perl -I /home/user/lib ./test1_pgsql.plの様に、実行時に指定も可能。
さらに環境変数PERL5LIBを用いれば、
% setenv PERL5LIB=/home/user/lib % perl -le 'print for @INC' /home/user/lib /usr/local/lib/perl5/5.8.8/BSDPAN /usr/local/lib/perl5/site_perl/5.8.8/mach /usr/local/lib/perl5/site_perl/5.8.8 /usr/local/lib/perl5/site_perl /usr/local/lib/perl5/5.8.8/mach /usr/local/lib/perl5/5.8.8の様に、予め指定しておく事もできます。
Perl-Pgプログラム実行時にデータベースと接続できない場合の疑うべき箇所
(postgresユーザのホームディレクトリ)/data/pg_logにあるログを調査します。
データベースに接続する際のユーザ名が「postgres」の場合、パスワードを設定しなくてもデータベースに接続することができます。それなのに、結果が表示されない場合は「FATAL: ユーザ"postgres"のIdent認証に失敗しました」というエラーが表示されているはずです。
これは「pg_hba.conf」の設定に問題がありますので、下記の通り修正します。
# vi (postgresユーザのホームディレクトリ)/data/pg_hba.conf #local all all ident ← コメントアウト local all all trust ← 追加 # service postgresql reload ← リロードこれでもまだ結果が表示されない場合は、PostgreSQLが起動しているかどうか、データベース接続ユーザ名、パスワードまたはデータベース名等が間違っていないか確認してください。
org.postgresql.util.PSQLException: FATAL: Ident authentication failed for user "postgres"
プログラム名:20:行数 `initialize': FATAL: ユーザ"postgres"のIdent認証に失敗しました (PG::ConnectionBad)
対処方法は下記をのように変更してください。
# vi (postgresユーザのホームディレクトリ)/data/pg_hba.conf ← 「pg_hba.conf」ファイルの編集 # "local" is for Unix domain socket connections only #local all all peer ← コメントアウト local all all trust ← 追加 # IPv4 local connections: #host all all 127.0.0.1/32 ident ← コメントアウト host all all 127.0.0.1/32 trust ← 追加 #local all all 127.0.0.1/32 trust # IPv6 local connections: #host all all ::1/128 ident ← コメントアウト host all all ::1/128 trust ← 追加
org.postgresql.util.PSQLException: FATAL: role "myuser" dose not exist
コンテキストファイルで設定したユーザ「myuser」が、PostgreSQLで作成されていない場合に表示されるエラーです。対処方法は下記を参照してください。
# su - postgres $ psql auth ← データベース「auth」に接続 auth=# create user myuser with password 'mypass'; ← ユーザmyuser(パスワード:mypass)の作成 auth=# grant select on city to myuser; ← ユーザmyuserに参照のみのアクセス権を設定
org.postgresql.util.PSQLException: ERROR: permision denied for relation city
コンテキストファイルで設定したユーザが、テーブル「city」への参照権がない場合に表示されるエラーです。テーブル「city」に対し、少なくとも「select」権限を与えてください。なお、テーブル「city」はデータベース「auth」に存在するものとします。
# su - postgres $ psql auth ← データベース「auth」に接続 auth=# grant select on city to myuser; ← ユーザmyuserに参照のみのアクセス権を設定
LOG: アドレス"127.0.0.1"、ポート113のIdentサーバに接続できませんでした: 接続を拒否されました
Ruby-Pgプログラムを実行時に、(postgresユーザのホームディレクトリ)/data/pg_logに下記のようなエラーが表示される場合があります。
LOG: アドレス"127.0.0.1"、ポート113のIdentサーバに接続できませんでした: 接続を拒否されました FATAL: ユーザ"postgres"のIdent認証に失敗しましたこの場合は、下記のようにしてください。
# vi (postgresユーザのホームディレクトリ)/data/pg_hba.conf #host all all 127.0.0.1/32 ident ← コメントアウト host all all 127.0.0.1/32 trust ← 追加 # service postgresql reload ← リロード