CentOS8にPostgreSQLをインストールして使用する方法
序章
リレーショナルデータベース管理システムは、多くの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.6
、10
、および12
があることがわかります。 それに続く[d]
で示されているように、Postgresバージョン10を提供するストリームがデフォルトです。 そのバージョンをインストールする場合は、sudo dnf install postgresql-server
を実行して、次の手順に進むことができます。 ただし、バージョン10は引き続き維持されていますが、このチュートリアルでは、この記事の執筆時点で最新のリリースであるPostgresバージョン12をインストールします。
PostgreSQLバージョン12をインストールするには、そのバージョンのモジュールストリームを有効にする必要があります。 モジュールストリームを有効にすると、デフォルトストリームを上書きし、有効なストリームに関連するすべてのパッケージをシステムで使用できるようにします。 システムで同時に有効にできるのは、特定のモジュールの1つのストリームのみであることに注意してください。
Postgresバージョン12のモジュールストリームを有効にするには、次のコマンドを実行します。
sudo dnf module enable postgresql:12
プロンプトが表示されたら、y
、ENTER
の順に押して、ストリームを有効にすることを確認します。
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プロンプトにアクセスするように指示されました。 別の方法として、次のように、sudo
でpostgresユーザーとして単一のコマンド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
いくつかの追加のフラグを渡すことで、より詳細な制御を取得できます。 createuser
のman
ページを見て、オプションを確認してください。
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行は、機器type
とcolor
の列をそれぞれ作成し、それぞれを空にすることはできません。 これらの後の行は、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)
あなたの遊び場のテーブルはここにありますが、タイプsequence
のplayground_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の使用方法をカバーするその他のガイドは次のとおりです。