よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

【AndroidとTermux】PostgreSQLをインストールする(メモ

今回は、AndroidのTermuxアプリでデータベースのPostgreSQLをインストールし使ってみる。メモ。





実行環境



はじめに

Android(のTermuxアプリ)で使えるデータベースは、

などがある。

MariaDBPostgreSQL

# MariaDBの場合
pkg install mariadb

# PostgreSQLの場合
pkg install postgesql

で簡単にインストールできます。その後の環境構築やパスワードの設定等の方法がOSや実行環境で微妙に違うようです。エラーが出たりした。

MariaDBを先にインストールしてみたのですが、ユーザーの作成・パスワード設定が出来なかったので後回しにし、今回はPostgreSQLのインストールとユーザー作成までやります。メモです。あくまでもデータベース操作の練習としてやっています。責任は負いかねます。



PostgreSQLのインストール

TermuxアプリにPostgreSQLをインストールします。

手順 参考 : Postgresql - Termux Wiki


※ ネット接続が必要です。

とりあえずライブラリのアップデート

$ pkg update 

$ pkg upgrade

Termuxアプリに入っている様々なライブラリが更新されます。



postgesqlのインストール

早くもPostgreSQLをインストールします。

$ pkg install postgesql

すぐ済みます。



postgesqlフォルダの作成

インストールが済んだら、次に手作業でフォルダを作る必要があるようです。

$ mkdir -p $PREFIX/var/lib/postgresql

一応説明。
上のmkdirコマンドを実行すると、 /data/data/com.termux/files/usr/var/lib/ の中に postgresql というフォルダが作成されます。

  • mkdir
    • フォルダ作成コマンド。
    • -pのオプション
      • 階層でフォルダ作成する場合に使う。
    • $PREFIX
      • Termuxの場合 /data/data/com.termux/files/usr になっている。echo $PREFIXコマンドで見れる。



ちょっと詳しく確認しておきましょ。

引数なしで 移動コマンドcd を実行すると、Termuxのホームディレクト/data/data/com.termux/files/homeに移る。その一階層上にusrディレクトリがある。

# 変数PREFIXの中身を見る
$ echo $PREFIX
/data/data/com.termux/files/usr

# ホームに移動
$ cd

# カレントディレクトリを見る
$ pwd
/data/data/com.termux/files/home # ← デフォルトでこのフォルダがホーム

# 一階層上に移動
$ cd ..

# 中身を見る
$ ls
home  usr 

# usrフォルダに移動
$ cd usr

# usrフォルダの中身確認
$ ls
bin  include  man    tmp
doc  lib      opt    var
etc  libexec  share

varというフォルダが入っています。さらに続けます。

# varフォルダに移動し、中身確認
$ cd var ; ls
lib  log  run  service

# libフォルダに移動し中身確認
$ cd lib ; ls
apt  dpkg  postgresql

postgesqlフォルダが作成されているのが確認できました。



初期化

先ほど作ったフォルダを初期化するようです。

$ initdb $PREFIX/var/lib/postgresql

ここまでで postgesql のインストールは完了。
これ以降、これらの作業は不要。

データベースサーバの起動と停止方法

🔰初心者がまず初めに使う SQLite はファイル形式のデータベースでサーバが要りませんが、MySQLPostgreSQLなど大抵のデータベースは、バックグラウンドでサーバを起動させて、そこに接続してSQLで操作を行います。



サーバの起動

pg_ctl startコマンド でサーバを起動させます。

$ pg_ctl -D $PREFIX/var/lib/postgresql start

ごにょごにょ~と出て、

server started

データベースサーバが起動したよ うです。



コマンドは、先ほど作ったフォルダに-Dオプションを付け、startさせています。



pg_ctlコマンドのヘルプ

pg_ctlコマンドとは? -D オプションとは? ヘルプを見てみます。

# pg_ctlコマンドのヘルプを見る
$ pg_ctl --help

pg_ctl is a utility to initialize, start, stop, or control a PostgreSQL server.

Usage:
  pg_ctl init[db]   [-D DATADIR] [-s] [-o OPTIONS]
  pg_ctl start      [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]
                    [-o OPTIONS] [-p PATH] [-c]
  pg_ctl stop       [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]
  pg_ctl restart    [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]
                    [-o OPTIONS] [-c]
  pg_ctl reload     [-D DATADIR] [-s]
  pg_ctl status     [-D DATADIR]
  pg_ctl promote    [-D DATADIR] [-W] [-t SECS] [-s]
  pg_ctl logrotate  [-D DATADIR] [-s]
  pg_ctl kill       SIGNALNAME PID

Common options:
  -D, --pgdata=DATADIR   location of the database storage area
  -s, --silent           only print errors, no informational messages
  -t, --timeout=SECS     seconds to wait when using -w option
  -V, --version          output version information, then exit
  -w, --wait             wait until operation completes (default)
  -W, --no-wait          do not wait until operation completes
  -?, --help             show this help, then exit
If the -D option is omitted, the environment variable PGDATA is used.

Options for start or restart:
  -c, --core-files       allow postgres to produce core files
  -l, --log=FILENAME     write (or append) server log to FILENAME
  -o, --options=OPTIONS  command line options to pass to postgres
                         (PostgreSQL server executable) or initdb
  -p PATH-TO-POSTGRES    normally not necessary

Options for stop or restart:
  -m, --mode=MODE        MODE can be "smart", "fast", or "immediate"

Shutdown modes are:
  smart       quit after all clients have disconnected
  fast        quit directly, with proper shutdown (default)
  immediate   quit without complete shutdown; will lead to recovery on restart

Allowed signal names for kill:
  ABRT HUP INT KILL QUIT TERM USR1 USR2

Report bugs to <pgsql-bugs@lists.postgresql.org>.
PostgreSQL home page: <https://www.postgresql.org/>

pg_ctlコマンドとは何かが最初に書いてあります。

pg_ctl is a utility to initialize, start, stop, or control a PostgreSQL server.

pg_ctl コマンド は、初期化・スタート・ストップ・またはPostgreSQLサーバを制御するユーティリティ(管理ツール)です。



また、 Common options:の先頭に-Dオプションの説明があります。

-D, --pgdata=DATADIR location of the database storage area

さっき作ったフォルダはデータを入れる用でしょうか。このオプションを省略すると環境のPGDATAが使われる、ともある。よくわからん。

【追記】

環境変数PGDATAを設定しておけば-Dオプションを省略できる。

# 環境変数設定
$ export PGDATA=$PREFIX/var/lib/postgresql

# 環境変数確認
$ echo $PGDATA
/data/data/com.termux/files/usr/var/lib/postgresql

これで設定されたので、pg_ctlコマンドでサーバ起動や停止をするときは

# サーバ起動
$ pg_ctl start

# 停止
$ pg_ctl stop

# サーバの状態確認
$ pg_ctl status

と、-D $PREFIX/var/lib/postgesqlオプションが省略できるようになる。



しかし、exportコマンドはターミナルを閉じると無効になる。いちいち書くのも面倒なので、ターミナルを開く際に読み込まれる.bashrcに前のexport文を一行書き加えておけば済む。
詳しくは「Linuxコマンド export 環境変数」などで検索ください。
【追記 おわり】



サーバの停止

早くも止めます。

$ pg_ctl -D $PREFIX/var/lib/postgresql stop

ごにょごにょ~
LOG:  database system is shut down
 done
server stopped

止まった模様。



psコマンドでバックグラウンドのプロセスを見る

サーバを止め忘れると、バックグラウンドでずっと起動しっぱなしになる? 実験してみます。

バックグラウンドでサーバか何かのプロセスが動いてるかどうかを確認するには、psコマンド を使います。サーバ起動後にpsコマンドで見てみます。

# サーバ起動
$ pg_ctl -D $PREFIX/var/lib/postgesql


# バックグラウンドプロセスを見る postgesqlのみを抽出
$ ps aux | grep postgesql

u0_a○○○  16602  0.1  0.4 203056 17704 ?        S<sl  1970   0:00 /data/data/com.termux/files/usr/bin/postgres -D /data/data/com.termux/files/usr/var/lib/postgresql

その他多数 ごにょごにょ

u0_a○○○ から始まる1つ1つが各プロセスのようです。



では、サーバを停止させ、psコマンドで見ます。

# サーバ停止
$ pg_ctl -D $PREFIX/var/lib/postgresql stop

# バックグラウンドプロセス
$ ps aux | grep postgesql

u0_a○○○  17130  1.0  0.0   9776  1692 pts/0    S<+   1970   0:00 grep postgres

1つだけ表示されました。grep postgesqlと書いてあるのでpsコマンドの何かだろう。

サーバを停止したからPostgreSQLのプロセスも消えた訳ですけど、停止させないとどうなるか。

# サーバ起動
$ pg_ctl -D $PREFIX/var/lib/postgresql start
ごにょごにょ
server start

# Termuxを終了する
$ exit

Termuxアプリが閉じられます。再びTermuxアプリを開いて次のコマンドを入力

# プロセス確認
$ ps aux | grep postgesql

u0_a331  17327  0.3  0.4 203056 17708 ?        S<sl  1970   0:00 /data/data/com.termux/files/usr/bin/postgres -D /data/data/com.termux/files/usr/var/lib/postgresql

その他ごにょごにょ~

いまやった手順は、

  1. pg_ctl start コマンドでサーバ起動
  2. サーバを止め忘れてTermuxアプリをexitコマンド で閉じる。
  3. Termuxアプリを開く。
  4. バックグラウンドのプロセスを見る
  5. PostgreSQLサーバのプロセスは働いている

つまり、



Termuxアプリを閉じてもPostgreSQLサーバは動きっぱなし!!

電池が無駄に減るのではないか。他のアプリ等からのデータベース接続がないなら、Termux終了と同時にサーバも停止させるようにしておく必要がありそう。



スーパーユーザーの作成とパスワード設定

データベースの管理者権限を持つユーザーと、そのパスワードを作成します。
SQLiteと違って、ほとんどのデータベースはプライバシーやセキュリティの為にパスワードの設定ができるようになっている。

$ createuser --superuser --pwprompt 管理者(あなた)のユーザー名

適当に管理者名を入力したこのコマンドを入力すると、

Enter password for new role: ココに何かパスワードを入力し、enterキー。すると↓

Enter it again: ココにもう一度同じパスワードを入力

と出ますので、パスワードを何か入力します。このパスワードは覚えておきます。

これで管理者(あなた)のユーザー登録をパスワード付きで完了しました。



createuserコマンドのヘルプ

ユーザー作成コマンドのヘルプは、次のコマンド。

$ createuser --help

createuser creates a new PostgreSQL role.

Usage:
  createuser [OPTION]... [ROLENAME]

Options:
  -c, --connection-limit=N  connection limit for role (default: no limit)
  -d, --createdb            role can create new databases
  -D, --no-createdb         role cannot create databases (default)
  -e, --echo                show the commands being sent to the server
  -g, --role=ROLE           new role will be a member of this role
  -i, --inherit             role inherits privileges of roles it is a
                            member of (default)
  -I, --no-inherit          role does not inherit privileges
  -l, --login               role can login (default)
  -L, --no-login            role cannot login
  -P, --pwprompt            assign a password to new role
  -r, --createrole          role can create new roles
  -R, --no-createrole       role cannot create roles (default)
  -s, --superuser           role will be superuser
  -S, --no-superuser        role will not be superuser (default)
  -V, --version             output version information, then exit
  --interactive             prompt for missing role name and attributes rather
                            than using defaults
  --replication             role can initiate replication
  --no-replication          role cannot initiate replication
  -?, --help                show this help, then exit

Connection options:
  -h, --host=HOSTNAME       database server host or socket directory
  -p, --port=PORT           database server port
  -U, --username=USERNAME   user name to connect as (not the one to create)
  -w, --no-password         never prompt for password
  -W, --password            force password prompt

Report bugs to <pgsql-bugs@lists.postgresql.org>.
PostgreSQL home page: <https://www.postgresql.org/>

ユーザー作成は、ユーザーやグループで細かく設定できるようです。「ロール」と呼ばれるものがある。



データベースの作成

SQLiteはファイルが1つのデータベースです。その中に幾つもテーブル作成できる。
一方、PostgreSQL(や他)のデータベースでは、まず「database」を作ります。その中にテーブルを作ります。

# サーバ起動
$ pg_ctl -D $PREFIX/var/lib/postgresql start

# database作成
$ createdb mydb

サーバ起動せずにdatabase作成するとエラーになります。

これでデータベースが作られたらしい。プロジェクト毎に作ればいいね。



データベースを開く(接続)

$ psql mydb

↓ こんなのが出た
psql (14.1)
Type "help" for help.

そのあと ↓ プロンプトが変わった
mydb=#

新規作成したdatabase「mydb」に接続し、対話式のプロンプトが出てきた。ここにSQL文を打てばいい。



上で行ったデータベース作成と接続の操作は、databaseにユーザー名もパスワードもホスト名もロール名も何も指定していない。と思うが…



プロンプト終了

抜けるには、

データベース名=# exit

または

データベース名=# quit

で、Termuxのプロンプトに戻る↓
$



  • サーバを停止

忘れると動きっぱなし。

$ pg_ctl -D $PREFIX/var/lib/postgresql stop



おわりに

TermuxアプリにPostgreSQLをインストール、管理者をパスワード付きで作成、サーバ起動と停止、データベースの作成、まで行った。内容は Postgresql - Termux Wiki 通り。



権限等の設定や型、操作内容がSQLiteとだいぶん違うようで、あまり気軽に使えない。一応Termuxで動く確認ができたということで。



以上です。