Oracle 12c新特性对于业务上的一些影响总结(1)
1、不可见字段
在Oracle 11g R1中,Oracle以不可见索引和虚拟字段的形式引入了一些不错的增强特性。继承前者并发扬光大,Oracle 12c R1中引入了不可见字段思想。在之前的版本中,为了隐藏重要的数据字段以避免在通用查询中显示,我们往往会创建一个视图来隐藏所需信息或应用某些安全条件。
在12c R1中,你可以在表中创建不可见字段。当一个字段定义为不可见时,这一字段就不会出现在通用查询中,除非在SQL语句或条件中有显式的提及这一字段,或是在表定义中有DESCRIBED。要添加或是修改一个不可见字段是非常容易的,反之亦然。
- SQL> CREATE TABLE emp (eno number(6), ename name varchar2(40), sal number(9) INVISIBLE);
- SQL> ALTER TABLE emp MODIFY (sal visible);
你必须在INSERT语句中显式提及不可见字段名以将不可见字段插入到数据库中。虚拟字段和分区字段同样也可以定义为不可见类型。但临时表,外部表和集群表并不支持不可见字段。
2、 DDL日志
在之前的版本中没有可选方法来对DDL操作进行日志记录。而在12c R1中,你现在可以将DDL操作写入xml和日志文件中。这对于了解谁在什么时间执行了create或drop命令是十分有用的。要开启这一功能必须对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
3、如何在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 121m;
4、 RMAN中的表恢复和分区恢复
Oracle数据库备份主要分为两类:逻辑和物理备份。每种备份类型都有其自身的优缺点。在之前的版本中,利用现有物理备份来恢复表或分区是不可行的。为了恢复特定对象,逻辑备份是必需的。对于12c R1,你可以在发生drop或truncate的情况下从RMAN备份将一个特定的表或分区恢复到某个时间点或SCN。
当通过RMAN发起一个表或分区恢复时,大概流程是这样的:
-
确定要恢复表或分区所需的备份集
-
在恢复表或分区的过程中,一个辅助数据库会临时设置为某个时间点
-
利用数据泵将所需表或分区导出到一个dumpfile
-
你可以从源数据库导入表或分区(可选)
-
在恢复过程中进行重命名操作
以下是一个通过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.(此选项可以对表重命名)
重要提示:
-
确保对于辅助数据库在/u01文件系统下有足够的可用空间,同时对数据泵文件也有同样保证
-
必须要存在一份完整的数据库备份,或者至少是要有SYSTEM相关的表空间备份
以下是在RMAN中应用表或分区恢复的限制和约束:
-
SYS用户表或分区无法恢复
-
存储于SYSAUX和SYSTEM表空间下的表和分区无法恢复
-
当REMAP选项用来恢复的表包含NOT NULL约束时,恢复此表是不可行的
5、 限制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内存。
6、 对表分区维护的增强
在第一部分中,我解释了如何在线或是离线状态下迁移一个表分区或子分区到另一个不同的表空间。在本文中,主要介绍表分区其他方面的改进。
添加多个新分区
在Oracle 12c R1之前,一次只可能添加一个新分区到一个已存在的分区表。要添加一个以上的新分区,需要对每个新分区都单独执行一次ALTER TABLE ADD PARTITION语句。而Oracle 12c只需要使用一条单独的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
- PARTITION p4 VALUES LESS THAN (35000),
- PARTITION p5 VALUES LESS THAN (40000);
同样,只要MAXVALUE分区不存在,你就可以添加多个新分区到一个列表和系统分区表。
如何删除和截断多个分区/子分区
作为数据维护的一部分,DBA通常会在一个分区表上进行删除或截断分区的维护任务。在12c R1之前,对于一个已存在的分区表一次只可能删除或截断一个分区。而对于Oracle 12c, 可以用单条ALTER TABLE table_name {DROP|TRUNCATE} PARTITIONS 命令来撤销或合并多个分区和子分区。
下例说明了如何在一个已存在分区表上删除或截断多个分区:
- SQL> ALTER TABLE emp_part DROP PARTITIONS p4,p5;
- SQL> ALTER TABLE emp_part TRUNCATE PARTITONS 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 语句的情况下删除或截断一个分区,你可以在USER_INDEXES或USER_IND_PARTITIONS 字典视图下查询ORPHANED_ENTRIES字段以找出是否有索引包含任何的过期条目。
将单个分区分割为多个新分区
在12c中新增强的SPLIT 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 p_max (MAXVALUE)
- );
- 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);
将多个分区合并为一个分区
你可以使用单条ALTER TBALE MERGE PARTITIONS 语句将多个分区合并为一个单独分区:
- 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;
7、数据库升级改进
每当一个新的Oracle版本发布,DBA所要面临的挑战就是升级过程。该部分我将介绍12c中引入的针对升级的两个改进。
预升级脚本
在12c R1中,原有的utlu[121]s.sql 脚本由一个大为改善的预升级信息脚本preupgrd.sql所取代。除了预升级检查验证,此脚本还能以修复脚本的形式解决在升级过程前后出现的各种问题。
可以对产生的修复脚本加以执行来解决不同级别的问题,例如,预升级和升级后的问题。当手动升级数据库时,脚本必须在实际升级过程初始化之前加以手动执行。然而,当使用DBUA工具来进行数据库升级时,它会将预升级脚本作为升级过程的一部分加以自动执行,而且会提示你去执行修复脚本以防止报错。
如何执行脚本:
- SQL> @$ORACLE_12GHOME/rdbms/admin/preupgrd.sql
以上脚本会产生一份日志文件以及一个[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个过程);你需要在升级模式下在启动数据库后运行这一脚本:
- cd $ORACLE_12_HOME/perl/bin
- $ ./perl catctl.pl –n 3 -catupgrd.sql
以上两个步骤需要在手动升级数据库时运行。而DBUA也继承了这两个新变化。
8、通过网络恢复数据文件
在12c R1中另一个重要的增强是,你现在可以在主数据库和备用数据库之间用一个服务名重新获得或恢复数据文件、控制文件、参数文件、表空间或整个数据库。这对于同步主数据库和备用数据库极为有用。
当主数据库和备用数据库之间存在相当大的差异时,你不再需要复杂的前滚流程来填补它们之间的差异。RMAN能够通过网络执行备用恢复以进行增量备份,并且可以将它们应用到物理备用数据库。你可以用服务名直接将所需数据文件从备用点拷贝至主站,这是为了防止主数据库上数据文件、表空间的丢失,或是没有真正从备份集恢复数据文件。
以下流程演示了如何用此新功能执行一个前滚来对备用数据库和主数据库进行同步:
在物理备用数据库上:
- ./rman target "username/password@standby_db_tns as SYSBACKUP"
- RMAN> RECOVER DATABASE FROM SERVICE primary_db_tns USING COMPRESSED BACKUPSET;
以上示例使用备用数据库上定义的primary_db_tns 连接字符串连接到主数据库,然后执行了一个增量备份,再将这些增量备份传输至备用目的地,接着将应用这些文件到备用数据库来进行同步。然而,需要确保已经对primary_db_tns 进行了配置,即在备份数据库端将其指向主数据库。
在以下示例中,我将演示一个场景通过从备用数据库获取数据文件来恢复主数据库上丢失的数据文件:
在主数据库上:
- ./rman target "username/password@primary_db_tns as SYSBACKUP"
- RMAN> RESTORE DATAFILE ‘+DG_DISKGROUP/DBANME/DATAFILE/filename’ FROM SERVICE standby_db_tns;