前回までのあらすじ

みなさん、こんにちは。新人若井さんが出来先輩の助けを借りながら、アマゾン ウェブ サービス(以下AWS)上でOracle DBを作成しようと言うこの企画。前回までにOracleをインストールする為の要件に合わせて、AWS上のEC2の設定作業を行いました。今回はOracleのインストールする為のOSの準備を行っていきたいと思います。

  • 若井 あらた (わかいあらた)
    新人エンジニアで、今回データベース課に配属となった。本物語の主人公。



  • 出来 益代 (でき ますよ)
    中堅エンジニアで、データベース課に所属する。年齢は不詳。仕事熱心で、比較的後輩の面倒見もよいお姉さまタイプ。



※ この物語はフィクションであり、登場する団体・人物などの名称はすべて架空のものです

OSユーザー/グループの作成

出来 「ハードウェアとソフトウェアのインストール要件の確認が終わったわね。次はOracle Databaseのインストールに必要なOSユーザー/グループを作成しましょう。今回の構成では、ざっとOracle Databaseのインストール必要なユーザーはこんなところかしら。」

  • Oracleインベントリ・グループ(oinstall)
     →Oracleソフトウェアを所有するグループ
  • OSDBAグループ(dba)
     →データベース管理権限(SYSDBA)を持つグループ
  • OSOPERグループ(oper)
     →OSDBAグループよりも限られた権限のみを持つグループ。
  • Oracleソフトウェアユーザー(oracle)
     →Oracleソフトウェア所有ユーザー

出来「今回の構成だと、こんなユーザーが必要ね。グループの作成には『groupadd』でユーザーの作成は『useradd』コマンドで行うわ。グループやユーザーに割り振る『グループID』、『ユーザーID』も事前に決めておかないといけないわよ。」

若井「Oracle DatabaseをインストールするのにいろんなOSユーザーやグループが必要なんですね。」

出来「そうね。今は、検証環境だから、Oracleデータベースを作成するのに必要なユーザーのみ作ってるけど、商用でのOracleデータベースを作成する時には、要件に応じて、様々なユーザーを作るわ。でも、今回作成するグループ、ユーザーに相当するものは、Oracleデータベースを作成するのなら、ほぼすべての環境で作成する事になると思うから、きっちりと復習と勉強をしておいてね。」
若井「なるほど。わかりました!さっそくOSユーザーとグループ作成してみましょう。」

--グループの作成
[root@ip-172-31-24-192 ~]# /usr/sbin/groupadd -g 1001 oinstall
[root@ip-172-31-24-192 ~]# /usr/sbin/groupadd -g 1002 dba
[root@ip-172-31-24-192 ~]# /usr/sbin/groupadd -g 1003 oper
--作成したグループの確認
[root@ip-172-31-24-192 ~]# grep oinstall /etc/group
oinstall:x:1001:
[root@ip-172-31-24-192 ~]# grep dba /etc/group
dba:x:1002:
[root@ip-172-31-24-192 ~]# grep oper /etc/group
oper:x:1003:
--OSユーザーの作成
[root@ip-172-31-24-192 ~]# /usr/sbin/useradd -u 1000 -g oinstall -G dba,oper oracle
--作成したOSユーザーの確認
[root@ip-172-31-24-192 ~]# grep oracle /etc/passwd
oracle:x:1000:1001::/home/oracle:/bin/bash

出来「oracleユーザーのパスワードも変更しておきましょう。」

[root@ip-172-31-24-192 ~]# /usr/bin/passwd oracle
Changing password for user oracle.
New password:                               ← パスワードを入力
BAD PASSWORD: it is based on a dictionary word
BAD PASSWORD: is too simple                 ← 入力したパスワードが簡単すぎるため警告
Retype new password:                        ← パスワードの再入力
passwd: all authentication tokens updated successfully.

出来「若井君、簡単なパスワードにしたわね。」
若井「ユーザー名と同じパスワードにしたんですけど。」
出来「相変わらず、安易ね。」
若井「すいません。」

カーネルパラメーター変更

出来「次はカーネルパラメーターの変更よ。」
若井「カーネルパラメーターですか。」
出来「そう。カーネルパラメーター。カーネルパラメーターを適切に変更する事によって、カーネルの個々の機能やドライバの、それぞれ振る舞いを変更できるようになる。Oracle Databaseをインストールする時も、Oracle Databaseに合わせたカーネルパラメーターの設定が必要よ。細かい意味はさておき、設定に必要な項目はこんな感じね。」

kernel.shmall = (物理メモリ / pagesize )
 ⇒システム全体の共有メモリの最大サイズをページ単位で指定。
kernel.shmmax = (物理メモリの1/2)
 ⇒1つの共有メモリセグメントの最大サイズを指定。単位はバイト。
kernel.shmmni = 4096
 ⇒共有メモリセグメントの最大個数を指定。
kernel.sem = 250 32000 100 128 ※左からsemmsl semmns semopm semmniの値
 ⇒semmsl:セマフォ集合体の最大サイズを指定。
 ⇒semmns:システム全体のセマフォの最大数を指定。
 ⇒semopem: semop呼び出しごとの最大命令数を指定。
 ⇒semmni:セマフォ集合体の個数を指定。
fs.file-max = (512 × processes)
 ⇒ファイルハンドラの最大数を指定。
fs.aio-max-nr = 104857
 ⇒システム全体の非同期I/O数の上限数を指定。
net.ipv4.ip_local_port_range = 9000 65500
 ⇒TCP/IPの送信時に使用するポートの範囲を指定。
net.core.rmem_default = 262144
 ⇒受信用ウィンドウ・サイズのデフォルト値を指定。
net.core.rmem_max = 4194304
 ⇒受信用ウィンドウ・サイズの最大値を指定。
net.core.wmem_default = 262144
 ⇒送信用ウィンドウ・サイズのデフォルト値を指定。
net.core.wmem_max = 1048576
 ⇒送信用ウィンドウ・サイズの最大値を指定。

出来「カーネルパラメーターの変更は、『/etc/sysctl.conf』の編集をした後に、『sysctl -p』で値の反映をさせるのよ。」
若井「わかりました。えーと、ページサイズは…」
出来「あー、ページサイズは『getconf PAGE_SIZE』で確認できわ。」

[root@ip-172-31-24-192 ~]# getconf PAGE_SIZE
4096

若井「『4096』ですね。メモリのサイズをもう一回確認しますね。」

[root@ip-172-31-24-192 ~]# grep MemTotal /proc/meminfo
MemTotal:        3849280 kB

若井「と言う事は、kernel.shmall = (3849280×1024)/4096 = 962320ですね。あと、kernel.shmmaxはkernel.shmmax=(3849280×1024)/2=1970831360となりますね。Processesって何ですか?」
出来「これはOracle Databaseで設定するパラメータよ。データベースに同時に接続できるOSユーザー・プロセスの最大数のことよ。ここでは一旦『512』で設定しましょう。」
若井「わかりました。fs.file-max = 512 × 512 = 262144ですね。」
出来「そうね。このカーネルパラメーターの値は、データベースの構築後に、メモリを追加した時、『processes』の値を変更した時も変更が必要だから、覚えておいてね。」 若井「わかりました。」

[root@ip-172-31-24-192 ~]# vi /etc/sysctl.conf
[root@ip-172-31-24-192 ~]# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 962320
kernel.shmall = 1970831360
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 262144
fs.aio-max-nr = 104857
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
[root@ip-172-31-24-192 ~]#

出来「設定出来たら確認をお願いね。」
若井「了解です。」

[root@ip-172-31-24-192 ~]# sysctl -a | grep kernel.shmall
kernel.shmall = 1970831360
[root@ip-172-31-24-192 ~]# sysctl -a | grep kernel.shmmax
kernel.shmmax = 962320
[root@ip-172-31-24-192 ~]# sysctl -a | grep kernel.shmmni
kernel.shmmni = 4096
[root@ip-172-31-24-192 ~]# sysctl -a | grep kernel.sem
kernel.sem = 250        32000   100     128
[root@ip-172-31-24-192 ~]# sysctl -a | grep fs.file-max
fs.file-max = 262144
[root@ip-172-31-24-192 ~]# sysctl -a | grep fs.aio-max-nr
fs.aio-max-nr = 104857
[root@ip-172-31-24-192 ~]# sysctl -a | grep net.ipv4.ip_local_port_range    
net.ipv4.ip_local_port_range = 9000     65500
[root@ip-172-31-24-192 ~]# sysctl -a | grep net.core.rmem_default
net.core.rmem_default = 262144
[root@ip-172-31-24-192 ~]# sysctl -a | grep net.core.rmem_max
net.core.rmem_max = 4194304
[root@ip-172-31-24-192 ~]# sysctl -a | grep net.core.wmem_default
net.core.wmem_default = 262144
[root@ip-172-31-24-192 ~]# sysctl -a | grep net.core.wmem_max
net.core.wmem_max = 1048576
[root@ip-172-31-24-192 ~]#

ユーザーシェルの設定

出来「さっきはカーネルパラメーターの設定変更をしたけど、ユーザーあたりの上限値も変更する必要があるわ。まず最初は『/etc/security/limits.conf』の設定。一時的な変更であれば『ulimit』コマンドで設定変更は可能だけど、設定をログイン時に常に有効にする為には、『/etc/security/limits.conf』に設定変更が必要よ。」
若井「なるほど、さっそく設定変更してみます。」
出来「うん。こんな感じでファイルに追記してね。」

oracle      soft    npproc      2047
oracle      hard    npproc      16384
oracle      soft    nofile      1024
oracle      hard    nofile      65536
[root@ip-172-31-24-192 ~]# vi /etc/security/limits.conf
[root@ip-172-31-24-192 ~]#

出来「あと、OSにログインする時に、最初に、『/etc/profile』って言う、シェルを読み込むんだけど、ここにも設定変更が必要なのよ。こんな感じで。」

if [ $USER = "oracle" ]; then
  if [ $SHELL = "/bin/ksh" ]; then
    ulimit -p 16384
    ulimit -n 65536
  else
    ulimit -u 16384 -n 65536
  fi
  umask 022
fi

若井「わかりました」

[root@ip-172-31-24-192 ~]# vi /etc/profile
[root@ip-172-31-24-192 ~]#

出来「最後に、『/etc/pam.d/login』の設定変更よ。OSの認証を一元管理する仕組みに、PAM(Pluggable Authentication Modules)って言うのがあるんだけど、この設定ファイルを変更する必要があるの。こんな感じで追記して。」

session required    pam_limits.so

若井「はい。変更します。」

[root@ip-172-31-24-192 ~]# vi /etc/pam.d/login
[root@ip-172-31-24-192 ~]#

出来「これで、Oracleユーザーに対するシェル制限の設定は終わり。ここら辺の内容は、Oracleのマニュアルにも記載があるから、後でまた目を通しておいてね。」
若井「了解しました。宿題ってことですよね。」
出来「まぁそんなところかしら。でも、データベースの完成までもう少しよ。がんばりましょう。」
若井「もう少しですか。がんばります。お!雪だ!」
出来「さむそー。」
若井「はい。。。」

今回はここまで!いよいよ、終盤戦に突入してきました、この企画ですが、最後まで、ぜひ読んでくださいね!!

それでは! 次回をおたのしみに!!

執筆者紹介

山口 正寛(YAMAGUCHI Masahiro)

株式会社システムサポート 東京支社インフラソリューション事業部所属。

同社が得意とするOracleデータベースのエンジニアで、大規模DWHのDB管理者、DBコンサルタントなどを経験。また、同社の無料セミナーの企画にも携わる。

今回、機器がなくても気軽に環境を構築し検証したいというかた向けに AWS上でOracleデータベースを構築することをストーリー調で記載する。 尚、同社はAWSを用いたクラウド工房 powered by AWSというプロダクトがあり、産学官連携でも活用している。