PostgreSQL徹底入門 第4版 インストールから機能・仕組み、アプリ作り、管理・運用まで(近藤 雄太 正野 裕大 坂井 潔 鳥越 淳 笠原 辰仁 石井 達夫)|翔泳社の本
  1. ホーム >
  2. 書籍 >
  3. PostgreSQL徹底入門 第4版 インストールから機能・仕組み、アプリ作り、管理・運用まで

PostgreSQL徹底入門 第4版 インストールから機能・仕組み、アプリ作り、管理・運用まで






監修

形式:
書籍
発売日:
ISBN:
9784798160436
定価:
3,608(本体3,280円+税10%)
仕様:
B5変・392ページ
カテゴリ:
データベース
キーワード:
#データ・データベース,#ネットワーク・サーバ・セキュリティ,#システム運用,#開発環境
シリーズ:
徹底入門
紙の書籍

インストールから機能・仕組み、アプリ作り、管理・運用まで
PosgreSQLの基本を一通り学べる定番入門書

PostgreSQLはオープンソースのリレーショナルデータベース管理システム(RDBMS)です。Linux、macOSといったUNIX系OSはもちろんのこと、Windowsにも対応しています。本書は、初めてPostgreSQLに触れる、あるいはそもそもデータベースに触れるのが初めてという方や、ちょっと使ったことはあるけどもう少し詳しく知りたいという方に向けた入門書です。第4版では、PostgreSQL 11をベースに全面的な改訂を行い、新旧問わずPostgreSQLの基本として初学者が押さえておくべきポイントを選別しています。

日ごろからPostgreSQLと深く関わっている執筆陣が、豊富な経験と知識をもとに、そのインストール方法、SQLの使い方から、アプリケーションの作成、そして運用にいたるまでを、さまざまな分野/視点から解説しています。また、PostgreSQLの最新の機能であるロジカルレプリケーションやパラレルクエリに関しても解説しています。

【構成】
Chapter 1 PostgreSQLについて知ろう
Chapter 2 インストール(Windows編/Linux編)
Chapter 3 WindowsでPostgreSQLを使う~かんたんpgAdminマニュアル
Chapter 4 SQL入門
Chapter 5 PHPでPostgreSQLを使う~PHPアプリケーションの作成(1)
Chapter 6 PHPでPostgreSQLを使う~PHPアプリケーションの作成(2)
Chapter 7 PostgreSQLの仕組みを理解する
Chapter 8 PostgreSQLをきちんと使う
Chapter 9 PostgreSQLをセキュアに使う
Chapter 10 PostgreSQLの動作状況を把握する
Chapter 11 PostgreSQLをメンテナンスする
Chapter 12 PostgreSQLのバックアップとリストア
Chapter 13 レプリケーションを使う

インストールから機能・仕組み、アプリ作り、管理・運用まで

Chapter 1 PostgreSQLについて知ろう
 1.1 データベースとは
 1.2 PostgreSQLの歴史
 1.3 WindowsユーザーのためのPostgreSQL
 1.4 PostgreSQL公式Webサイトの歩き方

Chapter 2 インストール(Windows編/Linux編)
 2.1 インストールの準備
 2.2 Windowsへのインストール
 2.3 LinuxへのYumによるインストール
 2.4 PostgreSQLの起動
 2.5 サーバーの自動起動
 2.6 PostgreSQL操作入門

Chapter 3 WindowsでPostgreSQLを使う~かんたんpgAdminマニュアル
 3.1 pgAdmin 4
 3.2 サーバーの追加
 3.3 データベースの構築
 3.4 データの編集
 3.5 管理コマンドの実行

Chapter 4 SQL入門
 4.1 RDBMSを操作するための言語─SQL
 4.2 psql
 4.3 DDL(CREATE/DROP)
 4.4 DML(INSERT/SELECT/UPDATE/DELETE)
 4.5 DML(SELECTのオプション)
 4.6 DDL(インデックスと制約)
 4.7 トランザクション
 4.8 パラレルクエリ
 4.9 その他のSQLコマンド

Chapter 5 PHPでPostgreSQLを使う~PHPアプリケーションの作成(1)
 5.1 開発環境のセットアップ
 5.2 データベースプログラムを書いてみよう

Chapter 6 PHPでPostgreSQLを使う~PHPアプリケーションの作成(2)
 6.1 SNSアプリケーションを作ってみよう
 6.2 ユーザー登録とログイン処理
 6.3 タイムラインの表示
 6.4 投稿の書き込み処理/削除処理
 6.5 ログアウト処理
 6.6 フォロー/アンフォロー機能
 6.7 コメント機能
 6.8 退会処理
 6.9 まとめ

Chapter 7 PostgreSQLの仕組みを理解する
 7.1 PostgreSQLのプロセス
 7.2 PostgreSQLのデータベースファイル

Chapter 8 PostgreSQLをきちんと使う
 8.1 日本語の扱い
 8.2 チェックサム
 8.3 PostgreSQLの起動と停止
 8.4 設定──postgresql.conf

Chapter 9 PostgreSQLをセキュアに使う
 9.1 ネットワークからのアクセス制御
 9.2 ユーザーによるアクセス制御
 9.3 データベースオブジェクトへのアクセス制御
 9.4 通信の暗号化

Chapter 10 PostgreSQLの動作状況を把握する
 10.1 ログの監視
 10.2 PostgreSQLから得られる情報
 10.3 OSの情報

Chapter 11 PostgreSQLをメンテナンスする
 11.1 VACUUM
 11.2 統計情報の解析
 11.3 インデックス
 11.4 クラスタ化
 11.5 テーブル/インデックスの肥大化対策
 11.6 実行計画
 11.7 PostgreSQLのバージョンアップ

Chapter 12 PostgreSQLのバックアップとリストア
 12.1 論理バックアップと物理バックアップ
 12.2 論理バックアップ
 12.3 オフライン物理バックアップ
 12.4 オンライン物理バックアップ

Chapter 13 レプリケーションを使う
 13.1 レプリケーションとは
 13.2 ストリーミングレプリケーション環境の構築
 13.3 さまざまなレプリケーションの機能
 13.4 レプリケーションの運用

付属データはこちら

お問い合わせ

内容についてのお問い合わせは、正誤表、追加情報をご確認後に、お送りいただくようお願いいたします。

正誤表、追加情報に掲載されていない書籍内容へのお問い合わせや
その他書籍に関するお問い合わせは、書籍のお問い合わせフォームからお送りください。

利用許諾に関するお問い合わせ

本書の書影(表紙画像)をご利用になりたい場合は書影許諾申請フォームから申請をお願いいたします。
書影(表紙画像)以外のご利用については、こちらからお問い合わせください。

  • ■24ページ 「2.2.5 パスの設定」赤枠内の追加情報


    (画像クリックで拡大)

    Windows OSのアップデートでGUIが変化しています。
    上記の手順で「システムの詳細設定」を開けない場合は、以下の手順にしたがってください。

    1.Windowsキー+[R]キーの同時押しで「ファイル名を指定して実行」を呼び出す。
    2.「ファイル名を指定して実行」が表示されたら、入力欄に「SystemPropertiesAdvanced.exe」と入力して[OK]をクリックする。

  • ■26ページ「2.3.1 Yumリポジトリの設定」赤枠内の追加情報


    (画像クリックで拡大)

    執筆時点からファイルサーバーが再編成され、URLが無効になっています。
    新しいURLは以下のとおりです。

    https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

  • ■28ページ「2.3.2 PostgreSQLのインストール」赤枠内の追加情報


    (画像クリックで拡大)

    執筆時点では上記の対応が必要でしたが、PostgreSQL 11.8(2020年5月15日)以降は
    llvmパッケージを個別にインストールするのではなく、以下のコマンドで外部リポジトリを登録するだけでよくなっています。

    # yum -y install epel-release centos-release-scl

  • ■29ページ「2.3.2 PostgreSQLのインストール」赤枠内の追加情報


    (画像クリックで拡大)

    本書では、Linux OSのSELinuxとファイアウォールは無効化していることを想定しています。
    あらかじめ以下の操作でSELinuxとファイアウォールを無効化しておいてください。

    ●SELinuxの無効化
    rootユーザーで/etc/selinux/configを以下のとおり編集します。

    # SELINUX= can take one of these three values:
    # enforcing - SELinux security policy is enforced.
    # permissive - SELinux prints warnings instead of enforcing.
    # disabled - No SELinux policy is loaded.
    SELINUX=permissive (筆者注意: permissive は太字)

    その後、OSを再起動します。

    # reboot

    ●ファイアウォールの無効化
    起動しているファイアウォールを停止します。

    # systemctl stop firewalld

    ファイアウォールの自動起動を無効化します。

    # systemctl disable firewalld

ご購入いただいた書籍の種類を選択してください。

書籍の刷数を選択してください。

刷数は奥付(書籍の最終ページ)に記載されています。

現在表示されている正誤表の対象書籍

書籍の種類:

書籍の刷数:

本書に誤りまたは不十分な記述がありました。下記のとおり訂正し、お詫び申し上げます。

対象の書籍は正誤表がありません。

最終更新日:2023年02月14日
発生刷 ページ数 書籍改訂刷 電子書籍訂正 内容 登録日
1刷 005
2~4行目
2刷
マイナーバージョンは、主にバグ修正版です。一方、メジャーバージョンの番号は、新機能の追加などで大幅に変更された場合に上がります。
マイナーバージョンの番号は、主にバグ修正が行われると上がります。一方、メジャーバージョンの番号は、新機能の追加など、大きな仕様変更が行われると上がります。
2021.05.26
1刷 010
「■ メモリの容量」1~2行目
2刷
また、並べ替えなどを行うために、さらにメモリ領域が必要となります。
また、データの並べ替えなどを行うために、さらにメモリ領域が必要となります。
2021.05.26
1刷 011
「2.2.2 one click installerのダウンロード」3行目
2刷
https://www.enterprisedb.com/products/pgdownload.do#windows
https://www.enterprisedb.com/downloads/postgres-postgresql-downloads
2021.05.26
1刷 030
「2.3.3 環境設定」3~19行目
2刷
vi などのエディタで~postgres/.bash_profileを編集します。 $ vi ~postgres/.bash_profile 次のように.bash_profileを編集します。 [ -f /etc/profile ] && source /etc/profile PATH=/usr/pgsql-11/bin:$PATH ―――追加 MANPATH=/usr/pgsql-11/share/man:$MANPATH  ―――追加 PGDATA=/var/lib/pgsql/11/data export PATH MANPATH PGDATA  ―――追加 ● PATH PostgreSQL のコマンドを絶対パスで指定せずに実行できるよう、環境変数PATHを設 定します。 ● MANPATH PostgreSQLのコマンドのオンラインマニュアルを参照できるよう、環境変数MANPATH を設定します。 ● PGDATA データベースクラスタのパスになります。 .bash_profileを編集し終えたら、設定ファイルを再読み込みしてください。 .bash_profileを編集し終えたら、設定ファイルを再読み込みしてください。
vi などのエディタで~postgres/.pgsql_profileを作成します。基本的にユーザーの環境変数は.bash_profile で編集しますが、PostgreSQL の本家サイトが公開するYumリポジトリを通してPostgreSQLをインストールする場合に限り、.pgsql_profileを使う必要があります。これは、本家サイトのPostgreSQL はインストールの都度、postgres ユーザーの.bash_profile は自動的に上書きするようになっているからです。 $ vi ~postgres/.pgsql_profile 次のように.pgsql_profileを編集します。 PATH=/usr/pgsql-9.0/bin:$PATH MANPATH=/usr/pgsql-9.0/share/man:$MANPATH PGDATA=/var/lib/pgsql/9.0/data export PATH MANPATH PGDATA ● PATH PostgreSQL のコマンドを絶対パスで指定せずに実行できるよう、環境変数PATHを設定します。 ● MANPATH PostgreSQLのコマンドのオンラインマニュアルを参照できるよう、環境変数MANPATHを設定します。 ● PGDATA データベースクラスタのパスになります。詳細については、「2.4.1 データベースクラスタの作成」で説明します。 .pgsql_profile を編集し終えたら、.bash_profile を再読み込みしてください。.bash_profile から.pgsql_profileも読み込まれるようになっています。

2刷で上記の修正をおこないましたが、内容の一部に誤りがございました。
大変申し訳ありません。
正しくは以下のとおりです。
(2021年7月20日)

■「2.3.3 環境設定」10~13行目
正:
PATH=/usr/pgsql-11/bin:$PATH

MANPATH=/usr/pgsql-11/share/man:$MANPATH

PGDATA=/var/lib/pgsql/11/data
export PATH MANPATH PGDATA
2021.05.26
1刷 037
Column「データベースクラスタのバージョンアップ」のコード説明フキダシ(2箇所)
2刷
移行元
移行先
2020.02.13
1刷 048
表3.1の1行目
2刷

(画像クリックで拡大)

(画像クリックで拡大)

2行目以降と体裁を揃えます。
2021.05.26
1刷 074
3つ目のコマンド
2刷
$ psql -U testuser testdb
$ psql testdb testuser
2020.02.13
1刷 086
表4.4の「説明」の1行目
2刷
総数
検索対象行の総数
2021.05.26
1刷 091
「4.5.4 JOIN」6行目
2刷
meibo テーブルのID列と
meiboテーブルのid列と

「ID列」を「id列」(小文字)に変更します。
2021.05.26
1刷 161
5行目
3刷
そしてこのデータベースで上記のDDLを実行し、3つのテーブルを
そしてこのデータベースで上記のDDLを実行し、4つのテーブルを
2023.02.14
1刷 164
「リスト6.2 Csrf.php」のコード 上から2行目
3刷

(画像クリックで拡大)

(画像クリックで拡大)

この改行により、31行目以降の行数をを繰り下げます。
2023.02.14
1刷 164
「リスト6.2 Csrf.php」のコード 上から2~3行目
2刷

(画像クリックで拡大)

(画像クリックで拡大)

「31:   }」を改行します。
2020.07.13
1刷 169
リスト6.6 29~37行目
2刷

(画像クリックで拡大)

(画像クリックで拡大)
2021.05.26
1刷 170
リスト6.6 38~45行目
2刷

(画像クリックで拡大)

(画像クリックで拡大)
2021.05.26
1刷 170
本文12~18行目
2刷
また、PHP にはバイナリセーフではない関数【3】もあるので、$allow_binaryをtrue にしな い限りはNULL バイトを許さないようにしています。 mb_check_encoding 関数はdefault_charset に設定した値、さらに内部文字エンコーディ ングの値をもとにチェックを行います(34 行目)。今回は設定していないのでデフォルトの UTF-8 がdefault_charsetとして用いられています。このため、mb_check_encoding 関数は指 定された文字列がUTF-8として有効かどうかをチェックします。$allow_binary がtrue でな い限りUTF-8 以外の文字列も不正としました。
$allow_binary が偽のときは、文字列が正当どうかのチェックを行います【※】。今回は不要 な文字列が1つでも見つかった場合には$bad_input_exists にtrue が設定されます。これが 参照渡しになっているので、filter_input 関数が終わった後の上位のスコープでも判定がで きるという仕組みです。 PHP にはバイナリセーフではない関数【3】もあるので、NULL バイトを許さないようにして います。mb_check_encoding 関数はdefault_charset に設定した値、または内部文字エンコー ディングの値をもとにチェックを行います(35 行目)。今回は設定していないのでデフォルト のUTF-8 がdefault_charsetとして用いられ、UTF-8として正しいかがチェックされます。

側注に以下を追加します。

【※】
filter_input 関数の第4引数、キーoptions の値は無名関数です。この無名関数は、渡されたデータがスカラーの場合には1度だけ、配列の場合には要素数の回数分呼び出されます。変数を上位のスコープから引き継ぐことができ、その場合はuseで渡します。
2021.05.26
1刷 181
「6.2.3 ログイン処理」の「リスト6.13 signup.html(変更後)」とその上の文章。
3刷

(画像クリックで拡大)

(画像クリックで拡大)
2023.02.14
1刷 185
ページ中央 本文5行目
3刷
次に、先ほど作成したスクリプトファイルの Login.php を修正します(リスト 6.17)。
次に、スクリプトファイル login.php を作成します(リスト 6.17)。
2021.12.15
1刷 185
「リスト 6.17」の表題
3刷
リスト 6.17 Login.php(修正後)
リスト 6.17 login.php
2021.12.15
1刷 187
本文1行目
3刷
login.phpは以下の場所に保存します。 C:¥mytest¥simplesns¥public_html¥login.php

上記文章を「リスト 6.17」の直後に挿入します。
2021.12.15
1刷 194
リスト6.19
3刷
23: <a href="post.php?post_id=<?= h($post['post_id']) ?>"><?= nl2br(h($post['post']), false) ?></a>
23: <a href="post.php?post_id=<?= rawurlencode($post['post_id']) ?>"><?= nl2br(h($post['post']), false) ?></a>
2023.02.14
1刷 200
リスト6.22
3刷
9: <a href="post.php?post_id=<?= h($post['post_id']) ?>"><?= nl2br(h($post['post']), false) ?></a> 10: <div class="created-at"><?= h((new DateTime($post['created_at']))->format('Y-m-d H:i')) ?></div> 11: <?php endforeach; ?> 12: </table>
9: <a href="post.php?post_id=<?= rawurlencode($post['post_id']) ?>"><?= nl2br(h($post['post']), false) ?></a> 10: <div class="created-at"><?= h((new DateTime($post['created_at']))->format('Y-m-d H:i')) ?></div> 11: <?php endforeach; ?> 12: </dl>
2023.02.14
1刷 209
リスト6.28
3刷
37: <dt><a href="user.php?user_name=<?= h($post['user_name']) ?>"><?= h($post['user_name']) ?> 38: <dd> 39: <a href="post.php?post_id=<?= h($post['post_id']) ?>"><?= nl2br(h($post['post']), false) ?></a>
37: <dt><a href="user.php?user_name=<?= rawurlencode($post['user_name']) ?>"><?=h($post['user_name']) ?></a> 38: <dd> 39: <a href="post.php?post_id=<?= rawurlencode($post['post_id']) ?>"><?= nl2br(h($post['post']), false) ?></a>
2023.02.14
1刷 217
リスト6.31
3刷
5: <dt><a href="/user.php?user_name=<?= h($post['user_name']) ?>"><?= h($post['user_name']) ?></a></dt> 6: <dd><?= nl2br(h($post['post']), false) ?></dd> 7: <dd><?= h((new DateTime($post['created_at']))->format('Y-m-d H:i')) ?></dd> 18: <dt><a href="/user.php?user_name=<?= h($login->user('user_name')) ?>"><?= h($login->user('user_name')) ?></a></dt>
5: <dt><a href="/user.php?user_name=<?= rawurlencode($post['user_name']) ?>"><?= h($post['user_name']) ?></a> 6: <dd><?= nl2br(h($post['post']), false) ?></dd> 7: <dd class="created-at"><?= h((new DateTime($post['created_at']))->format('Ym-d H:i')) ?> 18: <dt><a href="/user.php?user_name=<?= rawurlencode($login->user('user_name'))?>"><?= h($login->user('user_name')) ?></a>
2023.02.14
1刷 218
リスト6.31
3刷
40: <a href="user.php?user_name=<?= h($comment['user_name']) ?>"><?= h($comment['user_name']) ?></a> 41: <?php endif; ?> 42: <dd><a href="comment.php?comment_id=<?= h($comment['comment_id']) ?>"><?= nl2br(h($comment['comment']), false) ?></a> 43: <dd><?= h((new DateTime($comment['created_at']))->format('Y-m-d H:i')) ?></dd>
40: <a href="user.php?user_name=<?= rawurlencode($comment['user_name']) ?>"><?= h($comment['user_name']) ?></a> 41: <?php endif; ?> 42: <dd><a href="comment.php?comment_id=<?= rawurlencode($comment['comment_id'])?>"><?= nl2br(h($comment['comment']), false) ?></a> 43: <dd class="created-at"><?= h((new DateTime($comment['created_at']))->format(' Y-m-d H:i')) ?>
2023.02.14
1刷 227
リスト6.35
3刷
6: <a href="user.php?user_name=<?= h($comment['post_user_name']) ?>"><?= h($comment['post_user_name']) ?></a> 8: <a href="post.php?post_id=<?= h($comment['post_id']) ?>"><?= nl2br(h($comment['post']), false) ?></a> 14: <a href="/user.php?user_name=<?= h($comment['user_name']) ?>"><?= h($comment['user_name']) ?></a></dt> 20: <dt><a href="/user.php?user_name=<?= h($login->user('user_name')) ?>"><?= h($login->user('user_name')) ?></a></dt>
6: <a href="user.php?user_name=<?= rawurlencode($comment['post_user_name']) ?>"><?= h($comment['post_user_name']) ?></a> 8: <a href="post.php?post_id=<?= rawurlencode($comment['post_id']) ?>"><?= nl2br(h($comment['post']), false) ?></a> 14: <a href="/user.php?user_name=<?= rawurlencode($comment['user_name']) ?>"><?= h($comment['user_name']) ?></a> 20: <dt><a href="/user.php?user_name=<?= rawurlencode($login->user('user_name'))?>"><?= h($login->user('user_name')) ?></a>
2023.02.14
1刷 228
リスト6.35
3刷

(画像クリックで拡大)

(画像クリックで拡大)
2023.02.14
1刷 237
リスト6.38
3刷
6: <a href="user.php?user_name=<?= h($comment['post_user_name']) ?>"><?= h($comment['post_user_name']) ?></a> 7: <dd> 8: <a href="post.php?post_id=<?= h($comment['post_id']) ?>"><?= nl2br(h($comment['post']), false) ?></a>
6: <a href="user.php?user_name=<?= rawurlencode($comment['post_user_name']) ?>"><?= h($comment['post_user_name']) ?></a> 7: <dd> 8: <a href="post.php?post_id=<?= rawurlencode($comment['post_id']) ?>"><?= nl2br(h($comment['post']), false) ?></a>
2023.02.14
1刷 238
リスト6.38
3刷
17: <a href="user.php?user_name=<?= h($parent_comment['user_name']) ?>"><?= h($parent_comment['user_name']) ?></a>
17: <a href="user.php?user_name=<?= rawurlencode($parent_comment['user_name'])?>"><?= h($parent_comment['user_name']) ?></a>
2023.02.14
1刷 280
1番上コード例
2刷
template1=# SELECT rolname, rolpassword FROM pg_authid WHERE rolname = 'user1'; rolname | rolpassword ---------+------------------------------------- user1 | md57d1b5a4329b6478e976508ab9a49ee3d  改めてパスワードを設定します。
template1=# SELECT rolname, rolpassword FROM pg_authid WHERE rolname = 'user1'; rolname | rolpassword ---------+------------------------------------- user1 | md57d1b5a4329b6478e976508ab9a49ee3d template1=> SET password_encryption TO 'scram-sha-256';  改めてパスワードを設定します。
2020.02.13
2刷 030
「2.3.3 環境設定」10~13行目
3刷
PATH=/usr/pgsql-9.0/bin:$PATH MANPATH=/usr/pgsql-9.0/share/man:$MANPATH PGDATA=/var/lib/pgsql/9.0/data export PATH MANPATH PGDATA
PATH=/usr/pgsql-11/bin:$PATH MANPATH=/usr/pgsql-11/share/man:$MANPATH PGDATA=/var/lib/pgsql/11/data export PATH MANPATH PGDATA
2021.07.20