应用系统数据删除解决方案

Posted W先森

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了应用系统数据删除解决方案相关的知识,希望对你有一定的参考价值。

需求:

由于公司一些旧系统在开发上线时没有考虑到数据需要备份删除的问题, 导致系统使用了十年之后数据库过大, 需要进行紧急的实时备份删除数据

1. 备份数据到备份库

2. 删除数据

3. 收缩数据库数据文件

 

因为需要尽量减少对系统的影响, 一般会按一下步骤操作

1. 如为系统不需要实时查询的表(如系统日志表), 则创建新表代替, 把旧表改成TableName_Old然后再执行后续步骤

2. 如表有自增列ID, 曾以自增列ID为查找值进行删除

3. 每次删除固定行数, 以免引起长时间锁表(无论表级或行级, 一般为行级锁)

4. 记录删除时间并输出方便监控

 

代码如下

declare @st_num int = 1             --Start Position of the Deletion
declare @st_deletion int = 9999     --Row Numer of Every Deletion
declare @Sql1 varchar(5000)         --Backup Data SQL
declare @Sql2 varchar(5000)         --Delete Data SQL
declare @start_time datetime        --For Caculating delete time
declare @end_time datetime          --For Caculating delete time
declare @dur_time int               --For Caculating delete time

while(@st_num<=5000000)

begin
set @Sql1=‘
insert into LinkServer.LinkDB.dbo.LogOld
select *
  from Log where LogID between ‘+ convert(varchar(100),@st_num) + ‘ and ‘ + convert(varchar(100),@[email protected]_deletion)

set @Sql2=‘
delete
  from Log where LogID between ‘+ convert(varchar(100),@st_num) + ‘ and ‘ + convert(varchar(100),@[email protected]_deletion)

/*
Execution
*/
set @start_time=GETDATE()
print @Sql1
exec (@Sql1)
set @end_time=GETDATE()
set @dur_time=DATEDIFF(ss,@start_time,@end_time)
print(‘Finished in ‘ + convert(varchar,@dur_time) + ‘ seconds‘)

set @start_time=GETDATE()
print @Sql2
exec (@Sql2)
set @end_time=GETDATE()
set @dur_time=DATEDIFF(ss,@start_time,@end_time)
print(‘Finished in ‘ + convert(varchar,@dur_time) + ‘ seconds‘)

set @[email protected][email protected]_deletion+1

end

  

以上是关于应用系统数据删除解决方案的主要内容,如果未能解决你的问题,请参考以下文章

删除选项卡时在 ActionBar 选项卡片段中运行代码

Docker删除报错:Error response from daemon: conflict: unable to delete 08b152afcfae (must be forced)(代码片段

如何从一个片段中删除数据,这些片段应该反映在google firebase中的其他片段中

从堆栈中弹出特定片段并删除其他片段

对“xxx”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。 错误解决一例。(代码片段

片段中的Android webView显示空白页面