Standard Edition High Availability（SEHA）を導入してみた

みなさん、こんにちは！
以前、「SEHAとは」について紹介しましたが、今回はSEHAを実際に導入した方法について紹介していきたいと思います。

※SEHAとは、については以下弊社の技術ブログを参照いただけると幸いです。
[https://www.reqtc.com/blog/oracle-seha.html](https://www.reqtc.com/blog/oracle-seha.html)

## 事前準備
１．Grid Infrastructure 19.3のクラスタを構成　(対象ノード：１号機および２号機)
２．事前に作成したORACLE_HOMEディレクトリにOracle Database 19.3のインストールメディアを展開する　(対象ノード：１号機)
３．事前に作成した作業用ディレクトリにRU 19.22を展開する　(対象ノード：１号機)

参考文献
[Database Installation Guide for Linux-Installing Standard Edition High Availability](https://docs.oracle.com/en/database/oracle/oracle-database/19/ladbi/configuring-standard-edition-high-availability.html#GUID-B4071766-F926-469F-9F9E-AB82E62236C8)

## Oracle Databaseインストール
### インストーラーを起動
それでは、さっそくSEHAを導入していきたいと思います。
まずはじめに、runInstallerを実行します。
その際に-applyRUオプションで適用するパッチを指定し、インストールを実行します。
パッチの適用後、インストーラーが起動します。
```ruby:qiita.rb
[oracle@reqdb01 ~]$ cd $ORACLE_HOME
[oracle@reqdb01 dbhome_1]$ ./runInstaller -applyRU /work/35940989
パッチを適用するホームの準備中...
パッチ/work/35940989の適用中...
パッチが正常に適用されました。
ログの格納場所: /u01/app/oraInventory/logs/xxx/installerPatchActions_xxx.log
Oracle Database設定ウィザードを起動中...
```

### OUIでの設定項目
* 構成オプション
→「ソフトウェアのみの設定」を選択
* データベース・インストール・オプションの選択
→「単一インスタンス・データベースのインストール」を選択
 * データベース・エディションの選択
→「Standard Edition 2」を選択
その他の項目については、要件に合わせて適宜設定をします。

### ノード追加
１号機からaddnode.shを実行し、ノード２を追加します。
```ruby:qiita.rb
[oracle@reqdb01~]$export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
[oracle@reqdb01~]$$ORACLE_HOME/addnode/addnode.sh -silent CLUSTER_NEW_NODES=reqdb02

構成の準備が進行中です。

構成の準備が正常に終了しました。
.................................................. 7% 完了しました。

リモート・ノードへのファイルのコピーが進行中です。
.................................................. 12% 完了しました。
.................................................. 18% 完了しました。
..............................
リモート・ノードへのファイルのコピーが正常に終了しました。
このインストール・セッションのログは次の場所にあります:
/u01/app/oraInventory/logs/addNodeActionsYYYY-MM-DD_xxxx.log

ファイルを初期化しますが進行中です。

ファイルを初期化しますが正常に終了しました。
.................................................. 52% 完了しました。

クラスタ・インベントリを保存していますが進行中です。
.................................................. 89% 完了しました。

クラスタ・インベントリを保存していますが正常に終了しました。
/u01/app/oracle/product/19.0.0/dbhome_1のクラスタ・ノードの追加が成功しました。
詳細は'/u01/app/oraInventory/logs/silentInstallYYYY-MM-DD_xxxx.log'を確認してください。

Oracleベースの設定が進行中です。

Oracleベースの設定が正常に終了しました。
.................................................. 96% 完了しました。

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

次のノードで/u01/app/oracle/product/19.0.0/dbhome_1/root.shを実行してください:
[reqdb02]


Successfully Setup Software.
.................................................. 100% 完了しました。
[oracle@reqdb01 ~]$
```

rootユーザーでroot.shを実行します。(対象ノード：２号機)
```ruby:qiita.rb
[root@reqdb02 ~]# /u01/app/oracle/product/19.0.0/dbhome_1/root.sh
```

#### データベースの作成
DBCAを実行し、データベースを作成します。
DBCAでの設定値については要件に合わせて設定してください。
```ruby:qiita.rb
[oracle@ reqdb01 ~]$ /u01/app/oracle/product/19.0.0/dbhome_1/bin/dbca
```

### LOCAL_LISTENERパラメータの調整
DBCAでDB作成時、local_listener初期化パラメータが静的に登録されています。
この設定をリセットしてGIによって動的に登録されるように変更する必要があります。
１号機にて、SQL*Plusに接続し、以下を実行します。
```ruby:qiita.rb
SQL> show parameter listener

NAME　　　　　　　　　　　　　　　　 TYPE　　 VALUE
------------------------------------ ----------- ------------------------------
forward_listener　　　　　　　　 string
listener_networks　　　　　　　　 string
local_listener　　　　　　　　　 string　　　　 LISTENER_<DB名>　←★不要な設定
remote_listener 　　　　　　　　 string　　　　reqdb-cluster-scan:1521
SQL>
SQL> alter system reset local_listener scope = both;

System altered.

SQL>
SQL> show parameter listener

NAME　　　　　　　　　　　　　　　　 TYPE　　 VALUE
------------------------------------ ----------- ------------------------------
forward_listener　　　　　　　　 string
listener_networks　　　　　　　　 string
local_listener　　　　　　　　　 string　　　　　　　　　　　　　　　　　←★設定がリセットされる
remote_listener 　　　　　　　　 string reqdb-cluster-scan:1521
```
その後、DBを再起動しlocal_listenerが自動登録されていることを確認します。
```ruby:qiita.rb
[oracle@reqdb01 ~]$ srvctl stop database -db <DB名>
[oracle@reqdb01 ~]$ srvctl start database -db <DB名>
[oracle@reqdb01 ~]$
[oracle@reqdb01 ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Tue Aug 6 12:00:18 2024
Version 19.22.0.0.0

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


Connected to:
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.22.0.0.0

SQL>
SQL> show parameter listener

NAME　　　　　　　　　　　　TYPE　　　　VALUE
--------------------------- ----------- ------------------------------
forward_listener 　　　　　string
listener_networks 　　　　string
local_listener　　　　　　string　　　(ADDRESS=(PROTOCOL=TCP)(HOST=
　　　　　　　　　　　　　　　　　　　　10.0.xx.xx)(PORT=1521)) ←★GI Agentによって自動登録される
remote_listener 　　　　　string　　　　reqdb-cluster-scan:1521
SQL> exit
```

### 稼働ノード追加
稼働ノードとして２号機をDBに登録します。
```ruby:qiita.rb
[oracle@reqdb01 ~]$ srvctl config database -db <DB名>
（略）
構成されたノード: reqdb01　←★この時点ではノード１のみ
（略）
[oracle@reqdb01 ~]$
[oracle@reqdb01 ~]$ srvctl modify database -db <DB名> -node reqdb01,reqdb02
[oracle@reqdb01 ~]$
[oracle@reqdb01 ~]$ srvctl config database -db <DB名>
（略）
構成されたノード: reqdb01,reqdb02　←★ノード２が追加されていること
（略）
```

### その他、２号機で必要となるファイル・ディレクトリの作成
１．２号機にて、下記ディレクトリを作成する。
　・/u01/app/oracle/admin/<DB名>/adump
　・/u01/app/oracle/admin/<DB名>/dpdump
　・/u01/app/oracle/admin/<DB名>/pfile
　・/u01/app/oracle/admin/<DB名>/scripts
　・/u01/app/oracle/admin/<DB名>/xdb_wallet

例)
```ruby:qiita.rb
mkdir -p /u01/app/oracle/admin/<DB名>/adump
```

２．１号機から２号機へwalletをコピーする
```ruby:qiita.rb
$ scp /u01/app/oracle/admin/<DB名>/xdb_wallet/* oracle@ reqdb02:/u01/app/oracle/admin/<DB名>/xdb_wallet/.
```

３．１号機から２号機へパスワード・ファイルをコピーする
```ruby:qiita.rb
$ scp /u01/app/oracle/product/19.0.0/dbhome_1/dbs/orapw<DB名> oracle@ reqdb02:/u01/app/oracle/product/19.0.0/dbhome_1/dbs/.
```

#### 動作確認
現在１号機で稼働していることを確認します。
```ruby:qiita.rb
--------------------------------------------------------------------------------
Name　　　　　　Target　State　　　　Server　　　　　　　　　　　　State details
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.<DB名>.db
　　　1　　　　ONLINE　ONLINE　　　　reqdb01　　　　　　　　　　　Open,HOME=/u01/app/o
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　racle/product/19.0.0
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　/dbhome_1,S
```

続いて、DB起動の際にノード2を指定し、２号機で起動します。
```ruby:qiita.rb
[oracle@reqdb01 ~]$ srvctl stop database -db <DB名>
[oracle@reqdb01 ~]$
[oracle@reqdb01 ~]$ srvctl start database -db <DB名> -node reqdb02
[oracle@reqdb01 ~]$
[oracle@reqdb01 ~]$ /u01/app/19.0.0/grid/bin/crsctl stat res -w "TYPE = ora.database.type" -t

--------------------------------------------------------------------------------
Name　　　　　Target　State　　　　　Server　　　　　　　　　State details
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.<DB名>.db
　　　1　　　ONLINE　ONLINE　　　　　reqdb02　　　　　　　　　Open,HOME=/u01/app/o
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　racle/product/19.0.0
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　/dbhome_1,STABL
```
2号機で問題なく稼働していることを確認できましたら、SEHAの導入としては以上となります。
その他の設定については、要件に合わせて設定をしてください。