デフォルトがUTF-8になっているのでEUCでDBを作成するには
$ createdb -E EUC-JP --locale=ja_JP.EUC_JP --template=template0 dcmap
とする。DB名 dcmap
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
の#(コメントアウトを外す)
postgresql.confで
#接続元のクライアントのIPアドレス、ポートがログに出力される #log_connections = false log_connections = true #log_timestamp = false log_timestamp = true
に変更する。
8.0からは
デフォルトではベースディレクトリ(/var/lib/pgsql/data)にサブディレクトリpg_logを作り、そこに出力するよう設定
offのままだとログファイルが重複したとき追記となる。 例えばlog_truncate_on_rotation = onにしてlog_filename = 'postgresql-%d.log'とすると毎日切り替わる1ヶ月で1周するローテーションになります。
両方設定するとどちらかを満たした時点でファイルが切り替わる どちらも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ではテーブル名、フィールド名に日本語が使用できる。
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でのデータベースのバックアップの取り方
・バックアップ
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にするとデータをインサートするごと番号を増やしてくれる。
テーブルを作成するときは
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)