适用于: 企业版数据库——版本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的克隆是很难的。
时间: 2024-10-06 11:57:06