首先解释一下数据库的版本是SQL Server 2012。清除的数据库800多G,磁盘空间就剩10多G,数据量最多的表有2亿。目的就是清楚去年的数据(2017年之前),遇到了一些问题,总结起来就是三方面问题:

  1.如何清理日志文件。

  2.删除千万级别的数据。

  3.数据库的收缩操作。

一、清除日志文件

  刚开始直接用delete语句删除给报了两次错误:“The transaction log for database 'DB' is full due to 'ACTIVE_TRANSACTION'. ”。我看了一下原来是数据库磁盘空间不足了(还剩9M),数据库日志文件的空间是不够的,所以要先清一下日志文件,腾出来点空间。

  1.分离数据库,在数据库上右键-【任务】-【分离】,将数据库删除连接。

  

  2.找到数据库DB的所对应的文件日志--DB_log.ldf,之后把这个文件删掉。

  

  3.附加数据库,在数据库上右击-【附加】。

  

  

4。假如直接选择数据库文件附加上去,就会直接报上图的错误。

这个时候我们就要新建一个日志文件,执行下边命令即可。

这个地方用命令执行。

use master;
exec sp_detach_db @dbname='DB';
exec sp_attach_single_file_db @dbname='DB',@physname='C:\Program Files (x86)\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\DB.mdf'

至此,数据库就能附加上去了,这样节省出来空间20多个G。

问题二:删除大量数据(千万级别)

  以前删除数据都是用Delete直接删除,Delete操作会被记录到日志里,所以说会很耗硬盘空间和时间。如果删除中间发生中断,一切删除会回滚。

所以说,对于这种情况有两种做法,一种是把数据分成多个批次进行删除;第二种是将需要的数据给查出来存到新的临时表里,之后将原来的数据表删除,最后将临时表的名字改成原来的名字。

--方法一、通过top方法
WHILE 1 = 1
BEGIN
DELETE TOP (5000) FROM Orders
WHERE orderdate < ''; IF @@rowcount < 5000 BREAK;
END
GO
--方法二
--①先读取需要的数据到临时表
Select * into ordersnew from Orders Where orderdate>='2017-01-01'

--②先清空,后删除。Truncate这个不会有日志记录。或者直接用图形界面删。
Truncate table Orders
delete from Orders
--③对ordersnew 表进行重命名
exec sp_rename 'ordersnew' ,'Orders'

注意:第二种方法,数据表的主键,外键,索引这些东西会消失,所以说,清完数据后,要重新建立。

三:数据库的收缩

  在对几个大表进行数据清除后,发现磁盘还是10个G左右,并没有像想象中的增大。原来是因为删除数据(delete或truncate)是不会收缩文件的物理空间的。删除数据后的空闲空间,将会留给以后数据增长时使用。如果想要收缩文件的物理空间大小,可以使用收缩数据库和收缩文件。对应是DBCC SHRINKDB和DBCC SHRINKFILE两个命令。

DBCC  SHRINKDATABASE('DB') --收缩数据库

或者用图形界面操作【任务】-【收缩】-【数据库】。不过因为数据量比较大,所以时间还是比较长的。

总结:对于数据库还有很多不太清楚的地方,如收缩数据库语句,日志的清理语句。以后慢慢研究吧

MSSQL清理日志\删除数据\收缩数据库的更多相关文章

  1. MSSQL 清空日志 删除日志文件

    MSSQL 清空日志 删除日志文件 最近的项目主要做数据的归档,把数据从一个数据库拉到另一个数据库,照成新数据库的日志文件非常大:于是想把日志文件删除.最简单就是先分离数据库->删除日志文件-& ...

  2. mysql 正确清理binlog 删除数据后磁盘空间的

    (3条消息)MySQL删除数据后磁盘空间的释放情况 - ZERO - CSDN博客 https://blog.csdn.net/zero__007/article/details/51404091 m ...

  3. mssql sqlserver 禁止删除数据表中指定行数据(转自:http://www.maomao365.com/?p=5323)

    转自:http://www.maomao365.com/?p=5323 摘要:下文主要讲述,如何禁止删除数据表中指定行数据 最近收到用户一个需求,禁止所有人删除”表A”中,ID 为1.2.3.4.5的 ...

  4. oracle导入命令,记录一下 数据库日志太大,清理日志文件

    oracle导入命令,记录一下 工作中用到了,这个命令,记录一下,前提要安装imp.exe imp PECARD_HN/PECARD_HN@127.0.0.1:1521/orcl file=E:\wo ...

  5. sql-server的添加数据库文件(日志数据)以及收缩数据库文件(日志数据)

    环境: SSMS sql-server2016 一.为数据库添加数据文件 添加日志数据文件 以下是添加数据文件和日志文件的代码 ALTER DATABASE [joinbest] ADD FILE ( ...

  6. delete删除数据造成归档日志增加,操作系统空间不足导致数据库hang住

    业务需求,对日志表历史数据进行清理.历史表均很大,使用delete 操作删除90天前的数据. 第一部分:快速删除数据 SQL> alter table CC.F_LOG parallel ; S ...

  7. SOME:收缩数据库日志文件,查看表数据量和空间占用,查看表结构索引修改时间

    ---收缩数据库日志文件 USE [master]ALTER DATABASE yourdatabasename SET RECOVERY SIMPLE WITH NO_WAITALTER DATAB ...

  8. SQL2008R2 收缩数据库问题 - 日志文件不变小

    数据库的日志文件(*.ldf)越来越大,怎么办? 收缩吧.收缩日志文件的操作真不简单哟,还跟数据库的恢复模式有关啊. 一.“简单恢复模式”时的日志收缩 1. 截断日志 当数据库的恢复模式为“简单”的时 ...

  9. DBCC SHRINKFILE收缩日志/收缩数据库/收缩文件

    DBCC SHRINKFILE 收缩相关数据库的指定数据文件或日志文件大小. 语法 DBCC SHRINKFILE    ( { file_name | file_id }        { [ ,t ...

随机推荐

  1. C#实现CRC校验

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Web; ...

  2. iOS 验证码按钮倒计时

    在app 注册或者登录 需要验证码的地方.为了避免短时间内刷验证码.往往会加上一层验证. 倒计时结束后.可以重新获取! 代码实现如下: // _CountdownTime 倒计时总时间: //_tim ...

  3. windbg调试子进程

    windbg 调试子进程 学习过程中遇到了一个从前未调试过的情景:我正在调试的进程通过CreateProcessW创建了一个子进程,我需要去了解子进程中发生的行为. 那么怎么去调试呢?OD 就有点麻烦 ...

  4. MySQL 系列(四) 主从复制、读写分离、模拟宕机、备份恢复方案生产环境实战

    本章内容: 主从复制 简介原理 备份主库及恢复从库,配置从库生效 读写分离 如果主宕机了,怎么办? 双主的情况 MySQL 备份及恢复方案 备份单个及多个数据库 mysqldump 的常用参数 如何增 ...

  5. wordpress安装后访问博客只显示文字的解决办法

    按着网上的教程,买了腾讯云服务器,上面的镜像已经安装好WordPress了.但是发现并不像网上十分钟搭建个人站点等的写的那么简单.遇到了一些问题,下面来详细讲一讲. 首先是用ip地址不能直接访问服务器 ...

  6. PHP实现类似题库抽题效果

    PHP实现类似题库抽题效果 大家好,我顾某人又回来了,最近学了一点PHP,然后就想写个简单小例子试试,于是就写了一个类似于从题库抽题的东西,大概就是先输入需要抽题的数量,然后从数据库中随机抽取题目. ...

  7. LeetCode算法题-Excel Sheet Column Title(Java实现)

    这是悦乐书的第180次更新,第182篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第39题(顺位题号是168).给定正整数,返回Excel工作表中显示的相应列标题.例如: ...

  8. UUID生成随机字符串

    import java.util.UUID; UUID.randomUUID().toString().replace("-", "") 生成的样子      ...

  9. Git&GitHub-进阶教程

    目录 1. 远程仓库-GitHub 1.1 本地电脑如何关联GitHub? 1.2. 创建并操控远程库GitHub (1) 把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库. ...

  10. 退出全屏监听ESC事件,这里没有用keydown来监听,因为全屏时候keydown监听不到

    浏览器故意不上监听ESC键的,跟网页加载完成之后不能用程序使浏览器全屏一样的道理,避免开发者恶意全屏,不啰嗦,解决办法如下:window.onresize = function(){if(!check ...