1. 内容提要
1) 表分区维护的增强。
2) 数据库升级改善。
3) 跨网络还原/恢复数据文件。
4) 数据泵的增强。
5) 实时ADDM。
6) 并发统计信息收集。
2. 表分区维护的增强
在其他文章中,我说明了如何在线或离线把一个表分区或子分区移到一个不同的表空间。这部分,你将学习和表分区相关的其他方面的增强。
2.1. 增加多个新分区。
12c R1之前,在一个已分区表上只能一次增加一个分区。为了增加多个分区,你必须每增加一个新分区单独执行一个ALTER TABLE ADD PARTITION语句。 12c支持用一个ALTER TABLE ADD PARTITION命令增加多个新分区。下例说明如何往一个已有分区表上增加多个新分区:
SQL> CREATE TABLE emp_part(eno number(8), ename varchar2(40), salnumber (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分区。
2.2. 如果删除和截断多个分区或子分区
作为数据维护的一部分,典型的你可以删除或截断分区表上分区。12c R1前,只能一次一个的删除或截断分区表的分区。12c中,用一个ALTER TABLE table_name {DROP|TRUNCATE}PARTITIONS 命令可以删除或截断多个分区或子分区。下例说明如何删除或截断分区表上的多个分区:
SQL> ALTER TABLEemp_part DROP PARTITIONS p4,p5;
SQL> ALTER TABLEemp_part TRUNCATE PARTITONS p4,p5;
为了同时也维护索引,使用UPDATE INDEXES or UPDATE GLOBAL INDEXES 子句,
如下:
SQL> ALTERTABLE emp_part DROP PARTITIONS p4,p5 UPDATE GLOBAL INDEXES;
SQL> ALTERTABLE emp_part TRUNCATE PARTITIONS p4,p5 UPDATE GLOBAL INDEXES;
如果你删除或截断分区时不带UPDATE GLOBAL INDEXES子句,你可以查询USER_INDEXES或USER_IND_PARTITIONS字典视图的ORPHANED_ENTRIES,以便发现索引是否包含陈旧索引项。
2.3. 将一个分区劈成多个新分区
12c中,新增强的SPLITPARTITION子句可以让你用一个命令将一个特定的分区或子分区劈成多个新分区:
SQL> CREATE TABLE emp_part
(eno number(8), enamevarchar2(40), sal number (6))
PARTITION BY RANGE (sal)
(PARTITION p1 VALUES LESS THAN(10000),
PARTITION p2 VALUES LESS THAN(20000),
PARTITION p_max VALUES LESSTHAN (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);
2.4. 将多个分区合并成一个分区
你可以用一个ALTER TBALE MERGE PARTITIONS语句将多个分区合并成一个分区:
SQL> CREATETABLE emp_part
(eno number(8), ename varchar2(40), salnumber (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> ALTERTABLE emp_part MERGE PARTITIONS p3,p4,p5 INTO PARTITION p_merge;
如果这些分区包含分区键值范围,你也能用下例命令:
SQL> ALTERTABLE emp_part MERGE PARTITIONS p3 TO p5 INTO PARTITION p_merge;
3. 数据库升级改善
无论何时新版本发布,每个DBA必须立刻面对的就是升级。这部分,将会说明两个新引进的升级到12c的改善。
3.1. 升级前脚本
12c R1中,一个新的、得到极大改善的升级前信息脚本preupgrd.sql,替换了之前的utlu[121]s.sql脚本。除了做升级前检查验证,该脚本还能以fixup脚本的方式解决升级过程前后产生的各种问题。产生的fixup脚本能被执行来解决不同层面的问题。例如:升级前和升级后。当手工升级数据库时,开始实际数据库升级前,脚本必须被手工运行。可是,当用DBUA工具升级数据库时,会被作为升级过程的一部分,自动运行升级前脚本,当出现任何错误时,都会提示你运行fixup脚本。下例说明如何运行该脚本:
SQL> @$Oracle_12GHOME/rdbms/admin/preupgrd.sql
上面脚本会产生一个日志文件和一个[pre/post]upgrade_fixup.sql 脚本。所有这些文件都在$ORACLE_BASE/cfgtoollogs 目录下。在你继续真正升级前,你该查看日志并运行日志中推荐的操作和脚本来解决存在的任何问题。
注意:确信你把preupgrd.sql和utluppkg.sql 脚本都从12c的Oracle的主目录 home/rdbms/admin拷贝到了目前的数据库/rdbms/admin位置。
3.2. 并行更新功能
数据库升级时间和数据库配置的组件多少成正比,而不是和数据库大小成正比。之前的版本,没有直接或间接可用选项来并行快速的完成整个升级过程。
12c R1中的catctl.pl (并行升级功能)替换了之前的catupgrd.sql脚本,12c R1中的脚本有个选项用以并行升级,从而可以缩短完成整个升级过程所需的时间。下面的过程说明如何启动并行(3个进程)升级功能,以upgrade模式启动数据库后再运行下列命令:
cd $ORACLE_12_HOME/perl/bin
$ ./perl catctl.pl –n 3 -catupgrd.sql
当数据库被手工升级时,以上两个步骤需要被显式运行。然而,DBUA工具包含上面这两个变化。
4. 通过网络还原/恢复数据文件
12c R1中,另一个很大的增强是,你现在可以通过服务名(service name)在主备库之间还原或恢复数据文件,控制文件,spfile,表空间或整个库。在同步主备库时,这是非常有用的。
当在主备库之间发现一个很长的延迟时(gap),你不再需要复杂的前滚过程来填充主备库间的延迟了。RMAN能通过网络得到增量备份并且在物理备库上应用这些备份来恢复备库。像已经说过的,你能用服务名直接把需要的数据文件从备库拷贝到主库上,例如:主库上的一个数据文件或表空间丢了,或者没有从备份集还原数据文件等。
下列过程说明如何用新特点执行前滚来同步主备库:
物理备库端:
./rman target"username/password@standby_db_tns as SYSBACKUP"
RMAN> RECOVERDATABASE FROM SERVICE primary_db_tns USING COMPRESSED BACKUPSET;
上面的例子使用备库上的连接串primary_db_tns连接主库来执行一个增量备份,然后把这些增量备份传输到备库,并应用这些文件来同步备库。可是,你需要确信已经在备库端配置了 指向主库的连接串primary_db_tns。
下例中,我将通过从备库获取并恢复主库上丢失的数据文件来说明一个场景:
主库端:
./rman target"username/password@primary_db_tns as SYSBACKUP"
RMAN> RESTOREDATAFILE ‘+DG_DISKGROUP/DBANME/DATAFILE/filename’ FROM SERVICE standby_db_tns;
5. 数据泵增强
这部分主要介绍数据泵方面的增强。有很多有用的增强,例如:导出时将试图转化为表,导入时关闭日志等。
5.1. 关闭日志产生
数据泵导入被新引进的TRANSFORM选项支持在导入过程中不产生对象redo。当确定TRANSFORM选项的值为DISABLE_ARCHIVE_LOGGING时,整个导入过程中上下文中对象将不产生redo。当导入大表时,该特点会很大的减轻系统压力和产生的redo,从而减速导入进程。该特点可以应用到表和索引,下例说明了该特点:
$ ./impdp directory=dpump dumpfile=abcd.dmp logfile=abcd.logTRANSFORM=DISABLE_ARCHIVE_LOGGING:Y
5.2. 把视图转换为表
这是数据泵的另一个增强。利用VIEWS_AS_TABLES选项,你能把视图导出为一个表。下列例子描述了如何在导出期间将视图导出为一个表:
$ ./impdp directory=dpump dumpfile=abcd.dmp logfile=abcd.logTRANSFORM=DISABLE_ARCHIVE_LOGGING:Y
6. 实时进行ADDM分析
通过像AWR,ASH和ADDM等工具去分析过去和目前数据库健康状态是每个DBA生活的一部分。虽然每个工具能在各个层面来测量数据库的整体健康和性能,但当整个数据库没反应或”hang”时,每一个工具可以使用。
当你碰到数据库没反应或被hang住时,如果你已经配置了Oracle企业管理器12c云控制,你就能诊断严重的性能问题。这将会给你提供一个数据库中当前什么在发生的整体描述,也许也会给你提供一个解决问题的补救措施。
下面一步步的说明如何利用Oracle企业管理器云控制来分析数据库状态:
1) 在存取数据库主页上从Performance菜单选择EmergencyMonitoring选项,这将会显示hang分析表中排在最前面的阻塞会话。
2) 从Performance选择Real-TimeADDM选项来执行实时ADDM分析。
3) 收集性能数据后,点击Findings页来获取所有发现的交互总结。
7. 并行的收集多张表的统计信息
在先前的Oracle版本中,无论什么时候你运行DBMS_STATS过程来收集表,索引,模式或数据库级别的统计信息,Oracle都是一次收集一张表。如果表很大,那么推荐增加并行度。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');