今天是2014-08-19,我今天收到csdn给我发的申请博客专家的邀请,自己感觉实在羞愧啊。

自从换了工作也一直没有精力在写点东西了。今天我一个同事,在群里贴出了一个数据比对的包(DBMS_COMPARISON),可是这个包相比用的比較少。

所以今天就谈谈这个工具包的使用吧。

对于常常完数据迁移的朋友来说,在数据挪动之后,最重要也是最关键和最关心的一个问题是,目标端和源端的数据是否一致。数据的一致是否关系着大型oracle数据库数据迁移的成败与否。眼下非常多公司都開始研发自己的对照工具。如dsg的基于rowid的比对、基于minus的比对等等。可是数据库本身也是给我们提供了一个数据比对的接口,那就是这个DBMS_COMPARISON软件包。

DBMS_COMPARISION简单介绍:

这个软件包是oracle提供的能够再两个数据之间做object是比对。而且呢假设在比对过程中假设源端数据和目标端数据不一致。那么能够选择是从源端在将数据拷贝到目标端。还是从目标端在拷贝到源端。终于达到数据一致性的结果。该包也是通过创建dblink来实现的。这个工具的使用大体分为四步:

第一步:使用create_compare去创建一个比对动作

第二步:使用compare函数去进行数据对象之间的比对

第三步:我们在去查看比对结果,对应的record会记录到不同视图中例如以下:

DBA_COMPARISON_SCAN

USER_COMPARISON_SCAN

DBA_COMPARISON_SCAN_VALUES

USER_COMPARISON_SCAN_VALUES

DBA_COMPARISON_ROW_DIF

USER_COMPARISON_ROW_DIF

第四不:假设数据不一致,那么能够使用convert去将数据同步

大家可能会说,假设我进行了两次数据比对,那么怎样区分呢,这就是oracle自己会给你设计一个标示了。这个函数是recheck。

兴许介绍:

另一个问题。那就是这个包能做哪些数据比对?

答案是:对表、视图、物化视图、同义词等

DBMS_COMPARISION限制:

当然了不论什么一个工具都有自己的限制,那么这个包呢?

1、对于源端数据库版本号必须是高于11.1,对于目标端数据库版本号必须高于10.1

2.对于全部比对的数据库对象,必须是共享对象。也就是说每一个对象的列个数和列的类型必须一致。假设列不一致,那么须要将比对的列使用column_list做个列表。

Database objects of different types can be compared and converged at different databases. For example, a table at one database and a materialized view at another database can be compared and converged with this package.

以上是说了比較easy理解的限制,以下在说一下索引列的限制:

1、在全库比对模式下,必需要有一个在 number, timestamp, interval, or DATE 数据类型的单一索引列,或是唯独一个包含这几种数据类型的复合索引,可是这个复合索引中设计到的列必须都是not null或是当中一列是一个主键列。

2、

For the scan modes CMP_SCAN_MODE_FULL and CMP_SCAN_MODE_CUSTOM to be supported, the database objects must have one of the following types of indexes:

  • A single-column index on a number, timestamp, interval, DATE,
    VARCHAR2
    , or CHAR data type column

  • A composite index that only includes number, timestamp, interval, DATE,
    VARCHAR2, or CHAR columns. Each column in the composite index must either have a
    NOT NULL constraint or be part of the primary key.

假设数据库没有满足这些要求。那么这个包将无法进行数据比对。

if the database objects have only one index, and it is a composite index that includes a
NUMBER column and an NCHAR column, then the DBMS_COMPARISON package does not support them.

If these constraints are not present on a table, then use the index_schema_name and
index_name parameters in the CREATE_COMPARISON procedure to specify an index whose columns satisfy this requirement.

When a single index value identifies both a local row and a remote row, the two rows must be copies of the same row in the replicated tables. In addition, each pair of copies of the same row must always have the same index value.

DBms_comparison不支持的数据类型:

LONG、LANG RAW、ROWID、urowid、clob、nclob、blob、bfile另外还有例如以下两种:

1、udt(user-defined types,including object types, REFs, varrays, and nested tables)

2、oracle-supplied type (including any types, XML types, spatial types, and media types)

好了。了解这些后,我们就開始去亲自做一下,光说不练那不行。

第一创建dblink:

SQL> select * from dba_sys_privs rhys where rhys.privilege like upper('%link%');

GRANTEE                        PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
SYS DROP PUBLIC DATABASE LINK NO
SYS CREATE DATABASE LINK NO
OWB$CLIENT CREATE DATABASE LINK NO
IMP_FULL_DATABASE CREATE PUBLIC DATABASE LINK NO
RECOVERY_CATALOG_OWNER CREATE DATABASE LINK NO
DBA DROP PUBLIC DATABASE LINK YES
IMP_FULL_DATABASE DROP PUBLIC DATABASE LINK NO
OWBSYS CREATE DATABASE LINK YES
IMP_FULL_DATABASE CREATE DATABASE LINK NO
SYS CREATE PUBLIC DATABASE LINK NO
DBA CREATE PUBLIC DATABASE LINK YES GRANTEE PRIVILEGE ADM
------------------------------ ---------------------------------------- ---
DBA CREATE DATABASE LINK YES 12 rows selected. SQL> grant create database link to scott; Grant succeeded.
SQL> create database link comparison_link connect to scott identified by root using 'orac1';

Database link created.

SQL> show user
USER is "SCOTT"
SQL> select * from scott.emp@comparison_link; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO DEP
---------- ---------- --------- ---------- --------- ---------- ---------- ---------- ------------------------------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20 EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO DEP
---------- ---------- --------- ---------- --------- ---------- ---------- ---------- ------------------------------
7902 AMY ANALYST 7566 03-DEC-81 3000 20 12 rows selected. SQL>

第二步创建比对任务:

对了忘记提一下权限了。对于该包,要有例如以下权限:

SQL> grant execute on dbms_comparison to scott;

Grant succeeded.

SQL> grant execute_catalog_role to scott;

Grant succeeded.

SQL> 
SQL>  begin
2 dbms_comparison.create_comparison(
3 comparison_name=>'test1',
4 schema_name=>'SCOTT',
5 object_name=>'DEPT',
6 dblink_name=>'comparison_link'
7 );
8 end;
9 / PL/SQL procedure successfully completed. SQL>

好这样就做完第一步了。

当源端和目标端数据对象的列不一致的情况会出现例如以下错误:

SQL>  begin
2 dbms_comparison.create_comparison(
3 comparison_name=>'test1',
4 schema_name=>'SCOTT',
5 object_name=>'EMP',
6 dblink_name=>'comparison_link'
7 );
8 end;
9 /
begin
*
ERROR at line 1:
ORA-23625: Table shapes of SCOTT.EMP and SCOTT.EMP@COMPARISON_LINK did not match.
ORA-06512: at "SYS.DBMS_COMPARISON", line 5008
ORA-06512: at "SYS.DBMS_COMPARISON", line 448
ORA-06512: at line 2

那么怎么办呢?和我说的是做一个column_list;

第二步開始进行数据比对:

SQL> declare
2 compare_info dbms_comparison.comparison_type;
3 compare_return boolean;
4 begin
5 compare_return := dbms_comparison.compare (comparison_name=>'test1',
6 scan_info=>compare_info,
7 perform_row_dif=>TRUE);
8
9 if compare_return=TRUE
10 then
11 dbms_output.put_line('the tables are equivalent.');
12 else
13 dbms_output.put_line('Bad news... there is data divergence.');
14 dbms_output.put_line('Check the dba_comparison and dba_comparison_scan_summary views for locate the differences for scan_id:'||compare_info.scan_id);
15 end if;
16 end;
17 /
the tables are equivalent. PL/SQL procedure successfully completed. SQL>

第三步查看比对结果:

SQL> select * from user_comparison_scan
2 ; COMPARISON_NAME SCAN_ID PARENT_SCAN_ID ROOT_SCAN_ID STATUS CURRENT_DIF_COUNT INITIAL_DIF_COUNT COUNT_ROWS S LAST_UPDATE_TIME
-------------------- ---------- -------------- ------------ ---------------- ----------------- ----------------- ---------- - ----------------------------------------
TEST1 1 1 SUC 0 0 4 N 19-AUG-14 11.05.42.780593 PM
TEST1 2 2 SUC 0 0 4 N 19-AUG-14 11.11.37.613343 PM SQL> select * from user_comparison_row_dif; no rows selected SQL>

好了,简简单单就到这了。

当然假设敢兴趣能够自己在測试其它的。

我要把数据清掉了:

SQL> begin
2 dbms_comparison.purge_comparison(
3 comparison_name=>'test1');
4 end;
5 / PL/SQL procedure successfully completed. SQL> select * from user_comparison_scan; no rows selected SQL>

that's all!

谈oracle数据比对(DBMS_COMPARISON)的更多相关文章

  1. 浅谈Oracle事务【转载竹沥半夏】

    浅谈Oracle事务[转载竹沥半夏] 所谓事务,他是一个操作序列,这些操作要么都执行,要么都不执行,是一个不可分割的工作单元.通俗解释就是事务是把很多事情当成一件事情来完成,也就是大家都在一条船上,要 ...

  2. 浅谈oracle树状结构层级查询之start with ....connect by prior、level及order by

    浅谈oracle树状结构层级查询 oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的,虽然我是一个java程序开发者,我一直觉得只 ...

  3. 浅谈oracle树状结构层级查询测试数据

    浅谈oracle树状结构层级查询 oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的,虽然我是一个java程序开发者,我一直觉得只 ...

  4. 浅谈Oracle权限体系

    对于数据库来讲,安全性的重要程度不言而喻,今天我们就来聊一聊Oracle的权限体系. 1.账户管理 在此之前,先解释下一个容易混淆的概念:模式.所谓模式,指的是用户账户所拥有的一组对象(比如表,索引, ...

  5. 浅谈Oracle表之间各种连接

    Oracle表之间的连接分为三种: 1.内连接(自然连接) 2.外连接 2.1.左外连接(左边的表不加限制,查询出全部满足条件的结果) 2.2.右外连接(右边的表不加限制,查询出全部满足条件的结果) ...

  6. 浅谈Oracle中物理结构(数据文件等。。。)与逻辑结构(表空间等。。。。。)

    初始Oracle时很难理解其中的物理结构和逻辑结构,不明白内存中和硬盘中文件的区别和联系,我也是初学Oracle,这里就简单的谈谈我我看法. 首先,你需要明白的一点是:数据库的物理结构是由数据库的操作 ...

  7. 也谈Oracle异常: ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小

    场景: .Net程序调用Oracle方法 command.ExecuteNonQuery()执行存储过程;弹出如标题异常信息. 存储过程有4个输入参数,一个输出参数.一旦执行到给输出参数赋值的时候就报 ...

  8. 浅谈Oracle函数返回Table集合

    在调用Oracle函数时为了让PL/SQL 函数返回数据的多个行,必须通过返回一个 REF CURSOR 或一个数据集合来完成.REF CURSOR 的这种情况局限于可以从查询中选择的数据,而整个集合 ...

  9. 浅谈Oracle 性能优化

    基于大型Oracle数据库应用开发已有6个年头了,经历了从最初零数据演变到目前上亿级的数据存储.在这个经历中,遇到各种各样的性能问题及各种性能优化. 在这里主要给大家分享一下数据库性能优化的一些方法和 ...

随机推荐

  1. net clr via c sharp chap1-- note

    Tag-> 托管代码 Tag-> .NET Framework 系统环境检测 Tag-> 设置平台 Tag-> 查询64或32位机 Tag-> IL编译成机器指令 Tag ...

  2. 25、Base64

    Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3 ...

  3. Django 中CSRF中间件 'django.middleware.csrf.CsrfViewMiddleware',

    1.Django中CSRF中间件的工作原理及form表单提交需要添加{% csrf_token %}防止出现403错误 CSRF # 表示django全局发送post请求均需要字符串验证功能:防止跨站 ...

  4. [转]netstat -tnl 列出监听中的连接,查看端口是否开启

    任何网络服务的后台进程都会打开一个端口,用于监听接入的请求. 这些正在监听的套接字也和连接的套接字一样,也能被 netstat 列出来. 参数 tnl, 现在我们可以看到处于监听状态的 TCP 端口和 ...

  5. hdu1599 find the mincost route floyd求出最小权值的环

    find the mincost route Time Limit: 1000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  6. java2 实用教程第四章

    博主原创 转载请注明地址 博客:http://www.cnblogs.com/13224ACMer/ 1成员变量 声明变量所声明的变量被称为成员变量和域变量,成员变量在类中的书写位置与前后顺序无关, ...

  7. POJ 2355 Railway tickets

    Railway tickets Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2472   Accepted: 865 De ...

  8. beautifusouptest

    from bs4 import BeautifulSoupimport urllib.requesturl = "http://www.douban.com/tag/%E5%B0%8F%E8 ...

  9. Welcome-to-Swift-01基础部分

    Swift 是 iOS 和 OS X 应用开发的一门新语言.然而,如果你有 C 或者 Objective-C 开发经验的话,你会发现 Swift 的很多内容都是你熟悉的. Swift 的类型是在 C ...

  10. TensorFlow开发流程 Windows下PyCharm开发+Linux服务器运行的解决方案

    不知道是否有许多童鞋像我一样,刚开始接触TensorFlow或者其他的深度学习框架,一时间有一种手足无措的感觉. 怎么写代码?本机和服务器的关系是啥?需要在本机提前运行吗?怎么保证写的代码是对的??? ...