今天在开发环境遇到了一个问题,我们发现服务器上的硬盘空间满了,查看了下发现这个盘存放的数据库文件应该是来源一个并非很大的库才对。检查之后发现这个数据库下的某个数据文件占了盘符下70%的空间,而大部分数据都来自某张表。但是即便我删除了该表里面所有的数据,这个数据文件并不会把空间都还给操作系统啊。那就面临一个如何把收缩文件大小的问题了。我最先想到的还是SQL Server下的DBCC SHRINKFILE命令,按道理来讲连续执行两条DBCC SHRINKFILE命令应该是可以达到收缩数据库文件大小的目的的。

第一条命令把文件尾部的页面尽量往文件内部靠前的空闲页面填充,这种适用于数据文件而不适用于日志文件;第二条命令把文件尾部的空白页面截断并还给操作系统。这样看好像便可以达到目的了。但是,这两条命令跑起来太慢了。首先这个文件是100GB大小,使用页面所占空间其实只有十分之一也就是10GB。第二条命令我花了快3个小时都没跑完。而且重要的是,第二条命令会造成blocking的现象。在SHRINKFILE的过程中出现某位同事无法访问某张表存储在该文件中的数据。

USE [YourDB]
GO

DBCC SHRINKFILE (28, NOTRUNCATE);
DBCC SHRINKFILE (28, TRUNCATEONLY);

于是乎我想到了另外一个办法

1)检查下同一文件组下面的其他数据文件的剩余是否大于要收缩的文件的实际已用空间大小(space used)。

2)如果是,DBCC SHRINKFILE(<FILE_ID>,EMPTYFILE)。过程可能有点慢。可以用脚本来监控数据库的空闲空间的变化(脚本1)

3)如果否,ALTER DATABASE ADD FILE加入一个文件,同不同磁盘不管,总之整个文件组下除了要收缩的文件外的其他文件的剩余可用空间总大小要大于收缩文件的已用空间大小。然后再运行DBCC SHRINKFILE(<FILE_ID>,EMPTYFILE)。

4)整个SHRINKFILE的过程最好是SET SINGLE_USER。

5)这个时候你就可以用ALTER DATABASE REMOVE FILE把文件移除出文件组。

6)这个时候如果前面你加入了文件,而你又希望文件回到原来的盘下,就SET DATABASE OFFLINE然后ALTER DATABASE MODIFY FILE修改路径,然后把文件拷贝到和你修改的路径一致的地方,然后SET DATABASE ONLINE; 如果前面不需要添加文件,而你又希望文件回到原来的盘下,直接ALTER DATABASE ADD FILE到文件组就行。

脚本1:

use [MyDB];
GO select DB_NAME() AS DbName,
CONVERT(varchar(20),DatabasePropertyEx('MyDB','Status')) ,
CONVERT(varchar(20),DatabasePropertyEx('MyDB','Recovery')),
sum(size)/128.0 AS File_Size_MB,
sum(CAST(FILEPROPERTY(name, 'SpaceUsed') AS INT))/128.0 as Space_Used_MB,
SUM( size)/128.0 - sum(CAST(FILEPROPERTY(name,'SpaceUsed') AS INT))/128.0 AS Free_Space_MB
from sys.database_files where type=0
and file_id = 28
group by type

有一个需要注意的是:

DBCC SHRINKFILE是单线程的操作

Database File Management ->> Shrink Data File的更多相关文章

  1. ORA-01157报错"cannot identify/lock data file"解决

    sqlplus以管理员方式接入数据库,启动时出现报错,如下: > sqlplus "/as sysdba" SQL> startup ...... ORA-01157: ...

  2. oracle data file header replace(測)

    SQL> create tablespace rm_tbs datafile 'f1.dbf' size 10m; Tablespace created. SQL> select file ...

  3. 【Oracle】ORA-01157: cannot identify/lock data file 201 - see DBWR trace file

    今天数据库在查询数据的时候显示了这个错误: ORA-01157: cannot identify/lock data file 201 - see DBWR trace file ORA-01110: ...

  4. C#二次开发BIMFACE系列61 File Management文件管理服务接口二次开发及实战详解

    系列目录     [已更新最新开发文章,点击查看详细] 在我的博客<C#二次开发BIMFACE系列61 File Management文件管理服务接口二次开发及实战详解>最后列出了 Fil ...

  5. 【MySQL】InnoDB: Error: checksum mismatch in data file 报错

    参考:http://www.jb51.net/article/66951.htm 用5.7版本启动原5.5实例后,再用5.5启动出现以下报错 InnoDB: Error: checksum misma ...

  6. Invalid file system control data detected

    今天在做mkdir操作时报错:Invalid file system control data detected.检查用户和权限没问题,再检查磁盘空间也没问题.最后在网上找到如下信息: [proble ...

  7. Unity3D发布WebPlayer时Failed to download data file解决方案

    今天发布WebPlayer时, 发现直接打开html是可以正常运行的, 但是通过iis访问的话就会报错: Failed to download data file. 一开始以为是防火墙, 后来发现不是 ...

  8. [OpenGL] mac上运行NateRobin的OpenGL教程找不到 data file 解决方案

    之前买的OpenGL编程指南第七版一直没看,最近开始看了,然后按照教程推荐的去指定网址下载NateRobin的OpenGL教程,但发现网址已经提示Error:404了, 然后谷歌搜索到可用的下载网址为 ...

  9. 1816647 - Error "Data file of SAP Note is incomplete" uploading a note in SNOTE

    ymptom When uploading an SAP Note in transaction SNOTE you receive the error "Data file of SAP ...

随机推荐

  1. Java学习笔记--反射

    什么是Java反射 概念 java反射是指java能够在运行时确定类的类型信息,包括其方法.字段.构造函数等,并能够通过反射调用类或者类对象的方法.在Java中,java.lang.Class类与ja ...

  2. 【吐血推荐】简要分析unity3d中剪不断理还乱的yield

    在学习unity3d的时候很容易看到下面这个例子: void Start () { StartCoroutine(Destroy()); } IEnumerator Destroy(){ yield ...

  3. 6、android 普通日志输出到SD卡

    这是本人见过写博文最负责的一个人: http://www.crifan.com/android_try_use_android_logging_log4j_to_output_log_to_sd_ca ...

  4. Dedication(转)

    To all developers who strive for continuous self-improvement... Who are not satisfied with good enou ...

  5. 【Python】可变对象和不可变对象

    Python在heap中分配的对象分成两类:可变对象和不可变对象.所谓可变对象是指,对象的内容是可变的,例如list.而不可变的对象则相反,表示其内容不可变. 不可变对象:int,string,flo ...

  6. C++ Template之技巧性基础知识

    1.对于T是自定义类型的,如果存在子类型则需要在模版内部加上typename 示例代码: template<typename T> class Myclass { typename T:: ...

  7. 浅谈c#枚举

    结构中的成员可以赋值,枚举呢....是取值,只读的 以下情况可以考虑将类创建为结构:(1)如果一个类其中的字段非常少,所有字段占用的内存总量不超过8.16字节:(2)如果一个类中的字段都是值类型: 关 ...

  8. 12 高性能I/O框架库Libevent

    这里不讲Libevent库的具体内容了,从宏观上对I/O库整体做个介绍 Linux服务器程序必须处理三类事件:I/O事件,信号和定时事件 统一事件源:统一处理这三类事件既能使代码简单易懂,又能避免一些 ...

  9. dojo简单添加一个Panel到父容器中

    this.contentPane = new ContentPane(); this.set("content", this.contentPane.domNode); this. ...

  10. Mac下使用Apache TCPMon

    Mac下使用Apache TCPMon 参考链接: TCPMon Tutorial Anyone know how to get TCPMON working on a mac? Apache TCP ...