- 在产品系统中的某些应用实际仅使用十分少量的硬件资源。但是如果存在大量这样的应用,则还是需要构造大量的数据库实例并为这些小规模的数据库分配存储空间
- 对于那些并不十分复杂或重要,需要全职DBA花费大量时间管理的数据库
- 为了更好地利用硬件和DBA资源,用户有必要将大量的部门级应用整合到少数几个oracle RDBMS数据库中以便部署和管理
- 更少的实例损耗
- 更低的存储成本
- 无需应用修改
- 更快和简便的配置
- 节省了打patch和升级的时间
- 分离了以下责任:
- 不同应用的管理员
- 应用程序管理员和DBA
- 应用用户
- 提供isolation
- 保证与非CDB 完整的向后兼容性
- 完整的RAC操作使用
- 与Oracle Enterprise Manager和Resource Manager整合在一起
- 可以集中化管理多个数据库
- 备份和灾难恢复
- 补丁和升级
- 先把12.1之前的数据库升级到12.1
- 将数据库装换为CDB container database
- 创建一个12c的CDB,并建立一个空的PDB
- 使用data pump/goldengate工具将数据导入到新的PDB中
- Continuous Query Notification
- Flashback Data Archive
- Heat Maps
- Automatic Data Optimization
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 OR 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 ------------------ ------------------------------ ---------------------------------------- ---------- MACLEAN Regular 12c Database: MOUNTED 0问题 : 如何知道一个容器数据库中有多少个pluggable database? 可以通过下面的查询得知:
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
...
问题 : 如何连接到一个PDB ,例如PDB6?
你可以从现有的链接切换到PDB6:
SQL> alter session set container = pdb6;
你也可以直接从SQLPLUS里直接登录PDB:
A)
使用easy connect 方式:
CONNECT username/password@host[:port][/service_name][:server][/instance_name]
例如:
$ 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)
通过Net Service name 连接
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
问题: 是否支持将 non-cdb非CDB转换为CDB?
不行, 无法直接转换。
对于12c之前的数据库 可以在升级到12c之后,然后作为PDB 插入plug到12c的CDB中。
或者采用data pump导入到12c的CDB中。 但是目前(12.1.0.1)不存在直接将non-CDB转换为CDB的方法。
For upgrade of 11g database to 12c, can we not convert non container database to CDB, during upgrade or post upgrade?
The only option I know is to move non-cdb as pdb.
that's true - you can only create a fresh CDB in Oracle 12c. Earlier database versions need to be either upgraded first to 12c and can be plugged in as a PDB, or you can use Data Punp export/import or Full Transportable Export/Import for 11.2.0.3 databases.
问题 : 连接后如何切换到容器root数据库?
SQL> ALTER SESSION SET CONTAINER = CDB$ROOT;
问题 : 如何判断我连接的是CDB还是PDB?
可以通过 show con_name 或者 select sys_context ( 'Userenv', 'Con_Name') "Container DB" from dual; 查看
问题 : 如何启动一个 Pluggable Database?
启动当前已连接的PDB :
alter pluggable database open;
连接到root 后启动某一个PDB:
alter pluggable database pdb6 open;
问题 : 如果shutdown 关闭一个Pluggable Database?
关闭当前已连接的PDB :
alter pluggable database close;
连接到root 后关闭某一个PDB:
alter pluggable database pdb6 close;
问题: 如何关闭和启动容器数据库 container database?
使用管理普通数据库的 shutdown /startup命令来关闭和启动 ROOT Database
当容器数据库被关闭,则所有的PDB均不可访问。
问题: 那些参数可以在PDB级别做修改?
select NAME, ISPDB_MODIFIABLE from V$PARAMETER;
==》主要是一些优化器参数、Pl/SQL、NLS参数可以被在pluggable databasei级别修改
问题: 在我的CDB中有那些用户是 common user?
select distinct USERNAME from CDB_USERS where common = 'YES';
问题: 如何创建一个 common user?
create user c##db_dba1 identified by manager1 container=all;
问题: 为什么我在12c中创建user失败 ORA-65049?
在CDB 中创建common user,用户名必须以C##开头,例如C##MACLEAN
问题 : 我在CDB中创建common user能够不以c##为开头吗?
可以的,需要修改隐藏参数 _common_user_prefix (默认为:C## Enforce restriction on a prefix of a Common User/Role/Profile name)
问题: 如何创建一个 local user?
create user pdb6_dba1 identified by manager1 container=current;
问题: Container ID CON_ID 0 和1 的区别是什么?
CON_ID =0 不指代任何的特定 容器,而指代整个CDB。 举例来说从V$DATABASE返回的一行结果 指代整个CDB 而非某一个容器, 因此CON_ID是0 。
CON_ID=0 代表整个CDB
1 代表root container
2 代表seed
3~254 指向某一个PDB
问题: 对于 PDB是否有独立的一套PMON、SMON后台进程?
没有, PDB和root共享同一套 后台进程
问题: 对于 PDB是否有独立的控制文件?
没有, 整个CDB 使用同一套redolog 和 controlfile
问题: 对于 PDB是否有独立的redo重做日志文件?
没有, 整个CDB 使用同一套redolog 和 controlfile
问题: 如何监控一个PDB对于SGA内存的使用?
PDB和root共享同一个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对SGA内存的使用吗?
目前12.1.0.1中还不可以,可能作为今后 12.2的新特性加入该功能
问题: 如何监控一个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 tablespace?
还是和普通数据库一样, 一个实例拥有一套undo tablespace, RAC每个实例一个undo tablespace
问题: 每一个PDB是否配置独立的SYSTEM表空间?
是的, root和每一个pdb都有独立的SYSTEM表空间
问题: 每一个PDB是否配置独立的SYSAUX表空间?
是的, root和每一个pdb都有独立的SYSAUX表空间
问题: 每一个PDB是否配置独立的Temporary tablespaces临时表空间?
整个CDB使用一个默认的临时表空间,但确实可以在独立的PDB中创建临时表空间。
问题: 我可以为PDB指定默认的表空间default tablespace吗?
可以
问题 : 对于root和PDB是否所有的物理数据文件都是独立的?
对于root、seed、和每一个pdb 都有独立的数据文件
在一个CDB中,绝大多数用户数据应当存放在PDB中。
问题 : PDB可以使用不同的字符集吗?
不能,整个CDB中的root、pdb使用同一套字符集
问题 : 在pluggable database环境下如何配置Oracle NET文件?
对整个CDB仍是使用同一套listener.ora, tnsnames.ora和 sqlnet.ora 网络配置文件
问题s : 我如何能够创建一个Container Database?
首先安装12c软件,之后启动DBCA 创建数据库为 容器数据库:
问题s : 对于PDB有那些常见操作?
- 创建PDB
- 拔出PDB unplug pdb
- 插入PDB plug pdb
- drop 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');
问题s : 如何drop一个pluggable database?
drop pluggable database x including datafiles;
问题s : 如何从现有的pdb 克隆一个新的pdb?
被克隆的PDB应当是read only状态
-- Using Oracle-Managed Filescreate pluggable database x2 from x;
问题s : 如何拔出一个pdb? alter pluggable database x unplug into '/some_directory/x_description.xml' ; INTO后面指向 一个绝对目录,会写出描述PDB的XML 问题s : 如何增加或修改 user-managed service? srvctl add service … –pdb <pdb_name> 问题s : 如何查看某个服务是否加入了某个pluggable database? 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 问题: 我的pluggable database的alert log在哪里? 所有的PDB都只有一份alert log ,XML版和TEXT文本版的告警日志在12c中仍同时存在,具体可以参考 V$DIAG_INFO视图 问题: 我的pluggable database的trace file在哪里? 所有的PDB的trace文件一样存放在container database的DIAG TRACE目录下 具体可以参考V$DIAG_INFO视图 问题: 在Oracle标准版standard edition中多租户选项是否可用? 是的,但是在一个CDB里你只能建一个PDB 问题: 事务内否在PDB之间跨越? 不能,虽然可以在启动一个事务后 使用"alter session set container"在PDB之间切换,但仅有select 查询允许在第二PDB中操作。原事务被保留,用户仍可以切换到原来的PDB并commit或者rollback。 问题: 在PDB中如果有一个用户定义的common user创建了对象,之后这个PDB 被拔出了,并插入到另一个CDB中,且该CDB中不存在该common user, 则如何? 如果用户将一个包含common user的PDB插入到一个CDB中,则将发生如下情况: 在PDB中的common user 账号丢失commonly赋予的权限,包括SET CONTAINER这个权限。 如果目标CDB中含有与 该common user账号一样名字的common user账号,则新的common user将被合并到目标库的common user。并采用目标CDB common user的密码。 否则在新的插入的PDB中的common user将被锁住locked。 在此情况下,用户可以选择: 保持该账号被锁,并使用其名下的对象 使用Oracle Data Pump将数据复制到别的schema 下,并删除源账号 关闭PDB,并连接到ROOT,并创建一个与被锁定的账号同名的 common user。当重新打开PDB时,Oracle自动会将必要的commonly 角色和权限赋予给锁定的用户。 之后用户可以解锁PDB中的账号,本地授予的权限和角色保持不变。 问题: 12c中的Flex ASM是什么东西? Oracle Flex ASM是指在集群中以预定义的基数数量运行的ASM实例。默认的基数cardinality是3,用户可以通过srvctl modify asm来修改该基数。 换句话说,ASM不需要运行在集群中的每一个节点上。 在之前的版本中,ASM运行在集群的每一个节点上,ASM的客户程序例如database、ACSF、ADVM均只能访问本地主机上的ASM实例。 通过Oracle Flex ASM, 客户程序可以通过网络连接(例如ASM network)远程ASM实例。 如果运行着一个ASM的主机宕了,Oracle Clusterware会在别的服务器上启动一个ASM实例,以便维持基数。 如果一个12c的数据库使用某个特定的ASM实例,当该ASM实例由于服务器crash或者ASM实例奔溃而不可用,则Oracle 12c数据库实例将重新连接到现有运行的其他ASM实例中。 该特性统称Oracle Flex ASM。 问题: Oracle Flex Cluster和Oracle Flex ASM有什么区别? Oracle Flex Cluster是将集群中的节点分为 Hub和Leaf 节点。 仅仅有Hub Node可以直接访问OCR和VoteDisk, Leaf node不能直接访问共享存储。 Flex Cluster需要Flex ASM,而Flex ASM不需要Flex Cluster。 在Flex Cluster节点中,Flex ASM运行在HUB node上并服务于Flex Cluster中的其他HUB node上的应用。 默认情况下不启用Flex Cluster,需要用户显式地自行启用。 问题: 什么是ASM Network和ASM listener? 在12c之前, Oracle 集群软件要求一个公用网络以便客户端访问 和 一个私有网络以便节点之间通信,并包括了ASM的节点之间通信。 在Flex ASM中,ASM network提供分离ASM内部网络流量的功能,以便其独享一个私有网络。OUI安装界面上会让DBA选择是否为ASM使用独占的网络。 ASM network是数据库与ASM以及ASM与ASM之间通信的通路,其主要流量应当是一些文件extent map类的元数据信息。基于用户的选择,ASM 私有网络可以为ASM通信而独占,也可以与CSS服务共享。 在Flex ASM运行的节点上将有本地ASM监听运行。 ASM的客户端透过3个ASM监听获得endpoint信息并通过ASM network连接到Flex ASM。ASM集群的负载应当是均衡的。 问题: 如何启用Flex ASM特性? 以以下2种途径启用Flex ASM 纯12c Flex ASM,该模式下Grid Infrastructure 和数据库均运行12c版本,这样database数据库将充分利用12c系特性 与12c之前的版本混合使用 ,该模式下为了支持12c之前的数据库,ASM需要运行每一个节点上。 只需要设置ASM cardinality为ALL即可保证ASM运行在集群中的每一个节点上。 这种方式的优势是如果12c的数据库实例丢失与ASM实例的连接,则数据库连接将切换到另一个服务器上的另一个ASM实例。 问题: 如何检查Oracle Flex ASM是否启用了? ASMCMD> showclustermode ASM cluster : Flex mode enabled ASMCMD> showclusterstate Normal 问题:如何修改集群中ASM实例启动的数量,基数cardinality? [root@ol6r02 bin]# ./srvctl modify asm -count 1 [root@ol6r02 bin]# ./srvctl config asm ASM home: /u01/app/12.1.0/grid Password file: +DATA/orapwASM ASM listener: LISTENER ASM instance count: 1 Cluster ASM listener: ASMNET1LSNR_ASM 问题: 如何重定位数据库到其他ASM? 如果ASM实例奔溃,客户程序将自动重定位到可用ASM实例,并保证连接是负载均衡的。 也可以手动来重定位: ALTER SYSTEM RELOCATE CLIENT SQL> ALTER SYSTEM RELOCATE CLIENT '<instance_name>:<db_name>'; — Query GV$ASM_CLIENT to determine instance_name and db_name. 问题: 如何检查ASM实例运行在哪几个节点上? $ srvctl status asm -detail ASM is running on ol6r01,ol6r02 ASM is enabled 问题:如何非Flex ASM切换到 Flex ASM 可以使用asmca图形界面 或者 静默模式[oracle@ol6r01 ~]$ asmca -silent -convertToFlexASM -asmNetworks eth1/10.154.138.0 -asmListenerPort 1521 To complete ASM conversion, run the following script as privileged user in local node. /u01/app/oracle/cfgtoollogs/asmca/scripts/converttoFlexASM.sh CRS-2673: Attempting to stop 'ora.crsd' on 'ol6r01' CRS-2790: Starting shutdown of Cluster Ready Services-managed resources on 'ol6r01' CRS-2673: Attempting to stop 'ora.LISTENER_SCAN2.lsnr' on 'ol6r01' CRS-2673: Attempting to stop 'ora.LISTENER_SCAN3.lsnr' on 'ol6r01' CRS-2673: Attempting to stop 'ora.DATA.dg' on 'ol6r01' CRS-2673: Attempting to stop 'ora.LISTENER.lsnr' on 'ol6r01' CRS-2673: Attempting to stop 'ora.cvu' on 'ol6r01' CRS-2677: Stop of 'ora.LISTENER_SCAN2.lsnr' on 'ol6r01' succeeded CRS-2673: Attempting to stop 'ora.scan2.vip' on 'ol6r01' CRS-2677: Stop of 'ora.LISTENER.lsnr' on 'ol6r01' succeeded CRS-2673: Attempting to stop 'ora.ol6r01.vip' on 'ol6r01' CRS-2677: Stop of 'ora.LISTENER_SCAN3.lsnr' on 'ol6r01' succeeded CRS-2673: Attempting to stop 'ora.scan3.vip' on 'ol6r01' CRS-2677: Stop of 'ora.cvu' on 'ol6r01' succeeded CRS-2672: Attempting to start 'ora.cvu' on 'ol6r02' CRS-2676: Start of 'ora.cvu' on 'ol6r02' succeeded CRS-2677: Stop of 'ora.scan2.vip' on 'ol6r01' succeeded CRS-2672: Attempting to start 'ora.scan2.vip' on 'ol6r02' CRS-2677: Stop of 'ora.scan3.vip' on 'ol6r01' succeeded CRS-2672: Attempting to start 'ora.scan3.vip' on 'ol6r02' CRS-2676: Start of 'ora.scan2.vip' on 'ol6r02' succeeded CRS-2672: Attempting to start 'ora.LISTENER_SCAN2.lsnr' on 'ol6r02' CRS-2677: Stop of 'ora.ol6r01.vip' on 'ol6r01' succeeded CRS-2672: Attempting to start 'ora.ol6r01.vip' on 'ol6r02' CRS-2676: Start of 'ora.scan3.vip' on 'ol6r02' succeeded CRS-2672: Attempting to start 'ora.LISTENER_SCAN3.lsnr' on 'ol6r02' CRS-2676: Start of 'ora.ol6r01.vip' on 'ol6r02' succeeded CRS-2672: Attempting to start 'ora.storage' on 'ol6r02' CRS-2676: Start of 'ora.storage' on 'ol6r02' succeeded + echo 'Cluster bounced in node ol6r02' Cluster bounced in node ol6r02 ASMCMD> showclustermode ASM cluster : Flex mode enabled ASMCMD> showclusterstate Normal