前回のおさらい

こんにちは。
前回はロックダウン・プロファイルの概要を紹介しました。
本ビジネスブログの右側のカテゴリー[Oracle Database管理] > [マルチテナント] から確認できます。
今回はロックダウン・プロファイルの有効化/無効化をご紹介します。

検証環境の紹介

前回は機能概要ということで、環境の紹介は割愛していました。
今回は、簡単に紹介致します。

DBバージョン 18.3.0.0.0 for Linux x86-64
構成 Restart Singleインスタンス
CDB名 ORCL
PDB名 PDBORCL
PDBORCL2

先日、Linux向け18.3.0.0.0が公開されたため、せっかくなので18cのgridとDBをインストールしてみた環境にしました。

 

 

 

PDBロックダウン・プロファイルの機能は12cでも使用可能です!

前回のラストでロックダウン・プロファイルを有効化していましたが、今回の開始状況として、一旦ロックダウン・プロファイルを解除しています。

ロックダウン・プロファイルの有効化/無効化

それでは、状況を確認してみましょう。
まずは、全PDBからロックダウン・プロファイルが解除されていることを確認しましょう。
 

$ sqlplus / as sysdba

SQL*Plus: Release 18.0.0.0.0 - Production on 土 11月 24 17:35:00 2018

Version 18.3.0.0.0

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

Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production

Version 18.3.0.0.0

に接続されました。

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED

---------- ------------------------------ ---------- ----------

         2 PDB$SEED                       READ ONLY  NO

         3 PDBORCL                        READ WRITE NO

         4 PDBORCL2                       READ WRITE NO

SQL>  select c.name,p.name,p.value from v$containers c, v$parameter2 p

where upper(p.name)='PDB_LOCKDOWN' order by c.con_id;

NAME                 NAME                 VALUE

-------------------- -------------------- ------------------------------

CDB$ROOT             pdb_lockdown

PDB$SEED             pdb_lockdown

PDBORCL              pdb_lockdown

PDBORCL2             pdb_lockdown

SQL>

 
ロックダウン・プロファイルの制御はPDB_LOCKDOWN初期化パラメータによって行います。
各PDBで、本パラメータに指定されているプロファイルが有効となります。
 

前回、CDBから設定していたのに、PDBのパラメータによって有効化されるの?

 

 

 

 

ロックダウン・プロファイルは、PDB利用者の作業を制限するため、CDB全体に設定する制限となります。
そのため、CDBから全PDBに対して設定します。
 

PDBの利用者が自分のPDBから設定を外したら意味がないのでは?

 

 

 

 

その通りです。
そのため、通常、PDB_LOCKDOWN初期化パラメータの変更を禁止する設定をプロファイルに組み込みます

今回は前回設定していたプロファイルを有効化してみます。
※実際には、プロファイルも事前に作成します。プロファイルの作成は、次回紹介します!

まずは、定義済みのプロファイルを確認します。
 

SQL> show con_name

CON_NAME

------------------------------

CDB$ROOT

SQL> select profile_name, rule_type, status, rule, clause, clause_option

from dba_lockdown_profiles where profile_name = 'TEST_PROFILE' order by 2,3,6;

PROFILE_NAME RULE_TYPE STATUS  RULE                 CLAUSE   CLAUSE_OPTION

------------ --------- ------- -------------------- -------- -------------------------

TEST_PROFILE STATEMENT DISABLE ALTER SYSTEM         SET      PDB_LOCKDOWN

TEST_PROFILE STATEMENT DISABLE ALTER SESSION        SET      PDB_LOCKDOWN

TEST_PROFILE STATEMENT DISABLE ALTER SYSTEM         SET      SGA_TARGET

TEST_PROFILE STATEMENT DISABLE ALTER SESSION        SET      SGA_TARGET

SQL>

 
RULEで指定されたSQL文のうち、CLAUSEとCLAUSE_OPTIONが一致しているものについて、STATUS列の通り、許可/禁止を制限します。
※指定がないものについては、STATUSがenable(許可)とみなされます。

上記では、PDB_LOCKDOWN初期化パラメータとSGA_TARGET初期化パラメータの変更が、ALTER SYSTEMとALTER SESSIONの両方で禁止されています。

私も本稿を作成中に忘れてしまい、あわてて直したのですが、ALTER SYSTEMだけでなくALTER SESSIONも忘れずに制限するようにしてください。
ALTER SYSTEMを制限していても、ALTER SESSIONの制限を忘れてしまってはあまり意味がありません。

さて、上記のTEST_PROFILEをさっそく有効化してみましょう。
 

SQL> show con_name

CON_NAME

------------------------------

CDB$ROOT

SQL> select c.name,p.name,p.value from v$containers c, v$parameter2 p

where upper(p.name)='PDB_LOCKDOWN' order by c.con_id;

NAME                 NAME                 VALUE

-------------------- -------------------- ------------------------------

CDB$ROOT             pdb_lockdown

PDB$SEED             pdb_lockdown

PDBORCL              pdb_lockdown

PDBORCL2             pdb_lockdown

SQL> alter system set pdb_lockdown=test_profile scope=both;

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

SQL> select c.name,p.name,p.value from v$containers c, v$parameter2 p

where upper(p.name)='PDB_LOCKDOWN' order by c.con_id;

NAME                 NAME                 VALUE

-------------------- -------------------- ------------------------------

CDB$ROOT             pdb_lockdown         TEST_PROFILE

PDB$SEED             pdb_lockdown         TEST_PROFILE

PDBORCL              pdb_lockdown         TEST_PROFILE

PDBORCL2             pdb_lockdown         TEST_PROFILE

SQL>

 
これでTEST_PROFILEプロファイルが全PDBで有効化されました。
変更ができないことを確認してみましょう。
 

SQL> alter session set container=PDBORCL;

セッションが変更されました。

SQL> alter system set sga_target=700M container=current scope=both;

alter system set sga_target=700M container=current scope=both

*

行1でエラーが発生しました。:

ORA-01031: 権限が不足しています

SQL> alter session set container=PDBORCL2;

セッションが変更されました。

SQL> alter system set sga_target=700M container=current scope=both;

alter system set sga_target=700M container=current scope=both

*

行1でエラーが発生しました。:

ORA-01031: 権限が不足しています

SQL>  alter session set container=PDBORCL;

セッションが変更されました。

SQL>  alter system set PDB_LOCKDOWN='' container=current scope=both;

alter system set PDB_LOCKDOWN='' container=current scope=both

*

行1でエラーが発生しました。:

ORA-01031: 権限が不足しています

SQL>

 
このとおり、SGA_TARGETを変更できなくなりました。
また、PDBからロックダウン・プロファイルを解除できないこともわかるかと思います。
 

PDBから変更できないのは分かったけれど、CDB管理者もメンテナンスで変更できないの?

 

 

 

 

 

ロックダウン・プロファイルで禁止した操作をCDBの管理者が実行する場合、ALTER SESSIONでCDB管理者が設定を変更するセッションのみ、ロックダウン・プロファイルを変更して行います。
 

SQL> show con_name

CON_NAME

------------------------------

CDB$ROOT

SQL> select c.name,p.name,p.value from v$containers c, v$parameter2 p

where upper(p.name)='PDB_LOCKDOWN' order by c.con_id;

NAME                 NAME                 VALUE

-------------------- -------------------- ------------------------------

CDB$ROOT             pdb_lockdown         TEST_PROFILE

PDB$SEED             pdb_lockdown         TEST_PROFILE

PDBORCL              pdb_lockdown         TEST_PROFILE

PDBORCL2             pdb_lockdown         TEST_PROFILE

SQL> alter session set pdb_lockdown='';

セッションが変更されました。

SQL> alter session set container=PDBORCL;

セッションが変更されました。

SQL> alter system set sga_target=700M container=current scope=both;

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

SQL> show parameter sga_target;

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

sga_target                           big integer 700M

SQL> alter session set container=cdb$root;

セッションが変更されました。

SQL> select c.name,p.name,p.value from v$containers c, v$parameter2 p

where upper(p.name)='PDB_LOCKDOWN' order by c.con_id;

NAME                 NAME                 VALUE

-------------------- -------------------- ------------------------------

CDB$ROOT             pdb_lockdown

PDB$SEED             pdb_lockdown

PDBORCL              pdb_lockdown

PDBORCL2             pdb_lockdown

SQL>

 
上記の通り、CDB管理者の管理用セッションはロックダウン・プロファイルが解除されました。
この時、別のセッションでは制限が有効になっていることを確認します。
 

sqlplus / as sysdba

SQL*Plus: Release 18.0.0.0.0 - Production on 土 11月 24 19:34:57 2018

Version 18.3.0.0.0

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

Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production

Version 18.3.0.0.0

に接続されました。

SQL> select c.name,p.name,p.value from v$containers c, v$parameter2 p

where upper(p.name)='PDB_LOCKDOWN' order by c.con_id;  2

NAME                           NAME                           VALUE

------------------------------ ------------------------------ ------------------------------

CDB$ROOT                       pdb_lockdown                   TEST_PROFILE

PDB$SEED                       pdb_lockdown                   TEST_PROFILE

PDBORCL                        pdb_lockdown                   TEST_PROFILE

PDBORCL2                       pdb_lockdown                   TEST_PROFILE

SQL>

 
このとおり、別のセッションからは制限が有効なままのため、制限を維持したままパラメータの変更ができました。
上記の手順で、特定のPDBのみロックダウン・プロファイルを解除したり、PDBによって異なるプロファイルを設定することも可能です。

ロックダウン・プロファイルの解除方法は、上記の手順をALTER SYSTEMで実行するのみとなります。
 

SQL> show con_name

CON_NAME

------------------------------

CDB$ROOT

SQL> select c.name,p.name,p.value from v$containers c, v$parameter2 p

where upper(p.name)='PDB_LOCKDOWN' order by c.con_id;

NAME                 NAME                 VALUE

-------------------- -------------------- ------------------------------

CDB$ROOT             pdb_lockdown         TEST_PROFILE

PDB$SEED             pdb_lockdown         TEST_PROFILE

PDBORCL              pdb_lockdown         TEST_PROFILE

PDBORCL2             pdb_lockdown         TEST_PROFILE

SQL> alter system set pdb_lockdown='' scope=both;

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

SQL> select c.name,p.name,p.value from v$containers c, v$parameter2 p

where upper(p.name)='PDB_LOCKDOWN' order by c.con_id;

NAME                 NAME                 VALUE

-------------------- -------------------- ------------------------------

CDB$ROOT             pdb_lockdown

PDB$SEED             pdb_lockdown

PDBORCL              pdb_lockdown

PDBORCL2             pdb_lockdown

SQL>

次回はプロファイルの編集方法について紹介!

今回、クダウン・プロファイルの有効化/無効化の方法を紹介しました。
次回は、プロファイルの編集方法を紹介します。

次回もよろしくお願いいたします!

投稿者プロフィール

技術チーム
技術チーム
DBひとりでできるもんを盛り上げるべく、技術チームが立ち上がりました。ひとりでできるもんと言いつつ、技術者が読んでプッとなるような、極めてピンポイントでマニアックな技術ネタを執筆していきます!