Oracle Database を使う機会があったのですが、事情により Oracle Linux が使えなかったので Rocky Linux へインストールしました。その時の手順のメモです。

環境

用語

Oracle Database のインストール手順

Rocky Linux (や RHEL や Oracle Linux) では RPM パッケージを使って yum コマンドで Oracle Database をインストールできます。インストールは以下の手順で行います。

  1. Preinstall パッケージをインストール
  2. Oracle Database パッケージをインストール
  3. Oracle Database の初期構成スクリプトを実行

※なお今回は Non-CDB 環境 (CDB と PDB の構成ではなく、従来の 1 サーバーインスタンスに 1 データベースの構成) の方法をベースにしていますが、CDB環境の場合に必要なコマンドはコメントに記載しています。

1. Preinstall パッケージのインストール

以下のコマンドで、preinstall パッケージをダウンロード + インストールします。

# Preinstall パッケージのダウンロード
$ curl -o oracle-database-preinstall-19c-1.0-1.el8.x86_64.rpm 
https://yum.oracle.com/repo/OracleLinux/OL8/appstream/x86_64/getPackage/oracle-database-preinstall-19c-1.0-1.el8.x86_64.rpm

# Preinstall パッケージをインストール
$ sudo yum localinstall ./oracle-database-preinstall-19c-1.0-1.el8.x86_64.rpm

2. Oracle Database パッケージのインストール

Oracle のサイトから Linux x86-64 の RPM パッケージをダウンロードします。ダウンロードする時に Oracle アカウントにログインしないといけないので、事前にアカウントを作成しておきます。

https://www.oracle.com/database/technologies/oracle-database-software-downloads.html

ダウンロードした RPM をインストールします。

$ sudo yum -y localinstall oracle-database-ee-19c-1.0-1.x86_64.rpm

3. Oracle Database 初期構成スクリプトの実行

/etc/init.d/oracledb_ORCLCDB-19c というスクリプトを実行して Oracle Database の初期構成を行います。

$ sudo /etc/init.d/oracledb_ORCLCDB-19c configure
...
Database configuration completed successfully. The passwords were auto generated, you must change them by connecting to the database using 'sqlplus / as sysdba' as the oracle user.

これで ORCLCDB という CDB と、ORCLPDB1 というデフォルトの PDB が作成されます。

Non-CDB 構成にする場合

CDB 環境にせず Oracle Database を構成することも可能です。その場合は /etc/init.d/oracledb_ORCLCDB-19c スクリプトの以下の箇所を変更し、configure を実行します。

$ sudo vim /etc/init.d/oracledb_ORCLCDB-19c
---
# export CREATE_AS_CDB=true
export CREATE_AS_CDB=false
---
$ sudo /etc/init.d/oracledb_ORCLCDB-19c configure 

これで ORCLCDB というデータベースが構成されます。

SQL*Plus のインストール

SQL*Plus は Oracle Database のコマンドラインクライアントです。Oracle では DB サーバーにクライアントツールは含まれていないため、別途クライアントをインストールします。

SQL*Plus にも RPM パッケージが用意されていますが、Oracle Database パッケージと競合するためインストールできません。そのため ZIP ファイルをダウンロードして展開した後、PATH を通して使用します。

1. ZIPファイルのダウンロード

以下の URL から “Basic Package (ZIP)” と “SQL*Plus Package (ZIP)” をダウンロードします。

https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html

ZIP ファイルを展開。

$ sudo unzip -d /opt/oracle instantclient-basic-linux.x64-19.14.0.0.0dbru.zip
$ sudo unzip -d /opt/oracle instantclient-sqlplus-linux.x64-19.14.0.0.0dbru.zip

共有ライブラリへ登録します。

$ sudo su
$ echo "/opt/oracle/instantclient_19_14/" > /etc/ld.so.conf.d/sqlplus.conf
$ ldconfig
$ exit

そして PATH を通して必要な環境変数を設定します。

$ vim ~/.bashrc
---
export ORACLE_SID=ORCLCDB
export ORACLE_BASE=/opt/oracle
export ORACLE_HOME=$ORACLE_BASE/product/19c/dbhome_1
export PATH=$PATH:$ORACLE_HOME/bin
export PATH=$PATH:/opt/oracle/instantclient_19_14
---
$ source ~/.bashrc

これで SQL*Plus を使って Oracle Database にログインできるのですが、まだユーザーを作っていないのでそのままではログインできません。

Oracle ではインストールを行った Linux ユーザーが管理者としてログインできるという機能があります。今回の RPM パッケージを使ったインストールでは、oracle という名前の Linux ユーザーが作成され、そのユーザーが Oracle Database のインストールを行いました。なので oracle ユーザーとして SQL*Plus を実行すれば Oracle Database にログインできます。

$ sudo su oracle

# 上記と同じように環境変数を設定
$ vim ~/.bashrc
---
export ORACLE_SID=ORCLCDB
(省略)
---
$ source ~/.bashrc

# SQL*Plus を使って Oracle にログイン
$ sqlplus / as sysdba
SQL> # ここからユーザーを作成したりできる
SQL> exit

Oracle 初期設定

oracle ユーザーでデータベースに接続できるのを確認したら、以下の要領で初期設定を行います。

# Firewall 許可
$ sudo firewall-cmd --add-port=1521/tcp --permanent
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-ports

# Oracleデータベースの自動起動設定
$ sudo systemctl enable oracledb_ORCLCDB-19c
$ sudo systemctl restart oracledb_ORCLCDB-19c

# (CDB 環境の場合のみ) Pluggable Database を open する
# $ sudo su oracle
# $ sqlplus / as sysdba
# SQL> alter pluggable database ORCLPDB1 open;
# SQL> alter pluggable database ORCLPDB1 save state;

# 管理者ユーザーの初期パスワード設定
SQL> alter user system identified by <password>;
SQL> alter user sys identified by <password>;

# ユーザー作成
# (CDB 構成の場合のみ) 以下のコマンドでPDBへ接続し直す
# SQL> alter session set container = ORCLPDB1;
SQL> create user <username> identified by "<password>" default tablespace USERS temporary tablespace TEMP;

# 必要な権限を付与。今回はテストのためなので grant all としています。
SQL> grant all privileges to <username>;
SQL> exit;

作成したユーザーでログインできるかテストします。

# (CDB 環境の場合) 接続先データベースに ORCLPDB1 を指定
# $ sqlplus <username>/<password>@//localhost:1521/ORCLPDB1

# (Non-CDB 環境の場合) 接続先データベースに ORCLECDB を指定
$ sqlplus <username>/<password>@//localhost:1521/ORCLCDB

SQL> create table <table-name> (id number, name nvarchar2(255), updated timestamp);
SQL> select * from <table-name>;
SQL> insert into <table-name> values (1, 'name 1', current_timestamp);
SQL> select * from <table-name>;

Archive Log の有効化

Archive Log を有効化するにはデータベースを一度停止する必要があります。また Archive Log のログ保持期間を変更するには RMAN というツールを使ってポリシーを更新します。

最後に、Oracle のトランザクションログには通常更新されたカラムの情報のみが記載されます (例えば UPDATE 文で 1つのカラムしか更新されなかった場合、トランザクションログにはそのカラムの値のみが記載されます)。レプリケーション製品によってはトランザクションログに更新された行の全てのカラムの値が記載されている必要があるものがあり、このために Supplemental Logging という機能を有効化する必要があります。

以下に Archive Log の有効化、Archive Log 保持期間の変更、Supplemental Loggingの有効化の方法を記載します。

1. Archive Log 有効化

$ sudo su oracle
$ sqlplus / as sysdba;

# Archive Log モードを確認
SQL> SELECT LOG_MODE FROM V$DATABASE;
LOG_MODE
------------
NOARCHIVELOG (または ARCHIVELOG)

# NOARCHIVELOG と表示されたら、Archive Log を有効化する
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
SQL> ALTER DATABASE ARCHIVELOG;
SQL> ALTER DATABASE OPEN;
SQL> SELECT LOG_MODE FROM V$DATABASE;
LOG_MODE
------------
ARCHIVELOG

SQL> exit

2. Archive Log 保持期間の変更

以下では Archive Log の保持期間を 7日に設定しています。

$ sudo su oracle
$ rman target /
RMAN> CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
using target database control file instead of recovery catalog
new RMAN configuration parameters:
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
new RMAN configuration parameters are successfully stored

RMAN> exit

3. Supplemental Logging の有効化

$ sudo su oracle
$ sqlplus / as sysdba

# 以下のコマンドで全てのテーブル/カラムで Supplemental Logging を有効化できる
# (テーブル/カラムを個別に指定する方法もあります)
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (all) COLUMNS;

Log Miner の使い方

Log Miner は REDO Log や Archive Log の中身を見る時に必要なツールで、Oracle Database に含まれています。

Log Miner は SQL*Plus で接続した後 EXECUTE 文を実行して使用します。まず中身を見たい Archive Log ファイルを追加し Log Miner を開始します。すると V$LOGMNR_CONTENTS というビューに Archive Log ファイルの中身が保存されるので、そのビューに対して SELECT 文を実行することで Archive Log の中身を見ることができる、という流れになります。

# Archive Log ファイルを確認
$ ls /opt/oracle/oradata/ORCLCDB/
redo01.log
redo02.log
...

$ sudo su oracle
$ sqlplus / as sysdba

# 中身を見たい Archive Log ファイルを追加
SQL> EXECUTE SYS.DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => '/opt/oracle/oradata/ORCLCDB/redo01.log', OPTIONS => SYS.DBMS_LOGMNR.NEW);

# Log Miner を開始
SQL> EXECUTE SYS.DBMS_LOGMNR.START_LOGMNR(OPTIONS => SYS.DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + SYS.DBMS_LOGMNR.COMMITTED_DATA_ONLY);

# Archive ログの内容は `V$LOGMNR_CONTENTS` から見れる
SQL> SELECT SCN, TIMESTAMP, SQL_REDO FROM V$LOGMNR_CONTENTS ORDER BY SCN DESC

# Log Miner の終了
SQL> EXECUTE SYS.DBMS_LOGMNR.END_LOGMNR();