最近在找一些方法升级Oracle到12.2,怎样才能停机时间短,普通的升级方式,我感觉很漫长。看了官方文档,发现了一个停机时间短的方法,利用传输数据库的方式升级数据库,能看到我的实验,导入时间是9分钟,整体停机时间是15分钟不到。我觉得可以接受了。
大致原理是:知道传输表空间的同学都知道,只需要导出表空间的元数据,不用导出实际的用户数据。导入也很快,导入元数据后相当于让Oracle知道我有这些表空间和数据文件,你挂载就行。所以传输数据库也是将源数据库的整库元数据导出(导出之前设置用户自定义的表空间为只读模式),然后将非管理表空间(SYSTEM,SYSAUX)的数据文件拷贝到目标数据库(我是在本地升级,完全可以不拷贝数据文件),然后在目标数据库导入从源数据库导出的元数据即可,停机时间很短。
以下除实验外的内容均摘自Oracle12cR2的官方文档,翻译有错误,请多指正,本内容只针对如何使用传输数据库的方式升级11.2.0.3到12.2,其余内容未涉及。
1. 关于传输数据
你可以在以下几个级别上传输数据:数据库,表空间,表,分区,子分区。
2. 传输数据的限制以及传输数据库的限制
注意以下是传输数据的一般限制:
l 源和目标数据库必须使用相兼容的字符集。尤其要满足以下条件之一:
n 源数据库和目标数据库的字符集保持一致。
n 源数据库的字符集严格是目标数据库字符集的子集,并且以下三个条件都要满足:
² 源数据库必须是Oracle10g(10.1.0.3)或之后的版本
² 表空间在传输的时候,字符长度的语义或者字符长度在源数据库和目标数据库中都保持一致
² 要传输的数据不包含CLOB类型的字段,或者源数据库和目标数据库的字符集都是单字节或者多字节。
n 源数据库的字符集严格是目标数据库字符集的子集,并且以下两个条件都要满足:
² 源数据库是Oracle 10g(10.1.0.3)之前的版本
² 源数据库中最大的字符长度和目标数据库的字符集保持一致。
l 源数据库和目标数据库必须使用相兼容的国家字符集。尤其要满足以下条件之一:
n 源数据库和目标数据库的字符集一致
n 源数据库必须是Oracle10g(10.1.0.3)或之后的版本,并且传输的表空间不包含NCHAR,NVARCHAR2,NCLOB字段
l 当执行一个传输操作时,有下面的限制:
n 执行传输操作的用户的默认表空间不能是传输的表空间之一。
n 执行传输操作的用户的默认表空间必须是读写的。
l 在一个NON-CDB中,不能传输一个表空间到一个有同名的目标数据库中。
在CDB总,不能传输一个表空间到一个有同名表空间的目标数据库容器中。然而,不同的目标容器数据库可以用够同名的表空间。
可以使用REMAP_TABLESPACE导入参数来导入数据库对象到不同的表空间中。可选择的是,在传输操作之前,你可以重命名即将传输的表空间或者目标表空间。
从Oracle 12c(12.2)开始,RMAN的RECOVER命令可以通过映射表空间的方式来移动一个表到不同的schema中。具体可以参考RMAN的官方文档。
l 在一个CDB中,默认的数据泵导出目录DATA_PUMP_DIR不能在PDB中使用。必须在PDB中定义一个明确的目录来执行你的数据库导入导出操作。
l 传输XMLTYPE的数据有以下的限制:
n 目标数据库必须安装了XML DB
n 引用到XMLTYPE类型表的默认schema不能是XML DB的标准Schema
n 如果XMLTYPE类型表的schema不在目标的数据库中,那么这个Schema会被导入并且注册。如果Schema已经存在,那么在导入的时候会有信息打印出来。
select distinct p.tablespace_name from dba_tablespaces p,
dba_xml_tables x, dba_users u, all_all_tables t where
t.table_name=x.table_name and t.tablespace_name=p.tablespace_name
and x.owner=u.username;
l 由应用特别注明并且不透明的的类型的定义(比如RAW,BFILE和AnyTypes)都是可以传输的,但是都不能在跨平台传输中被convert。它们实际的结构只能被应用知道。所以应用必须在这些类型传输到新的平台上后处理字节顺序。类型和对象不管是直接还是间接使用了这些不透明的类型都会收到这样的限制。
l 当你在不同的时区的数据库中传输一个包含了TIMESTAMP WITH LOCAL TIME ZONE类型表的表空间,这些表的TSLTZ不会被传输的。错误信息会描述这些没有被传输的表。不过,不包含TSLTZ数据的表和表空间都是会被传输的。
你可以通过以下的查询来决定数据库的时区:
SELECT DBTIMEZONE FROM DUAL;
你可以使用alter database语句来修改数据库的时区。
在传输结束后,你可以使用数据泵来做传统的export/import来做SLTZ数据的导入导出。
l 分析工作空间不能作为跨平台传输操作的一部分。如果源平台和目标平台是不同的,然后使用数据泵导出/导入导出和导入分析工作区。
当你使用Full模式传输的时候,源数据库必须是Oracle11g(11.2.0.3)或之后的版本。目标数据库必须是Oracle12c版本。当传输Oracle11g(11.2.0.3)或之后的版本的数据库到Oracle12c,必须设置VERSION为12或者更高。当传输12c到12c的时候,COMPATIBLE初始化参数必须设置成12.0.0或更高。(这一段在数据库传输中的限制条件中有提及,注意看)
3. 传输数据库(FULL模式)
3.1Full模式导入导出介绍
可以使用Ful传输模式的导出和导入特性从一个数据库实例复制一个整库到领完一个数据库实例。
可以使用数据泵导出一个DUMP文件,如果需要传输DUMP文件到目标数据库(后面操作实例就是在本地直接升级,不需要传输DUMP文件),然后导入这个DUMP文件。当然,你也可以使用NETWORK_LINK来跨网路复制数据库。
被用来传输的表空间可以是数据库字典管理或者是本地管理的方式。源数据库的块大小可以和目标数据库块大小不同。
3.2Full模式传输导入导出的限制
Full模式传输数据库是一些限制的。
注意一下Full模式传输数据库的限制:
l 首先遵从上面传输数据的一般限制。
l 不可以传输加密的表空间到一个不同字节顺序的平台(endianness)
传输一个加密表空间到一个拥有相同字节顺序的平台,在传输过程中甚至EXCRYPTION_PWD_PROMPT导出参数为YES,或者使用ENCRYPTION_PASSWORD导出参数。在导入过程中,使用相同的导入参数,并且设置和导出时相同的密码值。
l Full模式传输,导入导出可以在管理表空间中使用传统的导入导出来导入和导出用户自定义的数据库对象。管理表空间是非用户表空间,比如SYSTEM,SYSAUX表空间。