最小限の設定で RAC インスタンスを起動する

　Oracle Real Application Clusters (RAC) は複数ノードでストレージを共有しながら Oracle Database インスタンスを起動する複雑な仕組みです。RAC を起動するためには Oracle Grid Infrastructure 設定、Oracle Database 初期化パラメーター、各種ファイル等多数の設定が必要です。本記事では作成した Oracle Database データベースを最小限の設定だけで RAC 構成で起動する方法について記載しています。

# 環境
　以下の環境で試します。データベースは他ノードで起動中の Oracle Real Application Clusters 環境から RMAN DUPLICATE コマンドを使ってコピーしています。このため ASM ディスクグループ上にデータファイル、制御ファイルが配置され、パスワード・ファイルも配置された状態です。

|項目|値|備考|
|:---|:---|:---|
|Oracle Database| 19c (19.14)||
|Oracle Grid Infrastructure| 19c (19.14)||
|OS|Red Hat Enterprise Linux 7.8||
|Node| rel78-1, rel78-2|2ノード|
|データベース名|O19S||

# リソース登録
　まずは Oracle Grid Infrastructure にデータベースを登録します。srvctl add database コマンドを実行します。Real Application Clusters として機能するために -dbtype RAC を指定しています。また各ノードでインスタンスが起動するように srvctl add instance コマンドも実行します。

```shell:
$ srvctl add database -db O19S -oraclehome /u01/app/oracle/product/19.0.0/dbhome_1 -dbtype RAC
$ srvctl add instance -db O19S -instance O19S1 -node rel78-1
$ srvctl add instance -db O19S -instance O19S2 -node rel78-2
```

# 初期化パラメーター
ここから初期化パラメーターをひとつずつ追加しながらインスタンスの起動テストを行います。

## control_files のみ
初期化パラメーター・ファイルと、初期化パラメーター control_files はどうしても必要なので各ノードに設定します。

```shell:
$ cd $ORACLE_HOME/dbs
$ cat initO19S1.ora
*.control_files='+DATA/O19S/CONTROLFILE/current.267.1126282771'
```

これだけの初期化パラメーター・ファイルで srvctl start database コマンドを実行します。両ノードで Oracle Grid Infrastructure のエラーが発生します。エラーの詳細は ${ORACLE_BASE}/diag/crs/{hostname}/crs/trace/crsd_oraagent_oracle.trc ファイルに記載されます。

```shell:
$ srvctl start database -db o19s
PRCR-1079 : Failed to start resource ora.o19s.db
CRS-5017: リソース・アクション"ora.o19s.db start"に次のエラーが発生しました:
ORA-01506: missing or illegal database name
。詳細は"(:CLSN00107:)"("/u01/app/grid/diag/crs/rel78-1/crs/trace/crsd_oraagent_oracle.trc")を参照してください。

CRS-5017: リソース・アクション"ora.o19s.db start"に次のエラーが発生しました:
ORA-01506: missing or illegal database name
。詳細は"(:CLSN00107:)"("/u01/app/grid/diag/crs/rel78-2/crs/trace/crsd_oraagent_oracle.trc")を参照してください。

CRS-2674: 'ora.o19s.db'('rel78-1')の起動に失敗しました
CRS-2632: 配置ポリシーを満たす場所へのリソース'ora.o19s.db'の配置を試行するサー バーはありません
CRS-2674: 'ora.o19s.db'('rel78-2')の起動に失敗しました
```
エラーの原因は初期化パラメーターdb_name の不足でした。最初の起動で $ORACLE_BASE/diag/rdbms ディレクトリ以下のファイルが生成されています。

```
2023-01-12 13:03:02.503 : USRTHRD:501098240: [     INFO] {1:30447:3343} ORA-01506: missing or illegal database name
```

## db_name を追加
初期化パラメータ db_name を追加してインスタンスを起動します。

```shell:
$ srvctl start database -db o19s
PRCR-1079 : Failed to start resource ora.o19s.db
CRS-5017: リソース・アクション"ora.o19s.db start"に次のエラーが発生しました:
ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
Linux-x86_64 Error: 2: No such file or directory
Additional information: 4475
Additional information: 822090739
Process ID: 0
Session ID: 0 Serial number: 0
。詳細は"(:CLSN00107:)"("/u01/app/grid/diag/crs/rel78-1/crs/trace/crsd_oraagent_oracle.trc")を参照してください。

CRS-2674: 'ora.o19s.db'('rel78-1')の起動に失敗しました
```
エラーは発生していますが、ノード２（rel78-2）ではインスタンスは起動しています。ノード１（rel78-1）のエラー原因は instance_number でした。

```
2023-01-18 22:58:15.996 : USRTHRD:3240548096: [     INFO] {1:10042:702} ORA-00304: requested INSTANCE_NUMBER is busy
```

## instance_number を追加
初期化パラメーター instance_number を追加します。各ノードで異なる値になるようにします。

```shell:
$ srvctl start database -db o19s
PRCR-1079 : Failed to start resource ora.o19s.db
CRS-5017: リソース・アクション"ora.o19s.db start"に次のエラーが発生しました:
ORA-01102: cannot mount database in EXCLUSIVE mode
。詳細は"(:CLSN00107:)"("/u01/app/grid/diag/crs/rel78-2/crs/trace/crsd_oraagent_oracle.trc")を参照してください。

CRS-2674: 'ora.o19s.db'('rel78-2')の起動に失敗しました
CRS-2632: 配置ポリシーを満たす場所へのリソース'ora.o19s.db'の配置を試行するサー バーはありません
```

今度はノード２（rel78-2）でインスタンスが起動しません。ORA-1102 エラーが発生しています。これはノード１で起動したインスタンスとノード２のインスタンスがストレージを共有できず、ノード２ではシングルノードでも起動できなかったことを示します。このため初期化パラメーター cluster_database を設定します。

## cluster_database を追加
初期化パラメーター cluster_database を設定したところ、２ノードで Oracle Real Application Clusters インスタンスが正常に稼働しました。このため最低限必要な初期化パラメーターは control_files, db_name, cluster_database, instance_number であることがわかりました。

```shell:
$ srvctl start database -db o19s
$ cat initO19S1.ora
*.control_files='+DATA/O19S/CONTROLFILE/current.267.1126282771'
*.db_name='O19S'
*.cluster_database=true
O19S1.instance_number=1
O19S2.instance_number=2
```

上記以外の初期化パラメーターはすべてデフォルトです。私の検証環境では以下のようになりました。

|初期化パラメーター|ノード１の値|ノード２の値|備考|
|:---|:---|:---|:---|
|control_files|+DATA/O19S/CONTROLFILE/current.267.1126282771|+DATA/O19S/CONTROLFILE/current.267.1126282771|設定|
|db_name|O19S|O19S|設定|
|instance_number|1|2|設定|
|cluster_database|true|true|設定|
|instance_name|O19S1|O19S2||
|audit_file_dest|$ORACLE_HOME/rdbms/audit|$ORACLE_HOME/rdbms/audit||
|background_dump_dest|$ORACLE_HOME/rdbms/log|$ORACLE_HOME/rdbms/log||
|core_dump_dest|$ORACLE_BASE/diag/rdbms/o19s/O19S1/cdump|$ORACLE_BASE/diag/rdbms/o19s/O19S2/cdump||
|cpu_count|4|4||
|db_cache_size|64M|64M|
|hash_area_size|131072|131072||
|sga_max_size|416M|416M||
|sga_target|0|0||
|shared_pool_size|332M|332M||
|sort_area_size|65536|65536||
|thread|0|0||
|pga_aggregate_target|10M|10M||
|user_dump_dest|$ORACLE_HOME/rdbms/log|$ORACLE_HOME/rdbms/log||

たったこれだけの設定でインスタンス起動が成功するとは思いませんでした。特に thread や instance_name の設定すら不要であることは驚きでした。

Author: Noriyoshi Shinoda / Date: January 18, 2023