*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]]