CentOS8にPostgreSQLをインストールして使用する方法

提供:Dev Guides
移動先:案内検索

序章

リレーショナルデータベース管理システムは、多くのWebサイトやアプリケーションの重要なコンポーネントです。 これらは、情報を保存、整理、およびアクセスするための構造化された方法を提供します。

PostgreSQL は、Postgresとも呼ばれ、SQLとしてよく知られている構造化クエリ言語の実装を提供するリレーショナルデータベース管理システムです。 これは、大小を問わず多くの人気のあるプロジェクトで使用されており、標準準拠であり、信頼性の高いトランザクション読み取りロックなしの同時実行性などの多くの高度な機能を備えています。

このガイドに従うことで、最新バージョンのPostgreSQLをCentOS8サーバーにインストールします。

前提条件

このチュートリアルを完了するには、CentOS8を実行しているサーバーが必要です。 このサーバーには、管理者権限を持つroot以外のユーザーと、firewalldで構成されたファイアウォールが必要です。 これを設定するには、CentOS8初期サーバーセットアップガイドを参照してください。

ステップ1—PostgreSQLのインストール

PostgreSQLはCentOS8のデフォルトのAppStreamソフトウェアリポジトリから入手でき、インストールできるバージョンは複数あります。 インストールするバージョンに一致するパッケージと依存関係の適切なコレクションを有効にすることで、これらのバージョンから選択できます。各コレクションは、モジュールストリームと呼ばれます。

DNFでは、CentOS8のデフォルトのパッケージマネージャーであるmodules は、より大きなアプリケーションを構成するRPMパッケージの特別なコレクションです。 これは、パッケージとその依存関係のインストールをユーザーにとってより直感的にすることを目的としています。

dnfコマンドを使用して、postgresqlモジュールで使用可能なストリームを一覧表示します。

dnf module list postgresql
Outputpostgresql                           9.6                             client, server [d]                          PostgreSQL server and client module                         
postgresql                           10 [d]                          client, server [d]                          PostgreSQL server and client module                         
postgresql                           12                              client, server                              PostgreSQL server and client module

この出力では、 AppStream リポジトリから利用できるPostgreSQLの3つのバージョン、9.610、および12があることがわかります。 それに続く[d]で示されているように、Postgresバージョン10を提供するストリームがデフォルトです。 そのバージョンをインストールする場合は、sudo dnf install postgresql-serverを実行して、次の手順に進むことができます。 ただし、バージョン10は引き続き維持されていますが、このチュートリアルでは、この記事の執筆時点で最新のリリースであるPostgresバージョン12をインストールします。

PostgreSQLバージョン12をインストールするには、そのバージョンのモジュールストリームを有効にする必要があります。 モジュールストリームを有効にすると、デフォルトストリームを上書きし、有効なストリームに関連するすべてのパッケージをシステムで使用できるようにします。 システムで同時に有効にできるのは、特定のモジュールの1つのストリームのみであることに注意してください。

Postgresバージョン12のモジュールストリームを有効にするには、次のコマンドを実行します。

sudo dnf module enable postgresql:12

プロンプトが表示されたら、yENTERの順に押して、ストリームを有効にすることを確認します。

Output====================================================================
 Package        Architecture  Version          Repository      Size
====================================================================
Enabling module streams:
 postgresql                   12                                   

Transaction Summary
====================================================================

Is this ok [y/N]: y

バージョン12のモジュールストリームを有効にした後、postgresql-serverパッケージをインストールして、PostgreSQL12とそのすべての依存関係をインストールできます。

sudo dnf install postgresql-server

プロンプトが表示されたら、yを押してからENTERを押してインストールを確認します。

Output. . .
Install  4 Packages

Total download size: 16 M
Installed size: 62 M
Is this ok [y/N]: y

ソフトウェアがインストールされたので、いくつかの初期化手順を実行して、PostgreSQL用の新しいデータベースクラスターを準備します。

ステップ2—新しいPostgreSQLデータベースクラスターを作成する

テーブルの作成とデータのロードを開始する前に、新しいPostgreSQLデータベースクラスターを作成する必要があります。 データベースクラスターは、単一のサーバーインスタンスによって管理されるデータベースのコレクションです。 データベースクラスターの作成は、データベースデータが配置されるディレクトリの作成、共有カタログテーブルの生成、およびtemplate1およびpostgresデータベースの作成で構成されます。

template1 database は、新しいデータベースを作成するために使用される種類のテンプレートです。 template1に保存されているものはすべて、自分で追加したオブジェクトも含めて、作成時に新しいデータベースに配置されます。 postgresデータベースは、ユーザー、ユーティリティ、およびサードパーティアプリケーションが使用するために設計されたデフォルトのデータベースです。

前の手順でインストールしたPostgresパッケージには、低レベルのデータベースクラスター管理に役立つpostgresql-setupという便利なスクリプトが付属しています。 データベースクラスターを作成するには、sudo--initdbオプションを使用してスクリプトを実行します。

sudo postgresql-setup --initdb

次の出力が表示されます。

Output * Initializing database in '/var/lib/pgsql/data'
 * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log

次に、systemctlを使用してPostgreSQLサービスを開始します。

sudo systemctl start postgresql

次に、systemctlをもう一度使用して、サーバーが起動するたびにサービスを起動できるようにします。

sudo systemctl enable postgresql

これにより、次の出力が得られます

OutputCreated symlink /etc/systemd/system/multi-user.target.wants/postgresql.service → /usr/lib/systemd/system/postgresql.service.

PostgreSQLが稼働しているので、ロールを使用して、Postgresがどのように機能し、過去に使用した可能性のある同様のデータベース管理システムとどのように異なるかを学習します。

ステップ3—PostgreSQLの役割とデータベースを使用する

PostgreSQLはrolesと呼ばれる概念を使用して、クライアントの認証と承認を処理します。 これらはいくつかの点で通常のUnixスタイルのアカウントに似ていますが、Postgresはユーザーとグループを区別せず、代わりにより柔軟な用語の役割を好みます。

インストール時に、Postgresは ident authentication を使用するように設定されます。つまり、Postgresの役割を一致するUnix/Linuxシステムアカウントに関連付けます。 Postgres内に役割が存在する場合、同じ名前のUnix/Linuxユーザー名がその役割としてサインインできます。

インストール手順により、デフォルトのpostgresロールに関連付けられたpostgresというユーザーアカウントが作成されました。 PostgreSQLを使用するには、そのアカウントにログインできます。

このアカウントを使用してPostgreSQLプロンプトにアクセスする方法はいくつかあります。

postgresアカウントに切り替えます

次のように入力して、サーバーのpostgresアカウントに切り替えます。

sudo -i -u postgres

次のように入力すると、Postgresプロンプトにすぐにアクセスできます。

psql

これによりPostgreSQLプロンプトにログインし、ここからデータベース管理システムをすぐに自由に操作できます。

次のように入力して、PostgreSQLプロンプトを終了します。

\q

これにより、postgresアカウントのLinuxコマンドプロンプトに戻ります。 次に、次のようにして元のアカウントに戻ります。

exit

アカウントを切り替えずにPostgresプロンプトにアクセスする

sudoを使用して、postgresアカウントでコマンドを直接実行することもできます。

たとえば、前の例では、最初に postgres ユーザーに切り替え、次にpsqlを実行してPostgresプロンプトを開くことにより、Postgresプロンプトにアクセスするように指示されました。 別の方法として、次のように、sudopostgresユーザーとして単一のコマンドpsqlを実行することにより、これを1つのステップで実行できます。

sudo -u postgres psql

これにより、中間のbashシェルなしでPostgresに直接ログインできます。

ここでも、次のように入力して、インタラクティブなPostgresセッションを終了できます。

\q

このステップでは、postgresアカウントを使用してpsqlプロンプトに到達しました。 ただし、多くのユースケースでは複数のPostgresロールが必要です。 新しい役割を構成する方法を学ぶために読んでください。

ステップ4—新しい役割を作成する

現在、データベース内でpostgresロールが構成されているだけです。 createroleコマンドを使用して、コマンドラインから新しい役割を作成できます。 --interactiveフラグは、新しい役割の名前の入力を求め、スーパーユーザー権限が必要かどうかも尋ねます。

postgres アカウントとしてログインしている場合は、次のように入力して新しいユーザーを作成できます。

createuser --interactive

代わりに、通常のアカウントから切り替えずに各コマンドにsudoを使用する場合は、次のように入力します。

sudo -u postgres createuser --interactive

スクリプトはいくつかの選択を促し、応答に基づいて、必要なPostgresコマンドを実行して、指定したユーザーを作成します。 このチュートリアルでは、 sammy という名前のロールを作成し、プロンプトが表示されたらyと入力して、スーパーユーザー権限を付与します。

OutputEnter name of role to add: sammy
Shall the new role be a superuser? (y/n) y

いくつかの追加のフラグを渡すことで、より詳細な制御を取得できます。 createusermanページを見て、オプションを確認してください。

man createuser

Postgresのインストールに新しい役割が追加されましたが、データベースはまだ追加されていません。 次のセクションでは、このプロセスについて説明します。

ステップ5—新しいデータベースの作成

Postgres認証システムがデフォルトで行うもう1つの前提は、ログインに使用されるすべてのロールについて、そのロールにはアクセス可能な同じ名前のデータベースがあるということです。

これは、前のセクションで作成したユーザーが sammy と呼ばれる場合、その役割はデフォルトでsammyとも呼ばれるデータベースへの接続を試みることを意味します。 このようなデータベースは、createdbコマンドで作成できます。

postgres アカウントとしてログインしている場合は、次のように入力します。

createdb sammy

代わりに、通常のアカウントから切り替えずに各コマンドにsudoを使用する場合は、次のように入力します。

sudo -u postgres createdb sammy

この柔軟性により、必要に応じてデータベースを作成するための複数のパスが提供されます。

新しいデータベースを作成したので、新しい役割でデータベースにログインします。

ステップ6—新しい役割でPostgresプロンプトを開く

IDベースの認証でログインするには、Postgresの役割およびデータベースと同じ名前のLinuxユーザーが必要です。

一致するLinuxユーザーが利用できない場合は、adduserコマンドを使用して作成できます。 これは、sudo権限を持つroot 以外のアカウントから行う必要があります(つまり、 postgres ユーザーとしてログインしていません)。

sudo adduser sammy

この新しいアカウントが利用可能になったら、最初に次のように入力して、切り替えてからデータベースに接続できます。

sudo -i -u sammy
psql

または、これをインラインで実行できます。

sudo -u sammy psql

このコマンドは自動的にログインします。

ユーザーが別のデータベースに接続するようにしたい場合は、-dフラグを含め、次のようにデータベースを指定することで接続できます。

psql -d postgres

ログインすると、次のように入力して現在の接続情報を確認できます。

\conninfo

これにより、次の出力が表示されます。

OutputYou are connected to database "sammy" as user "sammy" via socket in "/var/run/postgresql" at port "5432".

これは、デフォルト以外のデータベースまたはデフォルト以外のユーザーに接続している場合に役立ちます。

データベースに接続したら、テーブルの作成と削除を試すことができます。

ステップ7—テーブルの作成と削除

PostgreSQLデータベースシステムに接続する方法がわかったので、いくつかの基本的なPostgres管理タスクを学ぶことができます。

まず、いくつかのデータを格納するためのテーブルを作成します。 例として、いくつかの遊具を説明する表を作成します。

このコマンドの基本的な構文は次のとおりです。

CREATE TABLE table_name (
    column_name1 col_type (field_length) column_constraints,
    column_name2 col_type (field_length),
    column_name3 col_type (field_length)
);

これらのコマンドは、テーブルに名前を付けてから、列、列タイプ、およびフィールドデータの最大長を定義します。 オプションで、各列にテーブル制約を追加することもできます。

デモンストレーションの目的で、次のような単純なテーブルを作成します。

CREATE TABLE playground (
    equip_id serial PRIMARY KEY,
    type varchar (50) NOT NULL,
    color varchar (25) NOT NULL,
    location varchar(25) check (location in ('north', 'south', 'west', 'east', 'northeast', 'southeast', 'southwest', 'northwest')),
    install_date date
);

このコマンドは、遊具をインベントリするテーブルを作成します。 serialタイプの機器IDで始まります。 このデータ型は自動インクリメント整数です。 また、この列にPRIMARY KEYの制約を指定しました。これは、値が一意であり、nullではないことを意味します。

2つの列(equip_idおよびinstall_date)の場合、コマンドはフィールド長を指定しません。 これは、長さがタイプによって暗示されるため、一部の列タイプは設定された長さを必要としないためです。

次の2行は、機器typecolorの列をそれぞれ作成し、それぞれを空にすることはできません。 これらの後の行は、location列と、値が8つの可能な値の1つである必要がある制約を作成します。 最後の行は、機器を設置した日付を記録する日付列を作成します。

次のように入力すると、新しいテーブルが表示されます。

\d

これにより、次の出力が表示されます。

Output                  List of relations
 Schema |          Name           |   Type   | Owner 
--------+-------------------------+----------+-------
 public | playground              | table    | sammy
 public | playground_equip_id_seq | sequence | sammy
(2 rows)

あなたの遊び場のテーブルはここにありますが、タイプsequenceplayground_equip_id_seqと呼ばれるものもあります。 これは、equip_id列に指定したserialタイプを表したものです。 これにより、シーケンス内の次の番号が追跡され、このタイプの列に対して自動的に作成されます。

シーケンスなしでテーブルだけを表示したい場合は、次のように入力できます。

\dt

これにより、次のようになります。

Output          List of relations
 Schema |    Name    | Type  | Owner 
--------+------------+-------+-------
 public | playground | table | sammy
(1 row)

このステップでは、サンプルテーブルを作成しました。 次のステップでは、そのテーブルのエントリの追加、クエリ、および削除を試してみます。

ステップ8—テーブル内のデータの追加、クエリ、および削除

これでテーブルができたので、そこにデータを挿入できます。

例として、追加するテーブルを呼び出し、列に名前を付けてから、次のように各列のデータを提供することにより、スライドとスイングを追加します。

INSERT INTO playground (type, color, location, install_date) VALUES ('slide', 'blue', 'south', '2017-04-28');
INSERT INTO playground (type, color, location, install_date) VALUES ('swing', 'yellow', 'northwest', '2018-08-16');

いくつかの一般的なハングアップを回避するために、データを入力するときに注意する必要があります。 1つは、列名を引用符で囲まないでください。ただし、入力する列の値には引用符が必要です。

もう1つ覚えておくべきことは、equip_id列に値を入力しないことです。 これは、テーブルに新しい行が作成されるたびに自動的に生成されるためです。

次のように入力して、追加した情報を取得します。

SELECT * FROM playground;

次の出力が表示されます。

Output equip_id | type  | color  | location  | install_date 
----------+-------+--------+-----------+--------------
        1 | slide | blue   | south     | 2017-04-28
        2 | swing | yellow | northwest | 2018-08-16
(2 rows)

ここでは、equip_idが正常に入力され、他のすべてのデータが正しく整理されていることがわかります。

遊び場のスライドが壊れて削除する必要がある場合は、次のように入力してテーブルから行を削除することもできます。

DELETE FROM playground WHERE type = 'slide';

テーブルを再度クエリします。

SELECT * FROM playground;

次のように表示されます。

Output equip_id | type  | color  | location  | install_date 
----------+-------+--------+-----------+--------------
        2 | swing | yellow | northwest | 2018-08-16
(1 row)

スライドがテーブルの一部ではなくなったことに注意してください。

テーブルのエントリを追加および削除したので、列の追加と削除を試すことができます。

ステップ9—テーブルへの列の追加と削除

テーブルを作成したら、テーブルを変更して列を追加または削除できます。 次のように入力して、各機器の最後のメンテナンス訪問を示す列を追加します。

ALTER TABLE playground ADD last_maint date;

テーブル情報をもう一度表示すると、新しい列が追加されていることがわかります(ただし、データは入力されていません)。

SELECT * FROM playground;

次のように表示されます。

Output equip_id | type  | color  | location  | install_date | last_maint 
----------+-------+--------+-----------+--------------+------------
        2 | swing | yellow | northwest | 2018-08-16   | 
(1 row)

列の削除も同様に簡単です。 作業員が別のツールを使用して保守履歴を追跡していることがわかった場合は、次のように入力して列を削除できます。

ALTER TABLE playground DROP last_maint;

これにより、last_maint列とその中にあるすべての値が削除されますが、他のすべてのデータはそのまま残ります。

列を追加および削除したら、最後のステップで既存のデータの更新を試すことができます。

ステップ10—テーブル内のデータを更新する

これまで、テーブルにレコードを追加する方法とレコードを削除する方法を学習しましたが、このチュートリアルでは、既存のエントリを変更する方法についてはまだ説明していません。

必要なレコードを照会し、列を使用する値に設定することにより、既存のエントリの値を更新できます。 swingレコード(これはテーブル内のすべてのスイングに一致します)を照会し、その色をredに変更できます。

UPDATE playground SET color = 'red' WHERE type = 'swing';

データを再度クエリすることで、操作が成功したことを確認できます。

SELECT * FROM playground;

次のように表示されます。

Output equip_id | type  | color | location  | install_date 
----------+-------+-------+-----------+--------------
        2 | swing | red   | northwest | 2010-08-16
(1 row)

ご覧のとおり、スライドはredとして登録されています。

結論

これで、CentOS8サーバーでPostgreSQLがセットアップされました。 ただし、Postgresで学ぶことはまだまだたくさんあります。 Postgresの使用方法をカバーするその他のガイドは次のとおりです。