Oracleデータベース 初期化パラメータ設定に失敗したので復元してみた

忘れないようにメモ。


## 起きたこと
`sqlplus`から初期化パラメータを間違って設定したのに気づかず、勢いで`shutdown` をしたら二度と起動しなくなった。
初期化パラメータを直してくれないと起動しないよ！と言われてるみたいだったので、なんとかした
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610268/5e928194-19d2-e511-002c-70e99b911072.png)

## 環境
* Oracle Cloud
* Oracle Linux 7.8
 * ホスト名：odgb
* Oracle Database 19c (DBCS)
 * ユニーク名：odgb_nrt1ws
 * CDB：odgb


## 用語のメモ
* pfile...初期化パラメータファイル。テキストエディタで編集が可能。事故ったときにspfileから変換して作成する。現在のデータベースで、直接使うことは少なくなったらしいが、pfileを直指定して起動もできる。
* spfile...サーバーパラメータファイル。「alter」文で編集が可能。データベース起動時に毎回このファイルを読み込む。テキストエディタで直接修正することはできない。

## やったこと
* データベースのユニーク名確認
* 
```/bin/bash
$ sudo su - oracle
$ ls /u01/app/oracle/diag/rdbms/
odgb_nrt1ws
```

* spfileを確認
* 
```/bin/bash
$ sudo su - grid
$ asmcmd ls -l +DATA/odgb_nrt1ws/PARAMETERFILE/
Type           Redund  Striped  Time             Sys  Name
PARAMETERFILE  UNPROT  COARSE   OCT 03 16:00:00  Y    spfile.286.1048251613
```

* spfileを手元にコピー
* 
```/bin/bash
$ sudo su - grid
$ asmcmd cp +DATA/ODGB_NRT1WS/PARAMETERFILE/spfile.286.1048251613 /tmp
copying +DATA/ODGB_NRT1WS/PARAMETERFILE/spfile.286.1048251613 -> /tmp/spfile.286.1048251613
```

* pfile作成
* 
```/bin/bash
$ sudo su - oracle
$ sqlplus / as sydba
sql> create pfile='/tmp/tmp.pfile' from spfile='/tmp/spfile.286.1048251613';
File created.
　
sql> exit
$ ls -l /tmp
-rw-r--r-- 1 oracle asmadmin 3705 Oct  3 16:35 tmp.pfile
```

* pfile編集
初期化パラメータ設定の時に間違えて設定したものを`vim`で編集していく
編集するときは以下のサイトの「記載内容の優先度」の内容に注意する
「*.」が付いていないものはいったん削除した。
https://techlab.sixsquare.co.jp/archives/158

　今回失敗した「sga_max_size」の値もしっかりと修正
「sga_target」も変わってたので、とりあえず修正

```/bin/bash
$ vim /tmp/tmp.pfile
~
*.sga_max_size=20401094656
*.sga_target=14495514624
~
⬇︎
~
*.sga_max_size=6G
*.sga_target=3G
~
```

* 作った「pfile」でデータベース作成  
修正値を間違えた。エラー内容と同じように修正  
  
```/bin/bash
$ sudo su - oracle
$ sqlplus / as sysdba
sql> startup mount pfile='/tmp/tmp.pfile';
ORA-00821: Specified value of sga_target 3072M is too small, needs to be at least 4656M
ORA-01078: システム・パラメータの処理に失敗しました
```
修正後、今度はちゃんと起動。。

```
SQL> startup mount pfile='/tmp/tmp.pfile';
ORACLEインスタンスが起動しました。

Total System Global Area 6442449872 bytes
Fixed Size                  9149392 bytes
Variable Size            4848615424 bytes
Database Buffers         1560281088 bytes
Redo Buffers               24403968 bytes
データベースがマウントされました。
SQL> 
```

* 作り直した「pfile」から「spfile」を作成  
作ったら一旦データベースを停止させる

```
sql> create spfile='+DATA' from pfile='/tmp/tmp.pfile';

ファイルが作成されました。
sql> shutdown  

データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
```

* 新しい「spfile」を確認する  
１つ増えてるのがわかる

```/bin/bash
$ sudo su - grid
$ asmcmd ls -l +DATA/ODGB_NRT1WS/PARAMETERFILE/
Type           Redund  Striped  Time             Sys  Name
PARAMETERFILE  UNPROT  COARSE   OCT 03 17:00:00  Y    spfile.285.1052845549
PARAMETERFILE  UNPROT  COARSE   OCT 03 16:00:00  Y    spfile.286.1048251613
```

* 新しい「spfile」でデータベースを起動

```/bin/bash
$ sudo su - oracle
$ srvctl modify database -db odgb_nrt1ws -spfile +DATA/odgb_nrt1ws/PARAMETERFILE/spfile.285.1052845549
$ srvctl start database -db odgb_nrt1ws
$ srvctl status database -db odgb_nrt1ws
 Instance odgb is running on node odgb
$ sqlplus / as sysdba

racle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.7.0.0.0
に接続されました。
```

## なんとか復旧。。。
正常に動くようになった。  
初期化パラメータをいじるときは間違えるとやばいと気付かされたので、気をつけます。。。