解决sqlserver数据库表空间不自动释放问题

在项目中遇到了sql server数据库经过频繁地删减数据后,查询变慢的问题。

我把数据导到另一个库中,发现查询就很快。

查了下原因,根本原因是删除数据并不释放表空间,解决方案如下:

 1 /*--特别注意
 2
 3 请按步骤进行,未进行前面的步骤,请不要做后面的步骤
 4 否则可能损坏你的数据库.
 5
 6
 7 一般不建议做第4,6两步
 8 第4步不安全,有可能损坏数据库或丢失数据
 9 第6步如果日志达到上限,则以后的数据库处理会失败,在清理日志后才能恢复.
10 --*/
11
12 --下面的所有库名都指你要处理的数据库的库名
13
14 1.清空日志
15 DUMP  TRANSACTION  Mydpc  WITH  NO_LOG
16
17 2.截断事务日志:
18 BACKUP LOG Mydpc WITH NO_LOG
19
20 3.收缩数据库文件(如果不压缩,数据库的文件不会减小
21 企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件
22 --选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了
23 --选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了
24
25 也可以用SQL语句来完成
26 --收缩数据库
27 DBCC SHRINKDATABASE (库名, 所需大小)
28
29 --收缩指定数据文件,1是文件号,可以通过这个语句查询到:select * from sysfiles
30 DBCC SHRINKFILE(1)
31
32 4.为了最大化的缩小日志文件(如果是sql 7.0,这步只能在查询分析器中进行)
33 a.分离数据库:
34 企业管理器--服务器--数据库--右键--分离数据库
35
36 b.在我的电脑中删除LOG文件
37
38 c.附加数据库:
39 企业管理器--服务器--数据库--右键--附加数据库
40
41 此法将生成新的LOG,大小只有500多K
42
43 或用代码:
44 下面的示例分离 pubs,然后将 pubs 中的一个文件附加到当前服务器。
45
46 a.分离
47 EXEC sp_detach_db @dbname = ‘库名‘
48
49 b.删除日志文件
50
51 c.再附加
52 EXEC sp_attach_single_file_db @dbname = ‘库名‘,
53   @physname = ‘c:\Program Files\Microsoft SQL Server\MSSQL\Data\库名.mdf‘
54
55 5.为了以后能自动收缩,做如下设置:
56 企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩"
57
58 --SQL语句设置方式:
59 EXEC sp_dboption ‘库名‘, ‘autoshrink‘, ‘TRUE‘
60
61 6.如果想以后不让它日志增长得太大
62 企业管理器--服务器--右键数据库--属性--事务日志
63 --将文件增长限制为xM(x是你允许的最大数据文件大小)
64
65 --SQL语句的设置方式:
66 alter database 库名 modify file(name=逻辑文件名,maxsize=20)

简单点就是:

dump transaction 数据库名 with no_log

backup log 数据库名 with no_log

dbcc shrinkdatebase(数据库名)

时间: 2024-12-25 14:00:47

解决sqlserver数据库表空间不自动释放问题的相关文章

解决SQLSERVER数据库表被琐死!

--杀死全部锁死进程ALTER Proc Sp_KillAllProcessInDB@DbName VarChar(100)asif db_id(@DbName) = NullbeginPrint 'DataBase dose not Exist'endelse BeginDeclare @spId Varchar(30) DECLARE TmpCursor CURSOR FORSelect 'Kill ' + convert(Varchar, spid) as spIdfrom master.

ORA-01653 无法在表空间扩展的解决办法 -- 增加表空间大小或给表空间增加数据文件

转自原文 ORA-01653 无法在表空间扩展的解决办法 -- 增加表空间大小或给表空间增加数据文件 当前系统的数据量越来越大的,昨天还运行正常的数据库,突然无法使用了.经过定位发现是"ORA-01653 " 即表空间满了,在这里简单记录下处理办法,长期来看Oracle是顶不住了,需要尽快切到Hadoop的Hbase里存储数据 参考如下SQL ----查询表空间使用情况--- SELECT UPPER(F.TABLESPACE_NAME) "表空间名", D.TOT

如何测试数据库表空间不足场景

1.select * from DBA_DATA_FILES; 这个命令主要是了解数据库实例中各个模块数据库表空间的大小,是否支持自动扩展(AUTOEXTENSIBLE),MAX扩展(MAXBYTES),以及各个表空间的路径(\oracle\oradata\i2kdb\omscm.dbf) 查看AUTOEXTENSIBLE字段是否支持自动扩展,如果对应表空间的该字段为YES,表示支持自动扩展 2.alter database datafile '\oracle\oradata\i2kdb\oms

如何查看Oracle数据库表空间大小(空闲、已使用),是否要增加表空间的数据文件

要查看Oracle数据库表空间大小,是否需要增加表空间的数据文件,在数据库管理中,磁盘空间不足是DBA都会遇到的问题,问题比较常见. --1.查看表空间已经使用的百分比 Sql代码 select   a.tablespace_name,a.bytes/1024/1024 "Sum MB",(a.bytes-b.bytes)/1024/1024   "used MB",b.bytes/1024/1024 "free MB",round(((a.by

数据库-表空间、数据库备份(实施)

近来第一次写了实施文档,也有一些收获,及时记录下来,以备后用. 数据库表空间 ORACLE数据库被划分成称作为表空间的逻辑区域--形成ORACLE数据库的逻辑结构. 一个ORACLE数据库能够有一个或多个表空间, 而一个表空间则对应着一个或多个物理的数据库文件. 表空间是ORACLE数据库恢复的最小单位,容纳着许多数据库实体,如表.视图.索引.聚簇.回退段和临时段等. 每个ORACLE数据库均有SYSTEM表空间,这是数据库创建时自动创建的. SYSTEM表空间必须总要保持联机,因为其包含着数据

达梦数据库表空间管理

表空间 数据库的物理结构:文件系统-数据文件数据库的逻辑结构:数据库-表空间(多个数据文件构成)-段-簇-页(一) 达梦默认有哪些表空间及其作用1.查看表空间[语句]SQL>select tablespace name from dba tablespaces:(1) SYSTEM:系统表空间,存放数据字典信息(2) ROLL:回滚表空间,存放回滚数据,对一个数据进行更新操作,存放的是更新前的版本信息,可以支持MVCC(事务多版本机制)(3) TEMP:临时表空间,存放临时数据,可不做备份(4)

基于Cordys C3版平台应用系统维护经验一则——Oracle数据库表空间满了

某日中午,有用户陆续反映系统问题,说流程送出异常.待办不消失.待办打不开等等.维护工程师开始分析问题,后台较为清晰的现象是流转日志记录插入数据失败,人工测试表插入成功,其它现象五花八门,没有规律,经过多位维护工程师的努力,终于由Oracle数据库管理工程师在16:01排除故障,系统基本恢复"正常". 故障原因是"应用系统Oracle数据库中Cordys用户所对应的表空间"满了,导致应用无法正常向数据库写入数据,造成业务数据不完整. 第二日,维护人员根据用户反馈,逐个

关于生产库的表空间是否自动扩展的看法?

我觉得 既然ORACLE设置了自动扩展 必然有其意图. 如何在生产环境使用手动还是自动呢? 主要看生产环境问题. 一是看业务产生的数据量的问题, 一次扩展数据文件大小多少,20M会不会太频繁,1G会不会磁盘操作时间太长. 自动扩展会影响下性能. 性能主要看你的硬件配置情况. 二手动扩展好处是 可以在业务低峰期扩大数据文件, 唯独麻烦的是管理麻烦,如果来不急人工添加数据文件,岂不是影响到业务的运营? 三是自动扩展,数据文件所在的硬盘是否足够,Linux下是32GB  会不会被其他文件所霸占掉? 注

MySQL数据库表空间及索引的查看

本文我们介绍MySQL数据库表空间和索引的查看方法,并详细地给出了其代码,接下来我们一一介绍. 1.查看索引 (1)单位是GB SELECT CONCAT(ROUND(SUM(index_length)/(1024*1024*1024), 2), ' GB') AS 'Total Index Size' +------------------+ | Total Index Size | +------------------+ | 1.70 GB | +------------------+ (