sql >> データベース >  >> RDS >> Oracle

Oracle12cマルチテナントの基本管理

    データベースがCDBか非CDBかを確認します

    
    SQL> select cdb from v$database;
    
    CDB
    ---
    YES
    
    

    コンテナへの接続

    
    $ export ORACLE_SID=pcdb01
    $ sqlplus / as sysdba
    
    SQL> show con_name
    
    CON_NAME
    ------------------------------
    CDB$ROOT
    
    SQL> show con_id
    
    CON_ID
    ------------------------------
    1
    
    SQL> show pdbs;
    
    CON_ID CON_NAME OPEN MODE RESTRICTED
    ---------- ------------------------------ ---------- ----------
    2 PDB$SEED READ ONLY NO
    3 PRD_PDB_CON READ WRITE NO
    4 PRD_PDB_TEN READ WRITE NO
    
    

    PDB間を移動する

    
    SQL> alter session set container=PDB$SEED;
    
    Session altered.
    
    SQL> alter session set container=PRD_PDB_CON;
    Session altered.
    
    SQL>
    

    PDBに関する情報

    
    SQL> COLUMN PDB_NAME FORMAT A15
    SQL> COLUMN PDB_NAME FORMAT A15
    SQL> SELECT PDB_ID, PDB_NAME, STATUS FROM DBA_PDBS ORDER BY PDB_ID;
    
    PDB_ID PDB_NAME STATUS
    ---------- --------------- ---------
    2 PDB$SEED NORMAL
    3 PRD_PDB_CON NORMAL
    4 PRD_PDB_TEN NORMAL
    
    

    パラメータの確認/変更

    
    SQL> select * from v$system_parameter;
    SQL> select * from PDB_SPFILE$;
    SQL> alter system set parameter_name=value;
    SQL> alter system set parameter_name=value CONTAINER=CURRENT;
    
    

    PDBの起動とシャットダウン

    いくつかの典型的な値:

    スタートアップ[NOMOUNT|マウント|制限|アップグレード|フォース|読み取り専用]

    シャットダウン[即時| ABORT]

    $ export ORACLE_SID=pcdb01
    $ sqlplus / as sysdba
    
    SQL> shutdown immediate;
    
    

    プラガブルデータベースの停止

    
    SQL> alter pluggable database PRD_PDB_CON close [immediate];
    SQL> alter pluggable database ALL EXCEPT PRD_PDB_CON close [immediate];
    SQL> alter pluggable database ALL close;
    SQL> alter pluggable database PRD_PDB_CON close [immediate] [instances=all];
    
    

    または:

    
    SQL> alter SESSION SET CONTAINER = PRD_PDB_CON;
    SQL> shutdown immediate;
    
    

    プラガブルデータベースの起動

    スタートアップフォース

    スタートアップオープンリードライト[制限]

    スタートアップオープン読み取り専用[制限]

    スタートアップのアップグレード

    SHUTDOWN [IMMEDIATE]

    
    SQL> alter pluggable database PDB01 open;
    SQL> alter pluggable database ALL EXCEPT PRD_PDB_CON open;
    SQL> alter pluggable database ALL open;
    SQL> alter pluggable database PDB01 open [instances=all];
    
    

    または:

    
    SQL> alter SESSION SET CONTAINER = PRD_PDB_CON;
    SQL> startup;
    
    SQL> alter PLUGGABLE DATABASE <pdb-name-clause> OPEN READ WRITE [RESTRICTED] [FORCE];
    SQL> alter PLUGGABLE DATABASE <pdb-name-clause> OPEN READ ONLY [RESTRICTED][FORCE];
    SQL> alter PLUGGABLE DATABASE <pdb-name-clause> OPEN UPGRADE [RESTRICTED];
    SQL> alter PLUGGABLE DATABASE <pdb-name-clause> CLOSE [IMMEDIATE];
    

    PDBの起動状態を保持する(12.1.0.2以降)

    
    SQL> alter PLUGGABLE DATABASE pdb2 OPEN;
    SQL> alter PLUGGABLE DATABASE pdb2 SAVE STATE;
    

    DBA_PDB_SAVED_STATESビューには、コンテナーの保存状態に関する情報が表示されます。

    
    
    SQL> COLUMN con_name FORMAT A20
    SQL> COLUMN instance_name FORMAT A20
    
    SQL> SELECT con_name, instance_name, state FROM dba_pdb_saved_states;
    
    CON_NAME INSTANCE_NAME STATE
    -------------------- -------------------- --------------
    PRD_PDB_CON pcdb01 OPEN
    
    

    プラグ可能なデータベースのサイズ

    
    SQL> COLUMN NAME FORMAT A20
    SQL> SELECT DBID, NAME, CON_ID, CON_UID, TOTAL_SIZE FROM V$CONTAINERS ORDER BY CON_ID;
    
    DBID NAME CON_IDCON_UID TOTAL_SIZE
    ---------- ------------------------------ ---------- ---------- ----------
    2732069181 CDB$ROOT 1 1 0
    3552543733 PDB$SEED 2 3552543733 775946240
    4008367944 PRD_PDB_CON 3 4008367944 1203765248
    2667104724 PRD_PDB_TEN 4 2667104724 1182793728
    
    

    プラグ可能なデータベースの起動時間

    
    SQL> set linesize 180
    SQL> col name for a30
    SQL> col open_time for a33
    SQL> select con_id,name,dbid,open_mode,open_time from v$containers;
    
    CON_ID NAME DBID OPEN_MODE OPEN_TIME
    ---------- ---------------- -------------- ---------- ---------- ---------------------------------
    1 CDB$ROOT 456650806 READ WRITE 17-MAR-18 11.59.36.176 PM -03:00
    2 PDB$SEED 2688102972 READ ONLY 17-MAR-18 11.59.36.182 PM -03:00
    3 PDB_PN1O0101 1079206163 READ WRITE 18-MAR-18 12.00.00.589 AM -03:00
    4 PDB_BATCHWEB 2340495643 READ WRITE 18-MAR-18 12.00.03.485 AM -03:00
    
    4 rows selected.
    
    

    プラグ可能なデータベースの稼働時間

    
    SQL> set linesize 180
    SQL> col name for a30
    SQL> col open_time for a28
    
    SQL> select name,floor(sysdate-cast(open_time as date))||'Days '||floor(((sysdate-cast(open_time as date))-floor(sysdate-cast(open_time as date)))*24)||'hours '||round(((sysdate-cast(open_time as date)-floor(sysdate-cast(open_time as date) )*24)-floor((sysdate-cast(open_time as date)-floor(sysdate-cast(open_time as date))*24)))*60)||'minutes' "Database Uptime"
    from v$containers;
    
    NAME Database Uptime
    --------------- ---------------------------
    CDB$ROOT 1331Days 11hours 28minutes
    PDB$SEED 1331Days 11hours 28minutes
    PDB_PN1O0101 1331Days 11hours 28minutes
    PDB_BATCHWEB 1331Days 11hours 28minutes
    
    4 rows selected.
    
    

    サービスの名前

    
    SQL> COLUMN NAME FORMAT A30
    SQL> SELECT NAME,CON_ID,PDB FROM V$SERVICES ORDER BY CON_ID;
    
    NAME CON_ID PDB
    ------------------------------ ---------- ------------------------------
    pcdb01XDB 1 CDB$ROOT
    SYS$BACKGROUND 1 CDB$ROOT
    SYS$USERS 1 CDB$ROOT
    pcdb01 1 CDB$ROOT
    prd_pdb_con 3 PRD_PDB_CON
    prd_pdb_ten 4 PRD_PDB_TEN
    
    6 rows selected.
    
    


    すべてのpdbにアクセスできる共通ユーザーを作成する

    SQL> CREATE USER c##user1 IDENTIFIED BY password1 CONTAINER=ALL;
    
    User created.
    
    SQL> GRANT CREATE SESSION TO c##user1 CONTAINER=ALL;
    
    Grant succeeded.
    

    pdbにアクセスできない共通ユーザーを作成する

    SQL> CREATE USER c##user2 IDENTIFIED BY password1;
    
    User created.
    
    SQL> GRANT CREATE SESSION TO c##user2;
    
    Grant succeeded.
    
    

    pdbにのみアクセスできるローカルユーザーを作成する

    
    SQL> CREATE USER user3 IDENTIFIED BY password3 CONTAINER=CURRENT;
    
    User created.
    
    SQL> GRANT CREATE SESSION TO user3 CONTAINER=CURRENT;
    
    Grant succeeded.
    

    共通の役割を作成

    
    SQL> CONN / AS SYSDBA
    SQL> CREATE ROLE c##role1;
    
    Role created.
    
    SQL> GRANT CREATE SESSION TO c##role1;
    
    Grant succeeded.
    
    

    一般ユーザーに役割を付与する

    
    SQL> GRANT c##role1 TO c##user1 CONTAINER=ALL;
    
    Grant succeeded.
    

    一般ユーザーにローカルユーザーに役割を付与する

    
    SQL> alter SESSION SET CONTAINER = PRD_PDB_CON;
    
    Session altered.
    
    SQL> GRANT c##role1 TO user2;
    
    Grant succeeded.
    

    ローカルロール

    
    SQL> CONN / AS SYSDBA
    
    SQL> alter SESSION SET CONTAINER = PRD_PDB_CON;
    
    Session altered.
    
    SQL> CREATE ROLE role1;
    
    Role created.
    
    SQL> GRANT CREATE SESSION TO role1;
    
    Grant succeeded.
    

    PDBの作成

    
    SQL> create pluggable database HMLPDB admin user admin identified by PassDw1 roles = (DBA);
    SQL> create pluggable database DSVPDB admin user admin identified by Manager1roles = (DBA) storage (MAXSIZE 1G) 
    FILE_NAME_CONVERT=('/u01/app/oracle/oradata/pcdb01/pcdb01_pdbseed_','/u01/app/oracle/oradata/dsvpdb/dsvpdb_');
    SQL> create pluggable database DSVPDB1 from DSVPDB file_name_convert=('/DSVPDB/','/DSVPDB1/');
    

    PDBを除く

    SQL> alter pluggable database DSVPDB1 close [immediate] [instances=all];
    SQL> drop pluggable database DSVPDB1 including datafiles;
    

    PDBのプラグを抜く

    $ sqlplus / as sysdba
    
    SQL> alter pluggable database PRD_PDB_CON close;
    SQL> alter pluggable database PRD_PDB_CON unplug into '/tmp/prd_pdb_con.xml';
    

    PDBのプラグイン

    $ sqlplus / as sysdba
    
    SQL> create pluggable database PRD_PDB_CON using '/tmp/prd_pdb_con.xml' FILE_NAME_CONVERT=('/oradata/cdb1/prd_pdb_con', '/oradata/cdb2/prd_pdb_con');
    SQL> alter pluggable database PRD_PDB_CON open;
    

    CDBを使用したOracleRACでのサービスの構成

    $ srvctl add service -db CDB01 -service new_service -pdb PRD_PDB_CON
    $ srvctl modify service -db CDB01 -service new_service -pdb PRD_PDB_CON
    $ srvctl remove service -db CDB01 -service new_service
    
    
    BEGIN
    DBMS_SERVICE.CREATE_SERVICE(
    service_name => 'new_service',
    network_name => 'new_service.com');
    END;
    /
    
    BEGIN
    DBMS_SERVICE.DELETE_SERVICE(
    service_name => 'new_service');
    END;
    /
    

    ルートコンテナには、cdb_tablespacesがあり、cdb_data_filesは、CDB内のすべてのコンテナのテーブルスペースとデータファイルを表示します。

    PDBに接続すると、cdb_tablespacesおよびcdb_data_filesは、PDBのdba_tablespaces、dba_data_filesと同じ情報を表示します。

    
    SQL> alter session set container=CDB$ROOT;
    
    Session altered.
    
    SQL> select tablespace_name, con_id from cdb_tablespaces order by con_id;
    
    TABLESPACE_NAME CON_ID
    ------------------------------ --------
    SYSTEM 1
    SYSAUX 1
    UNDOTBS2 1
    TEMP 1
    USERS 1
    UNDOTBS1 1
    SYSTEM 3
    SYSAUX 3
    TBS_GEN_01 3
    TEMP 3
    TBS_CON_IDX_01 3
    TBS_CON_DT_01 3
    USERS 3
    SYSTEM 4
    SYSAUX 4
    TBS_GEN_01 4
    USERS 4
    TEMP 4
    
    18 rows selected.
    
    
    SQL> select tablespace_name from dba_tablespaces;
    
    TABLESPACE_NAME
    ------------------------------
    SYSTEM
    SYSAUX
    UNDOTBS1
    TEMP
    USERS
    UNDOTBS2
    
    6 rows selected.
    

    12.2でローカル元に戻す機能を確認する方法

    Oracle Database 12cリリース1では、インスタンス内のすべてのコンテナが同じUNDO表領域を共有していました。

    Oracle 12cリリース2では、インスタンス内の各コンテナは独自のUNDO表領域を使用できます。

    
    SQL> shutdown immediate;
    SQL> startup upgrade;
    
    SQL> alter database local undo on;
    
    SQL> shutdown immediate;
    SQL> startup;
    
    
    SQL> col property_name format a30
    SQL> col property_value format a30
    
    SQL> select property_name, property_value from database_properties where property_name = 'LOCAL_UNDO_ENABLED';
    
    PROPERTY_NAME PROPERTY_VALUE
    ---------------- -------------- 
    LOCAL_UNDO_ENABLED TRUE
    
    
     

    参考資料

    https://docs.oracle.com


    1. ストアドプロシージャの実行がスクリプトからのSQLクエリよりも速いのはなぜですか?

    2. OracleのPL/SQL関数はDBMS_AQを認識できません

    3. mysqli_real_escape_stringは、SQLインジェクションやその他のSQL攻撃を回避するのに十分ですか?

    4. MariaDB JSON_INSERT()の説明