sql >> データベース >  >> RDS >> PostgreSQL

Ubuntu18.04でPostgreSQL11を使い始める

    PostgreSQLは、最新で用途の広いRDBMSですが、アプリケーションの開発を検討しているときにセットアップして実行するのが最も簡単な方法ではありません。LTSバージョンのPostgreSQLで最新バージョンのPostgreSQLを開始する方法については、以下をお読みください。 Ubuntu。

    インストール

    Ubuntu18.04にはPostgreSQL10が付属していますが、代わりにPostgreSQLチームがホストするAPTリポジトリを使用して、最新バージョンのPostgreSQL11をインストールできます。

    次のコマンドを使用してリポジトリを設定できます:

    # add the repository
    sudo tee /etc/apt/sources.list.d/pgdg.list <<END
    deb http://apt.postgresql.org/pub/repos/apt/ bionic-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

    次に、以下を使用してソフトウェア自体をインストールします。

    sudo apt-get install postgresql-11

    インストールはいくつかのことを行います:

    • PostgreSQLサーバー、ユーティリティ、および psqlと呼ばれるコマンドラインクライアントをインストールします 。
    • postgresというLinuxシステムユーザーを作成します 。すべてのデータファイルはこのユーザーが所有し、すべてのプロセスはこのユーザーとして実行されます。
    • postgresとも呼ばれる1つのデータベースを作成します 。
    • 1人のPostgreSQLユーザーを作成します( Linuxシステムユーザー)、 postgresとも呼ばれます 。

    これが混乱し始めていることがわかります!

    データベースクラスター

    新しくインストールされたPostgreSQLサーバーは、「データベースクラスター」と呼ばれるものを管理する一連のプロセスで構成されています。ここでプロセスを見ることができます:

    alice@devbox:~$ ps axfww | grep postgres
     4737 ?        S      0:00 /usr/lib/postgresql/11/bin/postgres -D /var/lib/postgresql/11/main -c config_file=/etc/postgresql/11/main/postgresql.conf
     4749 ?        Ss     0:00  \_ postgres: 11/main: checkpointer
     4750 ?        Ss     0:00  \_ postgres: 11/main: background writer
     4751 ?        Ss     0:00  \_ postgres: 11/main: walwriter
     4752 ?        Ss     0:00  \_ postgres: 11/main: autovacuum launcher
     4753 ?        Ss     0:00  \_ postgres: 11/main: stats collector
     4754 ?        Ss     0:00  \_ postgres: 11/main: logical replication launcher  

    メインプロセス(ここではPID 4737を使用)は、子プロセスをさらに生成するメインプロセスです。これは、従来、「ポストマスター」プロセスと呼ばれていました。

    PostgreSQLでの「クラスター」という用語の使用は、現代の派手な分散クラスタリングの専門用語よりも前のものです。ここでは、単一のポストマスターによって単一のマシンで管理されているデータベースのセットを意味します。クラスターの詳細については、こちらをご覧ください。

    クラスタには、データベース(今のところ「postgres」は1つだけ)とPostgreSQLユーザー(今のところ「postgres」とも呼ばれます)が含まれています。ご存知のとおり、クラスターは多数のデータファイルに関連付けられており、そのすべてが1つのディレクトリ(この場合は / var / lib / postgresql / 11 / main )の下にあります。 。上記のpostmasterコマンドラインでこのパスに気づきましたか?

    アプリまたはpsqlがPostgresに接続する場合、PostgreSQLユーザーのコンテキストで接続する必要があります。 常にあります 接続に関連付けられているPostgreSQLユーザー。ただし、ご想像のとおり、PostgreSQLユーザーはシステムユーザーに対応する場合と対応しない場合があります。

    システムユーザーとPostgreSQLユーザー

    PostgreSQLユーザーは、CREATEROLEなどのSQLコマンドまたはcreatedbなどのバンドルツールを使用して作成できます。

    アプリケーションがPostgresに接続しようとするときは、PostgreSQLユーザー名を指定する必要があります。 psqlのようなPostgreSQLクライアントを起動するとどうなるか見てみましょう:

    alice@devbox:~$ psql
    psql: FATAL:  role "alice" does not exist

    ここで、「alice」はLinuxシステムのユーザー名です。 psqlはこの名前を取り、それをPostgresユーザー名として使用します。その名前の役割(役割は「ユーザー」または「グループ」の一種の総称ですが、ところで)は存在しません。これは、Postgresが不満を言っていることです。

    「postgres」という名前の役割があることはわかっているので、それを試してみましょう。ユーザー名を指定するためにpsqlの「-U」パラメーターを使用できます:

    alice@devbox:~$ psql -U postgres
    psql: FATAL:  Peer authentication failed for user "postgres"

    OK、近づいています。ロール/ユーザーの「postgres」は存在しますが、「peerauthentication」は失敗しました。この「ピア認証」とは何ですか?

    ピアとパスワードの認証

    psqlやアプリなどのPostgreSQLクライアントは、次のIPCメカニズムのいずれかを介してPostgreSQLサーバーに接続できます。

    • Unixドメインソケット
    • TCPソケット

    TCPソケットとは異なり、Unixドメインソケットはクライアント接続のシステムユーザーIDを検証する可能性を提供します。 Postgresサーバーは、Unixドメインソケットを介した着信接続を調べて、クライアントのシステムユーザーIDを判別し、アクセスを許可するかどうかを決定できます。

    デフォルトでは、サーバーはUNIXドメインソケットを介した接続のみをリッスンし、TCP/IPはリッスンしません。

    システムユーザーとしてpsqlを起動しようとするとどうなるか見てみましょう。 postgres:

    alice@devbox:~$ sudo -u postgres psql
    psql (11.0 (Ubuntu 11.0-1.pgdg18.04+2))
    Type "help" for help.
    
    postgres=#

    それはうまくいきました! (「\ q」、「\ quit」、または^Dを使用します ところで、psqlを終了します。)

    ピア認証では、クライアント接続がUnixドメインソケットを使用して行われ、クライアントプロセスが接続しようとしているPostgreSQLユーザーと同じシステムユーザー名を持っている場合、認証は成功したと見なされます。

    PostgreSQLユーザーにはオプションでパスワードを割り当てることもでき、パスワードを使用して着信接続を検証するようPostgreSQLに依頼できます。しかし、どのように?それがパズルの次のピースです。

    pg_hba.conf

    次に、/etc/postgresql/11/main/pg_hba.confにある(悪名高い)pg_hba.conf構成ファイルを開きます。 :

    sudo vim /etc/postgresql/11/main/pg_hba.conf

    HBAは、ホストベースの認証の略です。基本的に、このファイルはPostgreSQLユーザーの認証方法を制御するために使用されます。このファイルは、おそらくPostgreSQLの学習曲線の中で最も直感的でない部分です。リファレンスドキュメントはここにあります。後で読む必要があります。

    ここでの最初の(コメントではない)行は次のとおりです:

    local all postgres peer

    これは、Postgresに「すべての」データベースへの「ローカル」(unixドメイン)接続を受け入れ、「ピア」認証を使用してユーザー「postgres」として認証するように指示します。これが、システムユーザー「postgres」として接続することがすぐに機能する理由です。

    このファイルの行の順序は重要であり、最初に一致する行が優先されます。別の行を見てみましょう:

    host all all 127.0.0.1/32 md5

    この行により、「すべての」ユーザーは、「md5」方式を使用したパスワード認証に成功した場合、ローカルホスト(「127.0.0.1/32」)から「すべての」データベースにTCP / IP(「ホスト」)を使用してログインできます。

    パスワード認証方法(md5、scram-sha-256、gss、ldapなど)は、説明できる範囲を超えているため、簡単な例に戻りましょう。

    ただし、最初に、PostgreSQLがTCP / IP接続も受け入れていることを確認する必要があります。そのためには、メインの構成ファイルを編集する必要があります。

    postgresql.conf

    ファイル/etc/postgresql/11/main/postgresql.conf PostgreSQLクラスターのメイン構成ファイルです。このファイルにはロットが含まれています 設定の、そしてそれらのすべてが何を意味するのかを理解することはまったく簡単な作業ではありません。とりあえず、最初の設定を見てみましょう:

    #listen_addresses = 'localhost'

    この行はデフォルトでコメント化されています。コメントを外して読み上げましょう:

    listen_addresses = 'localhost'

    これにより、PostgreSQLはローカルホストのポート5432(デフォルト)で着信TCP/IP接続をリッスンできます。変更を保存し(これを行うには「root」である必要があります)、変更を有効にするためにPostgresサーバーを再起動します。

    sudo systemctl restart postgresql

    (ほとんどの設定変更では、「再起動」ではなく「再読み込み」する必要があることに注意してください。ただし、これには「再起動」が必要です。

    これで、Postgresが127.0.0.1にバインドされたポート5432でリッスンしていることがわかります:

    alice@devbox:~$ sudo netstat -tnlp | grep 5432
    tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN      8408/postgres

    それでは、アプリで使用する新しいユーザーとデータベースを設定しましょう。

    アプリのセットアップ

    スーパーユーザー「postgres」として接続して変更を加えましょう:

    alice@devbox:~$ sudo -u postgres psql
    psql (11.0 (Ubuntu 11.0-1.pgdg18.04+2))
    Type "help" for help.
    
    postgres=# create user myapp_user password 's3cr3t';
    CREATE ROLE
    postgres=# create database myapp owner myapp_user;
    CREATE DATABASE
    postgres=#

    これで、myappというデータベースが作成されました。 およびmyapp_userというユーザー 、パスワードs3cr3tを使用 。データベースは空であり、ユーザーmyapp_userが所有します。 、これは、myapp_userとして接続することを意味します クライアントは、ほとんどすべてのDDL/DMLコマンドを実行できるようになります。

    今すぐこのアプリユーザーとしてアプリデータベースに接続しましょう:

    alice@devbox:~$ psql -h 127.0.0.1 -d myapp -U myapp_user
    Password for user myapp_user:
    psql (11.0 (Ubuntu 11.0-1.pgdg18.04+2))
    SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
    Type "help" for help.
    
    myapp=>

    機能した!これで、127.0.0.1へのSSL over aTCP / IP接続を使用して、「myapp」に接続されました(プロンプトを参照)。 psqlのコマンドラインでもデータベース名を指定したことに注意してください。歴史的な理由から、これを省略した場合、データベース名もシステムユーザー名(ここでは「alice」)と同じであると見なされますが、これは私たちが望んでいるものではありません。 PostgreSQLのユーザー名も指定されています(「-Umyapp_user」)。

    他のマシンから接続する必要がある場合は、pg_hba.confを編集する必要があります そのような行を追加するには:

    # existing entry, allows connections from localhost
    host all   all        127.0.0.1/32 md5
    
    # new entry to allow connections from 10.1.2.0/24 subnet,
    # only to myapp database for myapp_user
    host myapp myapp_user 10.1.2.0/24  md5

    変更を有効にするには、PostgreSQLをリロードします(「sudosystemctl reloadpostgresql」)。

    これにより、アプリで次のようなデータベース接続文字列を使用できるようになります。

    # URL format
    postgresql://myapp_user:[email protected]/myapp
    
    # connection string format
    host=127.0.0.1 user=myapp_user dbname=myapp password=s3cr3t
    準備完了!

    これにより、アプリ専用のデータベースとユーザーをセットアップできるようになります。アプリ開発フレームワーク(Django、Drupalなど)は、オブジェクト(テーブル、ビューなど)を作成し、このデータベースのデータを管理できる必要があります。


    1. ClusterControlが仮想IPを構成する方法とフェイルオーバー中に何を期待するか

    2. likeおよびワイルドカードを使用したMySQL検索の最適化

    3. SQLiteデータベースをバックアップする

    4. 列のコンマ区切り値をSQLServerの複数の行に分割する