postgres7.0のインストール

更新日2012-02-10 (金) 11:56:51 更新日 2006/01/20

Vine6xでDBの作成

デフォルトがUTF-8になっているのでEUCでDBを作成するには

$ createdb -E EUC-JP --locale=ja_JP.EUC_JP  --template=template0 dcmap

とする。DB名 dcmap

postgres7.0のインストール

postgres7.0のインストール

$ cd /usr/local/src
$ tar zxvf postgresql-7.0.tar.gz
$ su
# chown -R postgres.postgres postgresql-7.0
# mkdir /usr/local/pgsql
# chown -R postgres.postgres /usr/local/pgsql
# exit
$ su postgres
$ cd postgresql-7.0/src
$ ./configure --enable-multibyte=EUC_JP --enable-syslog
($ ./configure --enable-multibyte=EUC_JP --enable-syslog --with-perl)
$ make
$ make install
(perlモジュールをインストールするときはsuしてインストールする必要がある。
     $ su
     # make install
     # chown -R postgres.postgres /usr/local/pgsql
)
$ cd ../doc
$ make install

.bash_profileに

   # PostgreQSL
   export PATH="$PATH":/usr/local/pgsql/bin
   export POSTGRES_HOME=/usr/local/pgsql
   export PGLIB=$POSTGRES_HOME/lib
   export PGDATA=$POSTGRES_HOME/data
   export MANPATH="$MANPATH":POSTGRES_HOME/man
   export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":"$PGLIB"

を追加。

   $ source .bash_profile

   $ initdb

   $ cd /usr/local/pgsql/data
   $ chmod 600 pg_hba.conf

pg_hba.confで   

 #host   all   0.0.0.0    0.0.0.0    trust

の#(コメントアウトを外す)   


logを取るために

postgresql.confで

#接続元のクライアントのIPアドレス、ポートがログに出力される 
#log_connections = false
log_connections = true
#log_timestamp = false
log_timestamp = true

に変更する。

8.0からは

  • log_truncate_on_rotation='stderr'
  • redirect_stderr = on
  • log_directoryにログを出力するディレクトリを指定する
    デフォルトではベースディレクトリ(/var/lib/pgsql/data)にサブディレクトリpg_logを作り、そこに出力するよう設定 
  • log_filenameに出力するログファイルのファイル名形式を設定 デフォルトではpostgresql-%Y-%m-%d_%H%M%S.log
  • log_truncate_on_rotation = on
    offのままだとログファイルが重複したとき追記となる。 
    例えばlog_truncate_on_rotation = onにしてlog_filename = 'postgresql-%d.log'とすると毎日切り替わる1ヶ月で1周するローテーションになります。 
  • log_rotation_age:単位分 log_rotation_size:単位KB
    両方設定するとどちらかを満たした時点でファイルが切り替わる 
    どちらも0(ゼロ)を設定すると無効となる 

これらのlogの動作について (--enable-syslog)
/usr/local/pgsql/data/postgresql.confの以下のパラメータを変更して、

$ /usr/local/pgsql/bin/postmaster -i -D /usr/local/pgsql/data >/var/log/  
postgresql.log 2>&1

で起動時

/usr/local/pgsql/data/postgresql.confに

log_connections = true

/var/log/postgresql.logに

LOG:  database system was interrupted at 2005-03-24 10:16:03 JST
LOG:  checkpoint record is at 0/9FC0F0
LOG:  redo record is at 0/9FC0F0; undo record is at 0/0; shutdown TRUE
LOG:  next transaction ID: 677; next OID: 25335
LOG:  database system was not properly shut down; automatic recovery in  progress
LOG:  record with zero length at 0/9FC130
LOG:  redo is not required

LOG:  database system is ready

/usr/local/pgsql/data/postgresql.confに
log_timestamp = trueを追加

2005-03-24 10:39:29 LOG:  could not create IPv6 socket: アドレスファミリはプロトコルによってサポートされていません
2005-03-24 10:39:29 LOG:  database system was interrupted at 2005-03-24  10:38:05 JST
2005-03-24 10:39:29 LOG:  checkpoint record is at 0/9FC170
2005-03-24 10:39:29 LOG:  redo record is at 0/9FC170; undo record is at 0/0;  shutdown TRUE
2005-03-24 10:39:29 LOG:  next transaction ID: 677; next OID: 25335
2005-03-24 10:39:29 LOG:  database system was not properly shut down; automatic
recovery in progress
2005-03-24 10:39:29 LOG:  record with zero length at 0/9FC1B0
2005-03-24 10:39:29 LOG:  redo is not required


2005-03-24 10:39:31 LOG:  database system is ready

のようなlogがのこる

syslogに残すには
syslog = 2とすると

/var/log/messagesに

Mar 24 10:40:24 vvine26r3 postgres[8729]: [1-1] LOG:  could not create IPv6 socket: アドレスファミリはプロトコルによってサポートされていません
Mar 24 10:40:24 vvine26r3 postgres[8733]: [2-1] LOG:  database system was interrupted at 2005-03-24 10:39:31 JST
Mar 24 10:40:24 vvine26r3 postgres[8733]: [3-1] LOG:  checkpoint record is at 0/9FC1B0
Mar 24 10:40:24 vvine26r3 postgres[8733]: [4-1] LOG:  redo record is at 0/9FC1B0; undo record is at 0/0; shutdown TRUE
Mar 24 10:40:24 vvine26r3 postgres[8733]: [5-1] LOG:  next transaction ID: 677;
next OID: 25335
Mar 24 10:40:24 vvine26r3 postgres[8733]: [6-1] LOG:  database system was not properly shut down; automatic recovery in progress
Mar 24 10:40:24 vvine26r3 postgres[8733]: [7-1] LOG:  record with zero length at 0/9FC1F0
Mar 24 10:40:24 vvine26r3 postgres[8733]: [8-1] LOG:  redo is not required
Mar 24 10:40:26 vvine26r3 postgres[8733]: [9-1] LOG:  database system is ready
                         ^^^^^^^^(A)

以下の接続logが取れないことがあるようだ?

Mar 24 10:41:06 vvine26r3 postgres[8736]: [2-1] LOG:  connection received:  host=[local] port=
Mar 24 10:41:06 vvine26r3 postgres[8736]: [3-1] LOG:  connection authorized: user=postgres database=test

syslog_ident = 'postgres'を設定するとsyslog(A)の部分が変わるがDefaultでpostgres なので変更の設定の必要はない。

/var/log/messages以外に全てのlogを取るには

syslog_facility = 'LOCAL0'を設定し

/etc/syslog.confを

*.info;mail.none;authpriv.none;cron.none;local0.none    /var/log/messages  [#g2b9f6a3]
                                         ^^^^^^^^^^^追加(LOCAL0のlogがmessagesに行かないように)
# PostgreSQL LOG
local0.*                                                /var/log/postgresql.log

のように変更。

とりあえずはsyslogを利用しなくてもいいかな・・・?

また、Logファイルははじめに以下のように作成しておく。

   # touch /var/log/postgresql.log
   # chown postgres.postgres /var/log/postgresql.log
   # chmod o-r /var/log/postgresql.log
   $ pg_ctl -w start
	または、
   $ /usr/local/pgsql/bin/postmaster -i -D /usr/local/pgsql/data >/var/log/postgresql.log 2>&1 &

このとき/tmp/.sPGSQL.5432 があると起動しないので消しておく

   $ IpcMemoryCreate: memKey=155356405 , size=24588 ,
   permission=448IpcMemoryCreate: shmget(..., create, ...) failed:
   Invalid argument

等のエラーのときはshardメモリの不足なためなので   $ postmastter -N 10 -S -i で起動してみる   

■ Apache DSO版の作成例(可能ならこれが一番ラク)

   先にDSO機能付きのApacheを作っておく。
   % tar xvzf apache_1.3.12.tar.gz
   % cd apache-1.3.12
   % ./configure --enable-shared=max
   % make
   % make install

ここからがPHP3

   % cd php-3.0.15-i18n-ja
   % ./configure --with-apxs=/usr/local/apache/bin/apxs --enable-i18n \
       --enable-mbregex --with-pgsql --enable-track-vars
   % make
   % make install
                        DE JE2ISM       2000/05/26

パスワード認証

pg_hba.conf

host    all         all         0.0.0.0           0.0.0.0           password

と設定する「password」だとクリアテキストだが「md5」だと暗号化され、こちらのほうが望ましい。

ユーザ(test)登録には

jtest=# CREATE USER test with PASSWORD '***';

ユーザ(test)削除には

jtest=# DROP USER test;

パスワード変更は

jtest=# ALTER USER test PASSWORD '***';

登録確認は

jtest=# select * from  pg_shadow;
 usename  | usesysid | usecreatedb | usesuper | usecatupd |                 passwd                | valuntil | useconfig
----------+----------+-------------+----------+-----------+-------------------------------------+----------+-----------
 postgres |        1 | t           | t        | t         |                                     |          |
 test     |      100 | f           | f        | f         | md5f7dc2e1****40bb8486274***88cc3c5 |          |
(2 rows)

ユーザにテーブルアクセスの権限を与える

$ psql データベース名

●特定のユーザに参照のみのアクセス権を設定/解除

psql# grant select on 表名 to ユーザ名;
psql# revoke select on 表名 from ユーザ名;

●すべてのユーザにすべてのアクセス権を設定/解除

psql# grant all on 表名 to public;
psql# revoke all on 表名 from public;

クライアントからのアクセスは

psql -h (host名) (DB名) (ユーザ名)

$ psql -h 10.99.99.106 jtest test
Password:*****
Welcome to psql 7.3.3, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help on internal slash commands
       \g or terminate with semicolon to execute query
       \q to quit

jtest=>

ユーザ名とDB名が同じときは

$ psql -h (host名) -U (ユーザ名orDB名)

で接続できる

$ psql -h (host名) (DB名)

だとユーザ名は今loginしているloginユーザ名になる。

ただし、pg_hba.confを

host    all         all         127.0.0.1         255.255.255.255   password

と設定してもlocalから接続するときはパスワードを聞かれない。(これでいいの?)

PHPからは

$passwd ="*****";
$user ="user1";
$conn = @pg_Connect("host=127.0.0.1 port=5432 password=$passwd  user=$user dbname=db");

でアクセスする。

参考

テーブル表示

qrp=# \d
            List of relations
 Schema |     Name     | Type  |  Owner
--------+--------------+-------+----------~
 public | t_data       | table | postgres
 public | t_kamokucode | table | postgres
 public | t_keyword    | table | postgres
(3 rows)~
~

フィールドの型表示

qrp=# \d t_data
                Table "public.t_data"
   Column   |            Type             | Modifiers
------------+-----------------------------+-----------~
 write_time | timestamp without time zone |
 gkno       | character varying(10)       |
 keyword    | character varying(10)       |
 data       | character varying(16)       |
 etc        | character varying(256)      |

動作しているデータベースにどのようなデータベースを定義したかどんなユーザ を定義したか表示させるには

$ psql postgres

データベース: select * from pg_database;

  datname  | datdba | encoding | datistemplate | datallowconn | datlastsysoid | datvacuumxid | datfrozenxid | datpath | datconfig |     datacl
-----------+--------+----------+---------------+--------------+---------------+--------------+--------------+---------+-----------+-----------------
 jtest     |      1 |        0 | f             | t            |         16974 |          427 |          427 |         |           |
 template1 |      1 |        0 | t             | t            |         16974 |          427 |          427 |         |           | {=,postgres=CT}
 template0 |      1 |        0 | t             | f            |         16974 |          427 |          427 |         |           | {=,postgres=CT}
 (3 rows)

ユーザ: select * from pg_user;

 usename  | usesysid | usecreatedb | usesuper | usecatupd |  passwd  | valuntil | useconfig
----------+----------+-------------+----------+-----------+----------+----------+-----------
 postgres |        1 | t           | t        | t         | ******** |          |
(1 row)

PostgreSQLではテーブル名、フィールド名に日本語が使用できる。

SQL文法

PostgreSQL簡単使用方法/SoftwareDesign 2007 7月号にMysqlとの比較が掲載参考になる

・2つのキーでソート

select * from table where sel1=23 and sel2 ='01' order by id1 desc, id2

第一のキーがid1,第二のキーがid2。この場合第一キーは降順。

・数値の大小でselect

select * from table where nedan >= 400;

・テーブル名の変更

ALTER TABLE 変更前テーブル名 RENAME TO 変更後テーブル名;

・フィールド名の変更

LTER TABLE テーブル名 RENAME COLUMN 変更前フィールド名 TO 変更後フィールド名;

・テーブル結合による抽出

# select * from t_montitle order by abs(t_montitle.id), t_montitle.id desc;
 id  |             mondai_title             | tantou  | kamoku_id | jikan | viewflag | etcflag
-----+--------------------------------------+---------+-----------+-------+----------+---------
   1 | 情報社会一般                         | okada   |         1 |     5  |        0 |       1
   2 | 情報活用モラル                       | okada   |         1 |     1 |       -1 |       0
# select * from t_kamoku;

 id | tantou  |      kamoku_name
----+---------+-----------------------
  1 | okada   | ビジコン
  3 | okada2  | 初級シスアド

上の2つのテーブルを結合してt_montitleのkamoku_idに一致したt_kamokuのidのkamoku_nameをフィールドに追加する

PostgreSQL7.1以降は以下の2つどちらでもOK (新しい表現)

#select t_montitle.*,t_kamoku.kamoku_name from t_montitle join t_kamoku on t_montitle.kamoku_id = t_kamoku.id order by abs(t_montitle.id), t_montitle.id desc

(古い表現:7.0以前はこちら)

#select t_montitle.*,t_kamoku.kamoku_name from t_montitle, t_kamoku where (t_montitle.kamoku_id = t_kamoku.id) order by abs(t_montitle.id), t_montitle.id desc

 id  |             mondai_title             | tantou  | kamoku_id | jikan |  viewflag | etcflag |      kamoku_name
-----+--------------------------------------+---------+-----------+-------+----------+---------+-----------------------
   1 | 情報社会一般                         | okada   |         1 |     5  |        0 |       1 | ビジコン
   2 | 情報活用モラル                       | okada   |         1 |     1 |       -1 |       0 | ビジコン

一時テーブルの作成
新しいテーブルをセッションが接続されている間だけ作られ、その後は消えるテーブル

CREATE TEMPORARY TABLE [一時テーブル名] as ([条件]);

CREATE TEMPORARY TABLE t_tmp as (select t_swlchk.id, t_swlchk.subitem, \ 
t_index.location from t_swlchk ,t_index where t_swlchk.key=t_index.key and \
t_swlchk.lflag='1' and t_swlchk.subitem!='Version' and \
t_swlchk.subitem!='ProductID');

その後は「select count(*),subitem,location from t_tmp where location='情報処理教 育センター' GROUP BY subitem,location order by subitem;」のように利用できる

データの集計
テーブルの中からsubitemをlocationが情報処理教育センターに一致するものを集計

# select count(*),subitem,location from t_tmp where location='情報処理教育センター' GROUP BY subitem,location order by subitem;
 count |                  subitem                   |       location
-------+--------------------------------------------+----------------------
     1 | ATOK 2005                                  | 情報処理教育センター
     1 | JUSTSYSTEMアプリケーションの追加と削除     | 情報処理教育センター
     1 | Microsoft Office Professional Edition 2003 | 情報処理教育センター
     1 | Microsoft Office Professional Plus 2007    | 情報処理教育センター
     1 | ウイルスバスター2007                       | 情報処理教育センター
     1 | ウイルスバスター2008                       | 情報処理教育センター
     3 | 秀丸エディタ                               | 情報処理教育センター
(7 行)

SELECTでレコード指定

上位3レコードを選択

select * from t_kamoku LIMIT 3 OFFSET 0;

3レコード目から4レコード取得

select * from t_kamoku LIMIT 4 OFFSET 2;

PostgreSQLのDataBaseのバックアップ

Postgresqlでのデータベースのバックアップの取り方

・バックアップ

       pg_dump -v (データベース名) > (バックアップファイル名)

       Ex) pg_dump -v yoyaku > /home/postgres/backup/yoyaku.dump

・リストア

       psql -e (データベース名) < (バックアップファイル名)

       Ex) psql -e yoyaku < /home/postgres/backup/yoyaku.dump

DE JE2ISM 2000/12

Serial型データの使い方

データ型をserialにするとデータをインサートするごと番号を増やしてくれる。

テーブルを作成するときは

create table t_seiseki1
(
        ID              serial,  <---ここ
        kamoku_ID       int4,

等で作成できる。

テーブル作成時 $ psql ismHTML < t_seiseki1.create

NOTICE:  CREATE TABLE will create implicit sequence "t_seiseki1_id_seq"  for "serial" column "t_seiseki1.id"
CREATE TABLE

というメッセージが出て目的のテーブル以外にserialを管理する
t_seiseki1_id_seq
というテーブルも自動に作成される。

テーブル削除については(postgresql-7.4.1)

ismHTML=# drop table t_seiseki1;

で、t_seiseki1_id_seq共に削除される。

(バージョンによっては drop sequence t_seiseki1_id_seq;とする必要がある)

また、phpでアクセスするには,このt_seiseki1_id_seqにも

ismHTML=# grant all on t_seiseki1_id_seq to www;

でアクセスできるようにする。

CSVファイルとしてインポートしたりしたときはシリアル管理に矛盾ができているため

ismHTML=# select setval('t_seiseki1_id_seq',max(id)) from t_seiseki1;
 setval
--------
      8
(1 row)

というコマンドでシリアル管理を実データにあわせる。
これは空テーブルCSVファイルをインポートしたときも必要。

新しいデータをインサートするには

ismHTML=# insert into t_seiseki1(kamoku_id, gkno) values(20, 'c99001');

のように、シリアルフィールドははずしてフィールド指定でインサートすると id(serial)は自動インクリメントしてくれる。入力データの無いフィールドは 外して挿入できる。

データを削除した場合はそのテーブルの最大値でなく管理テーブルのlast_value+1に なる。

次のシーケンス番号(このコマンドを実行すると番号が1づつ進む)

select nextval('t_test_id_seq');

現在シーケンス番号

select currval('t_test_id_seq');

の表示。ただし、currvalはnextvalを一度実行しておく必要がある。
テーブルの一部を別テーブルにコピー t_dataテーブルの一部をt_tmpにコピーする。この場合t_tmpは存在していては エラーするので事前にdrop table t_tmpをしておく

select * into t_tmp from t_data where no=3;

シーケンス番号の指定
一番目に設定するには次のように指定する。

dcmap=# select setval('t_dcmap_id_seq',1);
 setval
--------
      1
(1 row)

以下のようになり、last_valueが1になり次のデータに「1」が付くこのとき次に入力されたデータにはidが2になる。「0」はセットできないようので2からスタートになる。まああまり気にしないようにする。

dcmap=# select * from t_dcmap_id_seq ;
 sequence_name  | last_value | increment_by |      max_value      | min_value | cache_value | log_cnt | is_cycled | is_called
----------------+------------+--------------+---------------------+-----------+-------------+---------+-----------+-----------
 t_dcmap_id_seq |          1 |            1 | 9223372036854775807 |        1  |           1 |       0 | f         | t
(1 row)


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-02-10 (金) 11:56:51