*postgres7.0のインストール [#oa5f0388]
RIGHT:更新日&lastmod();
更新日 2006/01/20 

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

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

とする。DB名 dcmap

**postgres7.0のインストール [#g52b5ba7]

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を取るために [#y15ebb7d]

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

**パスワード認証 [#bdea2766]
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");
でアクセスする。

**参考 [#d0e2d7c8]

''テーブル表示''~
 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)

&color(red){PostgreSQLではテーブル名、フィールド名に日本語が使用できる。}; 
**SQL文法 [#hc4a6fa3]

[[''PostgreSQL簡単使用方法'':http://wwwism.dyndns.org/hp/linux/sql.htm]]/''SoftwareDesign 2007 7月号にMysqlとの比較が掲載参考になる''
[[''PostgreSQL簡単使用方法'':http://mz80.ism21.net/hp/linux/sql.htm]]/''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のバックアップ [#h83276d9]
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型データの使い方 [#kf8501bd]
データ型を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)



--------------------------------------------------------------------------------
RIGHT:[[元ページ:http://wwwism.dyndns.org/hp/linux/postgres.htm]]


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS