【DB設計・実装】Oracleアーキテクチャ

## 背景
Oracleアーキテクチャを理解するには、実機を触らないとイメージがつかないことに気づき、
Oracle19cをVirtualBoxに構築し、インスタンスを作ったり壊したりなどできる環境で知識を深めていくのが目的となります。

## 実施内容

### Oracleインスタンス構築
※Oracle構築についてはudemyの
Oracle DBA 11g/12c - DatabaseAdministration for Junior DBA
https://www.udemy.com/course/oracledbatraining/
という講座が参考になります。12cではありますが、やり方は19cでも変わりはありません。
* 主なフローとしては、下記となります。
    * 前提条件の確認
    * OSユーザ、グループ、環境変数の作成
    * Oracleソフトウェアのインストール
    * Oracleデータベースのインストール
* インストール方法

https://qiita.com/t_kyn/private/74c9bfec5364b4e86e6c


### Oracleのアーキテクチャ
* Oracleアーキテクチャはざっくりまとめると下記の通りとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551020/febcf859-2324-c893-dd7f-7fce1f2d7a73.png)

ポイントとしては、下記の通りです。
* orcleインスタンスは、SGAとバックグラウンドプロセスがある。
* データファイルはdbf、ctl、redo、archがある。
    * dbfファイル：データベースファイル
        （データベースの実ファイル）
    * ctlファイル：制御ファイル
        （データベースの構成・管理情報を格納しているファイル）
    * redoログ：REDOログファイル
        （ロールフォワード、トランザクションコミット時の書き込みで使う）
    * archログ：アーカイブログファイル
    　　（メディアリカバリ時に使用。）
* クライアント（スマイルくん）からの要求をリスナーで受け付ける。
* リスナーがPGA内のサーバプロセスを生成する。
* データ参照時、SGAのDBbcを参照する。
    * 初回のデータ参照時、DBbcを参照しても対象のブロックがないので、
    なければデータファイルのdbfファイルから、データブロックを参照する。
    DBbcに格納し、参照する。
    * 2回目以降は、DBbcを参照する。
* データ更新時、SGAのDBbcとRedobcを使用する。
    * メモリ上のブロック更新（DBbcとRedobc）する。
    * コミット（トランザクション確定）時、Redobcから、redoログに書き込みする。
    と同時にdbfファイルも更新する。

* ちなみに構築しているのはこんな感じです。
デフォルトインストールしたorclインスタンスと、SGAとPGAを最小サイズ構成としているtestunkoインスタンスの2種類を作成しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551020/172b1de3-3672-78d5-6139-0211fbfd3a57.png)


### Oracleのパラメータ値
* show parameter
で全パラメータを表示します。
* show parameter <キーワード>
絞り込み検索（例えばSGAコンポーネントのメモリに絞るなど）の場合は、下記で検索します。
```
SQL> show parameter sga_max_size

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_max_size                         big integer 736M
```


### Oracleのインスタンスの起動およびバックグラウンドプロセス
Oracleインスタンス起動は、下記の通りに行われます。
* 初期化パラメータファイルの読み込み
SPFILEとPFILEがあります。
私が作成したインスタンスの初期化パラメータの現状を整理すると、下記です。
```
SQL> show parameter sga_target

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_target                           big integer 652M
SQL> show parameter sga_max_size

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_max_size                         big integer 700M
SQL> show parameter pga_aggregate_target

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target                 big integer 45M
SQL> show parameter pga_aggregate_limit

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_limit                  big integer 2G
SQL> show parameter memory_max_target

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
memory_max_target                    big integer 736M
SQL> show parameter memory_target

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
memory_target                        big integer 736M
SQL>
```
* SGAの割り当て
初期化パラメータの結果から割り出しします。
```
[2022-09-17 01:26:14.686] [oracle@oltkyn ~]$ ./startup_t_kyn_oracle19c.sh 
[2022-09-17 01:27:44.875] orcl
[2022-09-17 01:27:44.883] 
[2022-09-17 01:27:44.883] SQL*Plus: Release 19.0.0.0.0 - Production on 土 9月 17 01:27:44 2022
[2022-09-17 01:27:44.883] Version 19.3.0.0.0
[2022-09-17 01:27:44.883] 
[2022-09-17 01:27:44.883] Copyright (c) 1982, 2019, Oracle.  All rights reserved.
[2022-09-17 01:27:44.883] 
[2022-09-17 01:27:46.006] アイドル・インスタンスに接続しました。
[2022-09-17 01:27:46.006] 
[2022-09-17 01:27:46.006] SQL> ORACLEインスタンスが起動しました。
[2022-09-17 01:27:49.676] 
[2022-09-17 01:27:49.676] Total System Global Area  733999368 bytes
[2022-09-17 01:27:49.676] Fixed Size		    8900872 bytes
[2022-09-17 01:27:49.676] Variable Size		  343932928 bytes
[2022-09-17 01:27:49.676] Database Buffers	  373293056 bytes
[2022-09-17 01:27:49.676] Redo Buffers		    7872512 bytes
[2022-09-17 01:27:54.798] データベースがマウントされました。
[2022-09-17 01:28:06.152] データベースがオープンされました。
[2022-09-17 01:28:06.152] SQL> Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
[2022-09-17 01:28:06.160] Version 19.3.0.0.0との接続が切断されました。
[2022-09-17 01:28:06.658] [oracle@oltkyn ~]$ 
```
→「Total System Global Area  733999368 bytes」とありますので、
大体700MBで展開されています。
sga_max_sizeが利いているのでしょうか。



* バックグラウンドプロセスの起動
プロセスは「ps -ef | grep ora_」で表示されます。
起動プロセスの具体的な確認は下記の通り。
[補足記事（インスタンス起動時のプロセス状態確認）](https://qiita.com/t_kyn/private/e277dd45a49aa72388f8)

* 制御ファイルの読み込み

制御ファイルは初期化パラメータのCONTROL_FILESに設定しています。
```
SQL> show parameter control_files

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_files                        string      /u01/app/oracle/oradata/ORCL/c
                                                 ontrol01.ctl, /u01/app/oracle/
                                                 fast_recovery_area/ORCL/contro
                                                 l02.ctl
----
```
* REDOログファイルの読み込み
* データファイルの整合性の確認
* リカバリセッションの開始



```






```

### アーカイブログモードへの切り替え
デフォルトでインストールすると、アーカイブモードが無効になっているので、
ノーアーカイブモードに変更する。
```
[oracle@oltkyn oradata]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on 金 9月 23 16:37:56 2022
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> archive log list
データベース・ログ・モード     非アーカイブ・モード
自動アーカイブ                 使用禁止
アーカイブ先                    USE_DB_RECOVERY_FILE_DEST
最も古いオンライン・ログ順序   5
現行のログ順序               7
SQL> shutdown immediate
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
SQL> startup mount
ORACLEインスタンスが起動しました。

Total System Global Area  713028296 bytes
Fixed Size                  9138888 bytes
Variable Size             616562688 bytes
Database Buffers           79691776 bytes
Redo Buffers                7634944 bytes
データベースがマウントされました。
SQL>
SQL> alter database archivelog;

データベースが変更されました。

SQL> alter database open;

データベースが変更されました。

SQL> archive log list
データベース・ログ・モード     アーカイブ・モード
自動アーカイブ                 有効
アーカイブ先                    USE_DB_RECOVERY_FILE_DEST
最も古いオンライン・ログ順序   5
アーカイブする次のログ順序    7
現行のログ順序               7
SQL>
SQL> show parameter DB_RECOVERY_FILE_DEST

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest                string      /u01/app/oracle/fast_recovery_
                                                 area
db_recovery_file_dest_size           big integer 16G
SQL>
```

----



## ちょっとおまけ・・・問題点がああったので、備忘。
### インスタンス起動でメインのインスタンスを起動。
問題なさそうです。
```
[oracle@oltkyn ~]$ ls -lrt /home/oracle/.oraen*
-rw-r--r--. 1 oracle oinstall 421 Sep  3 08:34 /home/oracle/.oraenv_orclunko
-rw-r--r--. 1 oracle oinstall 422 Sep  3 21:13 /home/oracle/.oraenv_dust1
-rw-r--r--. 1 oracle oinstall 417 Sep 17 00:54 /home/oracle/.oraenv_orcl
[oracle@oltkyn ~]$
[oracle@oltkyn ~]$ cat startup_t_kyn_oracle19c.sh
#!/bin/bash
echo $ORACLE_SID
sqlplus / as sysdba <<EOF
startup
exit
EOF
[oracle@oltkyn ~]$ ./startup_t_kyn_oracle19c.sh
orcl

SQL*Plus: Release 19.0.0.0.0 - Production on 土 9月 17 01:02:28 2022
Version 19.3.0.0.0

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

アイドル・インスタンスに接続しました。

SQL> ORACLEインスタンスが起動しました。

Total System Global Area  733999368 bytes
Fixed Size                  8900872 bytes
Variable Size             343932928 bytes
Database Buffers          373293056 bytes
Redo Buffers                7872512 bytes
データベースがマウントされました。
データベースがオープンされました。
SQL> Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0との接続が切断されました。
[oracle@oltkyn ~]$
[oracle@oltkyn ~]$ cat unkostartup_t_kyn_oracle19c.sh
#!/bin/bash
. /home/oracle/.oraenv_orclunko
echo $ORACLE_SID
sqlplus / as sysdba <<EOF
startup
exit
EOF
```

### 2つ目のインスタンス起動がうまくいかない。。。
```
[oracle@oltkyn ~]$
[oracle@oltkyn ~]$ ./unkostartup_t_kyn_oracle19c.sh
orclunko

SQL*Plus: Release 19.0.0.0.0 - Production on 土 9月 17 01:05:01 2022
Version 19.3.0.0.0

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

アイドル・インスタンスに接続しました。

SQL> ORA-09925: Unable to create audit trail file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 9925
SQL> 切断しました。
[oracle@oltkyn ~]$
[oracle@oltkyn ~]$ ./dust1startup_t_kyn_oracle19c.sh
orcldust1

SQL*Plus: Release 19.0.0.0.0 - Production on 土 9月 17 01:08:27 2022
Version 19.3.0.0.0

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

アイドル・インスタンスに接続しました。

SQL> ORA-01078: failure in processing system parameters
LRM-00109: ??????????????????????????????'/u01/app/oracle/product/19.0.0/dbhome_1/dbs/initorcldust1.ora'?????????????????????????????????
SQL> 切断しました。
[oracle@oltkyn ~]$
```

oracleユーザで、dbcaコマンドを実行すると、
データベースの設定で既存のデータベースを見ることができます。
見ると、orclunkoはありますね。。orcldust1はそもそも存在しない。
なので、orclunkoを調査します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551020/83562230-bd37-f12d-40e9-6d3d5320e12a.png)

orclunkoを調査しますと、ORA-09925: Unable to create audit trail file
とあります。。
https://qiita.com/KKZ@github/items/f87f0164b27339ba3a9f

### インスタンス停止
```
[oracle@oltkyn ~]$ cat stop_t_kyn_oracle19c.sh
#!/bin/bash
echo $ORACLE_SID
sqlplus / as sysdba <<EOF
shutdown normal
exit
EOF

[oracle@oltkyn ~]$
```
## ちょっとおまけシリーズ②
sga_max_sizeの値をあえて690MBに下げてみます。★
```
SQL> alter system set sga_max_size=690M scope=spfile;

システムが変更されました。

SQL> show parameter sga_max_size

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_max_size                         big integer 700M
SQL> shutdown immediate
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
SQL> startup
ORACLEインスタンスが起動しました。

Total System Global Area  725610664 bytes
Fixed Size                  8900776 bytes
Variable Size             352321536 bytes
Database Buffers          356515840 bytes
Redo Buffers                7872512 bytes
データベースがマウントされました。
データベースがオープンされました。
SQL> show parameter sga_max_size

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_max_size                         big integer 692M
SQL>
```

さらにsga_max_sizeを600MBまで下げてみます。
```
SQL> alter system set sga_max_size=600M scope=spfile;

システムが変更されました。

SQL> shutdown immediate
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
SQL> startup
ORA-00823: Specified value of sga_target greater than sga_max_size
ORA-01078: システム・パラメータの処理に失敗しました
SQL>
```

# 壊してしまいました…
原因はsga_max_sizeの値がsga_targetの方が大きいためとあります。
パラメータの記載を誤ってしまったようです。
不正データベースを壊してしまった場合、サーバパラメータ復旧させないとです。
しかし、PFILEをエディタで編集して正しい値を設定した後、PFILEを指定して起動してもパラメータがサポートできないというORAエラーが出てしまいました。。
時間かかりそうなので、1からデータベース再構築しました。。