ことはじめ

事情があってね、Mysqlではなく、Postgresを使わないといけないのですよ。 でね、PostgreSQL徹底入門手本を買ったので、それのまとめとか、読んでて気づいたこととか思ったこととか、そういうのまとめておきましょう。

全体を読んでの感想

やはり、Mysqlを使ってきたのでmysqlとの違いに目が行くわけですね。そうね、postgresは並列処理をスレッド並列ではなく、プロセス並列でやっているのが特徴的。Mysqlがスレッド並列だけどね。あと、プロセス単位でのコマンドが多い。つまり、プロセス内のコマンドではなく、プロセスとしてのコマンドね。これも結構違和感あるというか、一般的には、○○ーctlとかで一つのフロントエンドコマンドと、バックエンドで動いているデーモンプロセスの二つでエコシステムが構成されているが、postgresはなんかめっちゃ多い。 全体的にモダンな感じがしない。どちらかというと無骨だな。個人的にははやりMysqlがいいのではないかと思う。Mysqlであればストレージエンジンもプラがブルなのでinnodbとかほかのに変えることもできるし。しかし、俺にはPostgresを使わないといけない理由があるのだ!!ということで、使っていきたいと思う。しかし、何度も言うように、パフォーマンスはmysqlの方が断然上だし、 ほかのソフトとの親和性もmysqlの方が上だってことは伝えておきたい。apache igniteもmysqlとは接続性があるけど、postgresは聞いたことがないし。 あと、現在のpostgresの最新版は12だけど、これは11についてです。まあ、比較的新しいので気にする必要はないでしょう。

余談だが、この本を読んで知識が体系的にまとめられた気がする。 postgresはバークレイで作られた。結構歴史についても詳しくなったし、知識の精緻化が進んだよ。 ACIDとCRUDもネットワークに組み込まれたので、忘れることはないだろうし、ジムグレイ (1998念チューリング賞受賞者) がACIDを提唱して、実装した人だってのももうわかった。あと、Michael stonebreaker (2014念チューリング賞受賞者) ね。この人がpostgresを作った人で、まさに巨人だ。ありがたい。 めっちゃ余談だが、2016年は、www,ブラウザ、webのプロトコルの発明者、ティムバーナーずりー。2017年のチューリング賞受賞者はあのへねぱた本で有名なジョンヘネシーとデイビットパターそん。 2018年のチューリング賞受賞者の一人はヤンルカンだし、2020年のチューリング賞受賞者はジャックどんがら先生です。

Ubuntuへのインストール手順

パッケージをインストール

もうパッケージが何かはわかるよね。あるソフトってのは様々なライブラリに依存して作られているんだ。我々は巨人の方に乗っからせていただいているんだ。で、依存ライブラリも含めて提供してくれるのがパッケージな。いいか?

sudo sh -c 'echo "deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get -y install postgresql

サーバ起動手順

んー、本にはinitdbでデータベースクラスタ (データの保存先のディレクトリ) を作ってから起動する必要があるって書いてあったけど、今回はもう自動的に/var/lib/postgresql/12/mainに作られていたね。これはパッケージでインストールしたからかな。まあ、やってくれているなら問題ない。がinitdbちょっと使ってみたいんだよね。 あー、pg_ctlも使えないね。ちょっとこれはどうなのかな。

これがインストールの際の出力結果だね。

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 "en_US.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

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

initdbもあるけど、パスが通っていないんだね。 でね、もうすでに起動しちゃってるんだわ。だから、気にせずに行ってくれ。マジで。

とりあえずのpostgresの入り方

パッケージでインストールするともう動いているんだよね。 で、入り方なんだけど、postgresって名前のユーザがもう自動的に作られている。しかも、OSのレベルで。だから、次のコマンドでpostgresってユーザになってログインする必要があるんだよね。

sudo -i -u postgres

で、

psql

で問題なく入れる。 さらに不思議なことに、これは、/home/いかに作られるユーザではないんだよ。 なんと、 /var/lib/postgresql というのがホームディレクトリでね。異空間なのか??

先に以下のことを片づけたい。

データベースクラスタの変更方法 (というより、hdd上にデータを移行する方法)

上にも書いている通り、initdbはパスが通っていないだけで本当はある。これを使って新しく作ればいいんだけど、 せっかくなので/var/lib/postgresql/12/main付近に新しくファイルシステムをマウントする形で導入したい。 ってことで、いつも通り、

  1. パーティションを作って、
fdisk /dev/sdc
  1. ファイルシステムを導入して、
sudo mkfs.xfs /dev/sdc2
  1. blkidで、ブロックデバイスのuuidを確認し、

  2. 起動時にそこに自動マウントするように、/etc/fstabの書き換え をして、postgresql.confの設定を書き換え、

なんだけど、結局はmysqlのやつとやったことは同じだね。なんでかっていうと、新しくゆーざを作ったりするのが面倒くさかったからだね。はい、ってことで、ただ単に、もともと/var/lib/postgresql/12/mainにあった内容を、新しく作った/dev/sdb2に移行して、 /dev/sdb2を/var/lib/postgresql/12/mainにマウントしただけです。まあ、これでちゃんと動くので問題なさそうです。 はい。ちゃんと動いているので大丈夫そうです。

新しいユーザの登録方法

さっきも言った通り、もうすでにルートユーザであるpostgresは作られていて、入るためには、

sudo -i -u postgres

で、postgresになり、psqlコマンドを打つ必要があるんだよね。新しくユーザ作るときも一回postgersになる必要があるっぽい。 で、下のコマンドで新しくユーザを作ります。

postgres@hoge:~$ createuser --interactive hoge

ここではパスワードの設定は行わず、後で説明する方法で設定する。 さらに厄介なのが、これで新しいユーザができたからといってすぐにログインできるわけではないということ。psqlをしようとすると、 起こられるんですよね。先にデータベースを作ってください!

データベースの作り方

createdb -O <データベースの所有者> <データベースの名前>

て感じでownerも決められます。 で、

psql testdb

で入れるようになりますよと。

データベースとかテーブルとかの内包関係

データベースクラスター ⊃ データベース ⊃ テーブル って感じだな。 ただ、実はスキーマってもんがpgにはあるらしくてな。まあ、今のところはそんなに必要な知識ではないからな。無視で

ソフトウェアアーキテクチャ