Oracle到Oracle的迁移后模式和代码验证工具

关键要点

本文介绍了一种工具,帮助在Oracle到Amazon RDS的迁移过程中验证模式对象。工具能够列出缺失的对象,并提供HTML格式的报告。针对常见的迁移问题,提出了验证建议,确保不丢失任何重要数据。

绝大多数从本地Oracle数据库迁移到 Amazon Relational Database Service (Amazon RDS) for Oracle 的作业都使用 EXPDP 和 IMPDP 或者通过RMAN使用 可传输表空间。根据迁移的大小和复杂性,迁移过程通常在模式级别和表级别上进行拆分。

在本文中,我们将介绍一种解决方案,帮助您在迁移后识别目标数据库中缺失的模式对象,并发现任何问题。我们使用一种工具来比较源数据库的Oracle模式对象与目标数据库的模式对象,并提供缺失对象的HTML格式列表。我们还讨论了迁移过程中可能遇到的各种问题,以及该工具如何帮助您主动修复迁移错误。

为什么要验证

Oracle数据库复杂且灵活,因而可能需要验证您的对象。以下是一些需要进行导入/导出验证的常见原因:

在从企业版EE11g数据库执行完全导出并仅导入选择的模式到标准版SE19C数据库时,出现了 ORA39014 One or more workers have prematurely exited 和 ORA39029 Worker 1 with process name DW00 prematurely terminated 的错误。这是导出和导入过程的一种限制。因此,我们需要在EE 11g数据库中执行选定模式的导出,再导入到SE 19C数据库。

导出并未捕获某些类型的对象,例如导出转储中的 ALTER TYPE 语句,因此需要手动转移。

sqlcreate or replace type typname as object(sno number name varchar2(10))/

ALTER TYPE typname ADD ATTRIBUTE emplocation varchar2(38) CASCADE/

将对象的模式级导出和导入到目标数据库将最小化停机时间。然而,在 expdp/impdp 过程中会产生大量错误。识别这些错误是一项繁琐的任务。因此,这种完整性报告可以帮助您找到任何缺失的对象。

当源数据库没有停机时间时,您可以使用 AWS 数据库迁移服务 或 Oracle GoldenGate。如果任何DDL语句不被工具支持,我们的解决方案可以帮助您找出这些缺失对象。在数据迁移过程中,我们有时会在目标数据库中禁用触发器和外键约束,迁移后再启用。该工具可以捕捉到任何未能启用的对象。如果源数据库代码已封装通过 DBMSDDLWRAP,在将数据导入目标时,如果缺少Oracle补丁20594149,导入将失败。确保首先应用补丁20594149。如果目标数据库是Amazon RDS,并缺少任何补丁例如补丁8795792,导入可能会导致 索引创建失败。如果未能将静态配置参数设置为与源数据库相似,切换后数据库将需要重启。当使用 expdp/impdp 在模式和表级迁移数据库时会产生无效对象,这通常指的就是不同类型的对象,如同义词、函数、包、过程和引用了非现有对象的视图,或在某种方式发生过改变的对象。源数据库的 数据库链接 需要进行审查。如果源数据库在本地,则数据库链接在迁移后将连接到旧数据库,因此需要手动更新。SQL配置文件 是存储在数据字典中的信息集合,使查询优化器能够为SQL语句创建最佳的执行计划。在迁移过程中,如果您未迁移SQL配置文件,可能会导致性能问题。

解决方案概述

OracletoOracle对象完整性迁移后工具 适用于12C及以上版本的以下用例:

本地Oracle到 Amazon Elastic Compute Cloud (Amazon EC2) 及其反向本地Oracle到Amazon RDS for Oracle及其反向Amazon EC2上的Oracle到Amazon RDS for Oracle及其反向

请将此脚本用于应用程序模式,而非SYS或SYSTEM模式的比较。

下面的图表展示了解决方案架构及本帖中使用的AWS服务。

先决条件

要跟随本帖进行操作,您需要满足以下先决条件:

具有连接到源数据库和目标数据库的EC2实例或堡垒服务器具备源数据库和目标数据库的元数据访问权限,需具有 SELECTCATALOGROLE 或DBA权限SQL PlusSQL Loader克隆 GitHub代码库,并为文件提供 chmod 755 权限如果选择的运行模式是 sqlldr,确保可以从工作区访问源数据库和目标数据库如果选择的运行模式是 dblink,则确保可以从工作区仅与目标数据库连接。

验证对象

以下表格总结了Oracle对象及其验证字段。

Oracle对象验证字段模式列表模式名称、配置文件、状态对象类型数据库对象类型、属性、属性位置、数据类型、数据类型长度序列序列起始位置、最后数字、最小值、最大值、状态、是否循环、缓存大小表表名、列名、列位置、列数据类型、数据长度表分区表名、表所有者、分区名约束约束名称、属性、属性类型、位置、状态索引索引名称、索引列名称、列位置、索引模式、状态索引分区索引名称、分区名称、状态视图视图名称、代码行数同义词同义词名称、表名、数据库链接触发器触发器名称、表所有者、表名称、触发类型、状态调度作业调度作业名称、状态队列队列名称、队列表、队列类型、入队启用、出队启用规则规则名称、规则所有者、规则状态Java对象名称、对象所有者调度程序程序名称、所有者、状态数据库链接数据库链接名称、用户、主机详细信息代码行计数验证每个代码对象的行数无效列表对象名称、对象类型、所有者Oracle补丁补丁ID、状态Oracle参数参数名称、实例ID、默认值、值SQL配置文件配置文件名称、状态角色角色名称角色和权限受让人、授予的权限、管理员选项系统权限受让人、权限、管理员选项表统计信息表名、行数大对象 (LOB)所有者、表名、列名数据库配置文件配置文件名称、资源名称对象计数对象类型、计数、所有者组合

执行模式验证

数据库迁移是一个多阶段的过程,通常包括评估、模式迁移、数据迁移、测试以及跨越多个阶段的许多其他步骤。您想要进行的Oracle数据库迁移的大小和类型将极大地决定您应使用的工具。对于Oracle数据库,我们可以使用导出和导入等本地工具,以及AWS工具如AWS DMS。

以下任务清单显示您在迁移过程中何时应进行模式验证:

配置源Oracle数据库服务器。配置目标Oracle数据库服务器。使用导出和导入过程执行代码迁移。执行模式和代码验证。

要验证模式转换,请使用所选的查询编辑器比较源Oracle数据库和目标Oracle数据库中的对象。

标准验证方法比较源数据库中的对象数量和目标数据库中的数量。您可以对任何模式对象执行计数验证,但仅凭计数验证并不总能满足最终用户。在前面讨论验证原因的部分中,我们介绍了为什么需要超越计数验证。用户通常寻求对象定义层次的验证。这就是为什么您必须编写自定义查询来从数据库中检索数据定义语言DDL并进行比较。

在本节中,我们将逐步介绍执行模式验证的步骤:

在将源Oracle数据库迁移到目标Oracle数据库后,验证源和目标中的模式列表对于零对象丢失至关重要。使用以下Oracle查询来比较模式列表的详细信息:

sqlselect usernameprofile passwordversions accountstatus from dbausers where username IN (schema1schema2)

请将您的Oracle用户名列表替换到 schemaname,如果您在源数据库中排除了任何模式或者在目标数据库中引入了一个新模式,请通过在先前及后续查询中添加WHERE子句过滤掉这些模式。

作为模式验证的一部分,您应验证源和目标数据库中对象类型的列表及其属性信息,以确保数据零丢失。使用以下Oracle查询比较对象类型的详细信息:

sqlSELECT ownertypenameattrnameattrtypenamereplace(( nvl(length nvl(precision 0)) ) (0) ) attrlengthattrno FROM dbatypeattrs WHERE owner in (schemaname)

使用以下代码验证序列:

sqlSELECT csequenceownercsequencenametochar(cminvalue)tochar(cmaxvalue)tochar(cincrementby)tochar(ccycleflag)tochar(ccachesize)tochar(clastnumber)FROM dbasequences cWHERE sequenceowner in (schemaname)

验证表:

sqlSELECT cowner ctablename ccolumnnamecdatatype ( ccharlengthCASE WHEN ccharused = C THEN CHAR WHEN ccharused = B THEN BYTE ELSE NULL END ) datatype ccolumnid colpositionFROM dbatabcols c dbatables tWHERE ccolumnid IS NOT NULLAND cowner in (schemaname)AND towner = cownerAND chiddencolumn = NOAND ttablename = ctablename

验证表分区:

sqlselect tableowner tablename partitionname from dbatabpartitions where tableowner in (schemaname)

验证约束:

sqlSELECT cownerctablenamecconstraintnameccolumnnamesconstrainttypecpositionsstatusFROM dbaconscolumns cdbaconstraints sWHERE stablename = ctablenameAND cowner = sownerAND cconstraintname = sconstraintnameAND cconstraintname NOT LIKE BINAND cconstraintname NOT LIKE SYSAND ctablename NOT LIKE BINAND ctablename NOT LIKE SYSAND cowner IN (schemaname)

验证索引:

sqlSELECT ctableownerctablenamecindexownercindexnameccolumnnameccolumnpositionistatusFROM dbaindexes i dbaindcolumns cWHERE iindexname = cindexnameAND iowner = cindexownerAND itableowner = ctableownerAND itablename = ctablenameAND itablename NOT LIKE SYSAND itablename NOT LIKE BINAND iindexname NOT LIKE SYSAND iindexname NOT LIKE BINAND iowner in (schemaname)

验证索引分区:

sqlselect indexownerindexnamepartitionnamestatusfrom DBAINDPARTITIONS where indexowner in (schemaname)

验证视图:

sqlselect ownerviewnametextlength from dbaviews where owner in (schemaname)

验证同义词:

sqlselect ownersynonymnametableownertablenamedblink from dbasynonyms where owner in (‘schemaname’)

验证触发器:

sqlselect ownertriggernametableowner tablenametriggeringeventtriggertypestatus from dbatriggers where owner in (schemaname)

验证调度作业:

sqlselect ownerjobnamestate from dbaschedulerjobs where owner in (schemaname)

验证队列:

sqlselect ownernamequeuetablequeuetypeENQUEUEENABLEDDEQUEUEENABLED from DBAQUEUES where owner in (schemaname)

验证规则:

sqlselect ownerobjectnameobjecttypestatus from dbaobjects where owner in (schemaname) and objecttype LIKE RULE

验证Java对象:

vn免费加速器试用一小时

sqlselect ownerobjectnameobjecttypestatus from dbaobjects where owner in (schemaname) and objecttype LIKE JAVA

验证调度程序:

sqlselect ownerprogramname programtype enabledfrom DBASCHEDULERPROGRAMS where owner in (‘schemaname’)

验证数据库链接:

sqlSELECT owner dblink username chr(34)replace(trim(host)chr(10))chr(34) hostdetailsFROM dbadblinks

验证代码对象的代码行数:

sqlselect owner name type count(line) from dbasource where owner in (schemaname) group by ownernametype

验证无效列表:

sqlselect owner objectname subobjectnameobjecttypestatus FROM dbaobjects WHERE status=INVALIDAND owner in (schemaname)

验证Oracle补丁:

sqlselect patchid from dbaregistrysqlpatch

Oracle 到 Oracle 的后迁移模式和代码验证 数据库博客

验证Oracle参数:

sqlSELECT instidnameDISPLAYVALUEDEFAULTVALUEvalueFROM gvparameter

验证SQL配置文件:

sqlSELECT name status FROM dbasqlprofiles

验证角色:

sqlSELECT rolepasswordrequired AUTHENTICATIONTYPE common oraclemaintained FROM dbaroles

验证角色和权限:

sqlSELECT granteegrantedroleadminoptionFROM dbaroleprivs

验证系统权限:

sqlSELECT grantee adminoption FROM dbasysprivs

验证表统计信息:

sqlselect sowner stablename decode(nvl(snumrows0)00 snumrows) numrowsfrom dbatables swhere sowner in (schemaname)

验证大对象 (LOB):

sqlselect lowner ltablename lcolumnname sum(sgbytes) bytesfrom dbalobs l dbasegments sgwhere lowner=sgowner and lsegmentname=sgsegmentnameand lowner in (schemaname)group by lownerltablenamelcolumnname

验证数据库配置文件:

sqlselect profileresourcename from dbaprofiles

验证按对象类型统计的对象数:

sqlSELECT COUNT(DISTINCT objectname) cnt objecttype owner FROM dbaobjects WHERE objectname NOT LIKE

订阅邮箱