Oracle RAC 18cで、構築後にIPアドレスを変えた場合の対処

## はじめに

PostgreSQLユーザの自分が初めてOracle RACを構築し、その後のIPアドレス変更で苦労したところをご紹介します。
いろいろガチャガチャやりながら解決していったので、手番が抜けてるところがあるかもしれませんが、本質的なところは押さえています。と思います。

ちなみにOSはLinux 7.6。

## RACを構築しました。しかし……

いろいろあって、Oracle RAC 18cを構築しました。
いやめんどくさいですねーRAC。○racleのことがますます嫌いになりました。
事前の準備がしっかりしてないと、どこに落とし穴があるのかわかりません。
名前解決を重視されましたが、DNSが出来上がっていなかったのでなんとかhostsファイルに書くことで乗り切りました。

しかしせっかくRACを構築し安心したのも束の間、仮のIPアドレスとサブネットでサーバを動かしていたため、実際のIPアドレスとサブネットに変えることになりました。

* 仮のIPとサブネット
  * 10.120.224.0 255.255.255.0
* 真のIPとサブネット
 * 10.1.24.0 255.255.252.0

いずれもパブリックネットワークに指定したものです。全然違いますね。ふざけんな。

## とりあえずサーバ側のIPアドレスを修正

RAC構築時にはIPアドレスを直で入力してはいない気がするし大丈夫だろうと思って、まあ普通にサーバのIPアドレスを変えました。/etc/sysconfig/network-scripts/ifcfg-*を修正してね。

## RAC動いてるじゃん！……あれ？

いつも通りにIPを修正して、networkを再起動しました。
パッと見RACが動いているように見えます。なんだ、問題ないじゃん。
しかしよく見ると、あれ？

**リスナーが起動していない**

```
grid$ lsnrctl status

LSNRCTL for Linux: Version 18.0.0.0.0 - Production on 04-2月 -2020 19:05:41

Copyright (c) 1991, 2018, Oracle.  All rights reserved.

(ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))に接続中
リスナーのステータス
------------------------
別名                      LISTENER
バージョン                TNSLSNR for Linux: Version 18.0.0.0.0 - Production
開始日                    04-2月 -2020 18:58:19
稼働時間                  0 日 0 時間 7 分 21 秒
トレース・レベル          off
セキュリティ              ON: Local OS Authentication
SNMP                      OFF
パラメータ・ファイル      /u01/app/18.0.0/grid/network/admin/listener.ora
ログ・ファイル            /u01/app/grid/diag/tnslsnr/test01/listener/alert/log.xml
リスニング・エンドポイントのサマリー...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=test01.localdomain)(PORT=1521)))
リスナーはサービスをサポートしていません。
コマンドは正常に終了しました。
```

## どこかに変更前のIPがあるはず

リスナーが起動してくれないと、リモートからアクセスできないのでただそこにDBがあるだけ。RACも意味がありません。

もしかしたら一時的なものかもしれない。という淡い期待を抱いて、とりあえず手動でnodeappsを起動してみると、やっぱり立ち上がりません。

```
grid$ srvctl start nodeapps -n test01
PRCR-1013 : リソースora.net1.networkの起動に失敗しました
PRCR-1064 : ノードtest01でリソースora.net1.networkの起動に失敗しました
CRS-5017: リソース・アクション"ora.net1.network start"に次のエラーが発生しました: 
CRS-5008: ネットワーク・インタフェースの属性値: eth0が無効です。詳細は"(:CLSN00107:)"("/u01/app/grid/diag/crs/test01/crs/trace/crsd_orarootagent_root.trc")を参照してください。

CRS-2674: 'ora.net1.network'('test01')の起動に失敗しました
PRCR-1079 : リソースora.test01.vipの起動に失敗しました
CRS-5017: リソース・アクション"ora.net1.network start"に次のエラーが発生しました: 
CRS-5008: ネットワーク・インタフェースの属性値: eth0が無効です。詳細は"(:CLSN00107:)"("/u01/app/grid/diag/crs/test01/crs/trace/crsd_orarootagent_root.trc")を参照してください。

'ora.net1.network'('test01')の起動に失敗しました
リソース・アクション"ora.net1.network start"に次のエラーが発生しました: 
ネットワーク・インタフェースの属性値: eth0が無効です。詳細は"(:CLSN00107:)"("/u01/app/grid/diag/crs/test02/crs/trace/crsd_orarootagent_root.trc")を参照してください。

CRS-2674: 'ora.net1.network'('test02')の起動に失敗しました
CRS-2632: 配置ポリシーを満たす場所へのリソース'ora.test01.vip'の配置を試行するサーバーはありません
PRCR-1013 : リソースora.onsの起動に失敗しました
PRCR-1064 : ノードtest01でリソースora.onsの起動に失敗しました
CRS-5017: リソース・アクション"ora.net1.network start"に次のエラーが発生しました: 
CRS-5008: ネットワーク・インタフェースの属性値: eth0が無効です。詳細は"(:CLSN00107:)"("/u01/app/grid/diag/crs/test01/crs/trace/crsd_orarootagent_root.trc")を参照してください。

CRS-2674: 'ora.net1.network'('test01')の起動に失敗しました
```

なんでデータベース起動しようとしただけでこんなに文句を言われなければならないのか。
それにしても、**ora.net1.network**ってなんだ？新しいワードが次々と出てくるなあ。だから○racleは嫌いなんだよ。

## こんなところにIPが！

「ora.net1.network」というワードはどうやらクラスタリソースの1つらしい(あいまい)。現状どうなっているのか見てみると……

```
grid$ crsctl status resource ora.net1.network -p
NAME=ora.net1.network
（省略）
USR_ORA_IF=eth0
USR_ORA_NETMASK=255.255.255.0
USR_ORA_SUBNET=10.120.224.0
```

IPとサブネットが残ってるぅー！！
こっちに残ってるeth0のインタフェースの設定と、実際のサーバのIPとサブネットが異なっているから起動しなかったようです。

んじゃ、これを直してあげればいいのでは！？
(なぜかrootじゃないと権限がないと怒られました。)

```
root# /u01/app/18.0.0/grid/bin/srvctl modify network -netnum 1 -subnet 10.1.24.0/255.255.252.0
```

……コマンドが終了しても特にメッセージも何もでません。成功したか失敗したかくらい言ってくれよなー。これだから○racleは。

もう一度見てみましょう。

```
grid$ crsctl status resource ora.net1.network -p
NAME=ora.net1.network
（省略）
USR_ORA_NETMASK=255.255.252.0
USR_ORA_SUBNET=10.1.24.0
```

いけてるやん！これならきっと大丈夫！

## と思ったら

もう直すとこないだろ。じゃあクラスタの状態を確認してみようかな！(一部抜粋)

```
grid$ crsctl status resource -t
ora.LISTENER.lsnr
               ONLINE  INTERMEDIATE test01                   Not All Endpoints Re
                                                             gistered,STABLE
               ONLINE  INTERMEDIATE test02                   Not All Endpoints Re
                                                             gistered,STABLE
ora.LISTENER_SCAN1.lsnr
      1        ONLINE  INTERMEDIATE test02                   Not All Endpoints Re
                                                             gistered,STABLE
ora.LISTENER_SCAN2.lsnr
      1        ONLINE  INTERMEDIATE test01                   Not All Endpoints Re
                                                             gistered,STABLE
ora.LISTENER_SCAN3.lsnr
      1        ONLINE  INTERMEDIATE test01                   Not All Endpoints Re
                                                             gistered,STABLE
```

リスナーのリソースが全部**INTERMEDIATE**になってますねえ…。マニュアルによると、そのうち直るとも書いてあるんですが、待てど暮らせど状態はこのまま。やっぱり何かおかしいんだろうなーと思って探していると……。

```
grid$ srvctl config scan
SCAN名: test-scan、ネットワーク: 1
サブネットIPv4: 10.120.224.0/255.255.255.0/, static
サブネットIPv6: 
SCAN 1 IPv4 VIP: 10.120.224.103
SCAN VIPは有効です。
SCAN VIPはノード: で個別に有効になっています
SCAN VIPはノード: で個別に無効になっています
SCAN 2 IPv4 VIP: 10.120.224.104
SCAN VIPは有効です。
SCAN VIPはノード: で個別に有効になっています
SCAN VIPはノード: で個別に無効になっています
SCAN 3 IPv4 VIP: 10.120.224.105
SCAN VIPは有効です。
SCAN VIPはノード: で個別に有効になっています
SCAN VIPはノード: で個別に無効になっています
```

まだ残ってんのかーい！
ちなみにSCANは3つ指定したため、3つとも仮のIPが残っていました。

## DNSは偉大だ

おそらくこいつらを修正すれば直る…はず。
しかしどうやって直す？さっき使った```srvctl modify```コマンドで直せそうだけど、マニュアル見てもピンポイントでSCANを直す方法がいまいちわからん…。

しかし私は思い出しました。RACのインストール時にはDNSが出来上がっておらず、hostsファイルで名前解決をしたことを。
そして今はDNSが稼働していることを。

急いでDNSにSCANのIPとホスト名を登録し、サーバのresolv.confを修正しました。

では、DNSから引っ張ってきましょう！(やっぱりrootじゃないと怒られました。)

```
root# /u01/app/18.0.0/grid/bin/srvctl modify scan -scanname test-scan
```

相変わらず成功しても何も言わないのが怖い。

しばらく待ってから、クラスタリソースの状況を確認します。(一部抜粋)

```
grid$ crsctl stat resource -t
ora.LISTENER.lsnr
               ONLINE  ONLINE       test01                   STABLE
               ONLINE  ONLINE       test02                   STABLE
ora.LISTENER_SCAN1.lsnr
      1        ONLINE  ONLINE       test01                   STABLE
ora.LISTENER_SCAN2.lsnr
      1        ONLINE  ONLINE       test02                   STABLE
ora.LISTENER_SCAN3.lsnr
      1        ONLINE  ONLINE       test02                   STABLE
```

ONLINEになってますね！お疲れさまでした！

もう二度とRACなんか構築したくねえ！