绝大多数从本地Oracle数据库迁移到 Amazon Relational Database Service (Amazon RDS) forOracle 的作业都使用 和 或者通过RMAN使用 。根据迁移的大小和复杂性,迁移过程通常在模式级别和表级别上进行拆分。
在本文中,我们将介绍一种解决方案,帮助您在迁移后识别目标数据库中缺失的模式对象,并发现任何问题。我们使用一种工具来比较源数据库的Oracle模式对象与目标数据库的模式对象,并提供缺失对象的HTML格式列表。我们还讨论了迁移过程中可能遇到的各种问题,以及该工具如何帮助您主动修复迁移错误。
Oracle数据库复杂且灵活,因而可能需要验证您的对象。以下是一些需要进行导入/导出验证的常见原因:
ORA-39014: One or more workers have prematurely exited
和 ORA-39029: Worker 1 with process name "DW00" prematurely terminated
的错误。这是导出和导入过程的一种限制。因此,我们需要在EE 11g数据库中执行选定模式的导出,再导入到SE 19C数据库。ALTER TYPE
语句,因此需要手动转移。
ALTER TYPE "typ_name" ADD ATTRIBUTE emp_location varchar2(38) CASCADE; / ```
* 将对象的模式级导出和导入到目标数据库将最小化停机时间。然而,在 `expdp/impdp` 过程中会产生大量错误。识别这些错误是一项繁琐的任务。因此,这种完整性报告可以帮助您找到任何缺失的对象。
* 当源数据库没有停机时间时,您可以使用 或 Oracle GoldenGate。如果任何DDL语句不被工具支持,我们的解决方案可以帮助您找出这些缺失对象。
* 在数据迁移过程中,我们有时会在目标数据库中禁用触发器和外键约束,迁移后再启用。该工具可以捕捉到任何未能启用的对象。
* 如果源数据库代码已封装(通过 `DBMS_DDL.WRAP`),在将数据导入目标时,如果缺少Oracle补丁20594149,导入将失败。确保首先应用补丁20594149。
* 如果目标数据库是Amazon RDS,并缺少任何补丁(例如补丁8795792),导入可能会导致 。
* 如果未能将静态配置参数设置为与源数据库相似,切换后数据库将需要重启。
* 当使用 `expdp/impdp` 在模式和表级迁移数据库时会产生无效对象,这通常指的就是不同类型的对象,如同义词、函数、包、过程和引用了非现有对象的视图,或在某种方式发生过改变的对象。
* 源数据库的 需要进行审查。如果源数据库在本地,则数据库链接在迁移后将连接到旧数据库,因此需要手动更新。
* 是存储在数据字典中的信息集合,使查询优化器能够为SQL语句创建最佳的执行计划。在迁移过程中,如果您未迁移SQL配置文件,可能会导致性能问题。
## 解决方案概述
适用于12C及以上版本的以下用例:
* 本地Oracle到 (Amazon EC2) 及其反向
* 本地Oracle到Amazon RDS for Oracle及其反向
* Amazon EC2上的Oracle到Amazon RDS for Oracle及其反向
请将此脚本用于应用程序模式,而非SYS或SYSTEM模式的比较。
下面的图表展示了解决方案架构及本帖中使用的AWS服务。
删除)
## 先决条件
要跟随本帖进行操作,您需要满足以下先决条件:
* 具有连接到源数据库和目标数据库的EC2实例或堡垒服务器
* 具备源数据库和目标数据库的元数据访问权限,需具有 `SELECT_CATALOG_ROLE` 或DBA权限
*
*
* 克隆 ,并为文件提供 `chmod 755` 权限
* 如果选择的运行模式是 `sql_ldr`,确保可以从工作区访问源数据库和目标数据库
* 如果选择的运行模式是 `db_link`,则确保可以从工作区仅与目标数据库连接。
## 验证对象
以下表格总结了Oracle对象及其验证字段。
**Oracle对象** | **验证字段**
---|---
模式列表 | 模式名称、配置文件、状态
对象类型 | 数据库对象类型、属性、属性位置、数据类型、数据类型长度
序列 | 序列起始位置、最后数字、最小值、最大值、状态、是否循环、缓存大小
表 | 表名、列名、列位置、列数据类型、数据长度
表分区 | 表名、表所有者、分区名
约束 | 约束名称、属性、属性类型、位置、状态
索引 | 索引名称、索引列名称、列位置、索引模式、状态
索引分区 | 索引名称、分区名称、状态
视图 | 视图名称、代码行数
同义词 | 同义词名称、表名、数据库链接
触发器 | 触发器名称、表所有者、表名称、触发类型、状态
调度作业 | 调度作业名称、状态
队列 | 队列名称、队列表、队列类型、入队启用、出队启用
规则 | 规则名称、规则所有者、规则状态
Java | 对象名称、对象所有者
调度程序 | 程序名称、所有者、状态
数据库链接 | 数据库链接名称、用户、主机详细信息
代码行计数 | 验证每个代码对象的行数
无效列表 | 对象名称、对象类型、所有者
Oracle补丁 | 补丁ID、状态
Oracle参数 | 参数名称、实例ID、默认值、值
SQL配置文件 | 配置文件名称、状态
角色 | 角色名称
角色和权限 | 受让人、授予的权限、管理员选项
系统权限 | 受让人、权限、管理员选项
表统计信息 | 表名、行数
大对象 (LOB) | 所有者、表名、列名
数据库配置文件 | 配置文件名称、资源名称
对象计数 | 对象类型、计数、所有者组合
## 执行模式验证
数据库迁移是一个多阶段的过程,通常包括评估、模式迁移、数据迁移、测试以及跨越多个阶段的许多其他步骤。您想要进行的Oracle数据库迁移的大小和类型将极大地决定您应使用的工具。对于Oracle数据库,我们可以使用导出和导入等本地工具,以及AWS工具如AWSDMS。
以下任务清单显示您在迁移过程中何时应进行模式验证:
1. 配置源Oracle数据库服务器。
2. 配置目标Oracle数据库服务器。
3. 使用导出和导入过程执行代码迁移。
4. 执行模式和代码验证。
要验证模式转换,请使用所选的查询编辑器比较源Oracle数据库和目标Oracle数据库中的对象。
标准验证方法比较源数据库中的对象数量和目标数据库中的数量。您可以对任何模式对象执行计数验证,但仅凭计数验证并不总能满足最终用户。在前面讨论验证原因的部分中,我们介绍了为什么需要超越计数验证。用户通常寻求对象定义层次的验证。这就是为什么您必须编写自定义查询来从数据库中检索数据定义语言(DDL)并进行比较。
在本节中,我们将逐步介绍执行模式验证的步骤:
1. 在将源Oracle数据库迁移到目标Oracle数据库后,验证源和目标中的模式列表对于零对象丢失至关重要。使用以下Oracle查询来比较模式列表的详细信息:
`sql select username,profile, password_versions , account_status fromdba_users where username IN ('schema1','schema2',..)`
请将您的Oracle用户名列表替换到
`schema_name`,如果您在源数据库中排除了任何模式或者在目标数据库中引入了一个新模式,请通过在先前及后续查询中添加WHERE子句过滤掉这些模式。
1. 作为模式验证的一部分,您应验证源和目标数据库中对象类型的列表及其属性信息,以确保数据零丢失。使用以下Oracle查询比较对象类型的详细信息:
`sql SELECT owner,type_name,attr_name,attr_type_name,replace('('|| nvl(length,
nvl(precision, 0)) || ')', '(0)', '') attr_length,attr_no FROM dba_type_attrsWHERE owner in (schema_name);`
2. 使用以下代码验证序列:
`sql SELECTc.sequence_owner,c.sequence_name,to_char(c.min_value),to_char(c.max_value),to_char(c.increment_by),to_char(c.cycle_flag),to_char(c.cache_size),to_char(c.last_number)
FROM dba_sequences c WHERE sequence_owner in (schema_name)`
3. 验证表:
`sql SELECT c.owner, c.table_name, c.column_name, c.data_type|| '('||
c.char_length||CASE WHEN c.char_used = 'C' THEN ' CHAR' WHEN c.char_used = 'B'
THEN ' BYTE' ELSE NULL END|| ')' data_type, c.column_id col_position FROMdba_tab_cols c, dba_tables t WHERE c.column_id IS NOT NULL AND c.owner in
(schema_name) AND t.owner = c.owner AND c.hidden_column = 'NO' ANDt.table_name = c.table_name`
4. 验证表分区:
`sql select table_owner , table_name, partition_name from dba_tab_partitionswhere table_owner in ('schema_name');`
5. 验证约束:
`sql SELECTc.owner,c.table_name,c.constraint_name,c.column_name,s.constraint_type,c.position,s.statusFROM dba_cons_columns c,dba_constraints s WHERE s.table_name = c.table_nameAND c.owner = s.owner AND c.constraint_name = s.constraint_name ANDc.constraint_name NOT LIKE 'BIN%' AND c.constraint_name NOT LIKE 'SYS_%' ANDc.table_name NOT LIKE 'BIN%' AND c.table_name NOT LIKE 'SYS%' AND c.owner IN
(schema_name)`
6. 验证索引:
`sql SELECTc.table_owner,c.table_name,c.index_owner,c.index_name,c.column_name,
c.column_position,i.status FROM dba_indexes i, dba_ind_columns c WHEREi.index_name = c.index_name AND i.owner = c.index_owner AND i.table_owner =
c.table_owner AND i.table_name = c.table_name AND i.table_name NOT LIKE 'SYS%'
AND i.table_name NOT LIKE 'BIN%' AND i.index_name NOT LIKE 'SYS%' ANDi.index_name NOT LIKE 'BIN%' AND i.owner in (schema_name)`
7. 验证索引分区:
`sql select index_owner,index_name,partition_name,status fromDBA_IND_PARTITIONS where index_owner in (schema_name)`
8. 验证视图:
`sql select owner,view_name,text_length from dba_views where owner in
(schema_name)`
9. 验证同义词:
`sql select owner,synonym_name,table_owner,table_name,db_link fromdba_synonyms where owner in (‘schema_name’)`
10. 验证触发器:
`sql select owner,trigger_name,table_owner,
table_name,triggering_event,trigger_type,status from dba_triggers where ownerin (schema_name)`
11. 验证调度作业:
`sql select owner,job_name,state from dba_scheduler_jobs where owner in
(schema_name)`
12. 验证队列:
`sql select owner,name,queue_table,queue_type,ENQUEUE_ENABLED,DEQUEUE_ENABLEDfrom DBA_QUEUES where owner in (schema_name)`
13. 验证规则:
`sql select owner,object_name,object_type,status from dba_objects where ownerin (schema_name) and object_type LIKE 'RULE%'`
14. 验证Java对象:
`sql select owner,object_name,object_type,status from dba_objects where ownerin (schema_name) and object_type LIKE 'JAVA%'`
15. 验证调度程序:
`sql select owner,program_name, program_type, enabled fromDBA_SCHEDULER_PROGRAMS where owner in (‘schema_name’)`
16. 验证数据库链接:
`sql SELECT owner, db_link, username,
chr(34)||replace(trim(host),chr(10),'')||chr(34) host_details FROMdba_db_links`
17. 验证代码对象的代码行数:
`sql select owner, name, type, count(line) from dba_source where owner in
(schema_name) group by owner,name,type`
18. 验证无效列表:
`sql select owner, object_name, subobject_name,object_type,status FROMdba_objects WHERE status='INVALID' AND owner in (schema_name)`
19. 验证Oracle补丁:
`sql select patch_id from dba_registry_sqlpatch`
20. 验证Oracle参数:
`sql SELECT inst_id,name,DISPLAY_VALUE,DEFAULT_VALUE,value FROM gv$parameter`
21. 验证SQL配置文件:
`sql SELECT name, status FROM dba_sql_profiles`
22. 验证角色:
`sql SELECT role,password_required, AUTHENTICATION_TYPE, common,
oracle_maintained FROM dba_roles`
23. 验证角色和权限:
`sql SELECT grantee,granted_role,admin_option FROM dba_role_privs`
24. 验证系统权限:
`sql SELECT grantee, admin_option FROM dba_sys_privs`
25. 验证表统计信息:
`sql select s.owner, s.table_name, decode(nvl(s.num_rows,0),0,0, s.num_rows)
num_rows from dba_tables s where s.owner in (schema_name)`
26. 验证大对象 (LOB):
`sql select l.owner, l.table_name, l.column_name, sum(sg.bytes) bytes fromdba_lobs l, dba_segments sg where l.owner=sg.owner andl.segment_name=sg.segment_name and l.owner in (schema_name) group byl.owner,l.table_name,l.column_name`
27. 验证数据库配置文件:
`sql select profile,resource_name from dba_profiles;`
28. 验证按对象类型统计的对象数:
```sql SELECT COUNT(DISTINCT object_name) cnt, object_type, owner FROMdba_objects WHERE object_name NOT LIKE
Leave a Reply