数据库数据和日志设置定时清理原理(适用于数据仓库,累积历史性数据库表)
select * from mid.[dbo].t_clear_data_table
--插入数据脚本
INSERT INTO mid.[dbo].[t_clear_data_table]
([dbName] --数据库名称
,[schName] --表架构
,[tbName] --表名称
,[syn_column] --判断清理数据时间字段
,[keepdays] --数据保留天数
,[isEnable] --这条记录是否可用
,[date_insert]) --数据插入时间
VALUES
('ODS'
,'dbo'
,'t_etl_log'
,'start_time'
,60
,1
,getdate())
建表语句
CREATE TABLE [dbo].[t_clear_data_table](
[id] [int] IDENTITY(1,1) NOT NULL,--自增id
[dbName] [nvarchar](100) NULL, --数据库名称
[schName] [nvarchar](10) NULL, --表架构
[tbName] [nvarchar](100) NULL, --表名称
[syn_column] [nvarchar](50) NULL, --判断清理数据字段
[keepdays] [int] NULL, --数据保留天数
[isEnable] [int] NULL, --这条记录是否可用
[date_insert] [datetime] NULL --数据插入时间
)
定时读取以上表内容,循环执行清理数据SQL脚本
declare @dbName nvarchar(100)='MID'
declare @schName nvarchar(100)='dbo'
declare @tableName nvarchar(100)
declare @syn_column nvarchar(100)
declare @keepdays int = 31
declare @num int =0 --接收查询到的表数据
declare @loop int = 1 --初始值
--1.读取可清理列表数据,id排序
select ROW_NUMBER() OVER ( ORDER BY id ) AS id,
dbname,schname,tbname,syn_column,keepdays
into #list
from t_clear_data_table with(nolock) where isenable=1
--2.判断,进行循环
set @num=@@rowcount
while @loop<=@num
begin
select @dbname=dbname ,@schname=schname,@tableName=tbname,@syn_column=syn_column,@keepdays=keepdays
from #list
where id=@loop
exec [dbo].[sp_clear_data] @dbname=@dbname,@schname=@schname,@tableName=@tableName
,@syn_column=@syn_column,@keepdays=@keepdays
SET @loop = @loop+1
SELECT @Message = @Message + cast(@loop as nvarchar(4))+' ok'
end
declare @time datetime
declare @rowcount int
declare @sql nvarchar(1000)
declare @ParmDefinition nvarchar(500)
declare @message nvarchar(1000)=''
set @time = dateadd(d,-@keepdays,getdate())
set @sql = 'delete from '+ @dbName +'.'+ @schName +'.'+ @tableName +' where cast('+@syn_column+' as datetime) <'''+convert(nvarchar(20),@time,120)+''''
set @sql = @sql +' select @num1=@@rowcount'
set @ParmDefinition=N'@num1 as int output'
exec sp_executesql @sql,@ParmDefinition,@num1=@rowcount output
set @Message = @Message+' table:'+@tableName+'; time:'+convert(nvarchar(20),@time,120)+'; delcount:'+cast(@rowcount as nvarchar(10))+';'