【YashanDB知识库】对比Oracle和YashanDB对象不一致的方法

简介: 本文来自YashanDB官网,介绍从Oracle迁移到YashanDB后的数据校验方法。通过YMP工具迁移数据后,可使用其内置校验功能,或采用本文提供的复杂对比思路:将Oracle的DBA_*数据字典视图保存为用户表,借助YMP同步至YashanDB,再利用SQL查询两数据库间的差异。具体包括视图、存储过程、索引和约束等对象的对比方法,提供详细SQL示例以供参考和修改。

“本文内容来自YashanDB官网,原文内容请见https://www.yashandb.com/newsinfo/7323370.html?templateId=1718516

前言
通过YMP迁移Oracle到YashanDB对象后,YMP已经提供了校验功能,推荐使用YMP的校验功能。如果需要更复杂的对比方法,可采用本文中的对比思路和方法。

思路
保存Oracle的DBA_*数据字典视图到某用户的表,然后通过YMP传到YashanDB,最后使用YashanDB的DBeaver图形界面通过SQL来查询不一致。

方法
1、在Oracle执行,保存Oracle的DBA_*数据字典视图到Oracle用户的表

create user oracle identified by welcome1;

grant dba, resource, connect to oracle;



create table oracle.dba_objects as select * from sys.dba_objects;

create table oracle.dba_tables as select * from sys.dba_tables;

create table oracle.dba_indexes as select * from sys.dba_indexes;

create table oracle.dba_ind_columns as SELECT INDEX_OWNER, INDEX_NAME, TABLE_OWNER, TABLE_NAME, COLUMN_NAME, COLUMN_POSITION, COLUMN_LENGTH, DESCEND FROM SYS.DBA_IND_COLUMNS;

create table oracle.dba_constraints as SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME, INDEX_NAME, INDEX_OWNER, R_OWNER, R_CONSTRAINT_NAME, DELETE_RULE, STATUS, DEFERRABLE, DEFERRED, VALIDATED, GENERATED FROM SYS.DBA_CONSTRAINTS;

create table oracle.dba_cons_columns as SELECT OWNER, CONSTRAINT_NAME, TABLE_NAME, COLUMN_NAME, POSITION FROM SYS.DBA_CONS_COLUMNS;



create table oracle.dba_types as select * from sys.dba_types;

create table oracle.dba_views as SELECT OWNER, VIEW_NAME, TEXT_LENGTH, TEXT_VC FROM SYS.DBA_VIEWS;

create table oracle.dba_sequences as select * from sys.dba_sequences;

create table oracle.dba_source as select * from sys.dba_source;

create table oracle.dba_triggers as SELECT OWNER, TRIGGER_NAME, TRIGGER_TYPE, TRIGGERING_EVENT, TABLE_OWNER, BASE_OBJECT_TYPE, TABLE_NAME, COLUMN_NAME, REFERENCING_NAMES, WHEN_CLAUSE, STATUS, DESCRIPTION, ACTION_TYPE FROM SYS.DBA_TRIGGERS;

2、通过YMP将Oracle用户下的第一步保存的数据字典信息表同步到YashanDB数据库的Oracle用户

3、在YashanDB执行,保存SYS的DBA_*数据字典视图到Yashan用户的表

create user yashan identified by welcome1;

grant dba to yashan;



create table yashan.dba_objects as select * from sys.dba_objects;

create table yashan.dba_tables as select * from sys.dba_tables;

create table yashan.dba_indexes as select * from sys.dba_indexes;

create table yashan.dba_ind_columns as SELECT INDEX_OWNER, INDEX_NAME, TABLE_OWNER, TABLE_NAME, COLUMN_NAME, COLUMN_POSITION, COLUMN_LENGTH, DESCEND FROM SYS.DBA_IND_COLUMNS;

create table yashan.dba_constraints as SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME, INDEX_NAME, INDEX_OWNER, R_OWNER, R_CONSTRAINT_NAME, DELETE_RULE, STATUS, DEFERRABLE, DEFERRED, VALIDATED, GENERATED FROM SYS.DBA_CONSTRAINTS;

create table yashan.dba_cons_columns as SELECT OWNER, CONSTRAINT_NAME, TABLE_NAME, COLUMN_NAME, POSITION FROM SYS.DBA_CONS_COLUMNS;



create table yashan.dba_types as select * from sys.dba_types;

create table yashan.dba_views as SELECT OWNER, VIEW_NAME, TEXT_LENGTH, TEXT FROM SYS.DBA_VIEWS;

create table yashan.dba_sequences as select * from sys.dba_sequences;

create table yashan.dba_source as select * from sys.dba_source;

create table yashan.dba_triggers as SELECT OWNER, TRIGGER_NAME, TRIGGER_TYPE, TRIGGERING_EVENT, TABLE_OWNER, BASE_OBJECT_TYPE, TABLE_NAME, COLUMN_NAME, REFERENCING_NAMES, WHEN_CLAUSE, STATUS, DESCRIPTION, ACTION_TYPE FROM SYS.DBA_TRIGGERS;

4、利用数据库能力,直接对比Oracle用户和YashanDB用户的差异。以下只是参考SQL,请根据需要更改以下SQL:
1)查询视图差异

SELECT

        object_type,

        owner,

        object_name,

        o_status,

        y_status

FROM

        (

        SELECT

                nvl(o.object_type, y.object_type) object_type,

                nvl(o.owner, y.owner) owner,

                nvl(o.object_name, y.object_name) object_name,

                o.status o_status,

                y.status y_status

        FROM

                (

                SELECT

                        object_type,

                        owner,

                        object_name,

                        status

                FROM

                        oracle.DBA_OBJECTS

                WHERE

                        OWNER IN ('HR', 'OE', 'SH', 'BI', 'PM', 'IX')

                        AND OBJECT_TYPE = 'VIEW') o

        FULL OUTER JOIN

        (

                SELECT

                        object_type,

                        owner,

                        object_name,

                        status

                FROM

                        yashan.DBA_OBJECTS

                WHERE

                        OWNER IN ('HR', 'OE', 'SH', 'BI', 'PM', 'IX')

                                AND OBJECT_TYPE = 'VIEW') y

ON

                o.object_type = y.object_type

                AND o.owner = y.owner

                AND o.object_name = y.object_name

        ORDER BY

                o.object_type,

                o.owner,

                o.object_name

)

WHERE

        nvl(o_status, 'NOT_EXISTS_IN_ORACLE') != nvl(y_status, 'NOT_EXISTS_IN_YASHAN')

;

2)查询PROCEDURE差异

SELECT

        object_type,

        owner,

        object_name,

        o_status,

        y_status

FROM

        (

        SELECT

                nvl(o.object_type, y.object_type) object_type,

                nvl(o.owner, y.owner) owner,

                nvl(o.object_name, y.object_name) object_name,

                o.status o_status,

                y.status y_status

        FROM

                (

                SELECT

                        object_type,

                        owner,

                        object_name,

                        status

                FROM

                        oracle.DBA_OBJECTS

                WHERE

                        OWNER IN ('HR', 'OE', 'SH', 'BI', 'PM', 'IX')

                        AND OBJECT_TYPE = 'PROCEDURE') o

        FULL OUTER JOIN

        (

                SELECT

                        object_type,

                        owner,

                        object_name,

                        status

                FROM

                        yashan.DBA_OBJECTS

                WHERE

                        OWNER IN ('HR', 'OE', 'SH', 'BI', 'PM', 'IX')

                                AND OBJECT_TYPE = 'PROCUDURE') y

ON

                o.object_type = y.object_type

                AND o.owner = y.owner

                AND o.object_name = y.object_name

        ORDER BY

                o.object_type,

                o.owner,

                o.object_name

)

WHERE

        nvl(o_status, 'NOT_EXISTS_IN_ORACLE') != nvl(y_status, 'NOT_EXISTS_IN_YASHAN')

3)查询INDEX差异

SELECT

        TABLE_OWNER,

        TABLE_NAME,

        o_index_colum_list,

        y_index_colum_list

FROM

        (

        SELECT

                nvl(o.TABLE_OWNER, y.TABLE_OWNER) TABLE_OWNER,

                nvl(o.TABLE_NAME, y.TABLE_NAME) TABLE_NAME,

                o.index_colum_list o_index_colum_list,

                y.index_colum_list y_index_colum_list

        FROM

                (

                SELECT

                        TABLE_OWNER,

                        TABLE_NAME,

                        LISTAGG(COLUMN_NAME, ',') WITHIN GROUP(

                ORDER BY

                        COLUMN_POSITION) index_colum_list

                FROM

                        oracle.DBA_IND_COLUMNS

                WHERE

                        TABLE_OWNER IN ('HR', 'OE', 'SH', 'BI', 'PM', 'IX')

                GROUP BY

                        TABLE_OWNER,

                        TABLE_NAME) o

        FULL OUTER JOIN

(

                SELECT

                        TABLE_OWNER,

                        TABLE_NAME,

                        LISTAGG(COLUMN_NAME, ',') WITHIN GROUP(

                ORDER BY

                        COLUMN_POSITION) index_colum_list

                FROM

                        yashan.DBA_IND_COLUMNS

                WHERE

                        TABLE_OWNER IN ('HR', 'OE', 'SH', 'BI', 'PM', 'IX')

                GROUP BY

                        TABLE_OWNER,

                        TABLE_NAME) y

ON

                o.TABLE_OWNER = y.TABLE_OWNER

                AND o.TABLE_NAME = y.TABLE_NAME

        ORDER BY

                1,

                2

)

WHERE

        nvl(o_index_colum_list, 'NOT_EXISTS_IN_ORACLE') != nvl(y_index_colum_list, 'NOT_EXISTS_IN_YASHAN')

;

4)查询约束差异

SELECT

        OWENR,

        TABLE_NAME,

        CONSTRAINT_TYPE,

        o_cons_column_list,

        y_cons_column_list

FROM

        (

        SELECT

                NVL(o.OWNER, y.OWNER) OWENR,

                NVL(o.TABLE_NAME, y.TABLE_NAME) TABLE_NAME,

                NVL(o.CONSTRAINT_TYPE, y.CONSTRAINT_TYPE) CONSTRAINT_TYPE,

                o_cons_column_list,

                y_cons_column_list

        FROM

                (

                SELECT

                        dc.OWNER,

                        dc.TABLE_NAME,

                        dc.CONSTRAINT_TYPE,

                        dc.CONSTRAINT_NAME,

                        listagg(dcc.COLUMN_NAME, ',') WITHIN GROUP(

                ORDER BY

                        dcc.POSITION) o_cons_column_list

                FROM

                        ORACLE.DBA_CONSTRAINTS dc,

                        oracle.DBA_CONS_COLUMNS dcc

                WHERE

                        dc.OWNER IN ('HR', 'OE', 'SH', 'BI', 'PM', 'IX')

                        AND dc.OWNER = dcc.OWNER

                        AND dc.TABLE_NAME = dcc.TABLE_NAME

                        AND dc.CONSTRAINT_NAME = dcc.CONSTRAINT_NAME

                GROUP BY

                        dc.OWNER,

                        dc.TABLE_NAME,

                        dc.CONSTRAINT_TYPE,

                        dc.CONSTRAINT_NAME) o

        FULL OUTER JOIN

(

                SELECT

                        dc.OWNER,

                        dc.TABLE_NAME,

                        dc.CONSTRAINT_TYPE,

                        dc.CONSTRAINT_NAME,

                        listagg(dcc.COLUMN_NAME, ',') WITHIN GROUP(

                ORDER BY

                        dcc.POSITION) y_cons_column_list

                FROM

                        ORACLE.DBA_CONSTRAINTS dc,

                        oracle.DBA_CONS_COLUMNS dcc

                WHERE

                        dc.OWNER IN ('HR', 'OE', 'SH', 'BI', 'PM', 'IX')

                                AND dc.OWNER = dcc.OWNER

                                AND dc.TABLE_NAME = dcc.TABLE_NAME

                                AND dc.CONSTRAINT_NAME = dcc.CONSTRAINT_NAME

                        GROUP BY

                                dc.OWNER,

                                dc.TABLE_NAME,

                                dc.CONSTRAINT_TYPE,

                                dc.CONSTRAINT_NAME) y

ON

                o.OWNER = y.OWNER

                AND o.TABLE_NAME = y.TABLE_NAME

                AND o.CONSTRAINT_TYPE = y.CONSTRAINT_TYPE

                AND o.o_cons_column_list = y.y_cons_column_list

)

WHERE

        nvl(o_cons_column_list, 'NOT_EXISTS_IN_ORACLE') != nvl(y_cons_column_list, 'NOT_EXISTS_IN_YASHAN')

;
相关文章
|
6月前
|
SQL 存储 关系型数据库
【YashanDB知识库】共享从 MySQL异常处理CONTINUE HANDLER的改写方法
【YashanDB知识库】共享从 MySQL异常处理CONTINUE HANDLER的改写方法
|
5月前
|
Oracle 安全 关系型数据库
【Oracle】使用Navicat Premium连接Oracle数据库两种方法
以上就是两种使用Navicat Premium连接Oracle数据库的方法介绍,希望对你有所帮助!
1126 28
|
5月前
|
SQL 测试技术 数据库
【YashanDB知识库】IMP跨网络导入慢问题
问题现象:290M数据,本地导入2分钟,跨机导入耗时显著增加(最高30分钟)。 原因分析:`imp`逐条SQL通过网络传输至yashanDB执行,交互频繁导致性能下降。 影响版本:客户测试环境22.2.8.3。 解决方法:将导入文件上传至与yashanDB同机后使用`imp`,减少网络延迟。 经验总结:优化`imp`工具,支持直接上传文件至服务器端执行,降低网络依赖。
|
5月前
|
监控 数据库
【YashanDB 知识库】ycm 托管数据库时报错 OM host ip:127.0.0.1 is not support join to YCM
在托管数据库时,若 OM 的 IP 被设置为 127.0.0.1,将导致无法托管至 YCM,并使数据库失去监控。此问题源于安装时修改了 OM 的监听 IP。解决方法包括:将 OM 的 IP 修改为本机实际 IP 或 0.0.0.0,同时更新 env 文件及 yasom 后台数据库中的相关配置。经验总结指出,应避免非必要的后台 IP 修改,且数据库安装需遵循规范,不使用仅限本机访问的 IP(如 127.0.0.1)。
|
5月前
|
监控 网络安全 数据库
YashanDB 知识库:ycm 纳管主机安装 YCM-AGENT 时报错 “任务提交失败,无法连接主机”
在安装 ycm-agent 纳管主机时,可能出现因端口未开放导致的报错问题。此问题会阻止 YCM 对主机和数据库的监控功能,影响版本为 `yashandb-cloud-manager-23.2.1.100-linux-aarch64.tar`。原因是目标主机(如 10.149.223.121)未开放 9070 或 9071 端口。解决方法包括关闭防火墙、添加白名单或开放指定端口,需与管理员确认操作。处理过程涉及网络检查、端口测试等步骤。端口问题解决后,若再次安装报唯一键错误,需先移除失败主机再重试。
|
5月前
|
监控 Java Shell
【YashanDB 知识库】ycm 托管数据库时,数据库非 OM 安装无法托管
本文主要介绍了因数据库未按规范使用 yasboot 安装导致的问题及解决方法。问题表现为无 yasom 和 yasagent 进程,且目录结构缺失,致使 ycm 无法托管与监控。分析发现可能是数据库版本旧或安装不规范引起。解决方法为先生成配置文件,安装 yasom 和 yasagent,再生成并修改托管配置模板,最终通过命令完成托管至 yasom 和 ycm。总结强调了按规范安装数据库的重要性以避免类似问题。
|
6月前
|
SQL 关系型数据库 MySQL
【YashanDB知识库】MySQL field 函数的改写方法
【YashanDB知识库】MySQL field 函数的改写方法
|
6月前
|
数据库
【YashanDB知识库】服务器重启后启动yasom和yasagent进程时有告警
【YashanDB知识库】服务器重启后启动yasom和yasagent进程时有告警
|
6月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
|
6月前
|
数据库
【YashanDB知识库】服务器重启后启动yasom和yasagent进程时有告警
本文介绍了YashanDB在特定场景下的问题分析与解决方法。当使用yasboot重启数据库后,yasom和yasagent进程虽启动成功但出现告警,原因是缺少libnsl.so.1库文件或环境变量配置错误。解决步骤包括:检查系统中是否存在该库文件,若不存在则根据操作系统类型安装(有外网时通过yum或apt,无外网时创建符号链接),若存在则调整环境变量配置,并重新启动相关进程验证问题是否解决。

推荐镜像

更多