基于ORACLE数据库的海量数据脱敏方法与流程

文档序号:20686481发布日期:2020-05-08 18:52阅读:1105来源:国知局
基于ORACLE数据库的海量数据脱敏方法与流程

本发明涉及一种数据脱敏方法,尤其涉及一种基于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 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1