GAGA LIFE.

インフラエンジニアブログ

スポンサーリンク

Dockerで'Hello world'

概要

Dockerインストール後の正常性確認のためにDockerコンテナを作成します。
その上で"Hello world"をターミナル上に表示します。
今回は、Ubuntuイメージを基にDockerコンテナを作成・実行します。
なお、Dockerコンテナを作成する場合や実行する際には、「docker container run」コマンドを使用します。
このコマンドを含むDockerコマンドは以下も参考にしてください。

手順概要

  1. Hello worldの実行
  2. 実行結果の確認

使用コマンド

docker container runコマンド
docker container run <Docker Image> [コマンド]]
----------(1)--------- --------(2)--------- ----(3)----
(1)コンテナ作成・実行
(2)基となるDockerイメージ
(3)コンテナの中での実行コマンド
run -> ローカルキャッシュになければDocerリポジトリからDockerイメージをダウンロードし、コンテナ起動
ubuntu:latest -> Ubuntuの最新バージョンイメージ(latest)を取得
/bin/echo 'Hello world' -> 文字表示コマンドechoを使用して'Hello world'と表示する

実行内容

1.Hello worldの実行

$ docker container run ubuntu:latest /bin/echo 'Hello world'

2.実行結果の確認

docker@LesPaul:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
docker@LesPaul:~$ docker container run ubuntu:latest /bin/echo 'Hello world'
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
124c757242f8: Pull complete
9d866f8bde2a: Pull complete
fa3f2f277e67: Pull complete
398d32b153e8: Pull complete
afde35469481: Pull complete
Digest: sha256:de774a3145f7ca4f0bd144c7d4ffb2931e06634f11529653b23eba85aef8e378
Status: Downloaded newer image for ubuntu:latest
Hello world
docker@LesPaul:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fcf29ccd026d ubuntu:latest "/bin/echo 'Hello wo…" 10 seconds ago Exited (0) 5 seconds ago priceless_bassi

Appendix

初回はローカルにDockerイメージが存在しておらず、Dockerリポジトリからダウンロードするため、多少時間を要します。
しかしながら、2回目以降ではローカルにダウンロードしたDockerイメージを基にコンテナを起動するため高速でコンテナが起動します。

Dockerインストール(Ubuntu 18.04)

概要

Docker(CE)をUbuntuにインストールする手順を記載します。
この記事の記載時点(2018/09/12)では、以下のUbuntuのバージョンがサポートされていました。

  • Bionic 18.04 (LTS)
  • Artful 17.10
  • Xenial 16.04 (LTS)
  • Trusty 14.04 (LTS)

https://docs.docker.com/install/linux/docker-ce/ubuntu/
今回は、Docker CEを「Ubuntu Bionic 18.04」にインストールします。

環境情報

ホストOS:Windows 10
VirtualBox:Ver 5.2.18
ゲストOS:Ubuntu 18.04
Docker:docker-ce amd64 18.06.1~ce~3-0~ubuntu

手順概要

  1. 事前準備
  2. Dockerインストール
  3. 起動確認

実行内容

1.事前準備

apt(Advanced Packaging Tool)のアップデート
$ sudo apt-get update
HTTPS経由でリポジトリが使用可能となるようにパッケージをインストール
$ sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
Dockerの公式GPG keyキーの追加
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

-> 正常に登録されると「OK」が表示されます。

GPGキーの確認
$ sudo apt-key fingerprint 0EBFCD88
docker@LesPaul:~$ sudo apt-key fingerprint 0EBFCD88
pub rsa4096 2017-02-22 [SCEA]
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid [ 不明 ] Docker Release (CE deb) <docker@docker.com>
sub rsa4096 2017-02-22 [S]
Dockerリポジトリの追加(登録)
$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
aptパッケージの再アップデート
$ sudo apt-get update

2.Dockerインストール

$ sudo apt-get install docker-ce

-> インストール中に継続するか否かを聞かれるので「Y」を入力します。

3.起動確認

インストール後は自動的にDockerが起動
$ sudo systemctl status docker
docker@LesPaul:~$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2018-09-12 22:12:31 JST; 3min 27s ago
Docs: https://docs.docker.com
Main PID: 28571 (dockerd)
Tasks: 29
CGroup: /system.slice/docker.service
├─28571 /usr/bin/dockerd -H fd://
└─28599 docker-containerd --config /var/run/docker/containerd/containerd.toml
$ sudo docker ps
docker@LesPaul:~$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

参考資料

https://docs.docker.com/install/

Ubuntuサーバーのインストール後の設定

概要

Ubuntuインストール後に個人的に実行しておきたいこと、設定しておきたいことを記載します。
Dockerホストとして利用することを想定しているため最低限の設定です。

環境情報

ホストOS:Windows 10
VirtualBox:Ver 5.2.18
ゲストOS:Ubuntu 18.04

実行概要

  1. Software Update
  2. rootユーザーを利用可能にする設定
  3. SSH接続

作業内容

Software Update

Ubuntuに限った話ではありませんが、新規インストール後は、一応Updateを実行しておきたいところです。

$ sudo apt update && sudo apt upgrade -y

rootユーザーを利用可能にする設定

Ubuntuのデフォルトの設定の場合、rootユーザーは利用不可です。
これはパスワードが設定されていないことによります。
基本的には管理者ユーザーに設定したユーザーでsudoを利用し、root特権を使用します。
ここでは、今後rootユーザーで作業することを想定し、設定しておきます。

方法①

Ubuntuをセットアップ中に追加したユーザーで、Sudoによる全管理者権限が与えられたユーザーであれば、Sudoオプションの指定で root権限のシェルを取得可能です。

docker@LesPaul:~$ sudo -s
[sudo] docker のパスワード: <-ユーザーのパスワード入力
root@LesPaul:~# <-rootユーザーへの遷移
方法②

rootユーザーへのパスワード設定

docker@LesPaul:~$ sudo passwd root
新しい UNIX パスワードを入力してください: <-rootパスワード設定
新しい UNIX パスワードを再入力してください: <-rootパスワード設定再入力
passwd: パスワードは正しく更新されました
docker@LesPaul:~$ su -
パスワード: <-rootパスワード入力
root@LesPaul:~# <-rootユーザーへの遷移

SSH接続

他の端末からSSH接続するように設定します。

# apt install net-tools
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
net-tools
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 25 個。
194 kB のアーカイブを取得する必要があります。
この操作後に追加で 803 kB のディスク容量が消費されます。
取得:1 http://jp.archive.ubuntu.com/ubuntu bionic/main amd64 net-tools amd64 1.60+git20161116.90da8a0-1ubuntu1 [194 kB]
194 kB を 0秒 で取得しました (615 kB/s)
以前に未選択のパッケージ net-tools を選択しています。
(データベースを読み込んでいます ... 現在 163107 個のファイルとディレクトリがインストールされています。)
.../net-tools_1.60+git20161116.90da8a0-1ubuntu1_amd64.deb を展開する準備をしています ...
net-tools (1.60+git20161116.90da8a0-1ubuntu1) を展開しています...
man-db (2.8.3-2) のトリガを処理しています ...
net-tools (1.60+git20161116.90da8a0-1ubuntu1) を設定しています ...
root@LesPaul:~# ifconfig
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.2.15 netmask 255.255.255.0 broadcast 10.0.2.255
inet6 fe80::c3a7:2f2d:cf46:3aa3 prefixlen 64 scopeid 0x20<link>
ether 08:00:27:72:ca:60 txqueuelen 1000 (イーサネット)
RX packets 603 bytes 636269 (636.2 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 403 bytes 50931 (50.9 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (ローカルループバック)
RX packets 184 bytes 12876 (12.8 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 184 bytes 12876 (12.8 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
root@LesPaul:~# sudo apt-get install openssh-server
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
ncurses-term openssh-sftp-server ssh-import-id
提案パッケージ:
molly-guard monkeysphere rssh ssh-askpass
以下のパッケージが新たにインストールされます:
ncurses-term openssh-server openssh-sftp-server ssh-import-id
アップグレード: 0 個、新規インストール: 4 個、削除: 0 個、保留: 25 個。
637 kB のアーカイブを取得する必要があります。
この操作後に追加で 5,316 kB のディスク容量が消費されます。
続行しますか? [Y/n] Y
取得:1 http://jp.archive.ubuntu.com/ubuntu bionic-updates/main amd64 ncurses-term all 6.1-1ubuntu1.18.04 [248 kB]
取得:2 http://jp.archive.ubuntu.com/ubuntu bionic/main amd64 openssh-sftp-server amd64 1:7.6p1-4 [45.5 kB]
取得:3 http://jp.archive.ubuntu.com/ubuntu bionic/main amd64 openssh-server amd64 1:7.6p1-4 [332 kB]
取得:4 http://jp.archive.ubuntu.com/ubuntu bionic-updates/main amd64 ssh-import-id all 5.7-0ubuntu1.1 [10.9 kB]
637 kB を 1秒 で取得しました (464 kB/s)
パッケージを事前設定しています ...
以前に未選択のパッケージ ncurses-term を選択しています。
(データベースを読み込んでいます ... 現在 163155 個のファイルとディレクトリがインストールされています。)
.../ncurses-term_6.1-1ubuntu1.18.04_all.deb を展開する準備をしています ...
ncurses-term (6.1-1ubuntu1.18.04) を展開しています...
以前に未選択のパッケージ openssh-sftp-server を選択しています。
.../openssh-sftp-server_1%3a7.6p1-4_amd64.deb を展開する準備をしています ...
openssh-sftp-server (1:7.6p1-4) を展開しています...
以前に未選択のパッケージ openssh-server を選択しています。
.../openssh-server_1%3a7.6p1-4_amd64.deb を展開する準備をしています ...
openssh-server (1:7.6p1-4) を展開しています...
以前に未選択のパッケージ ssh-import-id を選択しています。
.../ssh-import-id_5.7-0ubuntu1.1_all.deb を展開する準備をしています ...
ssh-import-id (5.7-0ubuntu1.1) を展開しています...
ncurses-term (6.1-1ubuntu1.18.04) を設定しています ...
ufw (0.35-5) のトリガを処理しています ...
ureadahead (0.100.0-20) のトリガを処理しています ...
openssh-sftp-server (1:7.6p1-4) を設定しています ...
systemd (237-3ubuntu10.3) のトリガを処理しています ...
man-db (2.8.3-2) のトリガを処理しています ...
ssh-import-id (5.7-0ubuntu1.1) を設定しています ...
openssh-server (1:7.6p1-4) を設定しています ...
Creating config file /etc/ssh/sshd_config with new version
Creating SSH2 RSA key; this may take some time ...
2048 SHA256:gcdsLj9h2sJ7295tCfn5fn9s2pIxt8FV+NhNaY5BrLw root@LesPaul (RSA)
Creating SSH2 ECDSA key; this may take some time ...
256 SHA256:emwMTlVa4DVxeiwIPiMJk9pixGt1U993j9x28iTI7GM root@LesPaul (ECDSA)
Creating SSH2 ED25519 key; this may take some time ...
256 SHA256:TC2ikxMqQMD/TuQFDzJnUYO6zxFjO/oowYjYDi6hi4E root@LesPaul (ED25519)
Created symlink /etc/systemd/system/sshd.service → /lib/systemd/system/ssh.service.
Created symlink /etc/systemd/system/multi-user.target.wants/ssh.service → /lib/systemd/system/ssh.service.
ureadahead (0.100.0-20) のトリガを処理しています ...
systemd (237-3ubuntu10.3) のトリガを処理しています ...
ufw (0.35-5) のトリガを処理しています ...
root@LesPaul:~# ifconfig
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.2.15 netmask 255.255.255.0 broadcast 10.0.2.255
inet6 fe80::c3a7:2f2d:cf46:3aa3 prefixlen 64 scopeid 0x20<link>
ether 08:00:27:72:ca:60 txqueuelen 1000 (イーサネット)
RX packets 1126 bytes 1340850 (1.3 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 602 bytes 77223 (77.2 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (ローカルループバック)
RX packets 199 bytes 14159 (14.1 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 199 bytes 14159 (14.1 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
root@LesPaul:~#

DevOpsツールまとめ

DevOpsツール

概要

DevOpsとインフラCIを実現するツールについて記載します。 DevOpsの実現には、ツールを選定・使用しますが、種類が多岐に渡り全体感を把握しづらいため、一通り下記に纏めました。 ※他にも色々あると考えていますが、把握している範囲で代表的なものをピックアップしてます。

DevOpsとは

DevOpsは、Dev(開発)とOps(運用)が密に協力して連携し、ビジネス価値を高めようとする働き方や文化を示します。 実現には様々な開発手法やツールを使用し、開発者(Development)と運用者(Operations)が密接に連携することで、より柔軟で俊敏性の高いシステム開発をします。

DevOps実践のための主なツール群

要素 代表的なツール/サービス
ダイナミックインフラストラクチャ Vagrant,OpenStack,Amazon AWS,Microsoft Azure,Google Cloud Platform
継続的インテグレーション,ワークフロー Jenkins,CircleCI,Travis CI,GitLab CI,Concourse CI,GoCD,Maven,CruiseControl,Selenium
継続的デプロイメント Docker,Vagrant,Kubernetes,Mesos,Nomad
インフラ構成,デプロイ Ansible,Terraform,Chef,Puppet,Itamae,SaltStack
サーバー構成テストツール Ansible,Serverspec,Testinfra,InSpec
バージョン管理 GitHub,GitLab,BitBucket,GitBucket,Git Flow,Git Hub Flow
リリース Bamboo,Puppet
Issue,チケット管理システム Redmine,Gitlab,JIRA,GitHub Issues
レビューシステム GitLab,GitHub,Gerrit
インシデント解決、チャット Slack,PagerDuty,HipChat,Conferencing tools
デプロイ監視 Datadog,Elastic Stack,PagerDuty
サーバー監視 Datadog,AWS Cloudwatch,Splunk,Nagios,Pingdom,Solarwinds,Sensu
アプリケーション監視 New Relic,Dynatrace,AppDynamics
学習、改善ツール PagerDuty,Looker,Pendo,SurveyMonkey

参考資料

チーム開発実践入門 ~共同作業を円滑に行うツール・メソッド (WEB+DB PRESS plus)

チーム開発実践入門 ~共同作業を円滑に行うツール・メソッド (WEB+DB PRESS plus)

Effective DevOps ―4本柱による持続可能な組織文化の育て方

Effective DevOps ―4本柱による持続可能な組織文化の育て方

The DevOps ハンドブック 理論・原則・実践のすべて

The DevOps ハンドブック 理論・原則・実践のすべて

  • 作者: ジーン・キム,ジェズ・ハンブル,パトリック・ボア,ジョン・ウィリス
  • 出版社/メーカー: 日経BP社
  • 発売日: 2017/07/04
  • メディア: Kindle版
  • この商品を含むブログを見る

DevOps導入指南 Infrastructure as Codeでチーム開発・サービス運用を効率化する (DEV Engineer’s Books)

DevOps導入指南 Infrastructure as Codeでチーム開発・サービス運用を効率化する (DEV Engineer’s Books)

  • 作者: 河村聖悟,北野太郎,中山貴尋,日下部貴章,株式会社リクルートテクノロジーズ
  • 出版社/メーカー: 翔泳社
  • 発売日: 2016/10/14
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る

The DevOps 逆転だ!

The DevOps 逆転だ!

Docker上にOracle Database 18cを構築

概要

Oracle Database 18cのオンプレ版がリリースされました。
Docker(CentOS)にOracle Database EE 18.0.0.0(18.3)をインストールします。

環境情報

  • ホストOS:Windows 10
  • VirtualBox:Ver 5.2.16
  • ゲストOS:CentOS 7 64bit
  • Oracle:Oracle Database EE 18.0.0.0

手順概要

基本的に以下の公式の手順とスクリプトを使用して構築しています。

https://github.com/oracle/docker-images/blob/master/OracleDatabase/SingleInstance/README.md

 1.Dockerイメージの準備(配置)
 2.buildDockerImage.shの動作確認
 3.インストールモジュール準備
 4.データベース環境作成
 5.データベース作成
 6.インスタンスへの接続確認

また、以前に下記の記事でインストールした12.2.0.1と方法は大きく変わりません。

手順説明

1.Dockerイメージの準備

https://github.com/oracle/docker-images

[Clone or download]ボタンを押してダウンロードしました。
※「docker-images/OracleDatabase/SingleInstance/dockerfiles」配下がデータベース用

2.buildDockerImage.shの動作確認

今回は、「/home/oracle」配下でダウンロードした「docker-images-master.zip」を解凍して実行しました。
/home/oracle/docker-images-master/OracleDatabase/SingleInstance/dockerfiles配下に「buildDockerImage.sh」が展開されます。hオプション(help)で実行確認します。

3.インストールモジュールの準備

下記OTNサイトから(ライセンスに同意し)ダウンロード

http://www.oracle.com/technetwork/database/enterprise-edition/downloads/oracle12c-linux-12201-3608234.html?ssSourceSiteId=otnjp
ダウンロードファイル名:LINUX.X64_180000_db_home

ダウンロードしたファイルは、解凍せず(zip形式のまま)に以下のディレクトリ配下へ格納しています。
/home/oracle/docker-images-master/OracleDatabase/SingleInstance/dockerfiles/18.3.0

4.データベース環境作成

ファイルの配置とパーミッション等が整備されていれば、シェルスクリプトを実行するのみです。
それぞれの引数の意味はhelpから確認可能です。
[oracle@Gretsch dockerfiles]$ ./buildDockerImage.sh -h

Usage: buildDockerImage.sh -v [version] [-e | -s | -x] [-i] [-o] [Docker build option]
Builds a Docker Image for Oracle Database.
Parameters:
-v: version to build
Choose one of: 11.2.0.2 12.1.0.2 12.2.0.1 18.3.0
-e: creates image based on 'Enterprise Edition'
-s: creates image based on 'Standard Edition 2'
-x: creates image based on 'Express Edition'
-i: ignores the MD5 checksums
-o: passes on Docker build option

* select one edition only: -e, -s, or -x

5.データベースの作成

以下の構成で作成しています。

  • MTA(マルチテナントアーキテクチャ) --> CDB(コンテナ)+1PDB(プラガブル)
  • 環境変数(コンテナ/プラガブル)

        ORACLE_SID=orcl
        ORACLE_PDB=pdb1

  • ポート構成

        DBへの接続ポート:1521
        EMへの接続ポート:5500

  • データのDockerホストへのマッピング先

        /mnt/oradata

  • 管理者ユーザパスワード

        起動(docker run実行)後、以下の文字列後に出力されます。
        今回の例では、「ZCqw5kkI0YA」(手順内の赤字部分)となります。

        ORACLE PASSWORD FOR SYS, SYSTEM AND PDBADMIN:

手順実行

■1.Dockerイメージの準備(配置)
[oracle@Gretsch dockerfiles]$ pwd
/home/oracle/docker-images-master/OracleDatabase/SingleInstance/dockerfiles
[oracle@Gretsch dockerfiles]$ ll
合計 20
drwxr-xr-x. 2 oracle docker 126 7月 24 07:21 11.2.0.2
drwxr-xr-x. 2 oracle docker 4096 7月 24 07:21 12.1.0.2
drwxr-xr-x. 2 oracle docker 4096 7月 24 07:21 12.2.0.1
drwxr-xr-x. 2 oracle docker 4096 7月 24 22:22 18.3.0
-rwxr-xr-x. 1 oracle docker 4171 7月 24 07:21 buildDockerImage.sh
■2.buildDockerImage.shの動作確認
[oracle@Gretsch dockerfiles]$ ./buildDockerImage.sh -h
Usage: buildDockerImage.sh -v [version] [-e | -s | -x] [-i] [-o] [Docker build option]
Builds a Docker Image for Oracle Database.
:
Parameters:
-v: version to build
Choose one of: 11.2.0.2 12.1.0.2 12.2.0.1 18.3.0
-e: creates image based on 'Enterprise Edition'
-s: creates image based on 'Standard Edition 2'
-x: creates image based on 'Express Edition'
-i: ignores the MD5 checksums
-o: passes on Docker build option
* select one edition only: -e, -s, or -x
■3.インストールモジュール準備
[oracle@Gretsch 18.3.0]$ pwd
/home/oracle/docker-images-master/OracleDatabase/SingleInstance/dockerfiles/18.3.0
[oracle@Gretsch 18.3.0]$ ll
合計 4457744
-rw-r--r--. 1 oracle docker 63 7月 24 07:21 Checksum.ee
-rw-r--r--. 1 oracle docker 63 7月 24 07:21 Checksum.se2
-rw-r--r--. 1 oracle docker 2606 7月 24 07:21 Dockerfile.ee
-rw-r--r--. 1 oracle docker 2612 7月 24 07:21 Dockerfile.se2
-rwxrwxrwx. 1 oracle docker 4564649047 7月 24 21:53 LINUX.X64_180000_db_home.zip
-rwxr-xr-x. 1 oracle docker 1148 7月 24 07:21 checkDBStatus.sh
-rwxr-xr-x. 1 oracle docker 905 7月 24 07:21 checkSpace.sh
-rwxr-xr-x. 1 oracle docker 2953 7月 24 07:21 createDB.sh
-rw-r--r--. 1 oracle docker 6878 7月 24 07:21 db_inst.rsp
-rw-r--r--. 1 oracle docker 9204 7月 24 07:21 dbca.rsp.tmpl
-rwxr-xr-x. 1 oracle docker 2220 7月 24 07:21 installDBBinaries.sh
-rwxr-xr-x. 1 oracle docker 6140 7月 24 07:21 runOracle.sh
-rwxr-xr-x. 1 oracle docker 1015 7月 24 07:21 runUserScripts.sh
-rwxr-xr-x. 1 oracle docker 758 7月 24 07:21 setPassword.sh
-rwxr-xr-x. 1 oracle docker 894 7月 24 07:21 setupLinuxEnv.sh
-rwxr-xr-x. 1 oracle docker 678 7月 24 07:21 startDB.sh
■4.データベース環境作成(事前にoracleユーザーをdockerグループに所属させる)
[oracle@Gretsch dockerfiles]$ sudo usermod -g docker oracle
[oracle@Gretsch dockerfiles]$ sudo /bin/systemctl restart docker.service
[oracle@Gretsch dockerfiles]$ chmod -R 777 18.3.0/
[oracle@Gretsch dockerfiles]$ ./buildDockerImage.sh -v 18.3.0 -e
Checking if required packages are present and valid...
LINUX.X64_180000_db_home.zip: 完了
==========================
DOCKER info:
Containers: 3
Running: 0
Paused: 0
Stopped: 3
Images: 50
Server Version: 18.03.1-ce
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 773c489c9c1b21a6d78b5c538cd395416ec50f88
runc version: 4fc53a81fb7c994640722ac585fa9ca548971871
init version: 949e6fa
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-862.2.3.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 7.638GiB
Name: Gretsch
ID: R6PX:3ITF:FHHA:NRSS:2Q3J:XVBL:B2ER:VWQT:EDMN:C6CX:FLLB:UPWZ
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
==========================
Building image 'oracle/database:18.3.0-ee' ...
Sending build context to Docker daemon 4.565GB
Step 1/17 : FROM oraclelinux:7-slim
---> c94cc930790a
Step 2/17 : MAINTAINER Gerald Venzl <gerald.venzl@oracle.com>
---> Running in 76b7836e8c0e
Removing intermediate container 76b7836e8c0e
---> 2645dd189c95
~(略)~
Dependencies Resolved
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
openssl x86_64 1:1.0.2k-12.0.1.el7 ol7_latest 492 k
oracle-database-preinstall-18c
x86_64 1.0-1.el7 ol7_latest 18 k
tar x86_64 2:1.26-34.el7 ol7_latest 845 k
unzip x86_64 6.0-19.el7 ol7_latest 169 k
Installing for dependencies:
GeoIP x86_64 1.5.0-11.el7 ol7_latest 1.1 M
acl x86_64 2.2.51-14.el7 ol7_latest 81 k
bc x86_64 1.06.95-13.el7 ol7_latest 114 k
bind-libs x86_64 32:9.9.4-61.el7 ol7_latest 1.0 M
bind-license noarch 32:9.9.4-61.el7 ol7_latest 85 k
bind-utils x86_64 32:9.9.4-61.el7 ol7_latest 204 k
binutils x86_64 2.27-28.base.el7_5.1 ol7_latest 5.9 M
compat-libcap1 x86_64 1.10-7.el7 ol7_latest 17 k
compat-libstdc++-33 x86_64 3.2.3-72.el7 ol7_latest 190 k
~(略)~
qrencode-libs x86_64 3.4.1-3.el7 ol7_latest 49 k
quota x86_64 1:4.01-17.el7 ol7_latest 178 k
quota-nls noarch 1:4.01-17.el7 ol7_latest 90 k
rpcbind x86_64 0.2.0-44.el7 ol7_latest 59 k
smartmontools x86_64 1:6.5-1.el7 ol7_latest 460 k
sysstat x86_64 10.1.5-13.el7 ol7_latest 310 k
systemd x86_64 219-57.0.1.el7 ol7_latest 5.0 M
systemd-libs x86_64 219-57.0.1.el7 ol7_latest 402 k
systemd-sysv x86_64 219-57.0.1.el7 ol7_latest 79 k
sysvinit-tools x86_64 2.88-14.dsf.el7 ol7_latest 62 k
tcp_wrappers x86_64 7.6-77.el7 ol7_latest 78 k
tcp_wrappers-libs x86_64 7.6-77.el7 ol7_latest 65 k
util-linux x86_64 2.23.2-52.el7 ol7_latest 2.0 M
xorg-x11-utils x86_64 7.5-22.el7 ol7_latest 113 k
xorg-x11-xauth x86_64 1:1.0.9-1.el7 ol7_latest 29 k
xz x86_64 5.2.2-1.el7 ol7_latest 228 k
Updating for dependencies:
libcom_err x86_64 1.42.9-12.el7_5 ol7_latest 40 k
libstdc++ x86_64 4.8.5-28.0.1.el7_5.1 ol7_latest 303 k
Transaction Summary
================================================================================
Install 4 Packages (+108 Dependent packages)
Upgrade ( 2 Dependent packages)
Total download size: 46 M
Downloading packages:
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
--------------------------------------------------------------------------------
Total 10 MB/s | 46 MB 00:04
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Updating : libcom_err-1.42.9-12.el7_5.x86_64 1/116
Installing : tcp_wrappers-libs-7.6-77.el7.x86_64 2/116
Installing : fipscheck-1.4.1-6.el7.x86_64 3/116
Installing : fipscheck-lib-1.4.1-6.el7.x86_64 4/116
Installing : gzip-1.5-10.el7.x86_64 5/116
Installing : cracklib-2.9.0-11.el7.x86_64 6/116
Updating : libstdc++-4.8.5-28.0.1.el7_5.1.x86_64 7/116
Installing : cracklib-dicts-2.9.0-11.el7.x86_64 8/116
~(略)~
Verifying : cronie-1.4.11-19.el7.x86_64 108/116
Verifying : GeoIP-1.5.0-11.el7.x86_64 109/116
Verifying : 2:tar-1.26-34.el7.x86_64 110/116
Verifying : compat-libstdc++-33-3.2.3-72.el7.x86_64 111/116
Verifying : systemd-sysv-219-57.0.1.el7.x86_64 112/116
Verifying : libpwquality-1.2.3-5.el7.x86_64 113/116
Verifying : 1:dbus-libs-1.10.24-7.0.1.el7.x86_64 114/116
Verifying : libcom_err-1.42.9-11.0.1.el7.x86_64 115/116
Verifying : libstdc++-4.8.5-28.0.1.el7.x86_64 116/116
Installed:
openssl.x86_64 1:1.0.2k-12.0.1.el7
oracle-database-preinstall-18c.x86_64 0:1.0-1.el7
tar.x86_64 2:1.26-34.el7
unzip.x86_64 0:6.0-19.el7
Dependency Installed:
GeoIP.x86_64 0:1.5.0-11.el7
acl.x86_64 0:2.2.51-14.el7
bc.x86_64 0:1.06.95-13.el7
bind-libs.x86_64 32:9.9.4-61.el7
bind-license.noarch 32:9.9.4-61.el7
bind-utils.x86_64 32:9.9.4-61.el7
binutils.x86_64 0:2.27-28.base.el7_5.1
compat-libcap1.x86_64 0:1.10-7.el7
compat-libstdc++-33.x86_64 0:3.2.3-72.el7
cracklib.x86_64 0:2.9.0-11.el7
cracklib-dicts.x86_64 0:2.9.0-11.el7
cronie.x86_64 0:1.4.11-19.el7
cronie-anacron.x86_64 0:1.4.11-19.el7
crontabs.noarch 0:1.11-6.20121102git.el7
cryptsetup-libs.x86_64 0:1.7.4-4.el7
dbus.x86_64 1:1.10.24-7.0.1.el7
dbus-libs.x86_64 1:1.10.24-7.0.1.el7
device-mapper.x86_64 7:1.02.146-4.0.2.el7
device-mapper-libs.x86_64 7:1.02.146-4.0.2.el7
dracut.x86_64 0:033-535.0.2.el7
e2fsprogs-libs.x86_64 0:1.42.9-12.el7_5
elfutils-default-yama-scope.noarch 0:0.170-4.el7
elfutils-libs.x86_64 0:0.170-4.el7
ethtool.x86_64 2:4.8-7.el7
~(略)~
make.x86_64 1:3.82-23.el7
net-tools.x86_64 0:2.0-0.22.20131004git.el7
nfs-utils.x86_64 1:1.3.0-0.54.0.1.el7
openssh.x86_64 0:7.4p1-16.el7
openssh-clients.x86_64 0:7.4p1-16.el7
pam.x86_64 0:1.1.8-22.el7
pkgconfig.x86_64 1:0.27.1-4.el7
procps-ng.x86_64 0:3.3.10-17.el7_5.2
psmisc.x86_64 0:22.20-15.el7
qrencode-libs.x86_64 0:3.4.1-3.el7
quota.x86_64 1:4.01-17.el7
quota-nls.noarch 1:4.01-17.el7
rpcbind.x86_64 0:0.2.0-44.el7
smartmontools.x86_64 1:6.5-1.el7
sysstat.x86_64 0:10.1.5-13.el7
systemd.x86_64 0:219-57.0.1.el7
systemd-libs.x86_64 0:219-57.0.1.el7
systemd-sysv.x86_64 0:219-57.0.1.el7
sysvinit-tools.x86_64 0:2.88-14.dsf.el7
tcp_wrappers.x86_64 0:7.6-77.el7
tcp_wrappers-libs.x86_64 0:7.6-77.el7
util-linux.x86_64 0:2.23.2-52.el7
xorg-x11-utils.x86_64 0:7.5-22.el7
xorg-x11-xauth.x86_64 1:1.0.9-1.el7
xz.x86_64 0:5.2.2-1.el7
Dependency Updated:
libcom_err.x86_64 0:1.42.9-12.el7_5 libstdc++.x86_64 0:4.8.5-28.0.1.el7_5.1
Complete!
~(略)~
Step 12/17 : USER oracle
---> Running in 3f080487eeb5
Removing intermediate container 3f080487eeb5
---> 8933361333d7
Step 13/17 : WORKDIR /home/oracle
Removing intermediate container 2791d10eca55
---> 99e63389ce67
Step 14/17 : VOLUME ["$ORACLE_BASE/oradata"]
---> Running in 08cf5d17938e
Removing intermediate container 08cf5d17938e
---> 6e0ca709442b
Step 15/17 : EXPOSE 1521 5500
---> Running in bbc8d7a45364
Removing intermediate container bbc8d7a45364
---> df25e017a730
Step 16/17 : HEALTHCHECK --interval=1m --start-period=5m CMD "$ORACLE_BASE/$CHECK_DB_FILE" >/dev/null || exit 1
---> Running in 9f3bef559152
Removing intermediate container 9f3bef559152
---> 607b5b5a71a3
Step 17/17 : CMD exec $ORACLE_BASE/$RUN_FILE
---> Running in 0aabfb36585a
Removing intermediate container 0aabfb36585a
---> 085b58577b1f
Successfully built 085b58577b1f
Successfully tagged oracle/database:18.3.0-ee
Oracle Database Docker Image for 'ee' version 18.3.0 is ready to be extended:
:
--> oracle/database:18.3.0-ee
Build completed in 1621 seconds.
■5.データベース作成
[oracle@Gretsch dockerfiles]$ sudo mkdir -p /mnt/oradata
[sudo] oracle のパスワード:
[oracle@Gretsch dockerfiles]$ sudo chmod -R 777 /mnt/
$ docker run --name ora1830 -p 1521:1521 -p 5500:5500 -v /mnt/oradata:/opt/oracle/oradata -e ORACLE_SID=ora1830 -e ORACLE_PDB=pdb1 oracle/database:18.3.0-ee
ORACLE PASSWORD FOR SYS, SYSTEM AND PDBADMIN: ZCqw5kkI0YA=1
LSNRCTL for Linux: Version 18.0.0.0.0 - Production on 24-JUL-2018 14:11:56
Copyright (c) 1991, 2018, Oracle. All rights reserved.
Starting /opt/oracle/product/18c/dbhome_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 18.0.0.0.0 - Production
System parameter file is /opt/oracle/product/18c/dbhome_1/network/admin/listener.ora
Log messages written to /opt/oracle/diag/tnslsnr/2b82d37c1875/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 18.0.0.0.0 - Production
Start Date 24-JUL-2018 14:11:56
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /opt/oracle/product/18c/dbhome_1/network/admin/listener.ora
Listener Log File /opt/oracle/diag/tnslsnr/2b82d37c1875/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
The listener supports no services
The command completed successfully
Prepare for db operation
8% complete
Copying database files
31% complete
Creating and starting Oracle instance
32% complete
36% complete
40% complete
43% complete
46% complete
Completing Database Creation
51% complete
54% complete
Creating Pluggable Databases
58% complete
77% complete
Executing Post Configuration Actions
100% complete
Database creation complete. For details check the logfiles at:
/opt/oracle/cfgtoollogs/dbca/ora1830.
Database Information:
Global Database Name:ora1830
System Identifier(SID):ora1830
Look at the log file "/opt/oracle/cfgtoollogs/dbca/ora1830/ora1830.log" for further details.
SQL*Plus: Release 18.0.0.0.0 - Production on Tue Jul 24 14:26:40 2018
Version 18.3.0.0.0
Copyright (c) 1982, 2018, Oracle. All rights reserved.
Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.3.0.0.0
SQL>
System altered.
SQL>
Pluggable database altered.
SQL> Disconnected from Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.3.0.0.0
ls: cannot access /opt/oracle/oradata/ora1830/*/: No such file or directory
The Oracle base remains unchanged with value /opt/oracle
#####################################
########### E R R O R ###############
DATABASE SETUP WAS NOT SUCCESSFUL!
Please check output for further info!
########### E R R O R ###############
#####################################
The following output is now a tail of the alert.log:
Completed: alter pluggable database pdb1 open
2018-07-24T14:26:38.030755+00:00
PDB1(3):CREATE SMALLFILE TABLESPACE "USERS" LOGGING DATAFILE '/opt/oracle/oradata/ORA1830/pdb1/users01.dbf' SIZE 5M REUSE AUTOEXTEND ON NEXT 1280K MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO
PDB1(3):Completed: CREATE SMALLFILE TABLESPACE "USERS" LOGGING DATAFILE '/opt/oracle/oradata/ORA1830/pdb1/users01.dbf' SIZE 5M REUSE AUTOEXTEND ON NEXT 1280K MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO
PDB1(3):ALTER DATABASE DEFAULT TABLESPACE "USERS"
PDB1(3):Completed: ALTER DATABASE DEFAULT TABLESPACE "USERS"
2018-07-24T14:26:40.444801+00:00
ALTER SYSTEM SET control_files='/opt/oracle/oradata/ora1830/control01.ctl' SCOPE=SPFILE;
ALTER PLUGGABLE DATABASE pdb1 SAVE STATE
Completed: ALTER PLUGGABLE DATABASE pdb1 SAVE STATE
2018-07-24T15:06:14.267626+00:00
Resize operation completed for file# 3, old size 522240K, new size 532480K
■6.インスタンスへの接続確認
[oracle@Gretsch ~]$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2b82d37c1875 oracle/database:18.3.0-ee "/bin/sh -c 'exec $O…" 7 hours ago Up 7 hours (unhealthy) 0.0.0.0:1521->1521/tcp, 0.0.0.0:5500->5500/tcp ora1830
3eb0624a21e9 oracle/database:12.1.0.2-ee "/bin/sh -c 'exec $O…" 2 months ago Exited (143) 2 months ago ora12102
b4eb3c10ed7d oracle/database:12.2.0.1-ee "/bin/sh -c 'exec $O…" 2 months ago Exited (143) 2 weeks ago ora12201
02c6716c60e9 hello-world "/hello" 2 months ago Exited (0) 2 months ago boring_heisenberg
[oracle@Gretsch ~]$ docker exec -it ora1830 /bin/bash
[oracle@2b82d37c1875 ~]$ sqlplus /nolog
SQL*Plus: Release 18.0.0.0.0 - Production on Tue Jul 24 21:08:33 2018
Version 18.3.0.0.0
Copyright (c) 1982, 2018, Oracle. All rights reserved.
SQL> conn /as sysdba
Connected.
SQL> select instance_name,status from v$instance;
INSTANCE_NAME STATUS
----------------    ------------
ora1830              OPEN
SQL> show pdbs
 CON_ID CON_NAME               OPEN MODE RESTRICTED
---------- ------------------------------ ------------  ----------
             2 PDB$SEED                          READ         ONLY NO
             3 PDB1                                  READ         WRITE NO
SQL>

参考資料

https://github.com/oracle/docker-images

www.undercoverlog.com

Oracle 問合せ変換(Query Transformation)

はじめに

オプティマイザは、多数の問合せ変換を使用して、意味的には同等の新しいSQL文を生成します。
数あるOracleの問合せ変換について主要なものを整理しました。

  • 以下でカテゴリ分けしています。
    • 単純変換:No-brainer Transformations
    • 集合と結合の変換:Set and Join Transformations
    • 集約に関する変換:Aggregation Transformations
    • サブクエリ変換:Subquery Transformations
    • その他の変換:Miscellaneous Transformations
    • スター型変換:Star Transformation

問合せ変換

名称 和名 ヒント句
No-brainer Transformations
Count Transformation カウント変換
Predicate Move-around 述語移動
Set and Join Transformations
Join Elimination 結合排除 eliminate_join/no_eliminate_join
Outer Join to Inner Join 外部結合の内部結合変換 outer_join_to_inner/no_outer_join_to_inner
Full Outer Join to Outer Join 外部結合の完全外部結合変換 full_outer_join_to_outer/no_full_outer_join_to_outer
Semi-Join to Inner Join セミ結合の内部結合変換 semi_to_inner/no_semi_to_inner
Subquery Unnesting サブクエリのネスト解除 unnest/no_unnest
Partial Joins 部分結合 partial_join/no_partial_join
Join Factorization 結合の因数分解 factorize_join/no_factorize_join
Set to Join セット操作の結合 set_to_join/no_set_to_join
Aggregation Transformations
Distinct Aggregation 個別集計 transform_distinct_agg/no_transform_distinct_agg
Distinct Placement Distinct配置の最適化 place_distinct/no_place_distinct
Group by Placement Group by配置の最適化 place_group_by/no_place_group_by
Group by Pushdown Group byのプッシュ parallel gby_pushdown/no_parallel gby_pushdown
Subquery Transformations
Simple View Merging ビューマージ merge/no_merge
Complex View Merging 複雑なビューマージ merge/no_merge
Factored Subquery Materialization 因数分解されたサブクエリの実体化 inline/materialize
Subquery Pushdown サブクエリのプッシュ push_subq/no_push_subq
Join Predicate Pushdown 結合述語のプッシュ push_pred/no_push_pred
Subquery Decorrelation サブクエリ相関解除 decorrelate/no_decorrelate
Subquery Coalescing サブクエリの結合 coalsesce_sq/no_coalsesce_sq
Miscellaneous Transformations
Or Expansion OR拡張 use_concat/no_expand
Materialized View Rewrite クエリーリライト rewrite/no_rewrite
Grouping Sets to Union Expansion UNION拡張のグループ化 expand_gset_to_union/no_expand_gset_to_union
Order by Elimination ORDER BYの排除 eliminate_oby/no_eliminate_oby
Table Expansion 表拡張 expand_table/no_expand_table
Star Transformation
The Distributed Join Filter Problem 分散結合フィルタ no_table_lookup_by_nl

※和名は、勝手に命名しているものもあります。

参考資料

Expert Oracle SQL

Expert Oracle SQL: Optimization, Deployment, and Statistics

Expert Oracle SQL: Optimization, Deployment, and Statistics


Oracle® Database SQLチューニング・ガイド 12cリリース2 (12.2)

Oracle SQL言語~なぜ非効率な実行計画が選択され、SQLが性能劣化するのか~

概要

統計情報の必要性について自分なりに整理してみました。
なぜ非効率な実行計画が選択され、SQL性能が悪くなるのかもあわせて考えてみました。
DBAをしているとアプリケーションのご担当者や上層部への報告でこの点に関する説明を求められる機会が多いためまとめておきます。

SQL言語の特徴

コンピュータのプログラミング言語には、手続き型言語と非手続き型に大別されます。
SQLはこの内の非手続き型言語にカテゴリされます。

非手続き型言語には、さらに関数型言語/論理型言語/問合わせ言語があり、SQLはこの内の問合わせ言語にカテゴライズされます。

カテゴリ 主な言語 説明
手続き型言語 C言語,Java,Python,Perl,Ruby 処理の方法を記述
非手続き型言語 Lisp,SQL 処理の内容を記述

~SQL実践入門(引用)~

権限移譲の功罪
この態度の違いは良いとか悪いとかいうものではなく、言語の設計思想の違いです。
C言語、JavaからRubyに至るまで、手続き型を基礎する言語においては、ユーザがデータアクセスのための手段(How)を責任を持って記述することが前提です。
他方、手続き型であるRDBは、その仕事をユーザからシステム側に移管しました。
その結果、ユーザのすることは対象(What)の記述だけに限定されたのです。

~SQLパフォーマンス詳解(引用)~

開発者はインデックスを知る必要がある

SQLのクエリは、データを要求する英語の文として読むことができます。
通常SQLを書く時には、データベースの内部動作やストレージシステム(ディスクやファイルなど)に関する知識は必要とされません。
データベースに対して、どの ファイルを開き、どのように要求する行を見つけるかを指示する必要はないわけです。
多くの開発者は、何年もSQLを触っているにもかかわらず、データベースの内部で行われている処理についてはほとんど知らないでしょう。

何が欲しいのかと、どのようにそれを取得するかという関連性を分離することは、SQLにおいては非常に有効に機能しています。
しかし、それでも完璧ではありません。
パフォーマンスの問題にたどり着く時、このような抽象化は逆効果になります。
前述の通り、SQL文を書く人は、どのようにデータベースが文を実行するかを知らないからです。
つまり、SQL文を書いた人はクエリの実行が遅くても責任を持てないのです。
しかし、経験的には逆のことが言えるでしょう。つまり、パフォーマンス上の問題を避けるためには、開発者はデータベースについて多少なりとも知っておく必要があるということです。

つまり、SQLは条件(What)のみを記述し、どのように(How)データを戻すかは記述しない、という特性があるということです。
多くの手続き型言語では、for文・while文・if文などの繰り返し処理や条件分岐をプログラマ自身が記述しますが、SQL言語ではそのようなアルゴリズムを記述する必要がない点が特徴として挙げられます。
SQLで記述しないHow(どのようにデータを抽出するかのアルゴリズム決定・制御)について、リレーショナルデータベースではクエリ評価エンジンと呼ばれる機能が担います。

Oracleでの動作

Oracleでは、この部分を「CBO(Cost Base Optimizer)」と呼ばれる機能が実施しています。
CBOがアルゴリズムを組み立てる際のインプットとなる情報には、「統計情報」やSQLテキストがあります。
CBOが決定したアルゴリズム(どのようにデータを取ってくるか)は「実行計画」と呼ばれます。
CBOが決定するHow部分(データ取得のためのアルゴリズム)は、常に最良のものが選択されるわけではなく、予測として決定されるため、非効率な実行計画が選択されてパフォーマンス劣化を招きます。
CBOの予測精度を高めるためにはインプット情報の精度を高める、特に統計情報の精度を高い状態に保つことが肝要です。
※それでも非効率な実行計画が選択されることはありますが。。

SQLの成り立ちや歴史については以下が参考になります

Pro Oracle SQL, Second Edition
CHAPTER 1: Core SQL
The SQL Language

参考資料

The Relational Model for Database Management: Version 2 

The Relational Model for Database Management: Version 2

The Relational Model for Database Management: Version 2

 

データベース実践講義 ―エンジニアのためのリレーショナル理論 

データベース実践講義 ―エンジニアのためのリレーショナル理論 (THEORY/IN/PRACTICE)

データベース実践講義 ―エンジニアのためのリレーショナル理論 (THEORY/IN/PRACTICE)

 

プログラマのためのSQL 第4版 

プログラマのためのSQL 第4版

プログラマのためのSQL 第4版

 

SQLパフォーマンス詳解 

SQLパフォーマンス詳解

SQLパフォーマンス詳解

 

アート・オブ・SQL ―パフォーマンスを引き出すSQLプログラミング手法 

アート・オブ・SQL ―パフォーマンスを引き出すSQLプログラミング手法 (Theory in practice)

アート・オブ・SQL ―パフォーマンスを引き出すSQLプログラミング手法 (Theory in practice)

  • 作者: Stephane Faroult,Peter Robson,木下哲也,有限会社福龍興業
  • 出版社/メーカー: オライリー・ジャパン
  • 発売日: 2007/09/15
  • メディア: 大型本
  • 購入: 4人 クリック: 215回
  • この商品を含むブログ (28件) を見る
 

SQL and Relational Theory, 3rd Edition 

SQL and Relational Theory: How to Write Accurate SQL Code

SQL and Relational Theory: How to Write Accurate SQL Code

 

SQL実践入門 

SQL実践入門──高速でわかりやすいクエリの書き方 (WEB+DB PRESS plus)

SQL実践入門──高速でわかりやすいクエリの書き方 (WEB+DB PRESS plus)

 

達人に学ぶSQL徹底指南書 

達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ

達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ

 

Troubleshooting Oracle Performance, Second Edition 

Troubleshooting Oracle Performance

Troubleshooting Oracle Performance

 

Pro Oracle SQL, Second Edition 

Pro Oracle SQL (Expert's Voice in Oracle)

Pro Oracle SQL (Expert's Voice in Oracle)

  • 作者: Karen Morton,Kerry Osborne,Robyn Sands,Riyaj Shamsudeen,Jared Still
  • 出版社/メーカー: Apress
  • 発売日: 2013/10/29
  • メディア: ペーパーバック
  • この商品を含むブログを見る
 

スポンサーリンク