- 追加された行はこの色です。
- 削除された行はこの色です。
*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のインストール
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を取るために
***logを取るために [#y15ebb7d]
postgresql.confで
#log_connections = false
log_connections = true
#log_timestamp = false
log_timestamp = true
#接続元のクライアントの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
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
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
''ここからが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 (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
\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簡単使用方法:https://wwwism.dyndns.org/hp/linux/sql.htm]]
[[''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
~ 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]]