第十五章:Oracle 12c介绍

点击数:2208发布日期:2020-04-19 15:24:43 来源:老鹰

第十五章:Oracle 12c介绍

15.1 Oracle 简介

    Oracle Database 12c 简介

2013626日,Oracle Database 12c版本正式发布,Oracle数据库12c 引入了一个新的多承租方架构,使用该架构可轻松部署和管理数据库云。此外,一些创新特性可最大限度地提高资源使用率和灵活性,如Oracle Multitenant可快速整合多个数据库,而Automatic Data OptimizationHeat Map能以更高的密度压缩数据和对数据分层。这些独一无二的技术进步再加上在可用性、安全性和大数据支持方面的主要增强,使得Oracle数据库12c 成为私有云和公有云部署的理想平台。

Oracle 12c增加了500多项新功能,其新特性主要涵盖了六个方面:云端数据库整合的全新多租户架构、数据自动优化、深度安全防护、面向数据库云的最大可用性、高效的数据库管理以及简化大数据分析。可插播数据库允许我们将数百个数据库整合到一个能够确保独立性的RAC环境,而之前我们必须将其放在单独的服务器上。毫无疑问,Oracle Database 12c最吸引人的特性就是支持整合。可插拔数据库可以共享内存资源,由于这些数据库仍旧是单个数据库实例,因此能够简化管理。


15.2 Oracle 12c 体系结构


    上图为Oracle 12c Pluggable Database的体系结构示意图,在Oracle 12c中引入了CDBPDB的新特性,在Oracle 12c数据库引入的多租用户环境(Multitenant Environment)中,允许一个数据库容器(CDB)承载多个可插拔数据库(PDB)。CDB全称为Container Database,即数据库容器,PDB全称为Pluggable Database,即可插拔数据库。在Oracle 12c之前,实例与数据库是一对一或多对一关系(RAC):即一个实例只能与一个数据库相关联,而实例与数据库不可能是一对多的关系。当进入Oracle 12c后,可插拔数据库的引入,使实例与数据库可以是一对多的关系。

    Pluggable Database 体系结构主要组成是:由一个容器数据库(CDB)和多个可插拔数据库(PDB)组成,PDB包含独立的system表空间和sysaux表空间等,所有PDB共享CDB的控制文件、日志文件和undo表空间。各个PDB之间互相是独立的,它们之间互相访问需要通过DB Link

15.3 Oracle 12c 新特性介绍

    Pluggable Databases 可插拔数据库:

一个容器数据库(container database)中可以存放多个Pluggable Databases

•对于外部应用程序和开发者来说Pluggable Databases看上去就是一个普通的版本12.1之前的数据库

•用户连接到Pluggable Databases时看到的是一个单一数据库。


新的管理模式

•数据库管理员DBA可以连接到Pluggable Database并仅仅管理该数据库

•超级DBA可以连接到容器数据库并如同管理单系统镜像那样管理

•RAC中的每一个实例均打开容器数据库并可以选择打开哪些Pluggable Database


内建的多分租(Multi-tenancy)

•每个Pluggable Database均独立于其他Pluggable Database

•Resource Manager特性被扩展到Pluggable Database中


Pluggable Databases特性可以带来的好处:

•加速重新部署现有的数据库到新的平台的速度

•加速现有数据库打补丁和升级的速度

•从原有的DBA的职责中分离部分责任到应用管理员

•集中式管理多个数据库

•提升RAC的扩展性和故障隔离

•与Oracle SQL Developer 和Oracle Enterprise Manager高度融合

   

1 .  创建一个新的pdb

SQL> select * from v$version;


 BANNER                                                                               CON_ID

 -------------------------------------------------------------------------------- ----------

 Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production              0

 PL/SQL Release 12.1.0.2.0 - Production                                                    0

 CORE 12.1.0.2.0 Production                                                                0

 TNS for Linux: Version 12.1.0.2.0 - Production                                            0

 NLSRTL Version 12.1.0.2.0 - Production                                                    0


 SQL> select sys_context('userenv','con_name') from dual;

 SYS_CONTEXT('USERENV','CON_NAME')

--------------------------------------------------------------------------------------------

 CDB$ROOT


 SQL> select con_id,dbid,con_uid,guid,name,open_mode,create_scn,total_size,block_size from v$pdbs;


     CON_ID       DBID    CON_UID GUID                             NAME         OPEN_MODE  CREATE_SCN TOTAL_SIZE BLOCK_SIZE

 ---------- ---------- ---------- -------------------------------- ------------ ---------- ---------- ---------- ----------

          2 4264868981 4264868981 0951B9CFB39C2060E0530100007F6961 PDB$SEED     READ ONLY     1594434  870318080       8192

          3 3977202490 3977202490 09521ABB982E7F0BE0530100007FD46A XJNY         READ WRITE    1753354  917504000       8192


--创建一个新PDB 

 SQL> create pluggable database wapdb admin user wapadmin identified by  wapadmin ;


 Pluggable database created.


 SQL> select con_id,dbid,con_uid,guid,name,open_mode,create_scn,total_size,block_size from v$pdbs;


     CON_ID       DBID    CON_UID GUID                             NAME       OPEN_MODE  CREATE_SCN TOTAL_SIZE BLOCK_SIZE

 ---------- ---------- ---------- -------------------------------- ---------- ---------- ---------- ---------- ----------

          2 4264868981 4264868981 0951B9CFB39C2060E0530100007F6961 PDB$SEED   READ ONLY     1594434  870318080       8192

          3 3977202490 3977202490 09521ABB982E7F0BE0530100007FD46A XJNY       READ WRITE    1753354  917504000       8192

          4 4211777660 4211777660 0986C60CA76145FDE0530100007F304E WAPDB      MOUNTED       1896905          0       8192



2. 克隆一个新的pdb

SQL> create pluggable database mbs from wapdb;

 create pluggable database mbs from wapdb

 *

 ERROR at line 1:

 ORA-65139: Mismatch between XML metadata file and data file

 /home/db/oracle/oradata/SMS/0986C60CA76145FDE0530100007F304E/datafile/o1_mf_system_b856b39h_.dbf for value of fcpsb (1897165 in the

 plug XML file, 1904147 in the data file)



尝试将wapdbread only模式打开

SQL> alter session set container=wapdb;


 Session altered.


 SQL> alter database open read only;


 Database altered.


 SQL> alter session set container=cdb$root;


 Session altered.


 SQL> select sys_context('userenv','con_name') from dual;


 SYS_CONTEXT('USERENV','CON_NAME')

 -------------------------------------------------------------------------------------------------------------------------------

 CDB$ROOT


 SQL> create pluggable database mbs from wapdb;


 Pluggable database created.


 SQL> alter pluggable database mbs open;


 Warning: PDB altered with errors.


 SQL> select con_id,dbid,con_uid,guid,name,open_mode,create_scn,total_size,block_size from v$pdbs;


     CON_ID       DBID    CON_UID GUID                             NAME       OPEN_MODE  CREATE_SCN TOTAL_SIZE BLOCK_SIZE

 ---------- ---------- ---------- -------------------------------- ---------- ---------- ---------- ---------- ----------

          2 4264868981 4264868981 0951B9CFB39C2060E0530100007F6961 PDB$SEED   READ ONLY     1594434  870318080       8192

          3 3977202490 3977202490 09521ABB982E7F0BE0530100007FD46A XJNY       READ WRITE    1753354  917504000       8192

          4 4211777660 4211777660 0986C60CA76145FDE0530100007F304E WAPDB      READ ONLY     1896905  870318080       8192

          5 1281880106 1281880106 0987D2D2C15B4758E0530100007F4AA4 MBS        READ WRITE    1905674  891289600       8192

可见,在克隆pdb时,需要将源pdb已read only模式打开


3. 将pdb plug到新的cdb中

1.在源数据库创建pdbxml文件

begin

   dbms_pdb.describe(

     pdb_descr_file => '/home/oracle/xjny.xml',

     pdb_name       => 'XJNY');

 end;

 /

 2.在目标数据库检查pdbxml是否与目标库兼容

set serveroutput on

 declare

   compatible constant varchar2(3) :=

     case dbms_pdb.check_plug_compatibility(

            pdb_descr_file => '/home/oracle/xjny.xml',

            pdb_name       => 'SALESPDB')

     when true then 'YES'

     else 'NO'

 end;

 begin

   dbms_output.put_line(compatible);

 end;

 /

 3. 将pdb数据库plug到新的cdb中,在新cdb中执行

create pluggable database ebs using '/home/oracle/xjny.xml'

   nocopy

   tempfile reuse;

 4.打开新的pdb

 alter pluggable database ebs open;


4. 将pdb从cdb中unplug

SQL> alter pluggable database ebs close;


 Pluggable database altered.


 SQL> alter pluggable database ebs unplug into '/home/oracle/ebs.xml';


 Pluggable database altered.


 SQL> select pdb_id,pdb_name,dbid,con_uid,status,con_id from dba_pdbs;


     PDB_ID PDB_NAME         DBID    CON_UID STATUS        CON_ID

 ---------- ---------- ---------- ---------- --------- ----------

          3 XJNY       3977202490 3977202490 NORMAL             3

          2 PDB$SEED   4264868981 4264868981 NORMAL             2

          4 WAPDB      4211777660 4211777660 NORMAL             4

          5 MBS        1281880106 1281880106 NORMAL             5

          6 EBS        1440704945 1440704945 UNPLUGGED          6


如果不再需要pdb,或者要将pdb plug到新的cdb中,需要drop cdb


 SQL> drop pluggable database ebs including datafiles;


 Pluggable database dropped.


 SQL> select pdb_id,pdb_name,dbid,con_uid,status,con_id from dba_pdbs;


     PDB_ID PDB_NAME         DBID    CON_UID STATUS        CON_ID

 ---------- ---------- ---------- ---------- --------- ----------

          3 XJNY       3977202490 3977202490 NORMAL             3

          2 PDB$SEED   4264868981 4264868981 NORMAL             2

          4 WAPDB      4211777660 4211777660 NORMAL             4

          5 MBS        1281880106 1281880106 NORMAL             5


    在线重命名和重新定位活跃数据文件

    不同于以往的版本,在Oracle数据库12c R1版本中对数据文件的迁移或重命名不再需要太多繁琐的步骤,即把表空间置为只读模式,接下来是对数据文件进行离线操作。在12c R1中,可以使用alter database move datafile这样的SQL语句对数据文件进行在线重命名和移动。而当此数据文件正在传输时,终端用户可以执行查询,DML以及DDL方面的任务。另外,数据文件可以在存储设备间迁移,如从非ASM迁移至ASM,反之亦然。


重命名数据文件:

SQL> alter database move datafile '/home/db/oracle/oradata/yingsu1/users01.dbf' to '/home/db/oracle/oradata/yingsu2/users_01.dbf';


从非ASM迁移数据文件至ASM:

SQL> alter database move datafile '/home/db/oracle/oradata/yingsu/users_01.dbf' to '+DG_DATA';


将数据文件从一个ASM磁盘群组迁移至另一个ASM磁盘群组:

SQL> alter database move datafile '+data/yingsu/datafile/users_01.dbf ' to '+DATA02';


在数据文件已存在于新路径的情况下,以相同的命名将其覆盖:

SQL> alter database move datafile '/home/db/oracle/oradata/yingsu/users_01.dbf' to '/home/db/oracle/oradata/yingsu2/users_01.dbf' reuse;


复制文件到一个新路径,同时在原路径下保留其拷贝:

SQL> alter database move datafile '/home/db/oracle/oradata/yingsu/users_01.dbf' to '/home/db/oracle/oradata/yingsu2/users_01.dbf' keep;


  可以通过查询v$session_longops来监控这一过程。另外,也可以通过查看alert日志来查看。

    表分区或子分区的在线迁移

   在Oracle 12c之前,如果需要在线移动分区表的分区到不同表空间,需要采用在线重定义的方式,操作步骤比较繁琐,在Oracle 12c中,可以采用在线move的方式来移动分区到新的分区表中。

SQL> alter table t_yingsu move partition|subpartition partition_name to tablespace tbs_yingsu;

SQL> alter table t_yingsu move partition|subpartition partition_name to tablespace tbs_yingsu update indexes online;

  第一个命令是用来在offline状态下将一个表分区或子分区迁移至一个新的表空间。第二个命令通过加上update indexes和online命令,可以在线进行操作并维护表上任何本地或全局的索引,不阻塞其他session对该表的DML操作。


   不可见字段

  在Oracle 11g R1中,Oracle引入了不可见索引和虚拟字段,而在Oracle 12c R1中引入了不可见字段。在之前的版本中,为了隐藏重要的数据字段以避免在通用查询中显示,我们往往会创建一个视图来隐藏所需信息或应用某些安全条件。

  在12c 中,你可以在表中创建不可见字段。当一个字段定义为不可见时,这一字段就不会出现在通用查询中,除非在SQL语句或条件中有显式的提及这一字段,或是在表定义中有described。

SQL> create table t_yingsu(yno number(6), name name varchar2(40), sal number(9) invisible);

SQL> alter table t_yingsu modify (sal visible);

  你必须在insert语句中显式提及不可见字段名以将不可见字段插入到数据库中。虚拟字段和分区字段同样也可以定义为不可见类型。但临时表、外部表和集群表并不支持不可见字段。

   DDL日志

Oracle 12c之前的版本中没有方法对DDL操作进行日志记录。而在12c中,你可以将DDL操作写入xml和日志文件中。这对于了解谁在什么时间执行了createdrop之类的命令是十分有用的。要开启这一功能必须对enable_ddl_logging 初始参数加以配置。这一参数可以在数据库或会话级加以设置。当此参数为启用状态,所有的DDL命令会记录在$ORACLE_BASE/diag/rdbms/DBNAME/log|ddl 路径下的xml和日志文件中。一个xml中包含DDL命令,IP地址,时间戳等信息。这可以帮助确定在什么时候对用户或表进行了删除亦或是一条DDL语句在何时触发。

开启DDL日志功能

SQL> alter system|session set enable_ddl_logging=true;

以下的DDL语句会记录在xml或日志文件中:

create|alter|drop|truncate table

drop user

create|alter|drop package|function|view|synonym|sequenc

   如何在RMAN中执行SQL语句

在12c中,你可以在不需要SQL前缀的情况下在RMAN中执行任何SQL和PL/SQL命令,即你可以从RMAN直接执行任何SQL和PL/SQL命令。如下:

RMAN> select username,machine from v$session; 

RMAN> alter tablespace users  add datafile size 500m;

   RMAN中的表恢复和分区恢复

    Oracle数据库备份主要分为两类:逻辑和物理备份。每种备份类型都有其自身的优缺点。在之前的版本中,利用现有物理备份来恢复表或分区是不可行的。为了恢复特定对象,逻辑备份是必需的。对于12c ,你可以在发生drop或truncate的情况下从RMAN备份将一个特定的表或分区恢复到某个时间点或SCN。

  当通过RMAN发起一个表或分区恢复时,大概流程是这样的:

  •确定要恢复表或分区所需的备份集

  •在一个临时辅助数据库中设置恢复到某个时间点

  •利用数据泵将所需表或分区导出到一个dumpfile

  •你可以从源数据库导入表或分区(可选)

  •在恢复过程中进行重命名操作

  以下是一个通过RMAN对表进行时间点恢复的示例(确保你已经对稍早的数据库进行了完整备份):

RMAN> connect target "username/password as sysbackup";

RMAN> recover table username.tablename until time 'TIMESTAMP…'

auxiliary destination '/home/db/oracle/oradata/yingsu/tablerecovery'

datapump destination '/home/db/oracle/oradata/yingsu /dpump'

dump file 'tablename.dmp'

notableimport -- this option avoids importing the table automatically.(此选项避免自动导入表)

remap table 'username.tablename': 'username.new_table_name'; -- can rename table with this option.(此选项可以对表重命名)


  注意事项:

  •确保对于辅助数据库在/u01文件系统下有足够的可用空间,同时对数据泵文件也有同样保证

  •必须要存在一份完整的数据库备份,或者至少是要有system相关的表空间备份


  在RMAN中应用表或分区恢复的限制和约束:

  •sys用户表或分区无法恢复

  •存储于sysaux和system表空间下的表和分区无法恢复

  •当remap选项用来恢复的表包含not null约束时,恢复此表是不可行的

   临时undo

  在Oracle 12c R1之前,undo记录是存储在undo表空间中的,在12c R1中引入了临时undo功能,那些临时undo记录现在就可以存储在临时表中,而不是存储在undo表空间中。临时undo的主要好处在于:由于undo记录不会写入undo日志,undo表空间的开销减少并且产生的undo数据会更少。可以选择在会话级或数据库级开启临时undo功能。

    要使用这一新功能,需要做以下设置:

  •兼容性参数必须设置为12.0.0或更高

  •启用 temp_undo_enabled 初始化参数

  •由于临时undo记录现在是存储在一个临时表空间中的,你需要有足够的空间来创建这一临时表空间

  •对于会话级,你可以使用:alter system set temp_undo_enable=true;

查询临时undo信息

以下所列的字典视图是用来查看或查询临时undo数据相关统计信息的:

•v$tempundostat

•dba_hist_undostat

•v$undostat

要禁用此功能,你只需做以下设置:

SQL> alter system|session set temp_undo_enabled=false;


   限制PGA的大小

  在Oracle 12c R1之前,对单个session使用的PGA大小没有公开的参数来硬性限制。当你设置pga_aggregate_target参数后,Oracle会根据工作负载和需求来动态地增大或减小PGA的大小。而在12c中,你可以通过开启自动PGA管理来对PGA设定硬性限制,这需要对pga_aggregate_limit 参数进行设置。通过该参数来对PGA设定硬性限制以避免过度使用PGA。

SQL> alter system set pga_aggregate_limit=2g;

SQL> alter system set pga_aggregate_limit=0; --disables the hard limit

  重要提示:

  当超过了当前PGA的限制,Oracle会自动终止/中止会话或进程以保持最合适的PGA内存。

下一篇:序言

上一篇:第十四章:常用Oracle工具

图文推荐