Postgresデータベースソフトウェアの最新リリースであるPostgreSQL13には、多くの内部的な改善が加えられています。最も人気があり、用途の広いオープンソースRDBMSですが、セットアップと開始が最も簡単ではありません。最新のLTSバージョンのUbuntuserverで最新バージョンのPostgresを使用する方法を学ぶために読んでください。
Ubuntu 20.04には、ユニバースのPostgres12が付属しています。 リポジトリ。バージョン13が必要なため、PostgreSQLプロジェクトの公式APTリポジトリを直接使用できます。このリポジトリにはUbuntu 20.04のバイナリが含まれており、後でインストールする可能性のあるさまざまな拡張機能のパッケージも含まれています。
このようにリポジトリを設定しましょう(「focal」はUbuntu 20.04のコードネームであることに注意してください):
# add the repository
sudo tee /etc/apt/sources.list.d/pgdg.list <<END
deb http://apt.postgresql.org/pub/repos/apt/ focal-pgdg main
END
# get the signing key and import it
wget https://www.postgresql.org/media/keys/ACCC4CF8.asc
sudo apt-key add ACCC4CF8.asc
# fetch the metadata from the new repo
sudo apt-get update
これで、次を使用してPostgreSQLサーバーとその他のコマンドラインツールをインストールできます。
sudo apt-get install -y postgresql-13
インストールはいくつかのことを行います:
- PostgreSQLサーバー、ユーティリティ、および psqlと呼ばれるコマンドラインクライアントをインストールします 。
- postgresというLinuxシステムユーザーを作成します 。すべてのデータファイルはこのユーザーが所有し、すべてのプロセスはこのユーザーとして実行されます。
- データベースクラスターを作成します (下記参照)。このクラスターでは、 postgresとも呼ばれるデータベースを作成します 。
- 1人のPostgreSQLユーザーを作成します( Linuxシステムユーザー)、 postgresとも呼ばれます 。このPostgreSQLユーザーにはスーパーユーザー権限があります。
これが混乱し始めていることがわかります!
Postgresの用語では、単一のデータベースクラスターが稼働しています。単一のデータベースクラスターには、1つ以上のデータベースを含めることができます。現在のデータベースクラスターには、「postgres」というデータベースがあります。 (今のところ無視できる「テンプレート」データベースもいくつかあります。)
データベースクラスターは、 postmasterと呼ばれるメインのpostgresプロセスによって管理されます。 。さまざまなシステムタスクを実行するか、着信クライアント接続を処理するさまざまな子プロセスを生成します。現在実行中のプロセスをご覧ください:
alice@ubu:~$ ps -o uname,pid,ppid,cmd -H -U postgres
USER PID PPID CMD
postgres 4880 1 /usr/lib/postgresql/13/bin/postgres -D /var/lib/postgresql/13/main -c config_file=/etc/postgresql/13/main/postgresql.conf
postgres 4882 4880 postgres: 13/main: checkpointer
postgres 4883 4880 postgres: 13/main: background writer
postgres 4884 4880 postgres: 13/main: walwriter
postgres 4885 4880 postgres: 13/main: autovacuum launcher
postgres 4886 4880 postgres: 13/main: stats collector
postgres 4887 4880 postgres: 13/main: logical replication launcher
ここで、ポストマスタープロセスは4880であり、さまざまなハウスキーピングアクティビティを処理する6つの子プロセスを生成しました。クラスタの場所も確認できます(/var/lib/postgresql/13/main
)および構成ファイルの場所(/etc/postgresql/13/main/postgresql.conf
。
さまざまな時点で、リロードが必要になる場合があります または再起動 Postgresサーバーを再ロードすると、Postgresは構成ファイルを再検査し、変更を適用します。構成ファイルに変更がない場合、問題は発生しません。リロードしても、現在接続されているクライアントに影響はありません。 Postgresサーバーをリロードするには、次の操作を実行できます。
sudo systemctl reload postgresql
一部の構成変更は、サーバーを再起動した後にのみ有効になります。これはより混乱を招き、接続されているすべてのクライアントを切断します。再起動するには、次のことができます。
sudo systemctl restart postgresql
ご覧のとおり、postgresql
というsystemdサービスがあります。 ポストマスターを制御するために使用できます。サービスが開始されない場合は、サービスのステータスを確認してエラーメッセージを確認できます。
alice@ubu:~$ sudo systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
Active: active (exited) since Thu 2020-10-29 04:52:29 UTC; 25min ago
Main PID: 4557 (code=exited, status=0/SUCCESS)
Tasks: 0 (limit: 1075)
Memory: 0B
CGroup: /system.slice/postgresql.service
Oct 29 04:52:29 ubu systemd[1]: Starting PostgreSQL RDBMS...
Oct 29 04:52:29 ubu systemd[1]: Finished PostgreSQL RDBMS.
PostgreSQLサーバーはログファイルを書き込みます。このファイルで、より詳細なエラーメッセージを確認できます。このファイルは/var/log/postgresql/postgresql-13-main.log
にあります。 :
alice@ubu:~$ cat /var/log/postgresql/postgresql-13-main.log
2020-10-29 04:52:34.096 UTC [4880] LOG: starting PostgreSQL 13.0 (Ubuntu 13.0-1.pgdg20.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 9.3.0-10ubuntu2) 9.3.0, 64-bit
2020-10-29 04:52:34.097 UTC [4880] LOG: listening on IPv4 address "127.0.0.1", port 5432
2020-10-29 04:52:34.099 UTC [4880] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2020-10-29 04:52:34.106 UTC [4881] LOG: database system was shut down at 2020-10-29 04:52:31 UTC
2020-10-29 04:52:34.112 UTC [4880] LOG: database system is ready to accept connections
サーバーが稼働しているので、サーバーに接続してみましょう。デフォルトでは、サーバーは以下のみをリッスンします:
- ポート5432の127.0.0.1からのTCP接続、および
- / var / run/postgresqlのUnixドメインソケット
デフォルト設定のため、現在サーバーに接続する唯一の方法は、システムユーザーとして実行されているプロセスからUnixソケットを介することです postgres 。標準のインタラクティブクライアントpsqlを実行してみましょう このように:
alice@ubu:~$ sudo -u postgres psql postgres
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
Type "help" for help.
postgres=#
ここでは、システムユーザーpostgres(“ sudo -u postgres psql”)としてpsqlを実行し、“ postgres”(コマンドラインの最後の“ postgres”)と呼ばれるデータベースに接続しています。“ postgres =#”プロンプトは、現在接続されているデータベースの名前(「postgres」)とスーパーユーザー権限(「$」ではなく「#」)があります。
接続はUnixソケットを介して行われました(これはpsqlのデフォルトの方法です)。デフォルトではpostgresユーザーはパスワードを持っておらず、デフォルトの構成ではTCP接続のパスワード認証が必要なため、現在127.0.0.1:5432を介して接続することはできません。 。
まず、内部ネットワークからの接続を許可するように構成を変更しましょう。このネットワーク上のサーバーのIPが10.1.2.3であるとすると、/etc/postgresql/13/main/postgresql.conf
にあるメイン構成ファイルを編集できます。 行を変更します:
#listen_addresses = 'localhost' # what IP address(es) to listen on;
# comma-separated list of addresses;
# defaults to 'localhost'; use '*' for all
宛先:
listen_addresses = 'localhost,10.1.2.3'
また、これらのネットワークからの接続にパスワード認証を使用するようにPostgresに指示する必要があります。このために、/etc/postgresql/13/main/pg_hba.conf
という別の構成ファイルを編集します 行を変更します:
host all all 127.0.0.1/32 md5
宛先:
host all all 127.0.0.1/32 scram-sha-256
host all all 10.1.0.0/16 scram-sha-256
(内部ネットワークが10.1.0.0/16であると仮定します。)
デフォルトのmd5
も変更しました より新しく、より安全なscram-sha-256
へのメソッド 。 md5
の他のすべての発生 ファイル内もscram-sha-256
に置き換える必要があります 。アプリケーションまたはデータベースドライバがこの方法をサポートしていない場合は、引き続きmd5
を使用してください。 代わりにメソッド。
これらの変更を有効にするには、サーバーを再起動する必要があります。
sudo systemctl restart postgresql
もうすぐです!
これで、アプリケーションが接続できる通常のユーザーと、アプリケーションが完全に制御できるデータベースを作成できます。スーパーユーザーとして接続するpostgres これを行うには、サーバーマシンからローカルに:
alice@ubu:~$ sudo -u postgres psql postgres
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
Type "help" for help.
postgres=# SET password_encryption = 'scram-sha-256';
SET
postgres=# CREATE USER alice PASSWORD 's3cr3tp@ss';
CREATE ROLE
postgres=#
(md5
を使用する場合は、最初のコマンドを省略してください 代わりに。)これにより、 aliceというユーザーが作成されました。 パスワードs3cr3tp@ ss 。このユーザーが所有するデータベースも作成しましょう:
postgres=# CREATE DATABASE app1 OWNER alice;
CREATE DATABASE
postgres=#
データベースはapp1と呼ばれます 。 alice以降 このデータベースを所有している場合、アプリケーションがユーザー alice として接続する場合、データベース内のすべての操作(テーブルの作成、行の挿入など)が許可されます。 。
aliceとして接続してみましょう 、ネットワーク経由:
~$ psql -h 10.1.2.3 -U alice app1
Password for user alice:
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
app1=>
涼しい!これでデータベースに接続されましたapp1 ユーザーとしてalice 。
データベースの削除、バックアップ、および復元
Postgresserverでの作業を継続する際に役立ついくつかの秘訣は次のとおりです。
次のように、作成したデータベース(「app1」)を削除できます。
alice@ubu:~$ psql -h 127.0.0.1 -U alice app1
Password for user alice:
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
app1=> \c postgres
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
You are now connected to database "postgres" as user "alice".
postgres=> DROP DATABASE app1;
DROP DATABASE
postgres=>
最初にpsqlの「\c」コマンドを使用して別のデータベースに切り替える必要があることに注意してください。
別のデータベースを作成する、または app1を再作成する 、スーパーユーザーとして接続し、前と同じように「CREATEDATABASE」を実行します。
データベース内のデータをバックアップする最も簡単な方法は、 pg_dumpを使用することです。 このように:
alice@ubu:~$ pg_dump -h 127.0.0.1 -U alice -f backup.sql app1
Password:
これにより、「backup.sql」というSQLファイルが作成されます。このファイルには、データベース app1にスキーマとデータを再作成するために必要なすべてのSQLコマンドが含まれています。 、テキスト形式。これらのコマンドは任意のデータベースで実行でき、スキーマとデータがそのデータベースに入力されます。
pg_dumpの詳細については、こちらをご覧ください。
上で作成したSQLコマンドファイルは、次のように復元できます。
alice@ubu:~$ psql -h 127.0.0.1 -U alice app2
Password for user alice:
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
app2=> \i backup.sql
SET
SET
(..snip..)
スキーマとデータを別のデータベースapp2に復元したことに注意してください。 。 psqlの「\i」コマンドを使用すると、ファイルからSQLコマンドを実行できます。
PostgreSQLに習熟するのに役立つ記事、チュートリアル、ビデオ、コースがたくさんあります。ただし、PostgreSQLのすべての機能、構文、およびバンドルされたユーティリティの信頼できる広範なカバレッジを提供する公式ドキュメントをここで使用して、しばらく時間をかけてください。