0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

BaseDBのメモリ領域を変更したい

Last updated at Posted at 2025-01-24

Oracle Databaseのデフォルトで決定されている
メモリのSGA/PGA領域のサイズを変更します。

デフォルト値の確認

Autonomous Database (ADB)とBase Database (BaseDB)の比較をするための準備として、
それぞれのメモリ領域を一致させることが必要になりました。
変更後の値はそれぞれのDBで設定されている値を確認して決定します。

作成直後のBaseDBとADBのSGA/PGAの領域を確認します。

BaseDBのデフォルト値

SQL> SHOW PARAMETER pga_aggregate_target;
SQL> SHOW PARAMETER sga_target;
SQL> SHOW PARAMETER sga_max_size;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target                 big integer 3712M
sga_target                           big integer 14848M
sga_max_size                         big integer 14848M

ADBのデフォルト値

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target                 big integer 6000M
sga_target                           big integer 16000M
sga_max_size                         big integer 595200M

今回はBaseDBのSGA/PGAをADBのSGA/PGAに変更して、
それぞれのSGA/PGAを一致させます。

BaseDBのメモリサイズを変更する

spfileかpfileを書き換えれば、変更できるはず・・と思い
こんな流れで変更しようと思いました。

spfile or pfileを書き換える → DB再起動

イメージは想像できたものの、実際に実行するコマンドとかはあまり浮かばなかったので
実行したコマンドをメモに残します。

spfile or pfile

そもそもspfileとpfileが何なのかを、これを機に復習しておきます。
どちらもパラメータファイルで、インスタンスやDBの構成情報が書かれているものです。
パラメータファイルは、停止状態→nomountへ移行するタイミングで読み込まれます。

spfile
・バイナリ形式のため、altersystem文での変更
・scopeを指定することによって、変更の適用範囲を設定する
  memory = 起動中のインスタンスにのみ適用、再起動後は以前の値が使用
  spfile   = spfileに変更を書き込み、次回再起動時に適用
  both    = [デフォルト]起動中インスタンスに適用、次回再起動時も有効

pfile
・テキスト形式のため、エディタで変更可能
・エディタで変更した内容を反映させるためには、再起動が必要
・altersystem文での変更も可能だが、一時的な変更で停止すると失われる

いま使用しているファイルがどちらなのかを判断します。

SQL> SHOW PARAMETER spfile;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      +DATA/xx_236_IAD/PARAMETE
                                                 RFILE/spfile.xx.xx

spfileパラメータが設定されているので、spfileを使用していることがわかりました。
この使っているspfileパラメータを変更すれば、すぐにメモリサイズが変更できそうです

spfileの変更

BaseDBのsga_target 14848MをADBの16000Mに変更します。

SQL> alter system set sga_target = 16000M SCOPE=BOTH;
alter system set sga_target = 16000M SCOPE=BOTH
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-00823: Specified value of sga_target greater than sga_max_size
Help: https://docs.oracle.com/error-help/db/ora-02097/

設定したい16000Msga_max_sizeを超えているから設定できない
というエラーが発生しました。

SQL> SHOW PARAMETER sga_max_size

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_max_size                         big integer 14848M

たしかに16000Msga_max_size超えちゃっているので、sga_max_sizeから変更します。

pfileの作成

spfileはエディタで編集できないので、
編集できるpfileを作成してpfileから設定を変更することを試みます。
SQLを実行してpfileを作成します。

SQL> CREATE PFILE FROM SPFILE;

作成されていることを確認できました。(コマンド内★のファイル)

[oracle@test dbs]$ ls -l
total 24
-rw-rw---- 1 oracle asmdba   1544 Jan 23 05:00 hc_test.dat
-rw-r--r-- 1 oracle asmdba   2279 Jan 23 06:20 inittest.ora★
-rw-r----- 1 oracle oinstall 3079 May 14  2015 init.ora
-rw-r----- 1 oracle asmdba     24 Jan 23 04:52 lkTEST
-rw-r----- 1 oracle asmdba     24 Jan 23 04:52 lkTEST_236_IAD
-rw-r----- 1 oracle oinstall 2048 Jan 23 04:53 orapwtest

エディタを使用して必要箇所を変更して、DBを再起動します。

SQL> STARTUP PFILE='$ORACLE_HOME/dbs/inittest.ora';
ORA-27106: system pages not available to allocate memory
Additional information: 6506
Additional information: 1

エラーになりDBを実行できませんでした。
エラーの対処方法がわからなかったのでchatGPTに聞いてみると、
以下のように教えてくれました。

ORA-27106: system pages not available to allocate memory エラーは、データベースがシステムメモリの割り当てを要求した際に、OSが要求を満たせない場合に発生します。
HugePagesが設定されていない、または不足している
OracleはSGAにHugePagesを利用することを推奨していますが、設定が不十分だとこのエラーが発生します。

他にも
ORA-00093: Parameter pga_aggregate_limit outside valid range 12000M to 100000G.
が発生しました。
*.pga_aggregate_limit=12000m
のように変更して対応しました。

HugePageの設定

そもそもHugePageが何かを簡単に確認しておきます。

HugePage
メモリを小さく分割した2MB程度の仮想メモリ(ページ)ではなく、
拡張された大規模なページ(=HugePage)を使用できる機能

実際に使われる時メモリはページという2MB程度の大きさに分割され、
それぞれのプロセスはページをつなぎ合わせてメモリ空間を確保しています。
プロセスが使用しているページはアドレス変換テーブルに書かれるものの、
メモリ確保や解放のたびにいちいち書き直す必要があります。
HugePageは使用できる分割されたメモリである1ページが大きく、
アドレス変換テーブルを使用しないため、キャッシュの性能に大きく影響します。
[参考] リソース設定(メモリ) NTTテクノクロス

上記HugePageの説明とエラーメッセージを見比べると、おそらく
SGAにはHugePageが必要で、現在確保しているHugePageの領域以上の値をsga_max_sizeに設定してしまっていることでエラーになっているのでは?と理解することができました。

現在の設定を確認します。

[oracle@test dbs]$ grep Huge /proc/meminfo
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
FileHugePages:         0 kB
HugePages_Total:    7796
HugePages_Free:     7796
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:        15966208 kB

HugePages_Totalが Oracleが使用するSGAサイズに対応している必要があります。たとえば、SGA_MAX_SIZEが8GBの場合、HugePages_Totalは 8GB ÷ 2MB(1ページサイズ) = 4096ページ 必要です。

現在のHugePages_Totalから逆算すると、設定できるSGA_MAX_SIZEの最大値は15.22GB
ということがわかります。
今回は16GBに設定したいので、8192ページ必要になります。

ここからはroot権限で実行していきます。
/etc/sysctl.confを編集して、HugePageを設定します。
vm.nr_hugepagesを先ほど計算した8192に変更します。
(★の部分)

fs.file-max = 6815744
kernel.sem = 250 32000 100 128
kernel.shmmni = 4096
kernel.shmall = 1073741824
kernel.shmmax = 4398046511104
kernel.panic_on_oops = 1
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.default.rp_filter = 2
fs.aio-max-nr = 1048576
net.ipv4.ip_local_port_range = 9000 65535
kernel.panic = 10
fs.suid_dumpable = 1
kernel.core_pattern = core.%e.%p
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_filter = 1
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728
net.core.netdev_max_backlog = 300000
net.ipv4.tcp_moderate_rcvbuf = 1
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
fs.aio-max-nr = 3145728
vm.min_free_kbytes = 524288
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
kernel.pid_max = 99999
kernel.unknown_nmi_panic = 1
vm.nr_hugepages = 8192★

変更を反映させて、実行前にサーバの総メモリサイズを確認しておきます。

[root@test etc]# sysctl -p
fs.file-max = 6815744
(略)
vm.nr_hugepages = 8192

[root@test etc]# grep Huge /proc/meminfo
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
FileHugePages:         0 kB
HugePages_Total:    8192★
HugePages_Free:     8192
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:        16777216 kB

[root@test etc]# free -h
              total        used        free      shared  buff/cache   available
Mem:           31Gi        19Gi       1.8Gi       1.3Gi       9.5Gi       8.0Gi
Swap:           9Gi       2.0Mi         9Gi

HugePageの設定変更を確認できました。
メモリサイズも問題なさそうです!

DB起動

HugePageを変更によって先ほどのエラーは解消されて、DBを起動できるはずです。
作成したpfileを指定して起動させます。

SQL> startup pfile='$ORACLE_HOME/dbs/inittest.ora';
ORACLE instance started.

Total System Global Area 1.6753E+10 bytes
Fixed Size                  5441368 bytes
Variable Size            2181038080 bytes
Database Buffers         1.4428E+10 bytes
Redo Buffers              138514432 bytes
Database mounted.
Database opened.

作成したpfileを使って、起動できました。
変更した値が正しく反映されているのか確認します。

SQL> SHOW PARAMETER pga_aggregate_target;
SQL> SHOW PARAMETER sga_target;
SQL> SHOW PARAMETER sga_max_size;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target                 big integer 6000M
sga_target                           big integer 16000M
sga_max_size                         big integer 16000M

設定した通りの値になりました!!
sga_max_sizeはHugePageで指定した値になっていることも確認できます。

まとめ

エラーによってウロウロしてしまいましたが、
メモリサイズを変更するために実施した内容は以下です。

・spfileからpfile作成
・pfile変更
・HugePage設定変更

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?