Ruby on RailsのDBとして、PostgreSQLを使いたいので、セットアップします。
参考ページ
Linuxで自宅サーバー
データベースサーバー構築(PostgreSQL)
■CentOSにインストールされているPostgreSQLを確認
yumコマンドで確認してみる
[root@mycentos ~]#Installed Packages Name : postgresql Arch : x86_64 Version: 7.4.17 Release: 1.RHEL4.1 Size : 7.8 M Repo : installed Summary: PostgreSQL client programs and libraries. |
psqlコマンドでも確認してみる
[root@mycentos ~]# psql --version psql (PostgreSQL) 7.4.17 |
7.4.17がインストールされているようです。
現在(2007年8月17日)時点で、8.2.4が最新なのでそれにバージョンアップを試みる。
最新ソースは日本PostgreSQLユーザ会から取得できます。
■とりあえず7.4.17のPostgreSQLをセットアップしてみる
PostgreSQLを起動します
[root@mycentos ~]# service postgresql start Starting postgresql service: [ OK ] |
自動起動も設定しておく
[root@mycentos ~]# chkconfig postgresql on |
システム上のpostgresユーザのパスワードを設定
[root@mycentos ~]# passwd postgres Changing password for user postgres. New password: Retype new password: passwd: all authentication tokens updated successfully. |
PostgreSQL上のpostgresユーザのパスワードを設定
postgresユーザにスイッチする
[root@mycentos ~]# su - postgres -bash-3.00$ |
psqlコマンドでPostgreSQLに接続
-bash-3.00$ psql template1 Welcome to psql 7.4.17, 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 template1=# |
SQLでpostgresユーザのパスワードを設定する
;を忘れずにEnterするとパスワード設定完了
template1=# alter user postgres with password 'ひみつー'; ALTER USER |
PostgreSQLから接続を切断
template1=# \q |
PostgreSQL設定ファイルを編集して、リモートでpgAdminⅢを使って接続できるようにしてみる
まず、postgresql.confを編集し、TCP/IP経由でのデータベース接続許可する
viの使い方はviを使い倒そうで覚えました。
-bash-3.00$ vi /var/lib/pgsql/data/postgresql.conf |
tcpip_socket = falseの部分をコメントアウトしてtrueにする
#--------------------------------------------------------------------------- # CONNECTIONS AND AUTHENTICATION #--------------------------------------------------------------------------- # - Connection Settings - #tcpip_socket = false tcpip_socket = true |
次、pg_hba.confを編集し、リモートでの接続を許可する
-bash-3.00$ vi /var/lib/pgsql/data/pg_hba.conf |
ファイルの最後に以下を追加する。上から、ローカルからのアクセスは無条件に許可・内部からのアクセスは無条件に許可・上記以外からのアクセスはパスワード認証により許可
local all all trust host all all 127.0.0.1 255.255.255.255 trust host all all 0.0.0.0 0.0.0.0 password crypt |
これでPostgreSQLの設定はひとまず完了
ルートユーザに戻り、PostgreSQLを再起動する
-bash-3.00$ exit [root@mycentos ~]# service postgresql restart Stopping postgresql service: [ OK ] Starting postgresql service: [ OK ] |
リモートでpgAdminⅢを使って接続できたので、無事にセットアップできました。
pgAdminⅢの使い方は、GUIだし書かない。
あと、リモートでそのまま通信するのはセキュリティーとか不安なので、SSHを使ってポートフォアードなんてのを利用した。
PoderosaプラグインサイトのSSHのポートフォワーディングツールを使ってます。
あまりわかってないので詳しい話はできません。SSHポートフォワーディングによる接続を参考にしました。
■PostgreSQLをバージョンアップ
最新のPostgreSQLにバージョンアップします。7.4.17も少し動かしていたので、勉強もかねてバックアップをまず取ります。
コマンドは、pg_dumpall > ファイル名です
[root@mycentos ~]# su - postgres -bash-3.00$ pg_dumpall > postgresBK |
データが少ないから、すぐ終わった。できてるね。場所も覚えておこう。
-bash-3.00$ ls backups data initdb.i18n postgresBK -bash-3.00$ pwd /var/lib/pgsql -bash-3.00$ exit |
PostgreSQLを止めます
[root@mycentos ~]# service postgresql stop Stopping postgresql service: [ OK ] |
古いPostgreSQLを削除します。yumでインストールしているので、yumでアンインストールする
[root@mycentos ~]# yum remove postgresql |
途中で確認でとまるのでyを入力し、Enter。無事に削除できた。
Loading "fastestmirror" plugin Setting up Remove Process Resolving Dependencies --> Populating transaction set with selected packages. Please wait. ---> Package postgresql.x86_64 0:7.4.17-1.RHEL4.1 set to be erased --> Running transaction check Setting up repositories update 100% |=========================| 951 B 00:00 base 100% |=========================| 1.1 kB 00:00 ・ ・ ・ Install 0 Package(s) Update 0 Package(s) Remove 2 Package(s) Total download size: 0 Is this ok [y/N]: y Downloading Packages: Running Transaction Test Finished Transaction Test Transaction Test Succeeded Running Transaction Removing : postgresql-server ######################### [1/2] Removing : postgresql ######################### [2/2] Removed: postgresql.x86_64 0:7.4.17-1.RHEL4.1 Dependency Removed: postgresql-server.x86_64 0:7.4.17-1.RHEL4.1 Complete! |
postgresユーザを作成する。PostgreSQLのインストールはrootで行ってはいけないらしい
[root@mycentos postgresql-8.2.4]# groupadd postgres [root@mycentos postgresql-8.2.4]# useradd -g postgres postgres [root@mycentos postgresql-8.2.4]# passwd postgres Changing password for user postgres. New UNIX password:ひみつ Retype new UNIX password:ひみつ passwd: all authentication tokens updated successfully. |
wgetコマンドで最新バージョンをダウンロード
[root@mycentos ~]# su - postgres [postgres@mycentos ~]# wget ftp://ftp.jp.postgresql.org/source/v8.2.4/postgresql-8.2.4.tar.gz |
ソースの解凍、そしてできたディレクトリに移動します。
[postgres@mycentos ~]# tar zxvf postgresql-8.2.4.tar.gz ・ ・ ・ [postgres@mycentos ~]# cd postgresql-8.2.4 |
PostgreSQLをビルドします。
[postgres@mycentos postgresql-8.2.4]# ./configure --prefix=/usr/local/pgsql ・ ・ [postgres@mycentos postgresql-8.2.4]# make ・ ・ |
なんとか成功。./configureのオプションはいろいろ調べてけど、シンプルにprefixだけにしました。良くわかってないけど。
あと、./configure時に、readlineライブラリが無いよ!て怒られて困ったけど(readlineパッケージはインストール済みやったもん。。)
調べたところreadline-develもいるらしい。なのでyum install readline-develをしました。
checkinstallを使ってRPM化します。checkinstallの導入
[postgres@mycentos postgresql-8.2.4]# checkinstall ・ ・ Building file list...OKtar: /usr/src/redhat/SOURCES/postgresql-8.2.4.tgz: Cannot open: Permission denied ・ ・ |
あらら、権限がない。んーじゃrootでやるしかないのか。
[postgres@mycentos postgresql-8.2.4]# exit [root@mycentos ~]# cd /home/postgres/postgres-8.2.4 [root@mycentos postgresql-8.2.4]# checkinstall ・ ・ ・ ********************************************************************** Done. The new package has been saved to /usr/src/redhat/RPMS/x86_64/postgresql-8.2.4-1.x86_64.rpm You can install it in your system anytime using: rpm -i postgresql-8.2.4-1.x86_64.rpm ********************************************************************** |
とりあえずRPMの作成は成功。いけんのかね?
でまたしらべてみたら、インストールまではrootでもよぐねくねくね?BitArtsをみて続きをする。
rootのままパッケージをインストールする
[root@mycentos postgresql-8.2.4]# rpm -ivh /usr/src/redhat/RPMS/x86_64/postgresql-8.2.4-1. x86_64.rpm Preparing... ########################################### [100%] 1:postgresql ########################################### [100%] [root@mycentos postgresql-8.2.4]# |
あっさり。じゃー初期設定します。
データ保存用のディレクトリを作ります。
[root@mycentos postgresql-8.2.4]# cd /usr/local/pgsql [root@mycentos pgsql]# mkdir data [root@mycentos pgsql]# chown postgres:postgres data |
postgresユーザになってから、データ初期化コマンド実行
[root@mycentos pgsql]# su - postgres [postgres@mycentos ~]# /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data The files belonging to this database system will be owned by user "postgres". This user must also own the server process. The database cluster will be initialized with locale C. fixing permissions on existing directory /usr/local/pgsql/data ... ok ・ ・ copying template1 to postgres ... ok WARNING: enabling "trust" authentication for local connections You can change this by editing pg_hba.conf or using the -A option the next time you run initdb. Success. You can now start the database server using: /usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data or /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start |
データ初期化は成功したようです。pg_hba.confの編集をわすれるなよ。っていわれてます。あとでね。
postgresユーザの.bash_profileファイルにPATHを設定します。
[postgres@mycentos ~]# vi .bash_profile |
以下を追加しました。
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"
[postgres@mycentos ~]# cat .bash_profile # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/bin export PATH 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" unset USERNAME |
.bash_profileを反映します。再読込み。
[postgres@mycentos ~]# source ~postgres/.bash_profile |
データベースができるかな。
[postgres@mycentos ~]# pg_ctl start [postgres@mycentos ~]# createdb --encoding=UTF8 ERROR: database "postgres" already exists STATEMENT: CREATE DATABASE postgres ENCODING 'UTF8'; createdb: database creation failed: ERROR: database "postgres" already exists [postgres@mycentos ~]# psql Welcome to psql 8.2.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=# postgres=#\q [postgres@mycentos ~]# |
なんか既にありまっす。ていわれたので、そのまま接続。できた。
■じゃー8.2.4のPostgreSQLをセットアップしてみる
rootで、まず自動起動用スクリプトをコピーする
[root@mycentos ~]# cp /home/postgres/postgresql-8.2.4/contrib/start-scripts/linux /etc/rc.d/init.d/postgres |
作成したファイルに実行権をつけ、自動起動も設定しておく。
[root@mycentos ~]# chmod 755 /etc/rc.d/init.d/postgres [root@mycentos ~]# chkconfig postgres on |
PostgreSQL上のpostgresユーザのパスワードを設定
postgresユーザにスイッチし、psqlコマンドでPostgreSQLに接続後、パスワード設定する(7.4.17とはちょっと違うからね)
[root@mycentos ~]# su - postgres [postgres@mycentos ~]# psql template1 Welcome to psql 8.2.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 template1=# alter role postgres with password 'ひみつー'; template1=# \q |
次は、postgresql.confを編集し、TCP/IP経由でのデータベース接続許可する(7.4.17とはちょっと違うからね)
viの使い方はviを使い倒そうで覚えました。
[postgres@mycentos ~]# vi /usr/local/pgsql/data/postgresql.conf |
listen_addresses = '*'を追加する
#--------------------------------------------------------------------------- # CONNECTIONS AND AUTHENTICATION #--------------------------------------------------------------------------- # - Connection Settings - #listen_addresses = 'localhost' # what IP address(es) to listen on; listen_addresses = '*' # comma-separated list of addresses; # defaults to 'localhost', '*' = all |
次、pg_hba.confを編集し、リモートでの接続を許可する(7.4.17とはちょっと違うからね)
[postgres@mycentos ~]# vi /usr/local/pgsql/data/pg_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 host all all 0.0.0.0/0 password # IPv6 local connections: #host all all ::1/128 trust |
ルートユーザに戻り、PostgreSQLを再起動する
[postgres@mycentos ~]# exit [root@mycentos ~]# service postgres restart service postgres restart Restarting PostgreSQL: server stopped ok |
Autovacuumをお勧めします。とpgAdminⅢにいわれたので設定する
[root@mycentos ~]# su - postgres [postgres@mycentos ~]# vi /usr/local/pgsql/data/postgresql.conf |
stats_row_level = onにします
#--------------------------------------------------------------------------- # RUNTIME STATISTICS #--------------------------------------------------------------------------- # - Query/Index Statistics Collector - #stats_command_string = on #update_process_title = on #stats_start_collector = on # needed for block or row stats # (change requires restart) #stats_block_level = off #stats_row_level = off stats_row_level = on |
autovacuum = onにします。
#--------------------------------------------------------------------------- # AUTOVACUUM PARAMETERS #--------------------------------------------------------------------------- #autovacuum = off # enable autovacuum subprocess? autovacuum = on # 'on' requires stats_start_collector # and stats_row_level to also be on |
ルートユーザに戻り、PostgreSQLを再起動する。これでAutovacuumが有効になりました。
[postgres@mycentos ~]# exit [root@mycentos ~]# service postgres restart service postgres restart Restarting PostgreSQL: server stopped ok |
■バックアップデータを戻してみる
バックアップファイルをコピーしきて、リストアコマンドをたたく
[root@mycentos ~]# cd /var/lib/pgsql/ [root@mycentos ~]# cp postgresBK /home/postgres/postgresBK [root@mycentos ~]# su - postgres [postgres@mycentos ~]# psql -f postgresBK postgres You are now connected to database "template1". psql:postgresBK:11: ERROR: cannot delete from a view HINT: You need an unconditional ON DELETE DO INSTEAD rule. psql:postgresBK:13: NOTICE: SYSID can no longer be specified CREATE ROLE psql:postgresBK:20: ERROR: cannot delete from a view HINT: You need an unconditional ON DELETE DO INSTEAD rule. CREATE DATABASE You are now connected to database "template1". SET SET ・ ・ SET CREATE TABLE psql:postgresBK:131: NOTICE: CREATE TABLE will create implicit sequence "members_id_seq" for serial column "members.id" CREATE TABLE CREATE INDEX psql:postgresBK:169: NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index "members_pkey" for table "members" ALTER TABLE setval -------- 2 (1 row) SET COMMENT |
大事なデータじゃないし、なんかわからんけどOKとする。
無事リモートでも接続できた。SSHでもできた。