PostgreSQL

作成日:2017-05-02
最終更新日:

VineLinux での PostgreSQL

今、私は VineLinux 6.5 の Synaptic パッケージマネージャを見ている。 これによれば、PostgreSQL 関係でインストールされているのは次のとおりである。 postgresql, postgresql-contrib, postgres-devel, postgres-doc, postgresql-libs, postgresql-pl, postgres-server, postgres-tcl。 以上のバージョンはすべて 9.0.23-1vl6 である。 また、postgresql-jdbc は 9.0.801-1vl6 だった。 あるアプリケーション(Ruy on Rails だったかな)では、 postgresql は 9.1 以上でないといけないから困った。 こうなったら、消すことにする。

まず、Synaptic パッケージマネージャでこれらのパッケージを削除指定する。 こんなメッセージが出る。

インストール準備中に:
/sbin/ldconfig: /usr/lib/libbrscandec2.so.1 はシンボリックリンクではありません
/sbin/ldconfig: /usr/lib/libbrcolm2.so.1 はシンボリックリンクではありません

次に、rpm インストーラを使う。Vine では、 http://ftp.jaist.ac.jp/pub/Linux/Vine/VineSeed/x86_64/RPMS.plus に次のファイル群があるのでダウンロードする。

postgresql-9.5.2-1vl7.x86_64.rpm	2016-04-01 12:32 	1.3M	 
postgresql-contrib-9.5.2-1vl7.x86_64.rpm	2016-04-01 12:32 	621K	 
postgresql-devel-9.5.2-1vl7.x86_64.rpm	2016-04-01 12:32 	786K	 
postgresql-docs-9.5.2-1vl7.x86_64.rpm	2016-04-01 12:32 	2.7M	 
postgresql-jdbc-9.0.801-1vl6.x86_64.rpm	2011-04-12 22:36 	1.2M	 
postgresql-pl-9.5.2-1vl7.x86_64.rpm	2016-04-01 12:32 	186K	 
postgresql-server-9.5.2-1vl7.x86_64.rpm	2016-04-01 12:32 	3.9M	 
postgresql-static-9.5.2-1vl7.x86_64.rpm	2016-04-01 12:32 	52K	 
postgresql-tcl-9.5.2-1vl7.x86_64.rpm	2016-04-01 12:32 	32K	 

認証エラーが発生しました。

仕方がない。コマンドラインで行う。

$ cd ~/rpm/RPMS.plus

$ sudo rpm -ivh *.rpm

エラー: 依存性の欠如:
	postgresql-jdbc < 9.5 は postgresql-9.5.2-1vl7.x86_64 と競合します。
	perl-DBD-Pg は postgresql-contrib-9.5.2-1vl7.x86_64 に必要とされています
	libtcl8.5.so()(64bit) は postgresql-pl-9.5.2-1vl7.x86_64 に必要とされています

postgresql-jdbc < 9.5 が postgresql-9.5.2-1vl7.x86_64 と競合するのなら、 postgresql-jdbc < は当面入れられないな。 それから、postgresql-(contrib|pl)-9.5.2-1vl7.x86_64 で必要とされている、 というのなら、次の 3 つはあとまわしでいいや。

ちなみに、postgresql 関係のパッケージは次の通り。

postgresql-9.5.2-1vl7.x86_64.rpm	2016-04-01 12:32 	1.3M	 
postgresql-contrib-9.5.2-1vl7.x86_64.rpm	2016-04-01 12:32 	621K	 
postgresql-devel-9.5.2-1vl7.x86_64.rpm	2016-04-01 12:32 	786K	 
postgresql-docs-9.5.2-1vl7.x86_64.rpm	2016-04-01 12:32 	2.7M	 
postgresql-jdbc-9.0.801-1vl6.x86_64.rpm	2011-04-12 22:36 	1.2M	 
postgresql-pl-9.5.2-1vl7.x86_64.rpm	2016-04-01 12:32 	186K	 
postgresql-server-9.5.2-1vl7.x86_64.rpm	2016-04-01 12:32 	3.9M	 
postgresql-static-9.5.2-1vl7.x86_64.rpm	2016-04-01 12:32 	52K	 
postgresql-tcl-9.5.2-1vl7.x86_64.rpm	2016-04-01 12:32 	32K	 

では入れてみることにしよう。

$ sudo rpm -ivh postgresql-9.5.2-1vl7.x86_64.rpm
準備中...                ########################################### [100%]
   1:postgresql             ########################################### [100%]
$ sudo rpm -ivh postgresql-devel-9.5.2-1vl7.x86_64.rpm
エラー: 依存性の欠如:
	postgresql-static = 9.5.2 は postgresql-devel-9.5.2-1vl7.x86_64 に必要とされています
$

まいったな。s で始まるものは一度にいれよう。

$ sudo rpm -ivh postgresql-s*-9.5.2-1vl7.x86_64.rpm
準備中...                ########################################### [100%]
   1:postgresql-server      ########################################### [ 50%]
/sbin/ldconfig: /usr/lib/libbrscandec2.so.1 はシンボリックリンクではありません
/sbin/ldconfig: /usr/lib/libbrcolm2.so.1 はシンボリックリンクではありません
   2:postgresql-static      ########################################### [100%]
$ sudo rpm -ivh postgresql-d*-9.5.2-1vl7.x86_64.rpm
準備中...                ########################################### [100%]
   1:postgresql-devel       ########################################### [ 50%]
   2:postgresql-docs        ########################################### [100%]
$ sudo rpm -ivh postgresql-t*-9.5.2-1vl7.x86_64.rpm
準備中...                ########################################### [100%]
   1:postgresql-tcl         ########################################### [100%]
/sbin/ldconfig: /usr/lib/libbrscandec2.so.1 はシンボリックリンクではありません
/sbin/ldconfig: /usr/lib/libbrcolm2.so.1 はシンボリックリンクではありません
$ id postgres
uid=26(postgres) gid=26(postgres) groups=26(postgres)
[satosi@localhost RPMS.plus]$ finger postgres
bash: finger: コマンドが見つかりません
[satosi@localhost RPMS.plus]$ which psql
/usr/bin/psql
[satosi@localhost RPMS.plus]$ ls /etc/init.d/p*
/etc/init.d/postfix*     /etc/init.d/pppoe*
/etc/init.d/postgresql*  /etc/init.d/proftpd*

$ chkconfig --list postgresql
postgresql     	0:off	1:off	2:off	3:off	4:off	5:off	6:off

$ sudo chkconfig postgresql on

$ chkconfig --list postgresql
postgresql     	0:off	1:off	2:on	3:on	4:on	5:on	6:off

$ sudo service postgresql start

An old version of the database format was found.
You need to upgrade the data format before using PostgreSQL.
See /usr/share/doc/postgresql-9.5.2/README.rpm-dist for more information.

訳はこうだ。

古いバージョンのデータベースが見つかった。 PostgreSQL を使う前にデータフォーマットをアップグレードする必要がある。 詳しい情報は /usr/share/doc/postgresql-9.5.2/README.rpm-dist を見てね。

ということで以前のデータベースを消す。消してはいけないデータベースは、 いったんダンプする必要がある。今回はその必要はなかった。

いざ接続

希望にもえて postgresql と接続しようとしたが、裏切られた。

$ psql -l
psql: FATAL: ロール"hoge"は存在しません

あ、次の手順を忘れていた。

$ createuser $(whoami) -s U postgres

これでうまくいったのかはわからない。

WSL Ubuntu 20.04 でインストールしてみる

WSL の Ubuntu 20.04 に PostgreSQL をインストールしてみることにした。

$ sudo apt install postgresql # インストール
(中略)
Creating config file /etc/postgresql-common/createcluster.conf with new version
Building PostgreSQL dictionaries from installed myspell/hunspell packages...
  en_us
Removing obsolete dictionary files:
Created symlink /etc/systemd/system/multi-user.target.wants/postgresql.service → /lib/systemd/system/postgresql.service.
invoke-rc.d: could not determine current runlevel
postgresql-12 (12.5-0ubuntu0.20.04.1) を設定しています ...
Creating new PostgreSQL cluster 12/main ...
/usr/lib/postgresql/12/bin/initdb -D /var/lib/postgresql/12/main --auth-local peer --auth-host md5
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 "ja_JP.UTF-8".
The default database encoding has accordingly been set to "UTF8".
initdb: could not find suitable text search configuration for locale "ja_JP.UTF-8"
The default text search configuration will be set to "simple".

Data page checksums are disabled.

fixing permissions on existing directory /var/lib/postgresql/12/main ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... Asia/Tokyo
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

Success. You can now start the database server using:

    pg_ctlcluster 12 main start

Ver Cluster Port Status Owner    Data directory              Log file
12  main    5433 down   postgres /var/lib/postgresql/12/main /var/log/postgresql/postgresql-12-main.log
update-alternatives: /usr/share/man/man1/postmaster.1.gz (postmaster.1.gz) を提供するために自動モードで
  /usr/share/postgresql/12/man/man1/postmaster.1.gz を使います
invoke-rc.d: could not determine current runlevel
sysstat (12.2.0-2) を設定しています ...

Creating config file /etc/default/sysstat with new version
update-alternatives: /usr/bin/sar (sar) を提供するために自動モードで /usr/bin/sar.sysstat を使います
Created symlink /etc/systemd/system/multi-user.target.wants/sysstat.service → 
  /lib/systemd/system/sysstat.service.
postgresql (12+214ubuntu0.1) を設定しています ...
man-db (2.9.1-1) のトリガを処理しています ...
systemd (245.4-4ubuntu3.3) のトリガを処理しています ...

うまくいったようだ。

$ psql --version # バージョン
psql (PostgreSQL) 12.5 (Ubuntu 12.5-0ubuntu0.20.04.1)

$ sudo service postgresql start # 起動
* Starting PostgreSQL 12 database server               [ OK ]

OK だ。

$ sudo service postgresql stop # 停止
* Stopping PostgreSQL 12 database server               [ OK ]
$ sudo service postgresql start # 起動
* Starting PostgreSQL 12 database server               [ OK ]
$ sudo -u postgres psql # postgres というユーザで接続
psql (12.5 (Ubuntu 12.5-0ubuntu0.20.04.1))
Type "help" for help.

postgres=# \q
$

PosgreSQL を使うときのコマンドを整理する。

$ createdb dbname

データベースを dbname というなまえで生成する。
createdb: error: could not connect to database template1: FATAL: role "username" does not exist
というエラーが出ることがある。これは、username のロール (role) が作成されていないからだ。 ここでロールとは、ユーザやグループの総称である。username がそのまま rolename だとして、 ロールを作る。

$ sudo -u postgres createuser username

ロールを作っただけでは、データベースを作ることができない。

$ createdb dbname
createdb: error: database creation failed: ERROR:  permission denied to create database

postgres の権限なら作れる。

$ sudo -u postgres createdb dbname
WARNING:  could not flush dirty data: 関数は実装されていません

その後で、権限を追加する。

$ sudo -u postgres psql
psql (12.5 (Ubuntu 12.5-0ubuntu0.20.04.1))
Type "help" for help.

postgres=# grant all privileges on database dbname to username;
GRANT
postgres=# \q
$ 

$ psql -f filename -d dbname

対話的に問い合わせを入力し、それを PostgreSQL に対して発行して、結果を確認する。 -d dbname で接続するデータベースの名前を指定する。 -f filename で、標準入力ではなくファイル filename からコマンドを読み取る。

参考:https://www.postgresql.jp/document/12/html/app-psql.html

まりんきょ学問所UNIX 手習い > PostgreSQL


MARUYAMA Satosi