80
© LPI-Japan 2011. All rights reserv OSS-DB Exam Silver 技技技技技技技技技技 技技技技技技技技技技技技技技技技技技技 技技技技技技 技技技技技技 技技 技2011/10/15

OSS-DB Exam Silver 技術解説無料セミナー

Embed Size (px)

DESCRIPTION

OSS-DB Exam Silver 技術解説無料セミナー. 2011/10/15. 特定非営利活動法人エルピーアイジャパン テクノロジー・マネージャー 松田 神一. Agenda. OSS-DB 技術者認定試験の概要 PostgreSQL のインストール ポイント解説:運用管理 ポイント解説: SQL OSS-DB Exam Silver の例題. 自己紹介. 松田 神一(まつだ しんいち) LPI-JAPAN テクノロジー・マネージャー NEC、 オラクル、トレンドマイクロなどで約20年間、ソフトウェア開発に 従事(専門はアプリケーション開発) - PowerPoint PPT Presentation

Citation preview

Page 1: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved.

OSS-DB Exam Silver技術解説無料セミナー

特定非営利活動法人エルピーアイジャパンテクノロジー・マネージャー松田 神一

2011/10/15

Page 2: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 2

Agenda

OSS-DB 技術者認定試験の概要PostgreSQL のインストールポイント解説:運用管理ポイント解説: SQLOSS-DB Exam Silver の例題

Page 3: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 3

自己紹介

松田 神一(まつだ しんいち)LPI-JAPAN テクノロジー・マネージャー

NEC 、オラクル、トレンドマイクロなどで約 20 年間、ソフトウェア開発に従事 ( 専門はアプリケーション開発 )

 うち 10 年間はデータベース、およびデータベースアプリケーションの開発 (Oracle 、 C 言語、 SQL 言語 )

2010 年 7 月から現職

Page 4: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 4

今日のゴール

受験準備のために何をすべきかの理解 実機で試せる環境の準備 出題範囲、試験の目的、合格基準

OSS-DB 技術者認定試験についてのポイントの理解 PostgreSQL の設定、運用管理 SQL によるデータ操作 他の RDBMS との主な違い

Page 5: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 5

OSS-DB 技術者認定試験の概要

Page 6: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 6

OSS-DB 技術者認定試験の概要

認定の種類 Silver( ベーシックレベル )

OSS-DB Exam Silver に合格すれば認定される Gold( アドバンストレベル )

OSS-DB Silver の認定を取得し、 OSS-DB Exam Gold に合格すれば認定される

Silver 認定の基準 データベースの導入、 DB アプリケーションの開発、 DB の運用管理

ができること OSS-DB の各種機能やコマンドの目的、使い方を正しく理解してい

ること

Gold 認定の基準 トラブルシューティング、パフォーマンスチューニングなど OSS-

DB に関する高度な技術を有すること コマンドの出力結果などから、必要な情報を読み取る知識やスキル

があること

Page 7: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 7

OSS-DB Exam Silver の出題範囲

一般知識 (20%) OSS-DB の一般的特徴 ライセンス コミュニティと情報収集 RDBMS に関する一般的知識

運用管理 (50%) インストール方法 標準付属ツールの使い方 設定ファイル バックアップ方法 基本的な運用管理作業

開発 / SQL(30%) SQL コマンド 組み込み関数 トランザクションの概念

Page 8: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 8

出題範囲に関する注意事項

最新の出題範囲はhttp://www.oss-db.jp/outline/examarea.shtmlで確認できる

前提とする RDBMS は PostgreSQL 9.0

Silver では OS に依存する問題は出題しないが、記号や用語がOSによって異なるものについては、 Linux のものを採用している

OS のコマンドプロンプトには $ を使う 「フォルダ」ではなく「ディレクトリ」と呼ぶ ディレクトリの区切り文字には / を使う

出題範囲に関する FAQhttp://www.oss-db.jp/faq/#n02

Page 9: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 9

傾向と対策

Silver の合格基準は、各機能やコマンドについて その目的を正しく理解していること

XXX コマンドを使うと何が起きるか YYY をするためにはどのコマンドを使えば良いか

利用法を正しく理解していること コマンドのオプションやパラメータ 設定ファイルの記述方法

出題範囲にあるすべての項目について、試験問題が用意されている

出題範囲詳細に載っている項目すべてについて、マニュアルなどで調査した上で、実際に試して理解する

実機で試すことは極めて重要

Page 10: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 10

RDBMS の種類による共通点と違い

主な商用 RDBMS: Oracle, DB2(IBM), SQL Server(MS)主な OSS RDBMS: PostgreSQL, MySQL, Firebird共通点

RDBMS としての各種機能 データ管理/入出力 ユーザ管理 アクセス権限管理、セキュリティ バックアップ、リカバリ

SQL 言語 ( ANSI/ISO で標準化 )違い

各種機能の使い方 コマンドとオプション 設定ファイルとパラメータ

SQL の方言 独自拡張機能

Page 11: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 11

データベース学習のヒント

どの製品にも共通の機能もあれば、同じ機能でも製品によって実行方法の異なるもの、特定の製品にしかない機能もある

まずは DB の種類による差分はあまり気にせずに、特定の DB について学習し、マスターする

次のステップは…

横展開他の DB について、最初に学習した DB との差分に注意しながら学習する

深掘りその製品のエキスパートとなるべく、更に深く学ぶ

Page 12: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 12

PostgreSQL のインストール

Page 13: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 13

必要な環境

インストールに必要な環境 インターネットにつながっているマシン (Windows/Mac/Linux) インストーラの入ったメディアがあれば、オフラインの PC でもイ

ンストール可能

おススメの環境 ある程度、 Linux の知識がある方には Linux を使うことを勧める。 VMware Player などを使えば、 Windows PC上に仮想 Linux 環境

を構築し、そこに PostgreSQL をインストールして学習することができる。

仮想環境の良い点は、それを破壊しても、簡単に最初からやり直せるところ

もちろん、 Windows や Mac の環境に直接、 PostgreSQL をインストールするのでも OK。

参考書などを読むだけでは、十分な学習をすることはできません。

自分専用の環境を作り、そこでいろいろ試すことで学習してください。

Page 14: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 14

PostgreSQL のインストールと初期設定

インストール方法 ソースコードから自分でビルドしてインストール ビルド済みのパッケージをインストール (様々なビルド済みパッ

ケージがある )ダウンロードサイト

http://www.postgresql.org/download/ インストール後の初期設定

データベースのスーパーユーザ (postgresユーザ ) の作成 環境変数 (PATH, PGDATA など ) の設定 データベースの初期化 ( データベースクラスタの作成 ) データベース (サーバープロセス ) の起動 データベース (サーバープロセス ) 起動の自動化

インストール方法によっては、初期設定の一部が自動的に実行される

インストール方法によって、プログラムがインストールされる場所、データベースファイルが作られる場所が大きく異なるので注意

Page 15: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 15

ワンクリックインストールWindows/Mac/Linux いずれでも利用可能

EnterpriseDB社のサイトから、ビルド済みのパッケージをダウンロードしてインストールするhttp://www.enterprisedb.com/products-services-training/pgdownload

GUI の管理ツール (pgAdmin III) も同時にインストールされる Apache や PHP など、 PostgreSQL と一緒に使われるソフトウェアも、同時にインストール可能

Windows ではワンクリックインストールの利用を推奨インストールガイド (英語 ) は

http://www.enterprisedb.com/resources-community/pginst-guide 多くの項目はデフォルト値のままで良い

スーパーユーザ (postgres) のパスワードの設定を求められるので、適切に設定し、それを忘れないようにすること

ロケール (Locale) の設定を求められるが、 "Default locale" となっているのを "C" に変更することを推奨する

インストール終了時にスタックビルダ (Stack Builder) を起動するかどうか尋ねられるが、ここはチェックボックスを外して終了してよい。必要なら後でスタックビルダを起動することができる

Page 16: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 16

ワンクリックインストール後の初期設定

postgresユーザは自動的に作成される。データベースの初期化、起動はインストール時に実行されるので、

インストール後、すぐにデータベースに接続できる。データベースの自動起動の設定がされるので、マシンを再起動し

たときもデータベースが自動的に起動する。Windows では C:\Program Files\PostgreSQL\9.0 の下にイン

ストールされる。データベースは C:\Program Files\PostgreSQL\9.0\data の下に作られる。環境変数 PATH に C:\Program Files\PostgreSQL\9.0\bin を追加するか、あるいは C:\Program Files\PostgreSQL\9.0 の下の pg_env.bat を実行する。

Linux では / opt/PostgreSQL/9.0 の下にインストールされる。データベースは / opt/PostgreSQL/9.0/data の下に作られる。環境変数 PATH に / opt/PostgreSQL/9.0/bin を追加するか、あるいは / opt/PostgreSQL/9.0 の下の pg_env.sh を読み込む。(". pg_env.sh" を実行する )

Page 17: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 17

Linuxへのインストール( OpenSCG のパッケージ)

http://www.openscg.org/se/postgresql/packages.jsp に、 RedHat系、 Debian系、それぞれのバイナリパッケージが用意されているので、ダウンロードして、 rpm コマンド、 dpkgコマンドを使ってインストールすることが可能。インストール方法、インストール後のセットアップなどの詳細は、上記のページの "Installing RPM's" および "Installing DEB's" のリンクに記述されている。

RedHat系は "rpm -ihv filename" を、 Debian系は "dpkg -i filename" を root で実行すると、 / opt/postgres/9.0 の下にプログラムがインストールされる。

# /etc/init.d/postgres-9.0-openscg startを実行すると、 postgres ユーザの作成、データベースの初期化、自動起動の設定などが行われる。データベースは / opt/postgres/9.0/data の下に作られる。

PATH に / opt/postgres/9.0/bin を追加するか、 / opt/postgres/9.0 の下の pg90-openscg.env を読み込む。(". pg90-openscg.env" を実行 )

Page 18: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 18

Linux(RedHat系 )へのインストール

CentOS や Fedora では、 yum コマンドでインストールするのが基本だが、# yum install postgresql-serverとすると、 PostgreSQL 8.4( あるいはもっと古いバージョン ) がインストールされるので注意。

http://yum.postgresql.org/packages.php に PostgreSQL のバージョン、および Linux ディストリビューションに応じたパッケージのリンクがある。

例えば、 PostgreSQL 9.0 の CentOS 5.x 用の 32ビット版は http://yum.postgresql.org/9.0/redhat/rhel-5-i386/repoview/

Available Groups のリンクをクリックし、 postgresql90( クライアント ), postgresql90-libs( ライブラリ ), postgresql90-server(サーバ ) の 3つのパッケージをダウンロード

rpm で、ライブラリ→クライアント→サーバ、の順でインストール

# rpm –ivh postgresql90-libs-9.0.5-1PGDG.rhel5.i386.rpm# rpm –ivh postgresql90-9.0.5-1PGDG.rhel5.i386.rpm# rpm –ivh postgresql90-server-9.0.5-1PGDG.rhel5.i386.rpm

Page 19: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 19

Linux(RedHat系 )へのインストール後の初期設定

postgres ユーザは自動的に作成される。プログラムは / usr/pgsql-9.0 の下にインストールされる。デー

タベースは / var/lib/pgsql/9.0/data の下に作成される。主なコマンドは / usr/bin の下にシンボリックリンクが作られる

が、 pg_ctl や initdb など一部のコマンドについてはリンクが作成されないので、 PATH を設定するか、絶対パスで起動する必要がある。

インストールしただけでは、データベースの初期化、起動、自動起動の設定などはされない。

# service postgresql-9.0 initdb ( データベース初期化 ) # service postgresql-9.0 start ( データベース起動 ) # chkconfig postgresql-9.0 on ( データベース自動起動の設定 )

Page 20: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 20

RedHat系への yum によるインストール

PostgreSQL 9.0 を yum コマンドでインストールする場合について http://yum.pgrpms.org/howtoyum.php にパッケージとインストールガイド (英語 ) がある。

リポジトリを rpm でインストールし、パッケージを yum でインストールする。

上記ページの“Please click here and download…” の“here” をクリック。http://yum.postgresql.org/repopackages.php に表示されているリストから、インストールする PostgreSQL のバージョン、 Linux ディストリビューションのバージョンに合ったリンクをクリック。PostgreSQL 9.0 を CentOS 5.x(32bit版 ) にインストールする場合はhttp://yum.postgresql.org/9.0/redhat/rhel-5-i386/pgdg-centos90-9.0-5.noarch.rpm をダウンロード。# rpm -ivh pgdg-centos-9.0-5.noarch.rpmとしてリポジトリをインストールする。

Page 21: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 21

RedHat系への yum によるインストール

http://yum.pgrpms.org/howtoyum.php の中ほどにある Important note の指示に従い、 / etc/yum.repos.d の下の CentOS-Base.repo を編集する。 [base] と [updates] にexclude=postgresql*を追加する。

最後に# yum install postgresql90-serverとすればパッケージがインストールされる。

yum でインストールした後の状態は、 rpm コマンドでライブラリ、クライアント、サーバをインストールした時と同じなので、同様に初期設定を行う

Page 22: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 22

Linux ( Ubuntu)へのインストール

$ sudo apt-get install postgresqlとすると、やはり PostgreSQL 8.4 がインストールされてしまう。

PPA(Personal Package Archives) を利用すれば、以下の手順でインストール可能。$ sudo add-apt-repository ppa:pitti/postgresql$ sudo apt-get update$ sudo apt-get install postgresql

postgres ユーザが自動的に作られる。データベースも作成され、自動起動の設定もされる。

プログラムは / usr/lib/postgresql/9.0 の下、データベースは / var/lib/postgresql/9.0/main の下に作られる。

主なコマンドは / usr/bin の下にシンボリックリンクが作られるが、 pg_ctl や initdb など一部のコマンドについてはリンクが作成されないので、 PATH を設定するか、絶対パスで起動する必要がある。

インストール後の環境がちょっと特殊なので、学習環境としては推奨しない。

Page 23: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 23

ソースコードからのインストール

Linux では、コンパイラなどの開発環境が標準で用意されており( インストールされていなくても簡単にセットアップ可能 ) 、ソースコードから自分でビルドしてインストールするのも難しくない。

ソースコードは PostgreSQL の公式サイトからダウンロードhttp://www.postgresql.org/ftp/source/

ビルド、およびインストールの手順は、オンラインマニュアルhttp://www.postgresql.jp/document/9.0/html/ の 15章 (Linux) 、 16章 (Windows) に解説されている。

基本的には、$ ./configure$ make# make installを実行するだけ。

多くの環境では configure の実行でいくつかエラーが出るが、これを自力で解決できる人には、ソースからのインストールを勧める。

市販書籍では、ソースからビルドを前提に解説された記述が多い

Page 24: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 24

ソースコードからインストールした後の初期設定

make install は、プログラムを / usr/local/pgsql の下にコピーするだけなので、その後の初期設定をすべて実行する必要がある。

初期設定の手順はオンラインマニュアルの 17章に解説があるpostgres ユーザの作成# useradd postgres

環境変数の設定 (~postgres/.bash_profile 、および PostgreSQLを利用するユーザの ~/.bash_profile に追記 )export PATH=$PATH:/usr/local/pgsql/binexport PGDATA=/usr/local/pgsql/dataexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/pgsql/libexport MANPATH=$MANPATH:/usr/local/pgsql/share/man

データベース用ディレクトリの作成# mkdir /usr/local/pgsql/data# chown postgres /usr/local/pgsql/data# chmod 700 /usr/local/pgsql/data

Page 25: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 25

ソースコードからインストールした後の初期設定

データベースの初期化と起動 (postgresユーザで実行 )$ initdb -E UTF8 --no-locale $ pg_ctl start

自動起動の設定 (RedHat系 )contrib/start-scripts/linux を / etc/rc.d/init.d/postgresql-9.0 にコピー# chkconfig --add postgresql-9.0# chkconfig postgresql-9.0 on

自動起動の設定 (Debian系 )contrib/start-scripts/linux を / etc/init.d/postgresql-9.0 にコピー$ sudo update-rc.d postgresql-9.0 defaults 98 02

Page 26: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 26

インストールに関する注意事項

インストール方法によっては、 initdb, pg_ctl など ( 試験範囲に含まれる ) 一部のコマンドへの PATH が通っていないので、 PATH変数を変更する、あるいは / usr/local/bin にリンクを張る、などの必要がある

PostgreSQL の実行ファイル、ライブラリなどが置かれる場所、データベースファイルが作成される場所がどこか、インストール後に確認しておくこと ( インストール方法によって大きく異なるので注意 )

yum, rpm, apt-get, dpkg等、 OS やパッケージに依存したインストールコマンドや手順は出題しない

Page 27: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 27

ポイント解説:運用管理

Page 28: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 28

データベース運用管理の目的

必要な人に、適切な DBサービスを提供すること ( セキュリティ管理 )

必要ない人にはサービスを提供しない 不正なアクセスを拒絶する 設定と監視

サービスレベルの維持 定められた水準のサービスを提供し続けること

サービスを提供する時間 パフォーマンスの維持

トラブルシューティング (予防と対処 ) DB に接続できない DB が遅い DB が起動しない ディスク、ファイル、データの破損 バックアップ、リストア、リカバリ

Page 29: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 29

他の RDBMS との違い

運用管理に必要とされる機能、実現されている機能はほぼ同じだが、使用するコマンド、パラメータ、設定ファイルなどは全く異なる

それぞれの RDBMS について基本からマスターする

同じ用語を使っていても、その意味が RDBMS の種類によって異なることもあるので注意が必要

Page 30: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 30

データベース構造

データベースインスタンス データベースを構成するプロセス、共有メモリ、ファイルを合わせ

たものをインスタンスと呼ぶ PostgreSQL のサーバプロセスはマルチプロセス構成で、データア

クセス、ログ出力などのために、それぞれ別のプロセスが起動している

データベースファイルについては、その置き場所となるディレクトリを指定すると、 PostgreSQLサーバがその下にファイルを作成する

データベースクラスタ 初期化された直後の PostgreSQL のインスタンスには、 template0,

template1 という 2 つのテンプレートデータベースと、 postgresというデータベースが含まれる。これら複数のデータベースの集合体をデータベースクラスタと呼んでいる (PostgreSQL独自の用語 )

PostgreSQL のサーバプロセスは、 1 つのデータベースクラスタを管理できる、つまりクラスタ内の複数のデータベースを管理できる

Page 31: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 31

データベースクラスタのイメージ

データベースクラスタ

グローバルデータ(ユーザ情報など )

システム領域 設定ファイル

template0 template1 postgres user_db

表 表 表 表 1

表 2関数 関数 関数関数

Page 32: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 32

データベースの初期化、起動と終了

データベースクラスタの新規作成 initdb コマンド 主なオプション

-D : データベースクラスタを作成するディレクトリ -E : デフォルトのエンコーディング( UTF8 など ) --locale : ロケール (ja_JP など )

データベースの起動 pg_ctl start 主なオプション

-D : データベースクラスタのあるディレクトリデータベースの終了

pg_ctl stop 主なオプション

-D : データベースクラスタのあるディレクトリ -m : 停止モード (smart/fast/immediate)

–D オプションを省略すると、環境変数 PGDATA が使われる

Page 33: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 33

設定ファイル (postgresql.conf)

DBサーバーのリソースなど、各種パラメータの設定をするファイル

'#'で始まる行はコメント "パラメータ名 = 値 " という形式でパラメータを設定 主なパラメータと設定の例

listen_address = '*' (TCP接続を許可する ) log_destination = 'syslog' (サーバーのログを syslog に出力する ) log_line_prefix = '%t %p' ( ログ出力時に、時刻とプロセス ID を付加

この他、パフォーマンスチューニングなどのための多数のパラメータが設定できるが、 OSS-DB Silver の試験で問われるのは、以下の4つ ( 数字はマニュアルの節番号 )

記述方法 (18.1) 接続と認証 (18.3) クライアント接続デフォルト (18.10) エラー報告とログ取得 (18.7)

Page 34: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 34

設定ファイル (pg_hba.conf)

HBA=Host Based AuthenticationDBへの接続を許可 ( あるいは拒否 ) する接続元、データベース、ユーザの組み合わせを設定

先頭行から順に調べて、マッチする組み合わせが見つかったところで終了

マッチする組み合わせが見つからなければ、接続拒否記述形式

local database名 ユーザ名 認証方法 host database名 ユーザ名 接続元 IP アドレス 認証方法

記述例 local all postgres md5 (postgresユーザでの接続はパスワード

を要求 ) local all all ident ( OS のユーザ名と DB のユーザ名が一致すれ

ば接続可 ) host all all 127.0.0.1/32 trust ( ローカルホストからは接続可 ) host db1 all 192.168.0.0/24 reject (192.168.0.1-255 から

db1 には接続不可 ) host all all 192.168.0.0/24 trust (192.168.0.1-255 から接続可 )

Page 35: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 35

設定の確認と変更

実行時パラメータの設定値は、データベースに接続して SHOW コマンドを実行することで確認できる

=> SHOW log_destination; => SHOW ALL;

実行時パラメータの多くは、データベースに接続して SET コマンドを実行することで変更できる。ただし、その変更は現行セッション ( あるいはトランザクション )内でのみ有効。

=> SET client_encoding TO 'UTF8';postgresql.conf や pg_hba.conf の設定変更は、ファイルを変更しただけでは有効にならない。多くのパラメータは postgresユーザで

$ pg_ctl reloadを実行することで反映される。一部のパラメータはデータベースの再起動

$ pg_ctl restartをしないと変更が反映されない。

Linux の場合、 pg_ctl を使う代わりに、 root ユーザで# service postgresql-9.0 reload あるいは# /etc/rc.d/init.d/postgresql-9.0 reload

としても良い ( 試験対策としては pg_ctl を覚えること )

Page 36: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 36

psql ツールの利用

データベースに接続して SQL を実行するには psql コマンドを使う

psql [option…] [dbname [username]]主なオプション

-d, --dbname : 接続先データベース名 -U, --username : 接続時のユーザ名 -h, --host : 接続先サーバのホスト名 -p, --port : 接続先ホストのポート番号 -f, --file : 使用するファイル名 (psql では入力スクリプト )

以上は他のツールでも共通に使われるオプション -l, --list : 利用可能なデータベースの一覧表示して終了

'\'で始まるのは psql の独自コマンド ( メタコマンド )。改行によって終了し、 psql ツールによって処理される。

それ以外のものは SQL 文と判断され、データベースのサーバープロセスに送信される。 SQL 文は ";"( セミコロン ) で終了する。改行では終了せず、次行以降に継続される (改行はスペースと同じ )。

Page 37: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 37

psql のメタコマンド

主な psql のメタコマンド ('=>' は psql のプロンプト ) => \d ( テーブル一覧の表示 ) => \d 表名 (指定した表の列名、データ型の表示 ) => \du (ユーザ一覧の表示 ) => \set (内部変数の表示・設定 ) => \c db名 ( 他のデータベースに接続 ) => \? (psql で使える各種コマンドに関するヘルプの表示 ) => \h (SQL に関するヘルプの表示 )

=> \h SELECT (SELECT の使い方に関するヘルプの表示 ) => \! OS コマンド (OS コマンドの実行 )

=> \! ls (カレントディレクトリのファイル一覧の表示 ) => \q (終了 )

Page 38: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 38

システム情報などの取得

システム情報取得関数 マニュアルの 9.23 節のセッション情報関数を確認 例えば、 SELECT version(); とすると、接続先 PostgreSQLサーバ

のバージョンが表示される情報スキーマ

ANSI 標準準拠 マニュアルの 34 章を簡単に確認 すべてのデータベースに information_schema というスキーマが存在する

データベース内のオブジェクトに関する情報を参照できるビュー群 SELECT * FROM information_schema.tables;

システムカタログ PostgreSQL独自 マニュアルの 45章、特に 45.1節と 45.46 節について簡単に確認

SELECT * FROM pg_tables;

Page 39: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 39

ユーザ管理

一般ユーザと管理者ユーザ ( スーパーユーザ ) OS に一般ユーザと管理者ユーザがあるのと同じように、データベー

スにも一般ユーザと管理者ユーザがある。

一般ユーザには限られた権限しかないが、管理者ユーザにはすべての権限がある。

OS の管理者ユーザと、データベースの管理者ユーザは異なる。例えば、 root で pg_ctl コマンドを実行することはできない。

権限とは? 多くの種類の権限があるが、例えば

新規にテーブルを作成する権限、あるいは削除する権限 テーブルからデータを検索 (SELECT) する権限 テーブルのデータを更新 (UPDATE) する権限

デフォルトでは、テーブルの所有者 ( 作成者 ) だけが、そのテーブルに対する SELECT/UPDATE などの権限を持つ ( 管理者ユーザは別 )。つまり、権限を与えられなければ、他人の DB やテーブルを参照 /更新できない。

Page 40: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 40

ユーザ作成と削除

ユーザ作成 postgres ユーザで createuser コマンドを使う。

$ createuser [option] [username] オプションで指定しなかった場合、以下を対話的に入力する。

新規ユーザ名 新規ユーザを管理者ユーザとするかどうか 新規ユーザにデータベース作成の権限を与えるかどうか 新規ユーザにユーザ作成の権限を与えるかどうか

あるいは、 CREATEROLE権限のあるユーザで psql を使って接続し、

CREATE USER 文を使う。 =# CREATE USER name [option];

createuser コマンドよりも細かい設定がオプションで指定できるが、対話的な指定はできない。

ユーザ削除 dropuser コマンド、または DROP USER 文を使う

Page 41: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 41

権限管理

データベース権限の管理 CREATEDB, CREATEROLE などデータベースシステムに関する権限

は、ユーザ作成時に付与するか、あるいは ALTER USER 文で付与・剥奪する

=# ALTER USER username CREATEDB NOCREATEROLE;

オブジェクト権限の管理 テーブルなどのオブジェクトに対する権限の付与・剥奪に

は、 GRANT 文と REVOKE 文を使う。 個々のユーザに対して、 GRANT/REVOKE することもできるが、ユーザ名として public を指定すれば、全ユーザに対する GRANT/REVOKE も可能。

=> GRANT SELECT ON table1 TO public; => GRANT SELECT, UPDATE ON table2 TO user3; => REVOKE DELETE ON table4 FROM public;

Page 42: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 42

データベースの作成・削除

データベースクラスタ内に新規にデータベースを作成するには、 createdb コマンドを使う、あるいはデータベースに接続して、 CREATE DATABASE 文を使う

$ createdb [option…] dbname [comment] => CREATE DATABASE dbname [option]; いずれの場合も CREATEDB権限が必要

新規に作成されるデータベースは、 ( オプションで指定しなければ ) テンプレートデータベース template1 のコピーとなる

複数のデータベースで共通に利用したいオブジェクトや関数定義などは、事前に template1 に作成しておく

データベースを削除するには、 dropdb コマンド、または DROP DATABASE 文を使う

元に戻せないので要注意 データベースの所有者、または管理者ユーザだけが実行できる

Page 43: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 43

データベースのバックアップ

データベースでは重要なデータを管理している。ディスクの故障などによるデータの損失に備え、バックアップを取得することが重要。

データベースのファイルは常に更新され続けている。メモリ上のデータ ( キャッシュ ) とディスク上のデータファイルの内容が一致するとは限らない、つまり、 OS コマンドを使ってファイルをコピーしてもバックアップにはならない。

データベースのバックアップには特殊な方法が必要。データベースがクラッシュしたとき、一週間前のバックアップか

らデータベースが復元 ( リストア ) できても、ありがたくないかもしれない。

クラッシュ直前の状態にデータを復旧 ( リカバリ ) するためのバックアップ手段がある。

バックアップの方法とリストア・リカバリの方法をセットで覚えること

バックアップを作っても、いざというときに使えなければ役に立たない

Page 44: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 44

バックアップの手段

pg_dump コマンド データベース単位でバックアップを作成 psql または pg_restore コマンドを使ってリストア

pg_dumpall コマンド データベースクラスタ全体のバックアップを作成 psql コマンドを使ってリストア

コールドバックアップ ( ディレクトリコピー ) OS 付属のコピー、アーカイブ用コマンドを使ってバックアップを作成

簡単で確実な方法だが、データベースを停止する必要があるポイント・イン・タイム・リカバリ (PITR)

使い方がやや複雑 WAL(Write Ahead Logging) 機能と組み合わせて、任意の時点にリカバリ可能

COPY 文、 \ copy メタコマンド テーブル単位で CSV形式ファイルの入出力

Page 45: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 45

pg_dump によるバックアップとリストア

データベースを停止せずに、データベース単位のバックアップを取得

$ pg_dump [options] –f dumpfilename dbname あるいは $ pg_dump [options] dbname > dumpfilename -F オプションで、出力形式を指定できる。 p(plain) はテキスト形式

( デフォルト ) 、 c(custom) はカスタム ( バイナリ )形式、 t(tar) はTAR形式

データベースクラスタ内のすべてのデータベースのバックアップを取得するには、 pg_dumpall コマンドを使う。 ( 出力形式はテキストのみ )

テキスト形式のバックアップは psql コマンドで、バイナリ形式のバックアップは pg_restore コマンドでリストアする。

$ psql –f dumpfilename dbname あるいは $ psql dbname < dumpfilename $ pg_restore –d dbname dumpfilename

pg_dump が作成するテキスト形式のバックアップは SQL のスクリプト (CREATE TABLE, INSERT など ) となっており、エディタで修正可能

Page 46: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 46

コールドバックアップ

ディレクトリコピーによるバックアップ データベースを停止すれば、物理的なデータファイルをディレクト

リごとコピーすることでバックアップを作成できる。 ( コールドバックアップ )

コピーの方法は自由に選んで良い。 (cp, tar, cpio, zip…) $ cp –r data backupdir $ tar czf backup.tgz data

簡単で確実な方法だが、頻繁には実行できない

バックアップを、同じ構成の別のマシンにコピーして動かすこともできる

バックアップ作成と逆のことをすればリストアできる $ cp –r backupdir data $ tar xzf backup.tgz

コールドバックアップに対し、データベースの稼働中に取得するバックアップをホットバックアップと呼ぶ

Page 47: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 47

ポイント・イン・タイム・リカバリ(PITR)

PITR (Point In Time Recovery) 障害の直前の状態までデータを復旧 ( リカバリ ) できる。 間違ってデータを削除した場合でも、任意の時点まで戻すことがで

きる。PITR の仕組み

WAL(Write Ahead Logging) により、データファイルへの書き込み前に、変更操作についてログ出力される。 ( トランザクションログ )

最後のバックアップ ( ベースバックアップ ) に対して、障害発生直前までの WAL を適用することで、データを復旧できる。

PITR によるベースバックアップの取得手順 スーパーユーザで接続し、バックアップ開始をサーバに通知

=# SELECT pg_start_backup('label'); tar, cpio などの OS コマンドでバックアップを取得 (サーバーは止

めない ) 再度、スーパーユーザで接続し、バックアップ終了をサーバに通知

=# SELECT pg_stop_backup('label');

Page 48: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 48

CSV ファイルの入出力

psql の \ copy メタコマンドを使うと、データベースのテーブルと、 OS ファイルシステム上のファイル (CSV など ) の間で入出力ができる。

基本的な使い方 => \copy table_name to file_name [options] => \copy table_name from file_name [options] デフォルトではタブ区切りのテキストファイルを入出力、

オプションに "csv" と指定すれば、カンマ区切りの CSV ファイルになる。

SQL の COPY 文 (PostgreSQL の独自拡張機能 ) もあるが、 \copy との使い方の違いに注意。

=# COPY table_name TO 'file_name' [options]; =# COPY table_name FROM 'file_name' [options]; \copy はクライアント上のファイル、 COPY はサーバ上のファイル

の入出力。 COPY によるファイル入出力は、データベース管理者ユーザのみ実行

できる。

Page 49: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 49

VACUUM

PostgreSQL のデータファイルは追記型の構造。データが更新されると、旧データには削除マークが付けられ、新データはファイルの末尾に追加される。削除マークの付いた領域は、そのままでは再利用されない

データの更新が繰り返されると、ファイルサイズが増大し、ディスク容量不足やパフォーマンス問題を引き起こす。

VACUUM は削除マークがついたデータ領域を回収し、再利用可能にする

コマンドラインから vacuumdb コマンド、あるいはデータベースに接続して VACUUM 文を実行する。

VACUUM, vacuumdb の主なオプション ANALYZE, -z, --analyze : 統計情報の取得も同時に実施 FULL, -f, --full : データを移動し、ファイルサイズを小さくする VERBOSE, -v, --verbose : 処理内容の詳細を画面に出力する -a, --all : クラスタ内の全データベースに対して VACUUM を実施

Page 50: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 50

自動バキューム (autovacuum)

VACUUM を自動的に実行する機能デフォルトの設定では、自動的に実行されるようになっており、

これが推奨の設定でもあるVACUUM と ANALYZE が自動的に実行されるデータの変更量が設定値を超えると実行される

PostgreSQL の古いバージョンでは、手動で、あるいは cron で定期的に VACUUM を実行する必要があった

autovacuum により、管理者が VACUUM を意識する必要性が低くなっているが、機能については理解しておくこと

Page 51: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 51

ポイント解説: SQL

Page 52: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 52

他の RDBMS との違い

SQL は ANSI で標準化されており、 RDBMS の種類による違いは小さい

SQL 文 (DML/DDL/DCL) については差分が小さいが、関数 ( 特に文字列関数や時間関数 ) は RDBMS の種類による違いが大きい

標準準拠の程度は RDBMS の種類によるが、 PostgreSQL は準拠度が比較的高い

PostgreSQL のマニュアルでは、各所にその機能が ANSI 標準なのか、 PostgreSQL の独自拡張なのかの別が記述されている

Oracle など ANSI 標準の策定前から存在していた RDBMS には、標準にない仕様が数多く残っているが、現在のバージョンでは標準の仕様の多くが取り入れられている

Page 53: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 53

SELECT 文

複雑な使い方があるが、 RDBMS 依存 ( 方言 ) の部分は少ないので、基本をしっかり理解する

SELECT cols FROM tables WHERE cond; ORDER BY, DISTINCT, GROUP BY, HAVING 副問い合わせ、 EXISTS, IN

準備1: ( 実行例は次のページ ) CREATE TABLE sales (id INTEGER, person VARCHAR(10),

amount INTEGER); INSERT INTO sales VALUES (1, 'aaa', 5000), (2, 'bbb', 3000)…;

id person amount

1 aaa 5000

2 bbb 3000

3 ccc 12000

4 ddd 4000

5 aaa 6000

6 bbb 5000

Page 54: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 54

SELECT 文 ( GROUP BY と HAVING )

WHERE と HAVING の使い方の違い、 GROUP BY との関係について、正しく理解する

WHERE の条件に合致した行の抽出→ GROUP BY に従って集約→ HAVING の条件に合致した集約行の抽出、の順で処理される

HAVING句には集約後でなければ判定できない条件を記述、集約前に判定できる記述は WHERE句に記述する

誤った記述例 SELECT person, sum(amount) FROM sales

WHERE sum(amount) > 10000 GROUP BY person; 正しい使い方の例

SELECT person, sum(amount) FROM sales GROUP BY person HAVING sum(amount) > 10000;

動作はするが、正しくない使い方の例 SELECT person, sum(amount) FROM sales

GROUP BY person HAVING person = 'aaa' OR person = 'bbb'; 正しく書き直すと…

SELECT person, sum(amount) FROM salesWHERE person = 'aaa' OR person = 'bbb' GROUP BY person;

Page 55: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 55

SELECT 文 (行数の制限 )

SELECT する行数を制限するため、 LIMIT/OFFSET が利用できる(PostgreSQL/MySQL など一部の RDBMS でのみ利用可能 )

SELECT * FROM table1 LIMIT 10 OFFSET 20; 20行をスキップして、 21行目から 10行を表示

LIMIT/OFFSET は ORDER BY と組み合わせて利用可能 Oracle の ROWNUM は擬似列なので、 ORDER BY と組み合わせられな

い準備2: ( 実行例は次のページ )

CREATE TABLE t1 (id INTEGER, val VARCHAR(10)); CREATE TABLE t2 (id INTEGER, val VARCHAR(10)); INSERT INTO t1 VALUES (1, 'aaa'), (2, 'bbb'); INSERT INTO t2 VALUES (1, 'xxx'), (3, 'yyy');

id val

1 aaa

2 bbb

id val

1 xxx

3 yyy

Page 56: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 56

SELECT 文 (表の結合 )

外部結合 (+) や * を使うのは、 Oracle と SQL Server の独自の外部結合

SELECT col… FROM table1 t1, table2 t2 WHERE t1.id = t2.id(+); (Oracle)

SELECT col… FROM table1 t1, table2 t2 WHERE t1.id* = t2.id; (MS-SQL)

ANSI 標準では JOIN句を使って表を結合する SELECT col… FROM table1 t1

LEFT JOIN table2 t2 ON t2.id2 = t1.id1…

JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN, CROSS JOIN の違いを理解する

実験 SELECT * FROM t1

(INNER/LEFT/RIGHT/FULL) JOIN t2 ON t2.id = t1.id; SELECT * FROM t1 CROSS JOIN t2;

Page 57: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 57

INSERT 文

INSERT … SELECT によるものと、 INSERT … VALUES によるものについて、理解する

INSERT INTO table1 (col…)SELECT col… FROM table2…;

INSERT INTO table1 (col…) VALUES (data…);

VALUES句を使うときでも、複数行をまとめて INSERT できる INSERT INTO table1(col1, col2) VALUES

(1, 'aaa'), (2, 'bbb'), (3, 'ccc'); 例えば、 MySQL では同じことができるが、 Oracle ではできないの

で注意

Page 58: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 58

UPDATE 文

標準的な使い方を理解する UPDATE table1 SET col1 = 'xxx', col2 = 'yyy' WHERE…;

PostgreSQL は追記型構造なので、更新された行は、次のSELECT では最終行に表示されることが多い

他のテーブルを参照した UPDATE については、 RDBMS の種類によって制限や独自の仕様があるので注意

UPDATE table1 t1 SET a = (SELECT b FROM table2 t2 WHERE t2.id = t1.id); (Oracle)

UPDATE table1 t1 SET a = t2.bFROM table2 t2 WHERE t1.id = t2.id; (PostgreSQL)

UPDATE table1 t2, table2 t2SET t1.a = t2.bWHERE t1.id = t2.id; (MySQL)

Page 59: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 59

DELETE 文

標準的な使い方を理解する DELETE FROM table1 WHERE…;

他のテーブルを参照する場合、 USING句を使うと簡単に記述できる上、パフォーマンス上も有利なことが多い ( ただしPostgreSQL独自の拡張 )

DELETE FROM table1 t1 USING table2 t2WHERE t1.id = t2.id

同じことを ANSI 標準の SQL で記述すると DELETE FROM table1

WHERE id IN (SELECT id FROM table2); DELETE FROM table1 t1

WHERE EXISTS(SELECT * FROM table2 t2 WHERE t2.id = t1.id);

Page 60: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 60

トランザクション

PostgreSQL では、 BEGIN または START TRANSACTION 文でトランザクションが開始され、 COMMIT または ROLLBACK 文で終了する

SAVEPOINT, ROLLBACK TO savepoint などの基本を理解するトランザクションの外部で実行される SQL 文( INSERT/

UPDATE/DELETE) は自動的に COMMIT される (Oracle に慣れた人は要注意)

PostgreSQL では CREATE TABLE, DROP TABLE などの DDL もトランザクションの一部になるので、 DDL による自動 COMMITは発生せず、 ROLLBACK すれば DROP TABLE されたテーブルも元に戻る

Oracle などでは、 DDL を実行すると、トランザクションが自動的に COMMIT される

Page 61: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 61

トランザクション

PostgreSQL では、トランザクションの途中でエラーが発生すると、以後の SQL はすべてエラーとなり、 ROLLBACK するしかなくなるので注意が必要

SQL の文法エラー、 DB の制約違反(一意性、外部参照など)によるエラー、いずれの場合も ROLLBACK が必要

この状態で COMMIT を発行すると、 ROLLBACK が実行される 回避策は、エラーになる可能性のある SQL を実行する前に

SAVEPOINT を実行し、エラーが発生したらその SAVEPOINT までROLLBACK すること

Oracle などでは、エラーが発生しても、処理の継続が可能例

CREATE TABLE table1 (id INTEGER UNIQUE, val VARCHAR(10));BEGIN;INSERT INTO table1 VALUES (1, 'aaa'), (2, 'bbb');SAVEPOINT sp1;INSERT INTO table1 VALUES (2, 'ccc'); ← エラー !!ROLLBACK TO sp1;COMMIT;

Page 62: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 62

主なデータ型

数値型 SMALLINT(2 バイト ) 、 INTEGER(4 バイト ) 、 BIGINT(8 バイト ) NUMERIC( 最大 1000桁 ) 、 DECIMAL(NUMERIC と同じ ) REAL(4 バイト ) 、 DOUBLE PRECISION(8 バイト ) SERIAL( 自動増分 4バイト ) 、 BIGSERIAL( 自動増分 8バイト )

文字列型 CHARACTER VARYING(可変長、最大 4096文

字 ) 、 VARCHAR(CHARACTER VARYING と同じ ) CHARACTER(固定長 ) 、 CHAR(CHARACTER と同じ ) TEXT(可変長、無制限 )

日付型 DATE( 日付のみ ) TIME(時刻のみ ) TIMESTAMP( 日付 +時刻 )

Page 63: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 63

データ型 ( 他の RDBMS との比較 )

共通のものが多いが、微妙に仕様が異なることがある多くの RDBMS でほぼ同じように使えるもの

INTEGER, NUMERIC CHAR, VARCHAR DATE, TIMESTAMP

PostgreSQL独自のデータ型 SERIAL : 自動的にシーケンスが作成され、列を連番にできる BOOLEAN : 論理値型

TRUE/'t'/'true'/'y'/'yes'/'on'/'1' FALSE/'f'/'false'/'n'/'no'/'off'/'0' 大文字・小文字は区別しない、 TRUE/FALSE はキーワード、他は文字列

Oracle のデータ型との比較 NUMBER, BINARY_FLOAT, BINARY_DOUBLE VARCHAR2, NCHAR, NVARCHAR2, CLOB DATE

Page 64: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 64

文字列リテラル

文字列リテラル SQL の文字列リテラルはシングルクォートで囲まれ、大文字と小文

字は区別される 'STRINGstring' 文字列の外側の SQL 文では大文字と小文字は区別されない MySQL のように、文字列の大文字と小文字を区別しない RDBMS もある ダブルクォートで囲った文字列をリテラルとして使える RDBMS もある

が、一般には列別名などシングルクォートとは異なる特定の用途でしか使えない

– SELECT col1 "col #1" FROM table1 WHERE…; 文字列中にシングルクォートを入れるにはシングルクォートを 2 つ並べる

'I can''t do it.' $tag$ を使って文字列リテラルを記述することも可能 (PostgreSQL独自 )

$xyz$I can't do it.$xyz$ : 'I can''t do it.' と同じ tag はなくても良く、 $$I can't do it.$$ という記述でも OK Oracle では、 Q'XstringX' (X は任意の文字、 Q は小文字でも可 ) とい

う記述がある例えば、 q'xI can't do it.x'

Page 65: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 65

シーケンス

CREATE SEQUENCE 文で明示的に作成することができる他、 SERIAL型( 4バイト)または BIGSERIAL型( 8バイト)の列を作ることで自動的に作成される

CREATE SEQUENCE seq_name [options]; デフォルトでは 8バイト

シーケンス名と同じ名前のテーブルが自動的に作成される SELECT * FROM seq_name;

シーケンスの現在値は currval(), 次の値は nextval() 関数で取得。 SELECT currval('seq_name'); SELECT nextval('seq_name');

現在値の変更は setval() 関数を使う SELECT setval('seq_name', 100);

SERIAL/BIGSERIAL型の列については、 INSERT時に列を指定しない、あるいは列の値として DEFAULT を指定すると、シーケンスの次の値が使われる

Page 66: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 66

集約関数、算術演算子、算術関数

集約関数 count, sum, avg, max, min NULL値の扱いに注意

count(*) はすべての列が NULL であっても 1件のデータとしてカウントする

count(col) は、 col の値が NULL のものを除いたデータ数を返す avg(col) は NULL を除いたデータの平均値を返す

算術演算子、算術関数 +、ー、*、/ の算術演算子は標準通り 剰余計算に MOD 関数の他、% 演算子が使える (Oracle, DB2 などは

MOD のみ ) 乱数発生に RANDOM 関数が用意されており、 0 と 1 の間の小数値

を返す (PostgreSQL独自 )

Page 67: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 67

文字列演算子

文字列演算子 LIKE で、 _% を使ったマッチングは非常に重要

SELECT * FROM table1 WHERE col1 LIKE 'a_c%'; 文字列結合で 'aaa'||NULL は NULL になる

Oracle では 'aaa' になるので注意 || は ANSI 標準の文字列結合演算子だが、利用できない RDBMS や+ を文字列結合に使う RDBMS もあるので注意

concat 関数で文字列結合する RDBMS もあるが、PostgreSQL には concat 関数はない

正規表現 ~ 演算子で、指定の正規表現を含む文字列とマッチさせられる

SELECT * FROM table1 WHERE col1 ~ '^[a-c]'; SIMILAR TO は LIKE とほぼ同じ使い方だが、正規表現の一部をサ

ポートする SELECT * FROM table1 WHERE col1 SIMILAR TO '[a-c]%';

正規表現は多くの RDBMS が何らかの方法でサポートしているが、実装方法は RDBMS の種類によって大きく異なる

Page 68: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 68

文字列関数

文字列関数 RDBMS の種類によって実装されている関数に違いがある 文字列の変換: UPPER, LOWER 文字列の置換: REPLACE, TRANSLATE 文字の削除: TRIM, RTRIM, LTRIM 文字列の長さ: LENGTH, CHAR(ACTER)_LENGTH,

OCTET_LENGTH 部分文字列; SUBSTRING, POSITION ASCII変換: ASCII, CHR

現在では、どの RDBMS でもマルチバイト文字は当然のようにサポートされており、 (CHARACTER_)LENGTH 関数はバイト数ではなく文字数を返す。バイト数を調べたいときはOCTET_LENGTH 関数を使う (Oracle では LENGTHB)。

Page 69: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 69

変換関数

変換関数 TO_CHAR, TO_NUMER, TO_DATE などは、 Oracle でも

PostgreSQL でも使えるが、他の RDBMS には使えないものが多い DECODE, NVL は Oracle独自 (PostgreSQL/MySQL では

DECODE は復号化 ) TO_xxx → CAST (ANSI 標準 )

SELECT cast('2011-10-01' AS DATE) + 10; PostgreSQL独自の型変換方式として :: 演算子を使う方法がある

SELECT '2011-10-01'::DATE + 10; DECODE → CASE/WHEN/THEN/ELSE/END

SELECT CASE col1 WHEN val1 THEN 'xxx' WHEN val2 THEN 'yyy' ELSE 'zzz' END FROM table1;

NVL → COALESCE SELECT coalesce(val1, val2…)

→ val1, val2… のうち、最初の NULL でないものが返る

Page 70: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 70

時間関数、期間リテラル

時間関数 RDBMS の種類によって実装されている関数に大きな違いがある 現在日時の取得: CURRENT_DATE, CURRENT_TIME,

CURRENT_TIMESTAMP これらは関数名の後に括弧を付けずに使うことに注意

日時から要素の取得: EXTRACT, TO_CHAR

期間リテラル 記述方法は RDBMS の種類によって大きく異なる INTERVAL '10' YEAR (Oracle) 10 YEARS (DB2) INTERVAL '10 YEAR' (PostgreSQL) INTERVAL 10 YEAR (MySQL)

例えば、 1ヶ月後の日付を PostgreSQL で表示するには SELECT current_date + INTERVAL '1 MONTH'; あるいは SELECT current_date + '1 MONTH'::INTERVAL

Page 71: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 71

関数定義

PL/pgSQL という、 Oracle の PL/SQL に似た言語でストアドプログラムを作成できる

CREATE FUNCTION test(INTEGER)RETURNS INTEGER AS $$DECLARE di ALIAS FOR $1; d INTEGER;BEGIN d := di * 2; RETURN d;END;$$ LANGUAGE 'plpgsql'

事前に、 createlang plpgsql を実行して、手続き言語の使用について DB に登録しておく必要があるが、通常は登録済み(createlang –l で確認 )

FUNCTION はあるが PROCEDURE はない。ただし、値を返さない VOID型の FUNCTION を作ることはできる

PL/pgSQL でなく、 SQL で関数を定義することもできる

Page 72: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 72

トリガーとルール

トリガー テーブルの更新 (INSERT/UPDATE/DELETE) が実行される直前、あ

るいは直後に呼び出される手続き SQL 文の実行前あるいは後に 1 度だけ呼び出す、あるいは更新され

る各行について、更新の前あるいは後に呼び出す、いずれも設定可能

PostgreSQL では、 PL/pgSQL などによる FUNCTION を事前に作成しておき、 CREATE TRIGGER 文でそれを割り当てる

ルール ビュー (VIEW) の更新を実現するための PostgreSQL独自の方式 ビューに対する INSERT/UPDATE/DELETE が可能かどうか

は、 RDBMS の種類およびビューの定義の両方に依存 PostgreSQL では、 CREATE RULE 文でルールを定義すれば、ビューの更新ができる ( ルールが定義されていないビューは更新できない )

CREATE RULE view1_ins AS ON INSERT view1DO INSTEAD INSERT INTO table1 VALUES …;

Page 73: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 73

スキーマ

スキーマの実装は RDBMS の種類によって異なる Oracle では、ほぼユーザと同義 PostgreSQL では単なる名前空間 (ユーザ名との関連はある ) MySQL にはスキーマがない

PostgreSQL でのスキーマの利用 CREATE SCHEMA で作成、 DROP SCHEMA で削除 ALTER SCHEMA で名前や所有者を変更できる public というスキーマがある

スキーマ検索パス => SHOW search_path; で確認できる デフォルトでは、 "$user", public となっている ユーザ foo が SELECT * FROM table1; を実行

foo.table1 → public.table1 の順で検索して SELECT 、どちらもなければエラー

ユーザ foo が CREATE TABLE table2 …; を実行 スキーマ foo が存在すれば foo.table2 を作成、なければ

public.table2 を作成

Page 74: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 74

例題解説

Page 75: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 75

例題解説1

一般知識 – ライセンス

PostgreSQL の利用条件、ライセンスについて、正しいものを 2 つ選びなさい。

A. 研究目的、商用を問わず、無料で利用できる。B. ソースコードを改変したものを配布する場合には、

変更部分についてソースコードを公開する必要がある。C. ソースコードを改変したものを配布する場合には、

無保証であることをドキュメントなどに明記する必要がある。D. 致命的な障害については、開発者は修正の義務を負う。E. 日本では、日本 PostgreSQLユーザ会がサポートの義務を負う。

Page 76: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 76

例題解説2

運用管理 – 標準付属ツールの使い方

以下の記述から、誤っているものを 2 つ選びなさい。

A. createdb コマンドでデータベースを作成するには CREATEDB権限が 必要である

B. dropdb コマンドでデータベースを削除するには CREATEDB権限が 必要である

C. dropdb コマンドでデータベースを削除する前に、そのデータベース内の テーブルなどすべてのオブジェクトを削除しておく必要がある

D. dropuser コマンドでユーザを削除するには、 CREATEROLE権限が必要である

E. dropuser コマンドでユーザを削除する前に、そのユーザが所有するすべての テーブルを削除しておく必要がある

Page 77: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 77

例題解説3

運用管理 – 基本的な運用管理作業

VACUUM は PostgreSQL の運用管理でどのような役割を持っているか。誤っているものを2つ選びなさい。

A. 不正な IP アドレスからのデータベースアクセスがないか監視するB. データベースファイルの巨大化を防ぐC. データベースのパフォーマンスの悪化を防ぐD. 最適な検索を実施するための統計情報を取得するE. 長期間、利用されていないデータをアーカイブする

Page 78: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 78

例題解説4

開発 – トランザクション

以下 SQL 文を順次実行した。実行後のテーブル t1 の行数は何行か。

CREATE TABLE t1 (id INTEGER, val VARCHAR(10));BEGIN;INSERT INTO t1 VALUES (1, 'aaa'), (2, 'aaa');SAVEPOINT sp1;DELETE FROM t1 WHERE id = 1;SAVEPOINT sp2;INSERT INTO t1 VALUES (3, 'ccc');ROLLBACK to sp1;INSERT INTO t1 VALUES (4, 'ddd'), (5, 'eee');COMMIT;

Page 79: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 79

参考資料

OSS教科書 OSS-DB Silver 認定教材

オープンソースデータベース標準教科書

初心者向けに SQL の初歩からWeb アプリケーション開発まで

PostgreSQL徹底入門 PostgreSQL 9.0 対応 9.0.1 のインストーラ、ソースコード

SQL ポケットリファレンス 他の DB や ANSI 標準との比較

日本 PostgreSQLユーザ会http://www.postgresql.jp/

Let’s Postgreshttp://lets.postgresql.jp/

オンラインマニュアルhttp://www.postgresql.jp/document/9.0/html/

Page 80: OSS-DB Exam Silver 技術解説無料セミナー

© LPI-Japan 2011. All rights reserved. 80

ご清聴ありがとうございました。

■お問い合わせ■LPI-Japan

テクノロジー・マネージャー松田 神一

[email protected]