导读:本系列文章是 Oracle ACE 总监 Syed Jaffer Hussain 对 Oracle 数据库 12c 的一些新特性
总结,包括数据库管理、RMAN、高可用性以及性能调优等内容。
Oracle 12C 新特性
关键词:Oracle 数据库 12c RMAN PGA 限制 不可见字段
【TechTarget 中国原创】编者按:甲骨文公司近日正式发布了新版旗舰级数据库 Oracle
Database 12c,在 TechTarget 数据库网站之前的一些报道中,我们曾对 12c 的一些新特性进
行了介绍(参考:尝鲜 Oracle Database 12c 的十二大新特性)而随着产品正式 GA,相关技
术文档也披露了更多关于 12c 数据库的细节。本系列文章是 Oracle ACE 总监 Syed Jaffer
Hussain 对 Oracle 数据库 12c 的一些新特性总结,包括数据库管理、RMAN、高可用性以及
性能调优等内容。
在第一部分中,我们将介绍:
1. 在线迁移活跃的数据文件
2. 表分区或子分区的在线迁移
3. 不可见字段
4. 相同字段上的多重索引
5. DDL 日志
6. 临时 undo
7. 新的备份用户特权
8. 如何在 RMAN 中执行 SQL 语句
9. RMAN 中的表级别恢复
10. PGA 的大小限制问题
1. 在线重命名和重新定位活跃数据文件
不同于以往的版本,在 Oracle 数据库 12c R1 版本中对数据文件的迁移或重命名不再需
要太多繁琐的步骤,即把表空间置为只读模式,接下来是对数据文件进行离线操作。在 12c
R1 中,可以使用 ALTER DATABASE MOVE DATAFILE 这样的 SQL 语句对数据文件进行在
线重命名和移动。而当此数据文件正在传输时,终端用户可以执行查询,DML 以及 DDL
方面的任务。另外,数据文件可以在存储设备间迁移,如从非 ASM 迁移至 ASM,反之亦
然。
重命名数据文件:
ALTER
SQL>
'/u00/data/users_01.dbf';
DATABASE
MOVE
DATAFILE
'/u00/data/users01.dbf'
TO
从非 ASM 迁移数据文件至 ASM:
SQL> ALTER DATABASE MOVE DATAFILE '/u00/data/users_01.dbf' TO '+DG_DATA';
将数据文件从一个 ASM 磁盘群组迁移至另一个 ASM 磁盘群组:
SQL>
MOVE
'+DG_DATA/DBNAME/DATAFILE/users_01.dbf ' TO '+DG_DATA_02';
DATABASE
ALTER
DATAFILE
在数据文件已存在于新路径的情况下,以相同的命名将其覆盖:
ALTER
SQL>
'/u00/data_new/users_01.dbf' REUSE;
DATABASE MOVE
DATAFILE
'/u00/data/users_01.dbf'
TO
复制文件到一个新路径,同时在原路径下保留其拷贝:
ALTER
SQL>
'/u00/data_new/users_01.dbf' KEEP;
DATABASE MOVE
DATAFILE
'/u00/data/users_01.dbf'
TO
当通过查询 v$session_longops 动态视图来移动文件时,你可以监控这一过程。另外,
你也可以引用 alert.log,Oracle 会在其中记录具体的行为。
2. 表分区或子分区的在线迁移
在 Oracle 12c R1 中迁移表分区或子分区到不同的表空间不再需要复杂的过程。与之前
版本中未分区表进行在线迁移类似,表分区或子分区可以在线或是离线迁移至一个不同的表
空间。当指定了 ONLINE 语句,所有的 DML 操作可以在没有任何中断的情况下,在参与这
一过程的分区或子分区上执行。与此相反,分区或子分区迁移如果是在离线情况下进行的,
DML 操作是不被允许的。
示例:
SQL> ALTER TABLE table_name MOVE PARTITION|SUBPARTITION partition_name TO
tablespace tablespace_name;
SQL> ALTER TABLE table_name MOVE PARTITION|SUBPARTITION partition_name
TO tablespace tablespace_name UPDATE INDEXES ONLINE;
第一个示例是用来在离线状况下将一个表分区或子分区迁移至一个新的表空间。第二个
示例是在线迁移表分区或子分区并维护表上任何本地或全局的索引。此外,当使用 ONLINE
语句时,DML 操作是不会中断的。
重要提示:
•UPDATE INDEXES 语句可以避免出现表中任何本地或全局索引无法使用的情况。
•表的在线迁移限制也适用于此。
•引入加锁机制来完成这一过程,当然它也会导致性能下降并会产生大量的 redo,这取决于
分区和子分区的大小。
3. 不可见字段
在 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 语句中显式提及不可见字段名以将不可见字段插入到数据库中。虚拟
字段和分区字段同样也可以定义为不可见类型。但临时表,外部表和集群表并不支持不可见
字段。
4. 相同字段上的多重索引
在 Oracle 12c R1 之前,一个字段是无法以任何形式拥有多个索引的。或许有人会想知
道为什么通常一个字段需要有多重索引,事实上需要多重索引的字段或字段集合是很多的。
在 12c R1 中,只要索引类型的形式不同,一个字段就可以包含在一个 B-tree 索引中,同样
也可以包含在 Bitmap 索引中。注意,只有一种类型的索引是在给定时间可用的。
5. 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|SEQUENCE
6. 临时 undo
每个 Oracle 数据库包含一组与系统相关的表空间,例如 SYSTEM,SYSAUX,UNDO &
TEMP,并且它们在 Oracle 数据库中每个都用于不同的目的。在 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;
7. 备份特定用户特权
在 11g R2 中,引入了 SYSASM 特权来执行 ASM 的特定操作。同样地,在 12c 中引入
了 SYSBACKUP 特权用来在 RMAN 中执行备份和恢复命令。因此,你可以在数据库中创
建一个本地用户并在不授予其 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 121m;
9. 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 约束时,恢复此表是不可行的
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
内存。
第二部分内容包括:
1. 对表分区维护的增强
2. 数据库升级的改进
3. 通过网络恢复数据文件
4. 对 Data Pump 的增强
5. 实时自动数据诊断监视器(ADDM)
6. 并发统计信息收集
1. 对表分区维护的增强
在第一部分中,我解释了如何在线或是离线状态下迁移一个表分区或子分区到另一个不
同的表空间。在本文中,主要介绍表分区其他方面的改进。
添加多个新分区
在 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 语句,如下
所示: