PostgreSQL

2008-04-04

[postgresql] やる夫がpostmaster起動に苦戦しているようです。

postmasterが立ち上がらない

一旦postmasterを停止して、再度立ち上げようとしたら、何故かpostmasterが立ち上がりません。下記のようなメッセージがでています。

$ /usr/local/pgsql/bin/pg_ctl -D /user/local/yaruo_db
pg_ctl: another postmaster may be running; trying to start postmaster anyway
2008-04-03 17:23:50 JST  [13176] FATAL:  lock file "postmaster.pid" already exists
2008-04-03 17:23:50 JST  [13176] HINT:  Is another postmaster (PID 17477) running in data directory "/user/local/yaruo_db"?
pg_ctl: could not start postmaster
Examine the log output.

$ psql
psql: FATAL:  the database system is shutting down
$ kill -9 17477
$ /usr/local/pgsql/bin/pg_ctl -D /user/local/yaruo_db start

メッセージとしては、既に立ち上がってない?という感じでしょうか・・・。の割にはpsqlでログインできない。良いか悪いかは別として、postmasterのプロセスが生きていたので、killして再度立ち上げました。

気がついたことといえば、DBへのコネクションがあるにも関わらず、ぶち切ってしまったのが問題のようです、各アプリケーションからのコネクションがある場合は、アプリケーション側を停止してから、postmasterを停止した方が良いです。

コネクションの確認は、”netstat”とかで確認できます。

$ netstat | grep ESTABLISHED
tcp        0      0 localhost:smux              localhost:32533             ESTABLISHED
tcp        0      0 localhost:32785             localhost:43162             ESTABLISHED
tcp        0      0 localhost:32793             localhost:43162             ESTABLISHED
tcp        0      0 localhost:32783             localhost:43162             ESTABLISHED
tcp        0      0 localhost:32781             localhost:43162             ESTABLISHED
tcp        0      0 localhost:41945             localhost:postgres

  • ESTABLISHED でgrepかけて、localhostsのみであれば、他からのアクセスはありません。

----------------------------------------

はじめてのPostgreSQLプログラミング
羽生 章洋 阪上 徹
ソフトバンククリエイティブソフトバンククリエイティブソフトバンククリエイティブ
定価 : ¥ 2,730
2001-10
amazonで詳しく見る

| | コメント (0) | トラックバック (0)

2008-04-03

[postgresql] やる夫がDB名を変更するようです。

DB名のリネーム

同じDBを違う用途で利用したり、世代管理したりすると思います。各DB毎に1台づつ物理サーバがあれば、よいですが検証環境等にそれほどコストを使うものではありません。1台の物理サーバに対していくつもDBを構築すると思います。そんなときに、DB名を変更したり良くすると思います。

だらだらと書いたけどたいしたこっちゃない。”RENAME TO”で変更可能です。下記例では”yaranaio_db”を”yaruo_db”に変更しています。

postgres=# \l
           List of databases
       Name      |  Owner   | Encoding
-----------------+----------+----------
postgres         | postgres | UTF8
template0        | postgres | UTF8
template1        | postgres | UTF8
yaranaio_db      | postgres | UTF8
(4 rows)

postgres=# ALTER DATABASE "yaranaio_db" RENAME TO "yaruo_db";
ALTER DATABASE
postgres=# \l
           List of databases
       Name      |  Owner   | Encoding
-----------------+----------+----------
postgres         | postgres | UTF8
template0        | postgres | UTF8
template1        | postgres | UTF8
yaruo_db         | postgres | UTF8
(4 rows)

PostgreSQLも別ポートで、DBを立ち上げることが出来るかもしれないが・・・(できないかも)。よくわかってません。とりあえずPostgreSQLのDBは別のdb_nameを与えて上げて管理しています。

この時ばかりはMySQLの方が、使い勝手が良いし構築も楽・・・。

----------------------------------------

オープンソースを使ったデータベースの構築―ApacheサーバとPostgreSQLでデータベース
藤田 泰徳 山崎 文則
セレンディップセレンディップセレンディップ
定価 : ¥ 3,675
2000-09
amazonで詳しく見る

| | コメント (0) | トラックバック (0)

2008-04-02

PostgreSQL リファレンス

インストール

パフォーマンスチューニング

SQL

こんなときどうする?

| | コメント (0) | トラックバック (1)

2008-03-24

[postgersql] やる夫がDBにアクセス制限をかけるようです。

アクセス制限をしてみる

DBへのアクセスは極力利用するサーバだけに絞った方がよいです。どっかのサーバのバッチ処理が悪さして~ってのを未然に防ぐことが出来ます。予め運用時には設定しておくことをお勧めします。

”/usr/local/yaruo/pg_data”にpostgresqlデータがあるものとします。更新の再には、リロードを必要とします。

# cd /usr/local/yaruo/pg_data
# vi hba.conf
-----
# "local" is for Unix domain socket connections only
#local all      all                               trust
# IPv4 local connections:
#host  all      all         127.0.0.1/32          trust
# IPv6 local connections:
#host  all      all         ::1/128               trust

# 192.168.2.0/24のアドレス帯のみアクセスを許可する。
host    all     all         192.168.2.0/24        trust
# yaruo_dbのみアクセスを許可する。
#host  yaruo_db all         0.0.0.0/0             password
-----
$ su - postgres
$ pg_ctl -D /usr/local/yaruo/pg_data reload

  • # はコメントアウトね・・・。

----------------------------------------

オープンソースを使ったデータベースの構築―ApacheサーバとPostgreSQLでデータベース
藤田 泰徳 山崎 文則
セレンディップセレンディップセレンディップ
定価 : ¥ 3,675
2000-09
amazonで詳しく見る

| | コメント (0) | トラックバック (0)

2008-03-19

[postgresql] やる夫がDB接続数を確認するようです。

接続数の確認方法について

DBに負荷がない場合は特に気にしなくてもよいのですが、現在の接続数とかが下記SQLで分かったりします。”IDLE”が多い場合は、特に問題はありません。”SELECT”が多い場合はちょっと要注意です。

スロークエリとかで引っ掛かったりすると”SELECT”が滞留し始めます。

         ____
       /      \  
     /  _ノ  ヽ、_  \     最近DBのアラームが多いお
    / o゚((●)) ((●))゚o \
    |     (__人__)    |  
    \     ` ⌒´     /
   /´           `\
  /  /          l  l   .___
__l  l_¶______/_/__/     ヽ
  \, ´-'ヽ  ̄| ̄ ̄ ̄ ̄|   l二二二二l
    ヾ_ノ   | '''' '   |   l二二二二l
   | 9=ε-8. | '''..--  |   l二二二二l:::..
   |   ..''  |  ''-.  ,|

# psql
postgres=# select * from pg_stat_activity;
datid | datname  | procpid | usesysid | usename  | current_query |     query_start     |    backend_start    |  client_addr | client_port
-------+----------+---------+----------+----------+---------------+---------------------+---------------------+--------------+------------
10793 | postgres |    9670 |       10 | postgres | <IDLE>        | 2008-03-19 10:14:45 | 2008-03-19 10:13:57 |              |          -1
16387 | postgres |    9893 |       10 | postgres | <IDLE>        | 2008-03-19 10:14:48 | 2008-03-19 10:14:46 | 127.0.0.1    |       48405



postgres=# \q

時間毎のログが出力されているので、こちらでも確認できます。”idle”や”select”をgrepしてみて下さい。下記例では3/19 10:25頃の接続数を調べています。”select”数が12と少なく、特にクエリが滞留していないことを意味しており、正常とみなすことが出来ます。

# cd /usr/local/yaruo/work/pg_stats/0319
# ls -l pg_stat_activity.0319_10*
-rw-r--r--  1 postgres postgres 236907  3月 19 10:00 pg_stat_activity.0319_1000
-rw-r--r--  1 postgres postgres 248545  3月 19 10:05 pg_stat_activity.0319_1005
-rw-r--r--  1 postgres postgres 330576  3月 19 10:10 pg_stat_activity.0319_1010
-rw-r--r--  1 postgres postgres 427956  3月 19 10:15 pg_stat_activity.0319_1015
-rw-r--r--  1 postgres postgres 257137  3月 19 10:20 pg_stat_activity.0319_1020
# grep -c -i idle pg_stat_activity.0319_1025
363

  • max_connections 512
  • ピーク時間帯の同時接続  300程度 を想定したものとします。

たぶんですが、この場合だと”select”数が100以上になると要注意かと思います。pqaでログとるとバコバコスロークエリが引っ掛かると思います。新たにindexの追加をするか、DBスキーマ変更した方がよいんじゃないかなぁ~?

----------------------------------------

オープンソースを使ったデータベースの構築―ApacheサーバとPostgreSQLでデータベース
藤田 泰徳 山崎 文則
セレンディップセレンディップセレンディップ
定価 : ¥ 3,675
2000-09
amazonで詳しく見る

| | コメント (0) | トラックバック (0)

2008-03-11

[postgresql] やる夫がmax_connectionsの設定をするようです。

max_connectionsについて

DBを守るための設定と思っています。簡単に言うと同時接続は50名までしか認めませんよっとかいう設定ができます。

Warning: Unable to connect to PostgreSQL server: FATAL: Non-superuser connection limit exceeded in /home/yaruo/neet.htm on line 123

上記エラーメッセージはmax_connectionsが足りないですと言っています。

     |┃三
     |┃
     |┃
 ガラッ. |┃  
     |┃  ノ//   ./ ̄ ̄ ̄ \
     |┃三    /  ::\:::/:::: \
     |┃     /  <●>::::::<●>  \  そろそろ接続してもよいかね?
     |┃     |    (__人__)     |  
     |┃三   \    ` ⌒´    /
     |┃三   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ \

max_connections設定方法

下記例では、”/home/yaruo/Data”配下にPostgreSQLデータがあるものとします。”max_connections”の変更の際には、pg_ctl reload を必要とします。

$ vi /home/yaruo/Data/postgresql.conf
-----
max_connections = 512
-----
$ /usr/local/pgsql/bin/pg_ctl reload

空けすぎるとDBに負担かかるし・・・。ちょうどよい値をチューニングしてみて下さい。

----------------------------------------

オープンソースを使ったデータベースの構築―ApacheサーバとPostgreSQLでデータベース
藤田 泰徳 山崎 文則
セレンディップセレンディップセレンディップ
定価 : ¥ 3,675
2000-09
amazonで詳しく見る

| | コメント (0) | トラックバック (0)

2008-03-04

[postgersql] やる夫はsql結果の実行時間を出力させたいようです。

SQL結果の実行時間について

例えば、メンテナンス時にDB作業にどれくらいの時間がかかるかリハーサルテストをしたりすると思います(普通はします)。linuxのコマンド上で実施するなら、”time”コマンドを付けてやればよい。では、postgreSQLにログインした状態で、実行時間はどうやって算出すればよいでしょうか?

下記に実行例を記載いたします。”\timing”コマンドを打ってあげればよいだけです。

         ____
       /      \  
     /  _ノ  ヽ、_  \   DBデータ量が多いから、リハだけで
    / o゚((●)) ((●))゚o \      5時間も使ってしまうお・・・。
    |     (__人__)    |  
    \     ` ⌒´     /
   /´           `\
  /  /          l  l   .___
__l  l_¶______/_/__/     ヽ
  \, ´-'ヽ  ̄| ̄ ̄ ̄ ̄|   l二二二二l
    ヾ_ノ   | '''' '   |   l二二二二l
   | 9=ε-8. | '''..--  |   l二二二二l:::..
   |   ..''  |  ''-.  ,|

   / ̄ ̄\
 / ノ  \ \
 |  (●)(●) |
. |  (__人__)  |   まぁcronとか仕掛けて気長にリハ時間算出して下さい
  |   ` ⌒´  ノ 
.  |         }
.  ヽ        }
   ヽ     ノ        \
   /    く  \        \
   |     \   \         \
    |    |ヽ、二⌒)、          \

$ psql
Welcome to psql 8.1.4, the PostgreSQL interactive terminal.

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

postgres=# \timing
Timing is on.
postgres=# select neet_name from yaruo_tb;
      neet_name
---------------------
yaruo
yaranaio
owata
(3 rows)

Time: 2.445 ms

----------------------------------------

オープンソースを使ったデータベースの構築―ApacheサーバとPostgreSQLでデータベース
藤田 泰徳 山崎 文則
セレンディップセレンディップセレンディップ
定価 : ¥ 3,675
2000-09
amazonで詳しく見る

| | コメント (0) | トラックバック (0)

2008-01-07

[postgresql] やる夫がデータベースを削除するようです。

postgresql データベース削除

$ dropdb [database name]

オプションとかは知りません。コレだけだと寂しいので削除例を・・・。
       ____
     /ノ   ヽ、_\
   /( ●)}liil{(●)\
  /    (__人__)   \   やらない夫まじムカつくお!
  |   ヽ |!!il|!|!l| /   |             削除してやんよ!
  \    |ェェェェ|     /

$ psql
Welcome to psql 8.1.4, the PostgreSQL interactive terminal.

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

postgres=# \l
               List of databases
          Name          |  Owner   | Encoding
------------------------+----------+----------
postgres                | postgres | UTF8
template0               | postgres | UTF8
template1               | postgres | UTF8
yaranaio_db             | postgres | UTF8

(4 rows)

  • \l はデータベース一覧表示

”yaranaio_db”というデータベースを削除してみます。

$ dropdb yaranaio_db
$ psql
Welcome to psql 8.1.4, the PostgreSQL interactive terminal.

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

postgres=# \l
               List of databases
          Name          |  Owner   | Encoding
------------------------+----------+----------
postgres                | postgres | UTF8
template0               | postgres | UTF8
template1               | postgres | UTF8

(3 rows)

----------------------------------------

オープンソースを使ったデータベースの構築―ApacheサーバとPostgreSQLでデータベース
藤田 泰徳 山崎 文則
セレンディップセレンディップセレンディップ
定価 : ¥ 3,675
2000-09
amazonで詳しく見る

| | コメント (0) | トラックバック (0)

[postgresql] やる夫がvacuumで苦戦しているようです。

VACUUM について

PostgreSQLの特徴として、追記型アーキテクチャを利用しています。更新・削除時には、以前のデータを残したまま、新しいデータを末尾に追記します。更新・削除が頻繁に行われると、必要としないデータのゴミが蓄積されます。このデータベースの不要領域を回収するのに、VACUUMが用いられます。VACUUMを定期的に行わないとパフォーマンスが悪くなります。
         ____
       /      \  
     /  _ノ  ヽ、_  \ 
    / o゚((●)) ((●))゚o \  Vacuumしないと
    |     (__人__)    |      レスポンスが悪化するお
    \     ` ⌒´     /
   /´           `\
  /  /          l  l   .___
__l  l_¶______/_/__/     ヽ
  \, ´-'ヽ  ̄| ̄ ̄ ̄ ̄|   l二二二二l
    ヾ_ノ   | '''' '   |   l二二二二l
   | 9=ε-8. | '''..--  |   l二二二二l:::..
   |   ..''  |  ''-.  ,|
     ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄     

$ vacuumdb -avz > /usr/local/postgres/work/vacuum.log.20071114 2>&1

  • -a オプションは全てのデータベースをVacuumします。
  • -v オプションは処理実行中に詳細な情報を表示します。
  • -z オプションはデータベースの統計情報を計算します。

$ tail -f /usr/local/postgres/work/vacuum.log.20071114 2>&1
-----
vacuumdb: vacuuming of database “postgres” failed: ERROR: out of memory
-----

メモリーエラーになってます。”postgresql.conf” の” maintenance_work_mem ”値を変更してやる必要があります。恐らく多くとりすぎたか?256MBくらいが、適当と思われます。

$ vi /usr/local/postgres/PGData/postgresql.conf
-----
maintenance_work_mem = 262144
-----

----------------------------------------

オープンソースを使ったデータベースの構築―ApacheサーバとPostgreSQLでデータベース
藤田 泰徳 山崎 文則
セレンディップセレンディップセレンディップ
定価 : ¥ 3,675
2000-09
amazonで詳しく見る

| | コメント (0) | トラックバック (0)

2007-12-27

[postgresql] やる夫がpqaでスロークエリを見やすくするようです。

pqa コマンド

pqaとは、postgreslogを見やすくするツールです。rubyで書かれているようです。postgreslogは、スロークエリー情報を記載したログで、postgresql.confの設定で" 出力情報を変えることが出来ます。

         ____
       /      \  
     /  _ノ  ヽ、_  \ 
    / o゚((●)) ((●))゚o \  
    |     (__人__)    |   一向にスロークエリが改善されないお
    \     ` ⌒´     /
   /´           `\
  /  /          l  l   .___
__l  l_¶______/_/__/     ヽ
  \, ´-'ヽ  ̄| ̄ ̄ ̄ ̄|   l二二二二l
    ヾ_ノ   | '''' '   |   l二二二二l
   | 9=ε-8. | '''..--  |   l二二二二l:::..
   |   ..''  |  ''-.  ,|

postgresql.conf 設定

デフォルトの設定だとスロークエリとして、ログに出力されない場合がある・・・。もとい何秒以上かかったクエリをログとして出力するように、”postgressql.conf”に記載されています、デフォルトは確か”6000msec”だった気がします。閾値は状況に応じて編集する必要があります。下記は”15000msec”に設定しています。postgresqlのデータディレクトリは”/usr/local/PGData”とします。

# vi /usr/local/PGData/postgresql.conf
-----
log_min_duration_statement = 1500000    # slowestquery 1500sOver
-----

# su - postgres
$ /usr/local/pgsql/bin/pg_ctl reload

  • 設定後は、pgctl reloadを必要とします(サービスが止まるわけではない)。

pqa ログ出力

# pqa -logtype pglog -file postgresql-Wed.log
# pqa -logtype pglog -file postgresql-Wed.log > /home/bin/postgresql.20070124.log

  • こんな感じで・・・。

ログ内容

######## Overall statistics <-- 一番長い時間のかかったクエリTime
1 queries (1 unique), longest ran in 2070.645574 seconds), parsed in 0.234787 seconds
######## Queries by type
######## Queries that took up the most time <-- 遅いクエリ一覧
2070.646 seconds: COPY public.mt_hogehoge (hogehoge_id, hogehoge_type, hogehoge_user_id, hogehoge_data) TO stdout;
######## Slowest queries
2070.646 seconds: COPY public.mt_hogehoge (hogehoge_id, hogehoge_type, hogehoge_user_id, hogehoge_data) TO stdout;
######## Most frequent queries <-- 良く使われるクエリです。
1 times: COPY public.mt_hogehoge (hogehoge_id, hogehoge_type, hogehoge_user_data TO stdout;

----------------------------------------

オープンソースを使ったデータベースの構築―ApacheサーバとPostgreSQLでデータベース
藤田 泰徳 山崎 文則
セレンディップセレンディップセレンディップ
定価 : ¥ 3,675
2000-09
amazonで詳しく見る

| | コメント (0) | トラックバック (0)

[postgresql] やる夫がDBのユーザ管理をするようです。

postgresql ユーザ追加

今回は”user”というpostgresアカウントを作成して、権限を追加する手順を記します。全ての権限を与えてしまっても良いかな~と思います(責任はとらんよ)。

         ____
       /      \  
     /  _ノ  ヽ、_  \ 
    / o゚((●)) ((●))゚o \  早く帰ってニコニコで
    |     (__人__)    |        ウッーウッーウマウマ(゚∀゚)したいお・・・
    \     ` ⌒´     /
   /´           `\
  /  /          l  l   .___
__l  l_¶______/_/__/     ヽ
  \, ´-'ヽ  ̄| ̄ ̄ ̄ ̄|   l二二二二l
    ヾ_ノ   | '''' '   |   l二二二二l
   | 9=ε-8. | '''..--  |   l二二二二l:::..
   |   ..''  |  ''-.  ,|
     ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  

$ createuser -P --no-adduser --no-createdb user
Enter password for new role:
Enter it again:
Shall the new role be allowed to create more new roles? (y/n) y
CREATE ROLE

ユーザ情報確認

# su - postgres
$ psql -d user
postgres=# select usename, passwd from pg_shadow;
  usename  |               passwd
-----------+-------------------------------------
postgres   | md53175bce1d3201d16594cebf9d7eb3f9d
user       | md56d7f7b5139f0bfc1d8cf87392ed32506
(2 rows)
  • 上記手順で追加した”user”が確認できる筈。

ユーザ権限追加

$ psql -d user
user=# grant ALL on table mt_starter_session to user;
  • 全ての権限を与えた状態にしてます。

| | コメント (0) | トラックバック (0)

2007-12-20

やる夫がpostgresql-8.1.4 をインストールするようです。

postgreSQL user group の作成

# /usr/sbin/groupadd -g 1001 postgres
# /usr/sbin/useradd -g 1001 -u 1001 postgres
# /usr/bin/passwd postgres

postgreSQL インストール

ファイルのダウンロード

下記URLより、ファイルを取得して下さい。今回はソースファイルからコンパイルする方法でインストールします。特に意味は無いですが、rpmの方が楽かと思います。

http://www.postgresql.org/ftp/source/

# md5sum postgresql-8.1.3.tar.gz
MD5 (postgresql-8.1.4.tar.gz) = 2717019b3626f7420a54c25c2e83231c

  • MD5 ダウンロードしたファイルの正当性を検証するためのチェックサムファイル。

コンパイル+インストール

$ su postgres
$ gzip postgresql-8.1.4.tar.gz
$ tar -xvf postgresql-8.1.4.tar
$ ./configure
$ gmake
$ gmake check
$ exit
# gmake install
# cd /usr/local
# chown -R postgres:postgres pgsql

  • わざわざ”postgres”にならなくても問題ないと思った・・・

initdb

新しいPostgreSQLのデータベースクラスタの作成

# su - postgres
$ /usr/local/pgsql/bin/initdb --no-locale --encoding UNICODE -D /usr/local/PGData

おまけ

上記手順でインストールは完了です。DBを操作していく上で下記エラーが出た場合の対処方法を記します。予めインストールしておいた方が良いかもしれませんね。

ERROR:  could not access file libdir/dbsize    <-- (*1)
ERROR:  could not access file libdir/pgstattuple.so    <--(*2)   
ERROR:  could not load library pgstattuple.so

  • (*1) データ領域を調べるために必要なライブラリが無いため発生したエラー

# cd /usr/local/postgres/postgresql-8.1.4/contrib/dbsize
# gmake
# gmake install

  • (*2) pgstattuple ライブラリが無いため発生したエラー

# cd /usr/local/postgres/postgresql-8.1.4/contrib/
# make && make install

| | コメント (0) | トラックバック (0)