はじめに
リレーショナルデータベースとして有名なOracle DatabaseをAWS EC2上に構築する。
以下チュートリアルを参考に実施する。多数つまずいたため、その点も記載する。 手順は多くないが、一から勉強していたため、所要時間は4時間ほどかかっている。
前提条件
構成イメージ
EC2インスタンスを作成して、OracleDatabaseXEをインストールし、データベースを1つ作成する。
冗長構成は無し。
環境
- Windows11
- Amazon EC2(Linux RHEL 8)
- Oracle Database XE 21cをインストール
Oracleのバージョン、エディションについて
バージョンについて、2022/11現在Oracleのバージョンは19cがLTS、21cが最新版とのこと。
また、用途によってエディションがあり、すごくざっくりまとめると以下のようになる。学習用にはXEで良さそうなのでXEをインストールする。
エディション | 価格 | 用途 |
---|---|---|
XE(Express Edition) | 無料 | 学習、試用 |
EE(Enterprise Edition) | 有料 | 商用 |
Oracle Cloud | OracleCloudに含まれる | 商用 |
EC2作成
まずはEC2を作成する。公式ページの「要件」を見ると、主に以下の要件が記載されているため、従うこととする。
- OS:
- Oracle Linux 8.2以降
- Red Hat Enterprise Linux 8.2以降
- SUSE Linux Enterprise Server 15 SP1: 4.12.14-197.29-default
- RAM:最低1GB以上、推奨は2GB
- ディスク:10GB以上
今回作成したEC2のスペックは以下の通り。 Oracle DatabaseがRED Hat Enterprise Linux 9(RHEL9)以降には対応していないとの情報が多かったので、RHEL8で実施する。
- AMI ID:
ami-0f903fb156f24adbf
(Red Hat Enterprise Linux 8)
- インスタンスタイプ:
m5.large
(※1日3ドル程の料金がかかるので注意。) - VPC:以前作成したもの(
10.0.0.0/16
) - サブネット:パブリックサブネット(1a)
(※データベースをパブリックサブネットに置くことは無いと思うが、練習用なのでOKとする) - パブリックIPの自動割り当て:有効化
- セキュリティグループは新規作成し、
ssh
とHTTP
のアクセスを受け付ける。
(※セキュリティが緩いが練習用なのでOKとする) - ストレージ:15GiB、gp2(EBSの汎用ボリューム)
(※ここでは15GiBとしたが、のちに20GiBに変える必要が出てきてしまった。最初から20GiBで作るほうが良いと思う。)
EC2の作成方法は、【AWSに入門してみた】EC2でサーバを立ち上げて、SSHアクセスする | エンジニアを目指す日常ブログにまとめている。
インスタンスを起動出来たら、sshで接続する。
SSH接続方法メモ
以下のコンフィグファイルを、ホストOSのC\:Users\ユーザ名\.ssh\config
というファイル名で用意した上で、
Host redhat
HostName xx.xx.xx.xx # パブリックIPアドレス
User ec2-user
Port 22
IdentityFile "C:\Users\xxx\rsa.pem" # 秘密鍵の絶対パス
PowerShellで以下コマンドを実行する。
> ssh redhat
インストール
EC2にOracleDatabaseをインストールする。大きくは3つの手順となる。
- 事前準備パッケージ(oracle-database-preinstall-21c-1.0-1.el8.x86_64.rpm)をインストールする
- Oracle Database XE をインストールする
- データベース作成(
/etc/init.d/oracledb_ORCLCDB-19c
を利用)※サンプルデータベースを作成できる。
参考:https://www.oracle.com/database/technologies/appdev/xe/quickstart.html
1.事前準備パッケージのインストール
実行手順
事前準備パッケージを公式ページからローカルにダウンロードする。(2022/11/20現在は、「oracle-database-preinstall-21c-1.0-1.el8.x86_64.rpm
」)
scp等を利用し、ローカルからEC2のホームディレクトリに転送する。
PS C:\Users\user\Downloads> scp oracle-database-xe-21c-1.0-1.ol8.x86_64.rpm redhat:~
EC2にSSHログインし、管理者ユーザでdnf install
を実施する。
$ sudo -s
# dnf -y localinstall oracle-database-preinstall-21c-1.0-1.el8.x86_64.rpm
メモ
scp
コマンドの構文:scp [ファイルパス] [接続先IPアドレス:ディレクトリ]
dnf
:パッケージ管理ソフトyum
の後継。- RHEL:RED Hat Enterprise Linuxの略。
つまずいた部分①:ファイル間違い
- 事象:必要なパッケージが足りない旨のエラー。
- 原因:REDHATのLinuxバージョン(RHEL7)と、インストールしたファイルのバージョン(EL8用)が不整合だった。
- 解決:EC2を作り直してREDHATのLinuxバージョンをRHEL8に変更した。
元々RHEL7でEC2を立ち上げていたのだが、そこにRHEL8用のrpmファイルをインストールしようとしてしまったため、事前準備パッケージのインストールに失敗した。
# yum -y localinstall oracle-database-preinstall-21c-1.0-1.el8.x86_64.rpm
Error: Package: oracle-database-preinstall-21c-1.0-1.el8.x86_64 (/oracle-database-preinstall-21c-1.0-1.el8.x86_64)
Requires: compat-openssl10
Error: Package: oracle-database-preinstall-21c-1.0-1.el8.x86_64 (/oracle-database-preinstall-21c-1.0-1.el8.x86_64)
Requires: policycoreutils-python-utils
Error: Package: oracle-database-preinstall-21c-1.0-1.el8.x86_64 (/oracle-database-preinstall-21c-1.0-1.el8.x86_64)
Requires: libnsl
You could try using --skip-broken to work around the problem
You could try running: rpm -Va --nofiles --nodigest
つまずいた部分② サブスクリプションマネージャを使えというエラーが出る
- 事象:REDHATエラーが出てインストール完了しない。
- 原因:REDHAT Linuxを使う際はサブスクリプション契約が必要でその設定がされていないことになっている。
- 解決:コンフィグファイルを書き換えた。EC2でREDHATを使う場合、REDHATのLinuxサブスクリプションはEC2利用料に含まれているので問題ないらしいため、サブスクリプションを利用しない設定とする。
エラー内容は以下。
# dnf -y localinstall oracle-database-preinstall-21c-1.0-1.el8.x86_64.rpm
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered with an entitlement server. You can use subscription-manager to register.
Red Hat Enterprise Linux 8 for x86_64 - AppStream from RHUI (RPMs) 111 MB/s | 51 MB 00:00
Red Hat Enterprise Linux 8 for x86_64 - BaseOS from RHUI (RPMs) 89 MB/s | 55 MB 00:00
Red Hat Ansible Engine 2 for RHEL 8 (RPMs) from RHUI 31 MB/s | 2.5 MB 00:00
RHUI Client Configuration Server 8 48 kB/s | 2.3 kB 00:00
Last metadata expiration check: 0:00:01 ago on Sat 19 Nov 2022 11:40:02 AM UTC.
Can not load RPM file: oracle-database-preinstall-21c-1.0-1.el8.x86_64.rpm.
Could not open: oracle-database-preinstall-21c-1.0-1.el8.x86_64.rpm
/etc/yum/pluginconf.d/subscription-manager.conf
を書き換えることで解決した。
[main]
enabled=0
つまずいた部分③rpmがローカルインストールできない(プリインストール)
- 事象:Can not load RPMといったエラーが出て、インストール完了しない。
- 原因:不明。
- 解決:既存のパッケージを最新化した。
エラー内容は以下。
# dnf -y localinstall oracle-database-preinstall-21c-1.0-1.el8.x86_64.rpm
Last metadata expiration check: 0:09:32 ago on Sat 19 Nov 2022 01:53:54 PM UTC.
Can not load RPM file: oracle-database-preinstall-21c-1.0-1.el8.x86_64.rpm.
Could not open: oracle-database-preinstall-21c-1.0-1.el8.x86_64.rpm
dnf
自体の再インストールと、他パッケージのアップグレードを実施した。
①dnf再インストール
# sudo dnf reinstall '*dnf*'
②他パッケージのアップグレード
# dnf upgrade
②の効果があり解決した。(真因はわからず。)
2.Oracle DB XEをインストール
以下の公式ページからローカルにrpmファイルをダウンロードする。今回、RHEL8環境のため、 Oracle Database 21c Express Edition for Linux x64 ( OL8 ) をダウンロードした。
https://www.oracle.com/database/technologies/xe-downloads.html
ローカルからEC2のホームディレクトリにscp
する。
> scp oracle-database-xe-21c-1.0-1.ol8.x86_64.rpm redhat:~
EC2の/home/ec2-user
配下でlocalinstall
を実行する。
# dnf -y localinstall oracle-database-xe-21c-1.0-1.ol8.x86_64.rpm
特に問題なく実行できた。
3.サンプルデータベースを作成
データベースを作るのは、DBCAと呼ばれるデータベース作成補助ツールを使うのが一般的のようだが、OracleDatabase18以降、簡単にサンプルデータベースを作成できるコマンドが出てきたとのことで、コマンドを使ってサンプルデータベースを作成する。
ここで「データベース」と言っているのはこの部分で、「インスタンス」と「データベースファイル」のセット。
- 「データベース」は、通常は、OracleDatabaseのソフトウェアをインストールした時に一緒に作るが、インストールした後でも作れる。
- データベース作成には以下方法がある。
- DBCA(GUI)
- SQLで
CREATE DATABASE
文を実行する /etc/init.d/oracle-xe-21c
コマンドを使う(コマンドの中でDBCAを実行している)
実行手順
下記コマンドを実行すると、設定の対話プロンプトが始まるので、管理者ユーザのパスワードを設定する。
# /etc/init.d/oracle-xe-21c configure
つまずいた部分:ディスク容量不足
- 事象:ディスク容量が足りないエラーで、データベース作成を実行できない。
- 原因:EBSのディスク容量が足りなくなっていた。
- 解決:EBS容量を拡張し、マウント先のファイルシステムを拡張した。
以下のエラーが発生していた。
# /etc/init.d/oracle-xe-21c configure
The location '/opt/oracle' specified for database files has insufficient space.
Database creation needs at least '4.5GB' disk space.
Specify a different database file destination that has enough space in the configuration file '/etc/sysconfig/oracle-xe-21c.conf'.
ファイルシステムの残容量を見ると、マウントしたEBSの容量が3.9GBしか残っていなかった。実際は、4.5GBの容量が必要になる。
# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 3.7G 0 3.7G 0% /dev
tmpfs 3.7G 0 3.7G 0% /dev/shm
tmpfs 3.7G 17M 3.7G 1% /run
tmpfs 3.7G 0 3.7G 0% /sys/fs/cgroup
/dev/nvme0n1p2 15G 12G 3.9G 75% /tmpfs 747M 0 747M 0% /run/user/1000
そこで、EBSの容量を拡張した。実施内容は以下の記事に記載した。
作業実施後ファイルシステムを確認すると、空き容量が増えていた。このあと無事にOracleのデータベース作成処理を実行できた。
# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 3.7G 0 3.7G 0% /dev
tmpfs 3.7G 0 3.7G 0% /dev/shm
tmpfs 3.7G 17M 3.7G 1% /run
tmpfs 3.7G 0 3.7G 0% /sys/fs/cgroup
/dev/nvme0n1p2 20G 12G 8.9G 56% /tmpfs 747M 0 747M 0% /run/user/1000
データベースにアクセスしてみる
Oracle Databaseがインストールできており、以下のようなフォルダが作成された。
/opt/oracle
:Oracleベースと呼ばれる。ルートフォルダ。/opt/oracle/product/21c/dbhomeXE
:Oracle Databaseがインストールされている場所で、ホームディレクトリと呼ばれる。/opt/oracle/oradata/XE
:データベースの値を格納するファイル群が保管される。
実際にデータベースへのアクセスを行なう。
ユーザをスイッチする
自動的にLinuxにoracle
というユーザが作られ、SYSDBA
権限(最も強力な権限)が与えられているそうなので、oracle
にスイッチユーザする。パスワードはわからないので、管理者権限からスイッチする。
# su - oracle
環境変数を設定
ユーザにログインした時に毎回実行される~/.bash_profile
に環境変数を書く。
.bash_profile
の開き方
※以下 oracle ユーザで実施
$ cd ~
$ pwd
/home/oracle
$ ls -a
. .. .bash_history .bash_logout .bash_profile .bashrc .kshrc
$ vi .bash_profile
もともとある記載の最下部に以下の行を追記する。
export ORACLE_SID=XE
export ORAENV_ASK=NO
. /opt/oracle/product/21c/dbhomeXE/bin/oraenv
export NLS_LANG=Japanese_Japan.AL32UTF8 # 日本設定
export PATH=$ORACLE_HOME/bin:$PATH # sqlplusコマンドを使うためのパス設定
SID
とは
データベースの「インスタンス」の名前。今回のサンプルデータベースではデフォルトで「XE
」という名前で作られている。環境変数に「XE
」を設定しておくことで、XE
インスタンスにログインできる。
Linuxメモ
export
は環境変数を定義するコマンド。ターミナルを閉じると消えてしまう環境変数。.
は現行環境で、指定されたシェル・スクリプトを実行するコマンド。
データベースにログインする
$ sqlplus / as sysdba※パスが通っていない場合は $ /opt/oracle/product/21c/dbhomeXE/bin/sqlplus / as sysdba
SQL*Plus: Release 21.0.0.0.0 - Production on Sun Nov 20 08:11:16 2022
Version 21.3.0.0.0
Copyright (c) 1982, 2021, Oracle. All rights reserved.
Connected to:
Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
SID(インスタンスの名前)と、グローバルネーム(データベースファイル)の名前を取得するコマンドを叩く。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;
INSTANCE_NAME
----------------
XE
SQL> SELECT global_name FROM global_name;
GLOBAL_NAME
----------------------------------------------
XE
それぞれの値を確認することができた。
まとめ
Oracle Database XE 21cをEC2上にインストールすることができた。 実際に手を動かしたほうが理解できることもあると思うので、今後使っていく予定。(今日はインストールで力尽きた。)