在任何的数据库系统中,大部分都会有一个需求,数据归档,业务数据库不应该是永无止境的进行数据存取的目的地。业务数据库主要的功能是满足业务的保留数据的需求,以及相关保证性能等目的。如果留存的数据业务已经不再需要,并且已经影响了性能,则归档是必须要做的一件事情。

首先如果要做数据归档,我会想到以下问题

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 任何程序或者脚本都不可能不出错,而记录错误,终止程序则是必须的设置

以上的存储过程在第三点上还不完善,还需要进行改善。

如何设计出一个比较合理的数据归档系统相关推荐

  1. 如何设计出一个有灵魂的「签到功能」?

    本文为PMCAFF专栏作者迷路的威廉出品 提到签到功能,想必是个人都并不陌生,有些人对它可能嗤之以鼻,不屑于去签到,有些人则可能是乐此不疲,深深陷入其中. 说实话,签到确实是一种基础功能,有的PD认为 ...

  2. 怎样设计出一个起飞的Token

    怎样设计出一个起飞的Token ==最近发现网络上一篇不错的文章,故转载以便更多的人可以看到= 不久前,我在在前后端分离实践中提到了基于 Token 的认证,现在我们稍稍深入一些. 通常情况下,我们在 ...

  3. 平面设计零基础怎么设计出一个完美的名片

    本文由:"学设计上兔课网"原创,图片素材来自网络,仅供学习分享 平面设计零基础怎么设计出一个完美的名片?每个人都会有专属的名片,好的名片可以让你的商业精英形象愈发生动起来.今天,为 ...

  4. 怎么设计出一个简约艺术感海报?这个PS设计教程很详细!

    本文由:"学设计上兔课网"原创,图片素材来自网络,仅供学习分享 怎么设计出一个简约艺术感海报?这个PS设计教程很详细!今天兔课菌教大家使用PS快速制作简约艺术感海报,看上去非常有艺 ...

  5. python四瓣花图形_如何使用Inscape设计工具设计出一个四瓣花朵图

    在使用矢量图形时,利用Inscape设计工具绘制多个圆形,并利用圆形的特性设计出一个四瓣图形,然后使用图形的形态交叉光滑效果,形成一个花瓣图形.下面利用一个实例说明,操作如下: 工具/原料 Insca ...

  6. css3魔方3乘3每层旋转_如何使用css3设计出一个立体旋转魔方?

    需要先了解的知识: ①了解CSS的2d下的transform变化下的平移(translate)和旋转(rotate). ②了解CSS的3d下的transform变化下的平移和旋转. ③使用transf ...

  7. 一个springboot能支持多少并发_吃透这篇,你也能搭建出一个高并发和高性能的系统...

    " 什么是高并发?高并发是互联网分布式系统架构的性能指标之一,它通常是指单位时间内系统能够同时处理的请求数,简单点说,就是 QPS(Queries Per Second). 那么我们在谈论高 ...

  8. php ssc 源码_吃透这篇,你也能搭建出一个高并发和高性能的系统

    什么是高并发?高并发是互联网分布式系统架构的性能指标之一,它通常是指单位时间内系统能够同时处理的请求数,简单点说,就是 QPS(Queries Per Second). 那么我们在谈论高并发的时候,究 ...

  9. 软件体系结构设计文档_一个java架构师是如何设计出一个好的架构的

    一.架构的定义 所谓一千个架构师中有一千种"最好的架构"模式. "架构"是我们行业中非常普遍的词,表示它也必须是经过长时间磨合后形成的词. 架构一词的含义是什么 ...

  10. 在quartusii如何设计出一个 3 位的十进制加法计数器的原理以及它的设计电_从算盘到计算机,从十进制到二进制,人类计算能力的提升...

    从整个人类的发展史上看,我们的科技和生产力是以加速度的规律发展的.尤其是最近的一百多年时间里,我们的加速度得到了前所未有的提升.在70万年以前,周口店的"北京人"就已经会使用火了. ...

最新文章

  1. 1003 Dijkstra算法
  2. 人工智能突破!牛津大学的科学家用机器合成了“类人类思想”
  3. java kaptcha_java相关:kaptcha验证码使用方法详解
  4. 软件工程师,你的价值在哪里?
  5. 文件的创建与读取 文件的数据添加
  6. 例子:好友列表选中效果
  7. 第二部分_搭建Java Web开发环境与配置Tomcat服务器JSP详解
  8. linux脚本怎么把文件地址变成动态地址,Linux脚本程序自动修改网卡配置文件中的MAC地址...
  9. flex 底部固定_小猿圈网站页面底部固定的方法
  10. win7 apache+php+mysql_win7下手动配置apache+php+mysql记
  11. java web 基础知识 流程图
  12. [书目20090216]高绩效人士的五项管理 李践作品
  13. 什么叫反向链接?什么是死链接?什么是错误链接?
  14. 播放全景视频【一】:用unity Video Player视频播放器来播放360全景视频
  15. 使用 Envoy 和 AdGuard Home 阻挡烦人的广告
  16. 【春节档排片地域可视化分析】
  17. Windows高级工程师:GDI+绘图;基础入门大全
  18. linux vi模式下基本命令和快捷键
  19. 为什么宝宝做错事被骂哭后,还要求抱抱?家长早知道早受益
  20. MySQL (4) 第一范式 第二范式 第三范式 BC范式

热门文章

  1. linux卸载phpstudy_phpStudy Linux 面板安装教程
  2. SpringBoot的yml配置文件(三)
  3. Oracle JDE R23更新快报
  4. Ubuntu 快捷截图
  5. java设置excel表头_设置Java导出Excel表头
  6. ABP文档 - 通知系统
  7. 通过ERP系统提高仓库性能并降低成本
  8. 您的组织策略阻止我们为您完成此操作。有关详细信息,请联系技术支持
  9. OpenWrt路由器设置万能中继及如何永久修改MAC地址
  10. word单页(或中间几页)横向显示