Oracle Multitenant Option - 12c Frequently Asked Questions (文档 ID 1511619.1)译文

Posted 丹心明月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle Multitenant Option - 12c Frequently Asked Questions (文档 ID 1511619.1)译文相关的知识,希望对你有一定的参考价值。

适用于:
企业版数据库——版本12.1.0.1(12.1)
本文档中的知识对所有平台均适用。
文档目的
文档描写了插接式数据库的许多方面和用法,以更好的理解该产品,同时,该文档也可做为一个快速参考手册。
问答
12c多租户架构中的CDB/PDB概念知识。
多租户架构中的可插接数据库(PDB)是什么意思?
可插接数据库(PDB)是Oracle数据库12c(12.1)中的新特性。可以在一个数据库内部拥有多个可插接数据库。可插接数据库是完全向后兼容的。
为什么要使用多租户选件?
是为了实现以下数据库整合目标:
	降低操作管理的总成本:
	--管理成本
	--数据中心成本
	--存储成本
	--意外事故成本
	提升性能:
	--资源利用
	--可管理性
	--集成
	--服务管理
	不需要更改应用程序
	不会降低性能
	必须在应用程序之间提供资源管理和隔离
	简化数据库升级和打补丁
从多租户选件中还能获得哪些益处?
多租户可插接数据库的益处有:
	能够快速配置一个新的数据库或者针对现存数据库的拷贝
	通过拔插功能,可以实现现存数据库到新平台的快速重部署
针对许多数据库,可以快速打补丁或者升级数据库版本,且这样做的成本只有一次
可以将PDB拔下打包或者升级,然后可以将它插到一个更新版本的不同的CDB中。
一台机器中以PDB的方式可以较单数据库运行更多的数据库实例
从Oracle提供的系统管理员的职责中分离应用程序管理员的职责
从现有的数据库版本升级到12c多租户数据库有多简单呢?
	迁移到12c可插接数据库是很简单的。你可以在一下方案中选择一个最适合你的:
	方法1:
		升级现低版本数据库到12.1
		将数据库插入后升级成CDB
	方法2:
		给需要升级的每个数据库提供一个空的PDB
		用数据泵或者ogg将数据库迁移到PDB
多租户架构中,现阶段不支持哪些数据库特性?
当前在CDB中不支持的数据库特性如下:
	一致性查询通知
	闪回数据归档
	热图
	自动数据优化
如果必须使用以上的特性,那么需要创建一个非CDB。
多租户CDB/PDB的基本操作
如何知晓数据库是否为多租户数据库?
使用如下语句查询:
SQL> select NAME, DECODE(CDB, 'YES', 'Multitenant Option enabled', 'Regular 12c Database: ') "Multitenant Option ?" , OPEN_MODE, CON_ID from V$DATABASE;
如何确认在CDB中有哪些PDB呢?
SQL>  select CON_ID, NAME, OPEN_MODE from V$PDBS;
如何连接到一个特定的PDB,如:PDB6?
可以使用如下命令从其他PDB或者root容器切换到PDB6:
SQL> alter session set container = pdb6;
也可以使用如下方法使用SQL*PLUS的connect命令连接到PDB:
使用快速连接
CONNECT username/[email protected][:port][/service_name][:server][/instance_name]
如果从OS:
$ sqlplus hpal/[email protected]//hpal-node1:1521/pdb2
OR
$ sqlplus hpal/[email protected]//localhost:1521/pdb2
OR
$ sqlplus hpal/[email protected]//localhost/pdb2
查看当前连接PDB:
show con_name
使用服务名连接
例:sqlplus hpal/[email protected]
如何切换到主容器数据库?
SQL> ALTER SESSION SET CONTAINER = CDB$ROOT;
如何确认当前连接的PDB或者CDB?
SQL> show con_name
SQL>  select sys_context ( 'Userenv', 'Con_Name') "Container DB" from dual;
如何启动一个PDB?
如果当前连接PDB:
SQL> alter pluggable database open;
如果当前连接root:
QL> alter pluggable database pdb6 open;
如何关闭PDB?
如果当前连接是PDB:
SQL> alter pluggable database close;
如果当前连接是root:
SQL> alter pluggable database pdb6 close;
容器数据库如何启停呢?
像非CDB那样使用startup/shutdown启停CDB:
如果CBD关闭了,那么无法访问PDB。
在CDB中,root和所有的PDB共享一个单实例,或者,当使用RAC的时候,共享多个并发数据库实例。启动和关闭整个CDB,而不是单一的PDB。然而,当CDB打开,可以通过ALTER PLUGGABLE DATABASE命令改变某一个PDB的打开状态。
哪些参数是可以在PDB级别改变的呢?
select NAME, ISPDB_MODIFIABLE from V$PARAMETER;
CDB中有哪些普通用户呢?
SQL> select distinct USERNAME from CDB_USERS where common = 'YES';
如何创建普通用户?
SQL> create user c##db_dba1 identified by manager1 container=all;
如何创建本地用户?
SQL> create user pdb6_dba1 identified by manager1 container=current; 
多租户架构
容器ID=0和1有什么区别呢?
CON_ID “0“意味着数据不属于任何一个容器,而是CDB整体的。比如:从V$DATABASE返回的数据属于CDB但不适于任一特定的容器,所以CON_ID设为”0“。一个CONTAINER_DATA对象能够返回属于不同容器(包括CON_ID==1的root)或者属于CDB的数据,属于CDB的行的CON_ID会被设置为0.
容器数据对象中不同CONN_ID的不同值的含义:
0=数据属于整个CDB
1=数据属于root
2=数据属于seed
3-254=数据属于PDB,每个PDB有其自己的容器ID。
有与PDB关联的后台进程么?如:PMON,SMON等
没有。只有一组root和所有PDB共享的后台进程。
每个PDB要有单独的控制文件么?
不。整个CDB只有一个单独的redo log和控制文件。
每个PDB要有单独的日志文件么?
不。整个CDB只有一个单独的redo log和控制文件。
可以通过PDB的PDB basis监控PDB上SGA的使用么?
所有PDB是共享一个SGA的。然而,可以通过root或者PDB监控SGA的消耗。
SQL> alter session set container=CDB$ROOT;
SQL> select POOL, NAME, BYTES from V$SGASTAT where CON_ID = '&con_id';
SQL> select CON_ID, POOL, sum(bytes) from  v$sgastat 
group by CON_ID, POOL order by  CON_ID, POOL;
可以通过PDB的PDB basis监控PDB上PGA的使用么?
select CON_ID, sum(PGA_USED_MEM), sum(PGA_ALLOC_MEM), sum(PGA_MAX_MEM) 
from  v$process 
group by CON_ID order by  CON_ID;
 
alter session set container =CDB$ROOT; 
select NAME , value from  v$sysstat  where NAME like 'workarea%'; 

alter session set container = <targetPDB>;
select NAME , value from  v$sysstat  where NAME like 'workarea%';
每个PDB都需要单独的UNDO表空间么?
单实例CDB中只有一个在用的undo表空间。RAC CDB中,每个实例有一个在用undo表空间。只有一个具有适当权限且当前连接容器是root的普通用户可以创建undo表空间。
每个PDB都需要单独的system表空间么?
root和每个PDB都有一个system表空间。
每个PDB都需要单独的sysaux表空间吗?
root和每个PDB都有一个sysaux表空间。
每个PDB都需要有单独的临时表空间吗?
对于整个CDB,只有一个默认的临时表空间。然而,可以为每个PDB创建另外的临时表空间。对于单实例CDB,只需要一个在用的临时表空间;对于RAC CDB,每个实例需要一个在用临时表空间。
能够为root和每个PDB指定不同的默认表空间么?
当然可以。
root和PDB的物理数据文件都是分开的么?
数据文件对于每个PDB,seed和root都是分开的。
那么在CBD中,用户数据存储在哪里呢?
CDB中,大部分用户数据存在PDB中。root不存储或者存储少量用户数据。
可插接数据库支持分离的字符集么?
CDB使用一个字符集。CDB中所有的PDB使用与CDB相同字符集。
Oracle建议:
	对于所有新的部署而且如果所有的PDB为空,那么Oracle强烈建议CDB数据库字符集使用AL32UTF8,CDB国家字符集使用AL16UTF8.
	Oracle强烈建议,合并之前根据需求,将现有数据库转换为一个或多个AL32UTF8字符集的CDB。可以使用数据库Unicode转换助手将一个非CDB转为AL32UTF8。但是在创建以后,就不能使用数据库转换助手转换CDB字符集。
	如果在合并数据库之前不能转换字符集,那么需要使用插件兼容的数据库字符集分组,然后将每个组使用适当的超集插接到不同的CDB。
参考文档:
https://support.oracle.com/epmos/faces/Oracle%20Database%20Globalization%20Support%20Guide,%2012c%20Release%201%20(12.1)
在可插接数据库环境中,如何配置网络文件?
CDB有一个唯一的listener.ora,tnsnames.ora,sqlnet.ora文件,CDB中所有的PDB共用这些文件。
CDB/PDB高级操作
如何安装设置可插接数据库?
使用runInstaller安装数据库软件
使用dbca创建数据库。在一个操作中可以创建多个PDB。
DBCA在创建CDB的时候允许指定PDB的个数,可以使用DBCA从CDB拔插PDB。
什么操作作为实体作用在PDB上?
这些操作:
创建PDB(全新的,现存PDB的拷贝,插入未接入的PDB)
拔出PDB
删除PDB
设置PDB的Open_Mode
如何创建一个可拔插数据库?
create pluggable database x admin user a identified by p;
create pluggable database y admin user a identified by p file_name_convert = ('pdbseed', 'y');
如何彻底删除一个PDB?
drop pluggable database x
including datafiles;
使用PL/SQL管理PDB的配置有多简单?
例:
OMF:
declare
t0 integer not null := -1;
procedure Show_Time(What in varchar2) is
t varchar2(10);
begin
t := Lpad((DBMS_Utility.Get_Time() - t0), 5);
DBMS_Output.Put_Line('create PDB:'||t||' centiseconds');
end Show_Time;
begin
t0 := DBMS_Utility.Get_Time();
execute immediate '
create pluggable database x
admin user a identified by p
';
Show_Time('create PDB:');
t0 := DBMS_Utility.Get_Time();
execute immediate '
drop pluggable database x
including datafiles
';
Show_Time('drop PDB: ');
end;
如何克隆PDB?
被克隆PDB必须以read only模式打开。
OMF:
create pluggable database x2
from x;
如何拔出一个PDB?
alter pluggable database x unplug into '/some_directory/x_description.xml' ;
语句中的into后面必须跟描述PDB的全路径的xml文件。
可扩展性&RAC
如何添加或者更改用户管理的服务?
rvctl add service … –pdb <pdb_name>
srvctl将会在有服务启动的所有实例上自动打开PDB。
如果将<pdb_name>设置为‘’,也就意味着将此服务属性值设置为空,那么这个服务就只能连接到root
如何查看有哪些服务绑定到了可插接数据库上?
SQL> column NAME format a30
SQL> select PDB, INST_ID, NAME from gv$services order by 1;
诊断有关
如何查找PDB的告警日志?
所有PDB的告警信息都放到同一个告警日志中。
容器数据库的信息可以在xml格式中的Diag Alert和文本格式中的Diag Trace找到。
也可通过查看动态性能视图v$diag_info查看明细信息。
如何查看与PDB相关的跟踪文件?
PDB产生的所有跟踪文件当前都可以在容器数据库的Diag Trace发现。
可以通过查看动态性能视图v$diag_info查看明细信息。
其他
如果PDB中,有用户定义的,或者普通用户创建的模式对象,在拔出然后插到另一个CDB中,且原有的普通用户在这个新的CDB中不存在,那么原来的模式对象怎么办?他们会属于哪个用户呢?PDB中,原来被授予对这些模式对象拥有权限的其他用户,还依然拥有那些权限吗?
如果在CDB中插入一个含有普通用户的PDB,会发生:
PDB中的普通用户以前被授予的一般性权限(包括SET CONTAINER权限)将被取消。
如果CDB中有与新插入的PDB相同的普通用户名,那么他们将会合并。且用户密码以CDB的为准。否则,新插入的PDB中的用户将被锁定。这种情况下,你可以:
	让它保持锁定,使用该模式的对象。
	使用数据泵将这些对象迁移到另一个模式中,然后将锁定的用户账号删掉。
	关闭PDB,连接到root,然后创建一个与锁定账号相同名称的用户。当重新打开PDB,数据库会处理锁定用户与新建用户之间的权限差异。之后,就可以解锁PDB中的锁定用户。该用户以前有的权限和角色将保持不变。
在标准版本中,多租户选件可用吗?
可用,但是每个CDB将只能创建一个PDB。
事务可以跨PBD么?
不可以。虽然在一个PDB上开始一个事务之后可以使用alter session set container,但是只可以在第二个PDB使用select语句。事务是保留的,可以切换回原来的PDB执行提交或者回滚。
每个容器里面的CDB_和V$视图中都存储什么数据?
CDB_视图是容器数据对象。当一个用户连接到root然后查询一个CDB_视图,查询结果取决于该视图对该用户设置的CONTAINER_DATA值。CONTAINER_DATA的SQL ALTER USER语句用来设置和修改用户的CONTAINER_DATA值。
多租户CDB的root下,CDB_视图可以用来查询root和PDB中的表、表空间、用户、权限、参数等信息。
不管CDB_视图收集的谁的信息,CDB_视图属于SYS用户。默认情况下,一个用户连接到root后只能看到属于root的信息。
每个PDB可以设置自己的时区么?
可以。
每个PDB可以设置自己的NLS参数么?
可以。
如何监控CDB/PDB中每个容器/数据库的undo使用?
select NAME,MAX(TUNED_UNDORETENTION), MAX(MAXQUERYLEN), MAX(NOSPACEERRCNT), MAX(EXPSTEALCNT)
from V$CONTAINERS c , V$UNDOSTAT u
where c.CON_ID=u.CON_ID
group by NAME;

select NAME,SNAP_ID,UNDOTSN,UNDOBLKS,TXNCOUNT,MAXQUERYLEN,MAXQUERYSQLID
from V$CONTAINERS c , DBA_HIST_UNDOSTAT u
where c.CON_ID=u.CON_ID
and u.CON_DBID=c.DBID
order by NAME;
多租户架构与基于模式有什么区别?
用户名冲突会组织基于模式的整合。
基于模式的整合安全性不高。
per-application,back-end,point-in-time恢复很难
很难协调应用和back-ends之间的资源分配。
为单个应用和back-end打补丁是做不到的。
对单个应用和back-end的克隆是很难的。

以上是关于Oracle Multitenant Option - 12c Frequently Asked Questions (文档 ID 1511619.1)译文的主要内容,如果未能解决你的问题,请参考以下文章

使用 Identity Server 和 SaasKit 发布 securig MultiTenant 应用程序

MultiTenant自定义ILogger - 不能从单例中使用作用域服务

Oracle数据库18c升级到19c

Oracle:根据数据集替换选项字符串 - 这可能吗?

Oracle SYS_CONTEXT用法

oracle授权时“with admin option”与“with grant option”的区别