传统上,数据的清理和归档属于DBA的职责,随着企业数字化转型、数据治理工作的推进,这项工作也被纳入了数据治理工作的重要内容。数据团队定期将应用系统线上过期的数据清理并归入数据湖中,以提供查询和分析所用。
为什么需要数据清洗和归档?
随着长时间的累积,一些关键的业务系统中积累了大量的历史交易数据,这些历史数据使得这些系统变得越来越庞大,并且在维护上也越来越复杂。
数据量的快速增长已经成为了IT管理部门所面对的最难于解决的问题之一,因为数据量的增长已经严重降低了应用程序的性能,降低了应用程序的稳定性,并且消耗了大量的投资,同时对备份与恢复也增加了巨大的负担。
对于IT管理部门来说,不能永无止境的投入大量资金来升级我们的存储、加大存储容量、提高服务器性能,以此来满足不断增长的数据量。提高存储容量和提高服务器的处理能力只能暂时的解决我们所面临的问题。通过数据清理和数据归档的实施可以有效的提高数据库性能,确保核心业务不会因为长时间数据积累而出现性能问题,从而应用可以更加迅捷地为客户提供优质服务,从而提高企业信誉、提升企业的核心竞争力。
数据清洗和归档方案
当前许多存储备份厂商都都提出数据清理和归档解决方案,提供了一整套的流程和技术来管理信息数据从产生时刻到该数据失去价值的整个过程。帮助客户制定数据在不同的生命周期阶段制定不同的访问和过期策略;帮助企业设置和执行数据生命周期过程中的数据管理策略,将历史交易数据从生产数据库上迁移到在线的归档数据库上(online archive)。
在线归档与离线归档(offline archive)的最大区别在于在线归档数据库保持对迁移后的归档数据的实时访问,而离线归档数据可以用于数据的长期保存,并提供有限的查询能力。
通过这种历史交易的迁移,使得企业能够在已有的IT架构基础上支持更好的应用系统性能,在无需服务器升级和存储扩容的基础上满足企业业务增长的需要。
同时在生产数据库上保存更少的数据能够有效的降低容灾、复制、备份和恢复的成本消耗,降低企业对于IT系统的总体拥有成本,尤其是后期的维护成本。
通过制定合理的数据归档方案,制定一套自动化管理的流程流程可以帮助客户建立历史数据的保留策略,提供历史数据的归档抽取、历史数据的保存、历史数据的检索等一体化功能,将历史数据从生产系统中重新迁移到归档数据库上。
帮助客户实现历史数据的分级存放,透明访问,提高生产系统的性能,降低IT的总体投资(TCO):1、定义数据生命周期的各个环节,包括数据的产生、访问、保留策略以及数据在不同的时间点上的服务级别需求(SLA);2、监控、预测数据的增长趋势,搭建和执行数据的过期策略,从而将历史交易数据定期从生产系统中迁移到在线的归档数据库上,创建一个用户可透明访问的历史数据管理平台;3、改造现有应用系统,使原有的业务系统可以透明访问历史数据。虽然最简单的方式是仿照生产系统搭建一套历史数据查询系统,但是最佳的解决方案还是在业务系统中进行改造升级,使用户感受不到数据归档带来的数据访问的变化。就像现在银行的当天交易查询和历史交易查询的融合,二十年前这两种查询要分开进行,十分不便。
数据分类归档的方式
任何数据都有一定的生命周期,从数据产生(输入或者被采集)到使用到过期。所不同的是数据的保存周期不同,数据的保存方式不同。
一般来说,根据数据生命周期和保管方式不同,可以分为几大类:
永久在线数据:这类数据不需要归档,从系统上线开始一直在线。这类数据的特点是数据量不大(一般从几十K到几百M不等),数据较为静态,变更量不大(比如参数数据、用户档案数据);
周期性在线数据:这类数据往往在某个周期性事件中被采集往往具有很强的时间周期特性(比如月度周期),这些数据在采集后被集中处理,处理形成汇总或者帐务数据。数据处理后,在一定周期内还需要被查询,一定时间周期后查询量逐渐减少;
工作流性质的数据:具有一定的实效性,根据流程的状态判断是否需要继续一级在线,归档不仅仅取决于时间,还取决于某些条件;
一级汇总数据:根据明细汇总的数据,可以在明细数据归档或者删除后提供统计查询。一般在线1年或者数年;
二级/多级汇总数据:在一级汇总数据基础上汇总的数据,数据量较小,可以长期保留;
临时数据:临时使用,使用后应该马上清理的数据。不过在往往清理力度不足,导致长期在线。每个数据在其生命周期内,其存储的方式也有多种形态, 根据其访问的便利性,我们分为:
生产库在线存放,当前数据:保存在生产库的当前数据表中;
生产库在线存放,历史数据:保存在生产库的历史数据表中(与生产数据同库,在软件设计阶段做好设计,让客户感受不到这种分表存储);
历史库在线存放:从生产库中转移到历史库,并在生产库中删除该数据;
离线归档存放:存放在离线介质中(比如对象存储、磁带库,光盘库等)。有些系统中生产库中没有区分历史数据和当前数据,是统一存放的,这样存放的好处是应用程序处理起来比较简单,不需要专门设计历史数据查询模块。
但缺点有几个方面:
1、生产数据逻辑备份耗时较长;
2、表的高水位过高,全表扫描的开销太大;
3、业务人员可能做随意的大范围查询,消耗过多资源。
由于历史原因导致这些数据较难进行历史归档,那么也可以利用某些数据库存在的ONLINE ARCHIVE在线归档功能进行在库归档。比如说Oracle数据库12c开始支持的在线数据归档功能,可以把某些数据记录标记为归档模式,此时普通的扫描操作就会绕过这些数据,只有通过alert session设置才能看到这些数据。这种数据归档方式虽然没有真正的归档效果好,不过也聊胜于无了。Oracle的这个功能是跟随着12c的数据全生命周期管理功能而来的。
数据归档的模式和场景
数据根据其特点分级管理除了能够明确的区分数据的使用范围,规范老数据的使用方式,还可以有效的控制IT系统容量增长的规模,使之从级数增长变为线性增长,减缓数据增长还可以有效的提高系统的性能。防止由于数据量过大带来的系统性能的大幅下降。
数据归档可以采取系统级定期归档和业务流程生命周期管理的方法。
系统级定期归档是脱离于具体应用模块的业务逻辑的,一般采取每天归档、月度归档、季度归档、年度归档几个粒度进行。每天归档一般通过定期任务完成,适合于每天归档数据不多的场合。这种归档粒度可以有效的控制数据的高水位问题,删除的空记录可以马上被重用。这种归档模式也有一定的局限性,比较适合生产系统上能够明确区分当前数据和历史数据的场合。
将数据从生产表复制到历史表后删除生产表的数据。如果系统中没有设计历史表,那么仅适用于历史数据不需要归档,只需要清除的场合。否则数据管理的难度较大。每天归档模式一般使用数据库的delete语句进行数据删除。
月度、季度和年度归档是最为常用的归档模式。每次清理的数据量较大,一般是数据先转储再清理。这种方式既适合同数据库的转储,也适合不同数据库的转储。
由于处理的数据量比较大,如果使用delete,处理时间较长,因此一般采用分区表操作来提高归档效率,比如通过交换分区的方式先将数据交换出去,然后再慢慢处理,这样就能避免对生产系统造成较大的影响。每日数据归档一般按照一定的条件进行数据归档处理,其主要特点是一般会根据某个时间戳条件外加一些其他的约束条件筛选符合归档条件的数据。归档方式主要有批量和单条两种方式。
月度、季度、年度数据归档都是一种相对长周期的数据归档,每次归档的数据量较大,因此归档方案选择上十分关键。
对于做每日数据归档的系统,一般来说月度、季度、年度数据归档的主要目的是从生产库中将历史查询表的数据归档到二级查询系统或者备份介质中。也有部分业务数据从生产表到历史表的转储也是采用月度或者年度的周期进行。
数据清理工作是可以和数据归档工作同步进行的,也可以单独进行。数据库使用时间长了,总会有一些碎片化的东西,比如表碎片、表空间碎片、文件碎片、索引碎片。
还有一些表的高水位异常,这些都会导致数据文件虚胖,数据库性能下降,定期进行数据清理工作也是十分必要的。通过shrink命令或者Move操作进行表的碎片整理,通过rebuild命令重建索引等工作都是十分有效的提高业务系统性能的小技巧。
总结
一个数据库运维人员,如果只是从数据库运行状态来进行监控与运维,不关注数据库中的数据的变化,也不进行数据归档与清理工作,那么你的DBA工作是不完整的。