sql server 删除大量数据的一次坑爹之旅

  数据库有1kw数据不在使用了,影响读写速度,于是要删除掉

  使用delete语句

  意外发生,持续了半个小时后,依然不见结束的迹象

  于是强行结束(停止了服务)

  再打开服务后,数据库显示 【正在恢复】

  百度一下我就知道了

  于是,停下服务,剪切了数据到别的文件夹

  恢复服务

  删除数据库

  启动服务

  附加数据库

  1个小时候,附件完成(刚好中午吃饭去了)

  无知的我再次使用delete语句删除

  两个小时候,实在无法忍受,停止删除

  数据库显示 正在恢复

  数据库文件增大,mdf达到31g,log问价达到109g

  再次剪切文件到别的文件夹,启动服务,删除数据库,启动服务,附加数据库

  1h后,sql 附加数据库窗口崩溃

  本人崩溃

  再次停止服务

  剪切数据库文件,启动服务,删除数据库,停止服务,附加mdf,不要log文件,报错无法附加

  百度

  停止服务,剪切数据库文件,恢复服务,创建同名数据库,停止服务,删除同名数据库mdf文件,将原有数据库mdf覆盖同名数据mdf文件

  打开服务,看到数据,为挂起状态

  百度

  执行如下代码

  

1
2
3
4
5
6
7
8
9
10
11
12
USE master
GO
ALTER DATABASE test SET SINGLE_USER
GO
ALTER DATABASE test SET EMERGENCY
GO
DBCC CHECKDB(test,REPAIR_ALLOW_DATA_LOSS)
go
ALTER DATABASE test SET ONLINE
GO
ALTER DATABASE test SET MULTI_USER
GO<br><br><br>来自:http://blog.csdn.net/zxr85/article/details/51943011

  半个小时后依然在执行状态

  本人崩溃

  停止执行,数据库此时已经 成为 单个用户模式 

  崩溃,百度

  执行如下代码

1
2
3
4
5
6
7
8
9
10
USE master; 
GO 
DECLARE @SQL VARCHAR(MAX); 
SET @SQL='' 
SELECT @SQL=@SQL+'; KILL '+RTRIM(SPID) 
FROM master..sysprocesses 
WHERE dbid=DB_ID('数据库名'); 
 
EXEC(@SQL);
ALTER DATABASE 数据库名 SET MULTI_USER;<br><br>代码来自:http://www.cnblogs.com/amadeuslee/p/6608076.html

  数据库单人模式解除

  刷新数据,奇迹发生了

  数据库表可以访问了,由于只有一个表,实际要保留的数据只有8w多,于是使用

  select   into  语句,将数据保存至临时表,由于磁盘空间不足

  收缩数据库  

  执行select into语句

  执行 truncate table  ,数据库文件大小未变化

  收缩数据库

    执行insert into select  

  一切搞定

  本次一系列操作都不是生产环境,是本地服务器上的数据

  本文中一系列操作仅供参考,文中奇迹发生的那一段,我同样很蒙蔽,仅供参考

posted @   Myisqq  阅读(2601)  评论(2编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示