トップ > DBA上級 RAC > 9章
9章 RACデータベースの管理
本章ではRACデータベースの管理について確認していきます。

RACデータベースはシングルDBと比較してどのような操作の違いがあるのでしょうか。
表領域の作成やテーブル作成はシングルDBと違うのか?
パラメータ変更は変わるかなどDB管理に必要な操作を学んでいきます。


RACのDB管理の概要


RACの特徴としては複数インスタンスに対してデータベースは1つとなります。

その為、データベースに影響がある操作は1つのノードで実施しても
全インスタンスに影響があります。またインスタンスは別々ですので、
インスタンスに影響がある操作は片方で実施しても影響は片方のみとなります。

インスタンス全体に影響がある操作
・表領域の作成、追加、変更
・テーブルの作成、削除、変更
・レコードの挿入、削除、更新

インスタンスのみに影響がある操作
・インスタンス停止
・初期化パラメータの変更

各ノードにDBインスタンスが存在するのでSQL*PlusでDBインスタンスを停止する場合は、
各ノードでshutdownコマンドを実施する必要があります。

RACインスタンスの停止

たくさんのノードが存在するような環境ですべてのインスタンスを停止する場合、
SQL*Plusでは時間がかかる為、srvctlコマンドを使用します。

RACインスタンスの停止

その他の操作も色々ありますが、操作していると段々と理解できるようになるかと思います。
今回はRAC特有の操作について確認していきたいと思います。


RACインスタンスの接続


RACのインスタンスはそれぞれのノードで起動しています。

RACデータベースの接続

ノード1でORCL01のインスタンスに接続するにはどうすればよいのでしょうか。
一番簡単な方法はノード1上でORACLE_SIDをorcl01に設定し接続します。

ノード2に存在するorcl02インスタンスも同様ノード2に接続し、
ORACLE_SIDをorcl02に設定し接続します。

   $ export ORACLE_SID=orcl01
   $ echo $ORACLE_SID
   $ sqlplus / as sysdba

   SQL*Plus: Release 12.2.0.1.0 Production on XX XX XX XX:XX:XX 2018

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


   Connected to:
   Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

   SQL> select instance_name from v$instance;

   INSTANCE_NAME
   ----------------
   orcl01

   SQL> show con_name

   CON_NAME
   ------------------------------
   CDB$ROOT
  

今回はプラガブルデータベースなのでCDBに接続しています。

その他の方法はシングルデータベースと同様、簡易接続、
ネットサービス接続などがあります。
簡易接続は以下の方法で接続します。

    $ sqlplus system/manager@scan.oracle12c.jp:1521/orcl

orclはサービス名です。サービス名は初期化パラメータ「service_names」で確認できますが、
デフォルトではデータベース名と同じ名前が1つ存在します。サービスは追加で作成することも
可能ですが、それは次章でご紹介します。

また「scan.oracle12c.jp」はDNSもしくはhostsファイルに記載のあるSCANのVIPアドレスです。

通常はSCANは複数IPアドレスを定義しているので、
そのIPがSCAN VIPとして各ノードで自動的に起動します。

今回の環境はhostsに記載しています。

  $ cat /etc/hosts
  192.168.56.101 rac01.oracle12c.jp rac01
  192.168.56.102 rac02.oracle12c.jp rac02
  192.168.56.111 rac01-vip.oracle12c.jp rac01-vip
  192.168.56.112 rac02-vip.oracle12c.jp rac02-vip
  192.168.56.201 scan.oracle12c.jp scan
  192.168.56.202 scan.oracle12c.jp scan
  192.168.56.203 scan.oracle12c.jp scan

scan.oracle12c.jpは192.168.56.201と192.168.56.202と
192.168.56.203の3つのVIPを定義しています。

このSCAN VIPがどちらで起動しているかはcrsctlコマンドで確認できます。

   $ crsctl stat res -t -w "TYPE = ora.scan_vip.type"
   -------------------------------------------------------------------
   Name           Target  State        Server      State details
   -------------------------------------------------------------------
   Cluster Resources
   -------------------------------------------------------------------
   ora.scan1.vip
         1        ONLINE  ONLINE       rac02       STABLE
   ora.scan2.vip
         1        ONLINE  ONLINE       rac01       STABLE
   ora.scan3.vip
         1        ONLINE  ONLINE       rac01       STABLE
   -------------------------------------------------------------------

上記から、scan1はノード2(rac02)でscan2,3はノード1(rac01)で起動しています。
どのIPアドレスかはOSコマンドのipコマンドで確認できます。v

   $ ip addr show
   1: lo:  mtu 65536 qdisc noqueue state UNKNOWN
       link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
       inet 127.0.0.1/8 scope host lo
       inet6 ::1/128 scope host
          valid_lft forever preferred_lft forever
   2: eth0:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
       link/ether 08:00:27:9b:44:c0 brd ff:ff:ff:ff:ff:ff
       inet 192.168.56.101/24 brd 192.168.56.255 scope global eth0
       inet 192.168.56.111/24 brd 192.168.56.255 scope global secondary eth0:2
       inet 192.168.56.203/24 brd 192.168.56.255 scope global secondary eth0:3
       inet 192.168.56.202/24 brd 192.168.56.255 scope global secondary eth0:4
   ・・・省略・・・

ノード1では192.168.56.202,192.168.56.203のSCAN VIPアドレスが起動しています。

簡易接続は以下のコマンドですが、この場合はどちらのノードのインスタンスに接続するのでしょうか。

orclはサービス名であり、どちらのインスタンスもorclである為、
両方のインスタンスに接続する可能性があります。

$ sqlplus system/manager@scan.oracle12c.jp:1521/orcl

答えはSCANで接続した場合は、どちらのインスタンスに接続されるかわかりません。
これはSCANのクライアントロードバランスと言う機能でデフォルトのサービスは
インスタンスの接続数を均等に割り振ります。


SCANを使用したRACデータベースの接続

このようにSCANを利用することでクライアントはノード障害時でも意識することなく、
SCAN VIPを使用すれば自動的にフェイルオーバー、ロードバランシングの機能を使用することが出来ます。

クライアントとしては障害を意識しないで接続できるのでSCANのほうがメリットが大きいですね。

もし特定のインスタンスに接続したい場合は、対象ノードの物理IP等で接続すれば必ず特定のインスタンスに接続することが出来ます。


RAC 初期化パラメータ


初期化パラメータの変更は各インスタンスで異なるパラメータを設定することが出来ます。

例えば自動メモリ管理(memory_target)のサイズをそれぞれのインスタンスで変えることが可能です。
ただし「すべてのインスタンスで同じ値を設定する必要があるパラメータ」も存在します。

COMPATIBLE
CLUSTER_DATABASE
CONTROL_FILES
DB_BLOCK_SIZE
DB_DOMAIN
DB_FILES
DB_NAME
DB_RECOVERY_FILE_DEST
DB_RECOVERY_FILE_DEST_SIZE
DB_UNIQUE_NAME
INSTANCE_TYPE (RDBMSまたはASM)
PARALLEL_EXECUTION_MESSAGE_SIZE
REMOTE_LOGIN_PASSWORDFILE
UNDO_MANAGEMENT

上記パラメータはすべてのインスタンスで同じ値を設定します。

RACデータベースで初期化パラメータを変更する場合、
ALTER SYSTEM分にSIDオプションが必要となります。

[構文] RACパラメータの変更
 $ ALTER SYSTEM SET パラメータ名 = 値
 [SCOPE=both|spfile|memory] [ SID='*|SID名']

SIDオプションには適用したいインスタンス名を指定するか、
*の場合は全インスタンスを適用するかを指定します。


RAC データベース起動停止


RACのデータベース停止方法は以下の方法があります。

・SRVCTLコマンド
・SQL*Plusのstartup,shutdown
・Enteprise Manager

SRVCTLコマンドは全インスタンスの起動、停止を行うことができますし、
片方のインスタンスを起動、停止することもできます。

SQL*Plusのstartup,shutdownコマンドは片方のインスタンスのみ影響があります。

その為、データベースを停止するのであれば、
全ノードでshutdownコマンドを発行する必要があります。

[構文] RAC データベース起動/停止
 $ srvctl [start|stop] database -d DB名

[構文] RAC DBインスタンス起動/停止
 $ srvctl [start|stop] instance -d DB名 -i インスタンス名

srvctlでdatabaseを指定するとすべてのインスタンスに対して操作を行います。

   $ crsctl stat res -w "TYPE = ora.database.type" -t
   --------------------------------------------------------------------------------
   Name           Target  State        Server                   State details
   --------------------------------------------------------------------------------
   Cluster Resources
   --------------------------------------------------------------------------------
   ora.orcl.db
         1        OFFLINE OFFLINE       rac01                   Instance Shutdown,ST
                                                                ABLE
         2        OFFLINE OFFLINE       rac02                   Instance Shutdown,ST
                                                                ABLE
   --------------------------------------------------------------------------------

   $ srvctl start database -d orcl


   $ crsctl stat res -w "TYPE = ora.database.type" -t
   --------------------------------------------------------------------------------
   Name           Target  State        Server                   State details
   --------------------------------------------------------------------------------
   Cluster Resources
   --------------------------------------------------------------------------------
   ora.orcl.db
         1        ONLINE  ONLINE       rac01                    Open,HOME=/u01/app/o
                                                                racle/product/12.2.0
                                                                /dbhome_1,STABLE
         2        ONLINE  ONLINE       rac02                    Open,HOME=/u01/app/o
                                                                racle/product/12.2.0
                                                                /dbhome_1,STABLE
   --------------------------------------------------------------------------------


srvctlでinstanceを指定すると特定のインスタンスに対して操作を行います。

   $ crsctl stat res -w "TYPE = ora.database.type" -t
   --------------------------------------------------------------------------------
   Name           Target  State        Server                   State details
   --------------------------------------------------------------------------------
   Cluster Resources
   --------------------------------------------------------------------------------
   ora.orcl.db
         1        OFFLINE OFFLINE       rac01                   Instance Shutdown,ST
                                                                ABLE
         2        OFFLINE OFFLINE       rac02                   Instance Shutdown,ST
                                                                ABLE
   --------------------------------------------------------------------------------

   $ srvctl start instance -d orcl -i orcl01


   $ crsctl stat res -w "TYPE = ora.database.type" -t
   --------------------------------------------------------------------------------
   Name           Target  State        Server                   State details
   --------------------------------------------------------------------------------
   Cluster Resources
   --------------------------------------------------------------------------------
   ora.orcl.db
         1        ONLINE  ONLINE       rac01                    Open,HOME=/u01/app/o
                                                                racle/product/12.2.0
                                                                /dbhome_1,STABLE
         2        OFFLINE OFFLINE      rac02                    Instance Shutdown,ST
                                                                ABLE
   --------------------------------------------------------------------------------


上記コマンドはorcl01インスタンスのみを起動します。
プラガブルデータベースの場合、CDBのみ起動します。

上記はCDBを起動するコマンドであり、PDBは起動しません。
手動で起動するのであれば、いつも通りCDBに接続し、
alter pluggable database openで起動します。

PDBをsrvctlコマンドで起動したい場合は、サービスを作成して依存関係により起動させます。

自動起動させる場合はこの方法を使用します。サービスに関しては次章でご紹介します。

表領域を作成したり、テーブルを作成したりはどちらのインスタンスで
実施してもかまいませんが、データベースは1つなのでコマンドの実行はどちらか一方のみとなります。

その他の操作はシングルデータベースと変わりはありません。


RAC 動的パフォーマンスビュー


RAC環境は複数インスタンスが存在する為、
動的パフォーマンスビューは各インスタンス上に存在します。

動的パフォーマンスビューはインスタンス上の管理情報を保持するビューでしたね。

データディクショナリはデータベースの管理情報を格納するビューであり、
データディクショナリは全インスタンスで共通です。

例えば、インスタンス名を確認したい場合、V$INSTANCEビューを参照しますが、
全インスタンスの情報を参照するときは、各ノードにログインして、
それぞれのノードでインスタンス名を確認するのは大変ですね。

RAC環境の場合、全インスタンスから情報を取得するGV$ビューが存在します。
このビューを使用することで一方のノードから、
複数インスタンスの情報を取得することが出来ます。

  SQL> SELECT instance_name,host_name FROM gv$instance;

   INSTANCE_NAME    HOST_NAME
   ---------------- --------------------
   orcl01           rac01
   orcl02           rac02


例えば各インスタンスでどのくらいの接続が来ているのかを確認する場合、
GV$SESSIONが便利です。

   SQL> SELECT inst_id,username,machine FROM gv$session;

      INST_ID USERNAME             MACHINE
   ---------- -------------------- --------------------
            1 SYSRAC               rac01
            1 SYS                  rac01
            2 APLUSER              rac02
            2 APLUSER              rac02
            2 APLUSER              rac02
            2 APLUSER              rac02


上記のように各インスタンスごとにどんな接続があるのかを確認することができます。


データベースの自動起動


データベースはクラスタウェア起動時、自動的(デフォルト)にOPENまで起動します。
※クラスタウェアの自動起動とは別です。
ただ計画作業(メンテナンス)などでクラスタウェアを起動した後、
DBは起動させたくない場合などもあります。

この設定は変更が可能です。

   # srvctl config -database orcl
   一意のデータベース名: orcl
   データベース名: orcl
   Oracleホーム: /u01/app/oracle/product/12.2.0/dbhome_1
   Oracleユーザー: oracle
   spfile: +DATA/ORCL/PARAMETERFILE/spfile.273.947872331
   パスワード・ファイル: +DATA/orcl/orapworcl01
   ドメイン:
   開始オプション: open
   停止オプション: immediate
   データベース・ロール: PRIMARY
   管理ポリシー: AUTOMATIC
   サーバー・プール:
   ディスク・グループ: DATA
   マウント・ポイントのパス:
   サービス: test1,test2,test3_pdb
   タイプ: RAC
   開始の同時実行性:
   停止の同時実行性:
   OSDBAグループ: dba
   OSOPERグループ: dba
   データベース・インスタンス: orcl01,orcl02
   構成されたノード: rac01,rac02
   CSSクリティカル: no
   CPU数: 0
   メモリー・ターゲット: 0
   最大メモリー: 0
   データベース・サービスのデフォルト・ネットワーク番号:
   データベースは管理者によって管理されています


上記の管理ポリシーはAUTOMATICとなっていますが、デフォルト自動起動が有効となっています。

この設定を変更する場合は以下のコマンドを使用します。
[構文] DB自動起動有効/無効
 $ srvctl modify database -database orcl -policy [manual|automatic]

自動起動を有効(デフォルト)にする場合は、automaticを指定し、
無効とする場合は、manualを設定します。


以上がRACデータベース管理についてのご紹介となります。
今回はデータベースの管理について学んでいきました。お疲れ様でした。