Oracle Multitenant Container Database 是 Oracle 12C 引入的新个性,Multitenant Container Database (CDB),多租户容器数据库是指能够包容一个或者多个可插拔数据库的数据库,这个个性容许在 CDB 容器数据库中创立并且保护多个数据库,在 CDB 中创立的数据库被称为 PDB,每个 PDB 在 CDB 中是互相独立存在的,在独自应用 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 seed,ORA12CPDB/PDB1/PDB2/PDB3 为 PDB 数据库。
Application Containers
在 12cR2 版本中 Oracle 带来新的 Application Containers 个性,该个性对原有的多租户性能进行了加强,在 CDB root 容器中能够创立一个叫做 Application root 的容器,相似于 CDB root,可在其内创立多个依赖于 Application root 的 Application PDBs,其架构图如下:
Application Containers in a CDB
“Application”
在 Application Container 个性下还有另一个概念,被命名为“Application”,咱们能够把“Application”了解为一个区域,“Application”只能创立在 Application root 中,其内能够创立表、视图、函数等公共对象,而后可在 Application PDBs 中应用 sync 同步命令,来实现“Application”内的公共对象共享到 Application PDBs 中。
CDB 环境中的用户
CDB 环境中蕴含两类用户,专用用户和本地用户。
· 专用用户 \
专用用户是在 root 数据库中和所有的 PDB 数据库中都存在的用户,专用用户必须在根容器中创立,而后此用户会在所有的现存的 PDB 中主动创立,专用用户标识必须以 c##或者 C## 结尾,sys 和 system 用户是 Oracle 在 CDB 环境中主动创立的专用用户。\
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 都领有本人的 SYSTEM 和 SYSAUX 表空间。
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 MODE 和 LOCAL 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 MODE 为 LOCAL UNDO MODE:
startup upgrade
alter database local undo on;
shutdown immediate
startup
CDB 中的所有的 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 CDB_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 环境中能够为 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.AL32UTF8
Elapsed: 00:00:00.08
20:52:36 sys. woqupdb>20:52:36 sys. woqupdb>
数据字典视图与动静性能视图
在 CDB 环境中引入了 CDB 级别的数据字典视图,它的级别高于 DBA_/ALL_/USER_,CDB 级别的数据字典视图含有所有 PDB 的构造数据信息,该类视图中减少了 con_id 列,每个 PDB 在 CDB 中都会调配一个惟一的 con_id。如果要想查看 CDB 级别的数据字典视图,必须应用专用用户在跟容器中查看,并且要查看的 PDB 必须处于 open 状态,才能够看到 PDB 中的信息。
CON_ID 及其形容:
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 中所有的 PDB 共用一个告警日志和一组跟踪文件,所有的 PDB 告警信息都会写入同一个告警日志中。
AWR 报告
在 CDB 中收集的就是 CDB 级别的,在 PDB 中收集默认是 CDB 级别的,然而能够抉择 PDB 级别的。