hatenob

プログラムって分からないことだらけ

Oracle Database 12cインストール

免責

先に謝っておきますが、Chefはかじった程度です。
今回はChefに重きを置いてないので、べた書きでChefっぽさはないです。
なんなら、シェルでもいいんじゃない?くらいです。
一応やった順に書いているつもりですが、途中であれこれやりながら書いているので、このままでは動かないかもしれません。
この手順でいかなる損害を被ったとしても筆者は責を負いません。
自己責任、自己解決でお願いします。

やること

  • Chef Soloを使ってOracle12c環境の事前準備をする。
  • Oracle12cをサイレントインストールする。

環境

プラットフォーム

DBインスタンス

  • Edition: Standard Edition
  • SID: orcl
  • プラガブルデータベース: pdb1
  • memory_target: 2GB

1. CentOSインストール

新規VMを作成。この時、OSは後からインストールするようにする。
VMWare Playerのウィザードみたいなのだと、minimalはうまく入らないみたい。
VM作成後に、CentOSのISOファイルを光学ドライブにアタッチしてVMを起動しインストール。
インストールはデフォルト。
swap領域は、今回のように4GBメモリを割り当てていると同じくらい取ってくれるけど、少なくする場合はOracleの要件を下回らないよう注意。

インストールしたら、とりあえずyumでパッケージを最新化しておく。

# yum -y update

これ以降の設定やパッケージ導入はChefを使ってやる。
基本的に、全部rootで作業する。

2. Chefのインストール

インストール

OpsCodeのインストール手順に倣ってChefを入れる。

# curl -L https://www.opscode.com/chef/install.sh | bash

Knife Soloも入れておく。

# /opt/chef/embedded/bin/gem install knife-solo --no-ri --no-rdoc

Chef Solo設定の作成

# mkdir /etc/chef
# vi /etc/chef/solo.rb
file_cache_path "/tmp/chef-solo" # ファイルキャッシュのパス。適当に
cookbook_path "/root/chef-repo/cookbooks" #クックブックを置くディレクトリ
role_path "/root/chef-repos/roles" #ロールファイルを置くディレクトリ
log_level :info

Chefリポジトリの作成

ChefリポジトリをKnifeを使って作成。chef-repoは任意のディレクトリ。

# knife solo init chef-repo

3.Oracle 12cインストールの準備

下記を参考にOracle 12cのインストール環境を整える。
http://www.oracle.com/technetwork/jp/database/enterprise-edition/documentation/db121linux-x64-ja-v10-1984264-ja.pdf

以降はChefリポジトリ(今回はchef-repo)に移動して作業。

Oracle 12c用のレシピを作成

# knife cookbook create oracle12c -o cookbooks

今回はfilesとrecipeディレクトリしか使わないので、他は消してしまってもよい。

「3.2.1 ソフトウェア要件」のパッケージ追加

パッケージをインストールするためにレシピに追記。

# vi cookbooks/oracle12c/recipes/default.rb

# Install required packages

pkgs = [ \
  "binutils" \
  , "compat-libcap1" \
  , "compat-libstdc++-33" \
  , "gcc" \
  , "gcc-c++" \
  , "glibc" \
  , "glibc-devel" \
  , "ksh" \
  , "libgcc" \
  , "libstdc++" \
  , "libstdc++-devel" \
  , "libaio" \
  , "libaio-devel" \
  , "libXext" \
  , "libXtst" \
  , "libX11" \
  , "libXau" \
  , "libxcb" \
  , "libXi" \
  , "make" \
  , "sysstat" \
]

pkgs.each do |pkg|
  package pkg do
    action :install
  end
end

レシピ実行ホスト情報を作成。

# vi nodes/localhost.json

{
  "run_list" : [
    "recipe[oracle12c]"
  ]
}

Chef Soloの動作確認もかねて、ここらで一度動かしてみる。
無事にパッケージがインストールされたら、Chefも構成できているということで。

# chef-solo -j nodes/localhost.json

「3.2.2 カーネル・パラメータの設定」追加

カーネルパラメータは/etc/sysctl.confに書かれるので、デフォルトファイルをコピーして、必要事項を追加する。

# cp /etc/sysctl.conf cookbooks/oracle12c/files/default/

kernel.shmallとkernel.shmmaxはデフォルトで要件値より大きいのでそのままにしておく。
それ以外は要件値より小さいので変更。
下の3つは多分不要なので削除。(残してたら何かエラー出た)

net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
# vi cookbooks/oracle12c/files/default/sysctl.conf

(略)
# Controls the maximum shared segment size, in bytes
kernel.shmmax = 68719476736

# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296

##########################
# Oracle 12c Requirements.

# Semaphore  semmsl semmns semopm semmni
kernel.sem = 250 32000 100 128

# Max file handles
fs.file-max = 6815744

# Max asynchronous I/O
fs.aio-max-nr = 1048576

# Local port range
net.ipv4.ip_local_port_range = 9000 65500

# Socket buffer
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576

この設定反映をレシピに追加。
ファイル反映のcookbook_fileが実行されたら、notifiesで即時にexecute “sysctl-p”を実行して設定を有効化。

# vi cookbooks/oracle12c/recipes/default.rb

# Configure kernel parameter

cookbook_file "/etc/sysctl.conf" do
  mode 00644
  notifies :run, "execute[sysctl-p]", :immediately
end

execute "sysctl-p" do
  command "/sbin/sysctl -p"
  action :nothing
end

「3.3.1 OSグループの作成」に従ってOSグループを作成

Hashにしといてグルグル回して作成。

# vi cookbooks/oracle12c/recipes/default.rb

# Create OS groups

groups = { \
  "oinstall" => "54321" \
  , "dba" => "54322" \
  , "backupdba" => "54323" \
  , "oper" => "54324" \
  , "dgdba" => "54325" \
  , "kmdba" => "54326" \
}

groups.each do |name, gid|
  group name do
    gid gid
  end
end

「3.3.2 Oracle Database用OSユーザの作成」に従ってOSユーザを作成

サブグループの設定はuserリソースでできないので、ユーザ作成後にgourpのmodifyで設定。

# vi cookbooks/oracle12c/recipes/default.rb

# Create OS user

user "oracle" do
  uid 1200
  gid "oinstall"
  supports :manage_home => true
  home "/home/oracle"
end

groups.each_key do |name|
  group name do
    members "oracle"
    action :modify
  end
end

「3.3.3 インストールディレクトリの作成」に従ってディレクトリを作成

最下層だけ指定すると、「mkdir -p」っぽく作ってくれるけれど、上位には権限やオーナーが設定されないみたいなので、上から順に作成。

# vi cookbooks/oracle12c/recipes/default.rb

#  Create directory

dirs = [ \
  "/u01" \
  , "/u01/app" \
  , "/u01/app/oracle" \
]

dirs.each do |dir|
  directory dir do
    mode 00775
    owner "oracle"
    group "oinstall"
  end
end

「3.4.2 リソース制限の設定」に従って制限を追加

/etc/security/limits.d/91-oracle.confとしてファイルを作成することにする。
limits.d下のファイルは、数字の順に読まれるみたいなので、デフォルトの90-noproc.confより後に読まれるように、91-oracle.confとする。
ドキュメントにはないが、何かの時のためにcoreファイルは吐けるようにしておく。

# vi cookbooks/oracle12c/files/default/91-oracle.conf

# oracle user ulimit

oracle soft nproc   2047
oracle hard nproc  16384
oracle soft nofile  1024
oracle hard nofile 65536
oracle soft stack  10240
oracle hard stack  32768
oracle soft core unlimited
oracle hard core unlimited
# vi cookbooks/oracle12c/recipes/default.rb

# Add ulimit

cookbook_file "/etc/security/limits.d/91-oracle.conf" do
  mode 00644
end

「16.環境変数の設定」追加

デフォルトの.bash_profieに追記。

# vi cookbooks/oracle12c/files/default/.bash_profile

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
	. ~/.bashrc
fi

# User specific environment and startup programs

# Oracle
umask 022
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/12.1.0/dbhome_1
export ORACLE_SID=orcl
export PATH=$ORACLE_HOME/bin:$PATH
export LANG=ja_JP.UTF-8
export NLS_LANG=Japanese_Japan.AL32UTF8
# vi cookbooks/oracle12c/recipes/default.rb

# Add environment variables

cookbook_file "/home/oracle/.bash_profile" do
  mode 00644
  owner "oracle"
  group "oinstall"
end

tmpfsの増加

メモリ4GBのうちOracleに2GBを割り当てようとしたが、デフォルトだとtmpfsが1.9GBしか取られておらずエラーに見舞われたので3GBまで増やす。

# cp /etc/fstab cookbooks/oracle12c/files/default/
# vi cookbooks/oracle12c/files/default/fstab

(省略)
tmpfs                   /dev/shm                tmpfs   defaults,size=3G           0 0
(省略)

増やしたらremountする。

# vi cookbooks/oracle12c/recipes/default.rb

# Increase tmpfs size

cookbook_file "/etc/fstab" do
  mode 00644
  notifies :run, "execute[remount-tmpfs]"
end

execute "remount-tmpfs" do
  command "mount -o remount tmpfs"
  action :nothing
end

その他ネットワーク設定や必要なパッケージのインストール

要件ではないけど必要なので入れておく。

  • zip/unzip -- インストールモジュールの解凍
  • ntp -- サーバの時刻同期

Oracleの要件とは別なのでcookbookを分ける。

# knife cookbook create common -o cookbooks

レシピを記載。

# vi cookbooks/common/recipes/default.rb

# Network configuration

cookbook_file "/etc/sysconfig/network-scripts/ifcfg-eth0" do
  mode 00644
end

cookbook_file "/etc/resolv.conf" do
  mode 00644
end

cookbook_file "/etc/hosts" do
  mode 00644
end

pkgs = [ \
  "zip" \
  , "unzip" \
  , "ntp" \
]

pkgs.each do |pkg|
  package pkg do
    action :install
  end
end

# Setup ntpd

cookbook_file "/etc/ntp.conf" do
  mode 00644
  notifies :restart, "service[ntpd]"
end

service "ntpd" do
  action [:enable, :start]
end

NTP設定は参考まで。

tinker panic 0

driftfile /var/lib/ntp/drift

restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
restrict 127.0.0.1 
restrict -6 ::1

server ntp.nict.jp

nodesにレシピ適用を追加。

#  vi nodes/localhost.json

{
  "run_list" : [
    "recipe[common]"
    , "recipe[oracle12c]"
  ]
}

サイレントインストールの準備

サイレントインストールしたくない人のためにクックブックを分ける。

# knife cookbook create oracle12c-silent -o cookbooks

レスポンスファイル(サイレントインストールに使用)の配置。
書き方はGoogle先生を参考にどうぞ。

# vi cookbooks/oracle12c-silent/recipes/default.rb

# Copy response file

cookbook_file "/home/oracle/db_install.rsp" do
  mode 00644
  owner "oracle"
  group "oinstall"
end

cookbook_file "/home/oracle/dbca.rsp" do
  mode 00644
  owner "oracle"
  group "oinstall"
end

localhost.jsonに追加して実行。

{
  "run_list" : [
    "recipe[common]"
    , "recipe[oracle12c]"
    , "recipe[oracle12c-silent]"
  ]
}
# chef-solo -j nodes/localhost.json

これでインストール準備完了。

4.Oracle 12cのインストール

インストーラの実行

oracleユーザでインストーラを実行。

$ ./runInstaller -silent -responseFile ~/db_install.rsp

しばらくするとプロンプトが返ってくるけどそのまま放置。
「[WARNING] [INS-13001] 環境が、最低要件を満たしていません。」というのが出るが、特に問題ないようなので、インストールログをtailして観察。

$ tail -f /u01/app/oraInventory/logs/installActionsyyyy-mm-dd_HH-MM-SS.log

…
情報: Exit Status is 0
情報: Shutdown Oracle Database 12cリリース1インストーラ

で正常終了したらOK。

インストール後作業

rootユーザで下記を実行するように指示されるので従う。

# /u01/app/oraInventory/orainstRoot.sh
# /u01/app/oracle/product/12.1.0/dbhome_1/root.sh

oracleユーザで下記を実行するように指示されるので従う。

$ /u01/app/oracle/product/12.1.0/dbhome_1/cfgtoollogs/configToolAllCommands RESPONSE_FILE=./db_install.rsp

listener.oraが作成される模様。ポートが1521でなければ修正。

$ vi /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.ora

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = centos64-12c)(PORT = 1521))
    )
  )

リスナーを停止させておく。

$ lsnrctl stop

DBCAでデータベースインスタンス作成

最初のインストールのレスポンスファイルにもSID等を書いているので、それで作成されるのかと思っていたけどされなかったのでDBCAで作成する。DBCAもレスポンスファイル。

$ dbca -silent -createDatabase -responseFile dbca.rsp

レスポンスファイルの不備と思うが、「PDBADMINユーザ・パスワードを入力してください」と出るのでパスワードを入力。

リスナーを起動。

$ lsnrctl start

「4.3.1 コンテナ・データベースとプラガブル・データベースの接続確認」

プラガブルデータベースが、READ WRITEになっていることを確認。

$ sqlplus system/Oracle12c@localhost:1521/orcl

SQL> alter session set container=pdb1;

セッションが変更されました。

SQL> show con_name

CON_NAME
------------------------------
PDB1
SQL> select name, open_mode from v$pdbs;

NAME                           OPEN_MODE
------------------------------ ----------
PDB1                           READ WRITE

tnsnames.oraを作成

$ vi /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/tnsnames.ora

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = centos64-12c)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

pdb1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = centos64-12c)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = pdb1)
    )
  )

以上でOracle 12cに接続できるところまで完成。

今後の課題

  • そもそも、プラガブルデータベースってなんやろ。
  • 新機能とか試したいなぁ。

参考

Chefのレシピはやらレスポンスファイルやらは下記。
ただし、今後リファクタリングとかで変更される可能性あり、本文の内容とは一致しない可能性大。
https://github.com/nobrooklyn/chef-repo