Oracle 12c系列(一)|多租戶容器資料庫

zhangsharp20發表於2018-03-20

Oracle 12.1釋出至今已有多年,但國內Oracle 12C的使用者並不多,隨著12.2在去年的釋出,選擇安裝Oracle 12c的客戶量明顯增加,在接下來的一兩年中,Oracle 12c將逐步得到普及。

目前關於12C新特性的文章很多,但大多都不成體系,本次的文章是一個非常完整、連貫的系列,將帶你全面的從基礎到深入全方位的理解Oracle 12C

本篇為Oracle 12c系列的開篇文章《Oracle 12c系列(1)Multitenant Container》。

可插入資料庫的概念

Oracle Multitenant Container Database(CDB),即多租戶容器資料庫,是Oracle 12C引入的特性,指的是可以容納一個或者多個可插拔資料庫的資料庫,這個特性允許在CDB容器資料庫中建立並且維護多個資料庫,在CDB中建立的資料庫被稱為PDB,每個PDBCDB中是相互獨立存在的,在單獨使用PDB時,與普通資料庫無任何區別。

CDB根容器資料庫的主要作用就是容納所有相關的PDB的後設資料,以及在CDB中對所有的PDB進行管理。

多租戶環境的組成

  • ROOT
    Root容器資料庫,是CDB環境中的根資料庫,在根資料庫中含有主資料字典檢視,其中包含了與Root容器有關的後設資料和CDB中所包含的所有的PDB資訊。在CDB環境中被標識為CDB$ROOT,每個CDB環境中只能有一個Root容器資料庫。
  • CDB seed
    CDB seed為PDB的種子,其中提供了資料檔案,在CDB環境中被標識為PDB$SEED,是建立新的 PDB的模板,你可以連線PDB$SEED,但是不能執行任何事物,因為PDB$SEED是隻讀的,不可進行修改。
  • PDBs
    PDB資料庫,在CDB環境中每個PDB都是獨立存在的,與傳統的Oracle資料庫基本無差別,每個PDB擁有自己的資料檔案和objects,唯一的區別在於PDB可以插入到CDB中,以及在CDB中拔出,並且在任何一個時間點之上PDB必須拔出或者插入到一個CDB中,當使用者連結PDB時不會感覺到根容器和其他PDB的存在。

CDB with PDBs


 

sys. ora12c>show pdbs

 

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED

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

         2 PDB$SEED                       READ ONLY  NO

         3 ORA12CPDB                      READ WRITE NO

         4 PDB2                           MOUNTED

         5 PDB1                           MOUNTED

         6 PDB3                           READ WRITE NO

sys. ora12c>

 

PDB$SEED為CDB seedORA12CPDB/PDB1/PDB2/PDB3PDB資料庫。

 

Application Containers

12cR2版本中,Oracle對多租戶功能進行了增強,在CDB root容器中可以建立一個叫做Application root的容器,可在其內建立多個依賴於Application rootApplication PDBs,架構圖如下:

Application Containers in a CDB

 “Application”

更多的關於Application Containers相關內容請參考之前的Application Containers系列:

Oracle12cR2版本Application Containers特性(1)

Oracle12cR2版本Application Containers特性(2)

Oracle12cR2版本Application Containers特性(3)

 

CDB環境中的使用者

CDB環境中包含兩類使用者,公用使用者和本地使用者。

  • 公用使用者
    公用使用者是在root資料庫中和所有的PDB資料庫中都存在的使用者,公用使用者必須在根容器中建立,然後此使用者會在所有的現存的PDB中自動建立,公用使用者標識必須以c##或者C##開頭,syssystem使用者是OracleCDB環境中自動建立的公用使用者。
    create user c##yyh identified by yyh;
    建立完成公用使用者,需要為公用使用者賦予所有可插拔資料庫的許可權,公用使用者才可以訪問其他PDB,如果在連線根容器時僅僅為公用使用者賦予了相關許可權,那麼該許可權不會被傳遞到所有的可插拔資料庫中,必須為公用使用者賦予能夠傳遞到PDB中的許可權,可以建立公用角色然後賦予公用使用者,或者在為公共使用者付權時指定子句container=ALL;
    例如:
    create role c##dbaprivs container=all;
    grant dba to c##dbaprivs container=all;

    grant c##dbaprivs to c##yyh container=all;
    或者
    grant dba to c##yyh container=all;
  • 本地使用者
    本地使用者指的是在PDB中建立的普通使用者,只有在建立它的PDB中才會存在該使用者,並且PDB中只能建立本地使用者。

 

CDB中你需要再次瞭解的基礎知識

SYSTEM/SYSAUX

CDB的資料庫環境中,SYSTEM/SYSAUX表空間並不是公用,CDB$ROOT以及每個PDB都擁有自己的SYSTEMSYSAUX表空間。

REDO檔案

CDB環境中所有的PDB共用CDB$ROOT中的REDO檔案,REDO中的條目標識REDO來自那個PDB

PDB中無法執行ALTER SYSTEM SWITCH LOGFILE命令,只有公用使用者在ROOT容器中才可以執行該命令。

另外ALTER SYSTEM CHECKPOINT命令是可以在PDB中執行的。

歸檔

CDB環境中所有的PDB共用CDB的歸檔模式,以及歸檔檔案,不可以單獨為PDB設定自己的歸檔模式,只有特權使用者連線根容器之後才可以啟動歸檔模式。

UNDO MODE

  在12.2之前的版本中,所有的PDB共用CDB$ROOT中的UNDO檔案,在12.2之後的版本中UNDO的使用模式有兩種:SHARED UNDO MODELOCAL UNDO MODE,顧名思義,LOCAL UNDO MODE就是每個PDB使用自己的UNDO表空間,但當PDB中沒有自己的UNDO表空間時,會使用CDB$ROOT中的公共UNDO表空間。

 

檢視UNDO表空間的使用模式(CDB$ROOT)

COL PROPERTY_NAME FOR A50

COL PROPERTY_VALUE FOR A50

COL DESCRIPTION FOR A50

SELECT property_name, property_value

FROM database_properties

WHERE property_name='LOCAL_UNDO_ENABLED';

 

PROPERTY_NAME        PROPERTY_VALUE

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

LOCAL_UNDO_ENABLED   TRUE

 

在建立CDB時使用了SHARED UNDO MODE方式,如果後續想更改為LOCAL UNDO MODE,我們可以使用如下命令更改UNDO MODELOCAL UNDO MODE:

startup upgrade

alter database local undo on;

shutdown immediate

startup

更改為local undoCDB中的所有的PDB會自動建立自己的UNDO表空間。

臨時檔案

每個PDB都有自己的臨時表空間,如果PDB沒有自己的臨時表空間檔案,那麼,PDB可以使用CDB$ROOT中的臨時表空間。

 

08:42:46 sys. woqu>select con_id, tablespace_name from cdb_temp_files;

 

    CON_ID TABLESPACE_NAME

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

         1 TEMP

         3 TEMP

 

Elapsed: 00:00:00.11

08:43:02 sys. woqu>

引數檔案

引數檔案中只記錄了根容器的引數資訊,沒有記錄PDB級別的引數資訊,在根容器中修改初始化引數,會被繼承到所有的PDB中,在PDB中修改引數後,PDB的引數會覆蓋CDB級別的引數,PDB級別的引數記錄在根容器的pdb_spfile$檢視中,但並不是所有的引數都可以在PDB中修改,可以通過v$system_parameter檢視檢視PDB中可修改的引數:

SELECT name FROM v$system_parameter

WHERE ispdb_modifiable = 'TRUE'

ORDER BY name;

 

pdb_spfile$:

08:37:58 sys. yyh>show parameter open_cursors

 

NAME                                 TYPE        VALUE

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

open_cursors                         integer     999

08:38:04 sys. yyh>show parameter local_listener

 

NAME                                 TYPE        VALUE

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

local_listener                       string      PDB_YYH

08:38:08 sys. yyh>select pdb_uid, name, value$ from pdb_spfile$;

 

   PDB_UID NAME               VALUE$

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

1167267009 open_cursors       999

1167267009 local_listener     'PDB_YYH'

 

Elapsed: 00:00:00.00

08:38:11 sys. yyh>

這裡在PDB:1167267009中更改了open_cursors/ local_listener兩個引數。

控制檔案

CDB環境中只有一組控制檔案,所有的PDB共用這組公共的控制檔案,從任何PDB中新增資料檔案都會記錄到公共控制檔案當中,公用使用者連線根容器時,可對控制檔案進行管理。

 

20:51:03 sys. woqu>show parameter control_files

 

NAME                                 TYPE        VALUE

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

control_files                        string      /u01/app/oracle/oradata/woqu/c

                                                 ontrol01.ctl, /u01/app/oracle/

                                                 oradata/woqu/control02.ctl

20:51:06 sys. woqu>

 

 

20:50:55 sys. woqupdb>show parameter control_files

 

NAME                                 TYPE        VALUE

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

control_files                        string      /u01/app/oracle/oradata/woqu/c

                                                 ontrol01.ctl, /u01/app/oracle/

                                                 oradata/woqu/control02.ctl

20:51:23 sys. woqupdb>

 

告警日誌以及跟蹤檔案

CDB中所有的PDB共用一個告警日誌和一組跟蹤檔案,所有的PDB告警資訊都會寫入同一個告警日誌中。

時區

CDB環境中可以為CDB以及所有的PDB設定相同的時區,也可以為每個PDB設定單獨的時區。

 

20:51:50 sys. woqu>show pdbs

 

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED

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

         2 PDB$SEED                       READ ONLY  NO

         3 WOQUPDB                        READ WRITE NO

20:52:00 sys. woqu>select dbtimezone from dual;

 

DBTIME

------

+00:00

 

Elapsed: 00:00:00.00

20:52:01 sys. woqu>

 

 

20:51:53 sys. woqupdb>select dbtimezone from dual;

 

DBTIME

------

+08:00

 

Elapsed: 00:00:00.00

20:52:02 sys. woqupdb>

 

字符集

CDB中定義字符集也可以應用於它所含有的PDB中,每個PDB也可以有自己的字符集設定。

20:52:33 sys. woqu>SELECT a.value || '_' || b.value || '.' || c.value NLS_LANG

20:52:33   2  FROM nls_database_parameters a, nls_database_parameters b, nls_database_parameters c

20:52:33   3  WHERE a.parameter = 'NLS_LANGUAGE' AND b.parameter = 'NLS_TERRITORY' AND c.parameter = 'NLS_CHARACTERSET';

 

 

NLS_LANG

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

AMERICAN_AMERICA.AL32UTF8

 

Elapsed: 00:00:00.06

20:52:33 sys. woqu>20:52:33 sys. woqu>

 

 

20:52:36 sys. woqupdb>SELECT a.value || '_' || b.value || '.' || c.value NLS_LANG

20:52:36   2  FROM nls_database_parameters a, nls_database_parameters b, nls_database_parameters c

20:52:36   3  WHERE a.parameter = 'NLS_LANGUAGE' AND b.parameter = 'NLS_TERRITORY' AND c.parameter = 'NLS_CHARACTERSET';

 

 

NLS_LANG

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

AMERICAN_AMERICA.ZHS16GBK

 

Elapsed: 00:00:00.08

20:52:36 sys. woqupdb>20:52:36 sys. woqupdb>

資料字典檢視與動態效能檢視

CDB環境中引入了CDB級別的資料字典檢視,它的級別高於DBA_/ALL_/USER_CDB級別的資料字典檢視含有所有PDB的後設資料資訊,其中增加了con_id列,con_idCDB中所有容器唯一識別符號,其中con_id0的是CDB$ROOTcon_id2的是PDB$SEED,每個PDBCDB中都會分配一個唯一的con_id。如果要想檢視CDB級別的資料字典檢視,必須使用公用使用者在跟容器中檢視,並且要檢視的PDB必須處於open狀態,才可以看到PDB中的資訊。

20:53:42 sys. woqu>show pdbs

 

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED

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

         2 PDB$SEED                       READ ONLY  NO

         3 WOQUPDB                        READ WRITE NO

20:53:45 sys. woqu>

 

20:54:40 sys. woqu>select con_id, pdb_id, pdb_name, dbid, status from cdb_pdbs;

 

    CON_ID    PDB_ID PDB_NAME          DBID         STATUS

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

         2         2 PDB$SEED          2834527297   NORMAL      

         3         3 WOQUPDB           3238406520   NORMAL

20:54:43 sys. woqu>

 

CDB的建立

    如果要使用可插拔資料庫的功能,需要在建立資料庫時專門指定啟用可插拔資料庫,建立CDB通常有如下兩種方式:

  • 使用DBCA圖形工具建立CDB
        這裡需要注意的是Oracle 12.2之後支援LOCAL UNDO,這裡注意需要手動要勾選LOCAL UNDO選項。
  • CREATE DATABASE語句建立CDB
        在使用指令碼建立CDBOracle提供了兩種方法,一種是使用OMF,另外一種是OMF的方式,注意引數檔案中需要將ENABLE_PLUGGABLE_DATABASE設定為TRUE。

這裡演示使用OMF方式建立CDB,資料名稱為ora12c
1.
設定ENABLE_PLUGGABLE_DATABASE引數為TRUE,引數檔案如下:

audit_file_dest='/u01/app/oracle/admin/ora12c/adump'

audit_trail='none'

compatible='12.2.0'

control_files='/u01/app/oracle/oradata/ora12c/control01.ctl','/u01/app/oracle/oradata/ora12c/control02.ctl'

db_block_size=8192

db_domain='linux.com'

db_name='ora12c'

diagnostic_dest='/u01/app/oracle'

enable_pluggable_database=true

memory_target=801m

nls_language='AMERICAN'

nls_territory='AMERICA'

remote_login_passwordfile='EXCLUSIVE'

undo_tablespace='UNDOTBS1'

 

2.建立相應目錄以及設定環境變數

export ORACLE_SID=ora12c

export ORACLE_HOME=$ORACLE_BASE/product/12.2.0/dbhome_1

export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$ORACLE_HOME/perl/bin:$ORACLE_HOME/jdk/bin:$PATH

 

3.CREATE DATABASE指令碼createdb.sql如下:

CREATE DATABASE ora12c

USER SYS IDENTIFIED BY oracle

USER SYSTEM IDENTIFIED BY oracle

LOGFILE GROUP 1 ('/u01/app/oracle/oradata/ora12c/redo01a.log','/u01/app/oracle/oradata/ora12c/redo01b.log')

           SIZE 100M BLOCKSIZE 512,

        GROUP 2 ('/u01/app/oracle/oradata/ora12c/redo02a.log','/u01/app/oracle/oradata/ora12c/redo02b.log')

           SIZE 100M BLOCKSIZE 512,

        GROUP 3 ('/u01/app/oracle/oradata/ora12c/redo03a.log','/u01/app/oracle/oradata/ora12c/redo03b.log')

           SIZE 100M BLOCKSIZE 512

MAXLOGHISTORY 1

MAXLOGFILES 16

MAXLOGMEMBERS 3

MAXDATAFILES 1024

CHARACTER SET AL32UTF8

NATIONAL CHARACTER SET AL16UTF16

EXTENT MANAGEMENT LOCAL

DATAFILE '/u01/app/oracle/oradata/ora12c/system01.dbf'

  SIZE 700M REUSE AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED

SYSAUX DATAFILE '/u01/app/oracle/oradata/ora12c/sysaux01.dbf'

  SIZE 550M REUSE AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED

DEFAULT TABLESPACE deftbs

   DATAFILE '/u01/app/oracle/oradata/ora12c/deftbs01.dbf'

   SIZE 500M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED

DEFAULT TEMPORARY TABLESPACE tempts1

   TEMPFILE '/u01/app/oracle/oradata/ora12c/temp01.dbf'

   SIZE 20M REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED

UNDO TABLESPACE undotbs1

   DATAFILE '/u01/app/oracle/oradata/ora12c/undotbs01.dbf'

   SIZE 200M REUSE AUTOEXTEND ON NEXT 5120K MAXSIZE UNLIMITED

ENABLE PLUGGABLE DATABASE

  SEED

  FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/ora12c/',

                       '/u01/app/oracle/oradata/ora12c/pdbseed/')

  SYSTEM DATAFILES SIZE 125M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED

  SYSAUX DATAFILES SIZE 100M

USER_DATA TABLESPACE usertbs

  DATAFILE '/u01/app/oracle/oradata/ora12c/pdbseed/usertbs01.dbf'

  SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;

 

這段程式碼中只有紅色字型部分與PDB有關,其他部分與建立傳統的Oracle資料庫語句均相同。

 

FILE_NAME_CONVERT    子句指定了使用'/u01/app/oracle/oradata/ora12c/'中的檔名在'/u01/app/oracle/oradata/ora12c/pdbseed/'中生產CDB seeds

 

USER_DATA_TABLESPACE    子句可以在容器中建立額外的表空間,這個表空間在後續使用PDB$SEED建立PDB時會被複制到PDB中。

 

4.將資料庫啟動到nomount狀態,然後執行上面createdb.sql指令碼建立CDB

 

startup nomount;

@createdb.sql

 

當資料庫建立成功之後可以看到新建立的資料庫被加入到/etc/oratab檔案中。

#cat /etc/oratab

+ASM:/u01/app/11.2.0/grid:N

ora12c:/u01/app/oracle/product/12.2.0/dbhome_1:N

orcl:/u01/app/oracle/product/11.2.0/dbhome_1:N          # line added by Agent

newdb:/u01/app/oracle/product/12.2.0/dbhome_1:N

yyh:/u01/app/oracle/product/12.2.0/dbhome_1:N

 

5.檢視監聽,根容器的服務ora12c.linux.com已經被註冊到監聽中。

Service "ora12c.linux.com" has 1 instance(s).

  Instance "ora12c", status READY, has 1 handler(s) for this service...

 

6.執行catcdb.sql指令碼建立CDB相關檢視:

@?/rdbms/admin/catcdb.sql

 注意事項:

1.catcdb.pl執行過中需要輸入兩個引數,文件中並沒有指出是什麼引數.

第一個引數應輸入:$ORACLE_HOME/rdbms/admin

第二個引數應輸入:catcdb.pl

 

2.環境變數中必須將$ORACLE_HOME/perl/bin指定到PATH中,否則報如下錯誤:

Can't locate Term/ReadKey.pm

3.需要將$ORACLE_HOME/perl/lib/5.22.0/x86_64-linux-thread-multi/Hash中的catcdb.pl檔案內容:

use Data::Dumper;

use util qw(trim, splitToArray);

use catcon qw(catconSqlplus);

更改為

use Data::Dumper;

use Util qw(trim, splitToArray);

use catcon qw(catconSqlplus);


4.切換到$ORACLE_HOME/perl/lib/5.22.0/x86_64-linux-thread-multi/Hash目錄中,然後sqlplus連線到資料,在執行catcdb.sql,否則報如下錯誤:

Can't locate Util.pm


7.開啟local undo mode(因為上面再建立CDB時沒有加入local undo mode子句)

sys. ora12c>shutdown immediate

sys. ora12c>startup upgrade

sys. ora12c>alter database local undo on;

 

Database altered.

 

Elapsed: 00:00:00.72


檢視是否為local undo mode

SELECT property_name, property_value

FROM database_properties

WHERE property_name='LOCAL_UNDO_ENABLED';

 

PROPERTY_NAME        PROPERTY_VALUE

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

LOCAL_UNDO_ENABLED   TRUE

 

Elapsed: 00:00:00.02

sys. ora12c>


重啟資料庫

shutdown immediate

startup

啟動資料庫的過程中會在PDB$SEED中自動建立UNDO表空間,提供給後來採用PDB$SEED方式建立PDB所使用。

PS:如果CDB中已經存在多個PDB,當在根容器中使用alter database local undo on;開啟local undo mode時會自動為每個PDB建立local undo


8.檢查CDB是否已經建立成功

sys. ora12c>SELECT dbid, name, open_mode, cdb, con_id FROM v$database;

 

      DBID NAME      OPEN_MODE            CDB     CON_ID

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

 323027068 ORA12C    READ WRITE           YES          0

 

Elapsed: 00:00:00.11

sys. ora12c>


此時CDB中含有兩個容器:根容器CDB$ROOT和種子容器PDB$SEED,如下:

sys. ora12c>SELECT con_id, dbid, con_uid, guid, name FROM v$containers;

 

CON_ID       DBID    CON_UID GUID                              NAME

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

     1  323027068          1 50A57CDEFD150C96E0530838A8C0206E  CDB$ROOT

     2 1453953285 1453953285 50A57CDEFD160C96E0530838A8C0206E  PDB$SEED

 

Elapsed: 00:00:00.00

sys. ora12c>SELECT con_id, tablespace_name, file_id, file_name

FROM cdb_data_files;

 

CON_ID TABLESPACE_NAME FILE_ID FILE_NAME

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

     1 SYSTEM                1 /u01/app/oracle/oradata/ora12c/system01.dbf

     1 SYSAUX                3 /u01/app/oracle/oradata/ora12c/sysaux01.dbf

     1 UNDOTBS1              5 /u01/app/oracle/oradata/ora12c/undotbs01.dbf

     1 DEFTBS                6 /u01/app/oracle/oradata/ora12c/deftbs01.dbf

 

Elapsed: 00:00:00.01

sys. ora12c>show con_id con_name user

 

CON_ID

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

1

 

CON_NAME

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

CDB$ROOT

USER is "SYS"

sys. ora12c>

 

CDB的管理

管理CDB時,通常需要使用sys使用者連線根容器資料庫,在操作方式上與非CDB資料庫同樣。

 

當前連線容器的資訊

1.

23:03:31 sys. woqu>show con_id con_name user

 

CON_ID

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

1

 

CON_NAME

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

CDB$ROOT

USER is "SYS"

23:03:33 sys. woqu>

 

2.

COL CON_ID FOR A10

COL CUR_CONTAINER FOR A25

COL CUR_USER FOR A25

SELECT

    sys_context('USERENV','CON_ID') con_id,

    sys_context('USERENV','CON_NAME') cur_container,

    sys_context('USERENV','session_user') cur_user

FROM dual;

 

CON_ID     CUR_CONTAINER             CUR_USER

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

1          CDB$ROOT                  SYS

 

啟動和停止CDB

只有公用使用者才可以連線根容器,並且啟動和停止CDB,停止和啟動與普通資料庫的處理過程相同,當公用使用者連線PDB時,無法啟動和停止CDB

sys. ora12c>startup

 

預設情況下啟動CDB時不會自動啟動PDBs,我們可以使用手工的方式啟動PDB

 

ALTER PLUGGABLE DATABASE [pdb_name] OPEN;

ALTER PLUGGABLE DATABASE ALL OPEN;      --開啟所有PDB

 

sys. ora12c>shutdown immediate

在關閉CDB時,CDB中正在執行PDSs會也會關閉,連線CDBPDBssession均會斷開。

 

檢視CDB環境中表空間使用情況

with generator0 as

 (select cf.con_id, cf.tablespace_name, sum(cf.bytes) / 1024 / 1024 frm

    from cdb_free_space cf

   group by cf.con_id, cf.tablespace_name),

generator1 as

 (select cd.con_id, cd.tablespace_name, sum(cd.bytes) / 1024 / 1024 usm

    from cdb_data_files cd

   group by cd.con_id, cd.tablespace_name),

generator2 as(

select g0.con_id, c.name con_name, g0.tablespace_name, g0.frm, g1.usm

  from generator0 g0, generator1 g1, v$containers c

 where g0.con_id = g1.con_id

   and g0.tablespace_name = g1.tablespace_name

   and c.con_id = g1.con_id

union

select c.con_id,

       c.name,

       ct.tablespace_name,

       null,

       sum(ct.bytes) / 1024 / 1024

  from v$containers c, cdb_temp_files ct

 where c.con_id = ct.con_id

 group by c.con_id, c.name, ct.tablespace_name)

select con_id,

case when con_name = LAG(con_name, 1) OVER(PARTITION BY con_name ORDER BY tablespace_name) THEN null ELSE con_name END

con_name, tablespace_name, frm freemb, usm usemb

from generator2

order by con_id;

 

CON_ID CON_NAME     TABLESPACE_NAME     FREEMB      USEMB

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

     1 CDB$ROOT     SYSAUX                  28        470

     1              SYSTEM              6.5625        810

     1              TEMP                               33

     1              UNDOTBS1            1.9375         60

     1              USERS                    4          5

     3 ORA12CPDB    SYSAUX              18.125        360

     3              SYSTEM                1.25        250

     3              TEMP                               64

     3              UNDOTBS1                33        100

     3              USERS                    4          5

 

切換容器

使用公用使用者連線CDB後可以使用alter session的方式切換不同的容器

 

alter session set container=pdb1;

alter session set container = cdb$root;

 

在切換容器時無需執行監聽器和密碼檔案。只要公用使用者擁有相關許可權就可以切換到另外的容器中。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/196700/viewspace-2154400/,如需轉載,請註明出處,否則將追究法律責任。

相關文章