如何设计出一个比较合理的数据归档系统
在任何的数据库系统中,大部分都会有一个需求,数据归档,业务数据库不应该是永无止境的进行数据存取的目的地。业务数据库主要的功能是满足业务的保留数据的需求,以及相关保证性能等目的。如果留存的数据业务已经不再需要,并且已经影响了性能,则归档是必须要做的一件事情。
首先如果要做数据归档,我会想到以下问题
1 首先需要和业务以及开发确认哪些表时可以被归档的
2 需要确认业务数据库中数据的留存时间,例如保留5年以内的数据,或者3个月以内的数据,这都是一个数据留存的范围,
3 每次归档的时间段,例如一个月一归档,还是一年做一次归档,如果数据量大的情况下,自动化的数据归档是比较省心省力的
4 一些意外情况,例如写好的归档程序,运行良好,但某天开始不能进行归档,首先要考虑是不是原表的结构有变动,例如增加了字段,或者字段的类型可能有变化
5 数据的归档,采用的方式也很多,例如可以通过传统的数据备份的方式进行数据的归档,通过实践条件,将需要备份的数据导出,在将其删除,也可以通过数据EXPORT 到其他位置的方式,至于那种好,那就要看具体的情况而定了。
6 数据归档后的数据留存的介质以及留存的时间,一般来说这个很少被提起,在数据归档的初期,但如果你不说,经过几年下来,你会发现你归档数据的位置也会产生某些问题,例如存储空间的问题,或者业务要查询这些历史记录,而发现查的非常慢,或者根本就查不到的问题
7 数据的归档中,也可能产生各种错误,而怎么将这些情况如实的反应到归档系统中,则是必须的工作。
8 数据归档的精度的问题,很可能由于某些原因,某些数据已经被复制到归档系统,但由于错误,数据再次通过程序导入到归档系统怎么处理的问题,容错率的问题需要被考虑。
下面举一个列子,请忽略由于不同数据库引起的SQL 语句的不同,只看逻辑
REATE PROCEDURE archive_table
AS
BEGIN
SET NOCOUNT ON;
if Exists(select top 1 * from sysObjects where Id=OBJECT_ID(N'core_archive') and xtype='U')
DECLARE @source_database nvarchar(50),@source_table nvarchar(100),@destination_table nvarchar(100),@skip_status tinyint,@archive_num tinyint,@key_column varchar(100)
DECLARE @sql NVARCHAR(500)
DECLARE cur CURSOR STATIC
FOR
SELECT source_database,source_table ,destination_table ,skip_status ,archive_num ,key_column FROM [DB_ASC_ACHIVE].[dbo].[core_archive] where skip_status = 0
OPEN cur
FETCH NEXT FROM cur INTO @source_database,@source_table ,@destination_table ,@skip_status ,@archive_num ,@key_column
WHILE ( @@fetch_status = 0 )
BEGIN
select @source_database,@source_table ,@destination_table ,@skip_status ,@archive_num ,@key_column
declare @db nvarchar(50)
if @source_database = 'ACS.dbo.'
set @db= 'acstest.dbo.'
else
set @db = 'aaptest.dbo.'
select @sql = ('insert into ' + 'DB_ASC_ACHIVE.dbo.' + @destination_table + ' select * from ' + @db + @source_table + ' where ' + @key_column + ' < ''' + convert(varchar(20),dateadd(month,-3,getdate()),120) ) + ''''
declare @ssql nvarchar(1000)
declare @rum int
select @ssql = (' select @count=count(*) from ' + @db + @source_table + ' where ' + @key_column + ' < ''' + convert(varchar(20),dateadd(month,-3,getdate()),120) ) + ''''
exec sp_executesql @ssql,N'@count int out', @rum out
select @rum
insert into [dbo].[archive_history] (start_time,end_time,table_name,database_name,row_number,done_status) values (getdate(),'9999-12-12',@source_table,@db,@rum,0)
execute (@sql)
declare @dsql nvarchar(1000)
select @dsql = ('delete from ' + @db + @source_table + ' where ' + @key_column + ' < ''' + convert(varchar(20),dateadd(month,-3,getdate()),120) ) + ''''
select @dsql
execute (@dsql)
update [dbo].[archive_history] set end_time = getdate(),done_status = 1 where id =( select top 1 id from [dbo].[archive_history] order by start_time desc)
FETCH NEXT FROM cur INTO @source_database,@source_table ,@destination_table ,@skip_status ,@archive_num ,@key_column
END
CLOSE cur
DEALLOCATE cur
END
GO
其中有两点需要注意,
1 归档的程序不要写死,如果在存储过程中,指名道姓的写出需要归档的表名,或目的表名,这样虽然简单,但如果后期归档的表变化,或者添加归档的表,则还需要修改存储过程
2 归档必须有历史记录,记录归档的表,以及开始的时间,结束的时间,以及归档的行数,以备运维人员查询。
3 任何程序或者脚本都不可能不出错,而记录错误,终止程序则是必须的设置
以上的存储过程在第三点上还不完善,还需要进行改善。
如何设计出一个比较合理的数据归档系统相关推荐
- 如何设计出一个有灵魂的「签到功能」?
本文为PMCAFF专栏作者迷路的威廉出品 提到签到功能,想必是个人都并不陌生,有些人对它可能嗤之以鼻,不屑于去签到,有些人则可能是乐此不疲,深深陷入其中. 说实话,签到确实是一种基础功能,有的PD认为 ...
- 怎样设计出一个起飞的Token
怎样设计出一个起飞的Token ==最近发现网络上一篇不错的文章,故转载以便更多的人可以看到= 不久前,我在在前后端分离实践中提到了基于 Token 的认证,现在我们稍稍深入一些. 通常情况下,我们在 ...
- 平面设计零基础怎么设计出一个完美的名片
本文由:"学设计上兔课网"原创,图片素材来自网络,仅供学习分享 平面设计零基础怎么设计出一个完美的名片?每个人都会有专属的名片,好的名片可以让你的商业精英形象愈发生动起来.今天,为 ...
- 怎么设计出一个简约艺术感海报?这个PS设计教程很详细!
本文由:"学设计上兔课网"原创,图片素材来自网络,仅供学习分享 怎么设计出一个简约艺术感海报?这个PS设计教程很详细!今天兔课菌教大家使用PS快速制作简约艺术感海报,看上去非常有艺 ...
- python四瓣花图形_如何使用Inscape设计工具设计出一个四瓣花朵图
在使用矢量图形时,利用Inscape设计工具绘制多个圆形,并利用圆形的特性设计出一个四瓣图形,然后使用图形的形态交叉光滑效果,形成一个花瓣图形.下面利用一个实例说明,操作如下: 工具/原料 Insca ...
- css3魔方3乘3每层旋转_如何使用css3设计出一个立体旋转魔方?
需要先了解的知识: ①了解CSS的2d下的transform变化下的平移(translate)和旋转(rotate). ②了解CSS的3d下的transform变化下的平移和旋转. ③使用transf ...
- 一个springboot能支持多少并发_吃透这篇,你也能搭建出一个高并发和高性能的系统...
" 什么是高并发?高并发是互联网分布式系统架构的性能指标之一,它通常是指单位时间内系统能够同时处理的请求数,简单点说,就是 QPS(Queries Per Second). 那么我们在谈论高 ...
- php ssc 源码_吃透这篇,你也能搭建出一个高并发和高性能的系统
什么是高并发?高并发是互联网分布式系统架构的性能指标之一,它通常是指单位时间内系统能够同时处理的请求数,简单点说,就是 QPS(Queries Per Second). 那么我们在谈论高并发的时候,究 ...
- 软件体系结构设计文档_一个java架构师是如何设计出一个好的架构的
一.架构的定义 所谓一千个架构师中有一千种"最好的架构"模式. "架构"是我们行业中非常普遍的词,表示它也必须是经过长时间磨合后形成的词. 架构一词的含义是什么 ...
- 在quartusii如何设计出一个 3 位的十进制加法计数器的原理以及它的设计电_从算盘到计算机,从十进制到二进制,人类计算能力的提升...
从整个人类的发展史上看,我们的科技和生产力是以加速度的规律发展的.尤其是最近的一百多年时间里,我们的加速度得到了前所未有的提升.在70万年以前,周口店的"北京人"就已经会使用火了. ...
最新文章
- 1003 Dijkstra算法
- 人工智能突破!牛津大学的科学家用机器合成了“类人类思想”
- java kaptcha_java相关:kaptcha验证码使用方法详解
- 软件工程师,你的价值在哪里?
- 文件的创建与读取 文件的数据添加
- 例子:好友列表选中效果
- 第二部分_搭建Java Web开发环境与配置Tomcat服务器JSP详解
- linux脚本怎么把文件地址变成动态地址,Linux脚本程序自动修改网卡配置文件中的MAC地址...
- flex 底部固定_小猿圈网站页面底部固定的方法
- win7 apache+php+mysql_win7下手动配置apache+php+mysql记
- java web 基础知识 流程图
- [书目20090216]高绩效人士的五项管理 李践作品
- 什么叫反向链接?什么是死链接?什么是错误链接?
- 播放全景视频【一】:用unity Video Player视频播放器来播放360全景视频
- 使用 Envoy 和 AdGuard Home 阻挡烦人的广告
- 【春节档排片地域可视化分析】
- Windows高级工程师:GDI+绘图;基础入门大全
- linux vi模式下基本命令和快捷键
- 为什么宝宝做错事被骂哭后,还要求抱抱?家长早知道早受益
- MySQL (4) 第一范式 第二范式 第三范式 BC范式