ラベル postgresql の投稿を表示しています。 すべての投稿を表示
ラベル postgresql の投稿を表示しています。 すべての投稿を表示

2009年10月19日月曜日

PostgreSQL:バージョンアップ時の仕様変更

PostgreSQLは、バージョンアップの際に互換性のない仕様変更が発生する場合があります。

ただし、元々アバウトであったデータ型の扱いが厳密になることが多いようで「本来エラーになるべきものが何故か動いていた」すなわち「期待される動作へと改善された」と言えるかもしれません。ここでは、特にSQL文の変更が発生したものを記録しておきます。

7.4 以降の int 型カラムの扱い

バージョン7.4以降では、int型カラムに対して「長さ0の文字列 ''」を格納することが出来なくなりました。not null 制約が付いてなければ、nullはOKです。

test=# \d inttest
    Table "public.inttest"
 Column |  Type   | Modifiers 
--------+---------+-----------
 id     | integer | 
 value  | text    | 

test=# insert into inttest (id, value) values (null, 'text');
 |=!|INSERT 0 1
test=# insert into inttest (id, value) values ('', 'text');
ERROR:  invalid input syntax for integer: ""
test=# 

8.3 以降の char 型カラムの扱い

char型カラムに対して数字で比較した際に、8.1.4ではエラーにならなかったSQL文が、8.3.0では(正しく)エラーになるようになりました。

test=# \d chartest
      Table "public.chartest"
 Column |     Type     | Modifiers
--------+--------------+-----------
 id     | integer      |
 value  | text         |
 flag   | character(1) |

test=#  select * from chartest where flag = 1;
ERROR:  operator does not exist: character = integer
LINE 1: select * from chartest where flag = 1;
                                          ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
test=#
8.1.4では、上記SQLがエラーにならず実行されます。

なお、私がこの仕様に気付いたのは環境を 8.1.4 から 8.3.0 にバージョンアップした際ですので、変更は 8.2 で加わったのかもしれません。しかしながら、その変更のタイミングを追う理由は特にありませんので「8.1.4 -> 8.3.0」として記録しておくことにします。

2009年10月18日日曜日

PostgreSQL8.4.1のインストール

最新版の PostgreSQL (8.4.1) をソースコードからインストールする機会がありましたので、手順を記録しておきます。基本的に、ドキュメント「第15章ソースコードからインストール」の手順にしたがって進めています。

必要なライブラリのインストール

今回は CentOS 5.3 を使用しました。configure 時に下記のライブラリを要求されますので、事前にインストールしておきます。

  • readline-devel
  • zlib-devel

postgresユーザとインストール先ディレクトリの作成

管理者アカウントであるpostgresユーザと、インストール先ディレクトリを作成します。ここでは gid, uid の指定はしませんでしたが、既存環境と合わせる必要がある場合は、-g, -u オプションで明示的に指定します。また、インストール先は /usr/local/pgsql とします。

# useradd postgres
# mkdir /usr/local/pgsql
# chown postgres. /usr/local/pgsql

インストールの実行

ここでは、ソースをビルドする作業ディレクトリを /usr/local/src/postgresql/ として作業します。confugure オプションは特に指定せず、デフォルトでインストールしました。

# mkdir /usr/local/src/postgresql/
# chown postgres. /usr/local/src/postgresql/
# su - postgres

$ cd /usr/local/src/postgresql/
$ wget http://www.ring.gr.jp/pub/misc/db/postgresql/source/v8.4.1/postgresql-8.4.1.tar.gz
$ tar zxvf postgresql-8.4.1.tar.gz
$ cd postgresql-8.4.1
$ ./configure
$ make
$ make install

環境変数の設定

postgres ユーザの .bashrc に、環境変数を設定します。

$ vi ~/.bashrc

 以下を記述:
 export PATH=$PATH:/usr/local/pgsql/bin:/usr/local/pgsql/lib
 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 ~/.bashrc

また、 ldconfig コマンドで実行時リンクの結合関係を設定しておくことで、パフォーマンスの改善が期待できます。CentOS5の場合、root 権限で以下を実行します。

# /sbin/ldconfig /usr/local/pgsql/lib

データベースクラスタの作成

postgres ユーザにて、データベースクラスタの作成を実行します。作成の実行後にデータベースの起動を確認します。

$ initdb
$ pg_ctl start
$ psql -l
        List of databases
     Name    |  Owner   | Encoding |  Collation  |    Ctype    |   Access privileges
  -----------+----------+----------+-------------+-------------+-----------------------
   postgres  | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 |
   template0 | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres
              : postgres=CTc/postgres
   template1 | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres
              : postgres=CTc/postgres
  (3 rows)
起動を確認したら、pg_ctl stop で停止しておきます。

起動スクリプトの設置

同梱の起動スクリプトを設置し、起動の設定をしておきます。

# cp /usr/local/src/postgresql/postgresql-8.4.1/contrib/start-scripts/linux /etc/init.d/postgresql
# chmod +x /etc/init.d/postgresql
# chkconfig --add postgresql
# chkconfig postgresql on
# chkconfig --list | grep postgresql

 postgresql      0:off   1:off   2:on    3:on    4:on    5:on    6:off
これでインストールが完了しました。

クライアント側のみのインストール

アプリケーションサーバとデータベースサーバを分離した構成にする場合、いままで私はクライアント側は通常インストールを実行していました(データベースクラスタは作成しない)。が、今回の作業でマニュアルに「クライアント側のみのインストール」の方法が記述してあることに気付きましたので、メモしておきます。

gmake -C src/bin install
gmake -C src/include install
gmake -C src/interfaces install
gmake -C doc install
http://www.postgresql.jp/document/pg841doc/html/install-procedure.html