合 Oracle 12c新特性整理
- 在线重命名或移动数据文件
- 表分区或子分区的在线迁移
- 不可见字段
- 相同字段上的多重索引
- DDL日志
- 临时undo
- 备份特定用户特权
- 如何在RMAN中执行SQL语句
- RMAN中的表恢复和分区恢复
- 限制PGA的大小
- 对表分区维护的增强
- 添加多个新分区
- 如何删除和截断多个分区/子分区
- 将单个分区分割为多个新分区
- 将多个分区合并为一个分区
- 数据库升级改进
- 预升级脚本
- 并行升级功能
- 通过网络恢复数据文件
- 对Data Pump的增强
- 关闭redo日志的生成
- 将视图转换为表
- 实时自动数据诊断监视器 (ADDM) 分析
- 自动存储管理(ASM)中的增强
- Flex ASM
- ASM存储限制放宽
- 对ASM均衡操作的优化
- ASM 磁盘清理
- ASM的活动会话历史(ASH)
- 网格(Grid)基础架构的增强
- Flex 集群
- ASM磁盘群组中的OCR备份
- 支持IPv6协议
- 3. RAC数据库的增强
- srvctl的改进
- 截断表CASCADE
- 对SQLPlus的各种增强
- SQL*Plus的隐式结果
- 显示不可见字段
- 会话级序列
- WITH语句的改善
- 扩展数据类型
- 12.2 新特性:RMAN 自动恢复到 REDO 终点的步骤简化
- Oracle 12.2 新特性:在线的修改数据表为分区表
- 参考
在线重命名或移动数据文件
不同于以往的版本,在Oracle数据库12c R1版本中对数据文件的迁移或重命名不再需要太多繁琐的步骤。在12c R1中,可以使用ALTER DATABASE MOVE DATAFILE
这样的SQL语句对数据文件进行在线重命名和移动。而当此数据文件正在传输时,终端用户可以执行查询,DML以及DDL方面的任务。另外,数据文件可以在存储设备间迁移,如从非ASM迁移至ASM,反之亦然。
重命名数据文件:
1 | SQL> ALTER DATABASE MOVE DATAFILE '/u00/data/users01.dbf' TO '/u00/data/users_01.dbf'; |
从非ASM迁移数据文件至ASM:
1 | SQL> ALTER DATABASE MOVE DATAFILE '/u00/data/users_01.dbf' TO '+DG_DATA'; |
将数据文件从一个ASM磁盘群组迁移至另一个ASM磁盘群组:
1 | SQL> ALTER DATABASE MOVE DATAFILE '+DG_DATA/DBNAME/DATAFILE/users_01.dbf ' TO '+DG_DATA_02'; |
在数据文件已存在于新路径的情况下,以相同的命名将其覆盖:
1 | 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动态视图来移动文件时,你可以监控这一过程。另外,你也可以引用alert.log,Oracle会在其中记录具体的行为。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | SELECT a.USERNAME, (SELECT upper(nb.OSUSER) FROM v$session nb WHERE nb.SID = a.sid) OSUSER, (SELECT nb.sid || ',' || nb.SERIAL# || ',' || pr.SPID FROM v$process pr, v$session nb WHERE nb.PADDR = pr.ADDR and nb.sid = a.SID and nb.SERIAL# = a.SERIAL#) session_info, a.opname, to_char(a.START_TIME, 'YYYY-MM-DD HH24:MI:SS') start_time, round(a.SOFAR * 100 / a.TOTALWORK, 2) || '%' AS progress, a.TIME_REMAINING TIME_REMAINING, a.elapsed_seconds elapsed_seconds, message message, (SELECT nb.EVENT FROM V$session_Wait nb WHERE nb.SID = a.SID) wait_event, (SELECT nb.STATUS FROM v$session nb WHERE nb.SID = a.SID) STATUS FROM v$session_longops a WHERE a.time_remaining <> 0 ORDER BY status, a.TIME_REMAINING DESC, a.SQL_ID, a.sid; |
需要注意的是,在12c中,移动数据文件必须进入到相关的容器中才可以,否则会报错“ORA-01516: nonexistent log file, data file, or temporary file "12" in the current container”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | SYS@ORCLCDB> col name format a60 SYS@ORCLCDB> set pagesize 9999 SYS@ORCLCDB> select ts#,file#,name,status from v$datafile d ; TS# FILE# NAME STATUS ---------- ---------- ------------------------------------------------------------ -------------- 0 1 /opt/oracle/oradata/ORCLCDB/system01.dbf SYSTEM 1 3 /opt/oracle/oradata/ORCLCDB/sysaux01.dbf ONLINE 2 4 /opt/oracle/oradata/ORCLCDB/undotbs01.dbf ONLINE 0 5 /opt/oracle/oradata/ORCLCDB/pdbseed/system01.dbf SYSTEM 1 6 /opt/oracle/oradata/ORCLCDB/pdbseed/sysaux01.dbf ONLINE 4 7 /opt/oracle/oradata/ORCLCDB/users01.dbf ONLINE 2 8 /opt/oracle/oradata/ORCLCDB/pdbseed/undotbs01.dbf ONLINE 0 9 /opt/oracle/oradata/ORCLCDB/ORCLPDB1/system01.dbf SYSTEM 1 10 /opt/oracle/oradata/ORCLCDB/ORCLPDB1/sysaux01.dbf ONLINE 2 11 /opt/oracle/oradata/ORCLCDB/ORCLPDB1/undotbs01.dbf ONLINE 5 12 /opt/oracle/oradata/ORCLCDB/ORCLPDB1/users01.dbf ONLINE 11 rows selected. SYS@ORCLCDB> SYS@ORCLCDB> ALTER DATABASE MOVE DATAFILE 12 TO '/opt/oracle/oradata/ORCLCDB/ORCLPDB1/users01_test.dbf'; ALTER DATABASE MOVE DATAFILE 12 TO '/opt/oracle/oradata/ORCLCDB/ORCLPDB1/users01_test.dbf' * ERROR at line 1: ORA-01516: nonexistent log file, data file, or temporary file "12" in the current container SYS@ORCLCDB> select ts#,file#,name,status,con_id from v$datafile d ; TS# FILE# NAME STATUS CON_ID ---------- ---------- ------------------------------------------------------------ -------------- ------ 0 1 /opt/oracle/oradata/ORCLCDB/system01.dbf SYSTEM 1 1 3 /opt/oracle/oradata/ORCLCDB/sysaux01.dbf ONLINE 1 2 4 /opt/oracle/oradata/ORCLCDB/undotbs01.dbf ONLINE 1 0 5 /opt/oracle/oradata/ORCLCDB/pdbseed/system01.dbf SYSTEM 2 1 6 /opt/oracle/oradata/ORCLCDB/pdbseed/sysaux01.dbf ONLINE 2 4 7 /opt/oracle/oradata/ORCLCDB/users01.dbf ONLINE 1 2 8 /opt/oracle/oradata/ORCLCDB/pdbseed/undotbs01.dbf ONLINE 2 0 9 /opt/oracle/oradata/ORCLCDB/ORCLPDB1/system01.dbf SYSTEM 3 1 10 /opt/oracle/oradata/ORCLCDB/ORCLPDB1/sysaux01.dbf ONLINE 3 2 11 /opt/oracle/oradata/ORCLCDB/ORCLPDB1/undotbs01.dbf ONLINE 3 5 12 /opt/oracle/oradata/ORCLCDB/ORCLPDB1/users01.dbf ONLINE 3 11 rows selected. SYS@ORCLCDB> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 ORCLPDB1 READ WRITE NO SYS@ORCLCDB> alter session set container=orclpdb1; Session altered. SYS@ORCLCDB> ALTER DATABASE MOVE DATAFILE 12 TO '/opt/oracle/oradata/ORCLCDB/ORCLPDB1/users01_test.dbf'; Database altered. SYS@ORCLCDB> select ts#,file#,name,status,con_id from v$datafile d ; TS# FILE# NAME STATUS CON_ID ---------- ---------- ------------------------------------------------------------ -------------- ------ 0 9 /opt/oracle/oradata/ORCLCDB/ORCLPDB1/system01.dbf SYSTEM 3 1 10 /opt/oracle/oradata/ORCLCDB/ORCLPDB1/sysaux01.dbf ONLINE 3 2 11 /opt/oracle/oradata/ORCLCDB/ORCLPDB1/undotbs01.dbf ONLINE 3 5 12 /opt/oracle/oradata/ORCLCDB/ORCLPDB1/users01_test.dbf ONLINE 3 SYS@ORCLCDB> exit Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0 ll[oracle@lhrora19c ~]$ ll /opt/oracle/oradata/ORCLCDB/ORCLPDB1/users01_* -rw-r----- 1 oracle oinstall 5251072 Nov 14 16:54 /opt/oracle/oradata/ORCLCDB/ORCLPDB1/users01_test.dbf |
表分区或子分区的在线迁移
在Oracle 12c R1中迁移表分区或子分区到不同的表空间不再需要复杂的过程。与之前版本中未分区表进行在线迁移类似,表分区或子分区可以在线或是离线迁移至一个不同的表空间。当指定了ONLINE语句,所有的DML操作可以在没有任何中断的情况下,在参与这一过程的分区或子分区上执行。与此相反,分区或子分区迁移如果是在离线情况下进行的,DML操作是不被允许的。
示例:
1 2 3 | 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,这取决于分区和子分区的大小。
不可见字段
在Oracle 11g R1中,Oracle以不可见索引和虚拟字段的形式引入了一些不错的增强特性。继承前者并发扬光大,Oracle 12c R1中引入了不可见字段思想。在之前的版本中,为了隐藏重要的数据字段以避免在通用查询中显示,我们往往会创建一个视图来隐藏所需信息或应用某些安全条件。
在12c R1中,你可以在表中创建不可见字段。当一个字段定义为不可见时,这一字段就不会出现在通用查询中,除非在SQL语句或条件中有显式的提及这一字段,或是在表定义中有DESCRIBED。要添加或是修改一个不可见字段是非常容易的,反之亦然。
1 2 | SQL> CREATE TABLE emp (eno number(6), ename name varchar2(40), sal number(9) INVISIBLE); SQL> ALTER TABLE emp MODIFY (sal visible); |
你必须在INSERT语句中显式提及不可见字段名以将不可见字段插入到数据库中。虚拟字段和分区字段同样也可以定义为不可见类型。但临时表,外部表和集群表并不支持不可见字段。
相同字段上的多重索引
在Oracle 12c R1之前,一个字段是无法以任何形式拥有多个索引的。或许有人会想知道为什么通常一个字段需要有多重索引,事实上需要多重索引的字段或字段集合是很多的。在12c R1中,只要索引类型的形式不同,一个字段就可以包含在一个B-tree索引中,同样也可以包含在Bitmap索引中。注意,只有一种类型的索引是在给定时间可用的。
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日志功能
1 | 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
临时undo
每个Oracle数据库包含一组与系统相关的表空间,例如SYSTEM,SYSAUX,UNDO & TEMP,并且它们在Oracle数据库中每个都用于不同的目的。在Oracle 12c R1之前,临时表生成的undo记录是存储在undo表空间里的,通用表和持久表的undo记录也是类似的。而在12c R12的临时undo功能中,临时undo记录可以存储在一个临时表中,而无需再存储在undo表空间内。这样做的主要好处在于:减少undo表空间,由于信息不会被记录在redo日志中,所以减少了redo数据的生成。你可以在会话级别或者数据库级别来启用临时undo选项。
启用临时undo功能
要使用这一新功能,需要做以下设置:兼容性参数必须设置为12.0.0或更高
启用 TEMP_UNDO_ENABLED 初始化参数
由于临时undo记录现在是存储在一个临时表空间中的,你需要有足够的空间来创建这一临时表空间
对于会话级,你可以使用:ALTER SYSTEM SET TEMP_UNDO_ENABLE=TRUE;
查询临时undo信息
以下所列的字典视图是用来查看或查询临时undo数据相关统计信息的:
V$TEMPUNDOSTAT
本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!