12C_CDB中的資料字典體系結構

lusklusklusk發表於2020-09-08

官方文件https://docs.oracle.com/database/121/CNCPT/cdblogic.htm#CNCPT89255


總結:

1、CDB的root只儲存資料字典的後設資料,比如DBA_OBJECTS資料字典檢視的後設資料OBJ$的定義只存在CDB的root中

2、CDB的PDB儲存屬於自己這個PDB的資料字典資訊,比如PDB1中有兩張使用者表,則PDB1中的OBJ$表就會儲存這兩張表資訊,而CDB$ROOT的OBJ$表就沒有這兩張表資訊

3、OBJ$表一般下普通使用者沒有許可權,sys這種管理員使用者能查到

4、PDB下查cdb_data_files和dba_data_files的結果是一樣,都是PDB自己的檔案

5、PDB下show pdbs只能看到自己



From the user and application perspective, the data dictionary in each container in a CDB is separate, as it would be in a non-CDB.

從使用者和應用程式的角度來看,CDB中每個容器中的資料字典都是獨立的,就像在非CDB中一樣。


For example, the DBA_OBJECTS view in each PDB can show a different number of rows. This dictionary separation enables Oracle Database to manage the PDBs separately from each other and from the root.

例如,每個PDB中的DBA_OBJECTS檢視可以顯示不同數量的行。 這種字典分離使Oracle資料庫可以彼此分開,也可以與根分開管理PDB。


Purpose of Data Dictionary Separation

In a newly created non-CDB that does not yet contain user data, the data dictionary contains only system metadata. For example, the TAB$ table contains rows that describe only Oracle-supplied tables, for example, TRIGGER$ and SERVICE$.

資料字典分離的目的

在尚不包含使用者資料的新建立的非CDB中,資料字典僅包含系統後設資料。 例如,TAB $表包含僅描述Oracle提供的表的行,例如TRIGGER $和SERVICE $。


non-CDB:If users create their own schemas and tables in this non-CDB, then the data dictionary now contains some rows that describe Oracle-supplied entities, and other rows that describe user-created entities. For example, the TAB$ dictionary table now has a row describing employees and a row describing departments.

如果使用者在非CDB中建立自己的架構和表,則資料字典現在包含一些描述Oracle提供的實體的行,以及其他描述使用者建立的實體的行。 例如,TAB $詞典表現在有employees和departments兩表的資訊


CDB:In a CDB, the data dictionary metadata is split between the root and the PDBs. In the following figure, the employees and departments tables reside in a PDB. The data dictionary for this user data also resides in the PDB. Thus, the TAB$ table in the PDB has a row for the employees table and a row for the departments table.

在CDB中,資料字典後設資料在根目錄和PDB之間拆分。 在下圖中,employee和department表位於PDB中。 此使用者資料的資料字典也位於PDB中。 因此,PDB中的TAB $表有employees和departments兩表的資訊


CDB root Metadata links

Oracle Database stores metadata about dictionary objects only in the root. For example, the column definitions for the OBJ$ dictionary table, which underlies the DBA_OBJECTS data dictionary view, exist only in the root. As depicted in Figure 18-3, the OBJ$ table in each PDB uses an internal mechanism called a metadata link to point to the definition of OBJ$ stored in the root.

The data corresponding to a metadata link resides in its PDB, not in the root. For example, if you create table mytable in hrpdb and add rows to it, then the rows are stored in the PDB files. The data dictionary views in the PDB and in the root contain different rows. For example, a new row describing mytable exists in the OBJ$ table in hrpdb, but not in the OBJ$ table in the root. Thus, a query of DBA_OBJECTS in the root and DBA_OBJECTS in hrdpb shows different result sets.


CDB root後設資料連結

Oracle資料庫僅在根目錄中儲存有關字典物件的後設資料。例如,在DBA_OBJECTS資料字典檢視下面的OBJ $字典表的列定義僅存在於根目錄中。如圖18-3所示,每個PDB中的OBJ $表使用一種稱為後設資料連結的內部機制來指向儲存在根目錄中的OBJ $的定義。

與後設資料連結相對應的資料位於其PDB中,而不位於根中。例如,如果在hrpdb中建立表mytable並向其中新增行,則這些行將儲存在PDB檔案中。 PDB和根目錄中的資料字典檢視包含不同的行。例如,在hrpdb的OBJ $表中存在描述mytable的新行,但在根目錄的OBJ $表中不存在。因此,查詢根目錄中的DBA_OBJECTS和hrdpb中的DBA_OBJECTS會顯示不同的結果集。


metadata link

In a PDB, an internal mechanism that points to a dictionary object definition stored in the root. For example, the OBJ$ table in each PDB uses a metadata link to point to the definition of OBJ$ stored in the root.

後設資料連結

在PDB中,一種內部機制,指向儲存在根目錄中的字典物件定義。 例如,每個PDB中的OBJ $表使用後設資料連結來指向儲存在根目錄中的OBJ $的定義。




實驗,CON_ID為3對應的PDB名稱是PDB1

SQL> show con_name user

CON_NAME

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

CDB$ROOT

USER is "SYS"


SQL> select owner,table_name,con_id from cdb_tables where table_name='TABLE1'

OWNER      TABLE_NAME     CON_ID

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

SYS        TABLE1              3

USER1      TABLE1              3

SYS        TABLE1              1


SQL> select count(*) from OBJ$  where name='TABLE1';

  COUNT(*)

----------

         1


SQL> show con_name user

CON_NAME

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

PDB1

USER is "SYS"


SQL> select owner,table_name,con_id from cdb_tables where table_name='TABLE1';

OWNER      TABLE_NAME     CON_ID

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

SYS        TABLE1              3

USER1      TABLE1              3


SQL> select count(*) from OBJ$  where name='TABLE1';

  COUNT(*)

----------

         2



SQL> show con_name user

CON_NAME

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

PDB1

USER is "USER1"


SQL> select count(*) from OBJ$  where name='TABLE1';

ORA-00942: table or view does not exist

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

相關文章