签到成功

知道了

CNDBA社区CNDBA社区

Oracle利用HASH值比较数据一致性

2017-05-10 10:31 9026 0 原创 Oracle 11G
作者: Expect-乐

通过dbms_utility.get_hash_value对对象取HASH值,如果两个对象的hash值相同那么就判断这两个对象的数据是一直的。这种在数据迁移,DG等环境中能用到,可以辅助我们判断数据的一致性。

 

dbms_utility.get_hash_value说明

官网的解释:这个函数是计算字符串的hash值。

语法:

DBMS_UTILITY.GET_HASH_VALUE (

   name      VARCHAR2,

   base      NUMBER,

   hash_size NUMBER)

  RETURN NUMBER;

Parameterhttp://www.cndba.cn/Expect-le/article/1907

Description

name

String to be hashed.

base

Base value for the returned hash value at which to start

http://www.cndba.cn/Expect-le/article/1907
http://www.cndba.cn/Expect-le/article/1907

hash_size

Desired size of the hash table

注意:Hash_size2的幂次方效果最好。

例子

2.1   创建一个表

http://www.cndba.cn/Expect-le/article/1907

SQL> create table aa as select * from dba_tables;

 

Table created.

2.2   获取该表的HASH

SQL> col aa format 9999999999999999999999999

SQL> select TO_NUMBER(sum(dbms_utility.get_hash_value(AVG_ROW_LEN || '|' || AVG_SPACE || '|' ||

                                       AVG_SPACE_FREELIST_BLOCKS || '|' ||

                                       BACKED_UP || '|' || BLOCKS || '|' ||

                2    3    4                           BUFFER_POOL || '|' || CACHE || '|' ||

                                       CELL_FLASH_CACHE || '|' || CHAIN_CNT || '|' ||

                                       CLUSTER_NAME || '|' || CLUSTER_OWNER || '|' ||

                       5    6    7                    COMPRESSION || '|' || COMPRESS_FOR || '|' ||

                                       DEGREE || '|' || DEPENDENCIES || '|' ||

                                       DROPPED || '|' || DURATION || '|' ||

                                        8    9   10   EMPTY_BLOCKS || '|' || FLASH_CACHE || '|' ||

                                       FREELISTS || '|' || FREELIST_GROUPS || '|' ||

                                       GLOBAL_STATS || '|' ||

                                       INITIAL_EXTENT || '|' || 11   12   13   INI_TRANS || '|' ||

                                       INSTANCES || '|' || IOT_NAME || '|' ||

                                       IOT_TYPE || '|' || LAST_ANALYZED || '|' ||

                                       LOGGING || '|' || MAX_EXTENTS || '|' 14   15   16   ||

                                       MAX_TRANS || '|' || MIN_EXTENTS || '|' ||

                                       MONITORING || '|' || NESTED || '|' ||

                                       NEXT_EXTENT || '|' ||

                                  17   18   19   20        NUM_FREELIST_BLOCKS || '|' ||

                                       NUM_ROWS || '|' || OWNER || '|' ||

                                       PARTITIONED || '|' || PCT_FREE || '|' ||

                                       PCT_INCREASE || '|' || PCT_ 21   22   23  USED || '|' ||

                                       READ_ONLY || '|' || RESULT_CACHE || '|' ||

                                       ROW_MOVEMENT || '|' || SAMPLE_SIZE || '|' ||

                                       SECONDARY || '|' || SEGMENT_CREATED  24   25   26  || '|' ||

                                       SKIP_CORRUPT || '|' || STATUS || '|' ||

                                       TABLESPACE_NAME || '|' || TABLE_LOCK || '|' ||

                                       TABLE_NAME || '|' || TEMPORARY || '|' ||

  27   28   29   30                                        USER_STATS,

                                       0,

                                       power(2, 30))))  aa

  from SYS.AA; 31   32   33  

 

AA

--------------------------

    1502809347775

注意:对一个表取hash值,需要把该表所有列都计算hash值,然后加起来才是这个表的hash值。所以对列多的表手动处理比较麻烦。利用下面的sql可以方便的处理。http://www.cndba.cn/Expect-le/article/1907

 

输入用户名称和表名,然后执行得打的SQL即可

select 'select sum(dbms_utility.get_hash_value(' || column_name_path ||

       ',0,power(2,30)) ) from ' || owner || '.' || table_name || ';'

  from (select owner,

               table_name,

               column_name_path,

               row_number() over(partition by table_name order by table_name, curr_level desc) column_name_path_rank

          from (select owner,

                       table_name,

                       column_name,

                       rank,

                       level as curr_level,

                       ltrim(sys_connect_by_path(column_name, '||''|''||'),

                             '||''|''||') column_name_path

                  from (select owner,

                               table_name,

                               column_name,

                               row_number() over(partition by table_name order by table_name, column_name) rank from dba_tab_columns where owner = UPPER('SYS') and table_name = UPPER('AA') order by table_name,

                               column_name)

                connect by table_name = prior table_name

                       and rank - 1 = prior rank))

 where column_name_path_rank = 1;

2.3   删除表中几条数据

http://www.cndba.cn/Expect-le/article/1907

SQL> delete aa where rownum <=10;

 

10 rows deleted.

 

SQL> commit;

 

Commit complete.

2.4   再次查看该表hash

可以看到hash值已经变了

http://www.cndba.cn/Expect-le/article/1907
http://www.cndba.cn/Expect-le/article/1907

http://www.cndba.cn/Expect-le/article/1907

SQL> select TO_NUMBER(sum(dbms_utility.get_hash_value(AVG_ROW_LEN || '|' || AVG_SPACE || '|' ||

                                       AVG_SPACE_FREELIST_BLOCKS || '|' ||

                                       BACKED_UP || '|' || BLOCKS || '|' ||

                2    3    4                           BUFFER_POOL || '|' || CACHE || '|' ||

                                       CELL_FLASH_CACHE || '|' || CHAIN_CNT || '|' ||

                                       CLUSTER_NAME || '|' || CLUSTER_OWNER || '|' ||

                       5    6    7                    COMPRESSION || '|' || COMPRESS_FOR || '|' ||

                                       DEGREE || '|' || DEPENDENCIES || '|' ||

                                       DROPPED || '|' || DURATION || '|' ||

                                        8    9   10   EMPTY_BLOCKS || '|' || FLASH_CACHE || '|' ||

                                       FREELISTS || '|' || FREELIST_GROUPS || '|' ||

                                       GLOBAL_STATS || '|' ||

                                       INITIAL_EXTENT || '|' || 11   12   13   INI_TRANS || '|' ||

                                       INSTANCES || '|' || IOT_NAME || '|' ||

                                       IOT_TYPE || '|' || LAST_ANALYZED || '|' ||

                                       LOGGING || '|' || MAX_EXTENTS || '|' 14   15   16   ||

                                       MAX_TRANS || '|' || MIN_EXTENTS || '|' ||

                                       MONITORING || '|' || NESTED || '|' ||

                                       NEXT_EXTENT || '|' ||

                                  17   18   19   20        NUM_FREELIST_BLOCKS || '|' ||

                                       NUM_ROWS || '|' || OWNER || '|' ||

                                       PARTITIONED || '|' || PCT_FREE || '|' ||

                                       PCT_INCREASE || '|' || PCT_ 21   22   23  USED || '|' ||

                                       READ_ONLY || '|' || RESULT_CACHE || '|' ||

                                       ROW_MOVEMENT || '|' || SAMPLE_SIZE || '|' ||

                                       SECONDARY || '|' || SEGMENT_CREATED  24   25   26  || '|' ||

                                       SKIP_CORRUPT || '|' || STATUS || '|' ||

                                       TABLESPACE_NAME || '|' || TABLE_LOCK || '|' ||

                                       TABLE_NAME || '|' || TEMPORARY || '|' ||

  27   28   29   30                                        USER_STATS,

                                       0,

                                       power(2, 30))))  aa

  from SYS.AA; 31   32   33  

 

AA

----------------------------------------------

     1496783041740

http://www.cndba.cn/Expect-le/article/1907

注意:该函数对列类型是LONG,LOB,CLOB等无法得到准确的hash值。

版权声明:本文为博主原创文章,未经博主允许不得转载。

hash值 数据一致

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
Expect-乐

Expect-乐

关注

Without the continuous bitter cold, there can be no fragrant plum blossom

  • 336
    原创
  • 6
    翻译
  • 100
    转载
  • 41
    评论
  • 访问:1548568次
  • 积分:1957
  • 等级:核心会员
  • 排名:第4名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ