Oracle Multitenant Option - 12c :常见问题
在12C多租户架构中一般CDB/ PDB概念
什么是多租户架构的可插拔数据库(PDB)?
可插拔数据库(PDBS)是Oracle数据库12c的第1版(12.1)。你可以在一个Oracle数据库内发生许多可插拔数据库。可插拔的数据库完全向后兼容普通pre-12.1数据库。
为什么我会考虑使用多租户的选择?
你应该考虑以下数据库整合目标的实现:
降低运行费用 - 管理费用 - 营业成本 - 数据中心的成本 - 存储成本 - 应急费用
完善的功能 - 资源利用 - 可管理性 - 集成 - 服务管理
不需要更改应用程序
不得损害性能
必须提供应用程序之间的资源管理和隔离
必须简化补丁和升级Oracle数据库
我将从多租户选项得到什么其他的好处?
多租户可插拔数据库的好处是:
快速配置一个新数据库或现有数据库的副本。
快速重新部署,通过拔掉插头,一个现有的数据库到一个新的平台。
快速补丁或升级Oracle数据库版本对于许多数据库和做一次的成本。
补丁或升级通过拔掉PDB并将其插入到在以后不同版本的容器数据库(CDB)的升级。
一台机器可以以整体式数据库的形式运行多个数据库实例,而不是在PDBS单独的。
从Oracle提供的系统管理员的职责分离应用程序管理员的职责。
如何轻松地将现有的预12.1数据库迁移至12c多租户数据库?
迁移到12C可插拔数据库是非常简单和容易。您可以评估,并采取哪一种最适合你。
计划A.
升级一个现有预12.1数据库到12.1
插件数据库升级成CDB
B计划。
每个数据库提供空PDBS需要合并
使用datapump或golden gate复制数据库迁移到PDB
Oracle数据库的功能目前不在多租户架构支持?
下面的Oracle数据库功能目前不支持在CDB:
连续查询通知
闪回数据归档
热图
自动数据优化
如果必须使用这些功能的一个或多个,然后创建一个非CDB。
基本多租户CDB/ PDB操作
我怎么知道我的数据库是否为多租户?
建立SQL会话并运行此查询:
SQL> select NAME, DECODE(CDB, 'YES', 'Multitenant Option enabled', 'Regular 12c Database: ') "Multitenant Option ?" , OPEN_MODE, CON_ID from V$DATABASE;
NAME Multitenant Option ? OPEN_MODE CON_ID
--------- ------------------------------ -------------------- ----------
CDB2 Multitenant Option enabled MOUNTED 0
我们有什么可插拔数据库在数据库容器?
SQL> select CON_ID, NAME, OPEN_MODE from V$PDBS;
CON_ID NAME OPEN_MODE
---------- ------------------------ ------------
2 PDB$SEED READ ONLY
3 PDB1 MOUNTED
4 PDB2 MOUNTED
5 PDB3 MOUNTED
6 PDB4 MOUNTED
7 PDB5 MOUNTED
8 PDB6 MOUNTED
9 PDB7 MOUNTED
如何连接到一个可插拔数据库,比方说,PDB6?
您可以使用下面的命令从其他PDB或root切换到PDB6。
SQL> alter session set container = pdb6;
连接到PDB直接使用SQLPLUS CONNECT命令:
您可以使用以下方法来连接到PDB和SQL*Plus连接命令:
A)数据库连接使用简单的连接
Ex: CONNECT username/password@host[:port][/service_name][:server][/instance_name]
从操作系统提示符SQLPLUS的例子:
$ sqlplus hpal/hpal@//hpal-node1:1521/pdb2
OR
$ sqlplus hpal/hpal@//localhost:1521/pdb2
OR
$ sqlplus hpal/hpal@//localhost/pdb2
SQL> show con_name
CON_NAME
------------------------------
PDB2
B)数据库连接使用网络服务名
例如 TNSNAMES.ora:
=======
LISTENER_CDB1 =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
CDB1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = cdb1)
)
)
PDB2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = hpal-node1.us.oracle.com)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pdb2)
)
)
=======
从操作系统提示符SQLPLUS的例子:
$ sqlplus hpal/hpal@pdb2
我怎么切换到主容器数据库?
SQL> ALTER SESSION SET CONTAINER = CDB$ROOT;
我如何确定我目前连接哪些PDB或CDB?
SQL> show con_name
CON_NAME
------------------------------
PDB6
OR
SQL> select sys_context ( 'Userenv', 'Con_Name') "Container DB" from dual;
Container DB
--------------------------------------------------------------------------------
PDB6
我如何启动一个可插拔的数据库?
当连接到当前PDB:
SQL> alter pluggable database open;
当连接到root:
SQL> alter pluggable database pdb6 open;
我怎么关机/关闭一个可插拔的数据库?
当连接到当前PDB:
SQL> alter pluggable database close;
当连接到root:
SQL> alter pluggable database pdb6 close;
我如何关闭/启动容器数据库?
Use startup / Shutdown command similar to startup / shutdown of Non CDB.
当容器数据库关机,没有PDB访问。
在一个CDB,root和所有的PDBS的共享单个实例或使用Oracle RAC,多个并发数据库实例时。您启动和关闭整个CDB,而不是单个PDBS。然而,当CDB是开放的,你可以使用ALTER DATABASE PLUGGABLE的语句更改单个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”。一个容器数据对象可以想像,该行对CBD将被设置为0返回有关各种容器(包括具有CON_ID== 1根)数据以及对CDB作为一个整体。
下表介绍了容器数据对象CON_ID列的各种值。
0 =数据涉及到整个CDB
1 =数据涉及到root
2=数据涉及seed
3 - 254=数据涉及到PDB,每个PDB都有自己的容器ID。
是否有与PDBS关联的后台进程ex,PMON,SMON等?
不.有一组后台进程的root和所有PDBS共享
要求每个PDB有独立的控制文件?
不.有一个单一的重做日志和整个CDB一个控制文件。
是否有单独为每个PDB需要重做日志文件?
不.有一个单一的重做日志和整个CDB一个控制文件。
我可以通过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基础上监视PGA在PDB上的使用情况吗?
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吗?
有一个活动的撤销表空间在一个单实例CDB。对于Oracle RAC CDB,对于每个实例一个活动的撤销表空间。只有谁拥有相应的权限,其当前容器为root可以创建一个还原表空间的共同用户。
我需要单独的系统表空间的PDB吗?
有一个单独的系统表空间的根和每个PDB。
我需要单独的每个我的PDB SYSAUX表空间?
有一个单独的SYSAUX表空间的根和每个PDB 。
我需要为每一个我的PDB临时表空间?
有一个默认的临时表空间在整个CDB。但是,您可以在个人PDBS创建额外的临时表空间。需要一个单实例CDB一个活动的临时表空间,或者需要为Oracle RAC CDB的每个实例一个活动的临时表空间。
我可以指定一个单独的根和每个PDB的默认表空间吗?
是的.您可以指定一个单独的根和每个PDB的默认表空间
都是物理数据文件来完成独立的根和PDB吗?
有单独的数据文件,root,seed,每个PDB。
用户数据存储在CDB哪里?
在一个CDB,大多数用户数据是在PDBS。根不包含任何用户数据或最小的用户数据。
可插入的数据库是否支持不同的数据库字符集?
一个CDB使用单字节字符集。所有在CDB的PDBS中使用此字符集。
Oracle提出以下建议:
对于所有新部署,如果所有PDBS创建空的,Oracle强烈建议AL32UTF8为CDB数据库字符集和AL16UTF6为CDB国家字符集。
如果你能将你现有的数据库迁移到AL32UTF8合并前,Oracle建议你这么做,根据您的需要,巩固成一个或多个AL32UTF8的CDB。您可以使用Oracle数据库迁移助手对Unicode到非CDB迁移到AL32UTF8。使用Oracle数据库迁移助手对Unicode,创建后不能迁移CDB。
如果你不能将你现有的数据库合并前,那么你必须将它们划分成组与插件兼容的数据库字符集和插件设置每到一个单独的CDB与适当的超集的字符集
参考:Oracle Database Globalization Support Guide, 12c Release 1 (12.1)
我如何在一个可插拔的数据库环境配置网络文件?
有一个单一的listener.ora,tnsnames.ora和sqlnet.ora文件在整个CDB 。所有在CDB的PDBS中使用这些文件。
高级CDB/ PDB操作
如何安装和设置可插入的数据库?
使用runInstaller来安装Oracle数据库软件
使用DBCA创建数据库。您可以在一次操作中创建多个可插拔数据库。
DBCA,可以指定在CDB PDBS的数量在创建时。创建一个CDB后,您可以使用DBCA插上PDBS到它,并从中拔出PDBS。
哪些操作作用于PDBS作为实体?
这些操作作用于PDBS的实体:
创建PDB(全新,作为现有PDB的克隆,通过在拔下PDB插入)
拔下PDB
删除PDB
设置Open_Mode为PDB
如何创建一个可插入数据库?
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配置有多容易?
下面的PL/ SQL代码的例子来说明这一点。
--使用Oracle管理的文件
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?
该clonee必须以只读方式打开。
--使用Oracle管理的文件
create pluggable database x2 from x;
如何拔掉一个PDB?
alter pluggable database x unplug into '/some_directory/x_description.xml' ;
进入关键字必须遵循完整路径的PDB的描述,在XML中,通过操作产生。
可扩展性和RAC
如何添加或修改用户管理服务?
srvctl add service … –pdb <pdb_name>
Starting a user-managed service using
srvtcl will open the PDB automatically in all the instances in which the service is started.
指定空字符串(“”)作为<pdb_name>将导致服务的可插入数据库属性被设置为null。该服务然后可仅用于连接到根。
我怎么能查看哪些服务连接到我的可插入的数据库?
SQL> column NAME format a30
SQL> select PDB, INST_ID, NAME from gv$services order by 1;
PDB INST_ID NAME
-------------------------------- ---------- --------------------------------
CDB$ROOT 1 cdb1XDB
CDB$ROOT 1 SYS$BACKGROUND
CDB$ROOT 1 SYS$USERS
CDB$ROOT 1 cdb1
PDB1 1 pdb1
PDB2 1 pdb2
诊断性
在我的可插拔数据库中在哪里可以找到警报日志?
生成警报日志的一个副本,其中包含警告和所有PDBS警报信息。
XML版本的警报中可以找到“Diag Alert”和文本格式的警报日志,可以在容器数据库的“Diag Trace”中找到。
您可以从V $ diag_info动态视图中选择找到的细节。
我在哪里可以找到我的可插拔数据库相关的跟踪文件?
所有PDBS产生的所有痕迹目前在容器数据库的“Diag Trace”被发现。
您可以从V $ diag_info动态视图中选择找到的细节。
其他
如果一个用户定义的,普通用户在PDB创建模式对象,如果晚些时候PDB是拔出并插入到不同的CDB在其中的普通用户不存在,那么会发生什么变化模式对象?
他们将拥有哪些用户?
将其他用户在PDB,曾被授予特权模式对象,还保留这些特权吗?
如果你插入一个包含普通用户的PDB进入CDB,那么将发生以下操作:
普通用户帐号在PDB失去一般授予特权,他们可能有,包括SET CONTAINER特权。
如果目标CDB具有相同名称的普通用户作为普通用户在新插入的PDB,那么新的普通用户合并与目标CDB普通用户。目标CDB的密码普通用户优先。否则,一个新插入在PDB的普通用户成为一个被锁定的帐户。在这种情况下,您可以执行下列操作之一:
让用户帐户锁定并使用它的模式的对象。
使用Oracle数据泵将这些对象复制到另一个模式,然后删除锁定的用户帐户。
关闭PDB,连接到root,然后创建一个普通用户具有相同的名称作为锁定账户。当你重新打开PDB,Oracle数据库解决在被普遍授予锁定用户的角色和权限的差异。然后,你可以在PDB中打开此用户帐户。本地授予用户的权限和角色将保持不变。
在标准版提供多租户的选择吗?
是的,但是你只能创建一个PDB,每个CDB。
一个事务可以跨越PDBS吗?
不,尽管“alter session set container”是允许在PDB开始一个事务后,只允许选择在第二个PDB。事务保存,你可以提交或回滚之后切换回原来的PDB。
哪些数据可以在CDB和每个容器V $视图中看到?
CDB_*视图容器数据对象。当连接到root用户查询CDB_*视图,查询结果将取决于用户视图的容器数据属性。在SQL ALTER USER语句的容器数据子句用于设置和修改用户的CONTAINER_DATA属性。
在一个多租户容器数据库(CDB)的根,cdb_ *视图可以被用来获取信息的表、表空间、用户、权限、参数等包含在根和可插拔数据库(PDB)。
CDB_ *视图属于SYS,无论谁拥有底层DBA_ *视图。默认情况下,一个用户连接到根用户将仅看到有关根数据。
也许数据库时区可以在每个PDB基础上设置?
是的.
也许NLS货币设置(NLS_CURRENCY等),每个PDB基础上进行设置?
是的.
如何监控每个容器/数据库的CDB/ PDB撤消使用情况?
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;
什么是基于架构的整合和多租户架构之间的差异?
1.名称冲突可能会阻止基于模式的整合。
2.基于模式的整合带来的弱安全性。
3.每个应用程序,后台,点及时恢复是极其困难。
4.应用程序后端之间的资源管理是困难的。
5.修补为单个应用程序的后端Oracle的版本是不可能的。
6.克隆一个单一的应用后端是困难的。