XTTS方式进行数据迁移的准备工作

0. 前言

使用传统的传输表空间方式来迁移数据时,所需要的停机时间与被迁移的数据量成正比。传统的传输表空间的主要步骤分为:1、将源数据库中被转输的表空间设置为read only;2、将被传输表空间所相关的数据文件传输到目标主机上;3、将数据文件转换为目标主机所使用的字节序;4、使用数据泵从源数据库导出所被传输表空间所存储对象的元数据;5、在目标数据库中使用数据泵导入所被传输表空间所存储对象的元数据;6、将目标数据库中的被传输表空间设置为read write。

因为数据传输时表空间必须为read only,应用程序所拥有的数据在传输时不能被用户使用,所以停机时间依赖于数据量的大小,如果数据量大,数据文件传输与转换的时间将会很长,所以停机时间也就会很长。

增量传输表空间(Cross Platform Transportable Tablespaces)是传输表空间的加强版,通过增量的备份恢复可以减少停机时间,但跨平台增量备份功能不影响执行其他操作所需的时间,比如元数据导出和导入操作。增量传输表空间方式所减少的时间仅仅是将数据全量初始化所花的时间变成了一次增量备份和恢复所花的时间。

使用增量传输表空间方式进行数据迁移时,需要提前了解增量传输表空间有哪些使用限制,做好充分的准备工作。

1. 限制条件

除了必须遵循传输表空间的限制和考虑因素之外,增量传输表空间的方式还必须满足以下条件:

n  源端操作系统不能是Windows。

n  源数据库和目标数据库必须使用相同的字符集和国家字符集。

n  源端数据库必须运行在10.2.0.3或更高的版本。

n  源端数据库的COMPATIBLE参数值必须设置为10.2.0或更高。

n  源端数据库的COMPATIBLE参数值不能高于目标端数据库的COMPATIBLE参数值。

n  源端数据库必须处于ARCHIVELOG模式。

n  目标端操作系统优先是Linux操作系统,64位Oracle Linux或者RedHat Linux,但其他类型的UNIX操作系统也支持。

n  源端数据库和目标端数据库RMAN的DEFAULT DEVICE类型要设置为DISK。

n  源端和目标端数据库RMAN的DEVICE TYPE DISK不能设置COMPRESSED。

n  源端和目标端数据库RMAN的DEVICE TYPE DISK不能设置MAXPIECESIZE。

n  被传输的表空间集必须全部online,并且这些表空间不包含offline的数据文件,表空间必须是read/write模式。

n  整个数据迁移过程必须使用属于OSDBA组的oracle用户来执行,源端和目标端数据库使用OS认证。

n  建议目标端数据库版本为11.2.0.4或者更高版本。如果目标库数据库的版本是11.2.0.3或者更低,那么需要创建一个单独的11.2.0.4版本数据库作为中间库来在目标端进行数据文件的格式转换。

n  如果使用DBMS_FILE_TRANSFER方法进行初始化时,目标端的数据库版本则必须为11.2.0.4或者更高版本。

n  如果使用RMAN方法进行初始化,那么在源端操作系统和目标端操作系统上都需要挂载中转区域,需要的空间会比较大,必须能存放所有的数据文件。

n  目标端数据库db_files参数必须大于源端。

2. 检查数据库字符集

使用传输表空间的方式进行数据迁移时,目标端数据库的字符集和国家字符集必须与源端数据库完全一致,可以使用如下语句检查数据库的字符集。

3. 检查数据库时区

使用传输表空间的方式进行数据迁移时,目标端数据库的时区必须与源端数据库完全一致,可以使用如下语句检查源端数据库的时区。

如果目标端数据库的时区与源端数据库不一致,可能会导致导入元数据时失败,具体可参考MOS文档《Bug 10384616 - Data Pump transportable tablespace import fails with ORA-39002 / ORA-39322 with TIMESTAMP data (文档 ID 10384616.8)》。

4. 检查数据库时区文件

传输表空间模式下导出元数据时,数据库时区文件的版本有如下要求:

n  如果源数据库为11.2.0.2或更高版本,并且在被传输的表空间中有一些表使用了TIMESTAMP WITH TIMEZONE (TSTZ)数据类型的列,那么目标数据库上的时区文件版本必须与源数据库上的时区文件版本完全匹配。

n  如果源数据库为11.2.0.2或更旧的版本,那么无论被传输表空间集中是否使用使用了TIMESTAMP WITH TIMEZONE (TSTZ)数据类型的列,源和目标数据库上的时区文件版本都必须相同。

如果数据库时区文件不满足要求,则元数据导入工作会失败。可以使用SQL语句查看数据库的时区文件,命令如下所示。

可以使用如下SQL语句检查是否使用TSTZ数据类型的字段。

5. 检查数据库是否归档

源端数据库需要进行多次增量备份,所以源端数据库必须置于归档模式,可使用如下语句检查数据库的归档模式。

6. 检查数据库db_files参数

在执行元数据导入操作之前,务必先确认目标端数据库db_files参数值高于源端数据库,否则数据文件加载失败,报错信息如下所示。

此刻肯定已经有一部分表空间已经加载到目标端数据库,调整目标数据库的db_files参数后,再次执行元数据加载时会提示表空间已经存在,此时删除目标库刚加载的表空间一定要千万小心,删除表空间时务必要保留该表空间中的数据文件,如果不小心删除了表空间中的数据文件,则只能用以前的初始化备份和增量备份来恢复这些被删除的数据文件。

7. 检查数据库compatible参数

源端数据库的COMPATIBLE参数值必须设置为10.2.0或更高,同时目标端数据库的COMPATIBLE参数值必须高于或等于源端。可以通过如下语句检查数据库的compatible参数值。

8. 检查数据库组件

目标端数据库组件建议与源端保持一致,防止因为缺少相应的组件而导致某些功能不可用,可以使用如下语句检查源端数据库已经安装的组件。

9. 检查数据库的RMAN配置

(1)、在增量传输表空间迁移的限制条件中,要求数据库RMAN的DEFAULT DEVICE类型设置为DISK,同时不允许使用COMPRESSED,如果数据库RMAN的DEFAULT DEVICE类型设置了COMPRESSED功能,则在前滚阶段(xttdriver.pl -r)时会出现错误。

(2)、数据库RMAN的DEFAULT DEVICE设置中不允许加maxsize参数。因为xttdriver.pl脚本不支持使用MAXPIECESIZE参数的RMAN备份,它会导致前滚步骤(perl xttdriver.pl -r)失败。

具体可参考MOS文档《Cross platform transportable tablespace migration to Exadata failing with ORA-19611: backup piece out of order (文档 ID 1910887.1)》和《ORA-00600 [ksfdfetch1] or ORA-600 [kfioReapIO00] During RMAN Backup When MAXPIECESIZE Is Set or Configured (文档 ID 437640.1)》。

(3)、为了加速初始化和增量备份的速度,建议开启多通道。

10. 检查源端数据库需要迁移的业务用户

确定源端数据库需要迁移的业务用户数量,同时最好让业务部门进行确认迁移的业务用户是否完整。

11. 检查源端业务对象是否存在于系统表空间

只有那些物理上位于正在传输的表空间中的数据对象才会被迁移到目标端数据库,如果业务数据表物理存放在系统表空间中,则需要在迁移之前将这些业务数据表move到相应的业务表空间中。

12. 检查源端系统对象是否存在于业务表空间

通过如下语句检查系统对象是否存在于业务表空间中,如果存在,则在表空间迁移之前将这些系统对象迁出业务表空间。

13. 检查源端数据库是否数据加密

不能将加密的表空间传输到具有不同字节序的平台,但从MOS文档《How to use TTS With TDE (文档 ID 1674166.1)》可见,数据库版本从11.2.0.4开始,已经支持加密的表空间透明传输。

在传输加密表空间之前,必须手动将Oracle钱包复制到目标数据库,除非主加密密钥存储在硬件安全模块(HSM)设备中,而不是存储在Oracle钱包中。复制钱包时,钱包密码在目标数据库中保持不变。

14. 检查源端数据库是否数据压缩

如果源端数据库的索引使用了压缩功能,则使用RMAN增量跨平台传输表空间的方式进行数据迁移后,有可能会存在逻辑坏块的错误,具体可参考MOS文档《Bug 25977302 - ORA-600 [6033] Logical Corruption on Compress Index After RMAN Convert XTTS (文档 ID 25977302.8)》和《Bug 4545196 - Corrupt index leaf by RMAN CONVERT from cross platform transport of compress-key indexes (文档 ID 4545196.8)》和《Master Note for Transportable Tablespaces (TTS) -- Common Questions and Issues (文档 ID 1166564.1)》。

15. 检查源端数据库是否有cluster对象

使用RMAN增量跨平台传输表空间的方式进行数据迁移后,执行ANALYZE cluster命令时会出现ORA-1499错误。具体参考MOS文档《Bug 17866999 - ORA-1499 by Analyze Cluster Following RMAN Convert. Cluster Inconsistency may lead to ORA-600 [6711] ORA-600 [6722]. Fix Introduces dbms_repair procedures to repair Index (文档 ID 17866999.8)》。

16. 检查源端数据库是否有XML数据类型

从10gR2版本开始,可以传输包含XML数据类型的表空间,但是必须使用exp/imp工具迁移元数据,而不能使用数据泵来迁移元数据。

具体参考MOS文档《XML Schemas Not Present After DataPump TTS From 10.2 to 11.2 (Doc ID 1323993.1)》。

17. 检查源端数据库是否有spatial index

当被传输的表空间中包含spatial index时,使用IMPDP导入传输表空间将失败。

具体参考MOS文档《Impdp Transportable Tablespace Fails When Having A Spatial Index (文档 ID 579136.1)》和《TRANSPORTABLE TABLESPACE IMPORT FAILS WITH ORA-39083 ORA-942 ON MDRS TABLES (文档 ID 2031174.1)》。

18. 检查源端数据库使用非标准块的表空间

如果源端数据库中某个表空间使用了非标准数据块,则目标端数据库也必须进行非标准数据块配置,否则该表空间在目标端数据库中无法使用。

19. 检查源端数据库快速刷新物化视图

在使用传输表空间数据迁移之后,快速刷新物化视图可能会导致ORA-12034(materialized view log on <base_table> younger than last refresh)错误,这是因为源端数据库置于read only状态进行元数据导出时物化视图及其SCN是固定的,而目标端数据库有自己当前的SCN,当前SCN可能比导入元数据中的SCN更早,所以快速刷新的物化视图在迁移之后,基本上都会遇到ORA-12034错误。

该问题的解决办法可参考MOS文档《TTS Does NOT Guarantee an MVIEW Fast Refresh Will Succeed after TTS Import -- ORA-12034 Possible (文档 ID 1498846.1)》。

20. 检查源端数据文件状态是否online

被传输的表空间集必须全部online,且为read/write模式,同时表空间中的数据文件不允许offline。

21. 检查源端数据库回收站

在使用传输表空间数据迁移之后,目标端数据库有可能会遭遇Ora-0600 [ktecgetsh-inc]错误,该缺陷目前还没有发布正式的修复补丁,临时的解决办法是清空源端数据库的回收站。

22. 检查源端数据库是否存在失效段

确保源端数据库中没有失效的数据段对象或不可用的索引,如果有,则必须修复它们,无效的数据段对象和不可用的索引在导出其元数据时没有SEG_FILE和SEG_BLOCK存储参数,而SEG_FILE和SEG_BLOCK存储参数是插入对象所必需的,如果导入元数据时没有SEG_FILE和SEG_BLOCK存储参数,元数据导入时将尝试在目标端数据库中实际创建它,而此时将将加载的表空间处于只读模式,这将导致错误ORA-1647:tablespace is read only, cannot allocate space in it。

23. 检查源端数据库是否存在IOT表

检查源端数据库的业务用户是否存在IOT表,如果源端数据库和目标端数据库的字节序不相同,在使用传输表空间的方式数据迁移之后,使用dbv工具检测目标端数据库的IOT表时有可能会误报坏块的错误,具体可参考MOS文档《Bug 14362875 - ORA-600 [6120] / corruption of IOT in cross platform transported tablespace (文档 ID 14362875.8)》。

24. 检查源端被迁移的表空间是否自包含

检查源端数据库被迁移的表空间集合是否是自包含,并将违反自包含规则的信息写入到临时表TRANSPORT_SET_VIOLATIONS中,传输表空间迁移要求被传输的表空间集合全部是自包含。

25. 检查源端数据库开启块跟踪

数据库的块改变跟踪记录自从上一次0级备份以来数据块的变化,并把这些信息记录在块跟踪文件中。RMAN使用这个文件判断增量备份中需要备份的变更数据。这极大的提高了增量备份性能和速度,RMAN可以不再扫描整个文件以查找变更的数据。

在Oracle RAC环境下,块改变跟踪功能有可能会遭遇BUG,具体见MOS文档《Bug 13602883 - Block change tracking not used for incremental backups - superseded (文档 ID 13602883.8)》和《Bug 16850197 - Instance crash due to ORA-600 [kjruch:resp] with fix for bug 13602883 present - superseded (文档 ID 16850197.8)》。

26. 检查源端业务用户相关信息

如果源端数据库为不同的业务用户分别创建了不同的temp表空间,或者使用了profile,则目标端数据库创建业务用户时,建议也创建同样的temp表空间和profile。同时检查业务用户所对应的默认表空间和默认临时表空间。

27. 目标端数据库清理

先检查目标端数据库环境,设置系统默认表空间,同时删除非系统用户和非系统表空间。

28. 目标端创建业务用户

先检查目标端数据库环境,是否存在与源端数据库同名的用户名,如果存在,则需要先清理目标端的环境。

然后在源端数据库执行如下SQL语句,该SQL语句会生成创建数据库用户和赋权的SQL语句,将新生成的SQL语句在目标端执行,则完成目标端数据库用户创建工作。

29. 目标端业务用户授予系统权限

在源端数据库中执行如下SQL语句,获取业务用户所拥有的系统权限,将生成的赋权语句在目标端数据库中执行。

 

30. 同步源端的tnsnames.ora文件

由于数据库的dblink有可能会读取tnsnames.ora文件,所以数据迁移时,需要将源端数据库的tnsnames.ora文件同步至目标端Oracle数据库软件的相应目录下。

31. 目标端数据库调整

为了最大限度地保障数据能够顺利迁移,目标端数据库需要提前做适当的调整,以避免在数据迁移过程中可能会遭遇的问题。

(1)、在元数据导入的过程中,有可能会遇到数据库软件缺陷(Bug 9189530 IMPDP TTS: ORA-04030: OUT OF PROCESS MEMORY IN IMPORTING INDEX_STATISTICS)。

针对该问题的临时解决办法,第1步:增加Linux操作系统的内核参数vm.max_map_count的值到200000,并使该参数生效;第2步:增加数据库的_realfree_heap_pagesize_hint参数值到262144;第3步:重启数据库实例生效。

具体信息可参考MOS文档《DataPump Import (IMPDP) In Transportable Tablespace Mode Fails With Error ORA-4030 (文档 ID 1507127.1)》。

(2)、在元数据导入的过程中,导入工作有可能会失败,出现错误ORA-39083和ORA-1647,具体错误日志如下所示。

该错误的原因是目标端数据库deferred_segment_creation参数被人为地设置为了false,临时的解决办法就是将目标端数据库deferred_segment_creation参数设置为true,命令如下所示。

具体信息可参考MOS文档《DataPump Import (IMPDP) Transport Tablespace Fails With Error ORA-1647 (Doc ID 1478922.1)》。

(3)、目标端数据库建议置于归档模式,目标端在进行字节序转换和增量恢复时,如果没有一个临时的中转实例,而使用目标数据库完成该工作时,会报如下包含。

为了尽量简化配置过程,可以直接将目标数据库置于归档模式,则可以解决以上报错。具体可参考MOS文档《RMAN Cross Platform Incremental Backup Fails with ORA-19583 or ORA-19602 (文档 ID 1633483.1)》。

32. NFS挂载

因为本次增量传输表空间迁移时,初始化阶段使用的是RMAN方式,所以需要为源端和目标端分别创建临时数据存放点,建议使用同一台NFS服务器,这样可以省略掉从源端环境复制备份集到目标端的步骤。

33. 源端和目标端运行RDA(HCVE)

运行RDA工具,检查源端和目标端的系统配置是否满足要求。否则可能会遭遇意想不到的问题。参考如下内容:

ORA-04030 (kxs-heap-c,temporary memory), ORA-04030 (kggec.c.kggfa,kggec.c.kggfa), ORA-04030 (TCHK^8380cfe1,qke.c.kggfa) While Using Datapump (Doc ID 2020389.1)

RDA - Health Check / Validation Engine Guide (Doc ID 250262.1)

34. 源端是否存在unusable状态的索引

如果源端分区表中某些分区存在unusable状态的索引时,XTTS导入元数据后,目标端可能会出现ora-8103的错误。

 

posted @ 2025-03-10 09:45  石云华  阅读(163)  评论(0)    收藏  举报