国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > 数据库 > 数据库应用 > Oracle 数据库12c 16大新特性总结

Oracle 数据库12c 16大新特性总结

来源:程序员人生   发布时间:2016-06-03 13:09:26 阅读次数:3587次

Oracle 12c 已发布很久,1直想找个时间好好学习1下,毕竟后续12c将会逐步替换现有数据库版本,成为主流数据库版本。现就12c 1些经常使用的

特性给大家1起学习1下。

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

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

重命名数据文件:
          SQL> ALTER DATABASE MOVE DATAFILE '/u00/data/users01.dbf' TO '/u00/data/users_01.dbf';
从非ASM迁移数据文件至ASM:
         SQL> ALTER DATABASE MOVE DATAFILE '/u00/data/users_01.dbf' TO '+DG_DATA';
将数据文件从1个ASM磁盘群组迁移至另外一个ASM磁盘群组
         SQL> ALTER DATABASE MOVE DATAFILE '+DG_DATA/DBNAME/DATAFILE/users_01.dbf ' TO '+DG_DATA_02';

在数据文件已存在于新路径的情况下,以相同的命名将其覆盖:
         SQL> ALTER DATABASE MOVE DATAFILE '/u00/data/users_01.dbf' TO '/u00/data_new/users_01.dbf' REUSE;
复制文件到1个新路径,同时在原路径下保存其拷贝:
         SQL> ALTER DATABASE MOVE DATAFILE '/u00/data/users_01.dbf' TO '/u00/data_new/users_01.dbf' KEEP;
当通过查询v$session_longops动态视图来移动文件时,你可以监控这1进程。另外,你也能够援用alert.log,Oracle会在其中记录具体的行动。

2. 表分区或子分区的在线迁移
  在Oracle 12c R1中迁移表分区或子分区到不同的表空间不再需要复杂的进程。与之前版本中未分区表进行在线迁移
类似,表分区或子分区可以在线或是离线迁移至1个不同的表空间。当指定了ONLINE语句,所有的DML操作可以在没有
任何中断的情况下,在参与这1进程的分区或子分区上履行。与此相反,分区或子分区迁移如果是在离线情况下进行
的,DML操作是不被允许的。

示例:
SQL>
ALTER TABLE TBCS.SUBS_PRIVILEGE   MOVE SUBPARTITION P_532_SUBP01   TABLESPACE GGUSR;
SQL>
ALTER TABLE TBCS.SUBS_PRIVILEGE   MOVE SUBPARTITION P_532_SUBP01   TABLESPACE GGUSR UPDATE INDEXES ONLINE;
  第1个示例是用来在离线状态下将1个表分区或子分区迁移至1个新的表空间。第2个示例是在线迁移表分区或子
分区并保护表上任何本地或全局的索引。另外,当使用ONLINE语句时,DML操作是不会中断的。

重要提示:
  1、UPDATE INDEXES语句可以免出现表中任何本地或全局索引没法使用的情况。
  2、表的在线迁移限制也适用于此。
  3、引入加锁机制来完成这1进程,固然它也会致使性能降落并会产生大量的redo,这取决于分区和子分区的大小。

3. 不可见字段

  Oracle 11g R1中,Oracle以不可见索引和虚拟字段的情势引入了1些不错的增强特性。继承前者并发扬光大,Oracle 12c R1中

引入了不可见字段思想。在之前的版本中,为了隐藏重要的数据字段以免在通用查询中显示,我们常常会创建1个视图来隐藏所需信

息或利用某些安全条件。
  在12c R1中,你可以在表中创建不可见字段。当1个字段定义为不可见时,这1字段就不会出现在通用查询中,除非在SQL语句或

条件中有显式的提及这1字段,或是在表定义中有DESCRIBED。要添加或是修改1个不可见字段是非常容易的,反之亦然。

SQL> CREATE TABLE emp (eno number(6), ename name varchar2(40), sal number(9) INVISIBLE);
SQL> ALTER TABLE emp MODIFY (sal visible);
  
你必须在INSERT语句中显式提及不可见字段名以将不可见字段插入到数据库中。虚拟字段和分区字段一样也能够定义为不可见类型。

但临时表,外部表和集群表其实不支持不可见字段。

4. 相同字段上的多重索引
  在Oracle 12c R1之前,1个字段是没法以任何情势具有多个索引的。也许有人会想知道为何通常1个字段需要有多重索引,事实上

需要多重索引的字段或字段集合是很多的。在12c R1中,只要索引类型的情势不同,1个字段就能够包括在1个B-tree索引中,一样也能够

包括在Bitmap索引中。注意,只有1种类型的索引是在给定时间可用的。

       sql> create index xulq.idx_xiaoxu_tabname1 on xulq.xiaoxu_01 (table_name) tablespace users;   ---索引可以创建
       sql> create bitmap index xulq.bitidx_xiaoxu_tabname on xulq.xiaoxu_01 (table_name) tablespace users;  

           ---ORA-01408: 此列列表已索引 ,正在分析缘由。

5. DDL日志
  在之前的版本中没有可选方法来对DDL操作进行日志记录。而在12c R1中,你现在可以将DDL操作写入xml和日志文件中。这对了解

谁在甚么时间履行了create或drop命令是10分有用的。要开启这1功能必须对ENABLE_DDL_LOGGING 初始参数加以配置。这1参数可以

数据库或会话级加以设置。当此参数为启用状态,所有的DDL命令会记录在

$ORACLE_BASE/diag/rdbms/DBNAME/log|ddl 路径下的xml和日志文件中。1个xml中包括DDL命令,IP地址,时间戳等信息。这可以帮助

肯定在甚么时候对用户或表进行了删除亦或是1条DDL语句在什么时候触发。

开启DDL日志功能
SQL> ALTER SYSTEM|SESSION SET ENABLE_DDL_LOGGING=TRUE;  ----SYSTEM 级别的修改无需重启数据库便可生效。

以下的DDL语句可能会记录在xml或日志文件中:
CREATE | ALTER | DROP | TRUNCATE TABLE
DROP USER
CREATE |ALTER | DROP  PACKAGE |FUNCTION | VIEW | SYNONYM | SEQUENCE.

示例:

sql> CREATE TABLE XULQ.XIAOXU_DDL_T AS SELECT * FROM DUAL;

DDL LOG 日志:

[oracle@ora12c ddl]$ cat log.xml
<msg time='2016-05⑵6T22:21:10.333+08:00' org_id='oracle' comp_id='rdbms'
 msg_id='kpdbLogDDL:18370:2946163730' type='UNKNOWN' group='diag_adl'
 level='16' host_id='ora12c' host_addr='127.0.0.1'
 version='1'>
 <txt>CREATE TABLE XULQ.XIAOXU_DDL_T AS SELECT * FROM DUAL
 </txt>

6. 临时undo
  
每一个Oracle数据库包括1组与系统相干的表空间,例如SYSTEM,SYSAUX,UNDO & TEMP,并且它们在Oracle
据库中每一个都用于不同的目的。在Oracle 12c R1之前,undo记录是由临时表产生并存储在undo表空间中的,这更类似
于1个通用或持久的表撤消记录。但是,由于在12c R1中引入了临时undo功能,那些临时undo记录现在就能够存储在
临时表中,而不是存储在undo表空间中。临时undo的主要好处在于:由于信息不会写入undo日志,undo表空间的开消
得以减少并且产生的undo数据会更少。而对在会话级还是数据库级开启临时undo功能你是可以灵活选择的。

启用临时undo功能要使用这1新功能,需要做以下设置:
1、兼容性参数必须设置为12.0.0或更高
2、启用 TEMP_UNDO_ENABLED 初始化参数
3、由于临时undo记录现在是存储在1个临时表空间中的,你需要有足够的空间来创建这1临时表空间
4、对会话级,你可使用: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;


7. 备份特定用户特权
  在11g R2中,引入了SYSASM特权来履行ASM的特定操作。一样地,在12c中引入了SYSBACKUP特权用来在
RMAN中履行备份和恢复命令。因此,你可以在数据库中创建1个本地用户并在不授与其SYSDBA权限的情况下,通过
授与SYSBACKUP权限让其能够在RMAN中履行备份和恢复相干的任务。
$ ./rman target "username/password as SYSBACKUP"

8. 如何在RMAN中履行SQL语句

   在12c中,你可以在不需要SQL前缀的情况下在RMAN中履行任何SQL和PL/SQL命令,即你可以从RMAN直接履行
任何SQL和PL/SQL命令。以下便是在RMAN中履行SQL语句的示例:
RMAN> SELECT username,machine FROM v$session;
RMAN> ALTER TABLESPACE users ADD DATAFILE SIZE 121 m;

9. RMAN中的表恢复和分区恢复

  Oracle数据库备份主要分为两类:逻辑和物理备份。每种备份类型都有其本身的优缺点。在之前的版本中,利用现
有物理备份来恢复表或分区是不可行的。为了恢复特定对象,逻辑备份是必须的。对12c R1,你可以在产生drop或
truncate的情况下从RMAN备份将1个特定的表或分区恢复到某个时间点或SCN。
当通过RMAN发起1个表或分区恢复时,大概流程是这样的:
1、肯定要恢复表或分区所需的备份集
2、在恢复表或分区的进程中,1个辅助数据库会临时设置为某个时间点
3、利用数据泵将所需表或分区导出到1个dumpfile
4、你可以从源数据库导入表或分区(可选)
5、在恢复进程中进行重命名操作
  
以下是1个通过RMAN对表进行时间点恢复的示例(确保你已对稍早的数据库进行了完全备份):
RMAN> connect target "username/password as SYSBACKUP";
RMAN> RECOVER TABLE username.tablename UNTIL TIME 'TIMESTAMP…'
AUXILIARY DESTINATION '/u01/tablerecovery'
DATAPUMP DESTINATION '/u01/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.
(此选项可以对表重命名)
重要提示:
1、确保对辅助数据库在/u01文件系统下有足够的可用空间,同时对数据泵文件也有一样保证
2、必须要存在1份完全的数据库备份,或最少是要有SYSTEM相干的表空间备份

以下是在RMAN中利用表或分区恢复的限制和束缚:
1、SYS用户表或分区没法恢复
2、存储于SYSAUX和SYSTEM表空间下的表和分区没法恢复
3、当REMAP选项用来恢复的表包括NOT NULL束缚时,恢复此表是不可行的

10. 限制PGA的大小
  在Oracle 12c R1之前,没有选项可以用来限制和控制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内存。

11. 对表分区保护的增强

  在第1部份中,我解释了如何在线或是离线状态下迁移1个表分区或子分区到另外一个不同的表空间。在本文中,主
要介绍表分区其他方面的改进。
11.1、添加多个新分区
  在Oracle 12c R1之前,1次只可能添加1个新分区到1个已存在的分区表。要添加1个以上的新分区,需要对每一个
新分区都单独履行1次 ALTER TABLE ADD PARTITION语句。而Oracle 12c只需要使用1条单独的:ALTER TABLE ADD
PARTITION 命令就能够添加多个新分区,这增加了数据库灵活性。以下示例说明了如何添加多个新分区到已存在的分区

创建测试表:
SQL> CREATE TABLE emp_part
(eno number(8), ename varchar2(40), sal number (6))
PARTITION BY RANGE (sal)
(PARTITION p1 VALUES LESS THAN (10000),
PARTITION p2 VALUES LESS THAN (20000),
PARTITION p3 VALUES LESS THAN (30000)
);

添加两个新分区:
SQL> ALTER TABLE emp_part ADD PARTITION p4 VALUES LESS THAN (35000),PARTITION p5 VALUES LESS THAN (40000);
一样,只要MAXVALUE分区不存在,你就能够添加多个新分区到1个列表和系统分区表。
如何删除和截断多个分区/子分区
  作为数据保护的1部份,DBA通常会在1个分区表上进行删除或截断分区的保护任务。在12c R1之前,对1个已
存在的分区表1次只可能删除或截断1个分区。而对Oracle 12c, 可以用单条:

ALTER TABLE table_name{DROP|TRUNCATE} PARTITIONS 命令来撤消或合并多个分区和子分区。

下例说明了如何在1个已存在分区表上删除或截断多个分区:
SQL> ALTER TABLE emp_part TRUNCATE PARTITION p4,p5;
SQL> ALTER TABLE emp_part DROP PARTITIONS p4,p5;

要保持索引更新,使用UPDATE INDEXES或UPDATE GLOBAL INDEXES语句,以下所示:
SQL> ALTER TABLE emp_part DROP PARTITIONS p4,p5 UPDATE GLOBAL INDEXES;
SQL> ALTER TABLE emp_part TRUNCATE PARTITIONS p4,p5 UPDATE GLOBAL INDEXES;
如果你在不使用UPDATE GLOBAL INDEXES 语句的情况下删除或截断1个分区,你可以在USER_INDEXES或
USER_IND_PARTITIONS 字典视图下查询ORPHANED_ENTRIES 字段以找出是不是有索引包括任何的过期条目。
将单个分辨别割为多个新分区
  在12c中新增强的SPLIT PARTITION 语句可让你只使用1个单独命令将1个特定分区或子分辨别割为多个新分
区。下例说明了如何将1个分辨别割为多个新分区:

 SQL> ALTER TABLE emp_part SPLIT PARTITION p_max INTO (PARTITION p3 VALUES LESS THAN (25000),
PARTITION p4 VALUES LESS THAN (30000), PARTITION p_max);
将多个分区合并为1个分区

你可使用单条ALTER TBALE MERGE PARTITIONS 语句将多个分区合并为1个单独分区:
SQL>

CREATE TABLE emp_part
(eno number(8), ename varchar2(40), sal number (6))
PARTITION BY RANGE (sal)
(PARTITION p1 VALUES LESS THAN (10000),
PARTITION p2 VALUES LESS THAN (20000),
PARTITION p3 VALUES LESS THAN (30000),
PARTITION p4 VALUES LESS THAN (40000),
PARTITION p5 VALUES LESS THAN (50000),
PARTITION p_max (MAXVALUE)
);

SQL> ALTER TABLE emp_part MERGE PARTITIONS p3,p4,p5 INTO PARTITION p_merge;
如果分区范围构成序列,你可使用以下示例:
SQL> ALTER TABLE emp_part MERGE PARTITIONS p3 TO p5 INTO PARTITION p_merge;

12. 数据库升级改进

  每当1个新的Oracle版本发布,DBA所要面临的挑战就是升级进程。该部份我将介绍12c中引入的针对升级的两个改
进。
  预升级脚本
  在12c R1中,原本的utlu[121]s.sql 脚本由1个大为改良的预升级信息脚本preupgrd.sql所取代。除预升级检查验
证,此脚本还能以修复脚本的情势解决在升级进程前后出现的各种问题。
  可以对产生的修复脚本加以履行来解决不同级别的问题,例如,预升级和升级后的问题。当手动升级数据库时,脚
本必须在实际升级进程初始化之前加以手动履行。但是,当使用DBUA工具来进行数据库升级时,它会将预升级脚本作为
升级进程的1部份加以自动履行,而且会提示你去履行修复脚本以避免报错。
  如何履行脚本:
SQL> @$ORACLE_12GHOME/rdbms/admin/preupgrd.sql
  以上脚本会产生1份日志文件和1个[pre/post]upgrade_fixup.sql 脚本。所有这些文件都位于
$ORACLE_BASE/cfgtoollogs 目录下。在你继续真实的升级进程之前,你应当阅读日志文件中所提到的建议并履行脚本以修复问题。
  注意:

你要确保将preupgrd.sql和utluppkg.sql 脚本从12c Oracle的目录home/rdbms/admin directory拷贝至当前的Oracle的database/rdbms/admin路径。

并行升级功能


数据库升级时间的长短取决于数据库上所配置的组件数量,而不是数据库的大小。在之前的版本中,我们是没法并行运行升级程序,从而快速完成全部升级进程的。
  在12c R1中,原本的catupgrd.sql 脚本由catctl.pl 脚本(并行升级功能)替换,现在我们可以采取并行模式运行升级程序了。
  以下流程说明了如何初始化并行升级功能(3个进程);你需要在升级模式下在启动数据库后运行这1脚本:
        cd $ORACLE_12_HOME/perl/bin
        $ ./perl catctl.pl –n 3 -catupgrd.sql
  以上两个步骤需要在手动升级数据库时运行。而DBUA也继承了这两个新变化。


13. 通过网络恢复数据文件
  在12c R1中另外一个重要的增强是,你现在可以在主数据库和备用数据库之间用1个服务名重新取得或恢复数据文
件、控制文件、参数文件、表空间或全部数据库。这对同步主数据库和备用数据库极其有用。
  当主数据库和备用数据库之间存在相当大的差异时,你不再需要复杂的前滚流程来弥补它们之间的差异。RMAN能
够通过网络履行备用恢复以进行增量备份,并且可以将它们利用到物理备用数据库。你可以用服务名直接将所需数据文
件从备用点拷贝至主站,这是为了避免主数据库上数据文件、表空间的丢失,或是没有真正从备份集恢复数据文件。
  以下流程演示了如何用此新功能履行1个前滚来对备用数据库和主数据库进行同步:
  在物理备用数据库上:
./rman target "username/password@standby_db_tns as SYSBACKUP"
RMAN> RECOVER DATABASE FROM SERVICE primary_db_tns USING COMPRESSED BACKUPSET;
  以上示例使用备用数据库上定义的primary_db_tns 连接字符串联接到主数据库,然后履行了1个增量备份,再将这
些增量备份传输至备用目的地,接着将利用这些文件到备用数据库来进行同步。但是,需要确保已对primary_db_tns
进行了配置,即在备份数据库端将其指向主数据库
  在以下示例中,我将演示1个场景通过从备用数据库获得数据文件来恢复主数据库上丢失的数据文件:
  在主数据库上:
./rman target "username/password@primary_db_tns as SYSBACKUP"
RMAN> RESTORE DATAFILE ‘+DG_DISKGROUP/DBANME/DATAFILE/filename’ FROM SERVICE standby_db_tns;

14. 对Data Pump的增强
  Data Pump版本有了很多有用的改进,例如在导出时将视图转换为表,和在导入时关闭日志记录等。
  关闭redo日志的生成  Data Pump中引入了新的TRANSFORM选项,这对对象在导入期间提供了关闭重做生成的灵活性。当为
TRANSFORM选项指定了DISABLE_ARCHIVE_LOGGING 值,那末在全部导入期间,重做生成绩会处于关闭状态。这1
功能在导入大型表时减缓了压力,并且减少了过度的redo产生,从而加快了导入。这1属性还可利用到表和索引。以
下示例演示了这1功能:
$ ./impdp directory=dpump dumpfile=abcd.dmp logfile=abcd.log TRANSFORM=DISABLE_ARCHIVE_LOGGING:Y
  将视图转换为表
  这是Data Pump中另外1个改进。有了VIEWS_AS_TABLES 选项,你就能够将视图数据载入表中。以下示例演示了
如何在导出进程中将视图数据载入到表中:
$ ./expdp directory=dpump dumpfile=abcd.dmp logfile=abcd.log views_as_tables=my_view:my_table

15. 实时自动数据诊断监视器 (ADDM) 分析

  通过使用诸如AWR、ASH和ADDM之类的自动诊断工具来分析数据库的健康状态,是每一个DBA日程工作的1部
分。虽然每种工具都可以在多个层面衡量数据库的整体健康状态和性能,但没有哪一个工具可以在数据库反应迟钝或是完
全挂起的时候使用。
  当数据库反应迟钝或是挂起状态时,而且你已配置了Oracle 企业管理器 12c的云控制,你就能够对严重的性能问
题进行诊断。这对你了解当前数据库产生了甚么状态有很大帮助,而且还能够对此问题给出解决方案。
  以下步骤演示了如何在Oracle 企业管理器 12c上分析数据库状态:
  1、在访问数据库访问主页面从Performance菜单选择Emergency Monitoring 选项。这会显示挂起分析表中排名靠前
的禁止会话。
  2、在Performance菜单选择Real-Time ADDM 选项来履行实时ADDM分析。
  3、在搜集了性能数据后,点击Findings标签以取得所有结果的交互总结。

16. 同时在多个表上搜集统计数据
  在之前的Oracle数据库版本中,当你履行1个DBMS_STATS 程序来搜集表、索引、模式或数据库级别的统计数
据时,Oracle习惯于1次1个表的搜集统计数据。如果表很大,那末推荐你采取并行方式。在12c R1中,你现在可以同
时在多个表、分区和子分区上搜集统计数据。在你开始使用它之前,你必须对数据库进行以下设置以开启此功能:
SQL> ALTER SYSTEM SET RESOURCE_MANAGER_PLAN='DEFAULT_MAIN';
SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=4;
SQL> EXEC DBMS_STATS.SET_GLOBAL_PREFS('CONCURRENT', 'ALL');
SQL> EXEC DBMS_STATS.GATHER_SCHEMA_STATS('SCOTT');



生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生