本发明涉及一种数据脱敏方法,尤其涉及一种基于oracle数据库的海量数据脱敏方法。

背景技术:

oracle数据库是目前世界上使用最为广泛的数据库管理系统,作为一个通用的数据库系统,它具有完整的数据管理功能;作为一个关系数据库,它是一个完备关系的产品;作为分布式数据库它实现了分布式处理功能。数据脱敏,指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。这样就可以在开发、测试和其它非生产环境以及外包环境中安全地使用脱敏后的真实数据集。oracle数据库作为关系数据库时,大量的敏感信息需要进行脱敏处理。

现有的脱敏方法有以下两种:

方案1:使用简单的jdbc方式脱敏。

方案2:数据库维护人员通过执行oracle数据泵脚本将生产库a数据同步到测试库b,然后再对敏感字段执行update语法更新敏感数据。

现有的脱敏方法存在以下问题:

现有方案1会导致下面的问题:jdbc能抽取和加载数据,但当单表的数据量达到亿级时,会造成抽取和加载的性能都非常慢,甚至可能出现查询超时现象,无法完成脱敏任务的缺点。

现有方案2会导致下面的问题:因为数据泵要导出文件,要两倍于源始数据的空间,如果数据量过大会导致源数据库服务器硬盘空间不足;文件导出将导致在脱敏过程中敏感数据外泄,用update语法更新导致脱敏后,数据会失去数据特征且无法保证业务关联性,或造成脱敏后数据变得单一;操作难度大,人工操作容易遗漏。

技术实现要素:

本发明要解决的技术问题是提供一种基于oracle数据库的海量数据脱敏方法,解决上述问题。

本发明为解决上述技术问题而采用的技术方案是提供一种基于oracle数据库的海量数据脱敏方法,包括如下步骤:

s1:根据数据库中需要脱敏的表的数据量,对每个表进行数据分片;

s2:根据表的数据量分配定义线程管道组数和线程数量;

s3:执行表的所有线程管道的线程从数据库的原表中抽取数据分片脱敏后加载到目标表中,完成数据脱敏。

进一步的,所述表的数据分片为均匀分片,具体包括:每个表单独使用oracle的sample()函数均匀取出表的n个物理存储地址rowid,物理存储地址的数量根据oracle的表大小动态修改,直到抽取到合适的rowid数量,然后将rowid排序后两两为一区间划分成多个分片,分片完成后,表的所有分片sql都放入该表的分片队列;如果表为普通表,则对表进行一次分片,如果是分区表,则对表的每个分区都进行一次分片。

进一步的,所述表数据进行分区切片后,对分片进行重新排序,把不同的分区映射到不同磁盘进行i/o平衡,使多个线程能轮询获取到不同分区的分片,多个线程同时操作不同的磁盘。

进一步的,所述步骤s2具体包括:s21:根据表的数据量将表分为四类:分类一:数据量为0mb-10mb;分类二:数据量为10mb-1gb;分类三:数据量1gb-10gb;分类四,数据量大于10gb;s22:根据表的数据量的分类给每个表分配合适的线程管道组数:分类一分配1组线程管道;分类二分配4组线程管道;分类三分配16组线程管道;分类四分配32组线程管道;s23:分配的线程数量为线程管道的组数的3倍,所述线程分为抽取线程、脱敏线程和加载线程,每一组线程管道由对应设置的抽取线程、脱敏线程和加载线程组成,对应设置的抽取线程、脱敏线程和加载线程通过队列进行数据传递,组成一条串行的线程管道,所述抽取线程和脱敏线程通过管道队列一进行数据传递,所述脱敏线程和加载线程通过管道队列二进行数据传递。

进一步的,所述步骤s3中执行线程管道的线程具体包括:s311:线程管道的抽取线程去分片队列里轮询取出分片sql来连接oracle数据库读取数据,将数据发送到管道队列一;s312:线程管道的脱敏线程从管道队列一拉取数据,进行数据脱敏,将脱敏后数据传递到管道队列二;s313:线程管道的加载线程从管道队列二拉取数据,再加载到目标数据表。

进一步的,所述步骤s313中数据加载是通过直通路径加载到目标数据表,插入的数据通过oracle程序全局区直接把数据格式化成oracle块,然后由普通的oracle服务器进程把数据块写入目标数据表,把数据直接插入到段的高水位以上;数据加载到目标数据表的过程中禁用日志,生成最少量的redo和undo,减少目标数据库的i/o。

进一步的,进行单表的脱敏时,所述步骤s3中直接执行该表分配定义的每个线程管道的线程进行数据的抽取、脱敏和加载。

进一步的,进行多表脱敏时,所述步骤s3中通过线程总调度器来调度线程来执行所有表的线程管道的线程进行数据的抽取、脱敏和加载,具体包括如下步骤:s321:在线程总调度器中配置总线程管道数和总表数;s322:线程总调度器将需要脱敏的所有表,按照数据量从大到小进行排序;s323:将每个表分配定义的线程数量和线程管道组数交由线程总调度器保存,统一分配执行顺序;s324:线程总调度器按照表的排序依次执行每个表的第一组线程管道的线程,然后按照表的排序依次执行每个表的第二组线程管道的线程,直到总线程管道数分配完毕;s325:线程总调度器监听线程管道,如果有线程管道的线程执行完毕,继续按照步骤s324的顺序执行线程管道的线程进行数据的抽取、脱敏和加载,当线程总调度器监听到有表的所有线程管道的线程都执行完毕,那么线程总调度器给该表打上完成标记,直到所有表都打上完成标记,则完成所有表数据的脱敏。

进一步的,所述线程总调度器里存放有总管道数和总表数的配置值,所述总管道数和总表数的配置值通过主机cpu核心数和jvm内存大小计算得到或者根据任务指定。

进一步的,进行多表脱敏时,不同的表映射到不同表空间磁盘以平衡i/o,使多个线程能轮询获取到不同表的不同分区的分片,多个线程同时操作不同的磁盘。

本发明对比现有技术有如下的有益效果:本发明提供的基于oracle数据库的海量数据脱敏方法,通过表数据分片,分片均匀,提高数据抽取性能,实现高速数据抽取;通过直通路径加载,并采用禁用日志提高加载性能,实现单表下的高速数据加载;设置线程总调度器,实现线程动态分配提高加载性能,实现多表下的高速数据加载;全程脱敏都在内存中操作,保证数据不落地,确保数据不泄漏。

附图说明

图1为本发明实施例中基于oracle数据库的海量数据脱敏方法进行多表脱敏的示意图;

图2为本发明实施例中基于oracle数据库的海量数据脱敏方法进行单表脱敏的示意图。

具体实施方式

下面结合附图和实施例对本发明作进一步的描述。

图1为本发明实施例中基于oracle数据库的海量数据脱敏方法进行多表脱敏的示意图;图2为本发明实施例中基于oracle数据库的海量数据脱敏方法进行单表脱敏的示意图。

请参见图1和图2,本发明实施例的基于oracle数据库的海量数据脱敏方法,包括如下步骤:

第一步:根据数据库中需要脱敏的表的数据量,对每个表进行数据分片;

对每个表单独使用oracle的sample()函数均匀取出表的n个物理存储地址rowid,n的值根据oracle的表大小动态修改,直到抽取到合适的rowid数量,然后将rowid排序后两两为一区间划分成多个范围。这种分片方法性能超高,在10亿量数据表下也能毫秒就能切分完。分片完后,表的所有分片sql都放入该表的私有队列,例如表占用容量为10gb,表切出了64个分片,分配了16个管道,每个管道的抽取线程都去分片队列里轮询拿出分片sql来连接oracle读取数据,将数据发送到队列1,达到并发高效抽取性能。如果表是普通表只需要执行一次切片sql取出分片即可。如果是分区表,考虑到分区表通常都比较大,会对表的每个分区都执行一次切片sql,这样能更均匀切片。

第二步:根据表的数据量分配定义线程管道组数和线程数量;

根据oracle系统表查询源库中表数据量,将表按照0mb-10mb,10mb-1gb,1gb-10gb,大于10gb,分为4类,不同大小的表分配合适的线程数去处理,抽取、脱敏和加载各分配一个线程处理,分别为抽取线程、脱敏线程和加载线程,之间都有一条队列来传递数据,三个线程就组成了一条串行的线程管道,这样利用多线程并发的特性,提高cpu利用率,例如:cpu核数=16,调度任务设置的最大管道数=32,线程管道数分配如下:

分类一:0mb-10mb,表占用容量小,分配1组管道;

分类二:10mb-1gb,表占用容量一般,建议分配4组管道;

分类三:1gb-10gb,表占用容量略大,建议分配管道组数=调度任务设置的最大线程数/2=16;

分类四:大于10gb,表占用容量非常大,建议分配线程管道组数=调度任务设置的最大线程数=32。

第三步:执行表的所有线程管道的线程从数据库的原表中抽取数据分片脱敏后加载到目标表中,完成数据脱敏;

进行单表脱敏时,每个线程管道的抽取线程都去队列里轮询拿出分片sql来连接oracle读取数据,将数据发送到管道队列一;脱敏线程从管道队列一拉取数据,进行数据脱敏,将脱敏后数据传递到管道队列二;加载线程从管道队列二拉取数据,再加载到目标数据库。一组线程管道的三个线程协作能将抽取、脱敏、加载三个操作解耦,每个线程专注做一个事情,也尽可能利用多核cpu的特性达到数据脱敏的最佳性能。数据都是在内存中处理脱敏,所以保证了脱敏效率的同时又能保证数据不落地,确保数据不泄漏。因为在内存中脱敏,脱敏的算法可以无限扩展,不受数据库限制。

线程管道的加载线程拉取数据再加载到目标库时,如果表数据量达到亿级以上,普通的jdbc批量插入速度会比较慢,数据插入越往后就会越慢,速度程线性下降,为了达到最佳加载性能,通过直通路径加载、禁用日志并通过分区平衡加载提高加载效率。

直通路径加载:插入的数据不经过缓存,从oracle程序全局区直接把数据格式化成oracle块,然后由普通的oracle服务器进程把数据块写入数据文件,因为不经过缓存,所以不需要dbwn(databasewriterprocess)介入,避免了一些sql处理,并且加载把数据直接插入到段的高水位(hwm)以上,避免了大量搜索空闲数据块的时间。

禁用日志:使数据库在写入数据时不产生大量日志,从而生成了最少量的redo和undo(只生成数据字典的undo,不生成块中数据的undo),减少数据库的i/o,从而提高了插入性能。

分区平衡加载:因为oracle的分区原理是每个分区都是一个独立的段(segment),为了均衡i/o,可以把不同的分区映射到不同磁盘以平衡i/o,所以在第一步分区切片后,对分片进行重新排序,使多个线程能轮询获取到不同分区的分片,这样在并发抽取和加载时,多个线程就等于同时操作不同的磁盘,达到插入的最佳性能。

生产环境多数是整库或者整个集合来脱敏,针对多个表海量数据同时脱敏,要多个表的海量数据同时执行脱敏算法,有些脱敏算法比较复杂,消耗比较多的cpu资源,所以脱敏服务器执行的属于cpu密集型任务,因为cpu资源是有限的,如果不限制启动多线程的数量,会出现cpu上下文切换频繁,消耗大量的cpu时间,同时也可能导致cpu来不及处理数据,数据都积压在管道内(管道是用基于内存的队列arrayblockingqueue),导致jvm内存溢出。上下文切换可以认为是内核(操作系统的核心)在cpu上对于线程进行以下的活动:挂起一个线程,将这个线程在cpu中的状态(上下文)存储于内存中的某处,在内存中检索下一个线程的上下文并将其在cpu的寄存器中恢复,跳转到程序计数器所指向的位置(即跳转到线程被中断时的代码行),以恢复该线程。上下文切换有时被描述为内核挂起cpu当前执行的线程,然后继续执行之前挂起的众多线程中的某一个,上下文切换通常是计算密集型的。也就是说,它需要相当可观的处理器时间,在每秒几十上百次的切换中,每次切换都需要纳秒量级的时间,上下文切换对系统来说意味着消耗大量的cpu时间。

因此,进行多表脱敏时在单表脱敏的基础上增加了表平衡加载和线程动态分配。

表平衡加载:因为oracle的表是每个表都是一个独立的表段(segment),为了均衡i/o,可以把不同的表映射到不同表空间磁盘以平衡i/o,也因为机器的cpu是有限的,要将cpu合理分配去同时处理不同的表,才能最大限度地平衡i/o。

线程动态分配:通过增加线程总调度器来统一分配cpu线程来执行脱敏任务。

增加线程总调度器,并在调度器里存放了总管道数和总表数量的定义值,总管道数和总表数量的定义值由程序按照主机cpu核心数和jvm(javavirtualmachine)内存大小计算出最合适数量,也可以由用户执行任务时指定这个数量,以32个总管道数和100个表来说明,将任务要脱敏的100个表按大小容量排序,大容量的表排最前(先执行),小容量的表排后(后执行),空表排最后(最后执行),因为大容量的表脱敏耗时比较长,先执行会尽可能减少整体的任务时间。

线程总调度器获取第一个表,改表已经完成数据分片并分配定义线程管道组数和线程数量,线程管道里的线程只是分配好定义,但不执行,所有线程都交由线程总调度器保存起来,统一分配执行顺序,线程总调度器先执行表1-管道1的3个线程,总管道数-1,再获取第二个表,执行表2-管道2的3个线程,总管道数-1,再获取第三个表,执行表3-管道3的三个线程,如此类推,直到32个总管道数分配完毕,这里等于启动了32个表,每个表都启动了管道1,此时,线程总调度器会继续监听管道的执行状态,如果有管道执行完毕,总管道数+1,马上按上面步骤继续分配管道执行(从第33个表开始分配管道),直到100个表都启动完毕。这时100个表都启动了管道1的3个线程。当再有管道执行完毕,总管道数+1,线程总调度器会从执行表1-管道2的3个线程,因为表1大小容量最大,分片数也最多,多执行一组管道会线性地提高效率。当再有管道执行完,总管道数+1,再执行表2-管道2的3个线程,如此类推,当有表的数据全部脱敏并加载完毕,例如表90处理完,线程总调度器会打标记,表90不需要再执行管道,这样直到所有表的数据都处理完毕就结束任务。

综上所述,本发明实施例的基于oracle数据库的海量数据脱敏方法,通过表数据分片,分片均匀,提高数据抽取性能,实现高速数据抽取;通过直通路径加载,并采用禁用日志提高加载性能,实现单表下的高速数据加载;设置线程总调度器,实现线程动态分配提高加载性能,实现多表下的高速数据加载;全程脱敏都在内存中操作,保证数据不落地,确保数据不泄漏。

虽然本发明已以较佳实施例揭示如上,然其并非用以限定本发明,任何本领域技术人员,在不脱离本发明的精神和范围内,当可作些许的修改和完善,因此本发明的保护范围当以权利要求书所界定的为准。

当前第1页1&nbsp2&nbsp3&nbsp

数据分片排序oracle,基于ORACLE数据库的海量数据脱敏方法与流程相关推荐

  1. svm对未知数据的分类_基于SVM的高维不平衡数据分类方法与流程

    https://blog.csdn.net/weixin_39833270/article/details/111519043

  2. oracle网络加载错误怎么解决,Oracle加载数据库错误解决的方法详细教程

    今天小编给大家分享一篇关于Oracle加载数据库错误解决的方法详细教程,感兴趣的朋友跟小编一起来了解一下吧! 注意:安装时要保证Oracle安装目录不能带有中文字符 (如果第一次安装出现"加 ...

  3. R语言使用order函数对dataframe数据进行排序、基于多个字段(变量)进行升序排序(ASCENDING)

    R语言使用order函数对dataframe数据进行排序.基于多个字段(变量)进行升序排序(ASCENDING) 目录

  4. oracle失效对象是什么意思,Oracle中无效数据库对象的处理方法

    Oracle中无效数据库对象的处理方法 Oracle总是会尝试自动重编译无效的PL/SQL对象和视图,但是可能不会成功.虽然Oracle可能建议手动地进行编译,不过我们并非必须进行这个操作.通常无效对 ...

  5. Mysql出租车轨迹的分析_一种基于出租车轨迹数据的交通出行共现现象的可视化分析方法与流程...

    本发明涉及交通数据可视化领域,尤其涉及一种基于出租车轨迹数据的交通出行共现现象的可视化分析方法. 背景技术: :城市中人类移动规律中的共现现象是指来自两个区域的人们在同一个时间段内访问同一个城市区域. ...

  6. 数据分片排序oracle,Oracle数据库的优化

    摘要 本文提出了一种优化Oracle数据库的方法.Oracle中SQL语句的执行过程可分为解析(Parse).执行(Execute)和提取结果(Fetch)三步,此方法就是通过对SQL语句在Oracl ...

  7. 如何连接远程数据oracle数据库代码,Oracle连接远程数据库的四种方法

    Oracle数据库的远程连接可以通过多种方式来实现,本文我们主要介绍四种远程连接的方法和注意事项,并通过示例来说明,接下来我们就开始介绍 第一种方法: 若oracle服务器装在本机上,那就不多说了,连 ...

  8. 手机室内地磁定位软件_一种基于地磁的智能手机实时定位方法与流程

    本发明涉及室内地磁定位导航方法,具体涉及一种基于地磁的智能手机实时定位方法,属于移动计算和室内定位技术领域. 背景技术: 随着室内定位导航的日益需求,利用地磁信息作为位置指纹的室内定位导航技术显示出其 ...

  9. 在android添加数据采集,一种基于Android系统的地理信息数据采集方法与流程

    本方法属于采集地理信息数据的发明,是一种基于android操作系统和gis地理信息系统进行户外地理信息数据采集的方法. 背景技术: 众所周知地理信息数据采集在很多行业中都有应用,比如说农业中的土地普查 ...

最新文章

  1. 教育部:建设100+AI特色专业,500万AI人才缺口要补上!
  2. 关于 Python generator(生成器)的类比
  3. win下配置的ES中的数据在哪里可以看到?三种方式你看那种更加高大上!!!(win_Elasticsearch)
  4. java流与文件——操作文件
  5. 关于@property的一些用法
  6. python九九乘法表教程_python教程九九乘法表
  7. java 数组 转set_java中的list,set,数组之间的转换
  8. Windows开发签名工具(SignTool)下载
  9. python report_python之Reportlab模块
  10. EICU数据库安装教程
  11. 人脸识别打卡项目(7)
  12. 论文笔记:OntoED: Low-resource Event Detection with Ontology Embedding
  13. 苹果电脑各型号支持的macOS版本列表
  14. 如何监控前端页面FPS
  15. STM32L071 Flash写入的数据进行CRC-CCITT校验
  16. 利用word分词来计算文本相似度
  17. “Building Gradle project”一直不成功的解决方案(常见于ARCORE项目导出时)
  18. 科技创业企业密集关注网络电话等通信产业
  19. 数据挖掘_task2数据探索分析
  20. google autoaugment

热门文章

  1. python的科学计算库有哪些_python科学计算:带你初探scipy库的常量模块和函数模块...
  2. 多旋翼无人机控制器设计入门
  3. uploadify多图上传php,Uploadify多上传图片插件
  4. android中如何找到数据库文件
  5. linux内核源码分析之网络协议栈的演变
  6. Java 获取鼠标点击坐标
  7. 普通话测试范读作品14号-和时间赛跑
  8. 分类及回归问题——继续人脸颜值评分
  9. 通用方法配置Windows 10 1909 1903 2004等版本下配置多用户同时远程访问
  10. PostMan9.11.0安装以及汉化教程