Oracle19c(非PDB)インストール～OS認証/Wallet認証までのまとめ

## はじめに
記事の第3弾ではいよいよOracle DBをまとめます。
今回は昔勉強で構築していた名残を使っているため、非PDB構成だったりパラメータも適当です。
PDBについても別記事でまとめたいと思っています。

余談ですが、昨今Oracleのライセンス料が高く脱Oracleも見られますが、慣れるとOracleが一番よく感じてしまいます…。

## ダウンロード
以下のサイトからダウンロード可能です。
ダウンロードの際に、Oracleへの登録が必要となります。

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

本記事記載時は、19c、21cがダウンロード可能でした。
今回は長期サポートかつ自身が慣れている19cを選択します。

## インストール
### OS情報
MQ、HULFTを構築した環境をそのまま使用していますので、
引き続きCentOSの8を使用しています。
```ruby:コマンド
cat /etc/os-release

NAME="CentOS Stream"
VERSION="8"
ID="centos"
~省略~
```

### oracleユーザ/グループ作成
oracleで使用するグループやユーザの作成を行います。
```ruby:コマンド
# グループ作成(gidはお好みで)
groupadd -g 3000 oinstall
groupadd -g 3001 dba
groupadd -g 3002 oper
groupadd -g 3003 backupdba
groupadd -g 3004 dgdba
groupadd -g 3005 kmdba

# ユーザ作成(同じくuidはお好みで)
useradd -m -u 3000 -g oinstall -G dba,oper,backupdba,dgdba,kmdba oracle
passwd oracle
```

### ディレクトリ作成
oracleで使用するディレクトリの作成を行います。
```ruby:コマンド
mkdir -p /u01/app/oracle
mkdir -p /u01/app/oraInventory
mkdir -p /u01/app/oracle/product/19.3.0/dbhome_1
chown -R oracle:oinstall /u01
chmod -R 755 /u01
```

### limits設定
oracleのマニュアルに従いlimitsの設定を行います。
```ruby:コマンド
# 以下を追記
nano /etc/security/limits.conf

oracle               soft    nofile  1024
oracle               hard    nofile  65536
oracle               soft    nproc   2047
oracle               hard    nproc   16384
oracle               soft    stack   12040
oracle               hard    stack   32768
oracle               soft    memlock   3145728
oracle               hard    memlock   3145728
```

### パッケージインストール
oracleで必要としているパッケージの導入を行います。
OSのバージョンなどによって必須のものが導入済みだったりします…。

```ruby:コマンド
dnf -y install libnsl make glibc-devel.i686 glibc-devel libstdc++-devel.i686
```
### ファイル解凍
ダウンロードしたDBのアーカイブファイルの解凍を行います。
解凍が終わるとファイルが大量にあると思います。

```ruby:コマンド
[root@VM-TEST01 ~]# su - oracle
[oracle@VM-TEST01 ~]$ cd /u01/app/oracle/product/19.3.0/dbhome_1
[oracle@VM-TEST01 dbhome_1]$ ls -l
合計 2987996
-rw-r--r-- 1 oracle oinstall 3059705302  7月 22  2022 LINUX.X64_193000_db_home.zip
[oracle@VM-TEST01 dbhome_1]$ unzip -q LINUX.X64_193000_db_home.zip

[oracle@VM-TEST01 dbhome_1]$ ls -l
合計 2988084
-rw-r--r--  1 oracle oinstall 3059705302  7月 22  2022 LINUX.X64_193000_db_home.zip
drwxr-x--- 14 oracle oinstall       4096  4月 12  2019 OPatch
drwxr-xr-x  2 oracle oinstall         26  4月 17  2019 QOpatch
drwxr-xr-x  5 oracle oinstall         52  4月 17  2019 R
drwxr-xr-x  2 oracle oinstall        102  4月 18  2019 addnode
drwxr-xr-x  6 oracle oinstall       4096  4月 17  2019 apex
drwxr-xr-x  9 oracle oinstall         93  4月 17  2019 assistants
drwxr-xr-x  2 oracle oinstall       8192  4月 18  2019 bin
～省略～
```

### サイレントインストール用ファイル作成
今回もサイレントインストール用のレスポンスファイルを作成します。
「/u01/app/oracle/product/19.3.0/dbhome_1/install/response/db_install.rsp」にテンプレートがあるので、それを使ってもよいと思います。
全てを記載すると長くなるのでいくつかピックアップして紹介します。

```
cat /u01/app/oracle/product/19.3.0/dbhome_1/install/db_install.rsp

# DBのインストールのみ実施
oracle.install.option=INSTALL_DB_SWONLY

# インストールのグループを指定
UNIX_GROUP_NAME=oinstall

# Oracle_Inventoryのディレクトリを指定
INVENTORY_LOCATION=/u01/app/oraInventory

# Oracle_HOMEのディレクトリを指定
ORACLE_HOME=/u01/app/oracle/product/19.3.0/dbhome_1

# Oracle_Baseのディレクトリを指定
ORACLE_BASE=/u01/app/oracle

# Oracleのインストールエディションを指定
oracle.install.db.InstallEdition=EE

# Oracleの各種グループを指定
oracle.install.db.OSDBA_GROUP=dba
oracle.install.db.OSBACKUPDBA_GROUP=backupdba
oracle.install.db.OSDGDBA_GROUP=dgdba
oracle.install.db.OSKMDBA_GROUP=kmdba
oracle.install.db.OSRACDBA_GROUP=dba

# SYS/SYSTEMのパスワードを設定
oracle.install.db.config.starterdb.password.SYS=Computer1
oracle.install.db.config.starterdb.password.SYSTEM=Computer1
```

### DBインストール
情報ファイルができたらインストールコマンドを実行します。

その際にCV_ASSUME_DISTIDの環境変数を設定します。
OL8に対する前提チェックの仕組みが組み込まれていないらしく、
上記変数を設定しておくと「INS-08101」のエラーが回避可能となるそうです。

runInstallerコマンドに各種オプションを付けてサイレントインストールで実行します。
今回メモリなどの要件を満たしていないためいくつか警告が出ていましたが、
お試し環境ですのでそこは目をつぶって先に進んでしまいます。

```ruby:コマンド
[oracle@VM-TEST01 dbhome_1]$ export CV_ASSUME_DISTID='OL7'
[oracle@VM-TEST01 dbhome_1]$ ./runInstaller -silent -noconfig -responseFile ./install/response/db_install.rsp
Oracle Database設定ウィザードを起動中...

[WARNING] [INS-13014] ターゲット環境は、いくつかのオプションの要件を満たしていません。
   原因: 一部のオプションの前提条件が満たされていません。詳細はログを参照してください。installActions2024-04-22_11-45-08PM.log
   アクション: ログから失敗した前提条件チェックのリストを確認します: installActions2024-04-22_11-45-08PM.log。次に、ログ・ファイルまたはインストレーション・マニュアルのいずれかから、前提条件を満たす適切な構成を見つけ、手動で修正してください。
このセッションのレスポンス・ファイルは次の場所にあります:
 /u01/app/oracle/product/19.3.0/dbhome_1/install/response/db_2024-04-22_11-45-08PM.rsp

このインストール・セッションのログは次の場所にあります:
 /tmp/InstallActions2024-04-22_11-45-08PM/installActions2024-04-22_11-45-08PM.log

rootユーザーとして次のスクリプトを実行します:
        1. /u01/app/oraInventory/orainstRoot.sh
        2. /u01/app/oracle/product/19.3.0/dbhome_1/root.sh

次のノードで/u01/app/oraInventory/orainstRoot.shを実行してください:
[VM-TEST01]
次のノードで/u01/app/oracle/product/19.3.0/dbhome_1/root.shを実行してください:
[VM-TEST01]


Successfully Setup Software with warning(s).
インストール・セッション・ログの移動先:
 /u01/app/oraInventory/logs/InstallActions2024-04-22_11-45-08PM
 ```

 ### DBインストール
上記メッセージで以下の2つのシェルをrootで実行せよと指示があるため実行します。

1. /u01/app/oraInventory/orainstRoot.sh
2. /u01/app/oracle/product/19.3.0/dbhome_1/root.sh

それぞれ以下の役割があるそうです。
orainstRoot.sh：インベントリのディレクトリ・パスを格納するための/etc/oraInst.locファイルの配置、インベントリの権限設定などを行います。
root.sh：環境変数を設定するためのdbhome、oraenv、coraenvファイルの配置、Oracleホームのディレクトリ・パスを格納するための/etc/oratabファイルの配置などを行います。

```ruby:コマンド
[oracle@VM-TEST01 dbhome_1]$ exit
ログアウト
[root@VM-TEST01 dbhome_1]#
[root@VM-TEST01 dbhome_1]# /u01/app/oraInventory/orainstRoot.sh
権限を変更中 /u01/app/oraInventory.
グループの読取り/書込み権限を追加中。
全ユーザーの読取り/書込み/実行権限を削除中。

グループ名の変更 /u01/app/oraInventory 宛先 oinstall.
スクリプトの実行が完了しました。 
[root@VM-TEST01 dbhome_1]#
[root@VM-TEST01 dbhome_1]# /u01/app/oracle/product/19.3.0/dbhome_1/root.sh
Check /u01/app/oracle/product/19.3.0/dbhome_1/install/root_VM-TEST01_2024-04-22_23-53-35-117910293.log for the output of root script
```

### プロファイル設定
インストールが完了したら、oracleのユーザプロファイルに以下の記載を追加しておきましょう。
```ruby:コマンド
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/19.3.0/dbhome_1
export ORACLE_SID=test00
export NLS_LANG=Japanese_Japan.AL32UTF8
export PATH=$ORACLE_HOME/bin:$PATH
```

### DB作成
まずはログファイル用ディレクトリやinitファイルの作成を行います。
ここら辺は各環境で異なると思うので各自設定をお願いします。
```ruby:コマンド
mkdir -p /u01/app/oracle/oradata/test00/
mkdir -p /u01/logs/test00/
chown -R oracle:oinstall /u01/logs/
```

今回初期化パラメータは必要最低限で設定しています。
```ruby:コマンド
cd ${ORACLE_HOME}/dbs
cp -p init.ora inittest00.ora

# 以下を設定
nano inittest00.ora

db_name='test00'
memory_target=1G
db_block_size=4096
undo_tablespace='UNDOTBS1'
local_listener='(ADDRESS=(PROTOCOL=tcp)(HOST=VM-TEST01)(PORT=1521))'
```

問題なければDBに接続し、PFILEからSPFILE作成とSQLによるDB作成を実施します。
初期化パラメータやDBの表領域などは昔適当に作った値を投入しているのでかなり適当です…。
```ruby:コマンド
sqlplus / as sysdba

SQL> CREATE SPFILE FROM PFILE;

File created.

SQL> STARTUP NOMOUNT;
ORACLE instance started.

Total System Global Area 1073737800 bytes
Fixed Size                  8904776 bytes
Variable Size             616562688 bytes
Database Buffers          440401920 bytes
Redo Buffers                7868416 bytes

SQL> CREATE DATABASE test00
  2     USER SYS IDENTIFIED BY password
  3     USER SYSTEM IDENTIFIED BY password
  4     LOGFILE GROUP 1 ('/u01/logs/test00/redo01a.log','/u01/logs/test00/redo01b.log') SIZE 100M BLOCKSIZE 512,
  5             GROUP 2 ('/u01/logs/test00/redo02a.log','/u01/logs/test00/redo02b.log') SIZE 100M BLOCKSIZE 512,
  6             GROUP 3 ('/u01/logs/test00/redo03a.log','/u01/logs/test00/redo03b.log') SIZE 100M BLOCKSIZE 512   MAXLOGHISTORY 1
  7     MAXLOGFILES 16
  8     MAXLOGMEMBERS 3
  9     MAXDATAFILES 1024
 10     CHARACTER SET AL32UTF8
 11     NATIONAL CHARACTER SET AL16UTF16
 12     EXTENT MANAGEMENT LOCAL
 13     DATAFILE '/u01/app/oracle/oradata/test00/system01.dbf'
 14       SIZE 700M REUSE AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED
 15     SYSAUX DATAFILE '/u01/app/oracle/oradata/test00/sysaux01.dbf'
 16       SIZE 550M REUSE AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED
 17     DEFAULT TABLESPACE users
 18        DATAFILE '/u01/app/oracle/oradata/test00/users01.dbf'
 19        SIZE 500M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED
 20     DEFAULT TEMPORARY TABLESPACE tempts1
 21        TEMPFILE '/u01/app/oracle/oradata/test00/temp01.dbf'
 22        SIZE 20M REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED
 23     UNDO TABLESPACE undotbs1
 24        DATAFILE '/u01/app/oracle/oradata/test00/undotbs01.dbf'
 25        SIZE 200M REUSE AUTOEXTEND ON NEXT 5120K MAXSIZE UNLIMITED
 26     USER_DATA TABLESPACE usertbs
 27        DATAFILE '/u01/app/oracle/oradata/test00/usertbs01.dbf'
 28        SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;

データベースが作成されました。
```

### ディクショナリービューの作成
以下のコマンドでディクショナリーの構築をします。
書いてあるドキュメントや人でだいぶ異なっている印象があります…。
「catcdb.sql」を実行すると対話式にログ出力先とログ名を聞かれるので入力します。
全体で30分ほどかかりました。

```ruby:コマンド
[ostest@VM-TEST01 ~]$ cd ${ORACLE_HOME}/perl/bin
[oracle@VM-TEST01 bin]$ sqlplus / as sysdba
SQL> @?/rdbms/admin/catcdb.sql

1に値を入力してください: /tmp
2に値を入力してください: create.log

@?/rdbms/admin/catalog.sql
@?/rdbms/admin/catproc.sql
quit

sqlplus system/Computer1
@?/sqlplus/admin/pupbld.sql
quit

sqlplus / as sysdba
@?/rdbms/admin/utlrp.sql
quit
```

### OS認証設定
一般ユーザのOS認証はOracle Database 11.1で非推奨になり、21cではサポート終了し使用不可となりました。
昔の名残で使っている所もあり、折角なので備忘として残しておきます。
```ruby:コマンド
# 接頭字をNullに設定
SQL> ALTER SYSTEM SET "os_authent_prefix"='' SCOPE=spfile;
システムが変更されました。

# OS認証を許可
SQL> ALTER SYSTEM SET "remote_os_authent"=TRUE SCOPE=spfile;
システムが変更されました。

# OS認証用のOracleユーザを作成
CREATE USER OSTEST IDENTIFIED EXTERNALLY DEFAULT TABLESPACE USERTBS TEMPORARY TABLESPACE TEMPTS1 QUOTA 50M ON USERTBS PROFILE DEFAULT ;
ユーザーが作成されました。

SQL> GRANT CREATE SESSION to OSTEST;
権限付与が成功しました。
```

今回はostestというユーザを作成しログインテストをしてみます。
```ruby:コマンド
[ostest@VM-TEST01 ~]$ sqlplus /

SQL*Plus: Release 19.0.0.0.0 - Production on 火 4月 23 00:31:27 2024
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
に接続されました。
SQL>
```

今回はostestというユーザを作成しログインテストをしてみます。
```ruby:コマンド
[ostest@VM-TEST01 ~]$ sqlplus /

SQL*Plus: Release 19.0.0.0.0 - Production on 火 4月 23 00:31:27 2024
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
に接続されました。
SQL>
```

### Wallet認証設定
先ほどOS認証は非推奨(最新版だと廃止)と記載していましたが、
代替手段としてWalletファイルによるキーリポジトリの作成が推奨されています。
そちらも紹介しておきます。

まずは「sqlnet.ora」を修正します。
今回は「wltest」というユーザのホームディレクトリ配下にて、
walletファイルの作成を行う予定ですので、そのパスを記載しておきます。
```ruby:コマンド
nano sqlnet.ora

# 以下を追記
WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/home/wltest/wallet)))
SQLNET.WALLET_OVERRIDE=TRUE
```

次にはWallet認証用のユーザを作成します。
```ruby:コマンド
# Wallet認証用のOracleユーザを作成
SQL> CREATE USER WLTEST IDENTIFIED BY WLTEST DEFAULT TABLESPACE USERTBS TEMPORARY TABLESPACE TEMPTS1 QUOTA 50M ON USERTBS PROFILE DEFAULT ;
ユーザーが作成されました。

SQL> GRANT CREATE SESSION to WLTEST;
権限付与が成功しました。
SQL> quit
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0との接続が切断されました。
[oracle@VM-TEST01 ~]$
[oracle@VM-TEST01 ~]$ sqlplus WLTEST/WLTEST@TEST00

SQL*Plus: Release 19.0.0.0.0 - Production on 火 4月 23 09:02:23 2024
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

最終正常ログイン時間: 火 4月  23 2024 08:58:31 +09:00


Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
に接続されました。
SQL>
```

先ほど記載した「wltest」ユーザにてwalletファイルの作成を行います。
```ruby:コマンド
# Walletファイルの作成
[wltest@VM-TEST01 ~]$ mkstore -wrl wallet -create
Oracle Secret Store Tool Release 19.0.0.0.0 - Production
19.3.0.0.0: バージョン{1}
Copyright (c) 2004, 2019, Oracle and/or its affiliates. All rights reserved.

# ここでWalletファイルのパスワードを指定
パスワードの入力:
パスワードの再入力:

# Walletディレクトリとファイルが生成されます。
[wltest@VM-TEST01 ~]$ cd wallet
[wltest@VM-TEST01 wallet]$ ls -l
合計 8
-rw------- 1 wltest wltest 581  4月 23 09:22 cwallet.sso
-rw------- 1 wltest wltest   0  4月 23 09:22 cwallet.sso.lck
-rw------- 1 wltest wltest 536  4月 23 09:22 ewallet.p12
-rw------- 1 wltest wltest   0  4月 23 09:22 ewallet.p12.lck

# Walletに認証情報を追加します。接続識別子が「TEST00」、ユーザ名が「WLTEST」となります。
[wltest@VM-TEST01 wallet]$ mkstore -wrl ./ -createCredential TEST00 'WLTEST'
Oracle Secret Store Tool Release 19.0.0.0.0 - Production
19.3.0.0.0: バージョン{1}
Copyright (c) 2004, 2019, Oracle and/or its affiliates. All rights reserved.

# ここでOracleのWalletユーザのパスワードを入力
コマンド・ラインでシークレット/パスワードが欠落しています
シークレット/パスワード入力:
シークレット/パスワード再入力:
ウォレット・パスワードを入力してください:

[wltest@VM-TEST01 wallet]$ mkstore -wrl ./ -listCredential
Oracle Secret Store Tool Release 19.0.0.0.0 - Production
19.3.0.0.0: バージョン{1}
Copyright (c) 2004, 2019, Oracle and/or its affiliates. All rights reserved.

ウォレット・パスワードを入力してください:
List credential (index: connect_string username)
# Walletの中身を確認すると接続識別子とユーザ名が表示されます。
1: TEST00 WLTEST
[wltest@VM-TEST01 wallet]$
[wltest@VM-TEST01 wallet]$
# 先ほど設定接続識別子を設定してパスワードなしでログインができます。
[wltest@VM-TEST01 wallet]$ sqlplus /@TEST00
```

## 最後に
久しぶりに構築すると楽しかったです。
Oracleはきっとまだ現役なので資格勉強もしようかと思います。

## 参考サイト
・サイレント・インストールの実行
https://docs.oracle.com/cd/E21043_01/doc.1111/b61431/silent-install.htm

・Oracle Database設定ウィザードの実行によるOracle Databaseのインストール
https://docs.oracle.com/cd/E96517_01/ladbi/running-oracle-universal-installer-to-install-oracle-database.html

・Oracleソフトウェア・インストール・ユーザーのリソース制限の確認
https://docs.oracle.com/cd/E82638_01/cwlin/checking-resource-limits-for-oracle-software-installation-users.html

・Oracle Database 19c インストールしてみた
https://qiita.com/nwtba1plt/items/e3df995ef7bd024b9e5a